Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hole punching Mage_Catalog_Block_Product_Price in Magento EE FPC

Tags:

magento

I'm having a heck of a time figuring out the code/parameters to hole-punch the Full Page Cache in magento for the Mage_Catalog_Block_Product_Price block. I can get the price to show the first time the page is loaded, but when the cache id is unique, it's not rendering the price properly (it does cache it correctly when it's supposed to be cached) . I know I need to send it parameters, such as product_id etc, but not clear about what (eg 'xx') needs to be sent from getCacheKeyInfo into the cache container for use in $this->_placeholder->getAttribute('xx'). And what needs to be prepared and sent from _renderView() to the price layout/view.

So far I have done the following successfully (they each output testing data)

  • Created the cache.xml in my module /etc folder
  • Created the cache container model and verified works (just need settings)
  • Rewrote/extended the Mage_Catalog_Block_Product_Price into my own model to add the getCacheKeyInfo()

So the problem is that I have tried many variations within the container model's _getCacheId() and _renderBlock() in combination with the getCacheKeyInfo(), like described above. But I am hitting a stumbling block. If anyone can lead me in the right direction, it would be greatly appreciated.

like image 880
Krlecarp Avatar asked Nov 04 '22 13:11

Krlecarp


1 Answers

I've been struggling with the Full Page Caching as well.
These are my findings and have been very helpful to me.

Please take a look at: app/code/core/Enterprise/PageCache/Model/Processor/Default.php Line 47

 /**
 * Check if request can be cached
 *
 * @param Zend_Controller_Request_Http $request
 * @return bool
 */
public function allowCache(Zend_Controller_Request_Http $request)
{
    foreach ($this->_noCacheGetParams as $param) {
        if (!is_null($request->getParam($param, null))) {
            return false;
        }
    }
    if (Mage::getSingleton('core/session')->getNoCacheFlag()) {
        return false;
    }
    return true;
}

Looking at this function there seem to be two ways of avoiding (disabling) the Full Page Cache:

GET Parameter:
You can use the parameters 'store' or 'from_store' prefixed with three underscores to avoid the cache. Example:

http://magentourl.com/catelog/category/view/id/123?___store

Mage::getUrl('catalog/category/view', array('id' => 123, 'query' => array('___store' => '')))

Session variable:
You could also avoid the Full Page caching by setting a (temporary) session variable:

Mage::getSingleton('core/session')->setNoCacheFlag(true)
like image 147
Chris Avatar answered Nov 08 '22 09:11

Chris