Magento-Ereignis zur Berechnung des Preises, wenn sich das Textfeld für benutzerdefinierte Optionen ändert


10

Ich versuche, ein Produkt mit zwei benutzerdefinierten Textfeldern zu erstellen: Länge und Breite. Wenn der Benutzer sowohl eine Länge als auch eine Breite eingibt, muss der Preis über eine benutzerdefinierte Formel berechnet werden.

Ich versuche das richtige Ereignis zu finden, mit dem ich einen Beobachter verbinden kann - weiß jemand, was das sein könnte?

Folgendes weiß ich und habe es versucht

1) Das Textfeld für benutzerdefinierte Felder in der Produktansicht enthält ein Onchange-Ereignis, auf das ich noch nicht über ein Beobachterereignis zugegriffen habe - "opConfig.reloadPrice ()

2) Wenn ich einen Beobachter auf dem Ereignis sales_quote_add_item aufbaue, kann ich den Preis über eine Formel ändern, wenn er dem Warenkorb hinzugefügt wird. Mit dieser Methode muss ich sie noch in der Produktansicht ändern, bevor sie in den Warenkorb gelegt wird.

3) Ich habe auch das Ereignis catalog_product_get_final_price ausprobiert, aber dies scheint nur beim Laden der Produktseite ausgelöst zu werden. Nach dem Hinzufügen einer Produktlänge oder -breite wird es also nicht erneut ausgelöst.

Irgendwelche Ideen wären sehr dankbar!


Hat dir Fabian dabei geholfen? Wenn ja, können Sie dies bitte akzeptieren oder klären, damit wir Ihnen helfen können?
Philwinkle

Antworten:


2

Ich habe für diesen Anwendungsfall verwendet sales_quote_collect_totals_before:

/**
 * Set prices
 *
 * @param Varien_Event_Observer $observer
 */
public function salesQuoteCollectTotalsBefore(Varien_Event_Observer $observer)
{
    /* @var $quote Mage_Sales_Model_Quote */
    $quote = $observer->getQuote();
    foreach ($quote->getAllItems() as $quoteItem) {
        if (is your product of choice) {
            /* @var $quoteItem Mage_Sales_Model_Quote_Item */
            $product = $quoteItem->getProduct();
            $price = whatever formula you want to use;
            $product->setPrice($price);
        }
    }
}

Auf der Client-Seite können Sie nur ein paar Zeilen JS verwenden, um den Preis zu aktualisieren?


2

catalog_product_get_final_priceist das richtige serverseitige Ereignis. Es wird nicht nur ausgelöst, wenn die Produktseite geladen wird, sondern auch, wenn das Produkt in den Warenkorb gelegt wird. In diesem Fall stehen Ihnen alle ausgewählten benutzerdefinierten Optionen zur Verfügung mit:

$observer->getProduct()->getCustomOption($customOptionName);

(Siehe auch: Gibt es eine Möglichkeit, wie der Benutzer den gewünschten benutzerdefinierten Preis größer als Null einstellen und für jedes Produkt in den Warenkorb gehen kann? )


Die Neuberechnung des Preises auf der Produktseite ist ein weiteres Thema und erfordert JavaScript. reloadPriceist die richtige Funktion zum Einhängen, ich würde sie folgendermaßen erweitern:

Product.prototype.reloadPrice = Product.prototype.reloadPrice.wrap(function(callOriginal) {
    if (should_be_calculated_based_on_length_and_with) {

        // copy the original reloadPrice function here and change how `price` is calculated

    } else {
        callOriginal();
    }
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.