質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

EC-CUBE2 価格帯の範囲検索をしたい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 85

ItoHiroki815

score 6

EC-CUBE2を使用したショッピングサイトの改修を行っております。

そこで「○○円~○○円」といった価格での範囲検索の実装をしようと思っております。

一応参考サイトがあったのでそちらを参考にしましたがなかなかうまくいかずに困っています。

【EC-CUBE2.13】商品名、カテゴリ、キーワード、価格帯、商品ステータス、規格で絞り込み検索ができる条件指定検索フォームページを作成
リンク内容

実際に記述したコードがこちらです。
検索は
/data/class/pages/products/LC_Page_Products_List.phpに元からあったものに追記した形になります。

    public function lfInitParam(&$objFormParam)
    {
        // 抽出条件
        // XXX カートインしていない場合、チェックしていない
        $objFormParam->addParam('カテゴリID', 'category_id', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('メーカーID', 'maker_id', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('商品名', 'name', STEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK'));
        $objFormParam->addParam('表示順序', 'orderby', STEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK'));
        $objFormParam->addParam('ページ番号', 'pageno', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('表示件数', 'disp_number', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('価格帯(下限)', 'price_range_lower', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('価格帯(上限)', 'price_range_upper', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));

        // カートイン
        $objFormParam->addParam('規格1', 'classcategory_id1', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('規格2', 'classcategory_id2', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('数量', 'quantity', INT_LEN, 'n', array('EXIST_CHECK', 'ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('商品ID', 'product_id', INT_LEN, 'n', array('ZERO_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('商品規格ID', 'product_class_id', INT_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));
    }

~

  /* 商品一覧の表示 */

    /**
     * @param SC_Product_Ex $objProduct
     */
    public function lfGetProductsList($searchCondition, $disp_number, $startno, &$objProduct)
    {
        $objQuery =& SC_Query_Ex::getSingletonInstance();

        $arrOrderVal = array();

        $colName = '';
        $tblName = '';

        // 表示順序
        switch ($this->orderby) {
            // 販売価格が安い順
            case 'price':
                $objProduct->setProductsOrder('price02', 'dtb_products_class', 'ASC');
                $colName = 'price02';
                $tblName = 'dtb_products_class';
                break;

            // 新着順
            case 'date':
                $objProduct->setProductsOrder('create_date', 'dtb_products', 'DESC');
                $colName = 'create_date';
                $tblName = 'dtb_products';
                break;

            // 売価順
            case 'selling_price':
                $objProduct->setProductsOrder('price01', 'dtb_products_class', 'DESC');
                $colName = 'price01';
                $tblName = 'dtb_products_class';
                break;

            // 利益率順
            case 'profit_late':
                $objProduct->setProductsOrder('point_rate', 'dtb_products_class', 'DESC');
                $colName = 'point_rate';
                $tblName = 'dtb_products_class';
                break;

            // 数量順
            case 'quantity':
                $objProduct->setProductsOrder('comment5', 'dtb_products', 'DESC');
                $colName = 'comment5';
                $tblName = 'dtb_products';
                break;

            // 数量順
            case 'orderby_asc':
                $objProduct->setProductsOrder($colName, $tblName, 'ASC');
                break;

            // 数量順
            case 'orderby_desc':
                $objProduct->setProductsOrder($colName, $tblName, 'DESC');
                break;

            default:
                if (strlen($searchCondition['where_category']) >= 1) {
                    $dtb_product_categories = '(SELECT * FROM dtb_product_categories WHERE '.$searchCondition['where_category'].')';
                    $arrOrderVal           = $searchCondition['arrvalCategory'];
                } else {
                    $dtb_product_categories = 'dtb_product_categories';
                }
                $col = 'MAX(T3.rank * 2147483648 + T2.rank)';
                $from = "$dtb_product_categories T2 JOIN dtb_category T3 ON T2.category_id = T3.category_id";
                $where = 'T2.product_id = alldtl.product_id';
                $sub_sql = $objQuery->getSql($col, $from, $where);

                $objQuery->setOrder("($sub_sql) DESC ,product_id DESC");
                break;
        }


~
        // 取得範囲の指定(開始行番号、行数のセット)
        $objQuery->setLimitOffset($disp_number, $startno);
        $objQuery->setWhere($searchCondition['where']);

        // 表示すべきIDとそのIDの並び順を一気に取得
        $arrProductId = $objProduct->findProductIdsOrder($objQuery, array_merge($searchCondition['arrval'], $arrOrderVal));

        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $arrProducts = $objProduct->getListByProductIds($objQuery, $arrProductId);

        // 規格を設定
        $objProduct->setProductsClassByProductIds($arrProductId);
        $arrProducts['productStatus'] = $objProduct->getProductStatus($arrProductId);

        return $arrProducts;
    }


~

/**
     * 表示用検索条件の設定
     *
     * @return array
     */
    public function lfGetSearchConditionDisp($arrSearchData)
    {
        $objQuery   =& SC_Query_Ex::getSingletonInstance();
        $arrSearch  = array('category' => '指定なし', 'maker' => '指定なし', 'name' => '指定なし' , 'price_range_lower' => '指定なし', 'price_range_upper' => '指定なし');
        // カテゴリ検索条件
        if ($arrSearchData['category_id'] > 0) {
            $arrSearch['category']  = $objQuery->get('category_name', 'dtb_category', 'category_id = ?', array($arrSearchData['category_id']));
        }

        // メーカー検索条件
        if (strlen($arrSearchData['maker_id']) > 0) {
            $objMaker = new SC_Helper_Maker_Ex();
            $maker = $objMaker->getMaker($arrSearchData['maker_id']);
            $arrSearch['maker']     = $maker['name'];
        }

        // 商品名検索条件
        if (strlen($arrSearchData['name']) > 0) {
            $arrSearch['name']      = $arrSearchData['name'];
        }

      // 価格帯検索条件
        if(strlen($arrSearchData['price_range_lower']) > 0){
          $arrSearch['price_range_lower'] = $arrSearchData['price_range_lower'];
        }
        if(strlen($arrSearchData['price_range_upper']) > 0){
          $arrSearch['price_range_upper'] = $arrSearchData['price_range_upper'];
        }


        return $arrSearch;
    }


~

        $dump = $arrSearchData['price_range_lower'];
        $tmpWhere = "";
        if ($arrSearchData['price_range_lower'] > 0) {
            $tmpWhere  .= " AND price02 >= ? ";
            $searchCondition['arrval'][] = $arrSearchData['price_range_lower'];
        }
        // 上限
        if ($arrSearchData['price_range_upper'] > 0) {
            $tmpWhere .= " AND price02 <= ? ";
            $searchCondition['arrval'][] = $arrSearchData['price_range_upper'];
        }

        if (strlen($tmpWhere) > 0) {
            $searchCondition['where'] .= ' AND alldtl.product_id IN ('
              . 'SELECT product_id FROM dtb_products_class '
              . 'WHERE product_id = alldtl.product_id AND del_flg = 0'
              . $tmpWhere
              . 'GROUP BY product_id'
              . ')';
        }

list.php はこちらです。

    <form name="form1" id="form1" method="get" action="?">
        <input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
        <input type="hidden" name="mode" value="<!--{$mode|h}-->" />
        <!--{* ▼検索条件 *}-->
        <input type="hidden" name="category_id" value="<!--{$arrSearchData.category_id|h}-->" />
        <input type="hidden" name="maker_id" value="<!--{$arrSearchData.maker_id|h}-->" />
        <input type="hidden" name="name" value="<!--{$arrSearchData.name|h}-->" />
        <input type="hidden" name="price_range_lower" value="<!--{$arrSearchData.price_range_lower|h}-->" />
        <input type="hidden" name="price_range_upper" value="<!--{$arrSearchData.price_range_upper|h}-->" />

        <!--{* ▲検索条件 *}-->
        <!--{* ▼ページナビ関連 *}-->
        <input type="hidden" name="orderby" value="<!--{$orderby|h}-->" />
        <input type="hidden" name="disp_number" value="<!--{$disp_number|h}-->" />
        <input type="hidden" name="pageno" value="<!--{$tpl_pageno|h}-->" />
        <!--{* ▲ページナビ関連 *}-->
        <input type="hidden" name="rnd" value="<!--{$tpl_rnd|h}-->" />
    </form><!--検索フォーム-->
        <!--{strip}-->

        <form name="advanced_search_form" id="advanced_search_form" method="get" action="<!--{$smarty.const.ROOT_URLPATH}-->products/list.php">
            <input name="mode" value="search" type="hidden">
            <input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
            価格帯
            <input type="number" name="price_range_lower" class="box140" maxlength="50" value="<!--{$smarty.get.price_range_lower|h}-->" /><input type="number" name="price_range_upper" class="box140" maxlength="50" value="<!--{$smarty.get.price_range_upper|h}-->" /><button type="submit" class="hover_change_image btn" name="search">検索</button>
        </form>
    </div>
    <!--{/strip}-->

一応はURLパラメータに値が入っているのは確認できてはいますが、
絞り込みができません。

何か書き間違いでもあるのでしょうか?
どなたかよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる