PHP / Magento - Переменные внутри foreach не обновляются должным образом - PullRequest
3 голосов
/ 17 августа 2011

У меня проблемы с циклом foreach в шаблоне magento:

$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 () не обновлялись при каждой новой итерации.

Что я здесь не так делаю?

Спасибо ...

Ответы [ 2 ]

7 голосов
/ 18 августа 2011

Здесь только предположение, но похоже, что блок catalog/product_new не предназначен для многократного использования по одному запросу. Если вы посмотрите на определение класса в Mage_Catalog_Block_Product_New, его псевдо-конструктор включает в себя следующее

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

Наличие свойств cache_lifetime и cache_tags - это подсказки системе рендеринга Layen в Magento, что этот блок должен быть кэширован.

Итак, при первом рендеринге блока результаты кэшируются. При следующем рендеринге блока вместо повторного рендеринга результаты извлекаются из кеша.

Мой совет здесь состоит в том, чтобы создать собственный модуль кода, написать новый класс блоков, который расширяет старый класс блоков и переопределяет либо _construct, либо getCacheKeyInfo таким образом, что вы «можете» отображать Блок несколько раз.

0 голосов
/ 01 сентября 2011

Вам не нужно переопределять блок, вы можете просто отключить кэширование для блока во время рендеринга, добавив ->setCacheLifetime(NULL) прямо перед ->toHtml().Если содержащий блок уже кэширован, то, вероятно, в любом случае нет смысла кэшировать дочерние блоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...