新开发一个批发的站,同一个产品往往存在多种规格,为了方便用户,计划在详情页对产品进行多个option的同时加购,具体效果如下:
具体关键点在两个位置,一是加购的时候执行两次add的动作,需要两次add之后在执行save。另外一个关键点在于如果已经加购过一次,如何判断购物车中存在这个规格的产品。一次提交一个产品的时候不影响,但是一次提交两个及以上产品的时候就会出现匹配混乱,需要重新校正,存在的合并,不存在的重建。
app\code\local\Glasses\Common\controllers\CartController.php集成加购控制器,自定义方法:
public function addmultipleAction()
{
$options = $this->getRequest()->getParam('options');
if (!is_array($options)) {
$this->_goBack();
return;
}
if (!$this->_validateFormKey()) {
$this->_goBack();
return;
}
$params = $this->getRequest()->getParams();
$final_params=array();
foreach ($options as $k=>$option){
$final_params[$k]['product']=$params['product'];
$final_params[$k]['options'][key($option)]=current($option);
foreach ($params['qty'] as $key=>$v){
if(key($v)==current($option)){
$final_params[$k]['qty']=current($v);
}
}
foreach ($params['true_sku'] as $key=>$v){
if(key($v)==current($option)){
$final_params[$k]['sku']=current($v);
}
}
}
//dump($final_params);exit;
$product = Mage::getModel('catalog/product')->load($params['product']);
if (!$product) {
$this->_goBack();
return;
}
$cart = Mage::getModel('checkout/cart')->init();
try {
foreach( $final_params as $param) {
$qty = $param['qty'];
if ($qty <= 0) continue; // nothing to add
Mage::getSingleton('core/session')->setTwoCart($param['sku']);
$cart->addProduct($product, $param);
}
/* keep this outside the loop */
$cart->save();
Mage::dispatchEvent('checkout_cart_add_product_complete',
array('product' => $product, 'request' => $this->getRequest(), 'response' => $this->getResponse())
);
$message = $this->__('%s was successfully added to your shopping cart.', $product->getName());
Mage::getSingleton('checkout/session')->addSuccess($message);
} catch (Mage_Core_Exception $e) {
if (Mage::getSingleton('checkout/session')->getUseNotice(true)) {
Mage::getSingleton('checkout/session')->addNotice($product->getName() . ': ' . $e->getMessage());
}
else {
Mage::getSingleton('checkout/session')->addError($product->getName() . ': ' . $e->getMessage());
}
}
catch (Exception $e) {
Mage::getSingleton('checkout/session')->addException($e, $this->__('Can not add item to shopping cart'));
}
$this->_goBack();
}
重写app\code\core\Mage\Sales\Model\Quote.php文件,在local下面,其中修改getItemByProduct()方法:
public function getItemByProduct($product)
{
//by_zx_2019
$two_sku=Mage::getSingleton('core/session')->getTwoCart();
Mage::getSingleton('core/session')->unsTwoCart();
foreach ($this->getAllItems() as $item) {
$sku=$item->getData('sku');
if($sku==$two_sku){
return $item;
}
}
return false;
//by_zx_2019
}
核心关键点就在于匹配判断规则,是否存在并新建的位置。