Мне нужно расширить корзину покупок Magento, чтобы включить дополнительный шаг для поиска магазинов. Я понимаю, что мне нужно перезаписать основной контроллер OnePage (Mage_Checkout_OnepageController
) и блоки (Mage_Checkout_Block_Onepage
), но что нужно сделать в отношении отслеживания дополнительной информации (например, выбранных пользователем параметров из моего пользовательского шага).
Расширение корзины покупок Magento
Ответы (2)
Здесь необходимо выполнить ряд шагов, чтобы получить полное решение.
Во-первых, создайте новый модуль. При желании используйте 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 скопировать значения вашего пользовательского поля из цитаты в заказ в счет-фактуру и кредит_мемо и т. д.
Затем в вашем пользовательском коде блока/контроллера вы сможете использовать магические геттеры и сеттеры 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())
. Это намного эффективнее.
Затем вам понадобится наблюдатель, чтобы скопировать значения из объекта product в объект 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/