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++;
}