Hinzufügen mehrerer Artikel mit unterschiedlichen Attributen zum programmgesteuerten Warenkorb

15

Ich mache eine Bulk-Add-to-Cart-System. Bitte beachten Sie: Ich möchte, dass es für einfache Produkte mit benutzerdefinierten Optionen funktioniert -> Wenn benutzerdefinierte Optionen wie Farbe (rot, grün, blau) oder Größe (Xl, M, S) sind.

Angenommen, eine Person möchte folgende Artikel bestellen:

  1. productA, redFarbe, qty12
  2. ProductA, greenFarbe, qty18
  3. ProductB XL,, Menge 3
  4. Product C, Menge 10

Also möchte ich diese 4 Elemente per Code / programmgesteuert auf einmal hinzufügen. Wie kann ich das machen? Ist das über einen Abfrage-String oder einen Controller oder eine eingebaute Funktion möglich? Es muss nicht nur eine einzelne Abfrage oder ein Funktionsaufruf pro See sein ...

user1799722
quelle
Ja genau, wie kann ich das tun
user1799722
Welche Art von Produkt verwenden Sie?
Amit Bera
@AmitBera Ich verwende einfache Produkte
user1799722

Antworten:

1

Das programmgesteuerte Hinzufügen von Produkten zum Warenkorb ist also ziemlich einfach. Sie müssen nur das Produktobjekt und die Warenkorbsitzung angeben.

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

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

Dies liegt daran, dass das Hinzufügen von konfigurierbaren Produkten oder Produkten mit Optionen etwas schwieriger ist. Sie müssen jedoch nur das Produktobjekt mit den richtigen Optionen laden.

Nun müssen Sie stattdessen ein Array übergeben $qtyund dieses Array sollte je nach Art des hinzuzufügenden Produkts auf unterschiedliche Weise formatiert werden.

Weitere Informationen finden Sie im Folgenden:

David Manners
quelle
Danke, ich möchte nur einfache Objekte mit Attributen hinzufügen. Bitte lies meine Frage noch einmal durch
user1799722 20.04.15
1
@mour, damit Sie Produkte über eine URL zum Warenkorb hinzufügen können, aber ich glaube nicht, dass es mit mehreren Produkten funktioniert. Daher schlage ich vor, einen eigenen Controller wie in meiner Antwort zum Hinzufügen mehrerer Produkte zu erstellen.
David Manners
1

Hier ist eine Methode, die ich vor einiger Zeit angewendet habe:

// 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 ist ziemlich einfach und gerade getestet, um zu arbeiten.

Ich habe 2 Produkte hinzugefügt $productArray, eines einfach und das andere konfigurierbar . Natürlich könnten Sie mehr hinzufügen und wenn das konfigurierbare 2 Optionen wie Größe und Farbe hätte , könnten Sie einfach die zusätzlichen Optionen im Options-Array hinzufügen.

Shaughn
quelle
Hi, danke, ich möchte für einfache Produkte mit benutzerdefinierten Optionen arbeiten
user1799722
Kommentieren Sie daher die Zeile "unset ($ params ['options'])" aus.
Shaughn
1

Abgesehen davon, dass die Verwendung von einfachen Produkten mit benutzerdefinierten Optionen so gut wie nicht die Verwendung von "Größe" und "Farbe" in Magento ist, habe ich es geschafft, Produkte mit benutzerdefinierten Optionen wie folgt in den Warenkorb zu legen:

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

Ist es das was du meintest? Wenn Sie mehrere Produkte hinzufügen möchten, wiederholen Sie diesen Vorgang für jedes Produkt, das Sie hinzufügen möchten. Der Schlüsselfaktor ist immer, dass die product_id, die Menge und die Optionen über angegeben werden $_POST.

Simonthesorcerer
quelle
1

Sie können mehrere einfache Produkte mit benutzerdefinierten Optionen hinzufügen, indem Sie den Cart Controller wie folgt überschreiben:

Ich habe die CartController.php-Datei hier abgelegt: 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
quelle