Я дырокол Magentos FPC. У меня есть блок, который загружает другие блоки (баннеры) в зависимости от параметров, установленных в сеансе пользователя. Код все работает и баннеры динамически загружаются, если я добавляю
$layout = Mage::getSingleton('core/layout');
$layout->getUpdate()->load('default');
$layout->generateXml()->generateBlocks();
в шаблон .phtml, но без него блоки загружаются только для начальной (не кэшированной) страницы. Второй и все исходящие (кэшированные) запросы не могут загрузить блоки, используя $ this-> getChildHtml или $ this-> getBlockHtml. Также, когда я загружаю основной макет, это нарушает обмен сообщениями и выглядит как хак.
Вот мое приложение / дизайн / внешний интерфейс / база / по умолчанию / макет / amsh_splitpay.xml
<layout>
<default>
<reference name='root'>
<block type="splitpay/banner" name="splitpay.banner" template="splitpay/banner.phtml">
<action method="unsetData"><key>cache_lifetime</key></action>
<action method="unsetData"><key>cache_tags</key></action>
<block type="zblocks/block" name="page_top_splitpay_zblock">
<action method="setPosition">
<position>page-top-splitpay</position>
</action>
</block>
<!-- Created custom zblock for page top -->
<block type="zblocks/block" name="page_top_zblock">
<action method="setPosition">
<position>page-top</position>
</action>
</block>
</block>
</reference>
</default>
</layout>
в phtml
<?php
$sp = Mage::getSingleton("customer/session")->getSplitpayOptions();
$block = $this->getBlockHtml('page_top_splitpay_zblock',false);
if(!empty($sp) && !empty($block)){?>
<div class="zblock container hide-for-small-only">
<div class="row">
<div class="large-12 columns">
<?php echo $block; ?>
</div>
</div>
</div>
<?php
} else {
if ($this->getBlockHtml('page_top_zblock',false)): ?>
<div class="zblock container hide-for-small-only">
<div class="row">
<div class="large-12 columns">
<?php echo $this->getBlockHtml('page_top_zblock',false);
?>
</div>
</div>
</div>
<?php endif;
}
?>
в модели / контейнер / Banner.php
<?php
class Amsh_SplitPay_Model_Container_Banner extends Enterprise_PageCache_Model_Container_Abstract
{
protected function _getCacheId()
{
$cacheId = $this->_placeholder->getAttribute('cache_id');
$cookieCustomer = $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER, '');
return 'AMSH_SPLITPAY_BANNER_CACHE_' . md5($cacheId) . '_' . $cookieCustomer;
}protected function _renderBlock()
{
$block = $this->_getPlaceHolderBlock();
// only needed if the block uses a template
$block->setTemplate($this->_placeholder->getAttribute('template'));
Mage::dispatchEvent('render_block', array(
'block' => $block,
'placeholder' => $this->_placeholder
));
return $block->toHtml();
}
protected function _saveCache($data, $id, $tags = array(), $lifetime = null)
{
return false;
}
public function applyWithoutApp(&$content)
{
return false;
}
}
Задача ещё не решена.
Других решений пока нет …