今回は商品一覧ページに「特定の商品」を表示させない方法についてです。
切掛けは知り合いから商品一覧ページに特定の商品だけ表示させないように出来ないかとの質問を受けたことです。
まぁ、理由はいろいろとあると思いますので詳しくは聞いていませんが興味もありましたので実験してみました。
方法はいろいろとあると思いますができれば変更部分は少ない方が良いと思います。
勿論「楽だから」と云う理由が大半ではありますが、変更部分を最小限にした方が不具合も少ないと云うことも事実です。
そんな言い訳をもとに最小限での対応を試してみましょう。
まず、特定の商品のせんたくについてですが「タグ」機能を利用したいと思います。
商品には「タグ」と云う項目を設定可能です。
※EC-CUBE 2系の時には「商品ステータス」と云う名前でしたが、色々紛らわしいため名称が変更されたようですね。
ご存知の方も多いと思いますがタグ情報は以下の個所にて追加・変更が可能です。
「管理画面 > 設定 > システム情報設定 > マスターデータ管理」の「mtb_tag」
事前準備として上記設定画面にて特定の商品と見なすためのタグを作成しておきましょう。
例えば以下のような形です。
「4 : 特別商品」
※
商品詳細ページなどで上記タグは表示されますので文言にはこだわってください。
今回は適当に決めてますが(笑)
準備が整ったら確認して行きましょう。
■商品一覧ページに特定の商品を表示させない方法
●ファイル
<インストールフォルダ>/src/Eccube/Repository/ProductRepository.php
●モジュール
getQueryBuilderBySearchData
●参考行目
97行目ぐらいから
●変更内容
$qb = $this->createQueryBuilder('p') ->andWhere('p.Status = 1'); // category $categoryJoin = false; if (!empty($searchData['category_id']) && $searchData['category_id']) { $Categories = $searchData['category_id']->getSelfAndDescendants(); if ($Categories) { $qb ->innerJoin('p.ProductCategories', 'pct') ->innerJoin('pct.Category', 'c') ->andWhere($qb->expr()->neq('pct.Category', ':Categories')) ->setParameter('Categories', $Categories); $categoryJoin = true; } }
↓
$qb = $this->createQueryBuilder('p') ->andWhere('p.Status = 1'); // tag $qb ->leftJoin('p.ProductTag', 'custom_pt', 'WITH', 'custom_pt.Tag = 4') ->andWhere($qb->expr()->isNull('custom_pt.Tag')); // category $categoryJoin = false; if (!empty($searchData['category_id']) && $searchData['category_id']) { $Categories = $searchData['category_id']->getSelfAndDescendants(); if ($Categories) { $qb ->innerJoin('p.ProductCategories', 'pct') ->innerJoin('pct.Category', 'c') ->andWhere($qb->expr()->neq('pct.Category', ':Categories')) ->setParameter('Categories', $Categories); $categoryJoin = true; } }
●概要説明
今回は変更と云うより内容の追加です。
商品一覧用の情報を取得する際に条件を追加してしまおうと云う考え方です。
追加した行はコメントも含めて4行です。
重要なのはメソッドチェーンにて記述した後半の2行です。
簡単に解説すると以下のような形となります。
->leftJoin('p.ProductTag', 'custom_pt', 'WITH', 'custom_pt.Tag = 4')
通常では商品一覧の検索条件にはタグ情報は含まれません。
その為、タグ情報を保有しているタグテーブル(dtb_producr_tag)を JOIN します。
その際の注意点ですが、タグは商品に対して 1:多 の関係姓を持ちます。
今回対象としていないタグも存在しているため、そのまま JOIN すると不具合が発生しがちです。
「’WITH’」と条件となる「’custom_pt.Tag = 4’」指定して他のタグの影響を受けない様にしましょう。
※文中に指定している「4」は事前準備で指定したタグIDを指定して下さい。
->andWhere($qb->expr()->isNull('custom_pt.Tag'));
先ほど連結した情報に対して指定したタグ情報が存在しない商品のみを抽出しています。
先ほどの JOIN 指定時に LEFT JOIN を指定しているため、特定のタグが無い場合はタグ情報が NULL となります。
その為今回の抽出条件は isNull にて行う形です。
まぁ、例によってプラグインでは無いのですが、バージョンアップをしない前提であれば問題無いかもしれません。
一度お試しください。
と云うことで今回はこれで終了とさせて頂きます。