Labo

[EC-CUBE 2.12.4] 管理画面の商品検索項目にメーカーを追加

2013年06月01日 / 投稿者名:fukap


今回は以下のように商品マスターで商品検索する際に、メーカーで検索できるようにしてみます。

 

 

1.data/Smarty/templates/admin/products/index.tpl でメーカー欄を追加する。

<tr>
    <th>メーカー</th>
    <td colspan="3">
        <!--{assign var=key value="search_maker_id"}-->
        <span class="attention"><!--{$arrErr[$key]}--></span>
        <select name="<!--{$key}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->">
        <option value="">選択してください</option>
        <!--{html_options options=$arrMaker selected=$arrForm[$key].value}-->
        </select>
    </td>
</tr>

 

2.data/class/pages/admin/products/LC_Page_Admin_Products.php の Init でコード追加。

$masterData = new SC_DB_MasterData_Ex();
$this->arrPageMax = $masterData->getMasterData('mtb_page_max');
$this->arrDISP = $masterData->getMasterData('mtb_disp');
$this->arrSTATUS = $masterData->getMasterData('mtb_status');
$this->arrPRODUCTSTATUS_COLOR = $masterData->getMasterData('mtb_product_status_color');
//以下の行を追加
$this->arrMaker = SC_Helper_DB_Ex::sfGetIDValueList('dtb_maker', 'maker_id', 'name');

 

3.同じくdata/class/pages/admin/products/LC_Page_Admin_Products.php の lfInitParam でコード追加。

