2010/12/23

Exploring Objects with iw.debug

iw.debug 是用於 Zope 或 Plone 的偵錯工具,看來是仿照 Debug Anywhere 原理做成,和 plonectl debug 的方式有所不同。以 Plone 4.0.2 為例來安裝,在 buildout.cfg 裡指定 eggs 和 zcml 加入 iw.debug 即可,iw.debug 0.3 的相依套件是 ipython 0.10.1。
執行方式是先 bin/plonecfg fg 在前景模式啟動,透過 http://localhost:8080/myportal/@@ipdb 之類的網址,就可以在 console 看到 ipdb> 提示符號,輸入 ll 可以查看 local 變數。

2010/12/22

Widget to show Localized Title

eea.facetednavigation 的 checkbox widget 預設不會顯示翻譯過的標題,下列是個解法:
$ diff widgets/checkbox/widget.pt widgets/checkbox/widget.pt-new
14,15c14,15
< <legend tal:define="title python:view.data.get('title', '')"
< tal:content="
< python:view.translate(title)" i18n:translate="">HTML Widget</legend>
---
> <legend tal:define="title python:view.data.get('title', '')"
> i18n:translate="" i18n:domain="plone">
> <span tal:replace="title"/></legend>
25c25
< wbr_term_label python:view.word_break(term_label);
---
> term_label_translated python:term[1];
35c35
< tal:content="structure wbr_term_label">term label</label>
---
> tal:content="structure term_label_translated">term label</label>

2010/12/01

Plone Folder

Plone 3 和 Plone 4 目錄的實作方式不同,前者分成「一般目錄」和「大型目錄」兩種目錄型別,後者則是只實作一種型別,將兩種型別的特色整併。

一般目錄 (Folder) 最適合存放 50 個項目之內的場合,在內容操作介面裡,使用者可以手動拖拉,調整項目的順序。缺點在於,存取目錄物件時,是使用 Python 的 pickle 指令,會將整個目錄資料載入記憶體,目錄裡的項目過多時,容易造成效能變差。同時,目錄裡的項目值是以 tuple 型別來指定,存取過程都是整批處理,容易造成 ZODB 的衝突錯誤。

大型目錄 (Large Folder) 則是適合存放大量項目的場合,內部以 B-tree 實作,對於記憶體和硬碟的衝擊較小,同時也能針對局部資料進行鎖定,不易造成 ZODB 的衝突錯誤。它的缺點則是沒有提供調整項目順序的介面,而且要額外到 portal_types 設定,才能把項目內容顯示在資訊方框。

Plone 4 重新實作一個 plone.folder 型別,混合上述的優點,不再分成兩種目錄型別。

透過 Plone 3 網站 ZMI 的 portal_types 工具,可以詳細觀察 Large Folder 的屬性值,特別留意 Implicitly addable 的設定值,勾選後就可以在 Plone 3 的前台介面新增,例如 Members、news、events 目錄,都是使用 Large Folder 型別。