Date: 2009-06-28
Tags: zope, pyspa

[pyspa5] Zope2でformlibベースのフォーム

pyspa5の成果1。

やりたいこと:

Zope2で簡単にフォームを作る

前提条件1:

フォームの定義は自由に決められる

前提条件2:

Zope3のformlibのようにSchemaを決めるだけでUIの生成からチェックまでやってくれる

前提条件3:

設定UIは無くても良いがtextで保存出来るようにする

以前から、お問い合わせフォーム1つ作るのに毎回毎回プログラムを書いてデバッグしてテストして‥‥というのを考えるのが面倒だと思っていたけど、一般解も無いし、どの言語の既存コードもしっくりこない、と思っていたので作ってみた。zope.formlib は良くできていて、zope.interface を使ってSchemaを定義するだけである程度の事はやってくれるし、Widgetの切り替えもzcmlでDIの定義を返れば良いので、結果的にDRYで手軽だと感じていて、Zope2のダイナミックな変更が効くとさらに良いなあと。

実際の所Zope2からformlibを使うのはそんなに難しくなくて、SchemaとなるInterfaceクラスを動的に生成することさえ出来れば、同じ感じでcontenttypeやviewのためのクラスも生成すればよい。ということで、コード。

スキーマ定義:

from zope.schema import TextLine, Text, Choice, Set
from Products.SimpleForm2 import FieldArgsWrapper as aw

fields = [
    TextLine(**aw("name", "名前", required=True)),
    TextLine(**aw("email", "メールアドレス", required=True)),
    TextLine(**aw("addr", "住所", required=True)),
    TextLine(**aw("tel", "電話番号", required=False)),
    Text(**aw("message", "ご質問内容等", required=False)),
]

他に、複数選択のチェックボックスや単一選択のChoiceなどを定義する。定義したfieldsを使ってIntefaceを自動生成したり、Viewを自動生成して、問い合わせ画面表示や, バリデーションを行う。デザインはPageTemplateをいじる必要があるけど、上記のschema定義とデザイン設定だけZMIで設定すればOK、な作りに最終的にはしたいなあ。正直、Formとかコンテンツタイプなんて、いちいち開発なんてしてられないよね。

まあ、設定を動的に変えたいシーンというのは実際はほとんど無くて、最初の作成時と、あと運用中に1,2回あるかどうかなんで、そんなに力を入れるところかと言われると....やっぱり「うん」と答えるな。使うのが自分だけだとしてもあった方が便利だ。

もうちょっと整理したらSVNに入れよう。