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


16

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

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

Ответы:


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


1

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

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

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

Удачи тебе.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.