EC-CUBEのコアを変更する事なく商品の検索条件を追加をしてみます
こんにちは。
エンジニアチームのTです。
eccubeには、symfony由来のイベントやルーティングの上書き等、eccubeをカスタマイズする上で便利な仕組みが多数用意されています。
そこで、今回はリポジトリのカスタマイズを取り上げようと思います。
(リポジトリは、データベースのやり取りを管理するクラスになります。)
例えば、フロントで会員限定の商品だけを商品一覧で表示したい等の利用シーンに使えます。
通常であれば、ルーティングの上書きや、それが厳しい場合は、最終手段のコアファイルをいじるになりますが、リポジトリのカスタマイズを使うことによってシンプルに記述することが可能になります。
以下ソースコード
(※会員限定のフラグカラムはデフォルトで商品に無いので、eccubeドキュメントのEntityのカスタマイズを参考に製品テーブルにフラグカラムを追加する必要がありますので、このままだと動きません。あくまで参考程度に留めてください。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php namespace Customize\Repository; use Eccube\Doctrine\Query\QueryCustomizer; use Eccube\Repository\QueryKey; use Doctrine\ORM\QueryBuilder; class ProductWhereAdd implements QueryCustomizer { public function customize(QueryBuilder $builder, $params, $queryKey) { if(!empty($params["orderby"]) && $params["orderby"]->getId() === 4) { $builder->andWhere("p.only_member = 1"); } } public function getQueryKey(): string { return QueryKey::PRODUCT_SEARCH; } } |
まずQueryCustomizerクラスをインターフェイスしてきて、customizeとgetQueryKeyメソッドを実装します。
keyに関しては下記のドキュメントを参照してください。管理画面の検索条件を変更するキーなども用意されています。
このサンプルでは「PRODUCT_SEARCH」を指定しているので、フロントで検索した際に、customizeメソッドが起動します。
「builder」引数に検索条件が入っているので、そこに検索条件を追加するandWhereメソッドを実行して会員限定フラグが1の商品だけを抜き出すという処理を書くことで、会員限定の商品だけを取得できるようになります。
また、なぜ、直接処理を書き換えないのかと言うとeccubeのコアファイルを弄ると、今後のアップデートが困難になるので、なるだけコアを弄ることが無いカスタマイズをする必要があるのかなと感じています。
他にもコアを弄らずに、カスタマイズできる余地をeccube側で用意してくれているので機会があれば、ブログに書こうと思いました。