Событие Magento для расчета цены при изменении текстового поля пользовательской опции

10

Я пытаюсь создать продукт с двумя пользовательскими текстовыми полями: длина и ширина. Когда пользователь вводит длину и ширину, цену необходимо рассчитать по пользовательской формуле.

Я пытаюсь найти правильное событие для подключения наблюдателя - кто-нибудь знает, что это может быть?

Вот что я знаю и попробовал

1) в текстовом поле настраиваемого поля в представлении продукта есть событие onchange, к которому я еще не придумал, как подключиться через событие наблюдателя - "opConfig.reloadPrice ()

2) Если я построю наблюдателя на событии sales_quote_add_item, то я могу изменить цену по формуле, когда она будет добавлена ​​в корзину. С этим методом мне все еще нужен способ изменить его в представлении продукта, прежде чем он будет добавлен в корзину.

3) Я также пробовал событие catalog_product_get_final_price, но, похоже, оно срабатывает только при загрузке страницы продукта, поэтому после добавления длины или ширины продукта оно не запускается повторно.

Благодарим за любую идею!

Clayton-а
источник
Фабиан это тебе помогло? Если да, не могли бы вы принять или уточнить, чтобы мы могли помочь?
Philwinkle

Ответы:

2

Я использовал для этого варианта использования 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);
        }
    }
}

На стороне клиента, вы можете просто использовать несколько строк JS, чтобы обновить цену?

Фабиан Блехшмидт
источник
2

catalog_product_get_final_priceявляется правильным событием на стороне сервера, оно запускается не только при загрузке страницы продукта, но и при добавлении продукта в корзину. В этом случае у вас есть все выбранные пользовательские опции, доступные с:

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

(См. Также: есть ли способ, когда пользователь может установить желаемую цену на заказ больше нуля и перейти в корзину для любого продукта? )


Пересчет цены на странице продукта - еще одна тема, для которой требуется JavaScript. reloadPriceэто правильная функция для подключения, я бы расширил ее так:

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();
    }
});
Фабиан Шменглер
источник