Статичний блок пробивання отвору 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-стійкий блок: {{block type="cachebuster/cms" block_id="cacheproof"}}


Дякую, Грем, я спробую, і я повідомлю вам, як це пройшло.
LDusan

Чи це вирішило вашу проблему для вас @LDusan?
Грем

Ще не пробували, повідомляю вас :)
LDusan

Грем, я думаю, що це працює, єдиним недоліком є ​​те, що вам доведеться змінити існуючі класи cms-блоків, якщо ви хочете, щоб вони не були кешовані, але незалежно від того, що це гарне рішення. Спасибі.
LDusan

3

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

Тож рішення - спочатку виправити кешування .


1

Дійсно, рішенням було б змінити спосіб кешування.

FPC Lesti робить це правильно в моєму сувенірі, і це безкоштовно. У ньому відсутня лише підтримка декількох веб-сайтів, але це ідеально підходить для 1 веб-сайту, який ви зможете вказати блоки, які повинні бути динамічно пробиті отворами.

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

Бажаю тобі удачі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.