2012-06-06 7 views
9

Sto eseguendo Magento 1.7.Aggiungi un'opzione personalizzata a un articolo di preventivo (prodotto nel carrello)?

Sto tentando di aggiungere un'opzione elemento di quotazione, personalizzata, in sales_flat_quote_item_option.

Ho provato con le funzioni addOption e addCustomOption, ma sembra che nessuna query sia stata avviata nel database.

Questo è il mio codice in questo momento (in un aiutante modulo personalizzato):

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

Questo è probabilmente risposto (piuttosto bene) qui: http://stackoverflow.com/a/9344336/833795 – benmarks

+1

possibile duplicato del [valore opzione di modifica personalizzati Magento prima di aggiungerlo al carrello ] (http://stackoverflow.com/questions/9334115/magento-change-custom-option-value-before-adding-it-to-cart) – Alex

+0

hai provato ad aggiungere try catch exception a save()? – srgb

risposta

2

Sì questo è possibile, è necessario utilizzare l'osservatore

mi sono stati l'aggiunta della data di consegna con ogni prodotto in gli ordini

Quindi è possibile modificare questo per essere l'opzione che si desidera aggiungere a ciascun prodotto o così.

  <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; 
}