【问题标题】:Loop: getPriceHtml() gives the same price for all products循环:getPriceHtml() 为所有产品提供相同的价格
【发布时间】:2014-04-02 18:14:00
【问题描述】:

我在 .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->getName() 给出正确的产品名称

getPriceHtml() 给出了在循环中访问的第一个产品的价格。

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

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

【问题讨论】:

  • $model = Mage::getModel('catalog/product');

标签: magento loops


【解决方案1】:

$this 是什么? Mage_Catalog_Block_Product_List?你为什么要传递idSuffix = '-bestseller'?我想你应该打电话给$this-&gt;getPriceHtml($_product, true);

**编辑

所以现在我在想两件事:

a)根据您上面的评论,我认为您每次都想获得一个新的模型实例。所以在循环内部要么用Mage::getModel('catalog/product');替换$model,要么重新声明

$model = Mage::getModel('catalog/product');

在循环的开始。

b) 按照您在下面的评论并重新审视这一点,我认为您可能需要在生成价格 HTML 之前获取价格,因此请尝试添加以下行:

$dummyPrice = $model->getPrice();

echo 'product price = '.$this-&gt;getPriceHtml($_product, true) 之前。实际上这可能是问题:因为您使用相同的实例 $model 并将新产品加载到旧产品之上,我认为 $model 持有第一个 '$_product->getPrice()' 价格计算,然后没有重新计算它,因为函数是:

public function getPrice()
{
    if ($this->_calculatePrice || !$this->getData('price')) {
        return $this->getPriceModel()->getPrice($this);
    } else {
        return $this->getData('price');
    }
}

如果您不执行上述 a),我认为您需要在每个 $model-&gt;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,并将其传递给您的代码以查看它是否返回预期价格。

【讨论】:

  • 重新声明'$model = Mage::getModel('catalog/product');'在循环的开始是成功的。谢谢!
【解决方案2】:

问题在于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);  

  }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    相关资源
    最近更新 更多