2012/08/13

Dexterity QuickStart

透過 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: