透過 ZopeSkel 可以協助客製 Archetype 程式碼,同樣的原理方法也適用於 Dexterity,搭配 Plone 4.2 Unified Installer 的話,只需要在 base.cfg [zopeskel] section 加上 zopeskel.dexterity:
[zopeskel] # installs paster and Zopeskel recipe = zc.recipe.egg eggs = ZopeSkel Paste PasteDeploy PasteScript zopeskel.dexterity ${buildout:eggs}
再執行 bin/buildout 就能在 src 目錄裡用 ../bin/zopeskel dexterity 來建立骨架程式碼。
典型的 Dexterity 程式碼,__init__.py 的主要功能是設定 i18n message factory,內容類似如下:
from zope.i18nmessageid import MessageFactory # Set up the i18n message factory for our package MessageFactory = MessageFactory('tws.dxcontent')
接著,重頭戲是從下列的 mytype.py 內容開始。在 zope.schema 找得到標準欄位的定義,除此之外,通常也會用到 plone.app.textfield 和 z3c.relationfield 這兩個模組:
from five import grok from plone.directives import dexterity, form from zope import schema from zope.schema.interfaces import IContextSourceBinder from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm from zope.interface import invariant, Invalid from z3c.form import group, field from plone.namedfile.interfaces import IImageScaleTraversable from plone.namedfile.field import NamedImage, NamedFile from plone.namedfile.field import NamedBlobImage, NamedBlobFile from plone.app.textfield import RichText from z3c.relationfield.schema import RelationList, RelationChoice from plone.formwidget.contenttree import ObjPathSourceBinder from myproj.dxcontent import MyTypeMessageFactory as _
註:ObjPathSourceBinder 之前出現在 z3c.relationfield.schema 裡面,新的版本出現在 plone.formwidget.contenttree 裡。另外,也明確可以看到 schema-defined interface 和 model-based interface 兩種設定方式。
如果要用到 validator,下列是個例子:
def codeIsValid(value): """Contraint function to make sure the given code is valid """ if value: if len(value) < 4 or len(value) > 6 or \ not value.startswith('C'): raise Invalid( _(u"The code is not of the correct format") ) return True
透過網頁可以管理設定這些型別:
點選 Export Schema Models 按鈕,可以儲存 dexterity_models-20120801030127.zip 內含 models/*.xml 檔案,點選 Export Type Profiles 按鈕,可以儲存 dexterity_export-20120801031015.zip 內含 types.xml 和 types 目錄。
不過,網頁式的 Model 設定結果,如果使用中文的話,長得像這樣:
<field name="text" type="plone.app.textfield.RichText"> <description /> <title>內文</title>
No comments:
Post a Comment