Расширение корзины Magento

Мне нужно расширить корзину покупок Magento, чтобы включить дополнительный шаг для локатора магазина. Я понимаю, что мне нужно перезаписать основной контроллер OnePage ( Mage_Checkout_OnepageController ) и блокировать ( Mage_Checkout_Block_Onepage ), но что нужно сделать, чтобы отслеживать дополнительную информацию (например, выбранные пользователем параметры из моего пользовательского шага).

Для получения всего решения необходимо выполнить несколько шагов.

Во-первых, создайте новый модуль. Используйте ModuleCreator, если хотите.

Затем напишите сценарий установки в своем модуле, чтобы добавить новые поля в структуру атрибутов Magento, например:

  $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)); 

Обратите внимание на использование Mage_Sales_Model_Mysql4_Setup для добавления полей в соответствующие sales_flat_quote и sales_flat_order .

Теперь добавьте следующие значения в файл 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> 

Это даст указание Magento скопировать значения вашего настраиваемого поля из цитаты для выставления счета и credit_memo и т. Д.

Затем в вашем пользовательском блоке / контроллере вы сможете использовать магические геттеры и сеттеры Magento для сохранения значений.

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

Вы должны увидеть новый столбец и значение, сохраненное в sales_flat_quote . Затем, как только клиент завершает проверку, одно и то же значение должно быть сохранено в sales_flat_order .

Обратите внимание, что приведенный выше код может быть расширен, чтобы работать для quote_item и order_item , просто изменив quote на quote_item т. Д., Однако, если вы хотите сохранить значения атрибутов, установленные на ваших продуктах, тогда потребуется дополнительная работа.

Вставьте новый блок XML в свой файл config.xml (снова внутри глобального узла):

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

Где my_attribute – это код атрибута в модели продукта. Это сделает my_attribute доступным для связанного продукта, чтобы вы могли получить доступ к нему через

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

без необходимости выполнять полный Mage::getModel('catalog/product')->load($oQuoteItem->getProductId()) . Это намного эффективнее.

Затем вам понадобится наблюдатель для копирования значений из объекта продукта в объект quote_item. Итак, объявите своего наблюдателя в файле 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> 

и напишите код в вашем классе наблюдателя следующим образом:

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

Вот полный рабочий модуль .. его (почти) тот же самый, что и вышеупомянутый код Джонатана. Вы найдете его здесь: https://bitbucket.org/vovsky/adding-custom-product-attribute-to-quote-and-order-items-in/

И полное объяснение каждого шага здесь: http://www.atwix.com/magento/custom-product-attribute-quote-order-item/