2013-09-22 83 views
3

我已经尝试过各种教程,但是我无法得到它的工作。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'设置正确。

我希望这是有道理的。谢谢。

+0

你有没有试过把渲染调用包装到getChildHtml中,在某种特殊的独特的字符?像'### <?php echo $ this-> getChildHtml('footer_home')?> ###'?根据上面的信息,渲染'footer_html'的调用似乎不太可能渲染'footer_alt' - 您可能正在编辑错误的文件。 –

+0

我正在编辑的文件是主布局模板文件,page.xml文件以及后续的footer_alt.phtml和footer_home.phtml。 – user2689138

回答

3

你问题的原因应该是magentos块缓存。 像页脚缓存的缺省情况下,并 缓存键不包括tempalte

,以验证其缓存的问题试试这个第一头:如果启用了块高速缓存

检查。 然后导航到您的页面。第一页上的页脚应该位于以下任何位置。 因此,如果您的首页视图是您的页脚,它将位于任何其他页面上,反之亦然。

如果问题是,你应该能够通过改写“Mage_Page_Block_Html_Footer”来解决这个 和 修改getCacheKeyInfo缓存(),包括这样的

public function getCacheKeyInfo() 
{ 
    return array(
     'PAGE_FOOTER', 
     Mage::app()->getStore()->getId(), 
     (int)Mage::app()->getStore()->isCurrentlySecure(), 
     Mage::getDesign()->getPackageName(), 
     Mage::getDesign()->getTheme('template'), 
     Mage::getSingleton('customer/session')->isLoggedIn(), 
     $this->getTemplate() 
    ); 
} 

模板这应该解决您的问题

+0

如何知道块缓存是否已启用?我在哪里可以找到Mage_Page_Block_Html_Footer文件?谢谢。 – user2689138

+0

您可以通过转到您的magento后端来检查块缓存是否启用,并检查它是否在系统 - >缓存管理中,如果块缓存处于活动状态,您应该找到一个名为“块HTML输出”的行。 “Mage_Page_Block_Html_Footer”类可以在下面找到: “app/code/core/Mage \ Page/Block/Html/Footer.php” –

0
  1. 创建2个名为“home_page_footer”和“inner_page_footer”的静态块。
  2. 打开footer.phtml并放置以下代码。

    <?php $home = Mage::getSingleton('cms/page')->getIdentifier(); ?> 
    <?php if ($home):?>  
    <div style="clear:both;"> 
        <?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('home_page_footer')->toHtml(); ?> 
    </div> 
    <?php else: ?>  
    <div style="clear:both;"> 
        <?php echo $this->getLayout()->createBlock('cms/block')->setBlockId('inner_page_footer')->toHtml(); ?> 
    </div> 
    <?php endif; ?>  
    

希望这将有助于。

+0

尽管这看起来像是最简单的解决方案,但我无法使其工作。所有页面显示home_page_footer。我已清除缓存和索引。 – user2689138

+0

请重新检查,Magento版本:1.7.0.2。它适用于我。 – Noor

+0

我需要更改吗?我的主页应该有什么cms /页面? URL密钥? <?php $ home = Mage :: getSingleton('cms/page') - > getIdentifier(); ?> – user2689138

5

所有这些答案都是方式对于直接的解决方案来说太复杂了。重写是过度的。重写Magento核心,即使正确完成,应该总是引发警报,并立即强迫开发人员彻底阅读Magento源代码。根据我的经验,每一个Magento心痛伴随着一个神秘的,但完全可喜的解决方案。这是令人满意的解决方案之一。

Magento随意决定确保页脚模板不生成唯一的缓存键值就不足为奇了。这意味着根据加载的网站部分,页脚不能有所不同;要清楚,它实际上可以,但如果块缓存被禁用,则只有。尽管如此,块缓存不应该被禁用,所以最终,这无异于被限制在整个站点上的单个页脚。

在网站的不同部分有不同的页脚需要合法用例。例如,在结帐时:结账应该是沉浸式的,无分心的。但是,当网站上的任何页面被点击时,这些页面的页脚将被缓存,然后结账将显示相同的页脚。

这里描述的解决方案需要核心重写,这是不好的,或其他一些条件检查,这将不合理地超过几个条件缩放。

我的解决方案很简单:将cacheKey添加到新模板中。定位给定页面的布局句柄,引用页脚,设置模板,然后添加cacheKey。这只是标准的Magento布局XML。此布局XML更改了onepage checkout上的页脚 - 并且只有才能在onepage结帐中使用。此外,缓存将继续适用于以这种方式定义的每个独特页脚。

<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,它处理所有的块缓存:

/** 
* 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被定义,其中一个将优先于将从getCacheKeyInfo方法app/code/core/Mage/Page/Block/Html/Footer.php生成一个,它不不产生每个模板独特的cacheKey。通过提供来自布局XML的cacheKey,Magento有效地放弃了默认的,非唯一的页脚cacheKey,而支持通过网站的给定部分的布局XML手动提供的页脚。

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

相关问题