SSブログ

The Zope 3 Developer's Handbook の 13章 [Zope 3]

http://www.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/Zope3Book/contentobject.html
インストールとか概要っぽい話を12章までで終えて、いよいよサンプルパッケージを作る最初の章。
この章の中で、最低限動作するパッケージを作る手順が完結しているので、パッケージ作成のための自分の理解を図るためにメモっておく。

この章をマスターすると、ZODB にオブジェクトを登録したり見たりする事が出来る。
(自分の思った見た目で見るためには 14章の知識が必要)

この章で出来るソースはこちら↓から参照できる
http://svn.zope.org/book/trunk/messageboard/step01/

[大まかな機能]
ツリー型の掲示板。MessageBoard が全体のコンテナになって、
MessageBoard は中に Message を持つことが出来る。
Message は 中に Message と File を持つことが出来る。

[インターフェースを書く]←ここ一番大事!
http://svn.zope.org/book/trunk/messageboard/step01/interfaces.py?rev=27149&view=auto
Zope3 のインターフェースとは、オブジェクトがどんなメソッドやプロパティを持っているかを宣言するためのもの。
オブジェクト同士は、インターフェースを介してのみやり取りするので、どんな機能を持つかはインターフェースを見れば分かる。
実際に、どんな動作をするかは、それを implements() しているクラスに書く。
(以下、書いてあることのだいたいの意味合い)
IMessage
→Message は title と body プロパティを持つ。
IMessageBoard
→MessageBoard はコンテナで、子供として IMessage しか持てない。description プロパティを持つ
IMessageContained
→Message は、IMessage か IMessageBoard の子供にしかなれない。
IMessageContainer
→Message は、コンテナで、子供として IMessage か IFile しか持てない。

IMessage を IMessageBoard と同じように、IContainer から派生させて良い場合もあるが、
今回の例では Message が、
・子供に Message(とFile) を持つことが出来る(IMessageContainer で定義)
・親には Message(とMessageBoard)がなれる(IMessageContained で定義)
という特性を持つため・・・つまり、IMessage の宣言の中に再帰的に IMessage を使わなくちゃいけなくなるために(でもって、それはできない)
Message の持つインターフェースを3つに分けて、
Message クラスがその3つのインターフェースを implements するようにしている。

[テストケースを書く]
http://svn.zope.org/book/trunk/messageboard/step01/tests/
やってることは、クラスの実装コード(messageboard.py, message.py)の docstring からテストを実行すること。
クラスの docstring の中では、クラスが必要なインターフェースを implement しているか(VerifyClass)と、プロパティの読み書きのテストだけしている

この本のように、tests パッケージ(ディレクトリ)にしなくても、
http://oss.timedia.co.jp/index.fcgi/kahua-web/show/Zope3/%c4%b6%a5%b7%a5%f3%a5%d7%a5%eb%a4%ca%a5%a2%a5%d7%a5%ea%a5%b1%a1%bc%a5%b7%a5%e7%a5%f3%a4%f2%ba%ee%a4%ed%a4%a6%20%a4%bd%a4%ce2
の「テストコードを書く」のように、tests モジュール(tests.py という1つのファイル)にまとめてもよい。

[実装コードを書く]
http://svn.zope.org/book/trunk/messageboard/step01/messageboard.py?rev=27149&view=auto
http://svn.zope.org/book/trunk/messageboard/step01/message.py?rev=27149&view=auto
この章では、ほとんど何もやってない。implements するフェースを記述する以外は、プロパティの初期化だけ。
#次の章(14章)では、ZPT で View を作るときに、ZPT から呼ばれるメソッドをクラスに実装してる。
Zope 3 は UNICODE 中心で動いているので、文字列の初期値は UNICODE で指定してね。

[configure.zcml を書く]←ここ二番目に大事!
http://svn.zope.org/book/trunk/messageboard/step01/configure.zcml?rev=27149&view=auto
configure.zcml を書くことにより Zope 3 にコンポーネントを登録できる。
IAttributeAnnotable を implements するよー、と宣言しておくと Zope3 が metadata(Dublin Core) のプロパティに値をセットしてくれる。
IContentContainer を implements するよー、と宣言することにより、Content Space のコンテナだなってことが Zope 3 君に理解できる。
IAttributeAnnotable や IContentContainer は、宣言するだけで Python の実装コードで、何かメソッドを定義するわけじゃないので marker interface と言うんだそうな。

permission はインターフェースに対して設定する。↓その他は、実物を見て推測して
http://svn.zope.org/book/trunk/messageboard/step01/configure.zcml?rev=27149&view=auto

[View を書く]
http://svn.zope.org/book/trunk/messageboard/step01/browser/configure.zcml?rev=27149&view=auto
browser ディレクトリの中の configure.zcml を記述することにより、入力フォームや view を作成。
http://svn.zope.org/book/trunk/messageboard/step01/browser/configure.zcml?rev=27149&view=auto
ZPT(HTML) を書かなくても、最低限の View はできますよ、という例。
・コンテンツを表示する(containerViews)
・コンテンツを追加する(addform)
・コンテンツを編集する(editform)
・Zope3 のメニューに追加フォームへのリンクを追加する(addMenuItem)

ZPT で書いた View を作りたいと言う場合は、14章参照
http://www.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/Zope3Book/componentviews.html


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントの受付は締め切りました

Facebook コメント

トラックバック 0