« 2009年2月 | トップページ | 2009年5月 »

2009年3月

考慮不足のバグ発生

相変わらず、EC-CUBEネタです。

EC-CUBEでは商品に対して「規格」というものが登録できます。
一つの商品でも、色違いとか、サイズ違い みたいなものを扱うときに、規格を「色」として登録し、規格の中に分類として「赤」とか「白」とか、登録して紐付けできるんですネ。

で、商品に対して画像はメインとサブ×6種類 しか登録できませんので、もし 7色以上分類がある商品は画像なしー? ってな事になってしまうため、 規格分類ごとに画像を持てるような仕組みに改造をしました。

dtb_products_class にイメージの項目を追加し、ファイルアップロードの画面を追加してきちんと動いているように見えていたのですが・・・ 思わぬところに「穴」がありました。

というのも、「規格登録」の画面では、規格ごとの在庫数などもメンテできるため、商品の登録後は運用として何度も使う訳ですが、規格登録をしなおすと、規格分類ごとの画像が消えてしまう! というバグが発生している、とお客様からご指摘を受けたのです。

そこで、ハッ!と前回の「規格登録エラー」でほじった内容を思い出しました。

『あっ そうだ。Delete-Insertしている画面だった!! ということは、自分で追加したカラムの情報を自動でInsertしてくれてるハズがないょね~』

早速中身を見てみると・・・まさに原因はそこにありました。

なので、情報を取得するクエリーに画像のカラムも項目として追加し、規格登録のテンプレートにも画像名の情報をhiddenで持つようにし、Insert文にはPOSTされてきた画像名をまたDBに登録してあげるような記述を付け加えて一件落着です。

前回、この規格登録の部分をほじほじしておいてよかった~

いや、まさに「考慮不足」だったので 本当にお客様にはご迷惑をおかけしましたm(_ _)m

| | コメント (0) | トラックバック (0)

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^)/

| | コメント (0) | トラックバック (1)

« 2009年2月 | トップページ | 2009年5月 »