循环:getPriceHtml()为所有产品提供相同的价格

时间:2014-04-01 13:24:37

标签: magento loops

我在.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()给出了循环中访问的第一个产品的价格。

因此,所有产品都以相同的价格显示......

我可以做些什么来更新产品数据?为什么每种产品的价格都没有变化?

2 个答案:

答案 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);  

  }

如果您有任何问题,请告诉我