Ticket #1921 (closed バグ指摘: 修正済)
商品種別の違う商品を購入しようとするとエラー
Reported by: | h_yoshimoto | Owned by: | habu |
---|---|---|---|
Priority: | 中 | Milestone: | EC-CUBE2.12.3 |
Component: | フロント | Version: | 2.12.1 |
Keywords: | Cc: | ||
修正済み: | yes |
Description (last modified by habu) (diff)
開発コミュニティよりバグの報告を頂きました。 http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=10946&forum=8&post_id=52288
[2.12.1]商品種別の違う商品を購入しようとするとエラー 商品種別の違う商品をカートに入れた際に、処理が進めなくなる不具合がありましたので、報告します(Ver2.11.2)。 再現手順 1.レシピをカートに入れ、確認画面に進む 2.カテゴリリンクなどから商品ページに戻りおなべをカートに追加する(商品種別が違うもの) 3.カートにはレシピとおなべが入った状態になる。そこからどちらかの購入手続きに進もうとすると 「商品購入中にカート内容が変更されましたので、お手数ですが購入手続きをやり直して下さい。」 と表示されて進めない(どちらかを削除すると進めます)。
r22004 にて修正しました。
■原因
r21924 までは、 カートに変更があったという事を正しく返せていなかった様です。
r21925 にて、 SC_CartSession.php の checkChangeCart の以下の行が修正され、 購入処理開始時のカートと現在のカートに差異があった場合に、 正しくその事を返せるように修正されています。
$this->cartSession[$productTypeId][$key]['cancel_purchase'] = true; ↓↓↓修正([$key]を削除)↓↓↓ $this->cartSession[$productTypeId]['cancel_purchase'] = true;
しかし、こうして、SC_CartSession::checkChangeCart が正しく動作する様になった事で、 SC_Helper_Purchase::verifyChangeCart での不具合が表面化してきたというのが、本件の原因の様です。
具体的には、以下の様に、購入処理対象の商品タイプ以外についてもチェックを行なうようになっている事が原因です。
foreach ($cartKeys as $cartKey) { // 初回のみカートの内容を保存 $objCartSession->saveCurrentCart($uniqId, $cartKey); /* * POSTのユニークIDとセッションのユニークIDを比較 *(ユニークIDがPOSTされていない場合はスルー) */ if (!SC_SiteSession_Ex::checkUniqId()) { SC_Utils_Ex::sfDispSiteError(CANCEL_PURCHASE); exit; } // 購入ボタンを押してから変化がないか $quantity = $objCartSession->getTotalQuantity($cartKey); if ($objCartSession->checkChangeCart($cartKey) || !($quantity > 0)) { SC_Response_Ex::sendRedirect(CART_URLPATH); exit; } }
「初回のみカートの内容を保存」というコメントの通り、 SC_CartSession::saveCurrentCart の第1引数に同じ $uniqId を渡していますので、 購入処理開始時のカートとしては、 foreachの最初のループで処理される商品タイプのカートしか保存されません。
そして、2回目以降のループにて、 $objCartSession->checkChangeCart($cartKey) が実行される際、別の商品タイプのカート情報と、 購入処理開始時のカート(←最初に実行された商品タイプのカート情報が保存されている)の商品の個数が比較され、 ”カートの内容が変更された”と誤って判断されていました。
■修正方法
SC_Helper_Purchase::verifyChangeCart にて、 購入処理対象の商品タイプのみ、カート情報をチェックする様に修正しました。
■念のため確認
なんらかの意図があって、購入処理対象の商品タイプ以外についてもチェックを行なうように 途中から処理が追加されたのではない事を確認するため、チェンジログを追ってみましたが、 verifyChangeCart関数がSC_Helper_Purchase.phpに追加された r19860 にて、 最初からこの作りになっていた事を確認できました。