ReadingCOREBlog
Up one leveldtmlやpythonについて何にも知識のない人がお勉強のためにCOREBlogのcontentsをのぞいてしまおうという企画です。
2004/07/10
COREBlogを読む(index_html前半)
by
nyusuke
—
posted at
2004-07-10 06:25
last modified
2006-08-06 17:37
読むひと(わたし)の知識
・html、cssについてはそこそこわかる
・dtmlはほとんど知らない
・pythonはまったくわからない
・その他言語もほぼわからない
読むもの
・contentsタブで表示されるもの
pythonはさすがにいきなりは無理だと思うのでdtmlの使いかたをお勉強しようと思い立ち、まぁzopeの本とかネット上の情報とか読んで勉強するより身近なものを読んでいった方がわかりやすいだろうし今後の役にも立つかなと思ったわけで。
さっそくindex_htmlをば拝見。
まずはヘッダの読み込みですな。
dtml-varのvarは変数のvarですか。ものの本には「変数データのテキスト表現をドキュメントやメソッドの出力に挿入する」って書いてありますな。ふーむ。こういう説明ってやっぱりよくわからん…。
まぁcontentsの中にblog_headerがあるから、これがここに挿入されるんだろうって予想はすぐつきますが。
と予想した所で、ものの本のなかに衝撃的な事実を発見。
<dtml-var blog_header>は<dtml-var name="blog_header">の簡略化表現らしい!うーむ、また一つ勉強になったぞ。
dtml-varの属性はいろいろあるみたいですね。その中のひとつの属性がnameであると。でもnameとidってどう違うんだろうか…。まぁこれは今後の課題ということで、次を見てみる。
これはblog_headerと同じですな。パス。
次はブログ本体とサイドメニューのレイアウト部分のようです。(中略その1)がブログ本体の記述、(中略その2)がサイドメニューの記述ですが、まずは全体を概観してみることに(自分が見やすいように適宜改行やスペースなど入れています)。
これは基本的にhtmlなので理解はできます。テーブルを使って左にブログ本体、右にサイドメニューをもってきてるわけですな。
んでも、中略その2の後、/divがある、その次のbrが何のためのものなのかよくわからなかった。ので、これをとってしまうとどうなるか確認してみました。
brをとる前

↓
brをとった後

なるほど。サイドメニューの方がブログ本体よりも縦長になってしまった場合、COREBlogのバナーがフッタにひっついてしまうわけですか。納得。
・html、cssについてはそこそこわかる
・dtmlはほとんど知らない
・pythonはまったくわからない
・その他言語もほぼわからない
読むもの
・contentsタブで表示されるもの
pythonはさすがにいきなりは無理だと思うのでdtmlの使いかたをお勉強しようと思い立ち、まぁzopeの本とかネット上の情報とか読んで勉強するより身近なものを読んでいった方がわかりやすいだろうし今後の役にも立つかなと思ったわけで。
さっそくindex_htmlをば拝見。
まずはヘッダの読み込みですな。
<dtml-comment>
### Blog main interface ###
</dtml-comment>
<dtml-var blog_header>
dtml-varのvarは変数のvarですか。ものの本には「変数データのテキスト表現をドキュメントやメソッドの出力に挿入する」って書いてありますな。ふーむ。こういう説明ってやっぱりよくわからん…。
まぁcontentsの中にblog_headerがあるから、これがここに挿入されるんだろうって予想はすぐつきますが。
と予想した所で、ものの本のなかに衝撃的な事実を発見。
<dtml-var blog_header>は<dtml-var name="blog_header">の簡略化表現らしい!うーむ、また一つ勉強になったぞ。
dtml-varの属性はいろいろあるみたいですね。その中のひとつの属性がnameであると。でもnameとidってどう違うんだろうか…。まぁこれは今後の課題ということで、次を見てみる。
これはblog_headerと同じですな。パス。
<dtml-comment>
### banner ###
</dtml-comment>
<dtml-var blog_banner>
次はブログ本体とサイドメニューのレイアウト部分のようです。(中略その1)がブログ本体の記述、(中略その2)がサイドメニューの記述ですが、まずは全体を概観してみることに(自分が見やすいように適宜改行やスペースなど入れています)。
<table cellpadding="0" cellspacing="0"
border="0" width="100%">
<tr valign="top">
<td>
<dtml-comment>
### Content block ###
</dtml-comment>
<div id="content">
(中略その1)
</div>
</td>
<td align="right">
<dtml-comment>
### Sidebox block ###
</dtml-comment>
<div id="sidebox">
(中略その2)
</div>
<br />
<br clear="all" />
</td>
</tr>
</table>
これは基本的にhtmlなので理解はできます。テーブルを使って左にブログ本体、右にサイドメニューをもってきてるわけですな。
んでも、中略その2の後、/divがある、その次のbrが何のためのものなのかよくわからなかった。ので、これをとってしまうとどうなるか確認してみました。
brをとる前
↓
brをとった後
なるほど。サイドメニューの方がブログ本体よりも縦長になってしまった場合、COREBlogのバナーがフッタにひっついてしまうわけですか。納得。
さて次はブログ本体の部分(中略その1)を眺めてみます。
やばい…。難しい…。
とりあえずdtml-callというのが目新しい。しかもそのあとREQUEST.setほにゃららというのがまたいかにも難しそうだ…。
ものの本の力を借りると、まず
<dtml-call "REQUEST.set(いろいろ)">
というのは
<dtml-call expr="REQUEST.set(いろいろ)">
の簡略化表現らしいです。
簡略化表現でダブルクォーテーションありの場合はexpr="いろいろ"の簡略化、ダブルクォーテーションなしの場合はname="いろいろ"の簡略化というのはちゃんと記憶しておくことにする。よし。
また本によると、exprというのは評価するということらしい。評価というとピンとこないけど、たぶん計算するってことなんだろう。
この場合はREQUEST.set(いろいろ)ってのを評価することになるけど、REQUEST.setってなんやねん…。
またまた本にヘルプ〜。すると、REQUESTオブジェクトにはsetというメソッドがあって、setというのは、文字列としての変数名とその名前に割り当てる値という2つの引数をとって、web要求の間中、定義された状態を保つような変数を挿入できるらしい。
ソースのコメントにはヘッダとかコメントとかを隠すって書いてあるから、このことから予想するに、ひとつのエントリにはほんとはヘッダとかコメントとかいろいろ付属した形で保存されてるけど、index_htmlにおいてはそれらを隠すためにnoheaderとかnocommentとかいう変数に1(フラグを立てるってことか)をsetしてるんだろう。
こういうのは1を0にしてみれば確認でけるハズ。たぶん。
noextendlinkが1のとき

