バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > フロント機能 > 検索項目に在庫あり商品のみを検索するチェックボックスを追加したい

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ゲスト
投稿日時: 2017/12/18 18:57
対応状況: 解決済
検索項目に在庫あり商品のみを検索するチェックボックスを追加したい
[EC-CUBE] 3.0.15
[PHP] 7.1.2
[データベース] PostgreSQL 9.6.6

はじめまして。初めてEC-CUBE3開発の世界に足を踏み入れたばかりの初心者です。umebius様の投稿を参考に商品項目を追加し、その項目で検索できるようにまではカスタマイズできました。ありがとうございます。

現在、フロント画面の検索項目にチェックボックスを加え、チェックを入れて検索した場合は検索結果に在庫あり商品のみを表示させたくトライしていますが、うまく行きません。どなたかご教示いただけませんでしょうか。

やったこととしては、
1. src/Eccube/Form/Type/SearchProductBlockType.php
とsrc/Eccube/Form/Type/SearchProductType.php
のfunction buildForm(FormBuilderInterfaceに↓を追加
        $builder->add('stock_available', 'checkbox', array(
            'label' => '在庫あり商品のみを検索',
            'multiple'=> true,
            'required' => false,
        ));


2. src/Eccube/Resource/template/default/Block/search_product.twig
のbuttonの前に
{{ form_widget(form.stock_available) }}

を追加

までで、
3. src/Eccube/Repository/ProductRepository.php
の、getQueryBuilderBySearchData($searchData)の部分だと思いますが、最も大事な検索ロジックをどのように書くべきかわからず、つまずいています。

該当商品の規格別の在庫を調べて、1つでも在庫がある場合は在庫あり商品として表示させたいのですが、2日くらいトライしていますが、解決できず・・・どなたかヘルプいただけませんでしょうか。
umebius
投稿日時: 2017/12/19 19:59
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 検索項目に在庫あり商品のみを検索するチェックボックスを追加したい
Admin/AdminControllerのcountNonStockProductsで
在庫なし商品の数をカウントしていますが、参考になるのではないでしょうか。


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

ゲスト
投稿日時: 2017/12/23 12:19
対応状況: −−−
Re: 検索項目に在庫あり商品のみを検索するチェックボックスを追加したい
umebius様
ご返信ありがとうございます!umebius様の記事やこちらへの投稿をいつも参考にさせてもらっています。
その後まだ解決できずにおります。そもそも
SearchProductBlockType.phpとSearchProductType.phpに記載していた内容がおかしかったのか、そもそもフォームが正常に表示されなかったので下記のように直しました。

        $stock_available_arr = array('1' => '在庫あり商品のみを検索');
        $builder->add('stock_available', 'choice', array(
            'choices' => $stock_available_arr,
            'label' => '在庫あり商品のみを検索',
            'required' => false,
            'expanded' => true,
            'multiple' => true,
            'mapped' => false,
        ));

また、ProductRepository.phpの方はQureyBuilderに使う条件は後で考えるとして、試しに
        if (!empty($searchData['stock_available']) && count($searchData['stock_available']) > 0) {
            $qb
                ->andWhere('p.id > 4')//仮にproduct_idが3や4の商品が表示されないかテスト
                ->setParameter('StockAvailable', $searchData['stock_available']);
        }

このように適当に設定してみたのですが、product_idが3や4の商品も検索結果に表示されてしまうので、そもそもうまく動作していないようです...。

ご教示いただきました在庫なし商品数のカウントの件、ありがとうございます!
stock_statusが既に定義されているようですので、$qbの条件にはこちらを使えないか試してみたいと思います。
ゲスト
投稿日時: 2017/12/25 16:05
対応状況: −−−
Re: 検索項目に在庫あり商品のみを検索するチェックボックスを追加したい
自己解決できましたので報告させていただきます。
最初の投稿や2件目の投稿で誤っている事を記載してしまっていましたのでお恥ずかしい限りです。

1. src/Eccube/Form/Type/SearchProductBlockType.phpのfunction buildForm(FormBuilderInterfaceに↓を追加
        $builder->add('stock_available', 'choice', array(
            'label' => '在庫あり商品のみを検索',
            'required' => false,
            'choices' => array(
                '1' => '在庫あり商品のみを検索',
            ),
            'expanded' => true,
            'multiple' => true,
            'empty_value' => false,
        ));


2. src/Eccube/Form/Type/SearchProductType.phpのfunction buildForm(FormBuilderInterfaceに↓を追加
        $builder->add('stock_available', 'choice', array(
            'label' => '在庫あり商品のみを検索',
            'required' => false,
            'choices' => array(
                '1' => '在庫あり商品のみを検索',
            ),
//            'expanded' => true,
            'multiple' => true,
            'empty_value' => false,
        ));

1.との違いは'expanded' => true,をコメントアウトしている点です。こちらをコメントアウトしないと、検索後に並び替えや表示件数の変更を行うと検索条件が維持されず、在庫のない商品も表示されてしまいます。

3. src/Eccube/Resource/template/default/Block/search_product.twig
のbuttonの前に↓を追加
{{ form_widget(form.stock_available) }}


これでフォームが表示されるようになりました。

4. src/Eccube/Repository/ProductRepository.php の、public function getQueryBuilderBySearchData($searchData)
の中に↓を追加
        // 在庫ありのみ検索
        if (!empty($searchData['stock_available']) && count($searchData['stock_available']) > 0) {
            $qb
                ->andWhere('pc.stock_unlimited = :stock_available OR pc.stock > 0')
                ->setParameter('stock_available', $searchData['stock_available']);
        }

です。

できてみるとなんでこんなことに何日も頭を悩ませたんだろうかと思います。umebius様、コメントありがとうございました。おかげ様でEC-CUBEの理解が更に深まりました。今後ともよろしくお願いいたします。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


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

統計情報

総メンバー数は89,665名です
総投稿数は110,149件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1657
8
red
1570
9
mcontact
1326
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
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.