мы используем Magento в основном для транзакций и полностью переписываем интерфейс с помощью специального приложения. У меня возникли проблемы с применением кода купона (правила цены корзины покупок) на объект цитаты. Код купона, кажется, отклонен – setCouponCode не возвращает никакой ошибки, но getCouponCode возвращает пустую строку.
Я подтвердил, что код купона действителен, проводя транзакцию через бэкэнд администратора. Ниже приведен фрагмент кода.
Может ли кто-нибудь помочь мне получить объект модели цитаты, чтобы принять и применить код купона?
функция add_coupon ($ shoppingCartId, $ couponcode) {
try { $quoteObj = Mage::getModel('sales/quote')->load($shoppingCartId); $quoteObj->getShippingAddress()->setCollectShippingRates(true); $quoteObj->getShippingAddress()->setCouponCode($coupon) ->setTotalsCollectedFlag(true) ->collectTotals() ->save(); } catch (Exception $e) { return array("status"=>"failed", "message"=>"Error applying coupon."); } if ($coupon) { if (!$coupon == $quoteObj->getCouponCode()) { return array("status"=>"failed", "message"=>"Coupon code is not valid."); } } return array("status"=>"success");
}
Я столкнулся с той же проблемой и обнаружил, что мне нужно вызвать setCouponCode (), прежде чем добавлять какие-либо элементы в мою цитату.
В вашем случае это будет выглядеть так:
$quoteObj = Mage::getModel('sales/quote')->setCouponCode($coupon)->load($shoppingCartId);
Вся логика, необходимая для работы с купонами, находится в модуле SalesRule.
Существует модель Mage_SalesRule_Model_Coupon
которая является объектом купона, и имеет модель ресурса Mage_SalesRule_Model_Mysql4_Coupon
.
Чтобы создать новый купон, вы можете создать экземпляр вышеуказанной модели купона, заполнить все поля и вызвать метод save (). Он будет записывать данные в таблицу salesrule_coupon
. Но если вы посмотрите на эту таблицу, вы увидите, что купоны зависят от идентификатора правила, поэтому сначала вам нужно создать правило продаж .
Mage_SalesRule_Model_Rule
заботится о правилах, у него также есть собственная модель ресурсов. Я думаю, вам будет полезно исследовать, как они работают
Сегодня вечером я потерял несколько часов. Надеюсь, я смогу спасти кого-то. Эмили правильно подходит для этого примера (где вы загружаете корзину покупок в цитату).
Это относится к Magento 1.7.0.2, я не уверен, что он держится для других версий.
Если вы программно создаете заказ, но не используете корзину для покупок, это может вам помочь: Основная проблема заключается в том, что Magento запускает collectTotals () каждый раз, когда вы добавляете / обновляете адрес в цитате, – и вот важный part: он кэширует их. (Фактически, после сохранения адреса, если вы проверите getTotalsCollectedFlag, вы увидите, что оно установлено в true!). Установка кода купона после этого, даже если вы запустите collectTotals (), не применяет код купона.
Вы можете вызвать setTotalsCollectedFlag (false) в цитате, а затем применить купон, но это плохая идея (это может привести к некоторым просчетам в соответствии с сообщением об ошибке Magento, которое больше не доступно), то, что вы хотите сделать, это вызов setCouponCode перед установкой любых адресов (или, по крайней мере, перед установкой последнего адреса).