↓
noextendlinkが0のとき

うーむ。noextendlinkについては変化が見られたけど、その他については変化ナス…。どういうことやろか。
まぁとりあえずnoextendlinkは予想どおりだったということでOKということにしておこう…。
さてREQUEST.set(いろいろ)についてはいちおう確認できたということにしておいて、dtml-callの方を調べてみると、これはdtml-varとほとんど同じらしい。dtml-varと異なる点は
・テキストを生成しない
・テキスト置換を実行しない
ということらしい。テキスト置換についてはよくわからんけど、テキストを生成しないというのはきっとテキストを表示しないってことなんだろう。<dtml-call expr="なんたら">というわけだから、「出力しなくていいから”なんたら”って評価を実行してくれい」ということか。
ここでは”なんたら”ってのがREQUEST.set(いろいろ)というわけだから、これを考えあわせると、
「出力しなくていいから、web要求の間、いろいろな変数に1をセットしておいてくれい」
ということなんだろう。
違ってるかもしれないけど、これ以上の理解はいまは激しく無理…。
さてそのあとはどうなってたかな。
dtml-unlessというのはわかりやすいな。いってみればdtml-if-notみたいな感じかな(そんなのないけどさ)。
<dtml-unless top_days> = <dtml-unless name="top_days">
ということだから、<dtml-call "REQUEST.set('top_days', 4)>と考えあわせれば、
「出力しなくていいから、top_daysという変数が設定されてなかったら、web要求の間、これを4に設定してくれい」
ということなんだろう。また、これは当然予想できるけど、top_daysはトップページに表示するエントリの数だろう。
うを。眠気が…。あと少しだけ読んだら寝てしまおう。
dtml-inてのは繰り返しだから、top_days変数に格納されてる回数だけ繰り返すということになるはずだろうけど…。なんだこの評価の式は。早く寝たいのにこんなところで超難問が…。
Zope本よ、助けてくれー!
あれこれ探すこと10分以上。でもたぶん15分未満。ズバリではないけど、それっぽいものがあった。
range(count)っていうのがあって、これが「count個の整数のリストを返す」らしい。スタートは「0」みたい。例として「"_.range(4)"」となってて、返す値は「0、1、2、3」。_.rangeというのがよくわからんけど今は無視。
ここではcount=top_daysで、top_daysはデフォルトでは4が入ってるから、「0、1、2、3」が返される。けど、rev_day_entry_itemsというのがある…。
よーし、パパ予想しちゃうぞー。
まずここには最新のエントリが(デフォルトでは4つ)挿入されるはずだ。
また、各エントリには「ブログのURL/数字」でアクセスできる。ということは各エントリには番号がつけられているはずだ。最初のエントリには番号「1」が、2番目のエントリには番号「2」が、…という具合に。例えば50のエントリがあれば最新のエントリには50という番号が付いてるはず。
ということは、50のエントリがあって、最新のエントリを4つ得たい場合は、欲しいエントリ番号は50、49、48、47だ。
ということは、だ。
rev_day_entry_itemsのrevはリバースのrevで、この中にはエントリ番号とかが逆さまに格納されてるんじゃないかな。
それで、この中からcount=top_daysによって(デフォルトでは4つ)、最新のものが引っ張ってこられるという仕掛けなのでは…。
rev_day_entry_itemsの正体を予想するのは今の理解では無理。激しく無理。何より眠い。よし、ラストスパート。
ソースをもう一度確認。
dtml-inによって、rev_day_entry_itemsの中身についてtop_daysによって取り出される要素の個数分だけ、dtml-in以下を繰り返す。
(ただしrev_day_entry_itemsが空ならば、dtml-else以下が表示される)
dtml-in以下には<dtml-var entry_body>があるから、対応するエントリ番号のentry_bodyが表示される。
とまあ、そんな感じのハズ。
もう寝る!
<dtml-comment>
* set noheader,noextendlink,nocomment
to hide header,link to extend,comment and trackback
</dtml-comment>
<dtml-call "REQUEST.set('noheader',1)">
<dtml-call "REQUEST.set('noextendlink',1)">
<dtml-call "REQUEST.set('nocomment',1)">
<dtml-call "REQUEST.set('nocommentform',1)">
<dtml-unless top_days>
<dtml-call "REQUEST.set('top_days',4)">
</dtml-unless top_days>
<dtml-in "rev_day_entry_items(count=top_days)">
<dtml-var entry_body>
<dtml-else>
<div id="content">
There are no entry.
</div>
</dtml-in>
やばい…。難しい…。
とりあえずdtml-callというのが目新しい。しかもそのあとREQUEST.setほにゃららというのがまたいかにも難しそうだ…。
ものの本の力を借りると、まず
<dtml-call "REQUEST.set(いろいろ)">
というのは
<dtml-call expr="REQUEST.set(いろいろ)">
の簡略化表現らしいです。
簡略化表現でダブルクォーテーションありの場合はexpr="いろいろ"の簡略化、ダブルクォーテーションなしの場合はname="いろいろ"の簡略化というのはちゃんと記憶しておくことにする。よし。
また本によると、exprというのは評価するということらしい。評価というとピンとこないけど、たぶん計算するってことなんだろう。
この場合はREQUEST.set(いろいろ)ってのを評価することになるけど、REQUEST.setってなんやねん…。
またまた本にヘルプ〜。すると、REQUESTオブジェクトにはsetというメソッドがあって、setというのは、文字列としての変数名とその名前に割り当てる値という2つの引数をとって、web要求の間中、定義された状態を保つような変数を挿入できるらしい。
ソースのコメントにはヘッダとかコメントとかを隠すって書いてあるから、このことから予想するに、ひとつのエントリにはほんとはヘッダとかコメントとかいろいろ付属した形で保存されてるけど、index_htmlにおいてはそれらを隠すためにnoheaderとかnocommentとかいう変数に1(フラグを立てるってことか)をsetしてるんだろう。
こういうのは1を0にしてみれば確認でけるハズ。たぶん。
noextendlinkが1のとき
↓
noextendlinkが0のとき
うーむ。noextendlinkについては変化が見られたけど、その他については変化ナス…。どういうことやろか。
まぁとりあえずnoextendlinkは予想どおりだったということでOKということにしておこう…。
さてREQUEST.set(いろいろ)についてはいちおう確認できたということにしておいて、dtml-callの方を調べてみると、これはdtml-varとほとんど同じらしい。dtml-varと異なる点は
・テキストを生成しない
・テキスト置換を実行しない
ということらしい。テキスト置換についてはよくわからんけど、テキストを生成しないというのはきっとテキストを表示しないってことなんだろう。<dtml-call expr="なんたら">というわけだから、「出力しなくていいから”なんたら”って評価を実行してくれい」ということか。
ここでは”なんたら”ってのがREQUEST.set(いろいろ)というわけだから、これを考えあわせると、
「出力しなくていいから、web要求の間、いろいろな変数に1をセットしておいてくれい」
ということなんだろう。
違ってるかもしれないけど、これ以上の理解はいまは激しく無理…。
さてそのあとはどうなってたかな。
<dtml-unless top_days>
<dtml-call "REQUEST.set('top_days',4)">
</dtml-unless top_days>
dtml-unlessというのはわかりやすいな。いってみればdtml-if-notみたいな感じかな(そんなのないけどさ)。
<dtml-unless top_days> = <dtml-unless name="top_days">
ということだから、<dtml-call "REQUEST.set('top_days', 4)>と考えあわせれば、
「出力しなくていいから、top_daysという変数が設定されてなかったら、web要求の間、これを4に設定してくれい」
ということなんだろう。また、これは当然予想できるけど、top_daysはトップページに表示するエントリの数だろう。
うを。眠気が…。あと少しだけ読んだら寝てしまおう。
<dtml-in "rev_day_entry_items(count=top_days)">
<dtml-var entry_body>
<dtml-else>
<div id="content">
There are no entry.
</div>
</dtml-in>
dtml-inてのは繰り返しだから、top_days変数に格納されてる回数だけ繰り返すということになるはずだろうけど…。なんだこの評価の式は。早く寝たいのにこんなところで超難問が…。
Zope本よ、助けてくれー!
あれこれ探すこと10分以上。でもたぶん15分未満。ズバリではないけど、それっぽいものがあった。
range(count)っていうのがあって、これが「count個の整数のリストを返す」らしい。スタートは「0」みたい。例として「"_.range(4)"」となってて、返す値は「0、1、2、3」。_.rangeというのがよくわからんけど今は無視。
ここではcount=top_daysで、top_daysはデフォルトでは4が入ってるから、「0、1、2、3」が返される。けど、rev_day_entry_itemsというのがある…。
よーし、パパ予想しちゃうぞー。
まずここには最新のエントリが(デフォルトでは4つ)挿入されるはずだ。
また、各エントリには「ブログのURL/数字」でアクセスできる。ということは各エントリには番号がつけられているはずだ。最初のエントリには番号「1」が、2番目のエントリには番号「2」が、…という具合に。例えば50のエントリがあれば最新のエントリには50という番号が付いてるはず。
ということは、50のエントリがあって、最新のエントリを4つ得たい場合は、欲しいエントリ番号は50、49、48、47だ。
ということは、だ。
rev_day_entry_itemsのrevはリバースのrevで、この中にはエントリ番号とかが逆さまに格納されてるんじゃないかな。
それで、この中からcount=top_daysによって(デフォルトでは4つ)、最新のものが引っ張ってこられるという仕掛けなのでは…。
rev_day_entry_itemsの正体を予想するのは今の理解では無理。激しく無理。何より眠い。よし、ラストスパート。
ソースをもう一度確認。
<dtml-in "rev_day_entry_items(count=top_days)">
<dtml-var entry_body>
<dtml-else>
<div id="content">
There are no entry.
</div>
</dtml-in>
dtml-inによって、rev_day_entry_itemsの中身についてtop_daysによって取り出される要素の個数分だけ、dtml-in以下を繰り返す。
(ただしrev_day_entry_itemsが空ならば、dtml-else以下が表示される)
dtml-in以下には<dtml-var entry_body>があるから、対応するエントリ番号のentry_bodyが表示される。
とまあ、そんな感じのハズ。
もう寝る!
- Category(s)
-
Zope
-
Linux
-
ReadingCOREBlog
-
COREBlog1
- The URL to Trackback this entry is:
- http://nagosui.org/Nagosui/COREBlog2/26/tbping
2004/07/11
COREBlogを読む(index_html後半)
by
nyusuke
—
posted at
2004-07-11 04:02
last modified
2006-08-06 17:37
さてさて今日はindex_htmlの残りの部分、サイドメニューを読んで見る。前回の(中略その2)にあたる部分だ。
さっそくソースをば拝見。
後半はほとんどhtmlなのでわかりやすいですな。途中<dtml-var blogurl>が2回ほど出てきてますが、そういえばSettingsタブに「Blog URL」っていう設定項目があったような。あれが使われるということかな。
さっそくソースをば拝見。
<dtml-comment>
### Sidebox block ###
</dtml-comment>
<div id="sidebox">
<dtml-with modules>
<dtml-var index_html>
</dtml-with>
<p>
<a href="<dtml-var blogurl>/rdf10_xml">
Syndicate this site (XML)
</a>
</p>
<p>
<a href="<dtml-var blogurl>/rdf91_xml">
RSS/RDF 0.91
</a>
</p>
<a href="http://coreblog.org">
<img src="images/corebloglogo" border="0">
</a>
後半はほとんどhtmlなのでわかりやすいですな。途中<dtml-var blogurl>が2回ほど出てきてますが、そういえばSettingsタブに「Blog URL」っていう設定項目があったような。あれが使われるということかな。
問題はコレ。
新たなる難敵、dtml-withの登場だ。本の説明では「DTML名前空間を操作するために使う」と、わけのわからぬことをいっている。
だけどdtml-withを使うと便利な場合として
・同じ名前を持つ別の変数にアクセスする場合
という例が挙げてある。
なるほど、dtml-withの下の行に<dtml-var index_html>というのがある。これは本当はmodulesフォルダ内にあるindex_htmlを読み込みたいわけだけど、下位フォルダにあるので問題アリなわけだ。そこでdtml-withによってmodulesフォルダ内にあるindex_htmlの優先順位をあげ、こちらが参照されるようにする、と。そういうわけですな。
そんでも名前空間って概念がよくわからない…。
うーむ。まだまだ勉強が足らんですなぁ。
とにかくdtml-withによって、modulesフォルダ内のindex_htmlが参照されるわけですが、そのindex_htmlの中身はどんなふうになっているかというと、
という具合に、カレンダーとかアバウトとかその他が並んでいるだけですな。各モジュールの中身についてはまた今度読むということで…
とりあえずindex_htmlは一通り眺め終わりますた。
いろいろなdtml-が出てきたので頭の中がまだ完全には整理できてないし、わかってないこともたくさん出てきました。
少しずつ読みながら、少しずつ身についていけばと思います。
<dtml-with modules>
<dtml-var index_html>
</dtml-with>
新たなる難敵、dtml-withの登場だ。本の説明では「DTML名前空間を操作するために使う」と、わけのわからぬことをいっている。
だけどdtml-withを使うと便利な場合として
・同じ名前を持つ別の変数にアクセスする場合
という例が挙げてある。
なるほど、dtml-withの下の行に<dtml-var index_html>というのがある。これは本当はmodulesフォルダ内にあるindex_htmlを読み込みたいわけだけど、下位フォルダにあるので問題アリなわけだ。そこでdtml-withによってmodulesフォルダ内にあるindex_htmlの優先順位をあげ、こちらが参照されるようにする、と。そういうわけですな。
そんでも名前空間って概念がよくわからない…。
うーむ。まだまだ勉強が足らんですなぁ。
とにかくdtml-withによって、modulesフォルダ内のindex_htmlが参照されるわけですが、そのindex_htmlの中身はどんなふうになっているかというと、
<dtml-var calendar>
<dtml-var about>
…(略)
…
という具合に、カレンダーとかアバウトとかその他が並んでいるだけですな。各モジュールの中身についてはまた今度読むということで…
とりあえずindex_htmlは一通り眺め終わりますた。
いろいろなdtml-が出てきたので頭の中がまだ完全には整理できてないし、わかってないこともたくさん出てきました。
少しずつ読みながら、少しずつ身についていけばと思います。
- Category(s)
-
Zope
-
ReadingCOREBlog
-
COREBlog1
- The URL to Trackback this entry is:
- http://nagosui.org/Nagosui/COREBlog2/27/tbping
2004/07/12
COREBlogを読む(blog_banner)
by
nyusuke
—
posted at
2004-07-12 02:30
last modified
2006-08-06 17:37
index_htmlの次は何を読もうかなと考えて、まぁ上に並んでいるものから見て行こうかということで、次はblog_bannerです。
コメントとcssを適用するためのdivがありますが、基本的にはテーブルなので、このテーブルを見てみることにします。まずはセルの構造をつかむために簡略化して表示してみましょう(テーブルにボーダーをつけ、スタイルなどは排除)。
ソース。
これをレンダリングすると以下のようになります。
実際のバナー部分

