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 ...

usuario1799722
fuente
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:

David modales
fuente
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.

Shaughn
fuente
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.

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

                }
            }
        }
vithyalega
fuente