Static block FPC hole punch

16

Apa cara termudah untuk membuat punch hole FPC untuk blok statis (blok cms)?

Katakanlah saya memiliki blok statis yang memanggil blok lain di dalamnya yang memiliki perilaku yang saya ingin menjadi dinamis pada setiap memuat halaman.

LDusan
sumber

Jawaban:

10

Cara termudah yang saya temukan untuk memasang blok CMS dalam modul Caching Halaman Penuh Magento Enterprise memiliki beberapa langkah:

Pertama, mari kita lihat struktur direktori yang diperlukan:

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.

Dengan pemahaman top-down itu, inilah cara mengisi file-file itu.

  1. Buat kelas blok Anda sendiri yang memperluas blok Magento CMS bawaan. Anda harus mengganti fungsi "getCacheKeyInfo" sebagai berikut juga:

    <?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. Siapkan model placeholder yang bertanggung jawab untuk mengeluarkan blok CMS kami tanpa menerapkan 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();
        }
    }
  3. Siapkan cache.xml untuk menargetkan blok CMS kami yang baru dibuat dan render menggunakan placeholder kami yang baru dibuat.

    <!-- 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. Di CMS, ganti jenis blok untuk blok yang Anda coba render di luar cache dengan blok bukti CMS kami yang baru dicetak: {{block type="cachebuster/cms" block_id="cacheproof"}}

Graham
sumber
Terima kasih Graham, saya akan mencobanya dan memberi tahu Anda bagaimana hasilnya.
LDusan
Apakah ini menyelesaikan masalah Anda untuk Anda @LDusan?
Graham
Belum mencobanya, saya akan beri tahu Anda :)
LDusan
Graham Saya pikir ini berfungsi, satu-satunya kelemahan adalah bahwa Anda harus mengubah kelas blok cms yang ada jika Anda ingin mereka tidak di-cache, tetapi terlepas dari itu solusi yang bagus. Terima kasih.
LDusan
3

Masalahnya adalah bahwa tim inti Magento lupa untuk men-cache blok statis dan apa yang tidak di-cache secara individual tidak dapat dilubangi.

Jadi solusinya adalah memperbaiki caching terlebih dahulu .

pengguna487772
sumber
1

Memang, solusinya adalah mengubah cara caching dilakukan.

FPC Lesti melakukan ini dengan benar di suvenir saya, dan gratis. Itu hanya tidak memiliki dukungan beberapa situs web, tetapi itu sempurna untuk 1 situs web dan Anda akan dapat menentukan blok yang harus secara dinamis dilubangi.

Saya juga mencoba FPC Amasty, Anda harus membayar untuk itu dan itu bukan solusi caching yang sempurna untuk CE, saya kira, tetapi ini bekerja dengan baik, Anda dapat menentukan caching blok / halaman atau keduanya. Anda juga dapat mengatur tingkat kompresi objek yang di-cache dan menyimpannya di Db / Filesystem (lambat) atau memcached.

Semoga beruntung.

Sorcy
sumber