2012-06-06 22 views
9

Estoy ejecutando Magento 1.7.¿Agregar una opción personalizada a un artículo de cotización (producto en el carro)?

Estoy tratando de agregar una opción de elemento de presupuesto, uno personalizado, en sales_flat_quote_item_option.

He intentado con las funciones addOption y addCustomOption, pero parece que no se lanzó ninguna consulta a la base de datos.

Este es mi código en este momento (en un ayudante módulo personalizado):

public function assignDocumentToQuoteItem(Mage_Sales_Model_Quote_Item $quoteItem, $documentid) 
{ 
    if (is_numeric($documentid) && $documentid > 0) { 
     /** @var Mage_Catalog_Model_Product */ 
     $product = $quoteItem->getProduct(); 

     $quoteItem->addOption(array(
      'product_id' => $product->getId(), 
      'product' => $product, 
      'code'  => 'documentid', 
      'value'  => $documentid 
     )); 
     $quoteItem->save(); 
     return true; 
    } 

    throw new Exception(__METHOD__.' - Document id has to be a numeric value.'); 
} 
+4

Esto probablemente se respondió (muy bien) aquí: http://stackoverflow.com/a/9344336/833795 – benmarks

+1

posible duplicado de [El valor de opción de cambio personalizado Magento antes de añadir a la cesta ] (http://stackoverflow.com/questions/9334115/magento-change-custom-option-value-before-adding-it-to-cart) – Alex

+0

¿Intentó agregar try catch exception a save()? – srgb

Respuesta

2

Si esto es posible, es necesario utilizar el observador

he estado añadiendo la fecha de entrega con cada producto en las órdenes

Así que puede cambiar esta opción para que sea la opción que desee agregar a cada producto.

  <controller_action_predispatch_checkout> 
      <observers> 
       <options_observer> 
        <class>YOUR_CLASS_NAME</class> 
        <method>setProductInfo</method> 
       </options_observer> 
      </observers> 
     </controller_action_predispatch_checkout> 

public function setProductInfo($observer) 
{ 
    if ('checkout_cart_add' != $observer->getEvent()->getControllerAction()->getFullActionName()) { 
     return; 
    } 
    $request = Mage::app()->getRequest(); 
    $prId = $request->getParams(); 
    $product = Mage::getModel('catalog/product')->load($prId['product']); 
    // fixed spelling of cofigurable/configurable 
    if ($product->getTypeId() == 'configurable') { 
     return $this; 
    } 

    if (!$product->getHasOptions()) { 
     $optionID = $this->saveProductOption($product); 
    } else { 
     $options = $product->getOptions(); 
     if ($options) { 
      foreach ($options as $option) { 
       if ($option->getTitle() == 'Delivery Date') { 
        $optionID = $option->getOptionId(); 
       } 
      } 
     } 
     if (empty($optionID)) { 
      $optionID = $this->saveProductOption($product); 
     } 
    } 

    $deliveryDate = $prId['delivery_date']; 
    if (!empty($deliveryDate)) { 
     $opt['options'] = array($optionID => $deliveryDate); 
     $request->setParams($opt); 
    } 

    return $this; 
} 

function saveProductOption($product) 
{ 

    $store = Mage::app()->getStore()->getId(); 
    $opt = Mage::getModel('catalog/product_option'); 
    $opt->setProduct($product); 
    $option = array(
     'is_delete' => 0, 
     'is_require' => false, 
     'previous_group' => 'text', 
     'title' => 'Delivery Date', 
     'type' => 'field', 
     'price_type' => 'fixed', 
     'price' => '0.0000' 
    ); 
    $opt->addOption($option); 
    $opt->saveOptions(); 
    Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)); 
    $product->setHasOptions(1); 
    $product->save(); 

    $options = $product->getOptions(); 
    if ($options) { 
     foreach ($options as $option) { 
      if ($option->getTitle() == 'Delivery Date') { 
       $optionID = $option->getOptionId(); 
      } 
     } 
    } 
    Mage::app()->setCurrentStore(Mage::getModel('core/store')->load($store)); 
    return $optionID; 
} 
Cuestiones relacionadas