最近の更新

関連


その他いろいろ

多機能フィードリーダSynapse製作中

2月までは目が回るほど忙しい

MODxでつくる! 最強のCMSサイト カバー
MODxでつくる! 最強のCMSサイト

MODx blogカテゴライズ

Ditto+NewsPublisherを改造しCategoryTagsと組み合わせMODx blogでカテゴリを扱う
初出:2007年03/31 更新:2007年04/06

この文書のキーワード: PHP, MODx

このページでは記事一覧スニペットDittoと記事投稿スニペットNewsPublisherを改造し、さらに拙作のCategoryTagsと組み合わせてMODxでカテゴリを扱う方法を紹介します。 結構ややこしいので不明な点があれば指摘をお願いします。 また、類似の機能としてTag Cloud 日本語版WordPress Integratorがあります。

導入方法

以下に示すスニペットの導入&改造を全て行います。(面倒です)

CategoryTags

CategoryTagsは、NewsPublisherTaggingなどを用いてドキュメントに関連付けたテンプレート変数を読み取り、そのページのタグを「同じタグを持った記事一覧のページ」へのリンクとともに出力するスニペットです。記事一覧も同じコードで実現しています。 Dittoとの併用を念頭においていますが、同じような変更を施せば他の一覧系スニペットでも使用できるかもしれません。

ダウンロード

CategoryTags導入

  1. ダウンロード・展開して、snippet.CategoryTags.*.*.*.phpの中身を新しいスニペットCategoryTagsとして登録します。
  2. 自分でマージするか、同梱のDitto用の改造済みファイルsnippet.ditto.1.0.1-CategoryTags.*.*.*.phpを同様にDittoとして登録します。
  3. さらにditto.class.inc-CategoryTags.*.*.*.phpを/assets/snippets/ditto/にditto.class.inc.phpの名前でアップロードします。
  4. 済んでいなければNewsPublisherTaggingのページに従ってテンプレート変数の作成、NewsPublisherTaggingの導入を済ませます。
  5. Dittoで用いているテンプレートチャンク(DittoTemplate)の適当な場所(タイトルの隣など)に[+tags+]を挿入します。(これがタグ列に置き換わります)
  6. 記事の個別ページでもタグが表示されるように、blog記事表示のためのテンプレート(一般のテンプレートとは分けておくと良いかもしれません)に
    [[CategoryTags?categoryTagsTVName=`blogTags`&categoryTagsLandingID=`80`]]などと書きます。
    
  7. 記事別一覧ページを作成し、以下を記入(ドキュメントIDを仮に80とします)。
    [[categoryTagsTVName=`blogTags`&categoryTagsLandingID=`80`&mode=`list`]]
    
  8. blog記事一覧で
    [[Ditto?categoryTagsTVName=`blogTags`&categoryTagsLandingID=`80`]]
    
  9. これで面倒な作業も終わりです。動作確認をしてください。

Ditto改造

上手くやれば改造無しで通るのかもしれませんが、このバージョンではDittoを巻き込んだ修正を必要とします。 CategoryTagsのアーカイブにDitto1.0.1ベースの改造済みファイルが含まれていますが、他のバージョンとマージする場合のために、diffを置いておきます。

snippet.ditto.1.0.0.php
--- snippet.ditto.1.0.1.php	Tue Jun 06 04:20:25 2006
+++ snippet.ditto.1.0.1-CategoryTags.1.0.0.php	Sat Jul 08 21:48:25 2006
@@ -35,6 +35,8 @@
 $ditto = null;
 if (class_exists('ditto')) {
    $ditto = new ditto();
+   $ditto->categoryTagsTVName = isset($categoryTagsTVName) ? $categoryTagsTVName : ''; // category tag support
+   $ditto->categoryTagsLandingID = isset($categoryTagsLandingID) ? intval($categoryTagsLandingID) : '';
 } else {
 	return $_lang['invalid_class'];
 }
@@ -445,4 +447,4 @@
   // Output results
   // ---------------------------------------------------
   
-return $output;
\ No newline at end of file
+return $output;
ditto.class.inc.php
--- ditto.class.inc.php	Mon Jun 05 08:42:35 2006
+++ ditto.class.inc-CategoryTags.1.0.0.php	Sat Jul 08 21:58:39 2006
@@ -1,6 +1,7 @@
 <?php
 class ditto {
 	var $link, $advancedsort, $hiddenTVs, $APImode, $start, $stop, $array_key, $filtertype, $tagDelimiter, $filterValue, $tags;
+	var $categoryTagsTVName, $categoryTagsLandingID; //category tag support
 	// ---------------------------------------------------
 	// Get createdby
 	// ---------------------------------------------------  	   
@@ -370,7 +371,23 @@
 		$placeholders['[+summary+]'] = $summary;
 		$placeholders['[+link+]'] = $link;
 		$placeholders['[+author+]'] = $this->getcreatedby($resource[$x]['createdby'], $format);
-
+		
+		// category tag support by uglydog, http://nanabit.net/
+		$tbl1 = $modx->getFullTableName('site_tmplvar_contentvalues');
+		$tbl2 = $modx->getFullTableName('site_tmplvars');
+		$sql = "SELECT t1.value FROM $tbl1 as t1, $tbl2 as t2 WHERE t1.contentid='{$resource[$x]['id']}' AND t1.tmplvarid=t2.id AND t2.name='{$this->categoryTagsTVName}' LIMIT 1;";
+		$out = "";
+		if( $rs = $modx->dbQuery($sql) ){
+			$row = $modx->fetchRow($rs);
+			$category_tags = strpos($row['value'], "||")===false ? ($row['value']?array($row['value']):'') : explode("||", $row['value']);
+			if( $category_tags ){
+				foreach($category_tags as $t){
+					$out .= "<a href=\"/{$this->categoryTagsLandingID}&amp;tags={$t}\">{$t}</a> ";
+				}
+			}
+		}
+		$placeholders['[+tags+]'] = $out;
+		
 		// Ensure proper charset is used
 		if ($modx->config['etomite_charset'] == 'UTF-8') {
 			$placeholders['[+date+]'] = utf8_encode(strftime($date, $resource[$x][$datetype]));

更新履歴