This is < b tal:replace="template/title"> the Title</b>.
そして"Save Changes"ボタンを押します。編集画面は、あなたの加えた変更が保存されたことを確認するメッセージを表示するでしょう。もし、<--Page Template Diagnostics(ページ・テンプレート診断) で始まるテキストがテンプレートに加えられていたら、サンプルを正しくタイプしたかどうかを確かめてもう一度保存してください。先程のエラーコメントを消す必要はありません。エラーが訂正されたら自動的に消えてなくなります。
< br>>
The URL is < span tal:replace="request/URL" > URL</span>.
spanタグは構造を表すもので、表示を表すものではありません。したがって、エディタやブラウザで上のサンプルのソースを眺めると、"The URL is URL."と見えます。編集している時、誤ってspanタグを消してしまったり、b や font のような書式タグをspanタグ中に置かないように気をつけてください。さもないと、それらも置き換えられてしまいます。
< head>
< title tal:content="template/title"> The Title</title>
</head>
新しいウィンドウの「Test」タブを開くと、ウィンドウのタイトルが"a Simple Page"となっているでしょう。
繰り返し
では、あなたのページに、同じフォルダ内にあるオブジェクトのリストという形で、何か中身を付け足してみましょう。オブジェクトごとに番号をつけた行と、idとmeta-typeとタイトルをカラム(列)にしたテーブルを作ってみます。以下の数行をサンプルのテンプレートの最後に書き加えてください。
< table border="1" width="100%">
< tr>
< th>#</th>< th> Id</th>< th> Meta-Type</th>< th> Title</th>
</tr>
< tr tal:repeat="item container/objectValues">
< td tal:content="repeat/item/number">#</td>
< td tal:content="item/id"> Id</td>
< td tal:content="item/meta_type"> Meta-Type</td>
< td tal:content="item/title"> Title</td>
</tr>
</table>
テーブルの列のところにある tal:repeat は、「コンテナの中にあるオブジェクトの値をリストにして、その項目の数だけこの行を繰り返す」ということを意味しています。repeatはリストからオブジェクトを取り出して一つずつ変数に代入していき、その変数を使っている行のコピーを作ります。各行の"item/id"の値はその行のオブジェクトのidとなります。
< table border="1" width="100%">
< tr>
< th>#</th>< th> Id</th>< th> Meta-Type</th>< th> Title</th>
</tr>
< tbody tal:repeat="item container/objectValues">
< tr bgcolor="#EEEEEE" tal:condition="repeat/item/even">
< td tal:content="repeat/item/number">#</td>
< td tal:content="item/id"> Id</td>
< td tal:content="item/meta_type"> Meta-Type</td>
< td tal:content="item/title"> Title</td>
</tr>
< tr tal:condition="repeat/item/odd">
< td tal:content="repeat/item/number">#</td>
< td tal:content="item/id"> Id</td>
< td tal:content="item/meta_type"> Meta-Type</td>
< td tal:content="item/title"> Title</td>
</tr>
</tbody>
</table>
tal:repeatは変わっていません。ただ新しい tbody タグのところに移動させただけです。tbodyは、テーブルの各行をグループ化する(それを今まさにやってみたのですが)ことを示す標準HTMLタグです。bodyには同一のカラムを持った二つの行があり、片方の背景はグレーです。
< table border="1" width="100%"
tal:condition="container/objectValues"
今、オブジェクトが一つもないとき、出力にはテーブルのどの部分も含まれないでしょう。けれども、オブジェクトが存在するとき、"container/objectValues"の部分は、あまり効率的とは言えませんが、二回評価されます。また、あなたがその部分を変更したいとすると、二カ所で変更しなければならなくなるでしょう。
こうした問題を避けるには、リストを保持するための変数を定義し、tal:conditionとtal:repeatの両方で使うことができます。テーブルの最初の数行を、以下のように変更します。
< table border="1" width="100%"
tal:define="items container/objectValues"
tal:condition="items">
< tr>
< th>#</th>< th> Id</th>< th> Meta-Type</th>< th> Title</th>
</tr>
< tbody tal:repeat="item items">
tal:defineで変数itemsを作り、それをtableタグのどこにおいても使うことができます。
では、itemsのないテーブルをただそのままにしておく代わりに、メッセージを表示したいとしましょう。それをするためには、テーブルの上に、次のように書きます。
< h4 tal:condition="not:container/objectValues"> There
Are No Items</h4>
この段階では、変数itemsをまだ定義していないために、使えません。もしその定義をh4タグの所に移動させたら、もうtableタグの中では使えません。h4タグのローカル変数になってしまうからです。h4とtableの両方を含むようなタグの中にその定義を置くことはできますが、もっと簡単な解決法があります。globalというキーワードを変数名の前に置くことによって、その定義がh4タグからテンプレートの最後の部分まで有効にすることができます。
< h4 tal:define="global items container/objectValues"
tal:condition="not:items"> There Are No Items</h4>
< table border="1" width="100%" tal:condition="items">
最初のtal:conditionにあるnot:というのは、どんな式の前にでも付けることもできるプレフィクスです。もしその式が真だった場合、not:は偽であり、その逆も同じことがいえます。
属性の変更
すべてではないにしろ、あなたのテンプレートにリストされたほとんどのオブジェクトは、iconプロパティを持ち、それにはその種のオブジェクトを表すアイコンへのパスを含んでいます。このアイコンをmeta-typeカラムに表示するには、imgタグのsrc属性にこのパスを書く必要があります。meta-typeカラムを、両方の行が次のようになるように編集してください。
< td>< img src="/misc_/OFSP/Folder_icon.gif"
tal:attributes="src item/icon">
< span tal:replace="item/meta_type"> Meta-Type</span>
</td>
tal:attributes文は、その画像のsrc属性をitem/iconの値に置き換えます。テンプレート中のsrcの値は、画像の挿入場所を示すものとして働くため、画像は壊れず、正しいサイズとなります。
テーブルのtal:content属性は、画像を含めて、セルの中身全体をmeta-typeテキストで置き換えてしまうため、削除しなければなりません。そのかわり、meta-typeをそのページのトップのURLと同じやり方でインラインに挿入します。
peterbe (Jun 25, 2001 11:21 am; Comment #3) Editor Remark
Requested Perhaps also mention how to use (parameters)
> tal:define="items container/objectValues"
becomes
> tal:define="items python:container.objectValues(Photo)"
or if the objectpath containes . dots:
> tal:define="items container/folder.peter/objectValues"
becomes
> tal:define="itemsobj container/folder.peter/objectValues/; items python:itemsobj(Photo)"
Stop and correct me before I make a fool out of myself.
evan (Jun 25, 2001 1:29 pm; Comment #4)
These are good, but belong in part 4, where Python expressions are
discussed.
sboddy (Sep 5, 2001 8:53 am; Comment #6)
Kind of trivial, but...
This is the Title.
should be
This is the Title.
in order to get "This is the Title."
sboddy (Sep 5, 2001 8:58 am; Comment #7)
Arghh!!! Caught out by STX again. What I meant to say was...
Kind of trivial, but...:
This is <b tal:replace="template/title">the Title</b>.
should be:
This is <b tal:content="template/title">the Title</b>.
in order to get "This is the Title."
| Last edited Mon, 11 Sep 2006 00:11:50 +0900 | Edit this page |