コメントとcssを適用するためのdivがありますが、基本的にはテーブルなので、このテーブルを見てみることにします。まずはセルの構造をつかむために簡略化して表示してみましょう(テーブルにボーダーをつけ、スタイルなどは排除)。
ソース。
<table border="1">
<tr>
<td>cell1</td>
</tr>
<tr>
<td rowspan="2">cell2</td>
<td>cell3</td>
<td rowspan="2">cell4</td>
</tr>
<tr>
<td>cell5</td>
</tr>
</table>
これをレンダリングすると以下のようになります。
| cell1 | ||
| cell2 | cell3 | cell4 |
| cell5 |
実際のバナー部分
cell1の内容は以下のようになっています。
バナーの上のスペースを作っているのでしょうか。うーん、意味あるのかな…
cell2の内容は以下のようになっています。
中身は空。四角形を作ってるだけですな。
cell3の内容は以下のようになっています。
このセルをクリックするとトップに飛ぶわけですな。
注目したいのはdtml-ifによって条件分岐をさせている部分。blog_logo_imgというオブジェクトが存在すれば、これを表示し、存在しなければ、blognameを表示するというわけです。
contents内にblog_logo_imgがない場合

↓
contents内にblog_logo_imgがある場合

cell4の内容は以下のようになっています。
width="270"が設定されているのがミソでしょうか。blognameが長すぎて改行されてしまうときには、この値を小さくすれば改行されなくなるかもしれませぬ。
cell5の内容は以下のようになっています。
ここでもcell3と同様、dtml-ifを用いた条件分岐を行っているようです。blog_description_imgが存在すれば、これを表示し、存在しなければblog_description(settingsにあるshort descriptionで設定)を表示するわけですな。
contents内にblog_description_imgがない場合

↓
contents内にblog_description_imgがある場合

こうやって見てみると、ソース上には存在してるけどデフォルトではcontents内に存在しない画像があるんですなぁ。こういうのを知ってると楽しいバナーになるかもしれませんね。
<tr height="10" style="font-size:7px;">
<td>&nbsp;</td>
</tr>
バナーの上のスペースを作っているのでしょうか。うーん、意味あるのかな…
cell2の内容は以下のようになっています。
<tr height="30">
<td rowspan="2"
style="background:#<dtml-var color1 missing="FFF">;
border-right :1px solid #000;
width: 3.6em;">
&nbsp;<br>
</td>
中身は空。四角形を作ってるだけですな。
cell3の内容は以下のようになっています。
<td
style="background:#<dtml-var color2 missing="C0C0C0">;
border-bottom :1px solid #000;"
align="left">
<a href="<dtml-var blogurl missing="">/" accesskey="1">
<dtml-if blog_logo_img>
<dtml-var blog_logo_img><br>
<dtml-else>
<span class="blogname">
&nbsp;<dtml-var blog_title>
</span>
</dtml-if>
</a>
</td>
このセルをクリックするとトップに飛ぶわけですな。
注目したいのはdtml-ifによって条件分岐をさせている部分。blog_logo_imgというオブジェクトが存在すれば、これを表示し、存在しなければ、blognameを表示するというわけです。
contents内にblog_logo_imgがない場合
↓
contents内にblog_logo_imgがある場合
cell4の内容は以下のようになっています。
<td rowspan="2" width="270">
<br>
</td>
width="270"が設定されているのがミソでしょうか。blognameが長すぎて改行されてしまうときには、この値を小さくすれば改行されなくなるかもしれませぬ。
cell5の内容は以下のようになっています。
<tr height="10">
<td style="background:#FFF;" align="left">
<dtml-if blog_description_img>
<dtml-var blog_description_img><br>
<dtml-else>
<div class="description">
<dtml-var blog_description missing="">
</div>
</dtml-if>
</td>
</tr>
ここでもcell3と同様、dtml-ifを用いた条件分岐を行っているようです。blog_description_imgが存在すれば、これを表示し、存在しなければblog_description(settingsにあるshort descriptionで設定)を表示するわけですな。
contents内にblog_description_imgがない場合
↓
contents内にblog_description_imgがある場合
こうやって見てみると、ソース上には存在してるけどデフォルトではcontents内に存在しない画像があるんですなぁ。こういうのを知ってると楽しいバナーになるかもしれませんね。
- Category(s)
-
Zope
-
ReadingCOREBlog
-
COREBlog1
- The URL to Trackback this entry is:
- http://nagosui.org/Nagosui/COREBlog2/28/tbping
2004/07/13
COREBlogを読む(categorylist_html)
by
nyusuke
—
posted at
2004-07-13 23:55
last modified
2006-08-06 17:37
contentsの中身を上から読んでいくとなると次はblog_footerとblog_headerなんですが、ほとんどhtmlなのでパスして、categorylist_htmlを見てみることにしました。
categorylist_htmlは、あるカテゴリに属するエントリをすべて表示するためのものです。サイドメニューのCATEGORIESに表示されているカテゴリをクリックするときに使われるものですな。
さっそく中身をみていくことにします。
最初はヘッダとバナーの読み込みなのですっとばして、その次から。
これはindex_htmlにもあった記述で、コメントとコメントフォームを隠すためにnocommentおよびnocommentformという変数に1を設定しているようです。
が、index_htmlのとき同様、1を0に変えてみても何も変化ナス…。これは今後の課題にしときます。
次!
dtml-ifによる条件分岐ですな。
cat_idが存在し、空でなければ(中略)部分を実行し、cat_idが存在しない、または空であるならば「cat_id is missing」を表示する、と。
サイドメニューのCATEGORIESにあるカテゴリのリンクを見てみると、なるほど、「ブログURL/categorylist_html?cat_id=数字」という形になってますな。
cat_idというのはおそらくcategory idという変数で、管理画面のcategoryタブではどのカテゴリにどのidが割り当てられているかがわかりますね。
確認のため、「ブログURL/categorylist_html」にアクセスする(cat_idを指定しない)と、「cat_id is missing」と表示されました。
categorylist_htmlは、あるカテゴリに属するエントリをすべて表示するためのものです。サイドメニューのCATEGORIESに表示されているカテゴリをクリックするときに使われるものですな。
さっそく中身をみていくことにします。
最初はヘッダとバナーの読み込みなのですっとばして、その次から。
<dtml-call "REQUEST.set('nocomment',1)">
<dtml-call "REQUEST.set('nocommentform',1)">
これはindex_htmlにもあった記述で、コメントとコメントフォームを隠すためにnocommentおよびnocommentformという変数に1を設定しているようです。
が、index_htmlのとき同様、1を0に変えてみても何も変化ナス…。これは今後の課題にしときます。
次!
dtml-ifによる条件分岐ですな。
<dtml-if cat_id>
(中略)
<dtml-else>
cat_id is missing.
</dtml-if>
cat_idが存在し、空でなければ(中略)部分を実行し、cat_idが存在しない、または空であるならば「cat_id is missing」を表示する、と。
サイドメニューのCATEGORIESにあるカテゴリのリンクを見てみると、なるほど、「ブログURL/categorylist_html?cat_id=数字」という形になってますな。
cat_idというのはおそらくcategory idという変数で、管理画面のcategoryタブではどのカテゴリにどのidが割り当てられているかがわかりますね。
確認のため、「ブログURL/categorylist_html」にアクセスする(cat_idを指定しない)と、「cat_id is missing」と表示されました。
それじゃあ(中略)部分を少しずつ見てみたいと思います。
まずはカテゴリバナーを表示する部分ですな。
こんなやつ↓

