Agregar múltiples artículos con diferentes atributos al carrito mediante programación


15

Estoy haciendo un sistema de agregar al carrito a granel. Tenga en cuenta: quiero que funcione para productos simples con opciones personalizadas -> Donde las opciones personalizadas son como color (rojo, verde, azul) o Tamaño (Xl, M, S)

Supongamos que una persona quiere ordenar los siguientes artículos:

  1. productA, redcolor, qty12
  2. ProductA, greencolor, qty18
  3. ProductB XL, cantidad 3
  4. Product C, cantidad 10

Así que quiero agregar estos 4 elementos por código / mediante programación a la vez. ¿Cómo puedo hacer esto? ¿Es posible a través de una cadena de consulta, o cualquier controlador o función incorporada para eso? No tiene que ser una sola consulta o una llamada de función solo por ver ...


Sí exactamente cómo puedo hacer esto
— user1799722

¿Qué tipo de producto estás usando?
— Amit Bera

@AmitBera estoy usando productos simples
— user1799722

Respuestas:


1

Por lo tanto, agregar productos al carrito mediante programación es bastante simple, solo necesita el objeto del producto y la sesión del carrito.

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

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

Esto se debe a que es un poco más difícil al agregar productos configurables o con opciones, pero todo lo que necesita hacer es cargar el objeto del producto con las opciones correctas.

Ahora, lo que debe hacer es pasar una matriz en lugar de $qtyy esta matriz debe formatearse de una manera diferente dependiendo del tipo de producto que esté agregando.

Consulte lo siguiente para obtener más información:


gracias solo quiero agregar objetos simples con atributos por favor releer mi pregunta
— user1799722

1
@mour para que pueda agregar productos a través de la URL al carrito, pero no creo que funcione con varios productos, así que sugiero construir su propio controlador como en mi respuesta para agregar múltiples productos.
— David Manners

1

Aquí hay un método que usé hace un tiempo:

// 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());
    }
}

Es bastante sencillo y probado en este momento para estar funcionando.

He incluido 2 productos $productArray, uno simple y otro configurable . Obviamente, podría agregar más y si el configurable tenía 2 opciones como tamaño y color , simplemente podría agregar el adicional en la matriz de opciones.


hola gracias quiero trabajar para productos simples con opciones personalizadas
— user1799722

Así que comente la línea "unset ($ params ['options']);" luego asegúrese de que el producto tenga las opciones de producto especificadas
— Shaughn

1

Además de que el uso de productos simples con opciones personalizadas no es casi la forma de usar "tamaño" y "color" en magento, logré agregar productos con opciones personalizadas al carrito de esta manera:

/*
 * 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);

¿Es esto lo que quisiste decir? Si desea agregar varios productos, simplemente repita este proceso para cada producto que desee agregar. El factor clave siempre es tener el product_id, qty y las opciones dadas a través de $_POST.


1

Puede agregar varios productos simples con opciones personalizadas sobrescribiendo el Controlador de carrito de la siguiente manera:

He colocado el archivo CartController.php aquí: 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());
                    }

                }
            }
        }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.