nucleusの構造
2009.03.15 Sunday 11:27
ブログ/CMSソフト nucleus にvicunaスキンとNP_MultipleCategoriesプラグインを入れて使おうとしたがカテゴリーが表示されなかったのが先週.
自宅にUbuntuのVMWareがあったので,そこでプラグインの構造を確認しながら設定したら何故か動いた.
nucleusを使うにはテンプレートとプラグインの意味を理解していないとトラブルの解決は難しいなとつくづく感じた.もうちょっといろいろ基本パッケージに入れておいてくれても良いんじゃないかと思う.
自宅にUbuntuのVMWareがあったので,そこでプラグインの構造を確認しながら設定したら何故か動いた.
nucleusを使うにはテンプレートとプラグインの意味を理解していないとトラブルの解決は難しいなとつくづく感じた.もうちょっといろいろ基本パッケージに入れておいてくれても良いんじゃないかと思う.
[参考]
Nucleus変数
プラグイン API
最初は当然ながら理解しないままマニュアル通り設定した(つもり)なのだが期待通りの表示にならない.問題は,そこで何が起こっているのかが出力結果を見ても分からないのでデバッグが難しいこと.
[解決策]
テスト用のnucleusが使用可能であれば,nucleus/lib/PARSER.php を以下のように修正する.
doAction()にある
call_user_func_array(array(&$this->handler,'parse_' . $actionlc), $params);という部分の前後にechoでactionlcとparamsの中身を出力するコードを加える.
echo "[@$actionlc:",implode(":",$params),"]";
call_user_func_array(array(&$this->handler,'parse_' . $actionlc), $params);
echo "[@/$actionlc]";
この状態でblogを表示させてHTMLソースを見ると,使われたスキン変数が見えるようになるので内部の流れがかなり分かるようになる.
Nucleusの動き
公式マニュアルの『スキン&テンプレート』に「テンプレート」と「スキン」の関係は書かれている.簡単に書くと8種のスキンタイプがあって,その中からテンプレートセットを参照する形でHTMLを構築する構造になっている.
テンプレート『セット』と書いたのは,テンプレートの中には「アイテム」「コメント」「日付と時刻」など複数のパーツの出力方法を記述するようになっているため.
動作としては,ページを開こうとすると最初に適切なスキン(ブログに対応づけられているスキン)のうちURLで指定された種類のものが選択されて,上から解釈される.スキンの中には様々なnucleus変数が埋め込まれていて,解釈の途中で適切な文字列に展開される.一部の変数(item, categorylist archivelist等)は書式をパラメータで指定する代わりに,テンプレート名称を指定する.指定されると対応するテンプレートのうち,変数に対応する部分を読み出して解釈し,そこに埋め込まれる.
つまり,テンプレート変数とは
- <%item()%> が指定されたときに埋め込むもの
- <%comments()%> が指定されたときに埋め込むもの
- <%categorylist()%> が指定されたときに埋め込むもの
- <%archivelist()%> が指定されたときに埋め込むもの
等の寄せ集めを1セットにしたものである.
(アイテム・リストの埋め込み数はシステムが適切に判断するので,テンプレートには1つ分のみ記述する.)
NP_MultipleCategories
NP_MultipleCategoriesの設定方法には以下のように書かれている.
<%blog(mytemplate,10)%>を<%MultipleCategories(mytemplate,10)%>に置き換えれば
カテゴリーリストにマルチカテゴリー・サブカテゴリー設定を反映させたもの
<%MultipleCategories(1,categorylist)%>
Nucleus標準の<%archivelink%>に変わるものです
<%MultipleCategories(1,archivelink)%>>
これらはテンプレートを参照する変数のいくつかをMultipleCategoriesプラグイン変数で置き換える指示である.にも関わらずカテゴリリスト,アーカイブリストにはテンプレート名を設定するところがない.ではどこが参照されるかというと,MultipleCategoriesのオプションの中にあるカテゴリーリスト,アーカイブリストの設定が参照される.つまりこの部分はテンプレートでスキン毎に切り替えることはできない.(CSSの適用はスキン毎に可能なので見栄えは変えられる)
既存のテンプレートを利用しないのは上の説明と整合性がとれていないので分かりづらいと思ったのだが,テンプレートにはサブカテゴリの表示方法を設定できないのでやむを得ないのだろう.
Pluginの解釈
プラグインによる変数はスキン用とテンプレート用に分かれている.これだけでもわかりにくいのだけど,実はスキンタイプによっても挙動が異なっている.
プラグインAPIによれば,プラグインが呼び出されるときの引数としてスキンタイプ(8種類用意されているタイプのどれか)が渡されるようになっており,ここを参照することで異なる挙動をするように設定できる.
つまり,作りによっては全く同じ変数を記述させながらもスキンタイプによって異なる文字列への展開が可能である.
MultipleCategoriesの場合は,doSKinVar(Kが大文字になっていて検索で見つからない)を見ると
if ($params[0] == 'item' && $params[1] != "1") {という部分があり,itemの場合だけ特別な処理が行われていると分かる.
Comments