ArchExampleを読む
ここではArchetypesと一緒に配布されている、サンプルのアイテム ArchExample のソースを読みながら、Archetypesの仕組みについて説明します。
目次
- ダウンロード[download]
- ファイルの構成[files]
ダウンロード[download]
まずはArcheExampleはArchetypes 1.2.4-rc4と一緒に配布されているので、下記のURLから archetypes-1.2.5-rc4.tgz をダウンロードします。
(1.2.4-rc5, 1.3.1, 1.3.2には ArchExample が含まれていません。)
http://sourceforge.net/project/showfiles.php?group_id=75272&package_id=75683
ダウンロードしたアーカイブを展開すると、Archetypes, generator 等とともに ArchExample というディレクトリができています。
ファイルの構成[files]
ArchExampleのファイルの中身について、それぞれがどういった内容のファイルなのかを説明します。
__init__.pyこれってプロダクトの初期化スクリプト?Article.pyこのプロダクトの中心です。Archetypes の仕組みを利用してploneサイト用のアイテムを定義しています。ChangeLog変更履歴です。特に動作には関係ありません。config.py他のpython3つのソースファイルで使われている変数が定義してあります。Extensions/Install.pyこのプロダクトをploneサイトにインストールするためのスクリプトが記述してあります。 このスクリプトは プロダクトの追加・削除 の時に実行され、このプロダクトを plone サイトに追加します。skins/archexample/article_view.ptこのアイテム用をploneサイト上で表示する時に使用する PageTemplate です。
上記のようなファイルの構成はplone用のプロダクトの場合には一般的なものです。
ArchExampleで最も重要なのは Article.py ファイルで、アイテムの定義を Archetypes の仕組みを使用して記述してあります。
Article.py[article]
上記のファイルのうち、中心的なソースファイル Article.py の中身を読んでみます。
まず最初の方に、
schema = BaseSchema + Schema((
という記述から始まる一連の定義部分があります。
ここで定義されているのは、このアイテムのフィールド名とその入力方法などです。
この schema を定義している部分が Archetypes を利用する上で最も重要な部分です。
BaseSchema というのはショートネームとタイトルと、プロパティタブで設定できるメタデータについての定義がしてある「基本のデータ構造(スキーマ)」です。
そして、自分が追加で使用したいフィールドを Schema(( 以降に定義します。
Article.py では3つの追加フィールドが定義されています。
以下では、それぞれのフィールドの定義について見ていきます。
groupフィールド[group]
一つ目のフィールドは group フィールドです。
このフィールドはwidget(編集用の部品)に SelectionWidget を使用しているので、リストボックスで表示されます。またその選択用のリストは ARTICLE_GROUPS を使用します。
StringField("group",
vocabulary=ARTICLE_GROUPS,
widget=SelectionWidget(),
),
groupフィールドの編集画面は以下のようにイメージになります。ショートネームとタイトルフィールドは BaseSchema で定義されています。
なお、ARTICLE_GROUPS の中身については config.py に以下のように定義してあります。
ARTICLE_GROUPS = DisplayList((
("headline", "Headline"),
("bulletin", "Special Bulletin"),
("column", "Weekly Column"),
("editorial", "Editorial"),
("release", "Press Release"),
))
blurbフィールド[blurb]
blurbフィールドは文字列を保持するフィールドで、widgetには TextAreaWidget を使用しているので、普通のテキストエリアとして表示されます。
また、'searchable=1'と記述してあるため、ここの設定されている文字列は検索対象の文字列となります。
StringField("blurb",
searchable=1,
widget=TextAreaWidget(),
),
bodyフィールド[body]
bodyフィールドはテキストを保持するフィールドで、widgetには
RichWidget を使用しています。
RichWidget では複数の記述フォーマットに対応していて、この例ではプレーンテキスト、HTML、構造化テキストなどから選択する形式になっています。
TextField("body",
searchable=1,
required=1,
primary=1,
default_output_type="text/html",
allowable_content_types=("text/plain",
"text/structured",
"text/restructured",
"text/html",
"application/msword"),
widget=RichWidget(label="Body"),
),
クラスの定義[class]
最後に Article クラスの定義を行なっています。
ここでは、Articleクラスの schema として、上で定義した schema を代入しています。
次の actions では、view アクションでは article_view を使用するという設定をしています。
この article_view は
skins/archexample/article_view.pt
にページテンプレートとして記述されています。
class Article(BaseContent):
"""This is a sample article, it has an overridden view for show,
but this is purely optional
""" schema = schema
actions = ({
"id": "view",
"name": "View",
"action": "string:${object_url}/article_view",
"permissions": (CMFCorePermissions.View,)
},)
他にクラスを定義するときに指定できる主な属性には、以下のものがあります。
content_iconこのアイテムを表すアイコンを指定します。アイコンのファイルはskinフォルダに入れておきます。global_allowこのアイテムをどこででも追加できるようにしたくない場合は、0を設定します。allowed_content_typesこのアイテムの下に作成できるアイテムの種類をリストで記述します。