2012-06-19 25 views
6

Ho bisogno di estendere il carrello degli acquisti Magento per includere un ulteriore passaggio per un localizzatore di negozi. Comprendo che devo sovrascrivere il controller principale OnePage (Mage_Checkout_OnepageController) e i blocchi (Mage_Checkout_Block_Onepage), ma cosa è necessario fare per tenere traccia delle informazioni aggiuntive (ad esempio le opzioni selezionate dall'utente dal mio passaggio personalizzato).Estensione del carrello acquisti Magento

risposta

15

Ci sono una serie di passaggi necessari per ottenere l'intera soluzione.

In primo luogo, creare un nuovo modulo. Utilizzare lo ModuleCreator se lo si desidera.

Quindi, scrivi un setup script nel modulo per aggiungere i nuovi campi alla struttura di attributi di Magento, ad es. :

$setup = new Mage_Sales_Model_Mysql4_Setup('core_setup'); 
$setup->startSetup(); 

$setup->addAttribute('quote', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 
$setup->addAttribute('order', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 
$setup->addAttribute('invoice', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 
$setup->addAttribute('creditmemo', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 

Nota l'uso della Mage_Sales_Model_Mysql4_Setup per aggiungere i campi ai relativi sales_flat_quote e sales_flat_order tabelle.

Ora, inserire i seguenti valori nel file del modulo config.xml:

<global> 

    <fieldsets> 
     <sales_convert_quote> 
      <my_attribute> 
       <to_order>*</to_order> 
      </my_attribute> 
     </sales_convert_quote> 
     <sales_convert_order> 
      <my_attribute> 
       <to_cm>*</to_cm> 
       <to_invoice>*</to_invoice> 
      </my_attribute> 
     </sales_convert_order> 
    </fieldsets> 

che vi spieghera Magento per copiare i valori del vostro campo personalizzato da quote al fine di fatturare e credit_memo, ecc

Quindi nel tuo codice blocco/controllore personalizzato, sarai in grado di usare i magici e i setter magici per mantenere i valori.

$oQuote = Mage::getSingleton('checkout/session')->getQuote(); 
$oQuote->setMyAttribute('some_value'); 
$oQuote->save(); 

Si dovrebbe vedere la nuova colonna e il valore salvato in sales_flat_quote. Quindi, una volta che il cliente ha completato il pagamento, lo stesso valore deve essere salvato in sales_flat_order.

Si noti che il codice di cui sopra può essere esteso a lavorare per quote_item e order_item semplicemente cambiando quote-quote_item ecc, tuttavia, se si desidera salvare i valori degli attributi che sono stati impostati sui vostri prodotti, quindi è necessario un po 'di lavoro extra.

inserire un nuovo blocco di XML nel vostro config.xml (ancora una volta all'interno del nodo globale):

<sales> 
     <quote> 
      <item> 
       <product_attributes> 
        <my_attribute /> 
       </product_attributes> 
      </item> 
     </quote> 
    </sales> 

Dove my_attribute è il codice dell'attributo del modello del prodotto. Che farà il my_attribute disponibili informazioni sul prodotto collegato, in modo da poter accedere tramite

$oQuoteItem->getProduct()->getMyAttribute() 

senza la necessità di eseguire una completa Mage::getModel('catalog/product')->load($oQuoteItem->getProductId()). Questo è molto più efficiente.

Quindi, è necessario un osservatore per copiare i valori dall'oggetto prodotto all'oggetto quote_item. Quindi, dichiarare il vostro osservatore nel config.xml:

<events> 
     <sales_quote_item_set_product> 
      <observers> 
       <quoteitem_set_custom_data> 
        <type>singleton</type> 
        <class>mymodule/observer</class> 
        <method>setCustomDataOnQuoteItem</method> 
       </quoteitem_set_custom_data> 
      </observers> 
     </sales_quote_item_set_product> 
    <events> 

e scrivere il codice nella classe osservatore in questo modo:

public function setCustomDataOnQuoteItem($oObserver){ 
    $oProduct = $oObserver->getProduct(); 
    $oQuoteItem = $oObserver->getQuoteItem(); 
    foreach(array('my_attribute') as $vAttributeCode){ 
     $oQuoteItem->setData($vAttributeCode,$oProduct->getData($vAttributeCode)); 
    } 
} 
+0

Perché nessuno creare un post sul blog il più chiaro e completo come hai fatto ?? Ho trascorso 2 ore cercando la tua risposta! Grazie ! – LittleBigDev