[Svn-src-all:2672] [version-2_12-dev 21571] #1671 (SC_Helper_Purchase#clearShipmentItemTemp が配送情報まで削除している)

Seasoft admin @ mail.ec-cube.net
2012年 3月 2日 (金) 01:38:44 JST


Subversion committed to /home/svn/open 21571
http://svn.ec-cube.net/open_trac/changeset/21571
┌────────────────────────────┐
│更新者 :  Seasoft                                      │
│更新日時:  2012-03-02 01:38:44 +0900 (金, 02  3月 2012)│
└────────────────────────────┘

Log:
--------------------------------------------------------
#1671 (SC_Helper_Purchase#clearShipmentItemTemp が配送情報まで削除している)
#1646 (「お届け先の複数指定」か否かに関わらず、配送商品を登録する(再))
#1672 (非会員購入時「お届け先の複数指定」から戻るボタンで遷移すると追加したお届け先が削除される)
#1674 (ログイン状態で複数配送に使用した別のお届け先がログアウトしても保持される)
#1675 (「お届け先の複数指定」画面での入力内容が復元されない)
#1613 (typo修正・ソース整形・ソースコメントの改善)

Changed:                      [U:修正,A:追加,D:削除]
--------------------------------------------------------
U   branches/version-2_12-dev/data/Smarty/templates/default/shopping/payment.tpl
U   branches/version-2_12-dev/data/class/SC_Customer.php
U   branches/version-2_12-dev/data/class/helper/SC_Helper_Purchase.php
U   branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping.php
U   branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping_Deliv.php

変更: branches/version-2_12-dev/data/Smarty/templates/default/shopping/payment.tpl
===================================================================
--- branches/version-2_12-dev/data/Smarty/templates/default/shopping/payment.tpl	2012-03-01 15:53:37 UTC (rev 21570)
+++ branches/version-2_12-dev/data/Smarty/templates/default/shopping/payment.tpl	2012-03-01 16:38:44 UTC (rev 21571)
@@ -277,7 +277,7 @@
         <div class="btn_area">
             <ul>
                 <li>
-                <a href="<!--{$tpl_back_url|h}-->?deliv_check=<!--{$deliv_check|h}-->" onmouseover="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_back_on.jpg','back03')" onmouseout="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_back.jpg','back03')">
+                <a href="<!--{$tpl_back_url|h}-->" onmouseover="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_back_on.jpg','back03')" onmouseout="chgImg('<!--{$TPL_URLPATH}-->img/button/btn_back.jpg','back03')">
                     <img src="<!--{$TPL_URLPATH}-->img/button/btn_back.jpg" alt="戻る" border="0" name="back03" id="back03" /></a>
                 </li>
                 <li>

