Estoy escuchando el evento sales_quote_save_before para notar cuándo se agrega un artículo al carrito. Una vez que se dispara, repito las opciones de elementos como esta:
$quote = $observer->getEvent()->getQuote();
foreach ($quote->getAllItems() as $item) {
$options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());
foreach($options['options'] as $option) {
if($option['label'] == 'myOptionA') {
// Here I want to change the selected value for the option
}
}
}
Como puede ver, en cuanto se alcanza una determinada opción (myOptionA en el ejemplo), quiero cambiar la opción seleccionada. Digamos que myOptionA es un menú desplegable y tiene 4 valores posibles. En caso de que se seleccione el valor 1, quiero establecer el valor 4 para ese elemento. Entonces, cuando el carrito haya terminado de cargarse, debe tener el valor 4 para myOptionA. No solo su nombre, sino también su precio. ¿Cómo podría hacer eso?
cart
event-observer
custom-options
usuario1638055
fuente
fuente
Respuestas:
En su lugar, puede escribir un observador para el evento
catalog_product_type_prepare_full_options
, que es el último evento en el proceso de agregar al carrito antes de que el producto se agregue realmente al carrito y después de que se preparen las opciones personalizadas.En el observador tiene los siguientes parámetros disponibles:
transport->options
es una matriz en el formulariooption_id => option_value
. Atención, el transporte en sí mismo es unstdClass
objeto, no una instancia deVarien_Object
, como es de esperar. Por lo tanto, no hay métodos getter y setter paratransport->options
.buy_request: el objeto buyRequest, puede leerlo aquí y modificarlo también. Es un
Varien_Object
que contiene entre otros:opciones: matriz de opciones personalizadas en la forma:
Entonces su observador podría verse así:
La primera parte (cambio
$transport
) es relevante para cambiar realmente el valor de la opción OPTION_A_ID. La segunda parte (cambio$buyRequest
) es opcional, simplemente eliminará todos los rastros del valor que el cliente seleccionó y si reordena la orden, el nuevo valor se seleccionará inmediatamente porque la solicitud de compra se "ejecuta" con los parámetros modificados. Tienes que decidir si eso es lo que quieres.fuente
Si ha configurado su atributo a través del código, es decir, utilizando un script de instalación, encontrará su atributo como una columna debajo de
sales_flat_quote_item
.Si está allí, entonces teniendo acceso a la variable $ item, debería poder usar métodos mágicos relacionados con su atributo:
Si este es el caso, entonces debería poder simplificar el código de la siguiente manera:
Como se mencionó, esta solución se aplicará solo a los atributos de elementos de cotización configurados programáticamente.
fuente