php - Magento:为不同的页面布局使用不同的页脚

标签 php magento

我已经尝试了各种教程,但我无法让它发挥作用。

基本上,我想在我的主页上有一个不同的页脚。我设置了两个页面布局并将它们很好地应用于 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.php,它不会生成每个模板唯一的 cacheKey。通过从布局 XML 中提供 cacheKey,Magento 有效地放弃了默认的、非唯一的页脚 cacheKey,转而使用通过布局 XML 为给定部分手动提供的页脚网站。

这不仅是正确的方法,而且可以无限扩展。网站上的每个页面都可以实际定义自己的页脚。

关于php - Magento:为不同的页面布局使用不同的页脚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18945275/

相关文章:

php - 加入几个 mp3 文件并使用 ffmpeg 输出为 mov 文件

是否使用PHP框架(Cake PHP)

php - PDO:参数号无效:参数未定义

php - 如何访问数组元素

php - 将整数 ID 转换为具有随机字符的字符串,反之亦然

android - Magento 客户使用 soap api 从 Android 登录

MySQL 表引擎未更新(或更新未反射(reflect))

php - Magento 不正确的 404 重定向

php - Ajax从magento中的购物车中删除产品

数据库中的 Magento 优惠券实体