天天看點

自定義SharePoint新網站建立過程(2)

今天IE 8 Beta2釋出,第一時間安裝到了自己的電腦上。感覺尚好,隻是在打開新的Tab,或者關閉某個Tab時,IE8不斷的Crash(不過現在IE8終于不再像IE7那樣,一個Tab的Crash會搞死整個IE了。)将IE中所有的Add-on都Disable掉,終于好了。

-------- 從愛棗報學來的分割線 -----------

首先澄清一個概念。在一個SharePoint網站的網站設定頁面中,使用“将網站另存為模闆”連結,管理者可以将整個網站儲存為一個擴充名為.stp格式的模闆。使用這個stp網站模闆,管理者可以重複建立同樣結構(和内容)的新網站。那麼這種stp格式的網站模闆,和我們下文所說的Site Definition有什麼差別呢?簡單來說,Site Definition是一種通過磁盤上的一系列檔案(包括xml、頁面模闆檔案等等)來對一個網站的結構和内容進行描述的一種方式。Site Definition可以對一個網站模闆的方方面面進行非常細緻的定義,基本上無所不能。而stp網站模闆隻是一種簡單的将一個已存在網站進行轉存之後,可以重複使用的網站模闆格式。stp網站模闆沒法直接修改,沒太多可控性。下文中說的“網站模闆”一次,預設是指Site Definition。

接着來詳細說一下Site Definition。在SharePoint伺服器的“Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\2052\XML”位置,有一堆以WEBTEMP開頭,擴充名是.xml的檔案。這些WEBTEMP*.xml檔案,就是SharePoint中用來标明Site Definition的檔案。

我們在SharePoint中建立一個新網站時,有一個“工作組網站”的網站模闆可以讓我們選擇。打開“WEBTEMP.xml”檔案,就能看到這個“工作組網站”的Site Definition。 

<a target="_blank" href="http://blog.51cto.com/attachment/201003/092813925.png"></a>

在WEBTEMP*.xml檔案中,“&lt;Template&gt;”節點表示一種Site Definition,它的“Name”屬性指明了這個Site Definition儲存在“Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\SiteTemplates”中的哪個子目錄中。一個Template可以包含多個子Configration。一個Configuration對應到一個使用者所了解的網站模闆。如果我們需要多個網站模闆,它們大緻相同,隻有一些微小的地方有差別,那麼我們就可以隻定義一個Site Definition,然後用這個Site Definition的多個Configuration來展現這多個網站模闆的不同之處。

在上圖所示中,我們可以看到,其實“工作組網站”、“空白網站”、“文檔工作區”這三個網站模闆,都是同屬于“STS”這個Site Definition的三個Configuration。“STS” Site Definition位于“C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\SiteTemplates\sts”目錄中。

<a target="_blank" href="http://blog.51cto.com/attachment/201003/092821461.png"></a>

當然,WEBTEMP*.xml隻是讓SharePoint知道有哪些Site Definition,以及每個Site Definition中有哪些網站模闆(也就是Configuration)可用。但是具體每個模闆中包含的内容,包括清單、文檔庫、頁面、頁面上的web part等等等等,都是定義在Site Definition中的ONET.XML檔案中。比如,下圖就是“STS” Site Definition的ONET.XML檔案。

<a target="_blank" href="http://blog.51cto.com/attachment/201003/092828250.png"></a>

ONET.XML幾乎定義了一個網站模闆的方方面面。比如,為什麼使用“工作組網站”模闆建立的新網站的default.aspx頁面,在頁面右側會顯示一個SharePoint的Logo圖檔?這是因為在ONET.XML裡面有下面的内容。

<a target="_blank" href="http://blog.51cto.com/attachment/201003/092835231.png"></a>

于是我們就看到了

<a target="_blank" href="http://blog.51cto.com/attachment/201003/092842412.png"></a>

現在你應該已經明白了Site Definition是怎麼回事,以及它是如何起作用的。了解這些之後,我們就可以根據自己的需求,來建立自己所需要的Site Definitiion了。你一定要記住一點:永遠不要修改SharePoint自帶的Site Definition。這是因為微軟可能在某些後續的Service Pack或Hotfix中,用更新的檔案覆寫舊的Site Definition檔案。

建立新的Site Definition的基本步驟是:

1、找一個磁盤上已有的,用來起步的Site Definition,将這個Site Definition目錄複制一份; 

2、建立新的WEBTEMP*.xml檔案,比如WEBTEMP.MySiteTemp.xml,在裡面寫明新的Site Definition的名稱(也就是Site Definition所在的目錄名),Configuration等等; 

3、修改這個新Site Definition的定義檔案直到滿足你的需求為止; 

4、IISRESET

接着介紹Site Provisioning Engine。什麼是Site Provisioning?當你在SharePoint裡面,使用某個網站模闆,建立了一個新SharePoint網站,這個過程就叫做Site Provisioning。(幹嘛不直接叫做Site Creating?嗯,有時候用用時髦詞挺Cool的,不是嗎?)SharePoint内置了一個Site Provisioning Engine,來完成Site Provisioning過程。這個過程包括給站點應用模闆、将所需檔案“拷貝”到站點中、根據網站模闆類型進行一些其他的必需操作等等。但是,這個Site Provisioning過程也是可以自定制的。

一個Site Provisioning過程,需要由一個繼承自Microsoft.SharePoint.SPWebProvisioningProvider的類來完成,具體點說就是由這個類的Provision()方法來完成。是以我們如何自定制這個過程呢?寫一個新類,繼承自Microsoft.SharePoint.SPWebProvisioningProvider,然後重載Provision()。

我們來用一個實際的示範進行講解。使用者的需求是:“工作組網站”這個網站模闆的首頁的右側那個SharePoint Logo圖檔實在礙眼(沒錯,就是上面那個截圖中的圖檔),能不能建立網站後,不要那個圖檔了?當然,我們可以建立一個新的Site Definition,然後修改新Site Definition的ONET.XML檔案,去掉這個web part,但是,因為示範的緣故,我故意不用這個簡單的方法,而用更“進階”的定制Site Provisioning來完成。

由于“工作組網站”這個模闆的其他部分并不需要調整,是以我決定建立一個WEBTEMP.CustomTeamSite.xml檔案,并在檔案中建立一個新的Configuration。

<a target="_blank" href="http://blog.51cto.com/attachment/201003/092849319.png"></a>

上圖中的名稱為“定制工作組網站”的“Cinfiguration”節點有兩個屬性,“ProvisionAssembly”和“ProvisionClass”,這兩個屬性指定了這個Configuration使用了一個定制的Site Provisioning過程,而不再使用SharePoint預設的Site Provisioning模式。

接着是上面指定的那個定制Site Provisioning類。

<a target="_blank" href="http://blog.51cto.com/attachment/201003/092855954.png"></a>

在重載的Provision()中,首先,代碼仍然讓新網站應用“工作組網站”這個網站模闆。“STS#0”的意思是,使用“STS”這個Site Definition的ID為“0”的Configuration,也就是“工作組網站”這個模闆。但是,在應用了預設的“工作組網站”模闆之後,再調用了InitTeamSite()方法,在這個方法中通過SharePoint API,将網站首頁上的那個圖檔web part去掉了。

将我們的項目部署到伺服器上,IISRESET之後,就能在建立網站頁面中看到這個新的名為“定制工作組網站”的網站模闆。

<a target="_blank" href="http://blog.51cto.com/attachment/201003/092903564.png"></a>

使用這個網站模闆建立一個新網站後,就會發現,這個網站和用“工作組網站”模闆建立的網站一模一樣,除了首頁上再沒有那個圖檔web part。

<a target="_blank" href="http://blog.51cto.com/attachment/201003/092908617.png"></a>

通過建立定制Site Definition,以及建立定制的Site Provisioning類來接管Site Provisioning過程,我們就能夠完全自定義一個SharePoint新網站的建立過程了。:)

最後一個問題,我們應該選擇哪種方式呢?Feature Stapling?還是Site Definition + Site Provisioning Engine?我更推薦Feature Stapling。将各種自定義功能封裝成(一個或多個)Feature,讓網站管理者可以自己選擇啟用或停止這些Feature,如果需要,使用Feature Stapling使網站自動應用并激活這些Feature,是一種更好、更優雅、更具封裝性、更容易遷移的方式。

本文轉自 kaneb0y 51CTO部落格,原文連結:http://blog.51cto.com/kaneboy/280767,如需轉載請自行聯系原作者