EC-CUBE 商品マスタの在庫を一括操作する

■商品マスタの在庫を一括操作する

販売価格の一括操作と同様2ファイルを編集したら実現できる

手順:
ビューファイル『index.php』に更新ボタンと価格を入力するためのテキストフィールドを用意する
拡張クラスの商品マスタファイル『LC_Page_Admin_Products_Ex.php』に処理を実装する

■ビューファイル『index.php』に更新ボタンと価格を入力するためのテキストフィールドを用意する

  <a class="btn-tool" href="javascript:;" onclick="eccube.setModeAndSubmit('csv','',''); return false;">CSV ダウンロード</a>
  <a class="btn-tool" href="../contents/csv.php?tpl_subno_csv=product">CSV 出力項目設定</a>
  <a class="btn-tool" href="javascript:;" onclick="eccube.setModeAndSubmit('set_price_update','',''); return false;">価格を一括更新</a>
  <!--一括更新ボタンを設置する-->
  <a class="btn-tool" href="javascript:;" onclick="eccube.setModeAndSubmit('set_stock_update','',''); return false;">在庫を一括更新</a>


    ・・・


                            <!--{* 在庫 *}-->
                            <!--{* XXX 複数規格でかつ、全ての在庫数量が等しい場合は先頭に「各」と入れたれたら良いと思う。 *}-->
                            <td class="menu" rowspan="2">
                                <!--{if $arrProducts[cnt].has_product_class != true}-->
                                  <input type="text" style="width:60px;" name="stock_<!--{$arrProducts[cnt].product_id}-->" value="<!--{if $arrProducts[cnt].stock_unlimited_min}-->無制限<!--{else}--><!--{$arrProducts[cnt].stock_min|number_format}--><!--{/if}-->">
                                <!--{else}-->
                                    <!--{if $arrProducts[cnt].stock_unlimited_min}-->無制限<!--{else}--><!--{$arrProducts[cnt].stock_min|number_format}--><!--{/if}-->
                                    <!--{if $arrProducts[cnt].stock_unlimited_min != $arrProducts[cnt].stock_unlimited_max || $arrProducts[cnt].stock_min != $arrProducts[cnt].stock_max}-->
                                        <br>~<br><!--{if $arrProducts[cnt].stock_unlimited_max}-->無制限<!--{else}--><!--{$arrProducts[cnt].stock_max|number_format}--><!--{/if}-->
                                    <!--{/if}-->
                                <!--{/if}-->

                            </td>

■拡張クラスの商品マスタファイル『LC_Page_Admin_Products_Ex.php』に処理を実装する

  /**
   * Page のアクション.
   *
   * @return void
   */
  public function action()
  {
    parent::action();
    
    switch ($this->getMode()) {
      case 'set_stock_update':
        $arr_products = array();
        
        foreach($_POST as $key=>$data)
        {
          $id = preg_replace('/stock_/i', '', $key);
          
          // 在庫情報を取得
          if(preg_match('/^[0-9]+$/i', $id, $matches))
          {
            if(preg_match('/^[0-9]+$/i', $data, $matches))
            {
              $arr_products[$id] = $data;
            }
            else
            {
              // 数値以外のデータは無制限として判定
              $arr_products[$id] = 'stock_unlimited';
            }
          }
        }
        
        // 在庫情報を一括更新
        $this->setStockUpdate($arr_products);
        break;
      case 'search':
        // 規格情報ありなしフラグ取得
        $objDb = new SC_Helper_DB_Ex();
        foreach($this->arrProducts as $key=>$product)
        {
          $this->arrProducts[$key]['has_product_class'] = $objDb->sfHasProductClass($product['product_id']);
        }
        break;
    }
  }

  /**
   * 検索結果の在庫を一括更新する
   *
   * @param  array 在庫データ
   * @return void
   */
  public function setStockUpdate($__arr_products)
  {
    foreach($__arr_products as $id=>$value)
    {
      $sqlval = array();
      
      $objQuery =& SC_Query_Ex::getSingletonInstance();
      
      if($value == 'stock_unlimited')
      {
        $sqlval['stock_unlimited'] = 1;
      }
      else
      {
        $sqlval['stock'] = $value;
        $sqlval['stock_unlimited'] = 0;
      }
      
      $objQuery->update('dtb_products_class', $sqlval, 'product_id = ?', array($id));
    }
  }

■実装後の商品マスタ画面
ec_cube_069

規格が登録されている在庫にはラベルで価格を表示し
規格が登録されていない在庫はテキストフィールドを表示している
在庫が未記入や数値以外が入力されると無制限フラグをONにする

次回は商品の公開ステータス一括編集のカスタマイズ予定

Comments are closed.