ラベル Archives の投稿を表示しています。 すべての投稿を表示
ラベル Archives の投稿を表示しています。 すべての投稿を表示

2008年3月1日土曜日

Nucleus スキンとテンプレート

Nucleusの秘密を暴きたいんだけど.....

スキン & テンプレートの「テンプレートとスキンの相互関係」 に、

スキン とは出力する内容(タグを含むソース)を定義するものです。1つのスキンでもいくつかの種別ごとに定義が必要で、メインページや個別アイテムページ、アーカイブページなど(標準で8タイプ)があります。 スキン内の定義内容は、どの部分にblogデータを展開するのか、どのテンプレートを使用して展開するのかなどの指定を含みます。

とある。
「8種類」というは、[レイアウト設定]の[スキン編集]に出てくる、「定義済みパーツ:」の
  1. メインの目次ページ
  2. 個別アイテムページ
  3. 月別アーカイブ一覧ページ
  4. 月別アーカイブページ
  5. 検索ページ
  6. エラーページ
  7. メンバー詳細ページ
  8. 画像ポップアップウィンドウ

のようだ。

スキン=ブログの各ページの構造(レイアウト)を表すもので、標準で8種類のページパターンがある。blogger.comでいうテンプレート。

テンプレート=MySqlにしまわれているデータを流し込んで表示するブロック部分みたいなもの。blogger.comでいうページ要素。
...ということでよいのだろうか。

Nucleusの動く仕組みが分かってくれば理解できるのかも知れない。
  • 最初に読まれるのは、「index.php」
    index.phpは ..... config.phpを読む。

  • config.phpは ..... globalfunctions.phpを読む。

  • globalfunctions.phpは、以下を読む
    include($DIR_LIBS . 'mysql.php');
    include($DIR_LIBS . 'MEMBER.php');
    include($DIR_LIBS . 'ACTIONLOG.php');
    include($DIR_LIBS . 'MANAGER.php');
    include($DIR_LIBS . 'PLUGIN.php');

    include($DIR_LIBS . 'xmlrpc.inc.php'); // XML-RPC client classes
    include_once($DIR_LIBS . 'ADMIN.php');

    include($DIR_LIBS . 'PARSER.php');
     PARSER.phはrequire_once dirname(__FILE__) . '/BaseActions.php';

    include($DIR_LIBS . 'SKIN.php');
     SKIN.phpはrequire_once dirname(__FILE__) . '/ACTIONS.php';

    include($DIR_LIBS . 'TEMPLATE.php');
    include($DIR_LIBS . 'BLOG.php');
    include($DIR_LIBS . 'BODYACTIONS.php');
    include($DIR_LIBS . 'COMMENTS.php');
    include($DIR_LIBS . 'COMMENT.php');
    //include($DIR_LIBS . 'ITEM.php');
    include($DIR_LIBS . 'NOTIFICATION.php');
    include($DIR_LIBS . 'BAN.php');
    include($DIR_LIBS . 'PAGEFACTORY.php');
    include($DIR_LIBS . 'SEARCH.php');
    include($DIR_LIBS . 'entity.php');

    include_once($DIR_LIBS . 'ACTION.php');

    include($filename); //apacheとphpのトークンみたい

    include($DIR_LANG . ereg_replace( '[\\|/]', '', $language) . '.php');
    include($DIR_LIBS . 'PLUGINADMIN.php');

    include_once($DIR_LIBS.'mb_emulator/mb-emulator.php');
    ..............
    いろいろ進んで...
    ..............
  • globalfunctions.phpの中のselector()が呼び出される。
    ..............

    $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';
    $xml_file = $dir . $filename . '/skinbackup.xml';

  • ともあれ skinbackup.xml、skindata.xmlにたどり着く。
    nucleus/libs/ADMIN.phpや、nucleus/libs/skinie.phpが、skinbackup.xml、skindata.xmlを読み込む。
  • スキン & テンプレートにあるように、skinbackup.xmlがスキンのかなめになる。(らしい)

nucleus/libs/TEMPLATE.phpに

function fill($template, $values) {

if (sizeof($values) != 0) {
// go through all the values
for(reset($values); $key = key($values); next($values)) {
$template = str_replace("<%$key%>",$values[$key],$template);
}
}

// remove non matched template-tags
return preg_replace('/<%[a-zA-Z]+%>/','',$template);
}

があった。ここが Nucleus変数/テンプレート変数が、解釈される第一歩か。
ACTION.php、ADMIN.php、BLOG.php、MEMBER.php、BODYACTIONS.phpでfill()を呼んでいる。
細かいことまで理解する必要はないけど、動作概念くらいは知っておきたいもんだ。
.

2008年2月29日金曜日

Nucleus アーカイブをリスト表示 + NP_ListArticlesByNameプリフィックス対応

Nucleusでもアーカイブのリスト表示

wordPressでできたんだから、Nucleusでもアーカイブをリストで表示したい。

プラグインを探しにいこう。
プラグイン一覧(機能カテゴリー別)iには無いらしい。本家にいってみる。
「プラグイン・カテゴリ別」の中にanandさんが作った
NP_ListArticlesByName.php
   A plugin which will allow you to list recent articles by name.
があった。フォーラムに置いてあると書いてある。
フォーラムにはphpのコードと説明が載っている。「(コード)をコピーして、『NP_ListArticlesByName.php』という名前でセーブしろ」と書いてあった。
早速その通りにしてファイル「NP_ListArticlesByName.php」を作る。

