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

南笙酒味 提交于 2019-12-04 07:26:40

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.

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.

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.

snh_nl

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;

really the best way is to:

1 Update your layout XML (local.xml or theme custom.xml)

<!--  CUSTOM: ADD NEW FOOTER BLOCK AT BOTTOM FOR PARTNERS -->
<cms_index_index>
    <reference name="footer">
    <block type="cms/block" name="footer_block_extra">
        <action method="setBlockId"><block_id>footer_block_extra</block_id></action>
    </block>
    </reference>
</cms_index_index>

and step 2 add this code where you want the block in your template phtml (often /page/html/footer.phtml)

<!-- SNH CUSTOM -->
<div class="grid_12">
    <?php echo $this->getBlockHtml('footer_block_extra'); ?>
</div>

and step 3 create a new CMS block in your backend with the ID "footer_block_extra" ... and add your content.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!