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

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


person Lyndon Hook    schedule 19.06.2012    source источник


Ответы (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));
    }
}
person Jonathan Day    schedule 19.06.2012
comment
Почему никто не создает запись в блоге так ясно и полно, как это сделали вы?? Я потратил 2 часа на поиск вашего ответа! Спасибо ! - person LittleBigDev; 18.12.2012

Вот полный рабочий модуль. Он (почти) такой же, как приведенный выше код Джонатана. Вы найдете его здесь: 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/

person Martijn van Hoof    schedule 03.10.2013