2012-06-19 12 views
6

Necesito ampliar el carrito de compras de Magento para incluir un paso adicional para un localizador de tiendas. Entiendo que necesito sobrescribir el controlador central de OnePage (Mage_Checkout_OnepageController) y los bloques (Mage_Checkout_Block_Onepage), pero lo que se debe hacer con respecto al seguimiento de la información adicional (por ejemplo, las opciones seleccionadas por el usuario de mi paso personalizado).Extender Magento Carro de la compra

Respuesta

15

Aquí hay una serie de pasos necesarios para obtener la solución completa.

En primer lugar, cree un nuevo módulo. Use el ModuleCreator si lo desea.

Luego, escriba setup script en su módulo para agregar los nuevos campos a la estructura de atributos de Magento, p. :

$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 el uso de la Mage_Sales_Model_Mysql4_Setup para agregar los campos a los pertinentes sales_flat_quote y sales_flat_order tablas.

Ahora, introduzca los siguientes valores en el archivo de su módulo de 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> 

Eso dará instrucciones a Magento para copiar los valores de su campo personalizado de la cita para el fin de facturar y credit_memo, etc.

Luego, en su código de bloque/controlador personalizado, podrá usar los captadores y establecedores mágicos de Magento para persistir en los valores.

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

Debería ver la nueva columna y el valor guardado en sales_flat_quote. Luego, una vez que el cliente completa el proceso de pago, se debe guardar el mismo valor en sales_flat_order.

Tenga en cuenta que el código anterior se puede extender a trabajar para quote_item y order_item con sólo cambiar quote a quote_item etc, sin embargo, si se desea guardar los valores de atributos que se han establecido en sus productos, entonces se requiere un trabajo extra.

insertar un nuevo bloque de XML en su config.xml (de nuevo dentro del nodo global):

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

Dónde my_attribute es el código de atributo en el modelo del producto. Eso hará que el my_attribute disponibles sobre este producto vinculado, por lo que se puede acceder a él a través de

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

sin necesidad de realizar una completa Mage::getModel('catalog/product')->load($oQuoteItem->getProductId()). Esto es mucho más eficiente.

Luego, necesitará un observador para copiar los valores del objeto del producto al objeto quote_item. Por lo tanto, declare su observador en el 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> 

y escribir código en su clase observador como esto:

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

¿Por qué nadie crear un blog tan clara y completa como lo hizo ?? Pasé 2 horas buscando tu respuesta! Gracias ! – LittleBigDev

Cuestiones relacionadas