// 検索条件
$objFormParam->addParam('商品ID', 'search_product_id', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('商品コード', 'search_product_code', STEXT_LEN, 'KVna', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('商品名', 'search_name', STEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('カテゴリ', 'search_category_id', STEXT_LEN, 'n', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
$objFormParam->addParam('種別', 'search_status', INT_LEN, 'n', array('MAX_LENGTH_CHECK'));
// 以下の行を追加
$objFormParam->addParam('メーカー', 'search_maker_id', STEXT_LEN, 'n', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));

 

4.同じくdata/class/pages/admin/products/LC_Page_Admin_Products.php の buildQuery でコード追加。

// 商品ステータス
case 'search_product_statuses':
    $arrPartVal = $objFormParam->getValue($key);
    $count = count($arrPartVal);
    if ($count >= 1) {
        $where .= ' '
            . 'AND product_id IN ('
            . '    SELECT product_id FROM dtb_product_status WHERE product_status_id IN (' . SC_Utils_Ex::repeatStrWithSeparator('?', $count) . ')'
            . ')';
        $arrValues = array_merge($arrValues, $arrPartVal);
    }
    break;
// メーカー(以下の行を追加)
case 'search_maker_id':
    $where.= ' AND maker_id = ?';
    $arrValues = $objFormParam->getValue($key);
    break;

[EC-CUBE 2.12.4] 管理画面の商品検索項目にメーカーを追加 への9件のコメント

  1. me より:

    はじめまして
    こちらを拝見し、商品検索内にメーカーを出せるようになりました!
    ありがとうございます。

    そこで質問なのですが、こちらを受注管理画面内で同じように再現する事は可能なのでしょうか?
    いじってみてもエラーばかりなのでお教えいただけると幸いです

  2. chiharu より:

    ご質問有難う御座います。
    基本的には受注管理画面内でも同じような処理は可能です。
    但し、実際には検索を行うテーブルが異なるため少し変更が必要です。

    当ブログ内容の以下の部分に当たる個所が「受注管理画面」にも存在しています。
     4.同じくdata/class/pages/admin/products/LC_Page_Admin_Products.php の buildQuery

    該当部分のメーカーに値する個所を以下の様に変更していただくことで
    とりあえずは再現できるのではないでしょうか。

    // メーカー
    case 'search_maker_id':
        $where .= ' AND order_id IN ('
               .  '    SELECT order_id FROM dtb_order_detail '
               .  '    Left Join dtb_products On dtb_products.product_id = dtb_order_detail.product_id '
               .  '    WHERE dtb_products.maker_id = ? '
               .  ')';
        $arrValues = $objFormParam->getValue($key);
        break;
    

    一度お試し下さい。

  3. me より:

    素人への質問にお答えいただきありがとうございます。
    ご指導いただいた文を受注管理の方へ追加する事で無事対応できました!
    1つ目は解決出来て2つも質問するのはおこがましいのですが、こちら検索結果に表示するためには受注管理のindex.tplへmaker_idを表示させる記述をするだけでは難しいのでしょうか?

  4. me より:

    上記の質問は別途カスタマイズになってしまうと思うのでお答えいただかなくて大丈夫です!失礼いたしましたm(__)m
    ここへ書いてある文での質問なのですが、こちら検索項目を複数指定しますと以下のようなエラーが出るのですが、こちらは解決できますでしょうか?
    Fatal error(E_USER_ERROR): DB処理でエラーが発生しました。
    SQL: [PREPARE mdb2_statement_mysql_10525c03ec81c76374af6a807bc77ee8b21ea0b27e FROM ‘SELECT COUNT(*) FROM dtb_order WHERE del_flg = 0 AND (payment_id = ?) AND order_id IN ( SELECT order_id FROM dtb_order_detail Left Join dtb_products On dtb_products.product_id = dtb_order_detail.product_id WHERE dtb_products.maker_id = ? ) ‘]
    PlaceHolder: [‘1’]
    MDB2 Error: not found
    [Error message: Unable to bind to missing placeholder: 1]

    宜しくお願いいたします

  5. me より:

    連投失礼いたします。
    上記の質問解決されました!
    勉強になる情報ありがとうございました☆

  6. chiharu より:

    紆余曲折あったようですが無事に動作したようでよかったです。

    > 1つ目は解決出来て2つも質問するのはおこがましいのですが、
    > こちら検索結果に表示するためには受注管理のindex.tplへmaker_idを
    > 表示させる記述をするだけでは難しいのでしょうか?

    また、上記ご配慮頂き有難う御座います。
    念のため難しいかどうかをのみご返答させて頂きます。

    現時点では少々難しい状況ではないかと思います。

    一覧を表示するための情報取得となっている為、受注詳細の
    商品情報に関して取得している部分が有りません。
    そのため、メーカー情報の取得元ロジックを作成する必要があります。

    また、複数商品を購入した場合、どの商品に対するメーカー
    であるかを表示する必要も発生するため、一覧に表示するには
    領域が足りないと云った問題も発生します。

    なお、弊社にて各種カスタマイズも対応しております。
    必要であれば、株式会社ナックウェブまでご連絡下さい。

  7. mash より:

    はじめまして。
    こちらの記事を拝見し、同様のカスタマイズを行ったところ、
    「メーカー名」のみ条件指定して検索すると動作するのですが、
    「メーカー名」と他の条件を指定すると、システムエラーになってしまい悩んでおります。

    状態としては、me様がご自身で解決なされたものと同じ現象だと思うのですが、
    どのように解決されたのか分からず困っております。
    何かアドバイスいただけないでしょうか?
    よろしくお願いいたします。

  8. yuzu より:

    ご質問いただきありがとうございます。
    システムエラーが出る原因といたしまして、検索パラメータを確保する領域が配列になっていないため起こるエラーかと思われます。
    そのため以下のように変更していただくことで解決するのではないかと思われます。

    // メーカー
    case 'search_maker_id':
        $where .= ' AND order_id IN ('
               .  '    SELECT order_id FROM dtb_order_detail '
               .  '    Left Join dtb_products On dtb_products.product_id = dtb_order_detail.product_id '
               .  '    WHERE dtb_products.maker_id = ? '
               .  ')';
        $arrValues[] = $objFormParam->getValue($key);
        break;
    
  9. mash より:

    質問にご回答いただき、ありがとうございます。
    ソースまでご提示いただき、ありがとうございました。
    結果、無事解決できました。
    配列になっていなかったのが原因だったのですね。勉強になりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

* Copy This Password *

* Type Or Paste Password Here *

*

コメント欄にコードを挿入したい場合は、[php][/php] を使ってください。