Zdarzenie Magento do obliczania ceny, gdy zmienia się pole tekstowe opcji niestandardowej

10

Próbuję utworzyć produkt z dwoma niestandardowymi polami tekstowymi: Długość i Szerokość. Gdy użytkownik wpisze zarówno długość, jak i szerokość, cena musi zostać obliczona za pomocą formuły niestandardowej.

Próbuję znaleźć właściwe zdarzenie, z którym można połączyć obserwatora - ktoś wie, co to może być?

Oto, co wiem i próbowałem

1) niestandardowe pole tekstowe w widoku produktu zawiera zdarzenie onchange, w którym jeszcze nie wymyśliłem, jak skorzystać z tego zdarzenia za pomocą zdarzenia obserwatora - „opConfig.reloadPrice ()

2) Jeśli zbuduję obserwatora na zdarzeniu sales_quote_add_item, mogę zmienić cenę za pomocą formuły, gdy zostanie dodana do koszyka. Dzięki tej metodzie wciąż potrzebuję sposobu, aby to zmienić w widoku produktu, zanim zostanie dodany do koszyka.

3) Próbowałem również zdarzenia catalog_product_get_final_price, ale wydaje się, że jest uruchamiane tylko po załadowaniu strony produktu, więc po dodaniu długości lub szerokości produktu nie jest uruchamiane ponownie.

Wszelkie pomysły będą mile widziane!

Clayton-a
źródło
czy Fabian pomógł ci? Jeśli tak, proszę przyjąć lub wyjaśnić, abyśmy mogli pomóc?
philwinkle

Odpowiedzi:

2

Użyłem tego przypadku użycia 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);
        }
    }
}

Po stronie klienta możesz po prostu użyć kilku wierszy JS, aby zaktualizować cenę?

Fabian Blechschmidt
źródło
2

catalog_product_get_final_pricejest prawidłowym zdarzeniem po stronie serwera, jest uruchamiane nie tylko po załadowaniu strony produktu, ale także po dodaniu produktu do koszyka. W takim przypadku masz wszystkie wybrane opcje niestandardowe dostępne z:

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

(Zobacz także: Czy istnieje sposób, w jaki użytkownik może ustawić niestandardową żądaną cenę większą niż zero i przejść do koszyka dla dowolnego produktu? )


Ponowne obliczanie ceny na stronie produktu to kolejny temat i wymaga JavaScript. reloadPricejest właściwą funkcją do podłączenia, chciałbym rozszerzyć ją w następujący sposób:

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();
    }
});
Fabian Schmengler
źródło