El evento apropiado para agregar opciones personalizadas sobre la marcha es catalog_product_type_prepare_full_options
, que se activa justo antes de que el producto con sus opciones personalizadas se convierta en un artículo de presupuesto.
En caso de que los propios datos de buyRequest tengan efecto en los atributos u opciones del producto, un observador en el evento catalog_product_type_prepare_{$processMode}_options
es una buena opción, donde $processMode
está el modo de validación y puede ser "completo" o "lite". El modo "completo" se utiliza cuando un producto se agrega regularmente al carrito y valida si todas las opciones requeridas están configuradas y toda la configuración es válida. En el modo "lite" solo se validan las opciones contenidas en la solicitud, se utiliza al agregar un producto a la lista de deseos, pero también es posible al crear un pedido desde el back-end. Para procesar los datos en cualquier caso, puede registrar el observador para ambos eventos. Si hubiera validación, debe diferenciar los eventos, por supuesto.
Los eventos se activan en Mage_Catalog_Model_Product_Type_Abstract :: _ prepareOptions () y están disponibles los siguientes parámetros:
transport
: Objeto de transporte para todas las opciones personalizadas (pero no otras opciones, por ejemplo, opciones de paquete), para que pueda cambiarlas en el observador. transport-> options es una matriz en la forma option_id => option_value. Atención, el transporte en sí mismo es un objeto stdClass, no una instancia de Varien_Object, como es de esperar. Por lo tanto, no hay métodos getter y setter para transporte-> opciones.
buy_request
: El objeto buyRequest, puede leerlo aquí y aún modificarlo también.
product
: El producto que se convertirá en un artículo de presupuesto más adelante. Aquí puede manipular atributos o agregarlos dinámicamente. Pero aún debe considerarlos en el proceso de conversión. El evento utilizado para esto sales_quote_product_add_after
, se desencadena más tarde solamente.
Fuente: El objeto Magento buyRequest - Una referencia
Entonces un observador podría verse así:
public function addCustomOption(Varien_Event_Observer $observer)
{
$transport = $observer->getTransport();
if (this_item_should_be_free()) { // implement your condition here
$transport->options['Free Gifts'] = 'Spend $50 and get gift product worth $9.99';
}
}
No puede establecer un precio para esta opción personalizada añadida dinámicamente, pero puede cambiar el precio del artículo de presupuesto utilizando un segundo observador para catalog_product_get_final_price
esto:
public function adjustFinalPrice($observer) {
$product = $observer->getProduct();
// Set price to "0" if custom option "Free Gift" has been set
if ($product->getCustomOption('Free Gift')) {
$product->setFinalPrice(0);
}
}