アットウィキロゴ

規格ページのデータ変更エラー

EC-CUBE

EC-CUBE 「規格」の再登録でシステムエラー

EC-CUBEの「規格登録」て画面が、規格の分類が多い場合、とても使いにくいです。

新規の時には規格2種類をかけあわせた、1000通りもの組合せの中から、
登録したいものを選択(チェック)するのだけど、これが目がチラチラするというか、
間違いやすいというか。

で、やっと登録を終えて「あっ 一個上のヤツを選んでしまったみたい!」と気づいた時に、
また規格登録画面を呼出して、間違えたチェックを外し、正しいものを選択して、
確認画面が出てイザ登録ボタン~!というところで システムエラーが出るんです。

管理画面のログインからやりなおして、何度やっても 同じ。。。orz

でも、全部の商品の規格登録でエラーが出るか、というと、そうでもなかったりして、ちょっと謎めいておりました。

謎は謎のままにして・・なんて言ってられませんので、探りました。

とりあえずエラーの出る時と出ない時のクエリーとして送っている項目と値を表示。
すると、product_class_idが重複している箇所で止まってるのが分かりました。

・・・なんでproduct_class_idが同じものがセットされてるんだ?

規格登録すると、データベースでは product_class という呼び名のレコードとして、
dtb_products_class に product_class_id をキーとして登録されるわけです。

更新の際はもともと持っている product_class_id をフォーム画面にhidden項目として持ってるようです。

前回登録していない商品というのは、product_class_id は無いから、もちろん空なんですね。

で、イザ登録する部分のソースを見てみると、一気に送られたデータを
一レコードずつに分解して、クエリー文を作ってます。

( LC_Page_Admin_Products_ProductClass.php  のlfInsertProductClassという関数) 

その時、product_class_idが無かったら、product_class_idの項目はセットしないようになってます。

   if( strlen($arrList["product_class_id:".$cnt]) > 0 ){
         $sqlval['product_class_id'] = $arrList["product_class_id:".$cnt];
    }

・・・あれっ? $sqlval['product_class_id'] が while文中でどこでも初期化されていません!!

ということで While文のすぐ下に、

$sqlval['product_class_id'] = ""; //初期化

これを追加

/var/www/webshop/data/class/pages/admin/products/LC_Page_Admin_Products_ProductClass.php

以下ソース

/* 規格の登録 */

  $objQuery->begin();

  // 既存規格の削除
  $where = "product_id = ?";
  $objQuery->delete("dtb_products_class", $where, array($product_id));

  $cnt = 1;
  // すべての規格を登録する。
  while($arrList["classcategory_id1:".$cnt] != "") {

    //初期化:2009/05/13追加
    $sqlval['product_class_id'] = ""; //初期化

      if($arrList["check:".$cnt] == 1) {
          $sqlval['product_id'] = $product_id;
          $sqlval['classcategory_id1'] = $arrList["classcategory_id1:".$cnt];
          $sqlval['classcategory_id2'] = $arrList["classcategory_id2:".$cnt];
          if( strlen($arrList["product_class_id:".$cnt]) > 0 ){
              $sqlval['product_class_id'] = $arrList["product_class_id:".$cnt];
          }
          $sqlval['product_code'] = $arrList["product_code:".$cnt];
          $sqlval['stock'] = $arrList["stock:".$cnt];
          $sqlval['stock_unlimited'] = $arrList["stock_unlimited:".$cnt];
          $sqlval['price01'] = $arrList['price01:'.$cnt];
          $sqlval['price02'] = $arrList['price02:'.$cnt];
          $sqlval['creator_id'] = $_SESSION['member_id'];
          $sqlval['create_date'] = "now()";
          $sqlval['update_date'] = "now()";
          // INSERTの実行
          $objQuery->insert("dtb_products_class", $sqlval);
      }
      $cnt++;
  }
最終更新:2009年07月06日 00:23
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。