Respostas:
A maneira mais fácil que encontrei para perfurar blocos de CMS no módulo de cache de página inteira do Magento Enterprise tem algumas etapas:
Primeiro, vejamos a estrutura de diretórios necessária:
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.
Com esse entendimento de cima para baixo em mente, veja como preencher esses arquivos.
Crie sua própria classe de bloco que estende o bloco Magento CMS embutido. Você precisará substituir a função "getCacheKeyInfo" da seguinte forma:
<?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());
}
}
Configure o modelo de espaço reservado que é responsável por renderizar nosso bloco CMS sem aplicar o cache.
<?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();
}
}
Configure cache.xml para segmentar nosso bloco CMS recém-criado e renderizar usando nosso espaço reservado recém-criado.
<!-- 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>
No CMS, substitua os tipos de bloco pelos blocos que você está tentando renderizar fora do cache pelo nosso novo bloco à prova de CMS: {{block type="cachebuster/cms" block_id="cacheproof"}}
O problema é que a equipe principal do Magento esqueceu de armazenar em cache os blocos estáticos e o que não é armazenado em cache individualmente não pode ser perfurado.
Portanto, a solução é corrigir o cache primeiro .
De fato, a solução seria alterar a maneira como o cache é feito.
O FPC de Lesti está fazendo isso certo na minha lembrança, e é grátis. Falta apenas o suporte a vários sites, mas é perfeito para 1 site e você poderá especificar os blocos que devem ser dinamicamente perfurados.
Eu também tentei o FPC da Amasty, você terá que pagar por isso e não é a solução de cache perfeita para o CE, eu acho, mas está funcionando bem, você pode especificar o cache de blocos / páginas ou ambos. Você também pode definir a taxa de compactação dos objetos em cache e armazená-los no Db / Filesystem (lento) ou no memcached.
Te desejo boa sorte.