要約 * [*introtext*] * [!EndIf &var=`introtext`!] * * 2) 長いタイトル(longtitle)が入力されていなければ、 * タイトル(pagetitle)を表示する。 * * [*longtitle*] * [!StartIf? ¬=`1` &var=`longtitle`!] * [*pagetitle*] * [!EndIf &var=`longtitle`!] * * Description: * デフォルトでは、変数等の値が空(未入力)の場合、表示OFFとし、 * StartIfが「」を、EndIfが「」を、 * それぞれ出力して、間のコンテンツを囲むことによって非表示にする。 * 変数等の値がある(入力済み)の場合、表示ONとし、 * StartIfもEndIfも何も出力せず、間のコンテンツはそのまま表示される。 * * Note: * ネストして(入れ子にして)使用することも可能。 * * 1ページに複数組入れる場合、同じタグを繰り返すとキャッシュされる?ので、 * 適当にオプションを指定して、別のタグと認識させる必要がある。 * 例)[!EndIf? &var=`longtitle`!] [!EndIf? &id=`1`!] [!EndIf? &id=`2`!] * ※変数名等わかりやすいものを使うと良い。(EndIfはパラメータを無視する) * * 特殊文字(記号)の一部は、MODx側で処理されて期待通りに動作しないため、 * 以下のように、urlencodeした値を指定する必要がある。 * (対応パラメータ:attr、on_st、on_ed、off_st、off_ed、value、regex) * = => %3D * ? => %3F * % => %25 * & => %26 * ` => %60 * [ => %5B * ] => %5D * * 例えば、~
の途中で、StartIfとEndIfを使う等、 * StartIfとEndIfの間で、一連のHTMLタグが完結されていないような場合は、 * デフォルトの動作では問題が起こる可能性がある。 * * Param: * ----判定する値の指定---- * * [string] var テンプレート変数名(省略時:content) * カンマ「,」で区切って複数(OR条件)指定も可能。 * (ひとつでも変数の値が条件を満たせば表示ON) * 例1)[!StartIf? &var=`introtext`!] * 例2)[!StartIf? &var=`block1,block2`!] * * [string] config 設定名(省略時はテンプレート変数) * カンマ「,」で区切って複数(OR条件)指定も可能。 * (ひとつでも設定値が条件を満たせば表示ON) * * ----値の修飾---- * * [flag: 1 | 0] trim 両端空白除外フラグ(省略時:1) * 1:両端の空白を除いた値で判定する。 * 0:値の両端に空白があっても含めたまま判定する。 * * ----論理演算---- * * [flag: 1 | 0] not 条件否定フラグ(省略時:0) * 1:条件を否定(表示のON/OFFを逆転)する。 * 0:条件そのまま。 * * ----タグの自動生成---- * * [flag: 1 | 0] either タグ無条件出力フラグ(省略時:0) * 1:表示ONでもOFFでもタグを生成して出力する。 * 0:表示OFFの場合のみタグを生成して出力する。 * * [string] tag 出力するタグ名を指定(省略時:span) * [string] attr 出力するタグの属性を指定(省略時:なし) * * (※)タグを自動生成する場合、上記の指定にかかわらず、 * 表示OFFの場合のみ「style="display:none;"」を開始タグに付加する。 * * ----出力内容の直接指定---- * * [string] on_st 表示ONの場合に、StartIfが出力する内容 * [string] on_ed 表示ONの場合に、EndIfが出力する内容 * [string] off_st 表示OFFの場合に、StartIfが出力する内容 * [string] off_ed 表示OFFの場合に、EndIfが出力する内容 * * (※)これら指定により、タグは自動生成せず、指定された内容を出力する。 * on_stとon_ed、off_stとoff_ed、それぞれ対で指定しなければ無効。 * * ----値の判定方法---- * * 指定無し 空(未入力)でなければ表示ON。 * [string] value 指定の値に一致すれば表示ON。 * var、もしくは、configを複数指定した場合、 * valueの指定は、単一でも複数でも指定可能。 * 例1)[!StartIf? &var=`flag1,flag2` &value=`1`!] * 例2)[!StartIf? &var=`mode1,mode2` &value=`1,2`!] * * [string] regex 指定の正規表現に一致すれば表示ON。 * var、もしくは、configを複数指定した場合、 * regexの指定は、単一でも複数でも指定可能。 * * Implementation: * グローバル変数「$_EndIfStack」を使用し、StartIfからEndIfに情報を渡す。 * * More example: * 1) 要約(introtext)が未入力なら、見出しとともにコメントアウトする。 * (途中にコメントタグが入っている場合は使えない) * * [!StartIf? &var=`introtext` &off_st=``!] *

要約

* [*introtext*] * [!EndIf &var=`introtext`!] * * 2) 変数「number」が数字だけの場合、見出しとともに表示する。 * * [!StartIf? &var=`number` ®ex=`/^\d+$/`!] *

番号

* [*number*] * [!EndIf &var=`number`!] * * 3) 変数「block1」「block2」のどちらかが入力されていたら見出しを表示する。 * * [!StartIf? &var=`block1,block2`!] *

見出し

* [!EndIf &var=`block1,block2`!] * [*block1*] * [*block2*] * * Date: * 2008-04-11 * * Created by: * Kazuyuki Ikeda (HIKIDAS Co.,Ltd) http://www.hikidas.com/ * * Changelog: * 2008-04-11 1.01 複数のテンプレート変数に対応、コメント改訂 * 2007-12-11 1.00 公開バージョン */ $dbg = ''; // デバッグ用 //---- 値の取得 $content = array(); if (isset($config)) { //---- 設定名の場合 $cn_array = explode(',', $config); foreach ($cn_array as $cn) { if (isset($modx->config[$cn])) { $content[] = $modx->config[$cn]; } } } else { //---- テンプレート変数名の場合 if (isset($var)) { $vn_array = explode(',', $var); } else { $vn_array = array('content'); // 省略時「content」 } foreach ($vn_array as $vn) { $content_array = $modx->getTemplateVar($vn); if ($content_array !== FALSE) { $content[] = $content_array['value']; } else { $content[] = ''; // 存在しないテンプレート変数 } } } //---- 値の修飾 $trim_flag = isset($trim) ? $trim : "1"; if ($trim_flag) { $content = array_map("trim", $content); } //---- 値の判定 $match = FALSE; $cnt = count($content); if (isset($value)) { //---- 指定の値 $val_array = explode(',', $value); $val_cnt = count($val_array); if ($val_cnt < $cnt) { //---- 値の数が不足している場合、最後の値で埋める $val_array = array_merge($val_array, array_fill(0, ($val_cnt - $cnt), $val_array[($val_cnt - 1)])); } //---- 一つでも一致すれば一致とみなす for ($i=0; $i<$cnt; $i++) { if ($content[$i] === rawurldecode($val_array[$i])) { $match = TRUE; break; } } } elseif (isset($regex)) { //---- 正規表現 $reg_array = explode(',', $regex); $reg_cnt = count($reg_array); if ($reg_cnt < $cnt) { //---- 正規表現の数が不足している場合、最後の正規表現で埋める $reg_array = array_merge($reg_array, array_fill(0, $reg_cnt - $cnt, $reg_array[$reg_cnt - 1])); } //---- 一つでも一致すれば一致とみなす for ($i=0; $i<$cnt; $i++) { if (preg_match(rawurldecode($reg_array[$i]), $content[$i])) { $match = TRUE; break; } } } else { //---- 空欄かどうか foreach ($content as $cv) { if ($cv !== '') { $match = TRUE; break; } } } //---- 表示条件の判定 $not_flag = isset($not) ? $not : "0"; $display = FALSE; if ($match xor $not_flag) { $display = TRUE; } //---- タグの自動生成 $tag_name = isset($tag) ? $tag : 'span'; $attributes = isset($attr) ? ' '.rawurldecode($attr) : ''; $start_tag = '<'.$tag_name.$attributes; // 閉じない $end_tag = ''; $either_flag = isset($either) ? $either : "0"; if ($display) { if ($either_flag) { $block_tag = $start_tag.'>'; $stack_tag = $end_tag; } else { $block_tag = ''; $stack_tag = ''; } } else { $block_tag = $start_tag.' style="display:none;">'; $stack_tag = $end_tag; } //---- 出力内容の直接指定 if ($display) { if (isset($on_st) && isset($on_ed)) { $block_tag = rawurldecode($on_st); $stack_tag = rawurldecode($on_ed); } } else { if (isset($off_st) && isset($off_ed)) { $block_tag = rawurldecode($off_st); $stack_tag = rawurldecode($off_ed); } } //---- グローバル変数に情報をセット $stack_var_name = "_EndIfStack"; if (! isset($GLOBALS[$stack_var_name])) { $GLOBALS[$stack_var_name] = array(); } array_push($GLOBALS[$stack_var_name], $stack_tag); if ($debug) { $block_tag .= $dbg; } return $block_tag; ?>