¿Modificar opciones personalizadas de un artículo al agregarlo al carrito?

8

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?

usuario1638055
fuente
CMIIW, este bucle le brinda los valores disponibles, no el seleccionado. Para obtener la opción personalizada real que se ha establecido, analice $ array_sku = explotar ('-', $ item-> getSku ()); Obviamente, el primero es el SKU del producto real $ sku = reset ($ array_sku); Todavía no tengo una solución para obtener los datos.
nicolallias
La clave que estoy viendo es poder establecer el precio del valor de la opción. He estado mirando esto durante los últimos días y no veo una forma obvia de establecer el precio del valor. Casi parece que el elemento de presupuesto necesita que se eliminen las opciones y luego se reconstruyan a partir de la solicitud.
pspahn

Respuestas:

8

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:

  • transporte: objeto de transporte para todas las opciones personalizadas, por lo que puede cambiarlos en el observador. transport->optionses una matriz en el formulario option_id => option_value. Atención, el transporte en sí mismo es un stdClassobjeto, no una instancia de Varien_Object, como es de esperar. Por lo tanto, no hay métodos getter y setter para transport->options.
  • producto: el producto que se convertirá en un artículo de presupuesto más adelante.
  • buy_request: el objeto buyRequest, puede leerlo aquí y modificarlo también. Es un Varien_Objectque contiene entre otros:

    • producto: la identificación del producto
    • opciones: matriz de opciones personalizadas en la forma:

      option_id => value

Fuente y más información: info_buyRequest reference

Entonces su observador podría verse así:

$transport = $observer->getTransport();
if (isset($transport->options[OPTION_A_ID]) && $transport->options[OPTION_A_ID] == 1) {
    $transport->options[OPTION_A_ID] = 4;
}

$buyRequest= $observer->getBuyRequest();
$buyRequestOptions = $buyRequest->getOptions();
if (isset($buyRequestOptions[OPTION_A_ID]) && $buyRequestOptions[OPTION_A_ID] == 1) {
    $buyRequestOptions[OPTION_A_ID] = 4;
}
$buyRequest->setOptions($buyRequestOptions);

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.

Fabian Schmengler
fuente
El mismo evento puede usarse para magento 2 con un propósito similar.
Bartosz Kubicki
no está funcionando en magento2
Magento2 Devloper
0

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:

// column name my_option
$item->setMyOption("value"); // to set the value
$item->getMyOption(); // to get the value

Si este es el caso, entonces debería poder simplificar el código de la siguiente manera:

$quote = $observer->getEvent()->getQuote();
foreach ($quote->getAllItems() as $item) {
    $item->setMyOptionA("New Value");
    $item->save();
}

Como se mencionó, esta solución se aplicará solo a los atributos de elementos de cotización configurados programáticamente.

Dan Hanly
fuente