さてここで問題が。dtml-withが出てきちゃいました…。
これはindex_htmlを読んだときも出てきましたが、どーも、よくわからん。
ここではgetCategoryというやつが正体不明だし、しかもこのときになんでdtml-withを使うのかがわからん。
理解はまったく不能。うーむかっこわるい。
getCategoryって何なんだろうなぁ…
あうー。パス…というかお手上げ。
次の部分は一度みたことがあります。
これは全てのカテゴリの名前を表示するわけですな。
category_listの中にはおそらく、登録されているカテゴリがつまってるんでしょう。dtml-inによってカテゴリの数だけ、その名前を表示するわけですな。おそらく。
そして最後。
category_idがcat_idなものを、rev_category_entry_itemsによって逆さまにしといて、その中のentry_bodyを表示するわけですな。
エントリがない場合は「There are no entry.」を表示する、と。
うーむ。いかん。さっぱりわからん。
dtml-についてはなんとなくつかめてきたけど、使われてる変数の正体がまったくわかりませぬ…。contentsにあるものだけを見てもあんまり勉強にならんのかな。
まぁとりあえずもう少し続けて見ることにします…
特に中身が正体不明なものリスト
・getCategory
・rev_category_entry_items
<dl class="category-banner">
<dtml-with "getCategory(id=cat_id)">
<dt>Entries : Category [ <dtml-var name> ] </dt>
<dd><dtml-var description missing=""></dd>
</dtml-with>
</dl>
まずはカテゴリバナーを表示する部分ですな。
こんなやつ↓
さてここで問題が。dtml-withが出てきちゃいました…。
これはindex_htmlを読んだときも出てきましたが、どーも、よくわからん。
ここではgetCategoryというやつが正体不明だし、しかもこのときになんでdtml-withを使うのかがわからん。
理解はまったく不能。うーむかっこわるい。
getCategoryって何なんだろうなぁ…
あうー。パス…というかお手上げ。
次の部分は一度みたことがあります。
<dtml-in category_list>
<a href="
<dtml-var blogurl missing="">
/categorylist_html?cat_id=<dtml-var id>">
[<dtml-var name missing="category name is missing">]
</a>
</dtml-in>
</div>
これは全てのカテゴリの名前を表示するわけですな。
category_listの中にはおそらく、登録されているカテゴリがつまってるんでしょう。dtml-inによってカテゴリの数だけ、その名前を表示するわけですな。おそらく。
そして最後。
<dtml-in "rev_category_entry_items(category_id=cat_id)">
<dtml-var entry_body>
<dtml-else>
<div id="content">
There are no entry.
</div>
</dtml-in>
category_idがcat_idなものを、rev_category_entry_itemsによって逆さまにしといて、その中のentry_bodyを表示するわけですな。
エントリがない場合は「There are no entry.」を表示する、と。
うーむ。いかん。さっぱりわからん。
dtml-についてはなんとなくつかめてきたけど、使われてる変数の正体がまったくわかりませぬ…。contentsにあるものだけを見てもあんまり勉強にならんのかな。
まぁとりあえずもう少し続けて見ることにします…
特に中身が正体不明なものリスト
・getCategory
・rev_category_entry_items
- Category(s)
-
Zope
-
ReadingCOREBlog
-
COREBlog1
- The URL to Trackback this entry is:
- http://nagosui.org/Nagosui/COREBlog2/29/tbping
Re: COREBlogを読む(categorylist_html)
このシリーズ,専用のカテゴリに独立してわけていただくと
リンクしやすくてよいと思いました
Re: COREBlogを読む(categorylist_html)
Posted by
nyusuke
at
2004-07-14 12:55
ご意見どうもです(・´∀`・)
カテゴリ再編してみることにします。
Re: COREBlogを読む(categorylist_html)
>nyusukeさん
カテゴリ再編ありがとうございました
新カテゴリをリンク集に加えさせていただきました;-)
Re: COREBlogを読む(categorylist_html)
Posted by
nyusuke
at
2004-07-16 23:58
わざわざご連絡ありがとうございます。
精進します(´ω`)…
2004/07/25
COREBlogを読む(comment_body前半)
by
nyusuke
—
posted at
2004-07-25 22:59
last modified
2006-08-06 17:37
comment_bodyをざっと見渡してみたけれど、いったいどこで使われてるのか正確にはわからなかった。そこでテスト用ブログのエントリにコメントを入れ、htmlのソースを眺めて探してみた。
該当部分はここのようだ。

