要約
* [*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 = ''.$tag_name.'>';
$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;
?>