バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > 管理機能 > 受注管理>受注登録で他の商品が削除されてしまう

管理機能

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
bbkids
投稿日時: 2014/7/4 8:27
対応状況: −−−
常連
登録日: 2014/2/19
居住地:
投稿: 48
Re: 受注管理>受注登録で他の商品が削除されてしまう
チケット作成有難う御座いました。
nanasess
投稿日時: 2014/7/3 17:54
対応状況: −−−
登録日: 2006/9/9
居住地: 大阪
投稿: 2202
Re: 受注管理>受注登録で他の商品が削除されてしまう
チケットを登録していただきました。

http://svn.ec-cube.net/open_trac/ticket/2585


----------------
大河内健太郎(Kentaro Ohkouchi)
EC-CUBE公式エバンジェリスト
スキルニル株式会社

EC-CUBE1系2系長期サポートホスティングサービス CUBE Lab
https://cubelab.info/

bbkids
投稿日時: 2014/6/23 2:25
対応状況: −−−
常連
登録日: 2014/2/19
居住地:
投稿: 48
Re: 受注管理>受注登録で他の商品が削除されてしまう
sumida 様

ご対応有難う御座いました。
「複数のお届け先を考慮した」修正コード適用し検証してみました。

当方の環境がカスタマイズ環境の為、複数のお届け先での実験が出来なく
単発のお届け先でのみ検証実験行いました。
当方が検証した限りでは、本件に関する問題は修正されたと思われます。
引き続きいろいろなパターンでも検証を続けてみたいと思います。

いつも実にスマートな考察で修正案を出されておりますので、とても参考
になっております。
他の方が建てられたスレッドでも実にスマート&迅速に修正コードを出さ
れていて、そちらでもいつも参考&助けて頂いております。
本当に有難う御座いました。

複数のお届け先につきましては、確認できておりませんが
どなたか検証等してご報告頂けると幸いです。

またコミッターの方、時期バージョンに本件が反映されますようご確認
お願い致します。
sumida
投稿日時: 2014/6/21 21:21
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 受注管理>受注登録で他の商品が削除されてしまう
複数のお届け先を考慮すると、
こんなふうになるのかな。

    public function checkInsertOrderProducts(&$objFormParam, $arrProductClassIds, $insert_product_class_id, $arrAddProductInfo)
    {
        if (!$arrProductClassIds || !in_array($insert_product_class_id, $arrProductClassIds)) {
            $arrAddProducts = array();
            $arrTax = SC_Helper_TaxRule_Ex::getTaxRule(0, $insert_product_class_id);

            $arrAddProductInfo['product_name'] = ($arrAddProductInfo['product_name'])
                ? $arrAddProductInfo['product_name']
                : $arrAddProductInfo['name'];

            $arrAddProductInfo['price'] = ($arrAddProductInfo['price'])
                ? $arrAddProductInfo['price']
                : $arrAddProductInfo['price02'];

            $arrAddProductInfo['quantity'] = 1;
            $arrAddProductInfo['tax_rate'] = ($objFormParam->getValue('order_tax_rate') == '')
                ? $arrTax['tax_rate']
                : $objFormParam->getValue('order_tax_rate');

            $arrAddProductInfo['tax_rule'] = ($objFormParam->getValue('order_tax_rule') == '')
                ? $arrTax['tax_rule']
                : $objFormParam->getValue('order_tax_rule');

// added
        // 「変更」の場合、お届け先情報の位置から受注情報の位置を求める
        $product_class_id = $objFormParam->getValue('add_product_class_id');
        if (SC_Utils_Ex::isBlank($product_class_id)) {
            $change_no = $objFormParam->getValue('no');
            $pre_product_class_id = $arrProductClassIds[$change_no];
            $arrWorkProductClassIds = $objFormParam->getValue('product_class_id');
            $pre_change_no = 0;
            foreach ($arrWorkProductClassIds as $productClassId) {
                if ($productClassId == $pre_product_class_id) {
                    break;
                }
                $pre_change_no++;
            }
        }
// added
            foreach ($this->arrProductKeys as $insert_key) {
                $value = $objFormParam->getValue($insert_key);
                $arrAddProducts[$insert_key]   = (is_array($value))? $value: array();
// added
        if (SC_Utils_Ex::isBlank($product_class_id)) {
        // 「変更」の場合
                $arrWorkProducts = array();
                $insert_change_no = 0;
                foreach ($arrAddProducts[$insert_key] as $data) {
                    $arrWorkProducts[] = $data;
                    if ($insert_change_no == $pre_change_no) {
                        $arrWorkProducts[] = $arrAddProductInfo[$insert_key];
                    }
                    $insert_change_no++;
                }
                $arrAddProducts[$insert_key] = $arrWorkProducts;
        } else {
        // 「商品の追加」の場合
// added
                $arrAddProducts[$insert_key][] = $arrAddProductInfo[$insert_key];
// added
        }
// added
            }

            return $arrAddProducts;
        } else {
            //受注商品の数量は、複数配送側の集計で出しているので、重複しても数量を増やさない。
            return null;
        }
    }
