Evento Magento para calcular o preço quando o campo de texto da opção personalizada é alterado

10

Estou tentando criar um produto com dois campos de texto personalizados: Comprimento e Largura. Quando o usuário digita comprimento e largura, o preço precisa ser calculado por meio de fórmula personalizada.

Estou tentando encontrar o evento correto para conectar um observador - alguém sabe o que pode ser?

Aqui está o que eu sei e tentei

1) a caixa de texto do campo personalizado na visualização do produto possui um evento onchange que eu ainda não descobri como acessar através de um evento observador - "opConfig.reloadPrice ()

2) Se eu criar um observador no evento sales_quote_add_item, posso alterar o preço por fórmula quando ele for adicionado ao carrinho. Com esse método, ainda preciso de uma maneira de alterá-lo na visualização do produto antes de adicioná-lo ao carrinho.

3) Tentei também o evento catalog_product_get_final_price, mas este parece acionar apenas quando a página do produto é carregada; portanto, após a adição do comprimento ou largura do produto, ele não é acionado novamente.

Todas as idéias seriam muito apreciadas!

Clayton-a
fonte
Fabian ajudou isso? Em caso afirmativo, você poderia aceitar ou esclarecer para que possamos ajudar?
philwinkle

Respostas:

2

Eu usei para este caso de uso 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);
        }
    }
}

No lado do cliente, você pode usar apenas algumas linhas de JS para atualizar o preço?

Fabian Blechschmidt
fonte
2

catalog_product_get_final_priceé o evento correto do lado do servidor, não é acionado apenas quando a página do produto é carregada, mas também quando o produto é adicionado ao carrinho. Nesse caso, você tem todas as opções personalizadas selecionadas disponíveis com:

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

(Veja também: existe alguma maneira de o usuário definir o preço desejado personalizado maior que zero e continuar com o carrinho de qualquer produto? )


Recalcular o preço na página do produto é outro tópico e precisa de JavaScript. reloadPriceé a função correta para se conectar, eu a estenderia assim:

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
fonte