Erstellen einer benutzerdefinierten Option und eines benutzerdefinierten Preises, um das Produkt mit dem Beobachter in den Warenkorb zu legen

15

Ich möchte mithilfe des Observers eine benutzerdefinierte Option zum Quoteitem hinzufügen. Der Observer checkoutCartProductAddAfter-Ereignis wird ausgelöst, nachdem das Produkt dem Warenkorb hinzugefügt wurde.

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, aber ich kann dem hinzugefügten Produkt keine benutzerdefinierte Option hinzufügen. Bitte geben Sie Hilfe zum Hinzufügen einer benutzerdefinierten Option mit dem Beobachter zum gerade hinzugefügten Produkt.

Keyur Patel
quelle
bieten Sie mir auch an, den benutzerdefinierten Preis des Produkts im Beobachter zu ändern. Ich möchte den benutzerdefinierten Preis auf Null setzen.
Vielen

Antworten:

19

@Tim hielt am Wochenende einen Vortrag zu diesem Thema: https://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

Was Sie möchten, ist Methode 2: Folgendes Ereignis in Config.xml hinzufügen

<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 füge folgende Methode hinzu

   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 ist mehr zu diesem Thema:

/programming/9334115/magento-change-custom-option-value-before-adding-it-to-cart/9344336#9344336

und mehr:

/programming/9412074/magento-quote-order-product-item-attribute-based-on-user-input/9496266#9496266

Fabian Blechschmidt
quelle
1
Erstens: Bitte verwenden Sie Kommentare anstelle von neuen Antworten. Und fügen Sie dann einen Scheck für Ihr Produkt in die Schleife ein, sodass nur Ihr gewünschtes Produkt die Option erhält.
Fabian Blechschmidt
1
Bitte werfen Sie einen Blick auf diese großartige Debug-Antwort und kommentieren Sie zurück: magento.stackexchange.com/a/429/217
Fabian Blechschmidt
1
Dies ist mit den oben beschriebenen Schritten möglich
Fabian Blechschmidt
2
Vielen Dank für den Vorschlag Wenn ich in den Warenkorb lege, habe ich zwei Artikel erhalten, da ich das konfigurierbare Produkt verwende und das Problem durch die Aktualisierung des letzten Angebotsartikels gelöst habe.
Milople Inc
1
Ich auch nicht, aber ich habe den Link aktualisiert. Vielen Dank!
Fabian Blechschmidt
3

Das geeignete Ereignis zum Hinzufügen von benutzerdefinierten Optionen im laufenden Betrieb ist catalog_product_type_prepare_full_options, das ausgelöst wird, bevor das Produkt mit seinen benutzerdefinierten Optionen in ein Angebotselement konvertiert wird.

Sollten sich die eigenen buyRequest-Daten auf Produktattribute oder -optionen auswirken, ist ein Beobachter der Veranstaltung catalog_product_type_prepare_{$processMode}_optionseine gute Wahl, wo $processModesich der Validierungsmodus befindet und „full“ oder „lite“ sein kann. Der „Full“ -Modus wird verwendet, wenn ein Produkt regelmäßig in den Warenkorb gelegt wird und überprüft, ob alle erforderlichen Optionen festgelegt wurden und die gesamte Konfiguration gültig ist. Im "Lite" -Modus werden nur die in der Anfrage enthaltenen Optionen validiert. Sie werden verwendet, wenn ein Produkt zur Wunschliste hinzugefügt wird. Sie können jedoch auch eine Bestellung über das Backend erstellen. 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 differenzieren.

Die Ereignisse werden in Mage_Catalog_Model_Product_Type_Abstract :: _ prepareOptions () ausgelöst und die folgenden Parameter sind verfügbar:

  • transport: Transportobjekt für alle benutzerdefinierten Optionen (aber keine anderen Optionen, z. B. Bundle-Optionen), damit Sie sie im Observer ändern können. transport-> options ist ein Array in der Form option_id => option_value. Achtung, der Transport selbst ist ein stdClass-Objekt, keine erwartungsgemäße Instanz von Varien_Object. Es gibt also keine Get- und Setter-Methoden für Transport-> Optionen.
  • buy_request: Das buyRequest-Objekt. Sie können es hier lesen und trotzdem ändern.
  • product: Das Produkt, das später in einen Angebotsposten umgewandelt wird. Hier können Sie Attribute bearbeiten oder dynamisch hinzufügen. Sie müssen sie jedoch bei der Konvertierung berücksichtigen. Das dafür verwendete Ereignis wird sales_quote_product_add_aftererst 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 für diese dynamisch hinzugefügte benutzerdefinierte Option keinen Preis festlegen, aber Sie können den Preis des Angebotselements mit einem zweiten Beobachter catalog_product_get_final_pricewie folgt ändern :

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);
    }
}
Fabian Schmengler
quelle