Detect home page in Magento .phtml that will work with BLOCK_HTML cache enabled
Solution 1
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.
Solution 2
Here are sources you'd want to read about Block Html cache:
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:
- 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.
-
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 classMage_Core_Block_Abstract
. -
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.
Solution 3
We use
<!-- SNH CUSTOM -->
$route = Mage::app()->getFrontController()->getRequest()->getRouteName();
$action = Mage::app()->getFrontController()->getRequest()->getActionName();
if($route == 'cms' && $action == 'index'):
<div class="grid_12">
echo $this->getChildHtml('shopper_footer_partners');
</div>
endif;
Solution 4
Just to add to these answers suggesting to check if current page identifier equals to "home".
It would be definitely safer to compare it with Mage::getStoreConfig('web/default/cms_home_page')
instead.
rwired
Never underestimate the importance of ‘Time-To-Market’ when planning software development. Perfection is a state of being attainable only in ever-increasing approximations, and never in entirety; and so the pursuit of perfection is a road taken incrementally with working releases along the way.
Updated on June 15, 2022Comments
-
rwired almost 2 years
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)
-
Slayer Birden over 11 yearsgreat addition to my post, there's just a little typo in this line:
Mage::getSingleton('cms/page')->getIdentifier() == 'home' ? '1', '0'
- should beMage::getSingleton('cms/page')->getIdentifier() == 'home' ? '1': '0'
to work correctly -
rwired over 11 yearsExcellent answer, thanks. I ended up selecting Andrew's answer instead since this was a quick fix that worked with a template I hadn't originally authored.
-
Andrew over 11 yearsthanks for that, it was typed directly into the browser with no testing :)