ラック
Home > CMS > 記事 > 2015年1月 > カテゴリやタグの出力にaタグを付けたい(2)

カテゴリやタグの出力にaタグを付けたい(2)

カテゴリ: MODx

前回の続き。一覧表示のときに上手く行かないのでどうしたものかとあれこれ試行錯誤したり助言を受けたりして格闘した結果。

	
<?php
/* *******************************************************
 name: "tvLinkAddOutPut"
 カテゴリやタグの一覧にaタグを付けて出力するスニペット
******************************************************* */
//初期設定
$aTagPHx = 'ttc_landing_tags';
if($tvKey === 'cat') {
	$aTagRsrc = 'category';
}
else {
	$aTagRsrc = 'tag';
}

/* テンプレートによってパスを分ける */
if($modx->documentObject['template'] === 'XX') { //blog1
	$tvNameStr = 'blog1_'. $aTagRsrc;
	$tvOutPutRsrc = 'blog1/blog1_'. $aTagRsrc;
}
else if($modx->documentObject['template'] === 'YY') { //blog2
	$tvNameStr = 'blog2_'. $aTagRsrc;
	$tvOutPutRsrc = 'blog2/blog2_'. $aTagRsrc;
}
/* テンプレートによってパスを分ける・ここまで */

//テンプレート変数を読み込む
$tvStrArr = $modx->getTemplateVarOutput($tvNameStr);
$tvStrVar = $tvStrArr[$tvNameStr];

$aTagStart = "<a href=\"./". $tvOutPutRsrc .".html?". $aTagPHx ."=";
if(!empty($tvStrVar)) { //カテゴリ・タグ一覧の文字列が空(0やfalse、空文字列も条件に含む)でない場合
	$tvStrVar = htmlspecialchars($tvStrVar, ENT_QUOTES, 'UTF-8');
	if(strpos($tvStrVar, ",") != 0) { //「,」が含まれている場合(カテゴリやタグ一覧である文字列の先頭にデリミタの「,」があるのもおかしいので、弾くようにあえて!=0。普通の文字列比較なら!==falseという条件にすべき)
		$tvArray = explode(",", $tvStrVar);
		for($i = 0; $i < count($tvArray)-1; $i++) {
			$tvArray[$i] = str_replace("\r\n", '', $tvArray[$i]);
			$tvStrUrl[$i] = rawurlencode($tvArray[$i]);
			$arrLinkAddTV[$i] = $aTagStart . $tvStrUrl[$i] . "\">" . $tvArray[$i] . "</a>,"; //デミリタ付きで出力
			echo $arrLinkAddTV[$i];
		}
		$tvArray[$i] = str_replace("\r\n", '', $tvArray[$i]);
		$tvStrUrl[$i] = rawurlencode($tvArray[$i]);
		$arrLinkAddTV[$i] = $aTagStart . $tvStrUrl[$i] . "\">" . $tvArray[$i] . "</a>"; //最後だけデリミタなしで出力
		echo $arrLinkAddTV[$i];
	}
	else { //1個だけの場合(=デリミタ「,」がない)は単体出力
		$tvStrVar = str_replace("\r\n", '', $tvStrVar);
		$varLinkAddTV = $aTagStart . rawurlencode($tvStrVar) . "\">" . $tvStrVar . "</a>";
		echo $varLinkAddTV;
	}
}
?>
	

各記事のリソースではほぼ今まで通り。ただ、カテゴリとタグ両方に同時に対応できるようにパラメータ渡して云々できるようにしました。

	
[!tvLinkAddOutPut?&tvKey=`cat`!]
[!tvLinkAddOutPut?&tvKey=`tag`!]
	

コール時は上記の通りパラメータ渡して条件分岐。

 

	
<?php
/* *******************************************************
 name: "phx:tagLinkAddOutPut"
 カテゴリの一覧にaタグを付けて出力するスニペット
******************************************************* */

//初期設定
$aTagPHx = 'ttc_landing_tags';
$aTagRsrc = 'category';

/* テンプレートによってパスを分ける */
if($modx->documentObject['template'] === 'XX') { //blog1
	$tvOutPutRsrc = 'blog1/blog1_'. $aTagRsrc;
}
else if($modx->documentObject['template']) { //blog2
	$tvOutPutRsrc = 'blog2/blog2_'. $aTagRsrc;
}
/* テンプレートによってパスを分ける・ここまで */

//テンプレート変数の値を代入
$tvStrVar = $value;

$aTagStart = "<a href=\"./". $tvOutPutRsrc .".html?". $aTagPHx ."=";
if(!empty($tvStrVar)) { //カテゴリ・タグ一覧の文字列が空(0やfalse、空文字列も条件に含む)でない場合
	$tvStrVar = htmlspecialchars($tvStrVar, ENT_QUOTES, 'UTF-8');
	if(strpos($tvStrVar, ",") != 0) { //「,」が含まれている場合(カテゴリやタグ一覧である文字列の先頭にデリミタの「,」があるのもおかしいので、弾くようにあえて!=0。普通の文字列比較なら!==falseという条件にすべき)
		$tvArray = explode(",", $tvStrVar);
		for($i = 0; $i < count($tvArray)-1; $i++) {
			$tvArray[$i] = str_replace("\r\n", '', $tvArray[$i]);
			$tvStrUrl[$i] = rawurlencode($tvArray[$i]);
			$arrLinkAddTV[$i] = $aTagStart . $tvStrUrl[$i] . "\">" . $tvArray[$i] . "</a>,"; //デミリタ付きで出力
			echo $arrLinkAddTV[$i];
		}
		$tvArray[$i] = str_replace("\r\n", '', $tvArray[$i]);
		$tvStrUrl[$i] = rawurlencode($tvArray[$i]);
		$arrLinkAddTV[$i] = $aTagStart . $tvStrUrl[$i] . "\">" . $tvArray[$i] . "</a>"; //最後だけデリミタなしで出力
		echo $arrLinkAddTV[$i];
	}
	else { //1個だけの場合(=デリミタ「,」がない)は単体出力
		$tvStrVar = str_replace("\r\n", '', $tvStrVar);
		$varLinkAddTV = $aTagStart . rawurlencode($tvStrVar) . "\">" . $tvStrVar . "</a>";
		echo $varLinkAddTV;
	}
}
?>
	

で今回の本題はこっち。記事一覧を表示させるリソースではPHxスニペットにすることで上手く動作しました。ただ、別環境のときはこれ1つでリソース単体の表示も上手く行ったのですが、ここでは上手く動かなかったので前回作ったものの改良(上に記したやつ)を使うことで妥協。

	
[+blog_category:catLinkAdd+]
	

コール時というかプレースホルダにPHxでフィルタを噛ませる形。
別環境の各記事のリソースのときはプレースホルダではなくリソース変数("+"ではなく"*"ということ)で動いたのですが…そこは謎。
いろいろ試行錯誤しましたが、最終的にこの形で運用することになりそうです。

 

これで、ブログとしての機能というかそれっぽいことはほぼ全部できたことになるのかなぁ…。

タグ: カテゴリ・タグ, テンプレート変数, スニペット, ブログ関係

 



関連する記事一覧