sumida
投稿日時: 2014/6/21 17:52
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 受注管理>受注登録で他の商品が削除されてしまう
「商品の追加」ボタンのときも、この関数を使用していました。
なので、以下のようにしてみました。
ただ、お届け先が複数の場合にどうなるか気にはなりますが。

            foreach ($this->arrProductKeys as $insert_key) {
                $value = $objFormParam->getValue($insert_key);
                $arrAddProducts[$insert_key]   = (is_array($value))? $value: array();
// added
        $product_class_id = $objFormParam->getValue('add_product_class_id');
        if (SC_Utils_Ex::isBlank($product_class_id)) {
                $arrWorkProducts = array();
                $cnt = 0;
                foreach ($arrAddProducts[$insert_key] as $data) {
                    $arrWorkProducts[] = $data;
                    if ($cnt == $objFormParam->getValue('no')) {
                        $arrWorkProducts[] = $arrAddProductInfo[$insert_key];
                    }
                    $cnt++;
                }
                $arrAddProducts[$insert_key] = $arrWorkProducts;
        } else {
// added
                $arrAddProducts[$insert_key][] = $arrAddProductInfo[$insert_key];
// added
        }
// added
            }
bbkids
投稿日時: 2014/6/21 17:30
対応状況: −−−
常連
登録日: 2014/2/19
居住地:
投稿: 48
Re: 受注管理>受注登録で他の商品が削除されてしまう
sumida 様

ご対応有難う御座いました。
早速ご教授頂いた修正を当て実験してみました。

結果
2アイテムで実験をする限り、問題は修正されたのですが、
2アイテムから3アイテムに商品追加し、変更、削除を数回繰り返していると、
やはり削除指示した商品とは別の商品が削除されてしまうようです。

具体的な再現方法は、まだ確定出来ておりませんが
3アイテムで色々試しておりますと、かなりの確率で再現致します。


sumida
投稿日時: 2014/6/21 16:30
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 受注管理>受注登録で他の商品が削除されてしまう
強引にやってみました。

内容は、
これまで、order側に追加されるとき、最後尾に追加されていました。
とりあえず、変更した商品の後ろに追加するようにしてみました。
(PHP5.3では、array_spliceという関数があるようですが。)
そして、不要になった商品が後で取り除かれるので、
結果として、入れ替えた格好になります。

LC_Page_Admin_Order_Edit.php

    public function checkInsertOrderProducts(&$objFormParam, $arrProductClassIds, $insert_product_class_id, $arrAddProductInfo)
    {
        if (!$arrProductClassIds || !in_array($insert_product_class_id, $arrProductClassIds)) {
            $arrAddProducts = array();
            $arrTax = SC_Helper_TaxRule_Ex::getTaxRule(0, $insert_product_class_id);

            $arrAddProductInfo['product_name'] = ($arrAddProductInfo['product_name'])
                ? $arrAddProductInfo['product_name']
                : $arrAddProductInfo['name'];

            $arrAddProductInfo['price'] = ($arrAddProductInfo['price'])
                ? $arrAddProductInfo['price']
                : $arrAddProductInfo['price02'];

            $arrAddProductInfo['quantity'] = 1;
            $arrAddProductInfo['tax_rate'] = ($objFormParam->getValue('order_tax_rate') == '')
                ? $arrTax['tax_rate']
                : $objFormParam->getValue('order_tax_rate');

            $arrAddProductInfo['tax_rule'] = ($objFormParam->getValue('order_tax_rule') == '')
                ? $arrTax['tax_rule']
                : $objFormParam->getValue('order_tax_rule');

            foreach ($this->arrProductKeys as $insert_key) {
                $value = $objFormParam->getValue($insert_key);
                $arrAddProducts[$insert_key]   = (is_array($value))? $value: array();
/* changed
                $arrAddProducts[$insert_key][] = $arrAddProductInfo[$insert_key];
changed */
                $arrWorkProducts = array();
                $cnt = 0;
                foreach ($arrAddProducts[$insert_key] as $data) {
                    $arrWorkProducts[] = $data;
                    if ($cnt == $objFormParam->getValue('no')) {
                        $arrWorkProducts[] = $arrAddProductInfo[$insert_key];
                    }
                    $cnt++;
                }
                $arrAddProducts[$insert_key] = $arrWorkProducts;
// changed
            }

            return $arrAddProducts;
        } else {
            //受注商品の数量は、複数配送側の集計で出しているので、重複しても数量を増やさない。
            return null;
        }
    }
