当前位置: 动力学知识库 > 问答 > 编程问答 >

php - 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)

网友答案:

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.

网友答案:

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.

分享给朋友:
您可能感兴趣的文章:
随机阅读: