バージョン選択

フォーラム

メニュー

オンライン状況

49 人のユーザが現在オンラインです。 (39 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 49
もっと...

サイト内検索

質問 > フロント機能 > 価格帯で絞り込みたい

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
miqro
投稿日時: 2019/6/24 20:54
対応状況: 解決済
新米
登録日: 2019/6/24
居住地:
投稿: 9
価格帯で絞り込みたい
▼テンプレート
[EC-CUBE] EC-CUBEのバージョン、新規インストールかアップデートか、等
[レンタルサーバ] レンタルサーバ名
[OS] CentOS Linux release 7.6.1810
[PHP] 7.2.18
[データベース] 10.3.14-MariaDB
[WEBサーバ] Apache/2.4.6
[ブラウザ] chrome 75.0.3770.100
[導入プラグインの有無] 無し

初めての質問の為、足らない点がありましたらご指摘いただけると幸いです。

現在プラグインを作成しており、そのなかで商品価格で商品を絞り込む機能を実装したいと思っています。

実装するに当たり

$this->eventDispatcher->dispatch(EccubeEvents::FRONT_PRODUCT_INDEX_SEARCH, $event);

こちらのイベントに対し

$qb = $event->getArgument('qb');
$qb
  ->addSelect('MAX(pc.price02) as HIDDEN price02_max')
  ->andWhere('price02_max > :price_min')
  ->andWhere('price02_max < :price_max')
  ->setParameter('price_min', 1000)
  ->setParameter('price_max', 10000)
  ;

のようにしてみたのですが

Notice: Undefined index: price02_max

のエラーが発生してしまいます。
Eccube\Repository\ProductRepository::getQueryBuilderBySearchData()を見る限り、orderBy()には使えてるので問題ないと思ったのですがこれ以上の解決方法が見つからないためこちらで質問した次第です。

宜しくお願いします。

tao_s
投稿日時: 2019/6/26 9:56
対応状況: −−−
仙人
登録日: 2008/8/20
居住地: 東京
投稿: 796
Re: 価格帯で絞り込みたい
これだと、普通に pc.price02 > :price_max とかで良くないですか?
MAX()がいらないかな?と


----------------
EC-CUBEカスタマイズ相談してください。
緊急のEC-CUBEの障害対応
EC-CUBEカスタマイズブログ

miqro
投稿日時: 2019/6/27 15:52
対応状況: −−−
新米
登録日: 2019/6/24
居住地:
投稿: 9
Re: 価格帯で絞り込みたい
お返事ありがとうございます。

ec-cube\src\Eccube\Repository\ProductRepository.php::getQueryBuilderBySearchData

上記ファイルで仮に価格高い順もしくは低い順が選択されていたとき


        if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == $config['eccube_product_order_price_lower']) {
            //@see http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html
            $qb->addSelect('MIN(pc.price02) as HIDDEN price02_min');
            $qb->innerJoin('p.ProductClasses', 'pc');
            $qb->andWhere('pc.visible = true');
            $qb->groupBy('p.id');
            $qb->orderBy('price02_min', 'ASC');
            $qb->addOrderBy('p.id', 'DESC');
        // 価格高い順
        } elseif (!empty($searchData['orderby']) && $searchData['orderby']->getId() == $config['eccube_product_order_price_higher']) {
            $qb->addSelect('MAX(pc.price02) as HIDDEN price02_max');
            $qb->innerJoin('p.ProductClasses', 'pc');
            $qb->andWhere('pc.visible = true');
            $qb->groupBy('p.id');
            $qb->orderBy('price02_max', 'DESC');
            $qb->addOrderBy('p.id', 'DESC');
        // 新着順
        }


の処理が走りますが、もしMAX()を使わないとなると、規格が2つ存在する商品の場合、どちらのprice02を評価するか分からなくないですか?


それとMAX()指定をしたカラムはwhere文から参照できないみたいですね、なので今回は以下のように対応してみました。


// EccubeEvents::FRONT_PRODUCT_INDEX_SEARCHでのイベントフック

      // $subを2回使おうとしましたが、別名の重複で出来ませんでした。 
            $sub = $this->ProductClassRepository->createQueryBuilder('sub1');
            $sub
                ->select('MAX(sub1.price02)')
                ->where('sub1.Product = p.id')
                ;

            $sub2 = $this->ProductClassRepository->createQueryBuilder('sub2');
            $sub2
                ->select('MAX(sub2.price02)')
                ->where('sub2.Product = p.id')
                ;

              $qb
                ->andWhere(sprintf('(%s)', $sub->getDQL()).' >= :price_min')
                ->andWhere(sprintf('(%s)', $sub2->getDQL()).' <= :price_max')
                ->setParameter('price_min', $min)
                ->setParameter('price_max', $max)
                ;


もっとスマートに出来ればいいんですが・・・。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,286名です
総投稿数は109,688件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.