M-Blog

4.リソースのカテゴリー分け

MODXでブログをする際のカテゴリー・タグ・年別アーカイブを作成します。
@Bindingsについては「Tips:2.テンプレート変数で@Bindingsを使う」を参考にしてください。

リソースの構成

リソースID リソースの種類 エイリアス 適用テンプレート
1 サイトスタート 記事一覧
2 記事(ウェブリンクで[(site_url)])を設定 entry blank
リソースID2のサブリソース 各記事 記事
3 カテゴリー category 記事一覧
リソースID3のサブリソース 各カテゴリー 記事一覧
4 タグ tag 記事一覧
リソースID4のサブリソース 各タグ 記事一覧
5 アーカイブ year 記事一覧
リソースID5のサブリソース 各アーカイブ 記事一覧

テンプレート変数

カテゴリー

複数選択不可のラジオボタンでカテゴリーを選択できるようにします。

入力フォーム Radio Option
オプション @SELECT `pagetitle` AS `name`,`id` FROM `[+prefix+]site_content` WHERE `published` = 1 AND `deleted` = 0 AND `parent` = 3 ORDER BY `menuindex` ASC
規定値 @@EVAL:
$default = 'uncategorized';
$alias = 'category/'.$default;
return $modx->getIdFromAlias($alias);
プロセッサ Custom Processer
プロセッサの設定 @EVAL
$value = '[+value+]';
if($value == '')return ;
$delim = '||';
$out = array();
$ids = explode($delim,$value);
foreach($ids as $id){
    $url = $modx->makeUrl($id);
    $title = $modx->getField('pagetitle',$id);
    $alias = $modx->getField('alias',$id);
    $out[] = '<a href="'.$url.'" class="'.$alias.'">'.$title.'</a>';
}
return implode(',',$out);

タグ

複数選択可能のチェックボックスでタグを選択できるようにします。

入力フォーム Check Box
オプション @SELECT `pagetitle` AS `name`,`id` FROM `[+prefix+]site_content` WHERE `published` = 1 AND `deleted` = 0 AND `parent` = 3 ORDER BY `menuindex` ASC
規定値
プロセッサ Custom Processer
プロセッサの設定 @EVAL
$value = '[+value+]';
if($value == '')return ;
$delim = '||';
$out = array();
$ids = explode($delim,$value);
foreach($ids as $id){
    $url = $modx->makeUrl($id);
    $title = $modx->getField('pagetitle',$id);
    $alias = $modx->getField('alias',$id);
    $out[] = '<a href="'.$url.'" class="'.$alias.'">'.$title.'</a>';
}
return implode(',',$out);

アーカイブ

複数選択不可のリストボックスで選択できるようにします。通常はリソース新規投稿時に変更はしません。

入力オプション Listbox(Single-Select)
入力オプション @SELECT `pagetitle` AS `name`,`id` FROM `[+prefix+]site_content` WHERE `published` = 1 AND `deleted` = 0 AND `parent` = 5 ORDER BY `menuindex` ASC
規定値 @@EVAL:
$alias = 'year/'.date('Y');
return $modx->getIdFromAlias($alias);
プロセッサ Costom Processer
プロセッサの設定 @EVAL
$value = '[+value+]';
if($value == '')return ;
$delim = '||';
$out = array();
$ids = explode($delim,$value);
foreach($ids as $id){
    $url = $modx->makeUrl($id);
    $title = $modx->getField('pagetitle',$id);
    $alias = $modx->getField('alias',$id);
    $out[] = '<a href="'.$url.'" class="'.$alias.'">'.$title.'</a>';
}
return implode(',',$out);

テンプレート:記事

各記事を出力するためのテンプレートです。

<h1>[*pagetitle*]</h1>
<p>投稿日:[*アーカイブ*][*publishedon:date(%m月%d日)*] / カテゴリー:[*カテゴリー*] / タグ:[*タグ*]</p>
[*content*]

テンプレート:一覧

Dittoのパラメータ「&filter=`[*parent:pagetitle*],[*pagetitle*],7`」は、カテゴリー「未分類」の場合だと、テンプレート変数「カテゴリー」([*parent:pagetitle*])の値にカテゴリー「未分類」([*pagetitle*])が「含まれないリソースは非表示」(7)という意味になります。

<!-- カテゴリー/タグ/アーカイブの一覧 -->
<!--@IF:[*id:is(3):or:is(4):or:is(5)*]>
<ul>
[[Ditto?
&parents=`[*id*]`
&orderBy=`menuindex ASC`
&tpl=`@CODE:<li><a href="[+url+]">[+title+][+id:docCount+]</a></li>`
]]
</ul>
<@ENDIF-->

