以编程方式将具有不同属性的多个项目添加到购物车


15

我正在批量添加购物车系统。请注意:我希望它适用于具有自定义选项的简单产品->自定义选项如颜色(红色,绿色,蓝色)或尺寸(XL,M,S)

假设某人要订购以下物品:

  1. productA,red颜色qty12
  2. ProductA,green颜色qty18
  3. ProductB XL,数量3
  4. Product C,数量10

因此,我想一次通过代码/以编程方式添加这4个项目。我怎样才能做到这一点?是否可以通过查询字符串或任何控制器或内置函数来实现?不必每次都看到一个查询或一个函数调用...


是的,我该怎么办
user1799722 2015年

您使用什么类型的产品?
阿米特·贝拉

@AmitBera我正在使用简单的产品
user1799722,2015年

Answers:


1

因此,以编程方式将产品添加到购物车非常简单,您只需要添加产品对象和购物车会话即可。

$quote = Mage::getSingleton('checkout/session')->getQuote();
$quote->addProduct($product, $qty);

$quote->collectTotals()->save();

这是因为在添加可配置的产品或带有选项的产品时要困难一些,但是您要做的就是用正确的选项加载产品对象。

现在,您需要做的是传递一个数组,而不是传递一个数组$qty,该数组应该根据您要添加的产品类型以不同的方式格式化。

有关更多信息,请参见以下内容:


谢谢,我只想添加具有属性的简单对象,请重读我的问题
user1799722,2015年

1
@mour,因此您可以通过url将产品添加到购物车,但我认为它不能与多种产品一起使用,因此我建议像在我的答案中那样构建自己的控制器以添加多种产品。
David Manners

1

这是我前一段时间使用的一种方法:

// Products array
$productArray = array(
    // Simple product
    array(
        'product_id' => 1,
        'qty' => 1
    ),
    // Configurable product
    array(
        'product_id' => 4,
        'qty' => 1,
        'options' => array(
            'color' => 'Red'
        )
    )
);

// Prepare cart products
$cartProducts = array();
foreach ($productArray as $params) {
    if (isset($params['product_id'])) {
        // Load product
        $product = Mage::getModel('catalog/product')->load($params['product_id']);

        if ($product->getId()) {
            // If product is configurable and the param options were specified
            if ($product->getTypeId() == "configurable" && isset($params['options'])) {
                // Get configurable options
                $productAttributeOptions = $product->getTypeInstance(true)
                    ->getConfigurableAttributesAsArray($product);

                foreach ($productAttributeOptions as $productAttribute) {
                    $attributeCode = $productAttribute['attribute_code'];

                    if (isset($params['options'][$attributeCode])) {
                        $optionValue = $params['options'][$attributeCode];

                        foreach ($productAttribute['values'] as $attribute) {
                            if ($optionValue == $attribute['store_label']) {
                                $params['super_attribute'] = array(
                                    $productAttribute['attribute_id'] => $attribute['value_index']
                                );
                            }
                        }
                    }
                }
            }

            unset($params['options']);
            $cartProducts[] = array(
                'product'   => $product,
                'params'    => $params
            );

        }
    }
}

// Add to cart
$cart = Mage::getModel("checkout/cart");
if (!empty($cartProducts)) {
    try{
        foreach ($cartProducts as $cartProduct) {
            $cart->addProduct($cartProduct['product'], $cartProduct['params']);
        }

        Mage::getSingleton('customer/session')->setCartWasUpdated(true);
        $cart->save();
    } catch(Exception $e) {
        Mage::log($e->getMessage());
    }
}

它相当简单,目前已经过测试,可以正常工作。

我包括2种产品$productArray,一种简单,另一种可配置。显然,您可以添加更多,如果可配置项具有两个选项,如sizecolor,则可以在options数组中添加其他选项。


嗨,谢谢,我想为带有自定义选项的简单产品工作
user1799722 2015年

因此,注释掉“ unset($ params ['options']);;”行。然后确保产品具有指定的产品选项
Shaughn 2015年

1

除了使用带有自定义选项的简单产品几乎不是在magento中使用“尺寸”和“颜色”的方式之外,我还设法将具有自定义选项的产品添加到购物车中,如下所示:

/*
 * Assuming this is inside a method in a custom controller
 * that receives a $_POST
 */
$post = $this->getRequest()->getPost();

// load the product first
$product = Mage::getModel('catalog/product')->load($post['product_id']);
$options = $product->getOptions();

// this is the format for the $params-Array
$params = array(
    'product' => $product->getId(),
    'qty' => $post['qty'],
    'related_product' => null,
    'options' => array()
);
// loop through the options we get from $_POST
// and check if they are a product option, then add to $params
foreach( $post as $key => $value ) {
    if(isset($options[$key]) {
        $params['options'][$key] = $value; 
    }
}

// add the product and its options to the cart
$cart->addProduct($product, $params);

这是你的意思吗?如果要添加多个产品,只需对要添加的每个产品重复此过程。关键因素始终是通过给出product_id,qty和选项$_POST


1

您可以通过以下方法覆盖购物车控制器来添加具有自定义选项的多种简单产品:

我将CartController.php文件放在这里:https : //github.com/svlega/Multiple-Products-AddtoCart

        //Programatically Adding multiple products to cart
        $productArray = array(
            array(
                'product_id' => 7,
                'qty' => 2,
                'custom_options' => array(
                    'size' => 'XL'
                )
            ),
            array(
                'product_id' => 1,
                'qty' => 1,
                'custom_options' => array(
                    'color' => 'Red'
                )
            )   

        );

        // Prepare cart products
        foreach ($productArray as $params) {
            if (isset($params['product_id'])) {
                // Load product
                $product = Mage::getModel('catalog/product')->load($params['product_id']);

                if ($product->getId()) {
                    // If product is configurable and the param options were specified
                    if (isset($params['custom_options'])) {
                        // Get options                
                        $options = $product->getOptions();
                            foreach ($options as $option) {
                                /* @var $option Mage_Catalog_Model_Product_Option */                        
                                if ($option->getGroupByType() == Mage_Catalog_Model_Product_Option::OPTION_GROUP_SELECT) {                          

                                    $product_options[$option->getTitle()] = $option->getId();
                                    if(array_key_exists($option->getTitle(),$params['custom_options'])){
                                    $option_id =  $option->getId();                 
                                        echo '<br>Did'.$id = $option->getId().'Dlabe'.$option->getTitle();
                                    foreach ($option->getValues() as $value) {                          
                                        /* @var $value Mage_Catalog_Model_Product_Option_Value */                    
                                       if($value->getTitle()== $params['custom_options'][$option->getTitle()]){     
                                echo 'id'.$id = $value->getId().'labe'.$value->getTitle();
                                       $params['options'][$option->getId()]=$value->getId();
                                       }                                
                                    }
                                    }                          
                            }
                            }
                    }

                    try{
                    $cart = Mage::getModel('checkout/cart');
                    $cart->addProduct($product, $params);
                    $cart->save();
                    }catch(Exception $e) {
                    Mage::log($e->getMessage());
                    }

                }
            }
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.