6

我在 catalog/navigation/vert_nav.phtml 中尝试了以下两种方法来添加或抑制特定于主页的内容:

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

或者

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

两者都工作正常,但是当 BLOCK_HTML 缓存打开时,它首先工作,然后主页开始显示仅用于其他页面的内容(在我使用的 else 子句之后)。当我关闭 BLOCK_HTML 时,它的行为符合预期。

有趣的是,我在 page/html/head.phtml (用于主页特定的 javascript/css)和 page/html/header.phtml (用于应该只出现在主页),即使在 BLOCK_HTML 为 ON 时,这些也能正常工作。

(Magento 1.4.1.1)

4

5 回答 5

4

以下是您想要阅读的有关 Block Html 缓存的资源:

  1. magento 论坛
  2. 一些博客
  3. 印章博客

最好不要完全禁用块,而是以智能的方式指定缓存键。所以这是你应该做的:

  1. 首先 - 为您的 .phtml 文件指定一个自定义块。如果您不知道 Block 是什么,或者不知道如何将块分配给模板文件,参阅 Alan Storm 博客。
  2. 其次 - 您必须将下一个代码添加到 Block 构造函数:

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

    如您所见,我在这里使用getCacheKey了抽象类中的方法Mage_Core_Block_Abstract

  3. 现在您需要确保 cache_key 适用于您的逻辑。使用Mage_Core_Block_Abstract::getCacheKey其他方法,它实际上应该为我们的块指定唯一值 - getCacheKeyInfo。您需要使用您的逻辑重新定义它:

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

    现在您可以确定主页的缓存键与您所有其他页面的缓存键不同,并且您的缓存将返回有效信息。

于 2012-09-13T10:32:41.467 回答
4

上面的答案是最好的解决方案。

您可以简单地复制 app/code/core/Mage/Catalog/Block/Nagivation.php

到:

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

然后如上所述更改 getCacheKeyInfo() 方法。

/**
 * 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;
}

这将使主页/非主页页面的缓存键不同,它将缓存两个副本,而不是缓存单个模板副本以供所有页面使用。

于 2012-09-13T11:13:15.473 回答
2

我们用

<!-- 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;
于 2014-08-12T12:01:25.117 回答
2

只是为了添加这些答案,建议检查当前页面标识符是否等于“主页”。

与之相比肯定会更安全Mage::getStoreConfig('web/default/cms_home_page')

于 2015-05-26T17:19:53.943 回答
0

最好的方法是:

1 更新您的布局 XML(local.xml 或主题 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>

第 2 步将此代码添加到模板 phtml 中您想要的块(通常是 /page/html/footer.phtml)

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

第 3 步在您的后端创建一个新的 CMS 块,其 ID 为“footer_block_extra”...并添加您的内容。

于 2014-09-30T13:51:20.707 回答