MODx blogカテゴライズ
このページでは記事一覧スニペットDittoと記事投稿スニペットNewsPublisherを改造し、さらに拙作のCategoryTagsと組み合わせてMODxでカテゴリを扱う方法を紹介します。 結構ややこしいので不明な点があれば指摘をお願いします。 また、類似の機能としてTag Cloud 日本語版、WordPress Integratorがあります。
導入方法
以下に示すスニペットの導入&改造を全て行います。(面倒です)
- Ditto1.0.1 + CategoryTags向け改造
- NewsPublisher + CategoryTags向け改造NewsPublisherTagging
- CategoryTags1.0.0
CategoryTags
CategoryTagsは、NewsPublisherTaggingなどを用いてドキュメントに関連付けたテンプレート変数を読み取り、そのページのタグを「同じタグを持った記事一覧のページ」へのリンクとともに出力するスニペットです。記事一覧も同じコードで実現しています。 Dittoとの併用を念頭においていますが、同じような変更を施せば他の一覧系スニペットでも使用できるかもしれません。
ダウンロード
- CategoryTags 1.0.0(Ditto用改造済みファイル(1.0.1ベース)含む)
CategoryTags導入
- ダウンロード・展開して、snippet.CategoryTags.*.*.*.phpの中身を新しいスニペットCategoryTagsとして登録します。
- 自分でマージするか、同梱のDitto用の改造済みファイルsnippet.ditto.1.0.1-CategoryTags.*.*.*.phpを同様にDittoとして登録します。
- さらにditto.class.inc-CategoryTags.*.*.*.phpを/assets/snippets/ditto/にditto.class.inc.phpの名前でアップロードします。
- 済んでいなければNewsPublisherTaggingのページに従ってテンプレート変数の作成、NewsPublisherTaggingの導入を済ませます。
- Dittoで用いているテンプレートチャンク(DittoTemplate)の適当な場所(タイトルの隣など)に[+tags+]を挿入します。(これがタグ列に置き換わります)
- 記事の個別ページでもタグが表示されるように、blog記事表示のためのテンプレート(一般のテンプレートとは分けておくと良いかもしれません)に
[[CategoryTags?categoryTagsTVName=`blogTags`&categoryTagsLandingID=`80`]]などと書きます。
- 記事別一覧ページを作成し、以下を記入(ドキュメントIDを仮に80とします)。
[[categoryTagsTVName=`blogTags`&categoryTagsLandingID=`80`&mode=`list`]]
- blog記事一覧で
[[Ditto?categoryTagsTVName=`blogTags`&categoryTagsLandingID=`80`]]
- これで面倒な作業も終わりです。動作確認をしてください。
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}&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]));
更新履歴
- 20060708 CategoryTags 1.0.0 リリース
