Incluindo vários itens com atributos diferentes no carrinho de compras programaticamente

15

Estou fazendo um sistema de adicionar ao carrinho em massa. Observe: eu quero que ele funcione para produtos simples com opções personalizadas -> Onde as opções personalizadas são como cor (vermelho, verde, azul) ou Tamanho (Xl, M, S)

Suponha que uma pessoa queira solicitar os itens abaixo:

  1. productA, redcor, qty12
  2. ProductA, greencor, qty18
  3. ProductB XL, qtd 3
  4. Product C, quantidade 10

Então, eu quero adicionar esses 4 itens por código / programaticamente de uma só vez. Como posso fazer isso? É possível via string de consulta ou qualquer controlador ou função incorporada para isso? Não precisa ser uma única consulta ou uma chamada de função apenas para ver ...

user1799722
fonte
sim exatamente como eu posso fazer isso
user1799722
que tipo de produto você está usando?
Amit Bera
@AmitBera eu estou usando produtos simples
user1799722

Respostas:

1

Portanto, para adicionar produtos ao carrinho de forma programática, é bastante simples, basta o objeto do produto e a sessão do carrinho.

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

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

Isso ocorre porque é um pouco mais difícil ao adicionar produtos configuráveis ​​ou com opções, mas tudo o que você precisa fazer é carregar o objeto do produto com as opções corretas.

Agora, o que você precisa fazer é passar uma matriz em vez de $qtye essa matriz deve ser formatada de maneira diferente, dependendo do tipo de produto que você está adicionando.

Consulte o seguinte para obter mais informações:

David Manners
fonte
graças Eu só quero adicionar objetos simples com atributos pls reler minha pergunta
user1799722
11
@ luto para que você possa adicionar produtos via URL ao carrinho, mas eu não acho que funcione com vários produtos, por isso sugiro que você crie seu próprio controlador, como na minha resposta para adicionar vários produtos.
David Manners
1

Heres um método que eu usei um tempo atrás:

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

É bem simples e testado agora para estar funcionando.

Incluí 2 produtos $productArray, um simples e outro configurável . Obviamente, você pode adicionar mais e, se o configurável tiver duas opções, como tamanho e cor , basta adicionar o adicional na matriz de opções.

Shaughn
fonte
hii obrigado eu quero trabalhar para produtos simples com opções personalizadas
user1799722
Portanto, comente a linha "unset ($ params ['options']));" em seguida, verifique se o produto tem as opções de produtos especificados
Shaughn
1

Além do fato de que usar produtos simples com opções personalizadas não é praticamente a maneira de usar "tamanho" e "cor" no magento, consegui adicionar produtos com opções personalizadas ao carrinho como este:

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

É isso que você queria dizer? Se você deseja adicionar vários produtos, basta repetir esse processo para cada produto que deseja adicionar. O fator chave é sempre ter o product_id, qty e opções fornecidas via $_POST.

simonthesorcerer
fonte
1

Você pode adicionar vários produtos simples com opções personalizadas substituindo o Cart Controller assim:

Coloquei o arquivo CartController.php aqui: 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
fonte