Evento de Magento para calcular el precio cuando cambia el campo de texto de opción personalizada

10

Estoy tratando de crear un producto con dos campos de texto personalizados: largo y ancho. Cuando el usuario escribe tanto en longitud como en anchura, el precio debe calcularse mediante una fórmula personalizada.

Estoy tratando de encontrar el evento correcto para conectar a un observador. ¿Alguien sabe qué podría ser?

Esto es lo que sé y he probado

1) el cuadro de texto de campo personalizado en la vista del producto tiene un evento de cambio que aún no he descubierto cómo aprovechar a través de un evento de observación - "opConfig.reloadPrice ()

2) Si construyo un observador en el evento sales_quote_add_item, entonces puedo cambiar el precio a través de la fórmula cuando se agrega al carrito. Con este método todavía necesito una forma de cambiarlo en la vista del producto antes de agregarlo al carrito.

3) También probé el evento catalog_product_get_final_price pero parece que solo se dispara cuando se carga la página del producto, por lo que después de agregar una longitud o ancho del producto, no se vuelve a disparar.

Cualquier idea sería muy apreciada!

Clayton-a
fuente
¿Te ayudó Fabian? Si es así, ¿podría aceptar o aclarar para que podamos ayudarlo?
philwinkle

Respuestas:

2

Utilicé 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);
        }
    }
}

En el lado del cliente, ¿puede usar algunas líneas de JS para actualizar el precio?

Fabian Blechschmidt
fuente
2

catalog_product_get_final_pricees el evento del lado del servidor correcto, no solo se activa cuando se carga la página del producto, sino también cuando el producto se agrega al carrito. En este caso, tiene todas las opciones personalizadas seleccionadas disponibles con:

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

(Consulte también: ¿Hay alguna forma en que el usuario pueda establecer el precio deseado personalizado mayor que cero y proceder al carrito de cualquier producto? )


Volver a calcular el precio en la página del producto es otro tema y necesita JavaScript. reloadPricees la función correcta para conectar, la extendería así:

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
fuente