複数の製品をカートに追加しようとするちょっとしたピックルでは、カートに追加される製品 (オブザーバー イベントで処理される無料の製品) を定義するフォーム要素を含むブロックが効果的にあります。商品の価格を無料に変更するオブザーバー イベントは正常に機能していますが、次の方法ではカートに複数の商品を追加するのが面倒です。
public function addFreeItems($observer) {
$cart = Mage::getSingleton('checkout/cart');
$freeItems = $_SESSION['package_free_item'];
$freeItemSplit = explode(",", $freeItems);
try {
foreach ($freeItemSplit as $product) {
$product = Mage::getModel('catalog/product')->load($product);
$cart->addProduct($product, array('qty' => '1'));
$cart->save();
}
} catch(Exception $e) {
Mage::log($e->getMessage());
echo $e->getMessage();
}
}
このメソッドは単一のアイテムに対して機能し、問題なく追加されますが、後続のアイテム (位置 [1] の配列で明確に定義されています) はカートに追加されません。
なぜこれが技術的にうまくいかないのか、私は途方に暮れています。追加プロセスで例外はキャッチされず、デバッグでも配列に 2 つの項目が取り込まれていることが示されます。
なぜこれが機能しないのか、誰かが光を当てることができますか?
ありがとう!
XML 更新:
<sales_quote_add_item>
<observers>
<priceupdate_observer>
<type>singleton</type>
<class>Edge_Package_Model_ObserverPrice</class>
<method>updatePrice</method>
</priceupdate_observer>
</observers>
</sales_quote_add_item>
パッケージの価格を効果的に更新するだけでなく、その中から無料の製品の追加を呼び出します。
編集2:
public function addFreeItems($observer) {
$route = Mage::app()->getFrontController()->getRequest()->getRouteName();
if($route == "packages" && $_SESSION['package_free_item'] != null ) {
$freeItems = $_SESSION['package_free_item'];
$product_ids = explode(",", $freeItems);
$cart = Mage::getSingleton('checkout/cart');
foreach ($product_ids as $product_id) {
$product = Mage::getModel('catalog/product')->load($product_id);
$cart->addProduct($product, array('qty' => '1', 'product_id' => $product->getId()));
}
$cart->save();
}
}