DocListerで記事の一覧 モディファイア編
前回DocListerについて書いて、まさかまた書くとは思っていなかったけれども、モディファイアの使い方がわかったので紹介します。なんでか前回のときは使えなかった(よくわかっていなかった)ので断念していました。ドキュメントも英語版が作られたので、今後は情報がもっと増えることに期待しています。
まずは参考に、
ダウンロードはMODX公式からおこないます。DocListerはMODX Evolution 1.1に導入されることになりました。展開したディレクトリ内にあるassets/lib ディレクトリとassets/snippets/DocLister ディレクトリを自分のMODXにコピーしてきます。そしてinstall/assets/snippets/DocLister.tplの中身をコピーしてスニペットコードに貼り付けます。スニペットの作成・インストールについてはこちらを参照してください。
DocLister.tpl
//<?php
/**
* DocLister
*
* Snippet to display the information of the tables by the description rules. The main goal - replacing Ditto and CatalogView
*
* @category snippet
* @version 2.1.30
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL)
* @internal @properties
* @internal @modx_category Content
* @internal @installset base, sample
*/
return require MODX_BASE_PATH.'assets/snippets/DocLister/snippet.DocLister.php';
DocListerの書き方
[[DocLister?
&parents=`リソースID`
&dateSource=`pub_date`
&dateFormat=`%y年%m月%d日 %H:%M`
&tpl=`@CODE:<h1>[+title+]([+date+])</h1><p>[+content:limit='300'+]</p>`]]
[[DocLister?
&parents=`リソースID`
&dateSource=`pub_date`
&dateFormat=`%y年%m月%d日 %H:%M`
&tpl=`DLpost.item`]]
チャンク:DLpost.item
<h1>[+title+]([+date+])</h1><p>[+content:limit=`300`+]</p>
使用できるモディファイアは、assets/snippets/DocLister/lib/DLphx.class.phpを確認してください。またDocLister内蔵のモディファイアのため、オプションは従来の記述法([+phx:modifier=`オプション`+])で書きます。MODX Evolution日本語版の最近追加された記述法([+phx:modifier(オプション)+])では認識されません。&tpl=`@CODE:`でモディファイアのオプションを記述する際に同じクォートで入れ子にならないように注意が必要です。クォートなしの他に使用できるクォートは、「"」「'」「`」の三つです。
カスタムモディファイア
作成自体は日本語版と同じです。スニペットにphx:モディファイア名で、スニペットコードに処理を書きます。
変数は$outputに代入されます。$valueでないことに注意しましょう。オプションについては不明なので、スニペットコードに直接書くようにします。
例えばsummaryモディファイアを使用する場合、DocListerに内蔵されていないので次のように追加します。モディファイア名は誤作動防止のためにDocListerとMODXに内蔵されているものを避けます。
スニペット名
phx:dlsummary
スニペットコード
$value = $output; //追加
$opt = '300,。'; //追加
//以下、manager/includes/extenders/modifiers/mdf_summary.inc.phpからコピー
if(strpos($opt,',')) list($limit,$delim) = explode(',', $opt);
elseif(preg_match('/^[1-9][0-9]*$/',$opt)) {$limit=$opt;$delim='';}
else {$limit=100;$delim='';}
if($delim==='') $delim = $modx->config['manager_language']==='japanese-utf8' ? '。' : '.';
$limit = intval($limit);
$content = $modx->filter->parseDocumentSource($value);
$content = strip_tags($content);
$content = str_replace(array("\r\n","\r","\n","\t",' '),' ',$content);
if(preg_match('/\s+/',$content))
$content = preg_replace('/\s+/',' ',$content);
$content = trim($content);
$pos = $modx->filter->strpos($content, $delim);
if($pos!==false && $pos<$limit) {
$_ = explode($delim, $content);
$text = '';
foreach($_ as $v) {
if($limit <= $modx->filter->strlen($text.$v.$delim)) break;
$text .= $v.$delim;
}
if($text) $content = $text;
}
if($limit<$modx->filter->strlen($content) && strpos($content,' ')!==false) {
$_ = explode(' ', $content);
$text = '';
foreach($_ as $v) {
if($limit <= $modx->filter->strlen($text.$v.' ')) break;
$text .= $v . ' ';
}
if($text!=='') $content = $text;
}
if($limit < $modx->filter->strlen($content)) $content = $modx->filter->substr($content, 0, $limit);
if($modx->filter->substr($content,-1)==$delim) $content = rtrim($content,$delim) . $delim;
return $content;
これでDocListerで使うテンプレートに[+content:dlsummary+]と書くだけです。
以下サンプルに、当ブログで使用しているものを書いておきます。フレームワークのUIkitを使っているので、classはそれに準じて記述されています。
記事一覧(ホーム)
[[DocLister?
&id=`entry`
&parents=`リソースID`
&tvList=`アーカイブ,タグ,カテゴリー,アイキャッチ`
&depth=`1`
&paginate=`pages`
&display=`10`
&orderBy=`c.publishedon DESC`
&dateFormat=`%m月%d日`
&noneWrapOuter=`0`
&ownerTPL=`@CODE:[+dl.wrap+]`
&tpl=`DLpost.item`
&pageAdjacents=`4`
&PrevNextAlwaysShow=`1`
&TplNextP=`@CODE:<li><a href="[+link+]">次へ</a></li>`
&TplNextI=`@CODE:<li class="uk-disabled"><span>次へ</span></li>`
&TplPrevP=`@CODE:<li><a href="[+link+]">前へ</a></li>`
&TplPrevI=`@CODE:<li class="uk-disabled"><span>前へ</span></li>`
&TplPage=`@CODE:<li><a href="[+link+]">[+num+]</a></li>`
&TplCurrentPage=`@CODE:<li class="uk-active"><span>[+num+]</span></li>`
&TplWrapPaginate=`@CODE:<ul class="[+class+]">[+wrap+]</ul>`
&PaginateClass=`uk-pagination`]]
[+entry.pages+]
記事一覧(カテゴリー・タグ・アーカイブ)
[[DocLister?
&id=`entry`
&parents=`リソースID`
&tvList=`アーカイブ,タグ,カテゴリー,アイキャッチ`
&filters=`tv:[*parent:pagetitle*]:like:[*id*]`
&depth=`1`
&paginate=`pages`
&display=`10`
&orderBy=`c.publishedon DESC`
&dateFormat=`%m月%d日`
&noneWrapOuter=`0`
&ownerTPL=`@CODE:[+dl.wrap+]`
&tpl=`DLpost.item`
&pageAdjacents=`4`
&PrevNextAlwaysShow=`1`
&TplNextP=`@CODE:<li><a href="[+link+]">次へ</a></li>`
&TplNextI=`@CODE:<li class="uk-disabled"><span>次へ</span></li>`
&TplPrevP=`@CODE:<li><a href="[+link+]">前へ</a></li>`
&TplPrevI=`@CODE:<li class="uk-disabled"><span>前へ</span></li>`
&TplPage=`@CODE:<li><a href="[+link+]">[+num+]</a></li>`
&TplCurrentPage=`@CODE:<li class="uk-active"><span>[+num+]</span></li>`
&TplWrapPaginate=`@CODE:<ul class="[+class+]">[+wrap+]</ul>`
&PaginateClass=`uk-pagination`]]
[+entry.pages+]
DLpost.item
<article class="uk-article">
<h1 class="uk-article-title">
<a href="[+url+]">[+title+]</a></h1>
<p class="uk-article-meta">
<i class="uk-icon uk-icon-calendar"></i> [+tv.アーカイブ:dlcategory+][+date+] / <i class="uk-icon uk-icon-folder-o"></i> [+tv.カテゴリー:dlcategory+] / <i class="uk-icon uk-icon-tags"></i> [+tv.タグ:dlcategory+]</p>
<div class="uk-grid">
<div class="uk-width-1-1 uk-width-medium-1-3">
<a href="[+url+]" class="uk-thumbnail"><img src="assets/plugins/timthumb/tt.php?src=[+tv.アイキャッチ:ifempty=`[+content:dlgetimage+]`:ifempty=`content/images/website/noimage.jpg`+]&q=70&w=260&h=160" alt=""></a>
</div>
<div class="uk-width-1-1 uk-width-medium-2-3">
</p>[+content:dlsummary+](<a href="[+url+]">続きを読む</a>)</p>
</div>
</article>
関連記事一覧
[!DocLister?
&parents=`リソースID`
&depth=`1`
&display=`5`
&orderBy=`RAND()`
&dateFormat=`%m月%d日`
&filters=`AND(tv:カテゴリー:is:[*カテゴリー*];content:c.id:no:[*id*];)`
&noneWrapOuter=`0`
&ownerTPL=`@CODE:<ul class="uk-list uk-list-line">[+dl.wrap+]</ul>`
&tpl=`@CODE:<li><a href="[+url+]">[+title+]</a></li>`
!]