PHP/Magento - foreach中的变量没有被正确更新


PHP/Magento - Variables within foreach not being updated properly

我在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()语句在每次新的迭代中都没有被更新。

我在这里做错了什么?

谢谢…

这里只是一个猜测,但是看起来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的布局渲染系统,这个块应该被缓存。

第一次渲染block的时候,结果会被缓存。下次渲染块时,不是重新渲染,而是将结果从缓存中取出。

我的建议是创建一个自定义代码模块,编写一个扩展旧块类的新块类,并以一种"允许"多次渲染块的方式重新定义_constructgetCacheKeyInfo

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