変更: branches/version-2_12-dev/data/class/SC_Customer.php
===================================================================
--- branches/version-2_12-dev/data/class/SC_Customer.php	2012-03-01 15:53:37 UTC (rev 21570)
+++ branches/version-2_12-dev/data/class/SC_Customer.php	2012-03-01 16:38:44 UTC (rev 21571)
@@ -212,6 +212,8 @@
     function EndSession() {
         // $_SESSION['customer']の解放
         unset($_SESSION['customer']);
+        // セッションの配送情報を全て破棄する
+        SC_Helper_Purchase_Ex::unsetAllShippingTemp(true);
         // トランザクショントークンの破棄
         SC_Helper_Session_Ex::destroyToken();
         $objSiteSess = new SC_SiteSession_Ex();

変更: branches/version-2_12-dev/data/class/helper/SC_Helper_Purchase.php
===================================================================
--- branches/version-2_12-dev/data/class/helper/SC_Helper_Purchase.php	2012-03-01 15:53:37 UTC (rev 21570)
+++ branches/version-2_12-dev/data/class/helper/SC_Helper_Purchase.php	2012-03-01 16:38:44 UTC (rev 21571)
@@ -33,6 +33,12 @@
  */
 class SC_Helper_Purchase {
 
+    var $arrShippingKey = array(
+        'name01', 'name02', 'kana01', 'kana02',
+        'sex', 'zip01', 'zip02', 'pref', 'addr01', 'addr02',
+        'tel01', 'tel02', 'tel03',
+    );
+
     /**
      * 受注を完了する.
      *
@@ -72,13 +78,11 @@
 
         $orderTemp['status'] = $orderStatus;
         $cartkey = $objCartSession->getKey();
-        $orderId = $this->registerOrderComplete($orderTemp, $objCartSession,
-                                                $cartkey);
+        $orderId = $this->registerOrderComplete($orderTemp, $objCartSession, $cartkey);
         $isMultiple = SC_Helper_Purchase::isMultiple();
         $shippingTemp =& $this->getShippingTemp($isMultiple);
         foreach ($shippingTemp as $shippingId => $val) {
-            $this->registerShipmentItem($orderId, $shippingId,
-                                        $val['shipment_item']);
+            $this->registerShipmentItem($orderId, $shippingId, $val['shipment_item']);
         }
 
         $this->registerShipping($orderId, $shippingTemp);
@@ -311,9 +315,13 @@
      */
     function clearShipmentItemTemp($shipping_id = null) {
         if (is_null($shipping_id)) {
-            unset($_SESSION['shipping']);
+            if (!isset($_SESSION['shipping'][$shipping_id])) return;
+            if (!is_array($_SESSION['shipping'][$shipping_id])) return;
+            foreach (array_keys($_SESSION['shipping'][$shipping_id]) as $key) {
+                $this->clearShipmentItemTemp($key);
+            }
         } else {
-            unset($_SESSION['shipping'][$shipping_id]);
+            unset($_SESSION['shipping'][$shipping_id]['shipment_item']);
         }
     }
 
@@ -369,12 +377,13 @@
      * @return boolean 複数配送指定の購入の場合 true
      */
     function isMultiple() {
-        return count(SC_Helper_Purchase_Ex::getShippingTemp(true)) >= 1;
+        return count(SC_Helper_Purchase_Ex::getShippingTemp(true)) >= 2;
     }
 
     /**
      * 配送情報をセッションに保存する.
      *
+     * XXX マージする理由が不明(なんとなく便利な気はするけど)。分かる方コメントに残してください。
      * @param array $arrSrc 配送情報の連想配列
      * @param integer $shipping_id 配送先ID
      * @return void
@@ -383,24 +392,48 @@
         // 配送商品は引き継がない
         unset($arrSrc['shipment_item']);
 
-        if (empty($_SESSION['shipping'][$shipping_id])) {
-            $_SESSION['shipping'][$shipping_id] = $arrSrc;
-            $_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id;
-        } else {
-            $_SESSION['shipping'][$shipping_id] = array_merge($_SESSION['shipping'][$shipping_id], $arrSrc);
-            $_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id;
+        if (!isset($_SESSION['shipping'][$shipping_id])) {
+            $_SESSION['shipping'][$shipping_id] = array();
         }
+        $_SESSION['shipping'][$shipping_id] = array_merge($_SESSION['shipping'][$shipping_id], $arrSrc);
+        $_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id;
     }
 
     /**
      * セッションの配送情報を破棄する.
+     *
+     * @deprecated 2.12.0 から EC-CUBE 本体では使用していない。
+     * @param integer $shipping_id 配送先ID
+     * @return void
      */
     function unsetShippingTemp() {
+        $this->unsetAllShippingTemp(true);
+    }
+
+    /**
+     * セッションの配送情報を全て破棄する
+     *
+     * @param bool $multiple_temp 複数お届け先の画面戻り処理用の情報も破棄するか
+     * @return void
+     */
+    function unsetAllShippingTemp($multiple_temp = false) {
         unset($_SESSION['shipping']);
-        unset($_SESSION['multiple_temp']);
+        if ($multiple_temp) {
+            unset($_SESSION['multiple_temp']);
+        }
     }
 
     /**
+     * セッションの配送情報を個別に破棄する
+     *
+     * @param integer $shipping_id 配送先ID
+     * @return void
+     */
+    function unsetOneShippingTemp($shipping_id) {
+        unset($_SESSION['shipping'][$shipping_id]);
+    }
+
+    /**
      * 会員情報を受注情報にコピーする.
      *
      * ユーザーがログインしていない場合は何もしない.
@@ -452,33 +485,43 @@
      *
      * @param array $dest コピー先の配列
      * @param array $src コピー元の配列
-     * @param array $keys コピー対象のキー
+     * @param array $arrKey コピー対象のキー
      * @param string $prefix コピー先の接頭辞. デフォルト shipping
      * @param string $src_prefix コピー元の接頭辞. デフォルト order
      * @return void
      */
-    function copyFromOrder(&$dest, $src,
-        $prefix = 'shipping', $src_prefix = 'order',
-        $keys = array(
-            'name01', 'name02', 'kana01', 'kana02',
-            'sex', 'zip01', 'zip02', 'pref', 'addr01', 'addr02',
-            'tel01', 'tel02', 'tel03',
-        )
-    ) {
+    function copyFromOrder(&$dest, $src, $prefix = 'shipping', $src_prefix = 'order', $arrKey = null) {
+        if (is_null($arrKey)) {
+            $arrKey = $this->arrShippingKey;
+        }
         if (!SC_Utils_Ex::isBlank($prefix)) {
             $prefix = $prefix . '_';
         }
         if (!SC_Utils_Ex::isBlank($src_prefix)) {
             $src_prefix = $src_prefix . '_';
         }
-        foreach ($keys as $key) {
-            if (in_array($key, $keys)) {
+        foreach ($arrKey as $key) {
+            if (isset($src[$src_prefix . $key])) {
                 $dest[$prefix . $key] = $src[$src_prefix . $key];
             }
         }
     }
 
     /**
+     * 配送情報のみ抜き出す。
+     *
+     * @param string $arrSrc 元となる配列
+     * @return void
+     */
+    function extractShipping($arrSrc) {
+        $arrKey = array();
+        foreach($this->arrShippingKey as $key) {
+            $arrKey[] = 'shipping_' . $key;
+        }
+        return SC_Utils_Ex::sfArrayIntersectKeys($arrSrc, $arrKey);
+    }
+
+    /**
      * 購入金額に応じた支払方法を取得する.
      *
      * @param integer $total 購入金額
@@ -1285,7 +1328,26 @@
         SC_SiteSession_Ex::unsetUniqId();
 
         // セッションの配送情報を破棄する.
-        $this->unsetShippingTemp();
+        $this->unsetAllShippingTemp(true);
         $objCustomer->updateSession();
     }
+
+    /**
+     * 単一配送指定用に配送商品を設定する
+     *
+     * @param SC_CartSession $objCartSession カート情報のインスタンス
+     * @param integer $shipping_id 配送先ID
+     * @return void
+     */
+    function setShipmentItemTempForSole(&$objCartSession, $shipping_id = 0) {
+        $objCartSess = new SC_CartSession_Ex();
+
+        $this->clearShipmentItemTemp();
+
+        $arrCartList =& $objCartSession->getCartList($objCartSess->getKey());
+        foreach ($arrCartList as $arrCartRow) {
+            if ($arrCartRow['quantity'] == 0) continue;
+            $this->setShipmentItemTemp($shipping_id, $arrCartRow['id'], $arrCartRow['quantity']);
+        }
+    }
 }

変更: branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping.php	2012-03-01 15:53:37 UTC (rev 21570)
+++ branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping.php	2012-03-01 16:38:44 UTC (rev 21571)
@@ -178,9 +178,8 @@
                 $this->arrErr = $this->lfCheckError($objFormParam);
 
                 if (SC_Utils_Ex::isBlank($this->arrErr)) {
-                    $objPurchase->unsetShippingTemp();
-                    $this->lfRegistData($this->tpl_uniqid, $objPurchase,
-                                        $objCustomer, $objFormParam);
+                    $this->lfRegistData($this->tpl_uniqid, $objPurchase, $objCustomer, $objFormParam);
+                    $objPurchase->setShipmentItemTempForSole($objCartSess);
 
                     $objSiteSess->setRegistFlag();
                     SC_Response_Ex::sendRedirect(SHOPPING_PAYMENT_URLPATH);
@@ -207,9 +206,7 @@
                 $this->arrErr = $this->lfCheckError($objFormParam);
 
                 if (SC_Utils_Ex::isBlank($this->arrErr)) {
-                    $objPurchase->unsetShippingTemp();
-                    $this->lfRegistData($this->tpl_uniqid, $objPurchase,
-                                        $objCustomer, $objFormParam, true);
+                    $this->lfRegistData($this->tpl_uniqid, $objPurchase, $objCustomer, $objFormParam, true);
 
                     $objSiteSess->setRegistFlag();
                     SC_Response_Ex::sendRedirect(MULTIPLE_URLPATH);
@@ -354,6 +351,7 @@
     /**
      * データの一時登録を行う.
      *
+     * 非会員向けの処理
      * @param integer $uniqid 受注一時テーブルのユニークID
      * @param SC_Helper_Purchase $objPurchase SC_Helper_Purchase インスタンス
      * @param SC_Customer $objCustomer SC_Customer インスタンス
@@ -362,42 +360,36 @@
      */
     function lfRegistData($uniqid, &$objPurchase, &$objCustomer, &$objFormParam, $isMultiple = false) {
         $arrParams = $objFormParam->getHashArray();
-        $arrValues = $objFormParam->getDbArray();
-        // 登録データの作成
-        $arrValues['order_birth'] = SC_Utils_Ex::sfGetTimestamp($arrParams['year'], $arrParams['month'], $arrParams['day']);
-        $arrValues['update_date'] = 'CURRENT_TIMESTAMP';
-        $arrValues['customer_id'] = '0';
 
-        // お届け先を指定しない場合、
-        if ($arrParams['deliv_check'] != '1') {
-            // order_* を shipping_* へコピー
-            $objPurchase->copyFromOrder($arrValues, $arrParams);
-        }
+        // 注文者をお届け先とする配列を取得
+        $arrShippingOwn = array();
+        $objPurchase->copyFromOrder($arrShippingOwn, $arrParams);
 
-        /*
-         * order_* と shipping_* をそれぞれ $_SESSION['shipping'][$shipping_id]
-         * に, shipping_* というキーで保存
-         */
-        foreach ($arrValues as $key => $val) {
-            if (preg_match('/^order_/', $key)) {
-                $arrOrder['shipping_' . str_replace('order_', '', $key)] = $val;
-            } elseif (preg_match('/^shipping_/', $key)) {
-                $arrShipping[$key] = $val;
-            }
-        }
+        // 都度入力されたお届け先
+        $arrShipping = $objPurchase->extractShipping($arrParams);
 
         if ($isMultiple) {
-            $objPurchase->saveShippingTemp($arrOrder, 0);
+            $objPurchase->unsetShippingTemp(0);
+            $objPurchase->unsetShippingTemp(1);
+            $objPurchase->saveShippingTemp($arrShippingOwn, 0);
             if ($arrParams['deliv_check'] == '1') {
                 $objPurchase->saveShippingTemp($arrShipping, 1);
             }
         } else {
+            $objPurchase->unsetShippingTemp();
             if ($arrParams['deliv_check'] == '1') {
                 $objPurchase->saveShippingTemp($arrShipping, 0);
             } else {
-                $objPurchase->saveShippingTemp($arrOrder, 0);
+                $objPurchase->saveShippingTemp($arrShippingOwn, 0);
             }
         }
+
+        $arrValues = $objFormParam->getDbArray();
+
+        // 登録データの作成
+        $arrValues['order_birth'] = SC_Utils_Ex::sfGetTimestamp($arrParams['year'], $arrParams['month'], $arrParams['day']);
+        $arrValues['update_date'] = 'CURRENT_TIMESTAMP';
+        $arrValues['customer_id'] = '0';
         $objPurchase->saveOrderTemp($uniqid, $arrValues, $objCustomer);
     }
 

変更: branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping_Deliv.php
===================================================================
--- branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping_Deliv.php	2012-03-01 15:53:37 UTC (rev 21570)
+++ branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping_Deliv.php	2012-03-01 16:38:44 UTC (rev 21571)
@@ -114,15 +114,15 @@
             case 'customer_addr':
                 $objPurchase->unsetShippingTemp();
 
-                if ($this->registerDeliv($arrForm['deliv_check'], $this->tpl_uniqid,
-                                         $objPurchase, $objCustomer)) {
-                    $objSiteSess->setRegistFlag();
-                    SC_Response_Ex::sendRedirect(SHOPPING_PAYMENT_URLPATH);
-                    exit;
-
-                } else {
+                $success = $this->registerDeliv($arrForm['deliv_check'], $this->tpl_uniqid, $objPurchase, $objCustomer);
+                if (!$success) {
                     SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true);
                 }
+
+                $objPurchase->setShipmentItemTempForSole($objCartSess);
+                $objSiteSess->setRegistFlag();
+                SC_Response_Ex::sendRedirect(SHOPPING_PAYMENT_URLPATH);
+                exit;
                 break;
 
             // 前のページに戻る




Svn-src-all メーリングリストの案内