maki-o memo

制作に関する私的なメモです

a-blog cmsでややこしいフィルタリングを実装する

a-blog cmsでフィルタリングをする場合、カスタムフィールドで実現することが多いとおもいます。

ふつうにカスタムフィールドでフィルタリングする

例えば、都道府県などで実装するとして、カスタムフィールド名をprefとします。

その場合、/field/pref/aichi/などとして、URLコンテキストで表示させてもいいのですが、今回は
/?pref=aichi
として表示してみます。

この場合、prefというのが内部の処理でグローバル変数として処理されるので、%{pref}として取得が可能になります。
モジュールIDに設定するとこうなります。


pref/eq/%{pref}

ここまではOKかと思います。

その後「仕様が追加になりまして、、」

例えば、「エリアでもフィルタリングしたい」などという追加仕様が発生した場合を想定します。
「中部」とか「関東」とかの粒度でフィルタリングしたいとします。

そうなると、別途、エリアのカスタムフィールドを作成して、エントリー毎に再度設定して、、、
とかいう話になってしまいそうですが、すでに大量のエントリーを投入済みとか、運用的にエントリー毎にエリア系のカスタムフィールドを2つ設定してとかになると、めんどうだったり間違って設定とかも出てきてしまいそうです。
(これの実案件はエリアのカスタムフィールド増やすのがNGでした)

理想的なのは、すでに投入済みの都道府県のカスタムフィールドを適宜判断して、
/?area=chubu
とゆうようなURLでアクセスできるとよさそうです。

先にモジュールIDの設定を考える

先にモジュールIDでどうしたらいいかを考えます。
抽出したいのはprefでの値なので、モジュールIDの設定は先ほどと同じく、
prefを絡めた設定になるような気がします。

となると、
pref/aichi/gifu/mie/shizuoka/
とか
pref/re/^(aichi|gifu|mie|shizuoka)$
とかでいけそうです。

ということは、/?area=chubuの場合、%{area}がなんとか
aichi/gifu/mie/shizuoka
とか
^(aichi|gifu|mie|shizuoka)$
になればよさそうです。

グローバル変数を作成する

この場合、まずグローバル変数を作成します。
公式の作成の仕方はこちら

グローバル変数の作り方

そしてextendsGlobalVars内に、以下のようなコードを書きます。
今回、正規表現での抽出(pref/re/^(aichi|gifu|mie|shizuoka)$)方法になります。

$globalVars->set('area_chubu', '^(aichi|gifu|mie|shizuoka)$');

こうすると、%{area_chubu}とテンプレートに書くと、
^(aichi|gifu|mie|shizuoka)$
と出力されるようになります。

あれ?
%{area}をどうにかするんでないの?
%{area_chubu}つくってどうすんの?とお思いかもしれませんが、
これをこうします。


pref/re/%{area_%{area}}ですね。
ここが今回のキモになりますが、グローバル変数って入れ子で動くんです。
この設定が内部から評価されて、めでたく、
pref/re/^(aichi|gifu|mie|shizuoka)$
になるわけです。

お試しください。
公式の仕様ではないようですが、挙動が変わったらごめんなさい。
(動作確認は2.6.1.1で行っています)

現場からは以上です


プロフィール

フロントエンドエンジニア

Tomokazu Makita

名古屋でフリーランスでWeb制作してます。 フロントエンドのことを主にやってます。
a-blog cmsを使用したサイト制作が得意です。
お仕事のご相談随時受付中。

雪山大すき。冬は雪山の合間に仕事します。
財布はいつも吹雪です。

エントリーリスト

タグ