[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に入れよう。