Magento: как получить цену продукта с применением правил каталога
Я разрабатываю скрипт (внешний для Magento, а не модуль), который нацелен на вывод текстового списка всех доступных продуктов, их цен и некоторых других атрибутов. Однако правила цен каталога, по-видимому, не применяются к ценам на продукты. Если я использую любое из следующего:
$_product->getPrice()
$_product->getFinalPrice()
Я получаю нормальную цену (без применения правил).
если я использую:
$_product->getSpecialPrice()
Я null если продукт на самом деле не имеет специальной цены в самом продукте (т. е. если специальная цена не связана с правилами каталога).
Я тоже пробовал
Mage::getModel('catalogrule/rule')->calcProductPriceRule($product,$product->getPrice())
как предложено в ответе, данном Фабианом Блехшмидтом, но интересно, что он возвращает нормальную цену, только если на продукт влияет какое-либо правило каталога, возвращая null иначе.
был аналогичный вопрос в StackOverflow и Форумы Magento некоторое время назад, но полученный ответ (который должен вставить код ниже) не работает для меня (возвращенные цены остаются теми же).
Mage::app()->loadAreaPart(Mage_Core_Model_App_Area::AREA_FRONTEND,Mage_Core_Model_App_Area::PART_EVENTS);
есть ли у кого-нибудь идея, как этого достичь?
Я использую Magento 1.6.2.0. Спасибо заранее.
4 ответов
благодаря вам, я нашел новый сайт: http://www.catgento.com/magento-useful-functions-cheatsheet/
и они сказали:
Mage::getModel('catalogrule/rule')->calcProductPriceRule($product,$product->getPrice())
HTH
я обнаружил проблему. В интерфейсе магазина отображаются цены со скидкой Ok. Проблема заключалась в том, что я разрабатывал сценарий "внешний" для Magento (таким образом, не модуль Magento), что-то вроде:
<?php
set_time_limit(0);
ignore_user_abort();
error_reporting(E_ALL^E_NOTICE);
header("Content-Type: text/plain; charset=utf-8");
require_once "app/Mage.php";
// Get default store code
$default_store = Mage::app()->getStore();
...
для того, чтобы все работало правильно, кажется, что нужно следовать правильной загрузке Magento и развивать все как модуль. Мой сценарий был настолько прост, что я подумал, что не нужно будет кодировать полный модуль. Другими словами, все в Magento должно действительно быть модулем.
В заключение, используя модульный подход, все методы работают так, как ожидалось:
$_product->getPrice()
$_product->getFinalPrice()
$_product->getSpecialPrice()
спасибо всем за Ваш вклад.
поскольку правила цены каталога сильно зависят от времени, магазина и посещения клиента, вам нужно установить эти параметры, когда вы хотите получить конечную цену продукта с ее правилами цены.
Итак, в вашем случае убедитесь, что предоставленный продукт передается с желаемым магазином и идентификатором группы клиентов, который может быть установлен как:
Mage::getModel('catalogrule/rule')->calcProductPriceRule($product->setStoreId('STORE_ID')->setCustomerGroupId('CUSTOMER_GROUP_ID'),$product->getPrice())
это помогло мне в этом вопросе: http://www.magentocommerce.com/boards/viewthread/176883/ . Решение Jernej кажется правдоподобным, но оно не обрабатывает правила, которые перезаписывают другие правила, используя "остановить обработку", и поэтому может применять более одного правила.
$original_price = $_product->getPrice();
$store_id = 1; // Use the default store
$discounted_price = Mage::getResourceModel('catalogrule/rule')->getRulePrice(
Mage::app()->getLocale()->storeTimeStamp($store_id),
Mage::app()->getStore($store_id)->getWebsiteId(),
Mage::getSingleton('customer/session')->getCustomerGroupId(),
$_product->getId());
// if the product isn't discounted then default back to the original price
if ($discounted_price===false) {
$discounted_price=$original_price;
}