Мне нужно расширить корзину покупок 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/