Применение Sales Rules в Magento 1.5.x
Так получилось, что последние два проекта на работе были связаны с написанием интернет магазинов на популярном движке magento. Вся сложность заключалась в том, что дизайн, полученный от клиента никак не вписывался в “стандартный” движок magento. Более того в некоторых местах необходимо изменить обыкновенную логику движка, не влезая при этом в код. В связи с этим пришлось решить ряд проблем.
Одной из таких проблем стало применение Sales Rules в ShoppingCart. Добавление, изменение количества и удаление товара было реализовано с помощью ajax. Для этого были созданы внешние PHP скрипты, использующие классы magento. Здесь возникла проблема. После отработки ajax скрипта и обновлении данных shopping cart к ценам товаров не применяются правила скидок (SalesRules). После продолжительных поисков в сторону решения наткнулся на одну статью. Оказывается, правила скидок применяются в ценам по определенным событиям специальными объектами (Observers). И работают они в backend’е и frontend’е по-разному в зависимости от того, в каком окружении (areas) происходит работа (frontend, admin).
Простейший Ajax скрипт выглядит следующим образом:
include_once 'app/Mage.php'; // подключение файла ядра
$app = Mage::app(); // инициализация приложения
Mage::app()->getLocale()->setLocale('nl_NL');
Mage::app()->getTranslator()->init('frontend', true);
..........................................................
Подключается основной файл ядра magento, инициализируется приложение, а далее выполняются необходимые действия. Например, для добавления товара в карту происходит следующее:
$session = Mage::getSingleton('core/session', array('name'=>'frontend'));
$cart = Mage::helper('checkout/cart')->getCart();
......................................................
$cart->addProduct($product, $qty);
$session->setLastAddedProductId($product->getId());
$session->setCartWasUpdated(true);
$cart->save();
......................................................
Очевидно в этом случае, magento грузит observer’ы которые прописаны в config.xml в разделе. Таким образом, чтобы решить проблему, надо “указать magento” в каком окружении мы хотим работать:
Mage::app()->loadArea($area);
В данном случае это FRONTEND. Для этого необходимо сразу после инициализации приложения добавить строку такого вида:
Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND);