Changeset 21571


Ignore:
Timestamp:
2012/03/02 01:38:44 (12 years ago)
Author:
Seasoft
Message:

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

Location:
branches/version-2_12-dev/data
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/version-2_12-dev/data/Smarty/templates/default/shopping/payment.tpl

    r21549 r21571  
    278278            <ul> 
    279279                <li> 
    280                 <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')"> 
     280                <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')"> 
    281281                    <img src="<!--{$TPL_URLPATH}-->img/button/btn_back.jpg" alt="戻る" border="0" name="back03" id="back03" /></a> 
    282282                </li> 
  • branches/version-2_12-dev/data/class/SC_Customer.php

    r21527 r21571  
    213213        // $_SESSION['customer']の解放 
    214214        unset($_SESSION['customer']); 
     215        // セッションの配送情報を全て破棄する 
     216        SC_Helper_Purchase_Ex::unsetAllShippingTemp(true); 
    215217        // トランザクショントークンの破棄 
    216218        SC_Helper_Session_Ex::destroyToken(); 
  • branches/version-2_12-dev/data/class/helper/SC_Helper_Purchase.php

    r21570 r21571  
    3434class SC_Helper_Purchase { 
    3535 
     36    var $arrShippingKey = array( 
     37        'name01', 'name02', 'kana01', 'kana02', 
     38        'sex', 'zip01', 'zip02', 'pref', 'addr01', 'addr02', 
     39        'tel01', 'tel02', 'tel03', 
     40    ); 
     41 
    3642    /** 
    3743     * 受注を完了する. 
     
    7379        $orderTemp['status'] = $orderStatus; 
    7480        $cartkey = $objCartSession->getKey(); 
    75         $orderId = $this->registerOrderComplete($orderTemp, $objCartSession, 
    76                                                 $cartkey); 
     81        $orderId = $this->registerOrderComplete($orderTemp, $objCartSession, $cartkey); 
    7782        $isMultiple = SC_Helper_Purchase::isMultiple(); 
    7883        $shippingTemp =& $this->getShippingTemp($isMultiple); 
    7984        foreach ($shippingTemp as $shippingId => $val) { 
    80             $this->registerShipmentItem($orderId, $shippingId, 
    81                                         $val['shipment_item']); 
     85            $this->registerShipmentItem($orderId, $shippingId, $val['shipment_item']); 
    8286        } 
    8387 
     
    312316    function clearShipmentItemTemp($shipping_id = null) { 
    313317        if (is_null($shipping_id)) { 
    314             unset($_SESSION['shipping']); 
     318            if (!isset($_SESSION['shipping'][$shipping_id])) return; 
     319            if (!is_array($_SESSION['shipping'][$shipping_id])) return; 
     320            foreach (array_keys($_SESSION['shipping'][$shipping_id]) as $key) { 
     321                $this->clearShipmentItemTemp($key); 
     322            } 
    315323        } else { 
    316             unset($_SESSION['shipping'][$shipping_id]); 
     324            unset($_SESSION['shipping'][$shipping_id]['shipment_item']); 
    317325        } 
    318326    } 
     
    370378     */ 
    371379    function isMultiple() { 
    372         return count(SC_Helper_Purchase_Ex::getShippingTemp(true)) >= 1; 
     380        return count(SC_Helper_Purchase_Ex::getShippingTemp(true)) >= 2; 
    373381    } 
    374382 
     
    376384     * 配送情報をセッションに保存する. 
    377385     * 
     386     * XXX マージする理由が不明(なんとなく便利な気はするけど)。分かる方コメントに残してください。 
    378387     * @param array $arrSrc 配送情報の連想配列 
    379388     * @param integer $shipping_id 配送先ID 
     
    384393        unset($arrSrc['shipment_item']); 
    385394 
    386         if (empty($_SESSION['shipping'][$shipping_id])) { 
    387             $_SESSION['shipping'][$shipping_id] = $arrSrc; 
    388             $_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id; 
    389         } else { 
    390             $_SESSION['shipping'][$shipping_id] = array_merge($_SESSION['shipping'][$shipping_id], $arrSrc); 
    391             $_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id; 
    392         } 
     395        if (!isset($_SESSION['shipping'][$shipping_id])) { 
     396            $_SESSION['shipping'][$shipping_id] = array(); 
     397        } 
     398        $_SESSION['shipping'][$shipping_id] = array_merge($_SESSION['shipping'][$shipping_id], $arrSrc); 
     399        $_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id; 
    393400    } 
    394401 
    395402    /** 
    396403     * セッションの配送情報を破棄する. 
     404     * 
     405     * @deprecated 2.12.0 から EC-CUBE 本体では使用していない。 
     406     * @param integer $shipping_id 配送先ID 
     407     * @return void 
    397408     */ 
    398409    function unsetShippingTemp() { 
     410        $this->unsetAllShippingTemp(true); 
     411    } 
     412 
     413    /** 
     414     * セッションの配送情報を全て破棄する 
     415     * 
     416     * @param bool $multiple_temp 複数お届け先の画面戻り処理用の情報も破棄するか 
     417     * @return void 
     418     */ 
     419    function unsetAllShippingTemp($multiple_temp = false) { 
    399420        unset($_SESSION['shipping']); 
    400         unset($_SESSION['multiple_temp']); 
     421        if ($multiple_temp) { 
     422            unset($_SESSION['multiple_temp']); 
     423        } 
     424    } 
     425 
     426    /** 
     427     * セッションの配送情報を個別に破棄する 
     428     * 
     429     * @param integer $shipping_id 配送先ID 
     430     * @return void 
     431     */ 
     432    function unsetOneShippingTemp($shipping_id) { 
     433        unset($_SESSION['shipping'][$shipping_id]); 
    401434    } 
    402435 
     
    453486     * @param array $dest コピー先の配列 
    454487     * @param array $src コピー元の配列 
    455      * @param array $keys コピー対象のキー 
     488     * @param array $arrKey コピー対象のキー 
    456489     * @param string $prefix コピー先の接頭辞. デフォルト shipping 
    457490     * @param string $src_prefix コピー元の接頭辞. デフォルト order 
    458491     * @return void 
    459492     */ 
    460     function copyFromOrder(&$dest, $src, 
    461         $prefix = 'shipping', $src_prefix = 'order', 
    462         $keys = array( 
    463             'name01', 'name02', 'kana01', 'kana02', 
    464             'sex', 'zip01', 'zip02', 'pref', 'addr01', 'addr02', 
    465             'tel01', 'tel02', 'tel03', 
    466         ) 
    467     ) { 
     493    function copyFromOrder(&$dest, $src, $prefix = 'shipping', $src_prefix = 'order', $arrKey = null) { 
     494        if (is_null($arrKey)) { 
     495            $arrKey = $this->arrShippingKey; 
     496        } 
    468497        if (!SC_Utils_Ex::isBlank($prefix)) { 
    469498            $prefix = $prefix . '_'; 
     
    472501            $src_prefix = $src_prefix . '_'; 
    473502        } 
    474         foreach ($keys as $key) { 
    475             if (in_array($key, $keys)) { 
     503        foreach ($arrKey as $key) { 
     504            if (isset($src[$src_prefix . $key])) { 
    476505                $dest[$prefix . $key] = $src[$src_prefix . $key]; 
    477506            } 
    478507        } 
     508    } 
     509 
     510    /** 
     511     * 配送情報のみ抜き出す。 
     512     * 
     513     * @param string $arrSrc 元となる配列 
     514     * @return void 
     515     */ 
     516    function extractShipping($arrSrc) { 
     517        $arrKey = array(); 
     518        foreach($this->arrShippingKey as $key) { 
     519            $arrKey[] = 'shipping_' . $key; 
     520        } 
     521        return SC_Utils_Ex::sfArrayIntersectKeys($arrSrc, $arrKey); 
    479522    } 
    480523 
     
    12861329 
    12871330        // セッションの配送情報を破棄する. 
    1288         $this->unsetShippingTemp(); 
     1331        $this->unsetAllShippingTemp(true); 
    12891332        $objCustomer->updateSession(); 
    12901333    } 
     1334 
     1335    /** 
     1336     * 単一配送指定用に配送商品を設定する 
     1337     * 
     1338     * @param SC_CartSession $objCartSession カート情報のインスタンス 
     1339     * @param integer $shipping_id 配送先ID 
     1340     * @return void 
     1341     */ 
     1342    function setShipmentItemTempForSole(&$objCartSession, $shipping_id = 0) { 
     1343        $objCartSess = new SC_CartSession_Ex(); 
     1344 
     1345        $this->clearShipmentItemTemp(); 
     1346 
     1347        $arrCartList =& $objCartSession->getCartList($objCartSess->getKey()); 
     1348        foreach ($arrCartList as $arrCartRow) { 
     1349            if ($arrCartRow['quantity'] == 0) continue; 
     1350            $this->setShipmentItemTemp($shipping_id, $arrCartRow['id'], $arrCartRow['quantity']); 
     1351        } 
     1352    } 
    12911353} 
  • branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping.php

    r21527 r21571  
    179179 
    180180                if (SC_Utils_Ex::isBlank($this->arrErr)) { 
    181                     $objPurchase->unsetShippingTemp(); 
    182                     $this->lfRegistData($this->tpl_uniqid, $objPurchase, 
    183                                         $objCustomer, $objFormParam); 
     181                    $this->lfRegistData($this->tpl_uniqid, $objPurchase, $objCustomer, $objFormParam); 
     182                    $objPurchase->setShipmentItemTempForSole($objCartSess); 
    184183 
    185184                    $objSiteSess->setRegistFlag(); 
     
    208207 
    209208                if (SC_Utils_Ex::isBlank($this->arrErr)) { 
    210                     $objPurchase->unsetShippingTemp(); 
    211                     $this->lfRegistData($this->tpl_uniqid, $objPurchase, 
    212                                         $objCustomer, $objFormParam, true); 
     209                    $this->lfRegistData($this->tpl_uniqid, $objPurchase, $objCustomer, $objFormParam, true); 
    213210 
    214211                    $objSiteSess->setRegistFlag(); 
     
    355352     * データの一時登録を行う. 
    356353     * 
     354     * 非会員向けの処理 
    357355     * @param integer $uniqid 受注一時テーブルのユニークID 
    358356     * @param SC_Helper_Purchase $objPurchase SC_Helper_Purchase インスタンス 
     
    363361    function lfRegistData($uniqid, &$objPurchase, &$objCustomer, &$objFormParam, $isMultiple = false) { 
    364362        $arrParams = $objFormParam->getHashArray(); 
     363 
     364        // 注文者をお届け先とする配列を取得 
     365        $arrShippingOwn = array(); 
     366        $objPurchase->copyFromOrder($arrShippingOwn, $arrParams); 
     367 
     368        // 都度入力されたお届け先 
     369        $arrShipping = $objPurchase->extractShipping($arrParams); 
     370 
     371        if ($isMultiple) { 
     372            $objPurchase->unsetShippingTemp(0); 
     373            $objPurchase->unsetShippingTemp(1); 
     374            $objPurchase->saveShippingTemp($arrShippingOwn, 0); 
     375            if ($arrParams['deliv_check'] == '1') { 
     376                $objPurchase->saveShippingTemp($arrShipping, 1); 
     377            } 
     378        } else { 
     379            $objPurchase->unsetShippingTemp(); 
     380            if ($arrParams['deliv_check'] == '1') { 
     381                $objPurchase->saveShippingTemp($arrShipping, 0); 
     382            } else { 
     383                $objPurchase->saveShippingTemp($arrShippingOwn, 0); 
     384            } 
     385        } 
     386 
    365387        $arrValues = $objFormParam->getDbArray(); 
     388 
    366389        // 登録データの作成 
    367390        $arrValues['order_birth'] = SC_Utils_Ex::sfGetTimestamp($arrParams['year'], $arrParams['month'], $arrParams['day']); 
    368391        $arrValues['update_date'] = 'CURRENT_TIMESTAMP'; 
    369392        $arrValues['customer_id'] = '0'; 
    370  
    371         // お届け先を指定しない場合、 
    372         if ($arrParams['deliv_check'] != '1') { 
    373             // order_* を shipping_* へコピー 
    374             $objPurchase->copyFromOrder($arrValues, $arrParams); 
    375         } 
    376  
    377         /* 
    378          * order_* と shipping_* をそれぞれ $_SESSION['shipping'][$shipping_id] 
    379          * に, shipping_* というキーで保存 
    380          */ 
    381         foreach ($arrValues as $key => $val) { 
    382             if (preg_match('/^order_/', $key)) { 
    383                 $arrOrder['shipping_' . str_replace('order_', '', $key)] = $val; 
    384             } elseif (preg_match('/^shipping_/', $key)) { 
    385                 $arrShipping[$key] = $val; 
    386             } 
    387         } 
    388  
    389         if ($isMultiple) { 
    390             $objPurchase->saveShippingTemp($arrOrder, 0); 
    391             if ($arrParams['deliv_check'] == '1') { 
    392                 $objPurchase->saveShippingTemp($arrShipping, 1); 
    393             } 
    394         } else { 
    395             if ($arrParams['deliv_check'] == '1') { 
    396                 $objPurchase->saveShippingTemp($arrShipping, 0); 
    397             } else { 
    398                 $objPurchase->saveShippingTemp($arrOrder, 0); 
    399             } 
    400         } 
    401393        $objPurchase->saveOrderTemp($uniqid, $arrValues, $objCustomer); 
    402394    } 
  • branches/version-2_12-dev/data/class/pages/shopping/LC_Page_Shopping_Deliv.php

    r21570 r21571  
    115115                $objPurchase->unsetShippingTemp(); 
    116116 
    117                 if ($this->registerDeliv($arrForm['deliv_check'], $this->tpl_uniqid, 
    118                                          $objPurchase, $objCustomer)) { 
    119                     $objSiteSess->setRegistFlag(); 
    120                     SC_Response_Ex::sendRedirect(SHOPPING_PAYMENT_URLPATH); 
    121                     exit; 
    122  
    123                 } else { 
     117                $success = $this->registerDeliv($arrForm['deliv_check'], $this->tpl_uniqid, $objPurchase, $objCustomer); 
     118                if (!$success) { 
    124119                    SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, '', true); 
    125120                } 
     121 
     122                $objPurchase->setShipmentItemTempForSole($objCartSess); 
     123                $objSiteSess->setRegistFlag(); 
     124                SC_Response_Ex::sendRedirect(SHOPPING_PAYMENT_URLPATH); 
     125                exit; 
    126126                break; 
    127127 
Note: See TracChangeset for help on using the changeset viewer.