2012-12-30 57 views
16

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

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

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

如果我使用:

$_product->getSpecialPrice() 

我得到,除非该产品实际上有一个特殊的价格插在产品本身的(即如有特殊价格不与目录规则有关)。

我也试过

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

为在法比安布莱赫施密特给出的答案建议,但有趣的是它返回只有当产品被任何目录规则的影响,回国否则正常价格。

前段时间StackOverflowMagento Forums也有类似的问题,但是提供的答案(即插入代码如下)对我不起作用(返回的价格保持不变)。

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

有没有人有如何实现这个想法?

我使用的是Magento 1.6.2.0。 在此先感谢。

+2

也许还有其他的事情正在涉及您的数据或索引。所有定制模块被禁用时,折扣价格是否按默认主题预期显示? – benmarks

+0

是的,折扣价显示在前端。问题是这不是一个Magento模块,而是一个“外部”脚本。看来Magento加载了一切正常工作所需的附加内容。换句话说,Magento中的所有东西都必须是一个模块...... – faken

+1

*“Magento中的所有内容都必须是模块”* - 并非如此。然而,有很多模块在应用程序执行时以多种方式进行交互。我会检查'Mage_CatalogRule_Model_Observer'是否正在实例化。也许你应该粘贴远程脚本的相关部分('Mage :: app()'实例化,'loadAreaPart()'调用,产品加载等) – benmarks

回答

10

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

谢谢大家对您的输入。

18

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

,他们提到:

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

HTH

+0

嗨,谢谢你的回答(我错过了我的搜索网站)。这似乎正是我需要的,但它不起作用:退货价格与原始价格相同(如果产品不受任何规则影响,它不会返回任何价格,尽管后者可以轻松解决)。我正在查看来自Mage_CatalogRule_Model_Rule和相关类的代码,它似乎按照我想要的做,但事实并非如此。我也尝试刷新缓存,reindex等,但结果总是相同的。再次感谢。 – faken

+0

尝试预先加载产品$ _product-> load($ _ product-> getId())如果这有效,那么你错过了一个属性。不要停止这一点。查看哪些属性丢失并将其添加到集合中。你发布的代码看起来像view.phtml或其他东西,那么你可以改变后端的属性设置。 –

+0

我试图用这个,但我得到这个错误: 无效的方法Mage_CatalogRule_Model_Rule :: calcProductPriceRule 我能做的任何事情吗? – Klettseb

9

由于目录价格规则,在很大程度上取决于时间,存储和访问客户,您需要在应用价格规则时检索产品最终价格时设置这些参数。

所以,你的情况,确保所提供的产品与所需的存储和客户群ID,它可以设置为通过:

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

它的工作。谢谢。 –

+0

非常感谢。我有问题的是,Lengow Feed Export扩展的Cronjob没有正确考虑目录规则的价格导出。将setCustomerGroupId()应用于产品实例后,它运行良好。 我认为这个解决方案要好得多,然后通过Mage :: app() - > loadAreaPart()等模拟商店前端。 –

10

这帮了我这个问题: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; 
} 
+0

尽管faken的答案是正确的方法。如果你想成为一名叛军,这确实有效。 –

相关问题