2012-11-22 Thu

NP_znItemFieldEXを<%if%>に対応させる

もはやNucleus標準機能として欲しいぐらい重宝するプラグイン「NP_znItemFieldEX」。
…なんと作者さんのサイトが403ですね。Nucleusの開発者界隈もかなり寂しい状況ですので致し方ないですが…

と悲しんでいてもしょうがないので、既に入手済みの方のお役に立てれば。

いつからかテンプレートでもifが使えるようになったNucleus。その副作用でプラグイン「NP_if」が使えなくなり困っていましたが、NP_znItemFieldEXをif対応にする事でなんとか凌ぐ事ができました。

自分で言うのもなんですが、今回の改造は急場しのぎで全然全くスマートではありません。底の浅さが露呈してしまって哀しいですが、とりあえず未来の自分へのメモとして、恥を忍んで公開しておきます。

ifに対応させる為に「doif関数を追加すればいいんでしょ」と軽く考えたのですが、なぜかznItemFieldEXでアイテムの情報を取得できないので、超強引に別プラグインからの情報を拝借しました。その為に必要なのが、これまたNucleusに必須と思われる、アイテムを正しくマークアップしてくれるプラグインNP_SimpleParagraphs

これを利用して、まずは下記のコードをznItemFieldEXに追加。

function doif($key = '', $value = '') {
    global $manager;
    $iid = $manager->plugins["NP_SimpleParagraphs"]->currentItem->itemid;
}

これで開いている表示アイテムの色んな情報を取得できました。
で、if判定の関数_jadgeを作成し、そっちで値の判定を行う事にしました。それを追記したのがこちら。

function doif($key = '', $value = '') {
    global $manager;
    $iid = $manager->plugins["NP_SimpleParagraphs"]->currentItem->itemid;
    $ititle = $manager->plugins["NP_SimpleParagraphs"]->currentItem->title;
    $ibody = $manager->plugins["NP_SimpleParagraphs"]->currentItem->body;
    $imore = $manager->plugins["NP_SimpleParagraphs"]->currentItem->more;
    return $this->_jadge($iid, $key, $value, $ititle, $ibody, $imore);
}

function _jadge($iid='', $key='', $value='', $ititle='', $ibody='', $imore='') {
    if ($key == "ititle") {
        $itemvalue = $ititle;
    } elseif ($key == "ibody") {
        $itemvalue = $ibody;
    } elseif ($key == "imore") {
        $itemvalue = $imore;
    } else {
        $itemvalue = $this->getItemFieldEX(intval($iid), $key, '', '', '');
    }
    $datatype = strpos($itemvalue, "<li>");
    if($datatype === false) {
        if ($itemvalue == $value) {
            return true;
        } else {
            return false;
        }
    } else {
        $itemvalue = str_replace("</li>", "", $itemvalue);
        $itemvalues = explode("<li>", $itemvalue);
        unset($itemvalues[0]);
        $jadge = 0;
        foreach ($itemvalues as $itemvaluetype) {
            if ($itemvaluetype == $value) {
                $jadge++;
            }
        }
        if ($jadge != 0) {
            return true;
        } else {
            return false;
        }
    }
}

せっかくなんで、記事のタイトル、本文、続きといった、Nucleus標準の値も判定できるようにしました。

後はifモードを判定する為にいろいろ追加する必要があります。
僕はznItemFieldEXに手を入れまくっているので行数が定かではないのですが、まずはgetTemplateData関数内の

$this->skinIndexMode('blog', $sortkey, $sort, $proviso, $template, $amount, $otherblogid, $allCatFlag);

を下記に置き換えます。

/* <custom dode> */
// original $this->skinIndexMode('blog', $sortkey, $sort, $proviso, $template, $amount, $otherblogid, $allCatFlag);
$this->skinIndexMode('blog', $sortkey, $sort, $proviso, $template, $amount, $otherblogid, $allCatFlag, $mode);
/* </custom dode> */

skinIndexMode関数に渡す値の最後に「$mode」変数を追記しています。
そしてそれを受け取れるようにskinIndexMode関数を以下のように修正。

function skinIndexMode(
    $type    ,   //_preBlogContent, _postBlogContent に渡すタイプ
    $sortkey ,   //sort key
    $sort    ,   //ASC or DESC
    $proviso ,   //WHERE (i.field|=|value)
    $template,   //Template
    $amount  ,   //amount
    $otherbid,   //otherblogid
    $allCatFlag, //カレントカテゴリの絞込み解除
    $mode        //表示モード custom code
)

コードを書き換える時は、とにかく注釈を付けてオリジナルを残しておきましょう。でないと後で泣いてしまう確率が飛躍的に上がります…。今回は「<custom code>………</custom code>」と目印をつけています。

_jadge関数内で「<li>」の有無を判断したり色々やってますが、その理由は「続・NP_znItemFieldEXとNP_ifの連携」をご覧ください。とにかくややこしいんです…スマートではないですが、とにかくまずは意図した通り動く事が重要でかと…(笑)。

さて、使い方はテンプレートに以下のように記述するだけです。

<%if(znItemFieldEX,拡張項目名,拡張項目の値)%>
値が正しいときの処理
<%else%>
値が正しくないときの処理
<%endif%>

せっかくなんで、本文、例えば拡張項目「gakki」の値が「ウクレレ」の時にはウクレレの画像、「マンドリン」の時はマンドリンの画像、それ以外には音符の画像を表示させたい場合はこんな感じです。

<%if(znItemFieldEX,gakki,ウクレレ)%>
ukulele.jpg
<%elseif(znItemFieldEX,gakki,マンドリン)%>
mandolin.jpg
<%else%>
onpu.jpg
<%endif%>

さらにそれがチェックボックスやラジオボタンの時は、<%elseif%>ではなく、毎回複数の値をチェックできる様に項目の数だけ「<%if%>」を使う必要があります。

<%if(znItemFieldEX,gakki,ウクレレ)%>ukulele.jpg<%endif%>
<%if(znItemFieldEX,gakki,マンドリン)%>mandolin.jpg<%endif%>
<%if(znItemFieldEX,gakki,音符)%>onpu.jpg<%endif%>

まあまあ不細工ですが、とにかく意図したとおりに動く事が重要です(笑)。
とはいえ不細工な事はあまり好きではないので、もうちょっと落ち着いたら美しいコードに書き直したいと思います。

2012-11-22 Thu / Category - Nucleus

このページの先頭に戻る

Copyright 2012 - Heartfield