Copiando opciones personalizadas dinámicas para cotizar artículo, ordenar artículo

13

Tengo un observador que agrega opciones personalizadas dinámicas a la página de detalles del producto, que se llama en el catalog_controller_product_viewevento. Esto permite al cliente seleccionar de un menú desplegable de sus códigos de licencia existentes.

public function addLicenseOptions(Varien_Event_Observer $observer) {
    $product = $observer->getEvent()->getProduct();
    if ($product->isSubscriptionProduct()) {
        $optionModel = Mage::getModel('catalog/product_option')
            ->setTitle('License Code')
            ->setProductId($product->getId())
            ->setStoreId($product->getStoreId())
            ->setId('license_code')
            ->setType('drop_down')
            ->setPrice(null)
            ->setPriceType(null)
            ->setIsRequire(true);

        $customer = Mage::getSingleton('customer/session')->getCustomer();
        if ($customer->getId()) {
            $linksPurchased = Mage::getResourceModel('downloadable/link_purchased_collection')
                        ->addFieldToFilter('customer_id', $customer->getId());

            if ($linksPurchased->count() > 0) {
                foreach ($linksPurchased as $linkPurchased) {
                    $valueModel = Mage::getModel('catalog/product_option_value')
                        ->setTitle($linkPurchased->getData('key_code'))
                        ->setProduct($product)
                        ->setOption($optionModel)
                        ->setId($linkPurchased->getData('license_code'))
                        ->setPrice(null)
                        ->setPriceType('fixed')
                        ->setSku(null);
                    $optionModel->addValue($valueModel);
                }
                $product->setHasOptions(1);
                $product->addOption($optionModel);
            }
        }
    }
}

Pero, cuando hago el pedido, las opciones seleccionadas solo se guardan en el info_buyRequest. ¿Hay alguna manera de que se guarde como si fuera una opción de producto creada en el administrador?

Laura
fuente

Respuestas:

6

He hecho algo similar pero no del todo. Quizás ayude.
mi tarea era tener una casilla de verificación en cada página de producto llamada gift wrap. Si se marca entonces, el equipo de ventas sabría envolver el producto (solo tenían una sola opción de envoltura).
Así que hice esto para poder portar el wrapvalor de la casilla de verificación del producto para cotizar al pedido. (Podría haber usado una opción personalizada, pero es feo agregar una opción a unos pocos miles de productos).

Tuve un observador para el evento sales_convert_quote_item_to_order_item.

public function checkGiftWrap($observer)
{
    $orderItem = $observer->getEvent()->getOrderItem();
    $item = $observer->getEvent()->getItem();
    $wrap = $item->getOptionByCode('wrap');
    if ($wrap){
        $options = $orderItem->getProductOptions();
        $options['wrap'] = unserialize($wrap->getValue());
        $orderItem->setProductOptions($options);
    }
    return $this;
}

Reescribí el Mage_Catalog_Helper_Product_Configuration::getCustomOptionsasistente para decirle a Magento que mi opción es importante y que debería tratarla por separado.

<?php
class [Namespace]_[Module]_Helper_Product_Configuration extends Mage_Catalog_Helper_Product_Configuration
{
    public function getCustomOptions(Mage_Catalog_Model_Product_Configuration_Item_Interface $item){
        $options = parent::getCustomOptions($item);
        $wrap = $item->getOptionByCode('wrap');
        if ($wrap){
            $options = array_merge($options, array(unserialize($wrap->getValue())));
        }
        return $options;
    }
}

Por la misma razón que he reescrito, Mage_Sales_Block_Order_Item_Renderer_Default::getItemOptionsmi opción se mostrará en el carrito

<?php
class [Namespace]_[Module]_Block_Sales_Order_Item_Renderer_Default extends Mage_Sales_Block_Order_Item_Renderer_Default
{
    public function getItemOptions(){
        $result = parent::getItemOptions();
        $options = $this->getOrderItem()->getProductOptions();
        if (isset($options['wrap'])){
            $result = array_merge($result, array($options['wrap']));
        }
        return $result;
    }
}