ftpで nucleus/plaginにNP_ListArticlesByName.phpアップロードして、[サイト管理][プラグイン管理]で「プラグインのインストール」をすると、エラーがでた。
Parse error: syntax error, unexpected '"', expecting ',' or ';' in /home/nucleususer/www/nucleus/plugins/NP_ListArticlesByName.php on line 40

40: echo "<a href=¥"".$itemlink."¥">".$row['title']."</a>";
UTFで保存したので、¥がだめそう。
40: echo '<a href="'.$itemlink.'">'.$row['title'].'</a>';
に変更し、他の場所も同じように直す。
「プラグインの管理」ページを再読み込みすると、「List articles by name」のプラグインが増えた。

スキンの書き換え

サイドバーにArchiveのタイトルを表示したい。
「NP_ListArticlesByName」はスキン変数だから、スキンにいれるんだろう。
[プラグイン]の[スキンファイル]で、今使っているスキン grey_gradient の sidebar.incにコードを挿入してみる。

作者のanandは挿入するコードを、
  <%plugin(ListArticlesByName(50))%>...(50アイテム表示なら)
と書いていたが、あとで Trentが
  <%ListArticlesByName(50)%>
がいいと書いていた。Trentのコードを使うことにする。

「ファイルの編集 sidebar.inc」でコードを見るけど、Navigationという場所が沢山あってどこにいれたらいいか迷ってしまう。
<!-- search: navigation -->
<%if(skintype,search)%>
<dd><a href="<%todaylink%>" title="Today's entry">Today</a></dd>
<dd><a href="<%archivelink%>" title="Archives">Archives</a></dd>
<%endif%>

<dd><%ListArticlesByName(50)%></dd>//ここに入れてみる。

<!-- admin link, only visible if logged in -->
<%if(loggedin)%>
<dd><a href="<%adminurl%>" title="Admin Area">Admin</a></dd>
<%endif%>
</dl>
</div>

「保存」を押す。
....「メッセージ: ファイル sidebar.inc を保存しました。」と表示された。

最初はこんな。


さて、ページを再読み込みすると、
おーっ! リストだぁ。やったね。

まだローカルのテストマシンで動かしているので、実際に見てもらえなくてごめんなさい。

「NP_ListArticlesByName」は55行のプラグインなのでコードが一目瞭然だから、Nucleusの動きが少しわかったような...。
「プラグインのインストール」を押すと、プラグインを追加するプログラムがコードを確かめて、NP_を外した「ListArticlesByName」をどっかの定義場所に追加しているみたいだ。プラグインは、MySqlのnucleusのデータベースのテーブルnucleus_pluginに登録されてるらしい。Nucleusのタグを解釈しながらページを組み立ててるんだ。きっと。
ページを表示するとき、<%ListArticlesByName(50)%> があったら、NP_ListArticlesByName.phpをIncludeするとかそういうことかな。
登録してあるNP_ListArticlesByName.phpを無理矢理削除すると、アーカイブリストが表示されなくなるから、nucleus/plagin/NP_ListArticlesByName.phpを、表示のたびに読んでいるらしい。

今後の課題:
wordPressでやったように、NP_ListArticlesByName.phpに <select>要素を書けば、ドロップダウンで表示できるかも。

不具合発見:
「grey_gradient」の「Navigation」の「Previous Item」と「Next Item」は表示が逆みたいだ。
「Previous Item」をクリックすると、次のアイテムが表示されちゃう。
後で直さなきゃ。

あれ?:
www2.blogger.comは昨日の11:40ごろ(日本時間2008.02.28 11:40)サーバーが反応なかったけど何かあったのかな。気のせいかその後動きが少し悪いような気がして。


追加:プリフィックスをつけたテーブルがあると不具合
別のマシンでNP_ListArticlesByName.phpをテストをしたら、
Error!

プラグインが読み込めませんでした。もくは、使用中の Nucleus 上で動作させるために必要な機能が、プラグインでサポートされていません。(管理操作履歴に詳細があります。)
というエラーが出てプラグインとして組込めない。

管理操作履歴には
2008-03-01 20:14:43 [sample1] Plugin NP_ListArticlesByName was not loaded (does not support SqlTablePrefix)
と書かれていた。
NP_ListArticlesByName.phpは プリフィックスに対応していないらしく、プリフィックスチェックが行われていないようだ。

NP_ListArticlesByName.phpに
function supportsFeature($feature) {
switch($feature) {
case 'SqlTablePrefix':
return 1;
default:
return 0;
}
}
を挿入する。
これでエラーが消え、NP_ListArticlesByName.phpがインストールされた。

実行時(表示時かな)すると、プリフィックスをつけたテーブルにより不具合がでる。
mySQL error with query SELECT i.inumber as itemid, i.ititle as title FROM nucleus_item as i WHERE i.iblog=1 and i.idraft=0 and i.itime<="2008-03-01 21:31:07" ORDER by itime DESC LIMIT 0,50: Table 'nucleus.nucleus_item' doesn't exist <- ホントは'nucleus.nc1_nucleus_item'

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/sample1/web/nucleus/nucleus/plugins/NP_ListArticlesByName.php on line 45
 35: . ' FROM nucleus_item as i'

 35: . ' FROM '.$MYSQL_PREFIX . 'nucleus_item as i'
に変更し、

 global $MYSQL_PREFIX;

を追加してupload。「登録リストのアップデート」をクリックして、登録し直す。



追加:プリフィックスをつけたテーブルがあると不具合を増やしたので、
以前このページに置いていた調べたついでは、いずれ別ページに掲載の予定。