6

Mein Kunde fordert, dass jedes einfache Produkt innerhalb eines gebündelten Produkts (Kleidung oben und unten) als separate Werbebuchung in den Einkaufswagen hinzugefügt wird, wenn a Benutzer fügt es hinzu. Kann mir jemand sagen, wie ich das erreichen kann? Ich bin ziemlich gut mit MVC und dem Zend Framework, aber ich brauche ein wenig Hilfe bei der Suche nach den genauen Dateien, die das Hinzufügen gebündelter Produkte zum Warenkorb steuern, oder nach einer alternativen Methode, um diese Elemente separat hinzuzufügen. Bitte gehen Sie davon aus, dass der einzige mögliche Produkttyp für diese Kleidung der Produkttyp Gebündelt ist.Magento: Hinzufügen von einfachen Produkten aus einem Bündel zu separaten Zeilen im Einkaufswagen

+0

Aktualisiert meine Antwort für Sie, um klarer zu sein – ShaunOReilly

Antwort

8

Sie einen Beobachter benötigen:

<checkout_cart_product_add_after> 
     <observers> 
      <reporting> 
       <type>singleton</type> 
       <class>Yourcompany_yourmodelname_Model_Observer</class> 
       <method>onCartProductAdd</method> 
      </reporting> 
     </observers> 
    </checkout_cart_product_add_after> 

tun dann die Beobachter:

class ourcompany_yourmodelname_Model_Observer extends Mage_Core_Model_Abstract 
{ 
    /** 
    * Binds to the checkout_cart_product_add_after Event and passes control to the helper function to process the quote 
    * 
    * @param Varien_Event_Observer $observer 
    * @return void 
    */ 
    public function onCartProductAdd($observer){ 
     $product = $observer->getProduct(); 
     $isProductBundle = ($product->getTypeId() == 'bundle'); 
     $items_to_add = array(); 
     $oTypeInstance = $oProduct->getTypeInstance(true); 
     $aSelections = $oTypeInstance->getSelectionsCollection($aOptionIds, $product); 
     $aOptions = $oTypeInstance->getOptionsByIds($aOptionIds, $product); 
     $bundleOptions = $aOptions->appendSelections($aSelections, true); 
     foreach ($bundleOptions as $bundleOption) { 
      if ($bundleOption->getSelections()) { 
       $bundleSelections = $bundleOption->getSelections();  
       foreach ($bundleSelections as $bundleSelection) { 
         $items_to_add[] = $bundleSelection.getID(); 

       } 

      } 
     } 
     insertExtractedProducts($items_to_add); 
    } 

    /** 
    * Add extracted products into quote 
    * 
    * @param array $items_to_add 
     */ 
    public function insertExtractedProducts($items_to_add){ 
     /**@var $cart Mage_Checkout_Model_Cart**/ 
     $cart = Mage::helper('checkout/cart')->getCart(); 
     $ids_to_add = array(); 
     foreach($items_to_add as $item_to_be_added){ 
      $ids_to_add[] = $item_to_be_added->getProductId(); 
     } 
     $cart->addProductsByIDs($ids_to_add); 
     $cart->save(); 
     Mage::getSingleton('checkout/session')->setCartWasUpdated(true); 
     } 
    } 

Nur ein einfaches Beispiel, aber es könnte helfen.

Gebündelte Produkte können kompliziert sein, zu verstehen, wenn sie mit ihm über den Code arbeiten: Hier ist ein Beispielbild: enter image description here

Jedes Gebündelte Produkt, hat eine zu vielen Optionen, die in dem Endglieder sein wird, Produkte, die dem Bündel im Warenkorb hinzugefügt werden sollen.

Jede Option besteht aus einer bis vielen Auswahlmöglichkeiten. Dies sind die verknüpften Produkte, die unter diesem gebündelten Produkt in den Einkaufswagen gelangen. Eine Auswahl kann normalerweise als Standard festgelegt werden und ist bereits auf der Produktseite ausgewählt. Weitere Informationen finden Sie unter diesem Link zum Erstellen und Konfigurieren von gebündelten Produkten, da in diesem Dokument nur die Programmierseite erläutert wird. Die Anzeigeseite ausgelieferte Produkt wird wie folgt aussehen: enter image description here

Es ist wie diese in den Warenkorb aussehen könnte, wenn Sie auf „In den Warenkorb“ klicken: Bundle Probe

Sample Shampoo 
1 x Moisturiser-125ml $29.95 
Default Conditioner 
1 x Moisturiser-60g $99.95 

Wenn Abfragen dieses Produkt ist durch den Code, können Sie es wie ein normales Produkt laden:

$oProduct->load($vProductId); 

Sobald es geladen wird, müssen Sie einen Produkttyp Instanz zu erhalten, so dass Sie laden können die Optionen für diesen Produkttyp.

$oTypeInstance = $oProduct->getTypeInstance(true); 

Jetzt können wir die Liste der Option IDs für dieses Produkt auf diese Weise erhalten:

$oTypeInstance = $oProduct->getTypeInstance(true); 

die Auswahl zu befragen, werden wir die Liste der Optionen zu einer Sammlung hinzufügen, dann die Optionen erhalten Sammlung sowie ihre jeweilige Auswahl:

$aSelections = $oTypeInstance->getSelectionsCollection($aOptionIds, $oProduct); 
$aOptions = $oTypeInstance->getOptionsByIds($aOptionIds, $oProduct); 
$bundleOptions = $aOptions->appendSelections($aSelections, true); 

Jetzt haben wir eine Sammlung von Optionen, und jede Option wird eine Sammlung von Auswahl hat. Wir können nun die Optionen durchlaufen und ihre Selektionen ansehen.

foreach ($bundleOptions as $bundleOption) { 
      if ($bundleOption->getSelections()) { 
       $bundleSelections = $bundleOption->getSelections(); 

       foreach ($bundleSelections as $bundleSelection) { 
        // get some data here 
        $vName = $bundleOption->getTitle(); 
       } 

      } 
} 

Um die gebündelten Produkt eine Liste der erforderlichen Auswahl Produkte zu erhalten, können Sie den folgenden Code verwenden:

$requiredChildren = $this->getChildrenIds($product->getId(),$required=true); 

Sie können dann die Schleife durch das Array von IDs und die Produkte laden, indem ihre IDs, um mehr Informationen zu diesen Produkten zu erhalten.

Gebündelte Produkte im Warenkorb

Um durch die ausgewählten Optionen eines gebündelten Produkt in den Warenkorb zu Schleife, können Sie so etwas wie folgt verwenden:

/** 
* @var Mage_Bundle_Model_Product_Type 
*/ 
$typeInstance = $this->getProduct()->getTypeInstance(true); 

// get bundle options 
$optionsQuoteItemOption = $this->getItem()->getOptionByCode('bundle_option_ids'); 
$bundleOptionsIds = unserialize($optionsQuoteItemOption->getValue()); 
if ($bundleOptionsIds) { 
    /** 
    * @var Mage_Bundle_Model_Mysql4_Option_Collection 
    */ 
    $optionsCollection = $typeInstance->getOptionsByIds($bundleOptionsIds, $this->getProduct()); 

    // get and add bundle selections collection 
    $selectionsQuoteItemOption = $this->getItem()->getOptionByCode('bundle_selection_ids'); 

    $selectionsCollection = $typeInstance->getSelectionsByIds(
     unserialize($selectionsQuoteItemOption->getValue()), 
     $this->getProduct() 
    ); 

    $bundleOptions = $optionsCollection->appendSelections($selectionsCollection, true); 
    foreach ($bundleOptions as $bundleOption) { 
     if ($bundleOption->getSelections()) { 
      $label = $bundleOption->getTitle() 

      $bundleSelections = $bundleOption->getSelections(); 

      foreach ($bundleSelections as $bundleSelection) {       
        $sName = $bundleSelection->getName(); 
      } 
      // some more code here to do stuff 
     } 
    } 
} 

Dieser Code ruft die Optionen aus dem Angebotspaketprodukt, und ruft dann die Optionen für dieses Produkt in einer Sammlung ab und findet dann die Auswahloption "Ausgewählt".

hth, Shaun

+0

Ich habe das oben genannte Beispiel implementiert, das Sie mir gegeben haben, aber ich scheine jede Option aus dem gebündelten Produkt in den Warenkorb hinzugefügt, im Gegensatz zu nur die Produkte der Benutzer ausgewählt. Irgendein Rat? Verfügen Sie auch über Informationen zum Duplizieren des gebündelten Produkts und zum Hinzufügen einer der vom Benutzer ausgewählten Optionen zu jedem gebündelten Produkt? Zum Beispiel: Der Benutzer wählt eine kleine obere und eine kleine Unterseite; der Wagen würde ein gebündeltes Produkt mit einem kleinen Oberteil und dann ein anderes gebündeltes Produkt mit einem kleinen Boden zeigen. – nnelson

+0

ist $ das zeigt auf das aktuelle Produkt hinzugefügt wird? – ShaunOReilly

+0

$ dies im Beobachter ist nicht im Umfang. Immer wenn ich das Produkt in den Beobachter bekomme, wird das allgemeine Produkt anstelle des konfigurierten Pakets abgerufen. Wenn ich getSelections() erhalte, gibt die Funktion alle möglichen Auswahlen für diese Option anstelle der Auswahlen zurück, die vom Benutzer ausgewählt wurden. – nnelson

1

habe ich dies den Wunsch des Kunden zu lösen, die zum Warenkorb hinzufügen Gebinde Inhalt als separate Elemente in. Ersetzen Sie einfach

$cart->addProduct($product, $params) 

mit

if ($product->getTypeId() == 'bundle') { 
    $request = new Varien_Object($params); 
    $cartCandidates = $product->getTypeInstance(true)->prepareForCartAdvanced($request, $product, Mage_Catalog_Model_Product_Type_Abstract::PROCESS_MODE_FULL); 
    $idstoadd = array(); 
    foreach ($cartCandidates as $cartCandidate) { 
     if ($cartCandidate->getTypeId() == 'simple') { 
      for ($i = 0; $i < $cartCandidate->getCartQty(); $i++) { 
       $idstoadd[] = $cartCandidate->getId(); 
      } 
     } 
    } 
    $cart->addProductsByIds($idstoadd); 
} else { 
    $cart->addProduct($product, $params); 
} 

in der Datei cartController.

+0

nur ein kleines Fix für handle Benutzermenge angefordert für ein Bündel für ($ i = 0; $ i <$ cartCandidate-> getCartQty() * $ params ['qty']; $ i ++) { – user3803968

+0

Gibt es einen Weg, dann fügen Sie das gebündelte Produkt selbst hinzu, aber ohne die Kinderprodukte - wie sie jetzt schon im Warenkorb sind? – user2029763

+0

Ich versuche, Ihr Szenario zu verstehen, aber basierend nur auf Ihrer Frage ist es möglich, ein Bundle basierend auf dem aktuellen Kind auf dem Warenkorb hinzuzufügen. Seien Sie sich bewusst, dass Sie Regeln definieren müssen, damit Sie sonst kein Paket für jedes Kind auf dem Einkaufswagen bekommen. – user3803968

Verwandte Themen