Статический блок FPC дырокол

16

Какой самый простой способ создать дырокол для FPC статического блока (блок cms)?

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

LDusan
источник

Ответы:

10

Самый простой способ пробить блокировку 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.

Имея это в виду сверху вниз, вот как заполнить эти файлы.

  1. Создайте свой собственный класс блоков, который расширяет встроенный блок 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());
        }
    
    }
  2. Настройте модель заполнителя, которая отвечает за отрисовку нашего блока 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();
        }
    }
  3. Настройте 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>
  4. В CMS замените типы блоков для блоков, которые вы пытаетесь визуализировать вне кэша, на наш недавно разработанный блок CMS-proof: {{block type="cachebuster/cms" block_id="cacheproof"}}

Грэхем
источник
Спасибо, Грэм, я попробую и дам тебе знать, как все прошло.
LDusan
Это решило вашу проблему для вас @LDusan?
Грэм
Еще не пробовал, дам вам знать :)
LDusan
Грэм, я думаю, что это работает, единственный недостаток в том, что вам придется изменить существующие классы блоков cms, если вы хотите, чтобы они не кэшировались, но, тем не менее, это хорошее решение. Благодарю.
LDusan
3

Проблема в том, что основная команда Magento забыла кешировать статические блоки, и то, что не кешируется отдельно, не может быть пробито.

Таким образом, решение состоит в том, чтобы сначала исправить кеширование .

user487772
источник
1

В самом деле, решение было бы изменить способ кеширования.

FPC Лести делает это правильно в моем сувенире, и это бесплатно. В нем отсутствует только поддержка нескольких веб-сайтов, но он идеально подходит для 1 веб-сайта, и вы сможете указать блоки, которые должны быть динамически перфорированы.

Я также попробовал FPC Amasty, вам придется заплатить за него, и это не идеальное решение для кэширования для CE, я думаю, но оно работает хорошо, вы можете указать кэширование блоков / страниц или обоих. Вы также можете установить степень сжатия кэшированных объектов и сохранить их в Db / Filesystem (медленно) или memcached.

Удачи тебе.

Sorcy
источник