バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

機能要望 > 管理機能 > 備忘録「お届け先の削除」ボタンの検討(チケット#2529)

管理機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
sumida
投稿日時: 2014/7/6 22:59
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
備忘録「お届け先の削除」ボタンの検討(チケット#2529)
勝手ながら、
受注情報編集画面での「お届け先を削除」について検討してみました。

現状の更新処理(DBへの登録:関数doRegister):
(1) dtb_shipping

$objPurchase->registerShipping($order_id, $arrShippingValues, false);

  この処理は、注文番号内のお届け先をすべて、delete,insertにより更新している。
  そのため、更新前と更新後のお届け先数が異なっても対応できる。(つまり、「お届け先を追加」「お届け先を削除」どちらも可能である)
(2) dtb_shipment_item

$objPurchase->registerShipmentItem($order_id, $shipping_id, $arrShipmentValues[$shipping_index]);

  この処理は、注文番号のお届け先番号内の商品をすべて、delete,insertにより更新している。
  そのため、更新前と更新後の商品数が異なっても対応できる。(つまり、「商品の追加」「商品の削除」どちらも可能である)
  しかし、$shipping_idが必須であるため、「お届け先を削除」した場合、削除した$shipping_idが不明になり対応できない。
  (現状では、DB内に削除したお届け先の商品が残った状態となる。)

結論:
  「お届け先の削除」は、実現可能であるが、前述のdtb_shipment_itemの残骸を削除する部分を作成する必要がある。
  つまり、更新前(DB)と更新後(画面)を比較し、削除されたお届け先を削除したのち、既存の更新処理を行う形になる。

不具合:
  テンプレートでは、
    FORM_COUNTRY_ENABLE:trueの場合
shipping_country_id
shipping_zipcode
    FORM_COUNTRY_ENABLE:falseの場合
shipping_country_id
  の項目を展開する。
  ここで、FORM_COUNTRY_ENABLE:falseの場合、
shipping_zipcode
  がテンプレートにない。
  また、classファイルでは、

        $objFormParam->addParam('ZIPCODE', 'shipping_zipcode', STEXT_LEN, 'n', array('GRAPH_CHECK', 'MAX_LENGTH_CHECK'));

  を宣言し、FORM_COUNTRY_ENABLEに関係なくカラム名としてshipping_zipcodeを使っている。
  つまり、テンプレートにない項目shipping_zipcodeを、classファイルで扱っており、
  関数getValue, setValueで利用すると不具合が発生する。

追記(不具合の詳細):
2口のお届け先の受注情報を1口のお届け先に更新する場合を例にする。

受注情報編集画面の画面表示にあたり、
(1) DBから受注情報を取得
(2) 各項目を画面遷移前の(項目の編集を行った)情報で上書き
(3) 画面を(画面遷移前の情報を引き継いで)表示
という手順になる。
ここで、FORM_COUNTRY_ENABLE:falseの場合、'shipping_zipcode'の項目が画面に存在していないので、(2)の段階で上書きの対象から除外される。
つまり、内部では、
  'shipping_zipcode'は、2口
  それ以外は、1口
という中途半端な状態になっている。
ここで、これらの内容からお届け先情報一覧を取り出すと、「'shipping_zipcode'は、2口」の影響で、
  「内容が空の2口めが存在してしまう。」
という不具合です。

再追記:
LC_Page_Admin_Order_Edit.php

    public $arrShippingKeys = array(
        'shipping_id',
        'shipping_name01',
        'shipping_name02',
        'shipping_kana01',
        'shipping_kana02',
        'shipping_company_name',
        'shipping_tel01',
        'shipping_tel02',
        'shipping_tel03',
        'shipping_fax01',
        'shipping_fax02',
        'shipping_fax03',
        'shipping_pref',
        'shipping_country_id',
        'shipping_zipcode',
        'shipping_zip01',
        'shipping_zip02',
        'shipping_addr01',
        'shipping_addr02',
        'shipping_date_year',
        'shipping_date_month',
        'shipping_date_day',
        'time_id',
    );

この定義で、'shipping_zipcode'は、お届け先情報の1つとして扱われているため、
画面上に定義されるべき項目だと思います。
sumida
投稿日時: 2014/7/7 20:13
対応状況: −−−
仙人
登録日: 2013/2/10
居住地: 広島県呉市ときどき瀬戸内海
投稿: 641
Re: 備忘録「お届け先の削除」ボタンの検討(チケット#2529)
結局、(v2.13.2で)やってみました。
(1)不具合の対応
data/Smarty/templates/admin/order/edit.tpl

                <!--{assign var=key1 value="shipping_country_id"}-->
                <!--{assign var=key2 value="shipping_zipcode"}-->
                <!--{if !$smarty.const.FORM_COUNTRY_ENABLE}-->
                <input type="hidden" name="<!--{$key1}-->[<!--{$shipping_index}-->]" value="<!--{$smarty.const.DEFAULT_COUNTRY_ID}-->" />
<!--{* added *}-->
                <input type="hidden" name="<!--{$key2}-->[<!--{$shipping_index}-->]" value="<!--{$arrShipping[$key2]|h}-->" />
<!--{* added *}-->
                <!--{else}-->

(2)「登録する」ボタン
削除された部分を、まずDBから削除しておく。
data/class/helper/SC_Helper_Purchase.php

// added
    /**
     * 配送情報の削除を行う.
     * @param  integer $order_id    受注ID
     * @param  integer $shipping_id 配送先ID
     * @return void
     */
    public function deleteShipping($order_id, $shipping_id = '')
    {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $table = 'dtb_shipping';
        if ($shipping_id == '') {
            $where = 'order_id = ?';
            $objQuery->delete($table, $where, array($order_id));
        } else {
            $where = 'order_id = ? AND shipping_id = ?';
            $objQuery->delete($table, $where, array($order_id, $shipping_id));
        }
    }
    /**
     * 配送商品を削除する.
     *
     * @param  integer $order_id    受注ID
     * @param  integer $shipping_id 配送先ID
     * @return void
     */
    public function deleteShipmentItem($order_id, $shipping_id)
    {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $table = 'dtb_shipment_item';
        $where = 'order_id = ? AND shipping_id = ?';
        $objQuery->delete($table, $where, array($order_id, $shipping_id));
    }
// added

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

        $arrAllShipping = $objFormParam->getSwapArray($this->arrShippingKeys);
        $arrAllShipmentItem = $objFormParam->getSwapArray($this->arrShipmentItemKeys);
// added
        // 削除されたお届け先をDBから削除する。
        $arrPreAllShipping = $objPurchase->getShippings($order_id, false);
        foreach ($arrPreAllShipping as $arrPreShipping) {
            $pre_shipping_id = $arrPreShipping['shipping_id'];
            $found_shipping_id = false;
            foreach ($arrAllShipping as $arrShipping) {
                if ($arrShipping['shipping_id'] == $pre_shipping_id) {
                    $found_shipping_id = true;
                    break;
                }
            }
            if ($found_shipping_id === false) {
                $objPurchase->deleteShipmentItem($order_id, $pre_shipping_id);
                $objPurchase->deleteShipping($order_id, $pre_shipping_id);
            }
        }
// added

(3)「お届け先の削除」ボタン
画面上の情報を削除する。
data/Smarty/templates/admin/order/edit.tpl

        <!--{foreach name=shipping from=$arrAllShipping item=arrShipping key=shipping_index}-->
            <!--{if $tpl_shipping_quantity > 1}-->
                <h3>お届け先<!--{$smarty.foreach.shipping.iteration}--></h3>
            <!--{/if}-->
            <!--{assign var=key value="shipping_id"}-->
            <input type="hidden" name="<!--{$key}-->[<!--{$shipping_index}-->]" value="<!--{$arrShipping[$key]|default:"0"|h}-->" id="<!--{$key}-->_<!--{$shipping_index}-->" />
            <!--{if $tpl_shipping_quantity > 1}-->
                <h2>届け先商品情報&nbsp;<a class="btn-normal" href="java script:;" name="add_product" onclick="eccube.openWindow('<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->order/product_select.php?order_id=<!--{$arrForm.order_id.value|h}-->&shipping_id=<!--{$shipping_index}-->', 'search', '615', '500', {menubar:'no'}); return false;">商品の追加</a>
<!--{* added *}-->
                <a class="btn-normal" href="java script:;" name="delete_shipping" onclick="eccube.setValue('select_shipping_id', <!--{$shipping_index}-->, 'form1'); eccube.setModeAndSubmit('delete_shipping','anchor_key','order_products'); return false;">このお届け先を削除</a>
<!--{* added *}-->
                </h2>

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

                // お届け先の追加
            case 'append_shipping':
                $objFormParam->setParam($_POST);
                $objFormParam->convParam();
                $this->setProductsQuantity($objFormParam);
                $this->addShipping($objFormParam);
                break;

// added
                // お届け先の削除
            case 'delete_shipping':
                $objFormParam->setParam($_POST);
                $objFormParam->convParam();
                $this->doDeleteShipping($objFormParam);
                $this->setProductsQuantity($objFormParam);
                break;
// added
            default:
                break;


// added
    /**
     * お届け先を削除する.
     *
     * @param  SC_FormParam $objFormParam SC_FormParam インスタンス
     * @return void
     */
    public function doDeleteShipping(&$objFormParam)
    {
        $select_shipping_id    = $objFormParam->getValue('select_shipping_id');
        $arrPreShipmentProductClassIds = $objFormParam->getValue('shipment_product_class_id');
        $arrPreProductClassIds = $objFormParam->getValue('product_class_id');

        // お届け先商品データをキーとともに逆順に
        $arrRevPreShipmentProductClassIds = array_reverse($arrPreShipmentProductClassIds[$select_shipping_id], true);
        // お届け先商品データの削除
        foreach ($arrRevPreShipmentProductClassIds as $delete_no => $delete_product_class_id) {
            $arrNewShipments = $this->deleteShipment($objFormParam, $this->arrShipmentItemKeys , $select_shipping_id, $delete_no);

            $is_product_delete = true;
            foreach ($arrNewShipments['shipment_product_class_id'] as $shipping_id => $arrShipmentProductClassIds) {
                foreach ($arrShipmentProductClassIds as $relation_index => $shipment_product_class_id) {
                    if (in_array($delete_product_class_id, $arrShipmentProductClassIds)) {
                        $is_product_delete = false;
                        break;
                    }
                }
            }

            //商品情報から削除
            if ($is_product_delete) {
                $this->checkDeleteProducts($objFormParam, $arrPreProductClassIds, $delete_product_class_id, $this->arrProductKeys);
            }

            $objFormParam->setParam($arrNewShipments);
        }

        // お届け先データの削除
        $arrShippingIds = $objFormParam->getValue('shipping_id');
        foreach($arrShippingIds as $shipping_index => $shipping_data) {
            if ($shipping_data == $select_shipping_id) {
                $select_shipping_index = $shipping_index;
                break;
            }
        }
        foreach($this->arrShippingKeys as $keys) {
            $arrShippingKeyTmp = $objFormParam->getValue($keys);
            $arrShippingKeyNew = array();
            foreach ($arrShippingKeyTmp as $tmp_index => $tmp_data) {
              if ($tmp_index != $select_shipping_index) {
                  $arrShippingKeyNew[$tmp_index] = $tmp_data;
              }
            }
            $objFormParam->setValue($keys, $arrShippingKeyNew);
        }
    }
// added


気になったので、とりあえず、ここも修正しました。

    public function deleteShipment(&$objFormParam, $arrShipmentDeletKeys, $delete_shipping_id, $delete_no)
    {
// added
            $arrUpdateParams = array();
// added
            foreach ($arrShipmentDeletKeys as $delete_key) {
                $arrShipments = $objFormParam->getValue($delete_key);

// added
                $arrUpdateParams[$delete_key] = array();
// added
                foreach ($arrShipments as $shipp_id => $arrKeyData) {
                    if (empty($arrKeyData)) continue;
                    foreach ($arrKeyData as $relation_index => $shipment_info) {
                        if ($relation_index != $delete_no || $shipp_id != $delete_shipping_id) {
                            $arrUpdateParams[$delete_key][$shipp_id][] = $shipment_info;
                        }
                    }
                }
            }
            //$objFormParam->setParam($arrUpdateParams);
            return $arrUpdateParams;
        }

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,780名です
総投稿数は109,972件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1644
8
red
1570
9
mcontact
1289
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

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

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