(正確には「Re: ほげ」という部分から時刻表示まで)
全体的な構成としては、div="comments_body"によって、div="comments_title"とコメント本体、そしてdiv="comments_post"が囲まれているようだ。
<div="comments_body">
|
| <div="comments_title">
| |
| | (上記の例では「Re: ほげ」)
| |
| </div>
|
| コメント本体(上記の例では「やっぱほげだね!」)
|
| <div="comments_post">
| |
| | (上記の例では「Posted by: nyusuke at July 10,2004 04:24」)
| |
| </div>
|
</div>
該当部分はここのようだ。
(正確には「Re: ほげ」という部分から時刻表示まで)
全体的な構成としては、div="comments_body"によって、div="comments_title"とコメント本体、そしてdiv="comments_post"が囲まれているようだ。
<div="comments_body">
|
| <div="comments_title">
| |
| | (上記の例では「Re: ほげ」)
| |
| </div>
|
| コメント本体(上記の例では「やっぱほげだね!」)
|
| <div="comments_post">
| |
| | (上記の例では「Posted by: nyusuke at July 10,2004 04:24」)
| |
| </div>
|
</div>
まずはタイトルの部分を見てみることにする。div="comments_title"で囲まれた中身は以下の通り。
"REQUEST.form.has_key('title')"というふうにダブルクォーテーションで囲まれているということは、評価式ですな。この評価の結果の真偽による条件分岐をすると。
真ならば"removeHTML(REQUEST.form['title'])"という評価式の結果を挿入。
偽ならばtitleを挿入(titleが無ければ空白)。
しかしまいった…。REQUEST.form.has_keyとかremoveHTMLとか意味不明な評価式がある。
本を調べてみるとREQUEST.formというのは、フォームによって辞書形式で設定される値らしい。COREBlogのコメントフォームではタイトルとか投稿者とか入力するわけだから、それらがまとめて入っているのだろう。
またhas_key(hoge)は、REQUESTに指定した変数(hoge)が含まれる場合に1、含まれない場合は0が返されるもののようだ。
つまりこの条件文「REQUEST.form.has_key('title')」はREQUEST.formとREQUEST.has_keyが組み合わされたものであるようなので、よくわからないけど、'title'という変数がREQUESTのフォームに含まれていたら1を、そうでなかったら0を返す、ということだろう。
ここで1が返されれば「removeHTML(REQUEST.form['title'])」が評価されるわけだけど、removeHTMLはおそらくタグを除去するものだろう。
ためしにタグ付きのタイトル(<h1>コメントタイトル</h1>など)でコメントをいくつかPOSTしてみたが、いずれもタグによるレンダリングは行われなかった。
すなわちdiv="comments_title"で囲まれた部分では、REQUESTにtitle変数が含まれていればそれを(タグを除去した上で)挿入し、そうでなければtitleを挿入するということをしているようだ。
しかし、REQUEST.form.has_key('title')とtitleの違いは何であろうか。
前者はクライアントからのweb要求内にフォームがあり、その中にtitleが含まれるとき、つまり、実際にコメントをPOSTするときに実行される評価だ。
それに対して後者はdtml-varによって変数titleの内容が挿入されるわけだから、GETによるレンダリングの際に名前空間からtitleという名前を得ようとするときに使われるものだろう。
すなわち基本的には、REQUESTメソッドがGETかPOSTかによって変わるような気がする(ホントか…???)。
<本当かどうか微妙な推測>
コメントを投稿する際にはデフォルトでタイトルが入るが、入力必須事項は名前とコメントそのものであるため、これを消してタイトルが空欄のままでも投稿は可能。その場合にはREQUEST.form.has_key('title')は0を返すのでdtml-var titleが実行される。しかしtitleは空欄であるためmissing=""が適用され、タイトルは表示されない(以下の画像参照)。

