Trying get dynamic content hole-punched through Magento's Full Page Cache

10,813

The <name> in the cache.xml must match your blocks full name in the layout, not the alias, e.g. <name>product.info.example</name>

Also, _getIdentifier() isn't implemented on Enterprise_PageCache_Model_Container_Abstract, just remove it from the string returned by your _getCacheId(). If you need to add some variants, implement _getIdentifier() to return a session id or whatever you need.

Share:
10,813
rlflow
Author by

rlflow

Updated on July 04, 2022

Comments

  • rlflow
    rlflow almost 2 years

    I am using Magento Enterprise 1.10.1.1 and need to get some dynamic content on our product pages. I am inserting the current time in a block to quickly see if it is working, but can't seem to get through full page cache.

    I have tried a variety of implementations found here:

    http://tweetorials.tumblr.com/post/10160075026/ee-full-page-cache-hole-punching http://oggettoweb.com/blog/customizations-compatible-magento-full-page-cache/ http://magentophp.blogspot.com/2011/02/magento-enterprise-full-page-caching.html

    Any solutions, thoughts, comments, advice is welcome.

    here is my code:

    app/code/local/Fido/Example/etc/config.xml

    <?xml version="1.0"?>
    <config>
        <modules>
            <Fido_Example>
                <version>0.1.0</version>
            </Fido_Example>
        </modules>
        <global>
            <blocks>
                <fido_example>
                    <class>Fido_Example_Block</class>
                </fido_example>     
            </blocks>
        </global>
    </config>
    

    app/code/local/Fido/Example/etc/cache.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <config>
        <placeholders>
            <fido_example>
                <block>fido_example/view</block>
                <name>example</name>
                <placeholder>CACHE_TEST</placeholder>
                <container>Fido_Example_Model_Container_Cachetest</container>
                <cache_lifetime>86400</cache_lifetime>
            </fido_example>
        </placeholders>
    </config>
    

    app/code/local/Fido/Example/Block/View.php

    <?php
    
    class Fido_Example_Block_View extends Mage_Core_Block_Template
    {
        private $message;
        private $att;
    
        protected function createMessage($msg) {
            $this->message = $msg;
        }
    
        public function receiveMessage() {
            if($this->message != '') {
                return $this->message;
            } 
            else {
                $this->createMessage('Hello World');
                return $this->message;
            }
        }
    
        protected function _toHtml() {
            $html = parent::_toHtml();
    
            if($this->att = $this->getMyCustom() && $this->getMyCustom() != '') {
                $html .= '<br />'.$this->att;
            } 
            else {
    
            $now = date('m-d-Y h:i:s A');
            $html .= $now;
            $html .= '<br />' ;
            }
    
            return $html;
        }
    
    }
    

    app/code/local/Fido/Example/Model/Container/Cachetest.php

    <?php
    
    class Fido_Example_Model_Container_Cachetest extends Enterprise_PageCache_Model_Container_Abstract { 
    
        protected function _getCacheId()
        {
            return 'HOMEPAGE_PRODUCTS' . md5($this->_placeholder->getAttribute('cache_id') . $this->_getIdentifier());
        }
    
        protected function _renderBlock()
        {
            $blockClass = $this->_placeholder->getAttribute('block');
            $template = $this->_placeholder->getAttribute('template');
    
            $block = new $blockClass;
            $block->setTemplate($template);
            return $block->toHtml();
        }
    
    protected function _saveCache($data, $id, $tags = array(), $lifetime = null) { return false; }  
    
    }
    

    app/design/frontend/enterprise/[mytheme]/template/example/view.phtml

    <?php echo $this->receiveMessage() ?>
    

    snippet from app/design/frontend/enterprise/[mytheme]/layout/catalog.xml

    <reference name="content">
        <block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml">
                <block type="fido_example/view" name="product.info.example"  as="example" template="example/view.phtml" />