Contents Management System

concrete5でページリストブロックの絞り込みをカスタマイズしてみた

concrete5

concrete5 でページリストブロックの検索結果をカスタマイズしなくてないけなくなったのでそのやり方をメモします。

この記事を書いた人

かみーゆ/フロントエンドエンジニア

セブ島在住の気ままな海外ノマドエンジニア。IT業界10年。テクニカルディレクター・エンジニア講師・ブリッジSEを経て今に至る。CMS concrete5エバンジェリスト。テックブログ以外も「磨耗しない人生の選択」や「海外生活」のライフスタイルについて発信。好きなものは肉とビール。

Read More

デフォルトでも十分優秀なページリストブロック

ページリストブロックはデフォルトでもとても優秀なブロックで、記事の一覧を出力するのによく重宝します。

多少、コードは書かないといけませんが、その学習コストを入れても十分使えます。

デフォルトのテンプレートで主にできること

  • 親ページで絞り込み
  • ページタイプで絞り込み
  • タグで絞り込み
  • トピックスで絞り込み
  • 並び替え
  • 日付で表示・非表示ページをコントロール
  • ページネーション

任意の属性で絞り込みをする ページリストブロックには変数$listの中に管理画面で設定した絞り込みの値が入ったものが渡ってます。

$list->getResults(); で結果を配列で出力でき$pagesに格納されています。

なので一旦、 filterByAttribute(); で属性での絞り込みを追加して、再度$list->getResults(); で絞り込み結果を再度 $pages(同じ変数名がやな人は変えてね)に代入すれば最小限の労力でカスタマイズできます。

$list->filterByAttribute(【属性名】, 【値】, "=");

ナビを出力したら以下のコードで絞り込みを追加します。

if (isset($_GET['value']) {
    //属性ハンドル取得
    $attrSet = h($_GET['attr']);

	foreach ($optionList as $key ) {

        if($key->value == h($_GET['value'])){
            // ジャンル名が同じものを出力
            $list->filterByAttribute($choumeiSet, $key->value, "=");
            break;
        }
    }

    $pages = $list->getResults();
}

あとは通常通り、 $pagesforeach で回せば絞り込みは完成です。ページネーションも変更する必要はありません。

おまけ

オプションリストで出力するともっと簡単 ちなみにオプションリスト(<select>とか<option>)で出力する場合は、以下のコードでもいけます。

勝手に出力してくれるのでめちゃめちゃ便利です。 ただしどんなコードがあらかじめ出力されるか把握した上で、コーディングしないと泣く羽目に遭いますよ。

$ak = CollectionAttributeKey::getByHandle('genre');
$ak->render('search');

複数の属性をまとめて扱いたいならセットに登録しよう

ページ属性はまとめてセットに登録することが可能です。 登録したデータをまとめて foreach で回せるので便利です。

$choumei_set = AttributeSet::getByHandle('[セット名]')->getAttributeKeys();

まとめ

実際に私が実装したのは複数の属性を作って絞り込んだのでもっと複雑でしたが、このくらいミニマムなものを改造してチャレンジすると敷居が低くて良いと思います。 もちろん、いろんな種類の属性でできます! 以下公式サイトのURLを見ながら、ぜひやってみるといいと思います。

参考サイト

PageList オブジェクトで検索・ソートを行う

「銀ねこアトリエ」のブログを定期購読しよう

Feedlyに登録する