Plone 自由軟體 架設網站 雲端

用自由軟體Plone來架設網站(3)

2011-09-26
以Python語言開發而成的Plone不僅入門容易,更具備企業級的功能彈性,因而能夠輕易部署在VPS或Amazon EC2雲端系統上。本篇文章將說明客製化Plone網站的方式,包括TTW設定方式、acl_users帳號管理、Undo復原管理、設定RSS等等,並介紹如何使用GenericSetup來管理ZODB的設定值。
前篇「用自由軟體Plone來架設網站(2)」文章中介紹了如何實際編輯buildout.cfg設定檔,安裝一個擴充模組,延伸Plone既有的內容管理能力,加上地圖操作及編輯的功能,並認識Plone預設的Archetypes內容型別框架,了解 Schema、Field、Widget的相依關係。

接著,將說明客製化Plone網站的方式,並介紹如何使用GenericSetup來管理ZODB的設定值。

客製化Plone網站的方式,有兩大途徑,一種是在網頁介面進行設定,稱為TTW(Through The Web),另一種是在檔案系統裡撰寫程式碼,稱為TTF(Through The Filesystem)。

前者的好處是直覺而快速,比較容易入門學習,但是能調整的地方有限,後者的好處之一是日後可以重複沿用設定值,系統化地維護網站的成長。當然,這種方式能讓你擁有最大的調整空間,也代表須要了解更多系統的運作細節。

TTW設定方式

網頁介面的管理方式,主要是在ZMI環境進行,整個ZODB(或Zope系統)可以想像成一個樹狀結構,它的根目錄稱為root Folder,通常以「/」符號來代表。

如下圖所示,在物件清單上可以看到多種物件類型,Plone Site是其中的一種物件類型,在畫面下方有一排操作按鈕,這些物件都可以搭配﹝Rename﹞、﹝Cut﹞、﹝Copy﹞、﹝Delete﹞等按鈕,進行基本的操作,就像使用檔案總管一樣。

▲ZMI根目錄的物件清單。

﹝Import/Export﹞是比較特別的按鈕,搭配Plone Site來操作的話,它可以將整個網站匯出成為一個ZEXP檔案,再從另一個Plone Instance匯入。

以mysite為例,選擇「Save to file on server」,它會匯出成為「/home/user/Plone/zinstance/var/instance/mysite.zexp」檔案,只要再把它放到「/home/user/Plone/zinstance/var/instance/import」目錄裡,就會在匯入項目清單裡出現,如下圖所示。

▲Import/Export操作畫面。


▲Folder的物件型別資訊。

其中的匯出匯入功能目前只支援同版本的Plone Instance,它是個方便的工具,但不是資料升級的萬靈丹。當然,個別的子目錄或是物件,也都可以執行這樣的操作。

不過,要確認portal_types裡,物件型別資訊已啟用「Implicitly addable」選項。如果沒有啟用,那麼就只能匯出,而不能匯入這類物件型別。

acl_users帳號管理

Plone Site是Zope裡的一種物件類型,也就是可視為「某程度獨立的兩個系統」,因此兩者各自擁有獨立的帳號管理工具,也就容易理解了。雖然各自獨立,但使用的機制相同,而且Zope的管理帳號會凌駕Plone之上。

它們都使用Pluggable Auth Service的機制,簡稱為PAS,開發者可以在這個機制裡,加上LDAP、CAS等驗證服務的支援,甚至寫出依照IP位址來驗證帳號登入的擴充模組。

▲/acl_users的物件清單。

剛安裝的Zope系統,預設只會有admin帳號,這樣的帳號具備最高的權限,可以管理所有物件,包括Plone Site在內,之後在Plone Site裡新增的帳號,以mysite為例,只會存在於「/mysite/acl_users」的「source_users」裡。

▲/mysite/acl_users的物件清單。

在acl_users裡,每一個物件項目代表一個PAS plugin,每個plugin是PAS的功能單位。比較特別是plugins這個物件,它負責管理PAS所有的interface啟用資訊,還有啟用的順序。舉例來說,在Extraction Plugins設定畫面裡,預設有兩個啟用的plugin,順序在上的credentials_cookie_auth,代表它的驗證順序在credentials_basic_auth之前。

▲Extraction Plugins設定畫面。

Undo復原管理

不小心在Plone網站裡誤刪資料時,管理員可以在短時間內趁其他使用者還未大量修改系統之前,進入ZMI介面執行「Undo」的恢復動作。

〔Undo〕活頁標籤位於ZMI介面的中上方。設定畫面會依時間順序,列出系統執行過的動作。以刪除動作為例,通常會以「manage_delObjects」的關鍵字做紀錄,請尋找最近的一筆資料記錄,在它的左方會看到核取方塊,勾選後,點擊頁面下方的〔Undo〕按鈕,就可以執行復原的動作。

▲Undo設定畫面。

Zope系統把每一個操作動作稱為Transaction,它們代表系統在不同時點的「特定狀態」,或稱為Snapshot。這些Transaction資料記錄在ZODB裡,通常一段時間後,須要把Transaction記錄清除,這樣的清除動作稱為Pack。

▲Database Management設定畫面。

清除時可以指定Transaction的存留天數,在ZMI的「/Control_Panel/Database/main」可以看到設定畫面,以天數0為例,代表把所有Transaction都清空,以天數7為例,代表存留最近一週的Transaction紀錄。執行Pack之後,會發現Data.fs的檔案空間變小。

Pack是重要的資料庫維護動作,除了ZMI後台介面外,Site Setup前台介面的Maintenance裡,也有同樣功能的管理畫面。

▲Site Setup的Maintenance畫面。

設定content_type_registry

Plone系統支援FTP和WebDAV通訊協定,可以想見,這是變通的結果,因為物件系統和檔案系統之間,必須進行一系列的對應動作。

另外,使用collective.uploadify或collective.quickupload擴充模組,可以批次上傳檔案到Plone系統,上傳時同樣須要進行對應動作。

以collective.quickupload為例子,這個模組又稱為Plone Quick Upload,支援Javascript或Flash操作介面,並以Status Bar顯示上傳進度。假設同時選01.png和02.flv兩個檔案上傳到mysite網站,Plone系統如何知道它們分別要存成哪種物件類型呢?

▲Plone Quick Upload設定畫面。

在「/mysite/content_type_registry」裡,Content Type Registry就是在處理上述的問題,它維護一個對照清單,記錄在何種條件之下上傳的檔案使用哪種物件類型。使用者可以新增想要的設定值,也可以調整它們的順序。

在ATImage_ext項目裡,它的Extensions指定為「jpg jpeg png gif」,代表這四種副檔名的檔案,上傳時都會以Image型別儲存。在image項目裡,它的Content type指定為「image」,代表屬於image這種類型的資料,上傳時都會以Image型別儲存。

另外一個相關的設定項目是mimetypes_registry,裡面記載image/gif、image/jpeg、imag/png之類的設定值,也可以在這裡新增想要的MIME格式資料。

▲Content Type Registry設定畫面。

設定portal_actions

Plone網站的Site Map、Contact、Rules、Sharing等選項,被稱為(CMF) Action,依照屬性,又歸類在不同的(CMF) Action Category裡,如Site Map歸屬在site_actions裡。

▲Action Category對照簡表。

更多例子可參考上圖的對照簡表。之所以會有CMF字樣,是因為Zope早期以Content Management Framework為模組名稱來建立一系列網站工具軟體,簡稱為CMF,後來Plone以CMF為基礎發展至今,目前在系統內仍然可以常見到這個縮寫字。

想要修改或新增選項,可以在ZMI裡portal_actions進行設定,例如要取消Accessibility選項,到portal_actions的site_actions內就會找到accessibility項目。

▲Plone Actions Tool設定畫面。

在CMF Action設定畫面內,有數個設定欄位,想要取消顯示的話,將「Visible」選項取消勾選,再按下〔Save Changes〕就行。

<

▲accessibility Action設定畫面。
p> 若想在site_actions裡新增Action,則從下拉選單選擇【CMF Action】,如下圖所示。仿照前面的欄位設定值,要先填寫「Title」欄位,例如「Office Location」。

▲新增CMF Action畫面。

至於「URL (Expression)」欄位,可以是「string:${globals_view/navigationRootUrl}/office- location」,「Permissions」欄位選「View」,並將「Visible」欄位勾選,儲存後完成。搭配之前的Plone Map模組,就可以新增一個提供地圖資訊的頁面。

設定RSS

Plone的RSS功能是以Collection為基礎。先在Plone前台的根目錄,新增一個Collection項目,「Title」欄位填寫「My Site - RSS feed」,在〔Category〕活頁標籤內的「Language」選擇【Language neutral】,然後將〔Settings〕活頁標籤中的「Exclude from navigation」選項打勾。

▲更改Collection的id。

存檔之後,再到根目錄的〔Contents〕活頁標籤,勾選剛才新增的Collection項目,並按下﹝Rename﹞按鈕,將它的id改為「site-feed」,如上圖所示。

進入site-feed這個Collection項目後,切換至〔Criteria〕活頁標籤,在「Field name」欄位,選擇【Item Type】項目,然後按下﹝Add criteria﹞按鈕,如下圖所示。

▲新增Criteria欄位條件。

接著,在「Item Type」的「Values」欄位內選擇想要提供RSS的型別,例如「Event」和「News Item」。隨後在「Set Sort Order」欄位選擇【Effective Date】,並勾選「Reverse」,最後按下﹝Save﹞按鈕,如下圖所示。

▲設定Criteria欄位條件。

此時,已經可以從「http://localhost:8080/mysite/site-feed/RSS」這樣的網址,看到site-feed的RSS資料,如下圖所示。

▲RSS feed畫面效果。

同樣地,可以為mysite網站新增一個RSS Action。再次進入ZMI的「/mysite/portal_actions/site_actions」,新增一個id為「rss」的CMF Action,這次將「URL (Expression)」欄位設定為「string:${object/@@plone_portal_state/portal_url} /site-feed/RSS?set_language=${object/@@plone_portal_state/language}」,其他設定值仿照前面範例就行。

▲RSS Site Action設定畫面。

善用GenericSetup機制

前文裡已經提過,在ZMI進行的設定修改,會被儲存在ZODB裡。由於ZODB使用Python內建的pickles函式來存取資料,存取物件的資訊會參照檔案系統裡的Python程式。

如此一來,這部分的Python程式必須小心維護,以免更名改版的動作造成無法找回存進ZODB物件的狀況。

Plone利用GenericSetup的機制來協助管理員處理上述的問題,它可以把網站設定值,以XML的格式來進行匯入或是匯出,管理員就可以安心地利用ZMI來設定網站,不必擔心找不回ZODB裡的設定結果。

想要匯出mysite網站的設定值,則必須到ZMI的「/mysite/portal_setup」,並切換至〔Export〕活頁標籤,如下圖所示。

▲portal_setup Export畫面。

按一下頁面最下方的〔Export all steps〕按鈕之後,將會下載一個setup_tool-20110415093906.tar.gz之類的壓縮檔案。在解開壓縮之後,會看到許多.xml檔案,它們被稱為profile檔案,以XML格式記錄系統的設定值。

▲profile檔案畫面。

以properties.xml檔案為例,它記錄了網站的基本資訊,例如網站名稱、摘要描述、站長電郵資訊等。

▲properties.xml內容。


▲ZMI內mysite的Properties內容。

讀者可以在ZMI內看到上述properties.xml的對應設定效果。到「/mysite」的〔Properties〕活頁標籤,它把XML內容的每一項設定值,以網頁方式呈現出來,如左下圖示。

結語

本文介紹了ZMI裡的入門項目,包括PAS、Transaction、Pack、Content Type Registry等技術名詞,透過建立Action和RSS等範例,進一步地體驗ZODB如何把前台與後台串連起來。

同時,也認識了GenericSetup的基本原理,初見XML格式的profile設定檔,這些都是Plone開發架構的重要基礎。

事實上,GenericSetup不只是用於設定值的匯入和匯出,開發擴充模組之時,也常利用Extension Profile的方式,以Plone預設的Base Profile為基礎,每次只增加或修改少數的Profile內容,系統化地維護設定值。

等到移除擴充模組的時候,系統則要想辦法「恢復」成之前的樣子,也就是舊版的Profile。可是系統有辦法「記得」之前的樣子嗎?Plone又是如何處理這類的問題呢?想知道如何透過TTF方式來客製化系統嗎?

欲知詳情,且待下回持續為讀者分曉。

<完整內容詳見http://www.openfoundry.org/en/foss-programs/8318--plone-3>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!