Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detect home page in Magento .phtml that will work with BLOCK_HTML cache enabled

I have tried the following two methods in catalog/navigation/vert_nav.phtml to add or suppress content specific to the home page:

if($this->getUrl('') == $this->getUrl('*/*/*', array('_current'=>true, '_use_rewrite'=>true))):

or

if(
Mage::getSingleton('cms/page')->getIdentifier() == 'home'  &&
Mage::app()->getFrontController()->getRequest()->getRouteName() == 'cms' 
) :

Both work fine, however when BLOCK_HTML cache is turned on, it works at first, then after a while the home page starts displaying content that is intended only for other pages (after an else clause I use lower down). When I turn off the BLOCK_HTML, it behaves as expected.

Interestingly I've used the same code (the 1st one) in page/html/head.phtml (for home page specific javascript/css), and in page/html/header.phtml (for a header banner that should only appear on the home page), and these work fine even when BLOCK_HTML is ON.

(Magento 1.4.1.1)

like image 490
rwired Avatar asked Sep 13 '12 09:09

rwired


2 Answers

The above answer is the best solution.

You could simply copy app/code/core/Mage/Catalog/Block/Nagivation.php

to:

app/code/local/Mage/Catalog/Block/Nagivation.php

and then change the getCacheKeyInfo() method as described above.

/**
 * Get Key pieces for caching block content
 *
 * @return array
 */
public function getCacheKeyInfo()
{
    $shortCacheId = array(
        'CATALOG_NAVIGATION',
        Mage::app()->getStore()->getId(),
        Mage::getDesign()->getPackageName(),
        Mage::getDesign()->getTheme('template'),
        Mage::getSingleton('customer/session')->getCustomerGroupId(),
        'template' => $this->getTemplate(),
        'name' => $this->getNameInLayout(),
        $this->getCurrenCategoryKey(),
        // Your logic to make home/none home have different cache keys
        Mage::getSingleton('cms/page')->getIdentifier() == 'home' ? '1' : '0'
    );
    $cacheId = $shortCacheId;

    $shortCacheId = array_values($shortCacheId);
    $shortCacheId = implode('|', $shortCacheId);
    $shortCacheId = md5($shortCacheId);

    $cacheId['category_path'] = $this->getCurrenCategoryKey();
    $cacheId['short_cache_id'] = $shortCacheId;

    return $cacheId;
}

This will make the cache key different for homepage / none-homepage pages, which will cache two copies, rather than caching a single template copy for use on all pages.

like image 62
Andrew Avatar answered Sep 27 '22 21:09

Andrew


Here are sources you'd want to read about Block Html cache:

  1. magento forum
  2. some blog
  3. inchoo blog

It would be better for performance to not disable the block completely, but rather specify the cache key in a smart way. So here's what you should do:

  1. First - specify a custom block for your .phtml file. If you don't know what Block is, or how to assign a block to a template file, here's the reference to Alan Storm blog.
  2. Second - you will have to add next code to a Block constructor:

    $this->addData(array(
        'cache_lifetime' => 3600,
        'cache_tags'     => array(Mage_Cms_Model_Block::CACHE_TAG),
        'cache_key'      => $this->getCacheKey(),
    ));
    

    As you see, I used here the getCacheKey method from the abstract class Mage_Core_Block_Abstract.

  3. Now you need to make sure the cache_key works for your logic. The Mage_Core_Block_Abstract::getCacheKey uses other method, which should actually specify the unique values for our block - getCacheKeyInfo. You need to redefine it using your logic:

    public function getCacheKeyInfo()
    {
        $isHomepage = 0;
        if (Mage::getSingleton('cms/page')->getIdentifier() == 'home') {
            $isHomepage = 1;
        }
        return array(
            $this->getNameInLayout(),
            $isHomepage,
        );
    }
    

    Now you can be sure that cache key for Home Page will differ from cache key to all other your pages, and your cache will return valid info.

like image 27
Slayer Birden Avatar answered Sep 27 '22 21:09

Slayer Birden