Magento: как получить цену продукта с применением правил каталога - программирование
Подтвердить что ты не робот

Magento: как получить цену продукта с применением правил каталога

Я разрабатываю script (внешний для Magento, а не модуль), который предназначен для вывода текстового списка всех доступных продуктов, их цен и некоторых других атрибутов. Однако правила цен на каталоги, похоже, не применяются к ценам на товары. Если я использую любое из следующего:

$_product->getPrice()
$_product->getFinalPrice()

Я получаю нормальную цену (без применения правил).

Если я использую:

$_product->getSpecialPrice()

Я получаю null, если у продукта нет специальной цены, вставленной в самом продукте (т.е. если специальная цена не связана с правилами каталога).

Я также пробовал

Mage::getModel('catalogrule/rule')->calcProductPriceRule($product,$product->getPrice())

как было предложено в ответе Фабиана Блехшмидта, но интересно это возвращает нормальную цену, только если на продукт влияет любое правило каталога, возвращая null в противном случае.

В qaru.site/info/327215/... был похож вопрос и Magento Forums но предоставленный ответ (который должен вставить нижеприведенный код) не работает для меня (возвращенные цены остаются теми же).

Mage::app()->loadAreaPart(Mage_Core_Model_App_Area::AREA_FRONTEND,Mage_Core_Model_App_Area::PART_EVENTS);

Есть ли у кого-нибудь представление о том, как достичь этого?

Я использую Magento 1.6.2.0. Спасибо заранее.

4b9b3361

Ответ 1

Я обнаружил проблему. Дисконтированные цены отображают ОК в интерфейсе магазина. Проблема заключалась в том, что я разрабатывал script "внешний" для 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 и разрабатывать все как модуль. Мой script был настолько прост, что я думал, что нет необходимости кодировать полный модуль. Другими словами, все в Magento действительно должно быть модулем.

В заключение, используя модульный подход, все методы работают как ожидалось:

$_product->getPrice()
$_product->getFinalPrice()
$_product->getSpecialPrice()

Спасибо всем за ваш вклад.

Ответ 3

Это помогло мне в этом вопросе: 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;
}

Ответ 4

Поскольку правила цен каталога в значительной степени зависят от времени, магазина и посещения клиента, вам необходимо установить эти параметры, когда вы хотите получить конечную цену продукта с применением правил цены.

Итак, в вашем случае убедитесь, что предоставленный продукт передан с нужным идентификатором магазина и группы клиентов, который может быть установлен как:

Mage::getModel('catalogrule/rule')->calcProductPriceRule($product->setStoreId('STORE_ID')->setCustomerGroupId('CUSTOMER_GROUP_ID'),$product->getPrice())