</本当かどうか微妙な推測>
今日はここまでにしとこーっと。
<dtml-if "REQUEST.form.has_key('title')">
<dtml-var "removeHTML(REQUEST.form['title'])">
<dtml-else>
<dtml-var title missing="">
</dtml-if>
"REQUEST.form.has_key('title')"というふうにダブルクォーテーションで囲まれているということは、評価式ですな。この評価の結果の真偽による条件分岐をすると。
真ならば"removeHTML(REQUEST.form['title'])"という評価式の結果を挿入。
偽ならばtitleを挿入(titleが無ければ空白)。
しかしまいった…。REQUEST.form.has_keyとかremoveHTMLとか意味不明な評価式がある。
本を調べてみるとREQUEST.formというのは、フォームによって辞書形式で設定される値らしい。COREBlogのコメントフォームではタイトルとか投稿者とか入力するわけだから、それらがまとめて入っているのだろう。
またhas_key(hoge)は、REQUESTに指定した変数(hoge)が含まれる場合に1、含まれない場合は0が返されるもののようだ。
つまりこの条件文「REQUEST.form.has_key('title')」はREQUEST.formとREQUEST.has_keyが組み合わされたものであるようなので、よくわからないけど、'title'という変数がREQUESTのフォームに含まれていたら1を、そうでなかったら0を返す、ということだろう。
ここで1が返されれば「removeHTML(REQUEST.form['title'])」が評価されるわけだけど、removeHTMLはおそらくタグを除去するものだろう。
ためしにタグ付きのタイトル(<h1>コメントタイトル</h1>など)でコメントをいくつかPOSTしてみたが、いずれもタグによるレンダリングは行われなかった。
すなわちdiv="comments_title"で囲まれた部分では、REQUESTにtitle変数が含まれていればそれを(タグを除去した上で)挿入し、そうでなければtitleを挿入するということをしているようだ。
しかし、REQUEST.form.has_key('title')とtitleの違いは何であろうか。
前者はクライアントからのweb要求内にフォームがあり、その中にtitleが含まれるとき、つまり、実際にコメントをPOSTするときに実行される評価だ。
それに対して後者はdtml-varによって変数titleの内容が挿入されるわけだから、GETによるレンダリングの際に名前空間からtitleという名前を得ようとするときに使われるものだろう。
すなわち基本的には、REQUESTメソッドがGETかPOSTかによって変わるような気がする(ホントか…???)。
<本当かどうか微妙な推測>
コメントを投稿する際にはデフォルトでタイトルが入るが、入力必須事項は名前とコメントそのものであるため、これを消してタイトルが空欄のままでも投稿は可能。その場合にはREQUEST.form.has_key('title')は0を返すのでdtml-var titleが実行される。しかしtitleは空欄であるためmissing=""が適用され、タイトルは表示されない(以下の画像参照)。
</本当かどうか微妙な推測>
今日はここまでにしとこーっと。
- Category(s)
-
Zope
-
ReadingCOREBlog
-
COREBlog1
- The URL to Trackback this entry is:
- http://nagosui.org/Nagosui/COREBlog2/31/tbping