【问题标题】:PHP/Magento - Variables within foreach not being updated properlyPHP/Magento - foreach 中的变量未正确更新
【发布时间】:2011-08-17 17:28:04
【问题描述】:

我在 magento 模板中遇到了 foreach 循环问题:

$cats = Mage::helper('catalog/category')->getStoreCategories();
foreach ($cats as $cat) {
    if($cat->getIsActive()&&$cat->getProductCount()) {
        echo "<div class=\"grid_6\">";
        echo $this->getLayout()->createBlock('catalog/product_new')
            ->setTemplate('catalog/product/new.phtml')
            ->setCategoryId($cat->getId())
            ->setColumnCount(2)
            ->setBlockTitle("Just Added in <a href=".$cat->getUrl().">".$cat->getName()."</a>")
            ->toHtml();
        echo "</div>";
    }
}

导致相同的块被重复 4 次(我有 4 个主要类别),而它应该显示 4 个不同的块,每个类别一个。就好像 $cat->getId()、$cat->getName() 和 $cat->getUrl() 语句不会在每次新迭代时更新。

我在这里做错了什么?

谢谢...

【问题讨论】:

  • 您是否对 $cats 进行了转储,以查看其中存储的数据是否符合您的预期?
  • 嗨,Jrod - 是的,我有,确实如此。如果我回显 $cat->getName() 我会得到正确的猫名......正是这个 getLayout 命令以某种方式无法获得正确的数据。

标签: php magento


【解决方案1】:

这里只是一个猜测,但看起来catalog/product_new 块并非设计为在一个请求中多次使用。如果你看Mage_Catalog_Block_Product_New中的类定义,它的伪构造函数包括以下内容

    $this->addData(array(
        'cache_lifetime'    => 86400,
        'cache_tags'        => array(Mage_Catalog_Model_Product::CACHE_TAG),
    ));

cache_lifetimecache_tags 属性的存在暗示 Magento 的布局渲染系统应该缓存此块。

所以,第一次渲染块时,结果会被缓存。下次渲染该块时,不是重新渲染,而是将结果从缓存中提取出来。

我的建议是创建一个自定义代码模块,编写一个新的块类来扩展旧的块类并重新定义_constructgetCacheKeyInfo 以使您“被允许”呈现多次阻止。

【讨论】:

  • 或者他可以在 toHtml() 之前添加一个额外的 setData('cache_tags', Mage_Catalog_Model_Product::CACHE_TAG . $cat->getId()) 调用。
  • 谢谢你 Alan - 我从 _construct 中删除了你上面显示的代码并创建了一个本地副本,这解决了我遇到的问题,所以你一针见血 :)
  • @Daniel - 我需要在 new.php 中的哪个位置添加该代码?
  • @user364934:就在您上面发布的代码中的 setBlockTitle 和 toHtml() 调用之间。
  • @Daniel Sloof - 我按照建议添加了代码,但导致错误:致命错误:/home/gp/public_html/app/code/core/Mage 中的字符串不支持 [] 运算符/Core/Block/Abstract.php 第 1144 行
【解决方案2】:

您不需要覆盖该块,您可以在渲染时通过在-&gt;toHtml() 之前添加-&gt;setCacheLifetime(NULL) 来禁用该块的缓存。如果包含块已经被缓存,那么缓存子块可能没有任何好处。

【讨论】:

  • Colin,我尝试在 ->toHtml() 之前添加 ->setCacheLifetime(NULL) 并删除了我的 app/code/local/catalog/product/block/new.php 但它导致了原始问题再次出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
相关资源
最近更新 更多