2011/04/28

eea.jquery datepicker localization

eea.jquery 的 UI 模組,已經把 localization 需要檔案準備好,在 ui/development-bundle/ui/i18n 目錄裡找得到。想要將 datepicker 日曆裡的月份星期以中文顯示,在 Plone 裡至少要修改兩個檔案,首先是利用 jsregistry.xml 註冊需要的 javascript resource,接著在 ui/configure.zcml 裡註冊實際的檔案位置。

https://lh6.googleusercontent.com/_BESgcgeL9eA/Tbkahoxm3NI/AAAAAAAACwc/2ar93_VuvQw/s800/datepicker.png

eea/jquery/profiles/ui/jsregistry.xml
  <javascript id="++resource++jquery.ui-1.7.js"
cacheable="True" compression="safe" cookable="True" enabled="True" inline="False"
expression="" position-after="jquery.js" />
+ <javascript id="++resource++ui.datepicker-zh-TW.js"
+ cacheable="True" compression="safe" cookable="True" enabled="True" inline="False"
+ expression="" position-after="jquery.js" />
</object>

eea/jquery/ui/configure.zcml

+ <browser:resource
+ name="ui.datepicker-zh-TW.js"
+ file="development-bundle/ui/i18n/ui.datepicker-zh-TW.js"
+ permission="zope.Public"
+ />
+
<browser:resource
name="jquery-ui-1.7.custom.css"
file="css/smoothness/jquery-ui-1.7.custom.css"
permission="zope.Public"

2011/04/24

Diazo Theming Tool

Diazo 能夠讀取設計師的網頁藍圖,搭配內容管理系統,即時產生網站的佈景主題,同時可以佈署數個網站,快速提供一致的操作介面。它是改善使用經驗的強大工具,整個過程不需要存取系統原有的程式碼。這項技術概念,早期由 Deliverance 和 XDV 提供實作,Diazo 著眼在簡化流程,讓佈署的門檻降得更低。

為了使用 Diazo,通常要進行下列的準備工作:
1. 找出佈景主題的檔案裡,哪些是動態顯示的部份,最好使用 HTML 的 id 識別碼,將它們標識出來。
2. 編寫規則設定檔的內容,使用 replace 或 copy 的語法,用來產生上述網頁裡的動態內容。
3. 找出佈景主題的檔案裡,哪些是共用的部份,指的通常是 <head /> 裡的 CSS 或 JavaScript 的程式碼,使用 append 或 prepend 的語法,將它們寫到規則設定檔裡。
4. 找出佈景主題的檔案裡,哪些部份是多餘的,在規則設定檔裡使用 drop 語法來刪除它們。

規則設定檔使用 XML 格式,可以利用 CSS3 或 XPath 的 selector,來指定負責顯示和內容的元件。

有了佈景主題的 HTML 檔案,還有規則設定的 XML 檔案,就可以利用 Diazo 的編譯器,把它們轉成一個 XSLT 檔案,接著佈署在網站應用程式裡,透過 Apache mod_transform 之類的 XSLT 處理器,就能動態產生搭配佈景主題的網站內容。

XSLT 的轉換動作很快,靜態的網頁資源,例如圖檔、CSS、JavaScript 等,也可以直接由靜態網站提供服務。

實用的情境之一,是使用一份佈景主題的 HTML 檔案,配合不同的網站應用程式,產生不同的 XSLT 檔案,再用網址比對的技巧,依照網頁請求來回應不同的 XSLT 檔案。

2011/04/22

GenericSetup Circular Dependency

使用 Plone 4.0.5 import 一個 theme 檔案時,遇到 GenericSetup There are unresolved or circular dependencies. 訊息,因為相依關係造成 import 無法正常完成,似乎只是 warning 而不是 error。之前已有討論,而且應該已經解決

2011/04/21

Blob Storage Restore

前幾天執行了 Plone 4.0 到 Plone 4.0.5 的昇級,記錄幾個心得。
主機在 vm 裡,新的 Plone instance 只能先從 localhost 存取,又由於想要整頓帳號,因此使用 w3m http://localhost:8080/ 先建立 Plone Site,再從前台逐步把帳號和資料恢復。
線上直接執行 cp -a ~/plone400/zinstance/var/blobstorage/0x00 ~/plone405/zinstance/var/blobstorage 可能不會正確回復資料,根據討論資訊,配合備份 Data.fs 的時間,也要同時備份 var/blobstorage 的資料。
以 File 為例,舊的檔案如果上傳新的來覆蓋,在 blobstorage 裡會存在兩筆資料,使用 pack 讓 ZODB 更新後,則會只留一筆。這代表 blobstorage 裡的關連,是動態維護的。
目前找到的文件資訊,建議使用 collective.recipe.backup,再找時間繼續測試。

2011/04/19

DateIndex Patch for DateError

在 Plone 4.0.2 ZMI portal_catalog/Indexes 裡,點選 DateIndex 後,想要 Browse 時,偶而會遇到 DateError: Invalid date: (1915, 0, 7, 4, 59, 0, 'UTC') 的錯誤,雖然前台還沒遇到問題,但這樣的狀況總叫人不安。

plone IRC 有人提到,這是 manage_browse 的臭虫,使用 browseIndex.dtml DateIndex 當關鍵字,找到 Browse DateIndex Broken for edge cases,將 Zope2 的 Products/PluginIndexes/dtml/browseIndex.dtml 加上 patch 之後,有暫時處理這個臭虫。不過,後來發現搭配 eea.jquery 的 datepicker 功能時,還是會有月份數字少1的問題,例如輸入 1999-01-01 會變成 1999-00-01,看來沒有一勞永逸。

2011/04/13

Custom Folder Listing Tips

常見的 Plone 目錄頁面,可以顯示標題、作者、日期、摘要描述,不過,從 /mysite/@@security-controlpanel 進入 Security settings 設定畫面,有個「Allow anyone to view 'about' information」選項,可以決定一般訪客是否看得到作者和日期資訊。
https://lh5.googleusercontent.com/_BESgcgeL9eA/TaVr1V8KcYI/AAAAAAAACu0/jzWFbEbhp0w/s800/01.png
完整資訊都呈現的效果如下:
https://lh3.googleusercontent.com/_BESgcgeL9eA/TaVp2S7siMI/AAAAAAAACus/NdxIttNHh-o/s800/01.png
希望登入後,還是不顯示作者、日期嗎? 這裡有幾個暴力修改法。
我先用 firebug 查看 HTML 的部份內容,找到「<span class="documentByLine">」的關鍵字,再到 Plone/buildout-cache/eggs 目錄,用 grep -r documentByLine | grep '.pt' 指令,找到 Products/CMFPlone/skins/plone_content/folder_listing.pt 檔案。

<tal:byline condition="show_about">
show_about 是控制的變數,我們只要調整 condition 條件值,就可以改變它顯示的行為。

<tal:byline condition="python: show_about and (context.getId() == 'events')">
在手邊的例子裡,打算讓它在 events 裡才顯示。
使用 context.id 很可能也行,另外 context.getId() in ('events', 'news') 則可以指定數個目錄值。

如果自製的 content type 裡,有個 my_field 欄位,在 的迴圈段落,加上 item_myfield item/getMy_field;,就可以用 <span tal:content="item_myfield"> 來顯示。

不過,我遇到的例子 my_field 是個 list,顯示結果是 ['\xe6\xb1\x89\xe6\x97\x8f'],如果只是想要顯示 list 裡的第一個值,最簡化的處理方式是使用 context.my_field[0]。