MODx用条件分岐スニペット: StartIf & EndIf

 
参考サイト:http://www.hikidas.com/hikidas/modx_resource/StartIf_EndIf.php
マイメモ的にスニペットも残しておく。
 
スニペット:StartIf

<?php
//	Coments are in Japanese(UTF-8) in this file
/**============================================================================
 * Snippet:	StartIf
 * 
 * テンプレート変数等の値により表示を制御(ON/OFF)する。
 * 
 * Summary:
 * 		テンプレートエンジンによくある {if}...{/if} のような機能。
 * 		StartIf と EndIf をペア(対)にして使用する。
 * 
 * 		デフォルトでは、変数等の値が空(未入力)の場合、表示OFFとし、
 * 		変数等の値がある(入力済み)の場合、表示ONとする。
 * 
 * 		表示ON/OFFの判定方法や、出力する内容は、オプションにより変更可能。
 * 
 * Version: 
 * 		1.00
 * 
 * Example:
 * 	1)	要約(introtext)が入力されていたら見出しとともに表示する。
 * 
 * 		[!StartIf? &var=`introtext`!]
 * 		<h2>要約</h2>
 * 		[*introtext*]
 * 		[!EndIf!]
 * 
 * 	2)	長いタイトル(longtitle)が入力されていなければ、
 * 		タイトル(pagetitle)を表示する。
 * 
 * 		[*longtitle*]
 * 		[!StartIf? &not=`1` &var=`longtitle`!][*pagetitle*][!EndIf!]
 * 
 * Description:
 * 		デフォルトでは、変数等の値が空(未入力)の場合、表示OFFとし、
 * 		StartIfが「<span style="display:none;">」を、EndIfが「</span>」を、
 * 		それぞれ出力して、間のコンテンツを囲むことによって非表示にする。
 * 		変数等の値がある(入力済み)の場合、表示ONとし、
 * 		StartIfもEndIfも何も出力せず、間のコンテンツはそのまま表示される。
 * 
 * Note:
 * 		ネストして(入れ子にして)使用することも可能。
 * 
 * 		1ページに複数組入れる場合、同じタグを繰り返すとキャッシュされる?ので、
 * 		適当にオプションを指定して、別のタグと認識させる必要がある。
 * 		例)[!EndIf? &for=`longtitle`!] [!EndIf? &no=`1`!] [!EndIf? &no=`2`!]
 * 
 * 		特殊文字(記号)の一部は、MODx側で処理されて期待通りに動作しないため、
 * 		以下のように、urlencodeした値を指定する必要がある。
 * 		(対応パラメータ:attr、on_st、on_ed、off_st、off_ed、value、regex)
 * 			=	=>	%3D
 * 			?	=>	%3F
 * 			%	=>	%25
 * 			&	=>	%26
 * 			`	=>	%60
 * 			[	=>	%5B
 * 			]	=>	%5D
 * 
 * 		例えば、<table>〜</table>の途中で、StartIfとEndIfを使う等、
 * 		StartIfとEndIfの間で、一連のHTMLタグが完結されていないような場合は、
 * 		デフォルトの動作では問題が起こる可能性があります。
 * 
 * Param:
 * 		----判定する値の指定----
 * 
 * 		[string]		var		テンプレート変数名(省略時:content)
 * 
 * 		[string]		config	設定名(省略時はテンプレート変数)
 * 
 * 		----値の修飾----
 * 
 * 		[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。
 * 		[string]		regex	指定の正規表現に一致すれば表示ON。
 * 
 * Implementation:
 *		グローバル変数「$_EndIfStack」を使用し、StartIfからEndIfに情報を渡す。
 * 
 * More example:
 * 	1)	要約(introtext)が未入力なら、見出しとともにコメントアウトする。
 * 		(途中にコメントタグが入っている場合は使えない)
 * 
 * 		[!StartIf? &var=`introtext` &off_st=`<!-- ` &off_ed=` -->`!]
 * 		<h2>要約</h2>
 * 		[*introtext*]
 * 		[!EndIf!]
 * 
 * 	2)	変数「number」が数字だけの場合、見出しとともに表示する。
 * 
 * 		[!StartIf? &var=`number` &regex=`/^\d+$/`!]
 * 		<h2>番号</h2>
 * 		[*number*]
 * 		[!EndIf!]
 * 
 * Date:
 * 		2007-12-11
 * 
 * Created by:
 * 		Kazuyuki Ikeda (HIKIDAS Co.,Ltd)	http://www.hikidas.com/
 * 
 * Changelog:
 * 		2007-12-11	1.00	公開バージョン
*/
//---- 値の取得
if (isset($config)) {
	$content = $modx->config[$config];
} else {
	if (isset($var)) {
		$var_name = $var;
	} else {
		$var_name = 'content';
	}
	$content_array = $modx->getTemplateVar($var_name);
	$content = $content_array['value'];
}
//---- 値の修飾
$trim_flag = isset($trim) ? $trim : "1";
if ($trim_flag) {
	$content = trim($content);
}
//---- 値の判定
if (isset($value)) {
	$match = ($content === rawurldecode($value));
} elseif (isset($regex)) {
	$match = preg_match(rawurldecode($regex), $content);
} else {
	$match = ($content !== '');
}
//---- 表示条件の判定
$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);
return $block_tag;
?>

 
スニペット:EndIf

<?php
//	Coments are in Japanese(UTF-8) in this file
/**============================================================================
 * Snippet:	EndIf
 * 
 * テンプレート変数等の値により表示を制御(ON/OFF)する
 * 
 * Summary:
 * 		テンプレートエンジンによくある {if}...{/if} のような機能。
 * 		StartIf と EndIf をペア(対)にして使用する。
 * 
 * 		詳しくは「StartIf」を参照のこと。
 * 
 * Version: 
 * 		1.00
 * 
 * Note:
 * 		1ページに複数組入れる場合、同じタグを繰り返すとキャッシュされる?ので、
 * 		適当にオプションを指定して、別のタグと認識させる必要がある。
 * 		例)[!EndIf? &for=`longtitle`!] [!EndIf? &no=`1`!] [!EndIf? &no=`2`!]
 * 
 * Date:
 * 		2007-12-11
 * 
 * Created by:
 * 		Kazuyuki Ikeda (HIKIDAS Co.,Ltd)	http://www.hikidas.com/
 * 
 * Changelog:
 * 		2007-12-11	1.00	公開バージョン
*/
//---- グローバル変数から情報を取得
$stack_var_name = "_EndIfStack";
$block_tag = '';
if (isset($GLOBALS[$stack_var_name])) {
	$stack_tag = array_pop($GLOBALS[$stack_var_name]);
	if (! is_null($stack_tag)) {
		$block_tag = $stack_tag;
	}
}
return $block_tag;
?>

スニペットコール:

[!StartIf? &var=`メーカー名`!]
      <p><strong>メーカー名</strong><br />
        [*メーカー名*]</p>
[!EndIf? &var=`メーカー名`!]

元配布サイトの参考例では[!endIf &var=...!]となっていますが、これだとStartIfで差し込まれたdisplay:noneのspanタグが正常に終了せず、StartIf以降がまるっと消えてしまいますので注意。
気づくのに時間がかかりました。