PHP/Magento - foreach循环中的变量未能正确更新

3
我在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个主要类别)。似乎在每个新迭代中,$cat->getId()、$cat->getName()和$cat->getUrl()语句没有被更新。

我做错了什么?

谢谢...


你是否已经对 $cats 进行了转储,以查看存储在其中的数据是否符合您的预期? - Jared
嗨Jrod - 是的,我有并且它是正确的。如果我回显$cat->getName(),我会得到正确的猫名...这个getLayout命令在某种程度上没有获取正确的数据。 - gpcola
2个回答

7
这只是一个猜测,但似乎 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())调用。 - Daniel Sloof
谢谢Alan - 我从_construct中删除了你上面展示的代码,并创建了一个本地副本,这解决了我遇到的问题,所以你说得对 :) - gpcola
@Daniel - 在 new.php 文件中具体需要在哪里添加那段代码? - gpcola
你发的代码中,在 setBlockTitle 和 toHtml() 调用之间。 - Daniel Sloof
@Daniel Sloof - 我按照建议添加了代码,但结果出现错误:Fatal error: [] operator not supported for strings in /home/gp/public_html/app/code/core/Mage/Core/Block/Abstract.php on line 1144 - gpcola
@Daniel Shoof:创建一个唯一的缓存标签会解决这个问题吗?我理解标签是用于识别清除脚本中缓存信息的一部分,但需要保证缓存键是唯一的。 - Alana Storm

0

您无需覆盖块,只需在渲染时为块禁用缓存,方法是在->toHtml()之前添加->setCacheLifetime(NULL)。如果包含块已经被缓存,则缓存子块可能没有任何好处。


Colin,我尝试在->toHtml()之前添加->setCacheLifetime(NULL),并删除了我的app/code/local/catalog/product/block/new.php,但结果是原始问题重新出现。 - gpcola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接