パーソナルツール
現在の場所: ホーム なごぶろ Categories ReadingCOREBlog
このBlogについて
なごすいぶろぐ。「すべてはなごすいのために」。
カテゴリ
Plone (90)
Plone Products (22)
COREBlog2 (31)
COREBlog1 (29)
ReadingCOREBlog (7)
Zope (63)
Turbogears (18)
Django (12)
Python (23)
Linux (30)
Nagosui (11)
Design (30)
Misc (48)
moblog (5)
最近のエントリ
fastcgiでmercurial on nginx nyusuke 2008年10月08日
Kupuにスタイルを追加する nyusuke 2008年10月06日
Plone Help Centerを導入してみた nyusuke 2008年10月03日
ぽっどきゃすてぃんぐ落語が隔週から毎週に戻る nyusuke 2008年10月02日
最近のコメント
Re:WebデザイナーのためのDjangoはじめの一歩 nyusuke 2007年06月01日
Re:WebデザイナーのためのDjangoはじめの一歩 pateo 2007年05月31日
Re:東海Python Workshop 01終了 nyusuke 2007年05月31日
Re:東海Python Workshop 01終了 kfuruhata 2007年05月30日
 

ReadingCOREBlog

一つ上に移動 ReadingCOREBlog
dtmlやpythonについて何にも知識のない人がお勉強のためにCOREBlogのcontentsをのぞいてしまおうという企画です。

COREBlogを読む(index_html前半)

読むひと(わたし)の知識
・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-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が表示される。

とまあ、そんな感じのハズ。

もう寝る!
トラックバック用URL:
http://nagosui.org:8080/Nagosui/COREBlog2/26/tbping

COREBlogを読む(index_html後半)

さてさて今日はindex_htmlの残りの部分、サイドメニューを読んで見る。前回の(中略その2)にあたる部分だ。

さっそくソースをば拝見。

<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 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-が出てきたので頭の中がまだ完全には整理できてないし、わかってないこともたくさん出てきました。
少しずつ読みながら、少しずつ身についていけばと思います。
トラックバック用URL:
http://nagosui.org:8080/Nagosui/COREBlog2/27/tbping

COREBlogを読む(blog_banner)

index_htmlの次は何を読もうかなと考えて、まぁ上に並んでいるものから見て行こうかということで、次はblog_bannerです。

コメントと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の内容は以下のようになっています。

<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&gt<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内に存在しない画像があるんですなぁ。こういうのを知ってると楽しいバナーになるかもしれませんね。
トラックバック用URL:
http://nagosui.org:8080/Nagosui/COREBlog2/28/tbping

COREBlogを読む(categorylist_html)

contentsの中身を上から読んでいくとなると次はblog_footerとblog_headerなんですが、ほとんどhtmlなのでパスして、categorylist_htmlを見てみることにしました。

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」と表示されました。

それじゃあ(中略)部分を少しずつ見てみたいと思います。

<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
トラックバック用URL:
http://nagosui.org:8080/Nagosui/COREBlog2/29/tbping

Re: COREBlogを読む(categorylist_html)

投稿者 ats 投稿日時: 2004年07月14日 00時16分

このシリーズ,専用のカテゴリに独立してわけていただくと
リンクしやすくてよいと思いました

Re: COREBlogを読む(categorylist_html)

投稿者 nyusuke 投稿日時: 2004年07月14日 12時55分

ご意見どうもです(・´∀`・)
カテゴリ再編してみることにします。

Re: COREBlogを読む(categorylist_html)

投稿者 ats 投稿日時: 2004年07月16日 08時22分

>nyusukeさん

カテゴリ再編ありがとうございました
新カテゴリをリンク集に加えさせていただきました;-)

Re: COREBlogを読む(categorylist_html)

投稿者 nyusuke 投稿日時: 2004年07月16日 23時58分

わざわざご連絡ありがとうございます。
精進します(´ω`)…