¿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?


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.