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