2010-08-07 Sat
先日「NP_znItemFieldEXとNP_ifの連携」に書いた通り、「NP_if」と「NP_znItemFieldEX」の連携に成功し、かなり柔軟なテンプレートを作成できたと喜んでいたのですが、NP_znItemFieldEXの拡張フィールドがチェックボックスの際に、条件判定ができなくなっていたので、四苦八苦して対応させる事に成功しました。
これ、むちゃくちゃハマってしまったのが、チェックボクスが持つ値と、拡張フィールドタイプの調べ方です。
NP_ifの「$name = $plugin->getItemFieldEX($itemid, $name);」で呼び出しているのは、拡張フィールドの値だけなのですが、タイプがチェックボックスの場合、値は選択されているものだけは無く、選択肢として登録されている全てのリストなのです。
具体的にいうと、チェックボックスに「Nucleus」「MovableType」「WordPress」という選択肢を設定し、ある記事で「MovableType」だけにチェックを入れても、呼び出される値「$name」は以下のようになります。
<li>Nucleus</li> <li>MovableType</li> <li>WordPress</li>
なのでテンプレートで
<%if(if,code,Nucleus)%>好きなCMS: Nucleus<%endif%>
と記述していると「$name==rawurldecode($value)」の結果は「false」となり思い通りの結果になりませんでした。なので、タイプがチェックボックスの場合、「その文字列が含まれるかどうか」を調べる方法で判定しないといけないのですが、値を引っ張ってきた時点ではタイプがテキストエリアなのか、チェックボックスなのかわからないのです。タイプは別のテーブルで管理されているので、さらに呼び出すのもなんか面倒なので、「チェックボックスタイプの値には行頭に<li>が存在する」という点に着目してできたのが、以下のコードです。
function doIf($name='',$value=''){
if (!$this->item) return false;
// Original if (!isset($this->item->$name)) return false;
// Original return $this->item->$name==rawurldecode($value);
/* <custom code> */
if (!isset($this->item->$name)) {
global $manager;
$itemid = $this->item->itemid;
if ($manager->pluginInstalled('NP_znItemFieldEX') and $plugin = &$manager->getPlugin('NP_znItemFieldEX')) {
$name = $plugin->getItemFieldEX($itemid, $name);
if ($value == '[date]') {
$today = date('Y-m-d');
if ($name < $today) {
return false;
} else {
return true;
}
}
if (strpos($value, "おそらくこれで、タイプがなんであれNP_ifで判定できると思います。
« Old 2010-07-16
NP_znItemFieldEXとNP_ifの連携
2010-08-09 New »
NP_ImageExtractor|指定の幅より小さい画像