Programowe dodawanie wielu produktów o różnych atrybutach do koszyka

15

Tworzę system zbiorczego dodawania do koszyka. Uwaga: chcę, aby działało w przypadku prostych produktów z niestandardowymi opcjami -> Gdzie niestandardowe opcje są jak kolor (czerwony, zielony, niebieski) lub Rozmiar (Xl, M, S)

Załóżmy, że osoba chce zamówić poniższe elementy:

  1. productA, redkolor, qty12
  2. ProductA, greenkolor, qty18
  3. ProductB, ilość XL3
  4. Product C, ilość 10

Chcę więc dodać te 4 elementy kodem / programowo jednocześnie. W jaki sposób mogę to zrobić? Czy jest to możliwe za pomocą ciągu zapytania, dowolnego kontrolera lub wbudowanej funkcji? Nie musi to być ani jedno zapytanie, ani jedno wywołanie funkcji tylko na widok ...

użytkownik1799722
źródło
tak, dokładnie jak mogę to zrobić
użytkownik1799722
jakiego rodzaju produktu używasz?
Amit Bera
@AmitBera Używam prostych produktów
użytkownik1799722

Odpowiedzi:

1

Tak więc programowe dodawanie produktów do koszyka jest dość proste, wystarczy tylko obiekt produktu i sesja koszyka.

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

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

Jest tak, ponieważ nieco trudniej jest dodać konfigurowalne lub produkty z opcjami, ale wszystko, co musisz zrobić, to załadować obiekt produktu z odpowiednimi opcjami.

Teraz musisz przekazać tablicę zamiast niej, $qtya tablica ta powinna zostać sformatowana w inny sposób, w zależności od rodzaju dodawanego produktu.

Aby uzyskać więcej informacji, zobacz następujące informacje:

David Manners
źródło
dzięki, chcę tylko dodać proste obiekty z atrybutami
proszę
1
@mour, dzięki czemu możesz dodawać produkty za pośrednictwem adresu URL do koszyka, ale nie sądzę, aby działało to z wieloma produktami, więc sugeruję zbudowanie własnego kontrolera, jak w mojej odpowiedzi, aby dodać wiele produktów.
David Manners
1

Oto metoda, której użyłem jakiś czas temu:

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

Jest całkiem prosty i przetestowany, aby działać.

Posiadam 2 produkty $productArray, jeden prosty, a drugi konfigurowalny . Oczywiście możesz dodać więcej, a jeśli konfigurowalny ma 2 opcje, takie jak rozmiar i kolor , możesz po prostu dodać dodatkowe w tablicy opcji.

Shaughn
źródło
hii dzięki chcę pracować dla prostych produktów z niestandardowymi opcjami
użytkownik1799722
Skomentuj więc wiersz „unset ($ params ['options']);” następnie upewnij się, że produkt ma określone opcje produktu
Shaughn
1

Oprócz tego, że używanie prostych produktów z niestandardowymi opcjami nie jest właściwie sposobem używania „rozmiaru” i „koloru” w Magento, udało mi się dodać do koszyka produkty z niestandardowymi opcjami:

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

Czy o to ci chodziło? Jeśli chcesz dodać wiele produktów, powtórz ten proces dla każdego produktu, który chcesz dodać. Kluczowym czynnikiem jest zawsze podanie identyfikatora produktu, ilości i opcji poprzez $_POST.

simonthesorcerer
źródło
1

Możesz dodać wiele prostych produktów z niestandardowymi opcjami, zastępując kontroler koszyka w następujący sposób:

Umieściłem plik CartController.php tutaj: 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
źródło