PowerCMS X ブログ

2021-03-23

オブジェクトをループ出力するタグ (例 : mt:entries) のさまざまなフィルタリングについて

オブジェクトをループ出力するタグ (例 : mt:entries) では、さまざまなタグ属性によってフィルタリングが可能となっています。バージョンアップで指定できる属性が増えていますので、整理する意味で利用できるフィルタをご紹介します。まず、以下はMTMLReferenceプラグインによる mt:entriesのドキュメントです。

タグ 説明 タグ属性
<mt:entries> ~ </mt:entries> '記事' オブジェクトをループ出力します。
予約変数
  • __first__ : ループの初回に1がセットされます
  • __last__ : ループの最終回に1がセットされます
  • __odd__ : ループの奇数回に1がセットされます
  • __even__ : ループの偶数回に1がセットされます
  • __counter__ : ループのカウンター(1から始まる)
  • __index__ : 'var'属性が与えられた時、ループのカウントがセットされます
  • __total__ : ループの総回数がセットされます(配列またはオブジェクトの数)
  • sort_by : 指定のカラム値で記事をソートする。フィールドでのソートを指定する場合"field:basename numeric"のように指定することも可能
  • sort_order : 'ascend(昇順)' または 'descend(降順)'
  • offset : N記事目からリストを開始する(Nは正の整数)
  • limit : 表示する件数(数値)
  • lastn : 「published_on」カラムもしくは最初の日付型のカラムを基準にして最新N件のオブジェクトを取得する
  • options : $termsの配列(loadメソッドの第1引数)
  • (column name[s]) : 指定のカラム名の値でフィルタリングする
  • conditions : カラム名をキー、フィルタ条件(例:like),フィルタする値のカンマ区切りテキストを値にした配列(ハッシュ)
  • include_draft : 公開されていない下書きなどのオブジェクトを含む
  • status : 指定の値に一致するステータスのオブジェクトを含む
  • status_lt : 指定の値より小さいステータスのオブジェクトを含む
  • status_not : 指定の値に一致しないステータスのオブジェクトを含む
  • (relation name[s]) : リレーション先のオブジェクトのプライマリカラムの値もしくは階層付きモデルの場合「Path/To/オブジェクト名」でフィルタリングする
  • (field:basename[s]) : 指定のフィールド名の値でフィルタリングする
  • field_and_or : 指定のフィールド名の値でフィルタリングする時、AND条件かOR条件を指定する
  • author : オブジェクトがカラム'user_id'もしくは'created_by'をもつ場合、ユーザー名でフィルタリングする
  • ignore_archive_context : アーカイブコンテキストを無視しフィルタリングをせずオブジェクトをロードする
  • include_workspaces : 記事に'workspace_id'カラムが存在する時、指定のスペースに存在するオブジェクトに絞り込む(カンマ区切りの数字または'this'または'all'または'children')
  • exclude_workspaces : 記事に'workspace_id'カラムが存在する時、指定のスペースに存在しないオブジェクトに絞り込む(カンマ区切りの数字)
  • workspace_id : スペースIDでの絞り込み
  • workspace_ids : 'include_workspaces'のエイリアス
  • ids : 指定のIDの記事を出力(カンマ区切りの数字)
  • exclude_ids : 指定のIDに一致しない記事を出力(カンマ区切りの数字)
  • unique : 同一ページで出力された記事を除外する
  • shuffle : sort_by属性指定のない時オブジェクトをシャッフルする
  • ignore_filter : ダイナミックパブリッシング時にオブジェクトをフィルタをするパラメータを無効にする
  • cols : SELECT文の対象とするカラム名(カンマ区切り)
  • glue : 繰り返し処理の際に指定された文字列で各ブロックを連結する

カラムの値によるフィルタ

モデルのカラム名を属性に指定して完全一致するもののみを絞り込みます(以下に紹介するフィルタはすべて組み合わせて使うことができます)。

<mt:entries title="記事のタイトル" keywords="記事のキーワード">
<mt:entrytitle>
</mt:entries>

