我在.phtml文件中使用了一个循环,如下所示:
$model = Mage::getModel('catalog/product');
$result = array();
$cnt = 0;
foreach ($result_skus as $index => $num) {
$result[$cnt] = $index;
$cnt ++;
}
for($cnt = 0; $cnt<count($result); $cnt++){
//load product data
$_product = $model->load($result[$cnt]);
//display product name
echo 'product name = '.$this->htmlEscape($_product->getName());
echo '<br>';
//display product price
echo 'product price = '.$this->getPriceHtml($_product, true, '-bestseller')
}
$ _ product-&gt; getName()提供正确的产品名称
但是
getPriceHtml()给出了循环中访问的第一个产品的价格。
因此,所有产品都以相同的价格显示......
我可以做些什么来更新产品数据?为什么每种产品的价格都没有变化?
答案 0 :(得分:2)
这是什么? Mage_Catalog_Block_Product_List
?你为什么要过idSuffix = '-bestseller'
?我想你应该拨打$this->getPriceHtml($_product, true);
**编辑
所以现在我在想两件事:
a)根据您的评论,我认为您希望每次都获得一个新的模型实例。因此,在循环内部将$model
替换为Mage::getModel('catalog/product');
或重新声明
$model = Mage::getModel('catalog/product');
在循环开始时。
OR
b)按照下面的评论并重新审视一下,我认为您可能需要在生成价格HTML之前获取价格,因此请尝试添加以下行:
$ dummyPrice = $ model-&gt; getPrice();
在echo 'product price = '.$this->getPriceHtml($_product, true)
之前。实际上这可能是事情:因为你使用相同的实例$ model并在旧产品上加载新产品我认为$ model持有第一个&#39; $ _ product-&gt; getPrice()&# 39;价格计算然后不重新计算,因为函数是:
public function getPrice()
{
if ($this->_calculatePrice || !$this->getData('price')) {
return $this->getPriceModel()->getPrice($this);
} else {
return $this->getData('price');
}
}
如果您不执行上述操作,我认为您需要在每个$model->load();
之后强制重新计算价格,因此在该方案中您的循环将是
//load product data over the top of the previous loaded product
$_product = $model->load($result[$cnt]);
//force price recalculation
$_product->getPriceModel()->getPrice($_product);
//now ask for the price as HTML
echo 'product price = '.$this->getPriceHtml($_product, true);
但我认为最好在每个循环中使用Mage::getModel('catalog/product');
,因为我们不知道Magento还有什么或者不会清除或覆盖。
这提出了一些有趣的问题:所有模型实例都在哪里?进入记忆?也许。我挖了一下,找到了关于函数的an interesting article by Drew Gillson
Mage_Core_Model_Abstract::clearInstance();
所以现在我也在学习东西,我想你想要一个像这样的循环:
for($cnt = 0; $cnt<count($result); $cnt++){
//load product data
$_product = $model->load($result[$cnt]);
//display product name
echo 'product name = '.$this->htmlEscape($_product->getName());
echo '<br>';
//display product price
echo 'product price = '.$this->getPriceHtml($_product, true);
//clear the $model for next time round (I reckon this will clear the calculated price too)
$model->clearInstance();
}
毕竟,如果它还没有运作,我建议多做一些调试。如果您获得了正确的产品名称,那么这是令人鼓舞的。
在您的产品循环内部也回响:
$_product->getId();
$_product->getSku();
$_product->getData('price');
$_product->getPrice('');
$_product->getPriceModel()->getPrice($_product);
$_product->getPriceModel()->getBasePrice($_product);
$_product->getPriceModel()->getFinalPrice($_product);
$_product->getData('price');
$_product->getFormatedPrice('');
这应该有助于确认您正在加载正确的产品信息并公开可用的内容,并希望能够说明为什么您没有得到您期望的价格。层级价格,特价和最低价格还有许多其他价格函数。
如果仍然没有做你想做的事情,请仔细查看你的Magento设置并完成重新索引和缓存刷新。
你也可以选择一个你知道价格的SKU,并通过你的代码传递它,看看它是否会返回预期的价格。
答案 1 :(得分:1)
问题是getPriceHtml()
块中定义了Mage_Catalog_Block_Product
函数,而不是标准Mage_Core_Block_Template
。
因此,您必须首先在自定义脚本中实例化Product block class which contains the method
。
$product_block = new Mage_Catalog_Block_Product;
$product_block->getPriceHtml($product,true);
所以在你的情况下只需使用这个脚本
$model = Mage::getModel('catalog/product');
$result = array();
$cnt = 0;
foreach ($result_skus as $index => $num) {
$result[$cnt] = $index;
$cnt ++;
}
for($cnt = 0; $cnt<count($result); $cnt++){
//load product data
$_product = $model->load($result[$cnt]);
//display product name
echo 'product name = '.$this->htmlEscape($_product->getName());
echo '<br>';
$product_block = new Mage_Catalog_Block_Product;
//instantiate the Product block class which contains the method
//display product price
echo 'product price = '. $product_block->getPriceHtml($_product,true);
}
如果您有任何问题,请告诉我