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

时间:2011-08-17 17:28:05

标签: php magento

我在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-&gt; getId(),$ cat-&gt; getName()和$ cat-&gt; getUrl()语句没有在每次新迭代时更新。

我在这里做错了什么?

...谢谢

2 个答案:

答案 0 :(得分: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。允许“多次渲染Block。

答案 1 :(得分:0)

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