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


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

Author: Mufaddal, 2012-06-19

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));
    }
}
 15
Author: Jonathan Day, 2012-06-19 01:07:07

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

 0
Author: Martijn van Hoof, 2013-10-03 12:38:20