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;
}