最近在一個SharePoint 2010項目中發現,在裝了英文、日文語言套件之後,在網站設定的語言設定中,選擇備用語言的時候,系統返回一個異常,大意是包含自訂樣式表(CSS)的網站不支援多語言。
之前一直沒太注意到底什麼算是“自訂CSS”,經過一番研究,發現了問題:
一般網站引用CSS的時候,引用的都是layouts目錄中的檔案(比如/_layouts/2052/Styles/corev4.css),這個CSS顯然是整個伺服器陣列共用的;但是出問題的這個網站引用的是本網站中的/_styles/corev4.css(這不是個虛擬路徑,就是在網站中的一個目錄,存在資料庫裡的)——這個就是所謂的“自訂CSS”。你想啊,人家在layouts裡面的CSS是按照語言劃分的,不同語言的情況下引用的是不同的CSS,而在_styles裡面,全都一樣,當然不成了,於是多語言就不幹了。
那麼下一個問題就是,這個自訂CSS到底是怎麼出現的?怎麼恢複成非自訂CSS?到底應該怎麼去修改預設的CSS?一個一個來。
一、自訂CSS是如何出現的?
其實自訂CSS從SharePoint 2007的時候就出現了,但是由於當時並沒有2010這種多語言機制,並沒有把這個問題凸顯出來。
經過一番調查,發現這個是由於我們的美工在使用SharePoint Designer改CSS的時候造成的。在SPD裡面開啟一個頁面,頁面裡面自然會列出若干class,而當我們按住Ctrl鍵點擊這些CSS的時候,就會開啟對應CSS檔案的編輯:
而當我們儲存這個CSS的時候:
看到“自訂樣式表”了吧?就是從這兒來的。一旦點了“是”,SharePoint就會把layouts下對應的這個CSS檔案儲存到網站的_styles目錄中(如果之前沒這個目錄會自動建立一個,注意這是個目錄,不是個文件庫)。其實這是非常合理的,總不能因為你要修改頁面裡的一個CSS,就要影響到整個伺服器陣列的所有網站吧?於是就有了這個類似於unghost的過程。
當然,使用物件模型的方式也可以很方便地完成這個過程,只需要一句話:
1: spWeb.CustomizeCss("corev4.css");
(其實我就是翻SDK翻到的這個方法,然後用reflector確定了那個多語言就是這個東西造成的)
二、如何恢複成非自訂CSS?
既然知道了自訂的方法,恢複就有頭緒了。直接寫個Console,同樣用一句話搞定:
1: spWeb.RevertCss("corev4.css");
三、到底應該如何自訂CSS?
標準的做法當然不是去修改layouts下的CSS檔案(除非你想整個伺服器陣列所有網站都變化)。你可以把你要改的地方單放到一個CSS裡,然後設定成網站的備用CSS,見:
上面這個介面是在網站設定 - 主版頁面(不是庫分類下的那個主版頁面),這是在開啟了發布功能的前提下才會出現的一個連結。如果沒有開啟發布功能的話,直接進去“/_Layouts/ChangeSiteMasterPage.aspx”這個頁面應該也行(我沒試過),或者乾脆用程式改一下。這個備用CSS會自動放在系統預設的CSS檔案之後進行引用,所以會覆蓋掉預設的CSS樣式(預設樣式中有一些是標記了“!important”的,在自訂CSS裡想要覆蓋這個設定的話也要加上這個)
當然你也可以改主版頁面,在系統CSS引用(主版頁面中的SharePoint:CssLink和SharePoint:Theme)之後,使用SharePoint:CssRegistration控制項進行引用,這樣也可以自動根據不同的語言自動進行切換(具體的寫法請自行msdn或者google)