19

我正在开发一个脚本(Magento 外部,而不是模块),旨在输出所有可用产品、它们的价格和其他一些属性的文本列表。但是,目录价格规则似乎不适用于产品价格。如果我使用以下任何一种:

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

我得到正常价格(没有应用规则)。

如果我使用:

$_product->getSpecialPrice()

我得到null除非产品实际上在产品本身中插入了特价(即,如果特价与目录规则无关)。

我也试过

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

正如 Fabian Blechschmidt 给出的答案中所建议的那样,但有趣的是,它仅在产品受任何目录规则影响时才返回正常价格,否则返回null

前段时间在StackOverflowMagento 论坛中有一个类似的问题,但提供的答案(即插入下面的代码)对我不起作用(返回的价格保持不变)。

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

有人知道如何实现这一目标吗?

我正在使用 Magento 1.6.2.0。提前致谢。

4

4 回答 4

20

谢谢你,我找到了一个新网站: http: //www.catgento.com/magento-useful-functions-cheatsheet/

他们提到:

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

高温高压

于 2012-12-30T20:25:34.560 回答
12

由于目录价格规则在很大程度上取决于时间、商店和访问客户,因此当您想要检索应用了价格规则的产品最终价格时,您需要设置这些参数。

因此,在您的情况下,请确保提供的产品与所需的商店和客户组 id 一起传递,可以将其设置为:

Mage::getModel('catalogrule/rule')->calcProductPriceRule($product->setStoreId('STORE_ID')->setCustomerGroupId('CUSTOMER_GROUP_ID'),$product->getPrice())
于 2012-12-31T00:12:38.497 回答
12

我发现了问题。折扣价格在商店前端显示 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()

谢谢大家的意见。

于 2012-12-31T02:57:48.420 回答
12

这在这个问题上帮助了我: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;
}
于 2013-04-23T23:11:43.133 回答