我已经尝试了各种教程,但我无法让它发挥作用。
基本上,我想在我的主页上有一个不同的页脚。我设置了两个页面布局并将它们很好地应用于 cms 页面。
所以在主页布局中我指的是...
<?php echo $this->getChildHtml('footer_home') ?>
在所有其他页面上这个...
<?php echo $this->getChildHtml('footer_alt') ?>
很简单! 然后在页面 xml 中,我修改了引用页脚的部分如下...
<block type="page/html_footer" name="footer_alt" as="footer_alt" template="page/html/footer_alt.phtml">
<block type="page/html_wrapper" name="bottom.container" as="bottomContainer" translate="label">
<label>Page Footer</label>
<action method="setElementClass"><value>bottom-container</value></action>
</block>
<block type="page/switch" name="store_switcher" as="store_switcher" template="page/switch/stores.phtml"/>
<block type="page/template_links" name="footer_links" as="footer_links" template="page/template/links.phtml"/>
</block>
<block type="page/html_footer" name="footer_home" as="footer_home" template="page/html/footer_home.phtml">
<block type="page/html_wrapper" name="bottom.container" as="bottomContainer" translate="label">
<label>Page Footer2</label>
<action method="setElementClass"><value>bottom-container</value></action>
</block>
<block type="page/switch" name="store_switcher" as="store_switcher" template="page/switch/stores.phtml"/>
<block type="page/template_links" name="footer_links" as="footer_links" template="page/template/links.phtml"/>
</block>
我想这就是问题所在。以上所有页面都显示“footer_alt”页脚,我不确定为什么。
我可以确认“page/html/footer_alt.phtml”和“page/html/footer_home.phtml”设置正常。
我希望这是有道理的。谢谢。
最佳答案
所有这些答案对于简单的解决方案来说都方式太复杂了。重写是矫枉过正。重写 Magento 核心,即使做得正确,也应该总是触发警报并立即迫使开发人员彻底阅读 Magento 源代码。根据我的经验,每一次 Magento 的心痛都伴随着一个神秘但完全令人满意的解决方案。这是令人心痛的解决方案之一。
毫不奇怪,Magento 武断地决定确保页脚模板不会生成唯一的缓存键。这意味着页脚不能根据加载的站点部分而有所不同;需要明确的是,它实际上可以,但仅如果 block 缓存被禁用。但是, block 缓存永远不应该被禁用,所以最终,这无异于限制在整个站点的单个页脚。
在网站的不同部分需要不同的页脚是合法的用例。例如,在结账时:结账应该是身临其境且不会分心的。然而,当网站上的任何页面被点击时,这些页面的页脚将被缓存,然后结帐将显示相同的页脚。
此处描述的解决方案要么需要核心重写,这并不好,要么需要一些其他条件检查,这将无法合理地扩展到超出一些条件。
我的解决方案很简单:在新模板中添加一个 cacheKey。定位给定页面的布局句柄,引用页脚,设置模板,然后添加 cacheKey。这只是标准的 Magento 布局 XML。此布局 XML 会更改单页结帐上的页脚——仅在单页结帐上。此外,缓存将继续适用于以这种方式定义的每个唯一页脚。
<checkout_onepage_index>
<reference name="footer">
<action method="setTemplate">
<template>linusmoneymaker/page/html/checkout-footer.phtml</template>
</action>
<action method="setCacheKey">
<key>your-own-unique-cache-key-for-linus-moneymaker</key>
</action>
</reference>
</checkout_onepage_index>
这样做的原因如下。这是 app/code/core/Mage/Core/Block/Abstract.php
的源代码,它处理所有的 block 缓存:
/**
* Get Key for caching block content
*
* @return string
*/
public function getCacheKey()
{
if ($this->hasData('cache_key')) {
return $this->getData('cache_key');
}
/**
* don't prevent recalculation by saving generated cache key
* because of ability to render single block instance with different data
*/
$key = $this->getCacheKeyInfo();
//ksort($key); // ignore order
$key = array_values($key); // ignore array keys
$key = implode('|', $key);
$key = sha1($key);
return $key;
}
请注意,如果定义了 cacheKey
,则该缓存键将优先于 app/code/core 中的
,它不会生成每个模板唯一的 getCacheKeyInfo
方法生成的缓存键/Mage/Page/Block/Html/Footer.phpcacheKey
。通过从布局 XML 中提供 cacheKey
,Magento 有效地放弃了默认的、非唯一的页脚 cacheKey
,转而使用通过布局 XML 为给定部分手动提供的页脚网站。
这不仅是正确的方法,而且可以无限扩展。网站上的每个页面都可以实际定义自己的页脚。
关于php - Magento:为不同的页面布局使用不同的页脚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18945275/