<!-- トップページの記事一覧 -->
<!--@IF:[*id:is(`[(site_start)]`)*]>
[[Ditto?
&parents=`2`
&id=`entry`
&display=`5`
&orderBy=`publishedon DESC`
&paginate=`1`
&tpl=`post.item`
]]
[+entry_previous+][+entry_pages+][+entry_next+]
<@ENDIF-->

<!-- カテゴリー/タグ/アーカイブに所属する記事一覧 -->
<!--@IF:[*parent:is(3):or:is(4):or:is(5)*]>
[[Ditto?
&parents=`2`
&id=`entry`
&display=`5`
&orderBy=`publishedon DESC`
&filter=`[*parent:pagetitle*],[*pagetitle*],7`
&paginate=`1`
&tpl=`post.item`
]]
[+entry_previous+][+entry_pages+][+entry_next+]
<@ENDIF-->

チャンク:post.item

テンプレート「記事一覧」のDitto用テンプレートです。

<div style="border:solid 1px #ccc;padding:10px;margin:10px;">
<h2>[+title+]</h2>
<p>作成日:[+アーカイブ+][+publishedon:date(%m月%d日)+] / カテゴリー:[+カテゴリー+] / タグ:[+タグ+]</p>
<p>[+content:summary+]</p>
<p><a href="[+url+]">記事へ</a></p>
</div>

カスタムモディファイア:docCount

各カテゴリー・タグ・アーカイブに関連付けられたリソースをカウントします。

スニペット名

phx:docCount

スニペットコード

//[+id:docCount+]
//リソースIDを$docIdに入れる
$docId = $value;
if($docId == '')$docId = $modx->documentIdentifer;

//全ての記事からカテゴリー・タグ・アーカイブの値を取得
$archives = $modx->getDocumentChildrenTVars($parentid= 2, $tvidnames= array('カテゴリー','タグ','アーカイブ'), $published= 1, $docsort= 'menuindex', $docsortdir= 'ASC', $tvfields= 'name');

//一つの配列にする
$list = array();
foreach($archives as $archive){
$list = array_merge($list, array_column($archive,'value'));
}

//@Bindingsの値を展開
foreach($list as $ids){
if (substr($ids, 0, 1) != '@'){
$out[] = $ids;
}else{
$out[] = $modx->ProcessTVCommand($ids);
}
}

//全てのIDの区切り文字を「||」にする
$out = implode('||',$out);

//再度配列に
$out = explode('||',$out);

//各カテゴリー・タグ・アーカイブのリソースIDをカウント
$count = array_count_values($out);

//$docId(リソースID)の出現数を出力
if($count[$docId] != ''){ return '('.$count[$docId].')'; }else{ return '(0)'; }

おまけ

今回のリソースに関連付けられたカテゴリー・タグ・アーカイブをリソースIDで出力したい場合、1.0.16J以降では次の記述でプロセッサが無視されてIDが出力可能となります。

  • [*カテゴリー:raw*]
  • [*タグ:raw*]
  • [*アーカイブ:raw*]

規定値に@Bindingsを記述している場合は、記述内容がそのまま出力されるので扱いに注意が必要。また、rawモディファイアはチェーンができません。

[*phx:if(`[*アーカイブ:raw*]`):tvc*]
※複数選択可能な物は「||」で区切られて出力

カスタムモディファイア:tvc

変数の値が@Bindingsの場合、展開します。

スニペット名

phx:tvc

スニペットコード

if (substr($value, 0, 1) != '@'){
    return $value;
}else{
    return $modx->ProcessTVCommand($value);
}

次回はメンバー限定ページの作成について。

参考画像

No.1

No.2

No.3

No.4

No.5

No.6

© 2015 - 2019 M-Blog. Powered by MODX.

(URL:https://modx.mblo.info/,E-mail:info@mblo.info)

ブログについて
MODX Evolutionを使ってブログをしています。基本的にはまとめ、チートシートのメモなど、他にも日常のことをぼちぼち書いています。

コンテンツ
ブログ
MODXまとめ
MODXチートシート

動作環境
このブログはで運用しています。
・Apache 2.2.31
・OS Free BSD
・PHP 7.1.28
・MySQL 5.5.38
・MODX 1.0.22J-beta1

ブログ更新通知
RSS | ATOM

まとめ更新通知
RSS | ATOM

フィードバック

お問い合わせ
Twitter