複数のモデルのデータをマージしてソート出力する (MixedObjectsプラグイン)

MixedObjectsプラグインを利用すると複数のモデルのオブジェクトを1つにマージしてループ出力することができます。このプラグインは次のバージョンにて提供する予定のものですが、こちらから先行してダンロード( MixedObjects.zip (7.9KB) )していただけます。

テンプレート・タグ

ブロックタグ

mt:mixedobjects

models 属性または params属性のキーに指定した複数のモデルのオブジェクトを1つにマージしてループ出力します。
models 属性または params属性のどちらかが必須です。params属性を省略した時、読み込まれるのは idカラムとプライマリカラムの値、sort_by属性指定のあるときはそのカラムとなります。
このタグは LivePreview には対応していません。

予約変数

  • __model__ : オブジェクトのモデル名
  • __first__ : ループの初回に1がセットされます
  • __last__ : ループの最終回に1がセットされます
  • __odd__ : ループの奇数回に1がセットされます
  • __even__ : ループの偶数回に1がセットされます
  • __counter__ : ループのカウンター(1から始まる)
  • __index__ : 'var'属性が与えられた時、ループのカウントがセットされます
  • __total__ : ループの総回数がセットされます(配列またはオブジェクトの数)

タグ属性

  • models : モデル名の配列またはカンマ区切りテキスト
  • params : モデル名をキー、カラム名を値にした配列(ハッシュ)
  • conditions : モデル名をキー、フィルタ条件のカンマ区切りテキストを値にした配列(ハッシュ)
  • prefix : 変数のプレフィックス(省略時'object')
  • set_context : ループのオブジェクトのコンテキストをセットする
  • include_draft : オブジェクトが'status'カラムを持つ時、公開されていない下書きなどのオブジェクトを含む
  • offset : N番目からリストを開始する(Nは正の整数)
  • limit : 表示する件数(数値)
  • sort_by : 指定のカラム値でオブジェクトをソートする
  • sort_order : 'ascend(昇順)' または 'descend(降順)'
  • glue : 繰り返し処理の際に指定された文字列で各ブロックを連結する
  • include_workspaces : オブジェクトに'workspace_id'カラムが存在する時、指定のスペースに存在するオブジェクトに絞り込む(カンマ区切りの数字または'this'または'all'または'children')
  • exclude_workspaces : オブジェクトに'workspace_id'カラムが存在する時、指定のスペースに存在しないオブジェクトに絞り込む(カンマ区切りの数字)
  • workspace_id : スペースIDでの絞り込み
  • workspace_ids : 'include_workspaces'のエイリアス

ビューの記述例

  • 以下の例では、記事/ページ/アセットモデルを公開日(published_on)カラムの値で降順に5件読み込みます。
  • 2つ目以降のモデルの指定カラム名に関わらず、最初に指定したモデルのカラム名で変数に格納されます(assetモデルの labelの値は object_labelではなく object_title変数に格納されます)。
  • ハッシュでモデル名とカラム名を指定する時、カラム名'id'は省略可能です。

    <mt:sethashvars name="params">
    entry=title,published_on
    page=title,published_on
    asset=label,published_on
    </mt:sethashvars>
    <mt:mixedobjects params="$params" sort_by="published_on" limit="5" sort_order="descend" set_context="1">
      <mt:if name="__first__"><ul></mt:if>
      <li>
      <mt:if name="__model__" eq="entry">
        <a href="<mt:entrypermalink>">
      <mt:elseif name="__model__" eq="page">
        <a href="<mt:pagepermalink>">
      <mt:elseif name="__model__" eq="asset">
        <a href="<mt:assetfileurl>">
      </mt:if>
        <mt:var name="object_title">(<mt:var name="__model__"> : ID <mt:var name="object_id">)
        </a>
      </li>
      <mt:if name="__last__"></ul></mt:if>
    </mt:mixedobjects>
    

または、

    <mt:mixedobjects models="entry,page,asset" sort_by="published_on" limit="5" sort_order="descend" set_context="1">
      <mt:if name="__first__"><ul></mt:if>
      <li>
      <mt:if name="__model__" eq="entry">
        <a href="<mt:entrypermalink>">
      <mt:elseif name="__model__" eq="page">
        <a href="<mt:pagepermalink>">
      <mt:elseif name="__model__" eq="asset">
        <a href="<mt:assetfileurl>">
      </mt:if>
        <mt:var name="object_title">(<mt:var name="__model__"> : ID <mt:var name="object_id">)
        </a>
      </li>
      <mt:if name="__last__"></ul></mt:if>
    </mt:mixedobjects>

この時、発行されるSQLは以下のようになります(システムスコープのビューの場合)。

(SELECT entry_id,entry_title,entry_published_on,'entry' AS table_name FROM mt_entry WHERE entry_rev_type=0 AND entry_status=4 AND entry_workspace_id = 0)
    UNION
(SELECT page_id,page_title,page_published_on,'page' AS table_name FROM mt_page WHERE page_rev_type=0 AND page_status=4 AND page_workspace_id = 0)
    UNION
(SELECT asset_id,asset_label,asset_published_on,'asset' AS table_name FROM mt_asset WHERE asset_rev_type=0 AND asset_status=4 AND asset_workspace_id = 0)
    ORDER BY entry_published_on DESC LIMIT 5

フィルタ条件 conditions の指定の仕方

各モデルをフィルタ指定する条件をモデルに対して1つずつ conditions 属性で渡すことができます。
キーにモデル名、値に「カラム名,条件,フィルタする値」を指定した配列(ハッシュ)として渡してください。

    <mt:sethashvars name="conditions">
    entry=title,ct,PowerCMS X
    page=title,ct,PowerCMS X
    asset=label,ct,PowerCMS X
    </mt:sethashvars>

    <mt:mixedobjects params="$params" sort_by="published_on" limit="5"  sort_order="descend" conditions="$conditions" set_context="1">
    〜
    </mt:mixedobjects>
条件 説明
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 (で終わる)