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'] = ""; //初期化
これを追加してみました。
おそるおそる、規格登録画面で、チェックを付けてみたりハズしてみたりして送信。
・・・・・どうやらエラーは起きなくなったみたいです。万歳♪\(^o^)/
| 固定リンク


コメント