bbkids
投稿日時: 2014/6/21 14:17
対応状況: −−−
常連
登録日: 2014/2/19
居住地:
投稿: 48
Re: 受注管理>受注登録で他の商品が削除されてしまう
確かに良く考えると仰る通りですね。
今回は画面遷移時の受注情報の配列の中身の事なので、
DBからの読み込みだ時の順序は、今回とは関係ないですね。

本件はそう単純には修正できないんですね、
「注文内容を管理するという」実運用において使用頻度が多い所なだけに
実に困りました。
商品の変更は直接行わず、
幸い現状問題の出ていない「追加」と「削除」を組合せて使用し
運用回避して当面は凌ぐしかなさそうですね。
(運用回避が出来るので、まだ良しとすべきなのでしょうね。)

ec-cubeをベースに本格的に商用運用されている方は、多々おられると思いますが
このLC_Page_Admin_Order_Edit.phpの処理には皆様は困っていないのものなのでしょうか?
これまでにも
・商品が消せなかったり、
・税率が繁栄されていなかったり
などなど多々致命的な問題がありましたが、もっと大々的に問題となっても良いものだと
思うのですが、今一問題の重要度が低いような気がします。
それとも多くの運用者にとっては、独自カスタマイズ等で該当処理を修正して運用して
おられるので、それほど問題ではないものなのでしょうか。

当方にとっては、LC_Page_Admin_Order_Edit.php 内での処理は、よく致命的な
不具合が見つかりますが、私自身のスキル的には複雑すぎて中々手の付けられない
ブラックボックスで非常に困っております。

sumida
投稿日時: 2014/6/21 13:19
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 受注管理>受注登録で他の商品が削除されてしまう
単純には、修正できないように思えます。

チェンジセット23355は、DBから読み込んだ(修正前の受注情報)ときの順序を変更するものです。
今回は、画面内で「商品の変更」を行った時点では、DBは変更されていないので、
画面遷移の時、受注情報を持ち越しています。
そのため、チェンジセット23355は、無関係の状態にあります。
bbkids
投稿日時: 2014/6/21 12:54
対応状況: −−−
常連
登録日: 2014/2/19
居住地:
投稿: 48
Re: 受注管理>受注登録で他の商品が削除されてしまう
sumida 様
経過処理の解析有難う御座います。非常に複雑な処理をしていますね。
sumida様が解析し説明して頂いている内容を追いかけるだけでも複雑すぎて
正直訳分からなくなってしまいます。

ボヤいてもしょうがないですが、こんなに複雑な処理で実装するから問題
が出るんじゃないのって思えてならない程おそろしい処理してますね・・・

確か、2.13.0の時に、チェンジセット23355
にて、shipmment側の表示順序がorder側と同じ順序で表示されるように修正され、
各種処理においてもorder側とshipmment側で不一致が起きないようになったと
思っておりましたが

shipmment側は、更新により、変更を実現している。
order側は、追加・削除により、変更を実現している。

これらにより、それぞれの配列の中身の順序がかわってしまい、またつじつまが
合わなくなってくるんですね。

原因は何となく分かりましたが、処理が複雑すぎて私には手におえません・・・

「注文内容を管理するという」非常に重要な部分な訳で、
LC_Page_Admin_Order_Edit.php の根本的な問題がそろそろ本格的に修正される事を
望みますが
とり急ぎ本件に関してsumida 様が調査し纏めて頂いたものをご参考に
コミッターの方や詳しい方など、どうぞ修正案をお作り頂けないででしょうか?
(1) 2 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ


 



ログイン



統計情報

総メンバー数は75,099名です
総投稿数は104,361件です

投稿数ランキング

1
seasoft
7333
2
468
3217
3
AMUAMU
2712
4
nanasess
2202
5
umebius
2085
6
yuh
1664
7
red
1535
8
h_tanaka
1189
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
Copyright© EC-CUBE CO.,LTD. All Rights Reserved.