バージョン選択

フォーラム

メニュー

オンライン状況

42 人のユーザが現在オンラインです。 (24 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 42
もっと...

サイト内検索

バグ報告 > 管理機能 > v2.13.0 管理画面:受注変更画面(複数配送でない)の数量チェックの動作に不具合がある。

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
sumida
投稿日時: 2013/10/7 15:57
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
v2.13.0 管理画面:受注変更画面(複数配送でない)の数量チェックの動作に不具合がある。
受注情報変更画面にて、

デモデータをもとに、
1品目 なべ 数量1
2品目 アイス 数量1
の受注情報に対し、
・2行目のアイスの数量を2に変更

情報の更新をすると、
1行目のなべの数量欄に2が表示され、「数量が在庫数より少ない」とエラーになります。

この時点で、なべの在庫は、99。アイスは、無制限になっています。
sumida
投稿日時: 2013/10/7 23:06
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: v2.13.0 管理画面:受注変更画面(複数配送でない)の数量チェックの動作に不具合がある。
とりあえず、原因らしきものです。
data/class/pages/admin/order/LC_Page_Admin_Order_edit.php
にある新規関数 setProductsQuantity が悪さをしているようです。
呼び出し元をコメントにすると、正常に動作します。

    public function setProductsQuantity(&$objFormParam)
    {
        $arrShipmentsItems = $objFormParam->getSwapArray(array('shipment_product_class_id','shipment_quantity'));
        // 配送先が存在する時のみ、商品個数の再設定を行います
        if(!SC_Utils_Ex::isBlank($arrShipmentsItems)) {
            foreach ($arrShipmentsItems as $arritems) {
                foreach ($arritems['shipment_product_class_id'] as $relation_index => $shipment_product_class_id) {
                    $arrUpdateQuantity[$shipment_product_class_id] += $arritems['shipment_quantity'][$relation_index];
                }
            }

            $arrProductsClass = $objFormParam->getValue('product_class_id');
            $arrProductsQuantity = $objFormParam->getValue('quantity');
            foreach ($arrProductsClass as $relation_key => $product_class_id) {echo $relation_key;
                $arrQuantity['quantity'][$relation_key] = $arrUpdateQuantity[$product_class_id];
            }
            $objFormParam->setParam($arrQuantity);
        }
    }

疑問点
(1) $arrProductsQuantity = $objFormParam->getValue('quantity');
  いつ使用するのか。
(2) $arrQuantity['quantity'][$relation_key] = $arrUpdateQuantity[$product_class_id];
  受注編集画面の数量と同じ名称('quantity')を使用している。ユーザが操作した情報を強制的に書き換えていることになる。
  もし、配送情報をもとにした、数量合計を保持するためであれば、名称('quantity')とは異なる名称にすべきと思います。
sumida
投稿日時: 2013/10/8 18:19
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: v2.13.0 管理画面:受注変更画面(複数配送でない)の数量チェックの動作に不具合がある。
こちらの原因は、複数配送でない場合であっても、
setProductsQuantityが実行されるため、動作不良になっていると思います。

実行すべきかどうかの判断は、
・複数配送(システムパラメタ)の設定で、判断して良いのか
・配送先の件数で、判断して良いのか
この点については、確認していません。

追記:
配送先の件数で、判断してなければならないようです。
$objFormParam->getValue('shipping_quantity') > 1のとき、複数配送
                         以外のとき、お届け先1口
関数 setProductsQuantity 内で判断するなら、
count($arrShipmentsItems) > 1

再追記:
複数配送の場合、
各お届け先の数量を合計して、受注商品情報の数量に反映している。
複数配送でない場合、
逆に、受注商品情報の数量を、お届け先の数量にコピーする必要があると思う。
理由:
edit.tplに、複数配送でない場合、
「配送先が1つでも、shipment_itemを更新するために必要」
というコメントがあり、コピーする必要があるのでは。
sumida
投稿日時: 2013/10/10 17:23
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: v2.13.0 管理画面:受注変更画面(複数配送でない)の数量チェックの動作に不具合がある。
対策案です。
(追記:最新の修正案は、以降の投稿を参照してください。)

data/class/pages/admin/order/LC_Page_Admin_Order_edit.php



    public function setProductsQuantity(&$objFormParam)
    {
        $arrShipmentsItems = $objFormParam->getSwapArray(array('shipment_product_class_id','shipment_quantity'));
        // 配送先が存在する時のみ、商品個数の再設定を行います
        if(!SC_Utils_Ex::isBlank($arrShipmentsItems)) {
// added
    if (count($arrShipmentsItems) > 1) {
        // 複数配送
// added
            foreach ($arrShipmentsItems as $arritems) {
                foreach ($arritems['shipment_product_class_id'] as $relation_index => $shipment_product_class_id) {
                    $arrUpdateQuantity[$shipment_product_class_id] += $arritems['shipment_quantity'][$relation_index];
                }
            }

            $arrProductsClass = $objFormParam->getValue('product_class_id');
            $arrProductsQuantity = $objFormParam->getValue('quantity');
            foreach ($arrProductsClass as $relation_key => $product_class_id) {
                $arrQuantity['quantity'][$relation_key] = $arrUpdateQuantity[$product_class_id];
            }
// added
    } else {
            // 複数配送でない
            // javascript quantityCopyForSingleShippingで実行されている。
 /* PHPで書けばこうなるかな?
            $arrProductsClass = $objFormParam->getValue('product_class_id');
            $arrProductsQuantity = $objFormParam->getValue('quantity');
            foreach ($arrProductsClass as $relation_key => $product_class_id) {
                $arrUpdateQuantity[$product_class_id] = $arrProductsQuantity[$relation_key];
            }

            foreach ($arrShipmentsItems as $item_index => $arritems) {
                foreach ($arritems['shipment_product_class_id'] as $relation_index => $shipment_product_class_id) {
                    $arrQuantity['shipment_quantity'][$item_index][$relation_key] = $arrUpdateQuantity[$shipment_product_class_id];
                }
            }
*/
   }
// added
            $objFormParam->setParam($arrQuantity);
        }
    }
sumida
投稿日時: 2013/10/10 22:11
対応状況: 解決済
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: v2.13.0 管理画面:受注変更画面(複数配送でない)の数量チェックの動作に不具合がある。
申し訳ありませんが、
再現できなくなりましたので、一旦、取り下げさせてください。

追記:
再現できていませんでしたが、再現できました。

v2.13.0をインストールした直後の場合、
商品2個、お届け先1件の受注情報を変更します。
変更内容:
商品2個目(2行目)の数量を変更すると、商品1個目(1行目)の数量になってしまいます。
sumida
投稿日時: 2013/10/11 18:30
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: v2.13.0 管理画面:受注変更画面(複数配送でない)の数量チェックの動作に不具合がある。
原因が判明しました。
受注情報変更画面において、
お届け先が1件の場合、数量を変更すると、javascript quantityCopyForSingleShipping により、非表示項目のお届け先情報内の数量へコピーしています。
ここで、商品購入にあたり、
受注情報:
  なべ
  アイスクリーム
の順番(購入順:dtb_order_detail)になっていますが、
お届け先情報:
  アイスクリーム
  なべ
の順番(product_id順:dtb_shipment_item)になっています。
結果、受注情報のなべの数量を変更すると、お届け先情報のアイスクリームの数量が変更されます。

この表示順が一致すれば、問題解決です。

追記:
順番の同期ができれば良いのですが、
できないのであれば、
javascript quantityCopyForSingleShipping をはずして、
以前、提示させていただいたようなコードを追加するような修正になるのでは。

再追記:
これでも、まだ、うまく動作していない。(非表示部分に数量のコピーができない)
sumida
投稿日時: 2013/10/12 14:54
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: v2.13.0 管理画面:受注変更画面(複数配送でない)の数量チェックの動作に不具合がある。
解決しました。
(配列に使用している2次元目の変数に間違いがあることに、気がつきませんでした。)

修正案
表示順の同期は、異なるテーブル内の商品情報なので、DBへの更新時に不都合が発生する懸念もあり、あきらめました。

data/Smarty/templates/admin/order/edit.tpl
javascriptによる動的変更部分

/* deleted
    function quantityCopyForSingleShipping(product_index){
        var product_index = parseInt(product_index);
        var input_quantity = $('input[name^="quantity[' + product_index + ']"]').val();
        $('input[name^="shipment_quantity[0][' + product_index + ']"]').val(input_quantity);
    }
deleted */

使用しているHTML部分

                <td align="center">
                    <!--{assign var=key value="quantity"}-->
                    <span class="attention"><!--{$arrErr[$key][$product_index]}--></span>
<!--{* changed
                    <input type="text" name="<!--{$key}-->[<!--{$product_index}-->]" value="<!--{$arrForm[$key].value[$product_index]|h}-->" size="3" class="box3" maxlength="<!--{$arrForm[$key].length}-->" style="<!--{$arrErr[$key][$product_index]|sfGetErrorColor}-->" id="<!--{$key}-->_<!--{$product_index}-->"  onChange="quantityCopyForSingleShipping('<!--{$product_index}-->')" />
changed *}-->
                    <input type="text" name="<!--{$key}-->[<!--{$product_index}-->]" value="<!--{$arrForm[$key].value[$product_index]|h}-->" size="3" class="box3" maxlength="<!--{$arrForm[$key].length}-->" style="<!--{$arrErr[$key][$product_index]|sfGetErrorColor}-->" id="<!--{$key}-->_<!--{$product_index}-->" />
<!--{* changed *}-->
                </td>


data/class/pages/admin/order/LC_Page_Admin_Order_edit.php
お届け先1件:
  コピー(受注商品情報の数量-->お届け先の数量)
お届け先2件以上:(既存の処理)
  合算後コピー(お届け先の数量合計)-->受注商品情報の数量

    public function setProductsQuantity(&$objFormParam)
    {
        $arrShipmentsItems = $objFormParam->getSwapArray(array('shipment_product_class_id','shipment_quantity'));
        // 配送先が存在する時のみ、商品個数の再設定を行います
        if(!SC_Utils_Ex::isBlank($arrShipmentsItems)) {
// added
    if (count($arrShipmentsItems) > 1) {
// added
            foreach ($arrShipmentsItems as $arritems) {
                foreach ($arritems['shipment_product_class_id'] as $relation_index => $shipment_product_class_id) {
                    $arrUpdateQuantity[$shipment_product_class_id] += $arritems['shipment_quantity'][$relation_index];
                }
            }

            $arrProductsClass = $objFormParam->getValue('product_class_id');
            $arrProductsQuantity = $objFormParam->getValue('quantity');
            foreach ($arrProductsClass as $relation_key => $product_class_id) {
                $arrQuantity['quantity'][$relation_key] = $arrUpdateQuantity[$product_class_id];
            }
// added
    } else {
            // 配送先が1つ
            $arrProductsClass = $objFormParam->getValue('product_class_id');
            $arrProductsQuantity = $objFormParam->getValue('quantity');
            foreach ($arrProductsClass as $relation_key => $product_class_id) {
                $arrUpdateQuantity[$product_class_id] = $arrProductsQuantity[$relation_key];
            }

            foreach ($arrShipmentsItems as $item_index => $arritems) {
                foreach ($arritems['shipment_product_class_id'] as $relation_index => $shipment_product_class_id) {
                    $arrQuantity['shipment_quantity'][$item_index][$relation_index] = $arrUpdateQuantity[$shipment_product_class_id];
                }
            }
    }
// added
            $objFormParam->setParam($arrQuantity);
        }
    }
sumida
投稿日時: 2014/1/9 15:12
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: v2.13.0 管理画面:受注変更画面(複数配送でない)の数量チェックの動作に不具合がある。
他の不具合と同じ原因のため、以前に投稿した修正案(これを使用しない)とは異なる修正案を、
こちらに、まとめて記述しました。
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=14060&forum=9
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン



統計情報

総メンバー数は74,626名です
総投稿数は104,055件です

投稿数ランキング

1
seasoft
7333
2
468
3217
3
AMUAMU
2712
4
nanasess
2202
5
umebius
2074
6
yuh
1664
7
red
1498
8
h_tanaka
1188
9
tsuji
942
10
fukap
907
11
shutta
835
12
tao_s
794
13 ramrun 789
14 karin 689
15 sumida 641
16
homan
633
17 DELIGHT 572
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.