ver.2.5からは、リレーション型のカラムも指定できるようになりました。以前のように「mt:setcontext」ブロックで囲む必要はなくなりました。AND | OR | NOT指定ができ、属性名はカラム名(categories, tags)でもモデル名(category, tag)でも構いません。もちろんリレーション以外のカラム名の属性と併用することができます。

<mt:entries categories="カテゴリ名1 OR カテゴリ名2" tags="タグ名1 AND タグ名2">
<mt:entrytitle>
</entries>

単一指定の時、階層付きモデルの属性値に「/」を付けることで、パスの指定が可能です。

<mt:entries category="プレスリリース/PowerCMS X">
<mt:entrytitle>
</entries>

options属性によるフィルタ

options属性で "カラム名1", "値1","カラム名2", "値2"... のような配列を渡すことで複数のカラムの値によるフィルタをまとめて指定することができます。

<mt:setvar name="options" value="title">
<mt:setvar name="options" value="記事のタイトル" function="push">
<mt:setvar name="options" value="keywords">
<mt:setvar name="options" value="記事のキーワード" function="push">
<mt:entries options="$options">
<mt:entrytitle>
</mt:entries>
# CSVで渡す場合
<mt:entries options="'title','記事のタイトル','keywords','記事のキーワード'">
<mt:entrytitle>
</mt:entries>

フィールドによるフィルタ

フィールド(カスタムフィールド)をフィルタリングに利用することができます。複数のフィールドを利用してフィルタリングする時、field_and_orで AND | OR を指定できます。

<mt:entries field:basename="1" field:basename2="1" field_and_or="OR">
<mt:entrytitle>
</mt:entries>

condition属性によるフィルタ

ver. 2.4から利用できるようになった conditions属性では複数の条件を柔軟に組み合わせてフィルタリングすることができます。以下の例はタイトルに「Welcome!」を含み(部分一致)、本文に「Story」を含み、公開日が2021年1月1日以前の記事に絞り込みます。

<mt:sethashvars name="conditions">
title=like,Welcome!
text=like,Story
published_on=lt,2021-01-01 00:00:00
</mt:sethashvars>
<mt:entries conditions="$conditions">
<mt:entrytitle>
</mt:entries>

conditions属性には「カラム名=フィルタ条件,フィルタの値」という形式でハッシュ変数を生成して渡します。

指定可能なフィルタ

フィルタ 説明
ct (like) Contains (含む)
nc Not Contains (含まない)
gt Greater Than (より大きい)
lt Less Than (より小さい)
ge Greater than or Equal (以上)
le Less than or Equal (以下)
eq Equal (等しい)
ne Not Equal (等しくない)
bw Begin with (から始まる)
ew End with (で終わる)

日付によるフィルタ

「mt:setcontext」ブロックタグを使うことで、日付によるフィルタリングを行うことができます。以下の例では2021年3月22日の記事のみを抽出します。尚、ver2.55で環境変数「weak_date_context」が追加されました。指定のある時、日付のフィルタリングは「published_on」カラムのみが対象となります。指定のないときは「published_on」カラムがあるときは published_on、ない場合は日付と時刻型の1つめのカラムでのフィルタリングとなります。

<mt:setcontext timestamp="20210322000000" timestamp_end="20210322235959">
<mt:entries>
<mt:entrytitle>
</mt:entries>
</mt:setcontext>

「mt:setcontext」ブロックによるリレーションでのフィルタ

ver.2.55未満のバージョンではリレーションによる絞り込みについても「mt:setcontext」ブロックタグを使います。こちらについては AND | OR | NOT指定はできません。

<mt:setcontext context="category" container="entry" label="プレスリリース">
<mt:entries>
<mt:entrytitle>
</mt:entries>
</mt:setcontext>
# id指定の場合
<mt:setcontext context="category" container="entry" id="カテゴリのID">
<mt:entries>
<mt:entrytitle>
</mt:entries>
</mt:setcontext>

カテゴリのように階層設定のあるモデルの場合、path属性を使うことができます。

<mt:setcontext context="category" container="entry" path="プレスリリース/PowerCMS X">
<mt:entries>
<mt:entrytitle>
</mt:entries>
</mt:setcontext>

カテゴリー:テンプレート作成Tips | 技術情報

投稿者:Junnama Noda

ブログ内検索

アーカイブ