PowerCMS ブログ

2012年07月11日

MTSearchEntriesとMTSearchEntryField、エントリを絞り込むための2つのブロックタグ

MTEntries ブロックタグでエントリを様々な条件でループ出力するテンプレートをつくるケースは多いと思いますが、 標準の MTEntries タグではできない条件指定、例えば特定の文字列を含むエントリの指定、カスタムフィールドによる エントリの絞り込みなどを実現したいと思ったことはないでしょうか。 MTEntries で一旦すべてのエントリをロードした後、ループの中でテンプレート変数を利用して MTIf タグで表示制御する、 といったやりかたを選択することもあるかと思いますが、エントリの件数が多くなってくると不要なオブジェクトのロードや 分岐処理の多さで再構築がどんどん重くなっていきます。

PowerCMSでは、エントリを様々な条件で抽出するための MTSearchEntries、MTSearchEntryField という2つのタグが用意されています。 「Search」と名前がついていることからダイナミック処理用のタグと思われている方もあるかと思いますが、このタグはダイナミックでもスタティックでも同様に動作します。

MTSearchEntries ブロックタグ

MTSearchEntries タグでは、targetで指定したカラムにquery文字列を含むエントリーを出力します。 カラム名を省略した場合はタイトル、本文、続き、概要及びキーワードが対象となります。 operator(省略時はLIKE)を指定することで検索条件を指定できます。 例えば operator="=" target="title" query="Movable Type" はタイトルが「Movable Type」と完全一致するエントリーをロードします。

以下のテンプレートは、タイトルに「CMS」を含むエントリーをループ出力します。

<MTSearchEntries target="title" query="CMS">
<MTIf name="__first__"><ul></MTIf>
<li><MTEntryTitle escape="html"></li>
<MTIf name="__last__"></ul></MTIf>
</MTSearchEntries>

以下のテンプレートは、タイトルに「Movable Type」を"含まない"エントリーをループ出力します。

<MTSearchEntries target="title" operator="not_like" query="Movable Type">
<MTIf name="__first__"><ul></MTIf>
<li><MTEntryTitle escape="html"></li>
<MTIf name="__last__"></ul></MTIf>
</MTSearchEntries>

以下のテンプレートは、タイトルが「Movable Type」と一致するエントリーをループ出力します。

<MTSearchEntries target="title" operator="=" query="Movable Type">
<MTIf name="__first__"><ul></MTIf>
<li><MTEntryTitle escape="html"></li>
<MTIf name="__last__"></ul></MTIf>
</MTSearchEntries>

operator モディファイアには like, not_like, not_null, not, >, >=, <, <=, != が指定可能です。その他指定可能なモディファイアは以下の通りです。

query検索文字列
blog_idブログID
include_blogs対象とするブログIDを列記(カンマ区切り)または"all" "children" "siblings"が指定可能です。
exclude_blogs対象外とするブログIDを列記(カンマ区切り)します。
target検索対象とするカラムを指定します。
operatorSQLの条件式を記載します。デフォルトはLIKEです。
classentry(デフォルト)もしくはpage
sort_by表示順に指定するカラム名
sort_order表示順(descendもしくはascend)
lastn表示数
offsetオフセット値(何件目から読み込むか)
unique同じテンプレート内で使用したMTSearchEntriesブロックで出力したエントリーを除いて出力します。
not_entry_idIDを指定した単一のエントリーを除いて出力します。

MTSearchEntryField ブロックタグ

一方、MTSearchEntryField タグでは、カスタムフィールドの値によってエントリを絞り込むことができます。 MTSearchEntriesと違ってoperatorモディファイアの指定ができませんが(like検索となります。将来のバージョンで改良される予定です)、複数の値を AND OR で組み合わせ指定できるなどの特長があります。

以下のテンプレートは、カスタムフィールド「都道府県(prefecture)」に「大阪府」を含むエントリーをループ出力します。

<MTSearchEntryField basename="prefecture" query="大阪府">
<MTIf name="__first__"><ul></MTIf>
<li><MTEntryTitle escape="html"></li>
<MTIf name="__last__"></ul></MTIf>
</MTSearchEntryField>

以下のテンプレートは、カスタムフィールド「都道府県(prefecture)」に「大阪」または「東京」を含むエントリーをループ出力します。

<MTSearchEntryField basename="prefecture" query="大阪 東京" multi="1" separator=" " and_or="OR">
<MTIf name="__first__"><ul></MTIf>
<li><MTEntryTitle escape="html"></li>
<MTIf name="__last__"></ul></MTIf>
</MTSearchEntryField>

separator モディファイア は複数の文字列を区切る文字列を指定するものです。以下の例は、上のテンプレートと同じく「大阪」または「東京」を含むエントリーをループ出力します。

<MTSearchEntryField basename="prefecture" query="大阪,東京" multi="1" separator="," and_or="OR">
<MTIf name="__first__"><ul></MTIf>
<li><MTEntryTitle escape="html"></li>
<MTIf name="__last__"></ul></MTIf>
</MTSearchEntryField>

MTSearchEntryFieldタグによってカスタムフィールドの値をキーにして柔軟にエントリーを絞り込むことができることがお分かりいただけたかと思います。 尚、両タグともに limit(lastn),offsetモディファイア、sort_by,sort_orderが使えますが、現在のバージョンではsort_orderにカスタムフィールドを指定することはできません。

カテゴリー
PowerCMS 3
テンプレート作成Tips

ページの先頭へ