Crear una opción personalizada y un premio para el producto que acaba de agregar al carrito con el observador

15

Quiero agregar una opción personalizada al artículo de cotización usando el observador que observa el evento checkoutCartProductAddAfter y se activa después de que el producto se haya agregado al carrito.

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{

 $item = $observer->getQuoteItem();  
  $item->addOption(new Varien_Object(
            array(
                    'product' => $item->getProduct(),
                    'label' => 'Free Gifts',
                    'value' => 'Spend $50 and get gift product worth $9.99'
                 )
        ));
    return;

}

Mi observador funciona, pero no puedo agregar una opción personalizada al producto agregado. proporcione ayuda para agregar una opción personalizada utilizando el observador al producto que acaba de agregar.

Keyur Patel
fuente
también me proporciona cambiar el precio personalizado del producto en observador. Quiero agregar precio personalizado a cero. gracias de antemano
Keyur Patel

Respuestas:

19

@Tim dio una charla sobre este tema el fin de semana: https://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

Lo que desea es el Método 2: Agregar el siguiente evento en Config.xml

<sales_quote_collect_totals_before>
<observers>
<hackathon_presentation>
<type>singleton</type>
<class>modulename/observer</class>
<method>salesQuoteAddressCollectTotalsBefore</method>
</hackathon_presentation>
</observers>
</sales_quote_collect_totals_before>

En Observer.php agregue el siguiente método

   public function salesQuoteAddressCollectTotalsBefore($observer)
    {
        $quote = $observer->getQuote();
        $quote_items = $quote->getItemsCollection();
        foreach ($quote_items as $item) {
            $additionalOptions = array(
                array(
                    'code'  => 'my_code',
                    'label' => 'This text is displayed through additional options',
                    'value' => 'ID is ' . $item->getProductId() . ' and SKU is ' . $item->getSku()
                )
            );
            $item->addOption(
                array(
                     'code'  => 'additional_options',
                     'value' => serialize($additionalOptions),
                )
            );
        }
    }

Aquí hay más sobre este tema:

/programming/9334115/magento-change-custom-option-value-before-adding-it-to-cart/9344336#9344336

y más:

/programming/9412074/magento-quote-order-product-item-attribute-based-on-user-input/9496266#9496266

Fabian Blechschmidt
fuente
1
Primero: utilice comentarios, en lugar de nuevas respuestas. Y luego inserte un cheque para su producto en el bucle, para que solo su producto deseado tenga la opción.
Fabian Blechschmidt
1
Eche un vistazo a esta excelente respuesta de depuración y comente de nuevo: magento.stackexchange.com/a/429/217
Fabian Blechschmidt
1
Esto es posible con los pasos descritos anteriormente
Fabian Blechschmidt
2
Gracias por su sugerencia. Cuando agrego al carrito, obtuve dos artículos porque estoy usando el producto configurable y he resuelto el problema actualizando el último artículo de cotización.
Milople Inc
1
Yo tampoco, pero actualicé el enlace. ¡Gracias!
Fabian Blechschmidt
3

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}_optionses una buena opción, donde $processModeestá 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_priceesto:

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);
    }
}
Fabian Schmengler
fuente