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

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

concrete5

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

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

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

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

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

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

任意の属性で絞り込みをする ページリストブロックには変数$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を見ながら、ぜひやってみるといいと思います。

この記事を書いた人

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

資金ゼロからフィリピンで起業した海外ノマドエンジニア。IT業界10年以上でテクニカルディレクター(技術責任者)・エンジニア講師・ブリッジSEを経てLenzTechnologies Inc.を設立し、代表を務める。CMS concreteCMSエバンジェリスト。テックブログ以外も「磨耗しない人生」や「海外ノマド」のライフスタイルについて発信。好きなものは肉とハイボール。

参考サイト

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