Frage

Ich möchte eine benutzerdefinierte Option zum QuoteItem mit dem Observer, dem Ereignis für Beobachter checkoutCartProductaddAfter und Feuer nach dem Produkt hinzugefügt, in den Warenkorb hinzugefügt.

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{

 $item = $observer->getQuoteItem();  
  $item->addOption(new Varien_Object(
            array(
                    'product' => $item->getProduct(),
                    'label' => 'Free Gifts',
                    'value' => 'Spend $50 and get gift product worth $9.99'
                 )
        ));
    return;

}

Mein Beobachter arbeitet, kann aber keine benutzerdefinierte Option zum hinzugefügten Produkt hinzufügen. Bitte geben Sie Hilfe an, um eine benutzerdefinierte Option mit dem Beobachter hinzuzufügen, um nur Produkte hinzugefügt zu haben.

War es hilfreich?

Lösung

@Tim hielt am Wochenende einen Vortrag über dieses Problem: https://docs.google.com/presentation/d/1efpznqsvtrt1had1xqvcpc-tgvr8jyok4x7zejhm9je/edit

Was Sie wollen, ist Methode 2:Fügen Sie das folgende Ereignis in config.xml hinzu

<sales_quote_collect_totals_before>
<observers>
<hackathon_presentation>
<type>singleton</type>
<class>modulename/observer</class>
<method>salesQuoteAddressCollectTotalsBefore</method>
</hackathon_presentation>
</observers>
</sales_quote_collect_totals_before>

In Observer.php folgen Sie die folgende Methode hinzufügen

   public function salesQuoteAddressCollectTotalsBefore($observer)
    {
        $quote = $observer->getQuote();
        $quote_items = $quote->getItemsCollection();
        foreach ($quote_items as $item) {
            $additionalOptions = array(
                array(
                    'code'  => 'my_code',
                    'label' => 'This text is displayed through additional options',
                    'value' => 'ID is ' . $item->getProductId() . ' and SKU is ' . $item->getSku()
                )
            );
            $item->addOption(
                array(
                     'code'  => 'additional_options',
                     'value' => serialize($additionalOptions),
                )
            );
        }
    }

Hier geht es mehr zu diesem Thema:

https://stackoverflow.com/questions/9334115/magento-change-custom-option-value-befor-adding-it-to-cart/9344336#9344336

und mehr:

https://stackoverflow.com/questions/9412074/magento-quote-order-product-item-attribute-basiert-on-usinput/949626#9496266

Andere Tipps

Das angemessene Ereignis zum Hinzufügen von benutzerdefinierten Optionen im laufenden Fliegen ist catalog_product_type_prepare_full_options, das ausgelöst wird, kurz bevor das Produkt mit seinen benutzerdefinierten Optionen in ein Angebotselement umgewandelt wird.

Sollten die eigenen BuyRequest -Daten auf Produktattribute oder -optionen auswirken, ein Beobachter des Ereignisses catalog_product_type_prepare_{$processMode}_options ist eine gute Wahl, wo $processMode ist der Validierungsmodus und kann „voll“ oder „lite“ sein. Der „vollständige“ Modus wird verwendet, wenn ein Produkt regelmäßig zum Warenkorb hinzugefügt wird, und validiert, wenn alle erforderlichen Optionen festgelegt und die gesamte Konfiguration gültig ist. Im „Lite“ -Modus werden nur in der Anforderung enthaltene Optionen validiert. Er wird verwendet, wenn ein Produkt zur Wunschliste hinzugefügt wird, aber auch beim Erstellen einer Bestellung aus dem Backend möglich. Um die Daten in jedem Fall zu verarbeiten, können Sie den Beobachter für beide Ereignisse registrieren. Sollte es eine Validierung geben, sollten Sie natürlich die Ereignisse unterscheiden.

Die Ereignisse sind in mage_catalog_model_product_type_abstract :: _ prepeoptions () ausgelöst und die folgenden Parameter sind verfügbar:

  • transport: Transportobjekt für alle benutzerdefinierten Optionen (jedoch keine anderen Optionen, z. B. Bündeloptionen), damit Sie sie im Beobachter ändern können. Transport-> Optionen sind ein Array im Formular option_id => option_value. Achtung, Transport selbst ist ein STD -Class -Objekt, kein Beispiel für Variien_Object, wie Sie vielleicht erwarten. Es gibt also keine Getter- und Setter-Methoden für Transport-> Optionen.
  • buy_request: Das BuyRequest -Objekt können Sie es hier lesen und trotzdem auch ändern.
  • product: Das Produkt, das später in ein Angebotselement umgewandelt wird. Hier können Sie Attribute manipulieren oder dynamisch hinzufügen. Sie müssen sie jedoch im Konvertierungsprozess weiterhin berücksichtigen. Die dafür verwendet, dafür, sales_quote_product_add_after, wird nur später ausgelöst.

Quelle: Das Magento BuyRequest -Objekt - eine Referenz

Ein Beobachter könnte also so aussehen:

public function addCustomOption(Varien_Event_Observer $observer)
{
    $transport = $observer->getTransport();
    if (this_item_should_be_free()) { // implement your condition here
        $transport->options['Free Gifts'] = 'Spend $50 and get gift product worth $9.99';
    }
}

Sie können keinen Preis für diese dynamisch hinzugefügte benutzerdefinierte Option festlegen, können jedoch den Preis des Angebotsartikels mit einem zweiten Beobachter für ändern catalog_product_get_final_price so was:

public function adjustFinalPrice($observer) {

    $product = $observer->getProduct();
    // Set price to "0" if custom option "Free Gift" has been set
    if ($product->getCustomOption('Free Gift')) {
        $product->setFinalPrice(0);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top