【问题标题】:Magento: Add content block at the end of the structual block "content"Magento:在结构块“内容”的末尾添加内容块
【发布时间】:2012-07-20 10:02:38
【问题描述】:

我正在尝试向 Magento 添加一个内容块,它应该在主要内容下方的每一侧都可见。我想用一个自定义扩展来存档它,所以我可以复制这个扩展,它可以在不触及核心设计文件的情况下工作。 我的扩展包括以下布局更新:

<default>
    <reference name="content">
        <block type="mymod/blockname" name="myblockname" after="-" template="mymod/block.phtml"/>
    </reference>
</default>

我的问题是,after="-" 属性不起作用。该块始终显示在内容块的顶部。似乎beforeafter 没有任何后果。 如果我将块移动到页脚,属性beforeafter 工作正常。

如何将我的块放置在块“内容”的底部

【问题讨论】:

  • 发生这种情况是因为您的扩展是在呈现内容块之前执行的。据我所知,这可以通过在模块引导 xml 中指定正确的依赖关系来解决。
  • 正确,只需在你的 app/etc/modules/YourCompany_YourModule.xml 中添加一个depends/Mage_Page 部分即可magentocommerce.com/wiki/5_-_modules_and_development/reference/…
  • 感谢您的 cmets。我尝试添加依赖项,但没有任何改变。我还尝试查看 CMS 页面并设置属性 after="cms.wrapper" 并且这有效! (当然只在 CMS 页面上)。我不明白为什么after="-" 在“内容”中不起作用。

标签: magento magento-1.7


【解决方案1】:

据我所知,问题在于您在“默认”布局句柄中指定了块,而“内容”块中的大部分内容是由稍后应用的其他布局句柄添加的。这就是为什么在您的 XML 注册文件中添加的依赖项(Fabian 提到)没有帮助。

请根据您的需要考虑这两个选项:

1。如果您真的想在所有前端页面上包含您的块

在您的 XML 布局文件(local.xml 或自定义文件)中,添加新的布局句柄

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">

    <!-- your other adjustments for default, category_product_view and so on go here -->

    <add_my_block>
        <reference name="content">
            <block type="mymod/blockname" name="myblockname" after="-" template="mymod/block.phtml"/>
        </reference>
    </add_my_block>
</layout>

现在您创建一个事件观察者,将您的布局句柄注入到您的布局中:

    <?php

    class YourCompany_YourExtension_Model_Observer
    {
        /**
         * Adds a block at the end of the content block.
         * 
         * Uses the event 'controller_action_layout_load_before'.
         * 
         * @param Varien_Event_Observer $observer
         * @return YourCompany_YourExtension_Model_Observer
         */
        public function addBlockAtEndOfMainContent(Varien_Event_Observer $observer)
        {
            $layout = $observer->getEvent()->getLayout()->getUpdate();
            $layout->addHandle('add_my_block');
            return $this;
        }
    }

然后您在您的 XML 扩展配置文件 (config.xml) 中注册事件观察者

<?xml version="1.0" encoding="UTF-8" ?>
<config>
    <modules>
        <YourCompany_YourExtension>
            <version>0.0.1</version>
        </YourCompany_YourExtension>
    </modules>

    <frontend>
        <events>
            <controller_action_layout_load_before>
                <observers>
                    <mymod_add_block_at_end_of_main_content>
                        <type>singleton</type>
                        <class>mymod/observer</class>
                        <method>addBlockAtEndOfMainContent</method>
                    </mymod_add_block_at_end_of_main_content>
                </observers>
            </controller_action_layout_load_before>
        </events>
        <!-- declaring your layout xml etc. -->
    </frontend>

    <global>
        <!-- declaring your block classes etc. -->
        <models>
            <mymod>
                <class>YourCompany_YourExtension_Model</class>
            </mymod>
        </models>
    </global>
</config>

现在您的块应该位于其他块的下方。我成功地测试了主页、客户登录页面和类别视图页面。如果您必须在几个页面上排除您的块,您可以检查您的事件观察器是否应该在该特定页面上排除该块。

2。如果您只想在某些页面上包含您的块

向您的 XML 布局文件添加布局句柄,就像我们之前所做的那样,但不是创建和注册事件观察者,只需 告诉您的 XML 布局文件使用自定义布局句柄 在某些领域:

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">

    <catalog_category_default>
        <update handle="add_my_block" />
    </catalog_category_default>

    <catalog_category_layered>
        <update handle="add_my_block" />
    </catalog_category_layered>

    <cms_page>
        <update handle="add_my_block" />
    </cms_page>

    <!-- and so on -->

    <add_my_block>
        <reference name="content">
            <block type="mymod/blockname" name="myblockname" after="-" template="mymod/block.phtml"/>
        </reference>
    </add_my_block>

</layout>

【讨论】:

  • 啊,明白了。很好的解释,谢谢马蒂亚斯!为我工作
  • 谢谢!我在core_block_abstract_to_html_after 事件上使用了一个观察者并检查了我想在上面插入的块,但是这种技术使得代码更好,并且通过布局 XML 具有透明度。
猜你喜欢
  • 2023-04-05
  • 2015-07-15
  • 2015-09-04
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多