Magento добавляет несколько настраиваемых вариантов продукта, добавляя первый раз несколько раз

Я пытаюсь добавить несколько вариантов конфигурируемого продукта в корзину одновременно, и я собрал код, но в настоящее время он добавляет нужное количество продуктов, но только с использованием первого варианта.

Другими словами, если я попытаюсь добавить 2 зеленых футболки и 4 белых футболки, это добавит 6 зеленых футболок.

Вот код, который я получил:

public function indexAction ()   {
$post = $this->getRequest()->getPost();
$attr = array_keys($post['super_attribute']);
$cart = Mage::getSingleton('checkout/cart');
$product = Mage::getModel('catalog/product')->load($post['product']);
foreach ($post['super_attribute'][$attr[0]] as $optId){

if (abs($post['qty'][$optId]) > 0){

$options = array(
//"product"=>$post['product'],
"super_attribute"=>array(
$attr[0] => $optId
),
"qty"=>$post['qty'][$optId]
);

echo "Add To Cart:";
print_r($options);
echo "<br /><br />";
$cart->addProduct($product, $options);
}

}

$cart->save(); // save the cart
Mage::getSingleton('checkout/session')->setCartWasUpdated(true);

die("??");
$this->_redirect('checkout/cart/');
}

И из этого print_r, это подтверждает, что параметры верны:

 Add To Cart:Array ( [super_attribute] => Array ( [141] => 5 ) [qty] => 2 )

Add To Cart:Array ( [super_attribute] => Array ( [141] => 4 ) [qty] => 4 )

Но в корзине я вижу 6 из первых super_attribute.

Что мне нужно сделать, чтобы «сбросить» корзину после добавления каждого элемента или что-то еще?

Спасибо!

1

Решение

Я наткнулся на этот вопрос, и ответы не помогли. Поэтому я публикую свою версию здесь.

$parentProduct = Mage::getModel('catalog/product')->load($parentId)
->setStoreId(Mage::app()->getStore()->getId());

foreach($postData['super_attribute'] as $simpleProdId => $simpleProdConfig){

//This cloning is important
$product = clone $parentProduct;

$cartParams = array();

$cartParams = array(
'super_attribute' => $simpleProdConfig['super_attribute'],
'qty' => $simpleProdConfig['qty'],
);

$this->_getCart()->addProduct($product, $cartParams);

}

$this->_getCart()->save();

$this->_getSession()->setCartWasUpdated(true);

Или вместо передачи родительского объекта продукта передайте его идентификатор, как это кажется, работает, хотя запрос становится медленным.

$parentProduct = Mage::getModel('catalog/product')->load($parentId)
->setStoreId(Mage::app()->getStore()->getId());

foreach($postData['super_attribute'] as $simpleProdId => $simpleProdConfig){

$cartParams = array();

$cartParams = array(
'super_attribute' => $simpleProdConfig['super_attribute'],
'qty' => $simpleProdConfig['qty'],
);

//Passing id instead of instance of the parent product here
$this->_getCart()->addProduct($parentProduct->getId(), $cartParams);

}

$this->_getCart()->save();

$this->_getSession()->setCartWasUpdated(true);
1

Другие решения

создать пользовательский модуль в etc / config.xml add

<?xml version="1.0"?>
<config>
<modules>
<Package_Mymodule>
<version>0.1.0</version>
</Package_Mymodule>
</modules>
<global>
<models>
<checkout>
<rewrite>
<cart>Package_Mymodule_Model_Checkout_Cart</cart>
</rewrite>
</checkout>
</models>
</global>
</config>

и создайте файл по следующему пути Package / Mymodule / model / Checkout / Cart.php

class Package_Mymodule_Model_Checkout_Cart extends Mage_Checkout_Model_Cart{
public function addProduct($productInfo, $requestInfo=null){
$producstChildId = $requestInfo['product_child_id'];

foreach ($producstChildId as $key => $value){
$requestInfo['qty'] = current($value);

if($requestInfo['qty']){
//It is the size of the product
$requestInfo['super_attribute'][133] = key($value);

$product = Mage::getModel('catalog/product')
->setStoreId(Mage::app()->getStore()->getId())
->load($requestInfo['product'])
->setConfiguredAttributes(array('super_attribute'=>$requestInfo['super_attribute']));
parent::addProduct($product,$requestInfo);
}
}
}
}
0

По вопросам рекламы [email protected]