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で行っています)
現場からは以上です
- tag
- a-blog_cms
- カスタマイズ
- tips
- グローバル変数