Какой самый простой способ создать дырокол для FPC статического блока (блок cms)?
Допустим, у меня есть статический блок, который вызывает внутри другой блок, поведение которого я хочу быть динамическим при каждой загрузке страницы.
источник
Какой самый простой способ создать дырокол для FPC статического блока (блок cms)?
Допустим, у меня есть статический блок, который вызывает внутри другой блок, поведение которого я хочу быть динамическим при каждой загрузке страницы.
Самый простой способ пробить блокировку CMS в модуле полного кэширования Magento Enterprise состоит из нескольких шагов:
Во-первых, давайте посмотрим на необходимую структуру каталогов:
BranchLabs/CacheBuster/
Block/Cms.php # We inherit almost all functions from the Mage CMS
block, only overriding the "getCacheKeyInfo" function.
We do this to set the CMS block ID for later use by
our placeholder model.
etc/cache.xml # Here we target our module's version of the CMS block
and set their cache lifetimes to 0.
Model/Placeholder.php # This module is responsible for freshly rendering our
CMS blocks every time they're requested.
Имея это в виду сверху вниз, вот как заполнить эти файлы.
Создайте свой собственный класс блоков, который расширяет встроенный блок Magento CMS. Вам также необходимо переопределить функцию "getCacheKeyInfo" следующим образом:
<?php
// BranchLabs/CacheBuster/Block/Cms.php
class BranchLabs_CacheBuster_Block_Cms extends Mage_Cms_Block_Block {
// Used to set the cache placeholder attribute definitions, required in
// the placeholder's "_renderBlock" function.
public function getCacheKeyInfo() {
return array('block_id' => $this->getBlockId());
}
}
Настройте модель заполнителя, которая отвечает за отрисовку нашего блока CMS без применения кеша.
<?php
// BranchLabs/CacheBuster/Model/Placeholder.php
class BranchLabs_CacheBuster_Model_Placeholder extends Enterprise_PageCache_Model_Container_Abstract {
public function applyWithoutApp(&$content)
{
return false;
}
protected function _getCacheId()
{
$id = 'CACHEBUSTER_HOLEPUNCH_' . microtime() . '_' . rand(0,99);
return $id;
}
/**
* CacheBuster doesn't cache data! Do nothing.
*/
protected function _saveCache($data, $id, $tags = array(), $lifetime = null)
{
return $this;
}
/**
* Render fresh block content.
*
* @return false|string
*/
protected function _renderBlock()
{
$block = $this->_placeholder->getAttribute('block');
$block = new $block;
// Get the block_id attribute we originally set in our CMS block's
// getCacheKeyInfo function.
$block_id = $this->_placeholder->getAttribute('block_id');
$block->setBlockId($block_id);
$block->setLayout(Mage::app()->getLayout());
return $block->toHtml();
}
}
Настройте cache.xml так, чтобы он предназначался для нашего вновь созданного блока CMS и отображался с использованием нашего вновь созданного заполнителя.
<!-- BranchLabs/CacheBuster/etc/cache.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<config>
<placeholders>
<arbitrary_unique_identifier>
<block>cachebuster/cms</block>
<placeholder>ARBITRARY_UNIQUE_IDENTIFIER</placeholder>
<container>BranchLabs_CacheBuster_Model_Placeholder</container>
<cache_lifetime>0</cache_lifetime>
</arbitrary_unique_identifier>
</placeholders>
</config>
В CMS замените типы блоков для блоков, которые вы пытаетесь визуализировать вне кэша, на наш недавно разработанный блок CMS-proof: {{block type="cachebuster/cms" block_id="cacheproof"}}
Проблема в том, что основная команда Magento забыла кешировать статические блоки, и то, что не кешируется отдельно, не может быть пробито.
Таким образом, решение состоит в том, чтобы сначала исправить кеширование .
источник
В самом деле, решение было бы изменить способ кеширования.
FPC Лести делает это правильно в моем сувенире, и это бесплатно. В нем отсутствует только поддержка нескольких веб-сайтов, но он идеально подходит для 1 веб-сайта, и вы сможете указать блоки, которые должны быть динамически перфорированы.
Я также попробовал FPC Amasty, вам придется заплатить за него, и это не идеальное решение для кэширования для CE, я думаю, но оно работает хорошо, вы можете указать кэширование блоков / страниц или обоих. Вы также можете установить степень сжатия кэшированных объектов и сохранить их в Db / Filesystem (медленно) или memcached.
Удачи тебе.
источник