DocLister ★
MODXの頃はdittoがメジャーでしたが、今はこれ。
特定の親配下にある全てのページを一覧で出力するツール。
サイドナビゲーションなどを作るのに使います。
書き方 | 意味 | 結果 |
---|---|---|
[[DocLister]] | 基本形(キャッシュあり) | 当該ページを親として、通常はリスト形式で出力されます。 |
[!DocLister!] | 基本形(キャッシュなし) | こちらの書き方ですと常にキャッシュされません。 |
パラメータ
値 | 意味 | 初期値 |
---|---|---|
controller | site_content - EVOドキュメントを扱います。 shopkeeper - Shopkeeperカタログを扱います。 onetable - 任意のテーブルを扱います。 site_content_tags - TagSaverプラグインと連携して、タグフィルターをかけたEVOドキュメントを出力します。 |
site_content |
idType | クエリに挿入されるドキュメントのリストは、このパラメータの値と名前が一致するパラメータから選択されます。誤解を避けるために、常にこのパラメータを明示的に定義します。 可能な値:parents,documents |
parents |
parents | 親ドキュメントのリストに基づいたドキュメントの選択 可能な値:親ドキュメントのid値をカンマで区切ったもの |
スニペットが呼び出されたページのid |
documents | 任意のドキュメントの選択 可能な値:ドキュメントのid値をカンマで区切ったもの |
スニペットが呼び出されたページのid |
ignoreEmpty | documentsパラメータが指定されていない場合、テーブルからすべてのレコードを選択することができます。この場合、idTypeパラメータはdocumentsでなければなりません。 可能な値:0,1 |
0 |
display | 1クエリあたりの最大ドキュメント数。 可能な値:0以上の整数 パラメータqueryLimitでオーバーライドできます。 |
0 |
queryLimit | 1クエリあたりの最大ドキュメント数。 可能な値:0以上の整数 |
0 |
depth | parentsからのクエリの深さ 可能な値:0以上の整数 |
0 |
offset | リストの先頭からスキップするドキュメントの数。ページネーションを使用している場合はオーバーライドされます。常にN個のドキュメントをスキップしたい場合は、startパラメータを使用する必要があります。 可能な値:0以上の整数 |
0 |
start | クエリの最初からスキップされたドキュメントの数。ページネーションが発生したときに自動的に設定されるオフセット値を持つ折返しです。 可能な値:0以上の整数 |
0 |
total | クエリで1ページに表示されるドキュメントの最大数。 可能な値:0以上の整数 |
0 |
addWhereList | ドキュメントを検索するための追加条件です。SQLクエリのWHERE句に代入される文字列の条件を満たす任意の文字列。 可能な値:0以上の整数 |
空 |
showParent | パラメータparentsを使用してクエリが行われたドキュメントの除外です。 可能な値: 0 - クエリに含まれる親を強制的に無視します。 1 - クエリに親を含めることを強制します。 -1 - parents パラメータで指定された親のみを無視します。 |
0 |
selectFields | 選択肢に含めるフィールドの名前です。 | 空 |
groupBy | 任意のフィールドで結果をグループ化します。 | コントローラで定義 |
出力前の処理
DocLister では、prepare パラメータを使用して、PHP でデータを前処理することができます。
prepare パラメータの値は、以下のとおり。
- スニペット名
- プリロードされたクラスのメソッドの呼び出し
- 無名関数
複数の値を設定し、順次処理することができます。
スニペットの利用
このスニペットは、配列$dataの値を処理し、$dataまたはfalseのいずれかを返します。後者の場合、データは出力されません。つまり、この方法でprepareを使用すると、データをフィルタリングすることができます。
また、このスニペットでは、$_DocListerと$_extDocListerオブジェクトを使用することができます。
docLister オブジェクトを使用すると、 コントローラのメソッドやプロパティにアクセスすることができます。例えば、現在の出力テンプレートを置き換えることができます。
$_DocLister->renderTPL = "@CODE:\[+pagetitle+\]";
getStoreおよびsetStoreメソッドは、$_extDocListerオブジェクトで利用可能です。setStore はデータを保存し、getStore はメモリからデータを取り出します。DocLister が作業を終了すると、保存されたブロックはメモリから削除されます。
クラスメソッドの使用
class DLprepare {
public static function prepare(array $data = array(), DocumentParser $modx, $_DL, prepare_DL_Extender $_extDocLister) {
return $data
}
}
この場合のパラメータの値。DLprepare::prepare。
匿名の関数も同様に使用することができます。
アゲルナッシュのブログからの例
例1:ある種のDocListerの呼び出しがあるとします。
[[DocLister? &tpl=`tplChunk` &parents=`1`]]
tplChunkはこの通り。
<a href="\[+url+\]">[[if? &is=`\[+longtitle+\]:notempty` &then=`\[+longtitle+\]` &else=`[[snippet? &text=`\[+pagetitle+\]`]]`]]</a>
tplChunkの内部には、ネストされたif呼び出しがあります(トピックの冒頭で指定したものとします)。どうしましょうか?
DocLister 呼び出しに &prepare=test パラメータを追加します (test ではなく、任意の値を追加できます)。
testという名前(またはパラメータprepareで指定された名前)でスニペットを作成します。
スニペットの中に、以下のコードを記述します。
<?php
if(!empty($data['longtitle'])){
$data\['longtitle'\] = $modx->runSnippet("snippet", array('text'=>$data\['pagetitle'\]));
}
return $data;
もちろん、runSnippetの代わりにandを記述することも可能です。
$data\['longtitle'\] = "[[snippet? &text=`".$data\['pagetitle'\]."`]]";
しかし、なぜこれが悪いのかをもう一度思い出してください。pagetitleにはmodxパーサーに引っかかる文字が含まれている可能性があります。pagetitleにスニペットの呼び出しが含まれている場合のみ、このように書くことができます(ただし、非常にまれなケースです+入れ子になったmodxタグを処理する他の方法があります)! しかし、ラムの話に戻そう。
ネストされたスニペットを取り除いたので、tplChunk を安全に取り除き、テンプレートを DocLister 呼び出しに直接持ってくることができます。
[[DocLister? &tpl=`@CODE:<a href="[+url+]">[+longtitle+]</a>` &parents=`1`]]
要約すると、phpで条件をチェックする(prepareスニペットを使う)ことで、ネストしたスニペットの不要な呼び出しを避けることができます(ネストしたスニペットは条件が真のときのみ呼び出されます)。また、個人的な意見ですが、インラインテンプレートは呼び出しとテンプレートの両方が1箇所ではっきり見えるので、とても便利です