y la columna de nombre de administrador para la cuadrícula de artículos de pedido:

<?php
class [Namespace]_[Module]_Block_Adminhtml_Sales_Items_Column_Name extends Mage_Adminhtml_Block_Sales_Items_Column_Name
{
    public function getOrderOptions(){
        $result = parent::getOrderOptions();
        if ($options = $this->getItem()->getProductOptions()) {
            if (isset($options['wrap'])) {
                $result = array_merge($result, array($options['wrap']));
            }
        }
        return $result;
    }
}

[EDITAR]
Parece que me perdí algo. Solo implementé la opción de agregar un papel de regalo una vez que el producto está en el carrito.
Pero creo que puede usar el mismo código en un evento antes o después de agregar el artículo al carrito.

$data = array();
$data['label'] = Mage::helper('helper_alias')->__('Giftwrapping');
$data['value'] = Mage::helper('helper_alias')->__('Yes');
$product->addCustomOption('wrap', serialize($data));
$item->addOption($product->getCustomOption('wrap'));
$item->save(); //this line should be called only if it's not called by default after your event is dispatched.

Eso es. Espero que pueda obtener algo útil de esto.

Marius
fuente
Donde tengo problemas es obtener la opción. Cuando llamo $ item-> getOptionByCode ('license_code') obtengo un valor nulo. Mis opciones ni siquiera aparecen cuando llamo a lo siguiente: $ helper = Mage :: helper ('catalog / product_configuration'); $ opciones = $ ayudante-> getCustomOptions ($ quoteItem); ¿Cómo está configurando la opción 'envolver'?
Laura
@Laura. Comprobaré si me perdí algo y te responderé.
Marius
@Laura. Revisé dos veces y parece que me perdí algo. Para mí, la opción de agregar envoltura de regalos se muestra solo en el carrito. Olvidé que cambié esto porque el cliente lo solicitó. Actualicé la respuesta con el código que usé en una acción personalizada. Tal vez pueda agregarlo en un observador de eventos de carrito.
Marius
Terminé analizando la solicitud de compra después de todo. El problema es que las opciones que configuro en mi bloque de código original no se transfirieron al artículo de cotización fuera de la solicitud de compra.
Laura
@Marius Quiero agregar el producto en el carrito con la opción de generar sobre la marcha sin agregar la opción del producto en el lado del administrador cómo es posible
Pushpendra Singh
4

Relacionado con la respuesta de Marius, aquí hay algo que se me ocurrió:

Tengo un controlador personalizado que maneja la configuración de un tipo de producto personalizado. Este controlador agrega additional_optionsdurante agregar al carrito.

// My_Module_CartController::addToCartAction
// Get your product model
$product = $this->getProduct();

// Create options
$options = array();
$options['my_option'] = array(
    'label' => 'My Label',
    'value' => 'my_value'
);

$cartRequest = array(
    'product' => $product->getId(),
    'qty' => '1'
);

$cart = Mage::getModel('checkout/cart');
$cart->init();

// Add options
$product->addCustomOption('additional_options', serialize($options));

// Add to cart
$cart->addProduct($product, $cartRequest);
$cart->save();

En un observador del evento sales_convert_quote_item_to_order_item, luego tomo additional_optionsy establezco como opciones en el artículo de pedido:

// My_Module_Model_Order_Observer::convertQuoteToOrder(Varien_Event_Observer $o)
// Get quote and order items
$orderItem = $o->getEvent()->getOrderItem();
$quoteItem = $o->getEvent()->getItem();

// Get serialized options set on product earlier
$myOptions = $item->getProduct()->getCustomOption('additional_options')->getValue();

// Add these options into the order item's options
$options = $orderItem->getProductOptions();
$options['additional_options'] = unserialize($myOptions);
$orderItem->setProductOptions($options);

return $this;

Al usarlo, additional_optionsno debería tener que preocuparse por varios bloques / plantillas que muestran las opciones (aunque puede preferir un formato alterado), ya que estos bloques llamarán $options['additional_options']Ver aquí

pspahn
fuente