Добавление нескольких товаров с разными атрибутами в корзину программно

15

Я делаю массовое добавление в корзину. Пожалуйста, обратите внимание: я хочу, чтобы он работал для простых продуктов с настраиваемыми параметрами -> Там, где настраиваемые параметры похожи на цвет (красный, зеленый, синий) или размер (Xl, M, S)

Предположим, что человек хочет заказать следующие предметы:

  1. productА, redцвет qty12
  2. ProductА, greenцвет qty18
  3. ProductБ XL, кол-во 3
  4. Product С, кол-во 10

Поэтому я хочу добавить эти 4 элемента по коду / программно одновременно. Как я могу это сделать? Это возможно через строку запроса, или через любой контроллер или встроенную функцию для этого? Это не обязательно должен быть один запрос или один вызов функции только для одного сеанса ...

user1799722
источник
да, именно как я могу это сделать
user1799722
какой тип продукта вы используете?
Амит Бера
@AmitBera Я использую простые продукты
user1799722

Ответы:

1

Таким образом, добавить товары в корзину программным способом довольно просто, вам просто нужно указать объект продукта и сеанс корзины.

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

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

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

Теперь вам нужно вместо $qtyэтого передать массив, и этот массив должен быть отформатирован по-разному, в зависимости от того, какой тип продукта вы добавляете.

См. Следующее для получения дополнительной информации:

Дэвид Мэннерс
источник
спасибо, я просто хочу добавить простые объекты с атрибутами,
пожалуйста,
1
@mour, чтобы вы могли добавлять товары через URL в корзину, но я не думаю, что это будет работать с несколькими продуктами, поэтому я предлагаю создать свой собственный контроллер, как и в моем ответе, чтобы добавить несколько продуктов.
Дэвид Мэннерс
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, один простой, а другой настраиваемый . Очевидно, что вы можете добавить больше, и если конфигурируемый имеет 2 параметра, такие как размер и цвет , вы можете просто добавить дополнительные в массиве параметров.

Shaughn
источник
спасибо, я хочу работать для простых продуктов с пользовательскими настройками
user1799722
Так закомментируйте строку "unset ($ params ['options']);" затем убедитесь, что продукт имеет указанные параметры продукта
Shaughn
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.

simonthesorcerer
источник
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());
                    }

                }
            }
        }
vithyalega
источник