Search code examples
magentocachinghole-punching

Hole Punching in Magento not Working


I tried this for catalog/product_price block, but I'm getting:

Fatal error: Call to a member function getCacheIdTags() on a non-object in /var/www/html/app/code/core/Mage/Catalog/Block/Product/Price.php on line 176

Any ideas?

<?xml version="1.0" encoding="UTF-8"?>
<config>
 <placeholders>
  <catalog_product_price>
    <block>catalog/product_price</block>
    <placeholder>TEST_CACHE</placeholder>
    <container>Test_PageCache_Model_Container_Cache</container>
    <cache_lifetime>0</cache_lifetime>
  </catalog_product_price>
 </placeholders>
</config>

And my Container

class Test_PageCache_Model_Container_Cache extends Enterprise_PageCache_Model_Container_Abstract{

   protected function _getCacheId()
   {
       return 'TEST_CACHE' . md5($this->_placeholder->getAttribute('cache_id'));
   }

   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; }}

I have FPC enabled to check this, but when I refresh the page where the block is, I'm getting the aftermentioned error.

Thanks


Solution

  • Solved it by doing this:

    public function getCacheKeyInfo() {
        $data = parent::getCacheKeyInfo();
    
        if(Mage::registry('current_product'))
        {
            **$data['product'] = Mage::registry('current_product')->getId();** //can be a product id, etc.
        }
        return $data;
    }
    

    Then in my cache container:

     protected function _renderBlock()
    {
        try
        {
            $blockClass = $this->_placeholder->getAttribute('block');
            $template = $this->_placeholder->getAttribute('template');
    
    
            $block = new $blockClass;
            $block->setTemplate($template);
            **$block->setProductId($this->_placeholder->getAttribute('product'));**
    
            return $block->toHtml();
        }
        catch(Exception $ex)
        {
            Mage::log($ex->getMessage(), null, "system2.log");
        }
    }