Nucleus

Nucleus のスキン変数<%if%>の新しい機能

2007年2月26日

 しづきさんも書いていたけれど、Nucleus バージョン 3.3 では、スキンの<%if%>がいくらか拡張される。

 気がついたのは、まず、プラグインで条件判定ができるdoIf()関数。これは、とっても便利。開発中のキャッシングプラグイン(半年も開発がストップしていて、開発中というのか?)で使用できる。また、NP_ExtendedIf は引退させるか、大幅に変更するかのどちらか。現在Nucleusでフォーラムを構築するためのスキンとプラグインを開発中だけれど、そのプラグインにも導入予定。

 他に気がついたのは<%elseif%>が使えるようになったこと。これの導入は3.24かなと思って、3.24がリリースされたときに試してみたけれど、まだだった。

 <%if%>文の第一パラメータに何が使えるかは、ACTIONS.php の125行目あたりのcheckCondition::checkCondition()関数に記述されている。
$condition = 0;
switch($field) {
    case 'category':
        $condition = ($blog && $this->_ifCategory($name,$value));
        break;
    case 'blogsetting':
        $condition = ($blog && ($blog->getSetting($name) == $value));
        break;
    case 'loggedin':
        $condition = $member->isLoggedIn();
        break;
    case 'onteam':
        $condition = $member->isLoggedIn() && $this->_ifOnTeam($name);
        break;
    case 'admin':
        $condition = $member->isLoggedIn() && $this->_ifAdmin($name);
        break;
    case 'nextitem':
        $condition = ($itemidnext != '');
        break;
    case 'previtem':
        $condition = ($itemidprev != '');
        break;
    case 'skintype':
        $condition = ($name == $this->skintype);
        break;
    case 'hasplugin':
        $condition = $this->_ifHasPlugin($name, $value);
        break;
    default:
        $condition = $manager->pluginInstalled('NP_' . $field) && $this->_ifPlugin($field, $name, $value);
        break;
}
return $condition;

 これを見ると、今まであった『category』『blogsetting』『loggedin』『onteam』『admin』『nextitem』『previtem』『skintype』『hasplugin』に加えて、プラグイン名(『NP_』を除いたもの)が指定されていれば条件判定するようになっている。
 プラグイン名には、『category』『blogsetting』などは使えない。これらのプラグイン名を使用したオーバライド(例えば、NP_categoryとか)はできない仕様になっている。
 プラグイン名判定には、$manager->pluginInstalled()を用いていて、ここでは、nucleus_plugin テーブルの pfile カラムのデータを用いているので、大文字小文字を区別して、『NP_』を取り除いたプラグイン名を指定することになる。

 elseif に関しては、こちらを参照。Andyさんに、感謝。サイドバーでの表示変更などに使うと、スキンがかなりすっきりすることが予想される。

 スキン変数として何が使えるかは、SKIN.php の270行目あたりに見える。

// some actions that can be performed at any time, from anywhere
$defaultActions = array('otherblog',
    'plugin',
    'version',
    'nucleusbutton',
    'include',
    'phpinclude',
    'parsedinclude',
    'loginform',
    'sitevar',
    'otherarchivelist',
    'otherarchivedaylist',
    'self',
    'adminurl',
    'todaylink',
    'archivelink',
    'member',
    'ifcat',    // deprecated (Nucleus v2.0)
    'category',
    'searchform',
    'referer',
    'skinname',
    'skinfile',
    'set',
    'if',
    'else',
    'endif',
    'elseif',
    'ifnot',
    'elseifnot',
    'charset'
);

ここで追加されているのが、『elseif』『ifnot』『elseifnot』の3つ。この機能の実行のためのコードは、BaseActions::parse_ifnot() など(BaseActions クラスは、ACTIONS, COMMENTACTIONS, ITEMACTIONS, PAGEFACTORY の継承元クラス)。

(追記)
 ITEMACTIONS では、'if', 'endif' などの記述が見えるものの、コメントアウトされている。従って、テンプレートでは(まだ)<%if%>は使えない。

コメント

佐藤(な) (2007年3月3日 13:53:46)

佐藤(な)です。
いつもお世話になりまくってます。

> テンプレートでは(まだ)<%if%>は使えない。

これ、何でなんでしょう?

ちゃんと、
テンプレートの同じ場所で、開始タグ<%if系%>と、閉じタグ<%endif%>の関係を完結させておけば、
スキン変数との階層構造でも問題ない気がするんですが。
無作法自作プラグインではテンプレートで使っちゃってます。
多分、何か理由があると思うんですよね。

Andyさんの拡張ifのコード、感動しました。

Katsumi (2007年3月4日 00:44:33)

 何でなんでしょう。使えるようにしようとした形跡はあるんですが、コメントアウトで使えなくしてあります。
 本家フォーラムに何か書かれてるかもしれませんが、ちゃんとフォローできてません。Andy さんなら何か知ってるかもしれませんね。

コメント送信