动态插入Magento的布局xml

时间:2012-08-03 23:31:33

标签: magento

我是Magento的新手。我试图建立一个模块,在渲染之前动态地将代码xml插入到布局xml中 - 类似于CMS>页面的构建方式。

就像我们如何在页面的设计部分指定layout xml(admin> cms> page)一样,我想通过我的模块插入layout.xml。

基本上,我想

  • 有一个管理部分,我可以通过a输入布局代码 表格和存储在数据库中 - 我已经找到了这一部分
  • 让Magento将这些存储在数据库中的代码拉出来并在聚合和解释布局文件之前创建一个xml文件。 - 我无法建立这部分。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:5)

只是一点启发 您可以使用observer添加这些布局xml, 假设你想在生成xml之前添加那些布局xml

我们可以使用活动controller_action_layout_generate_xml_before

以下是示例代码(config.xml

<frontend>
    <events>
        <controller_action_layout_generate_xml_before>
            <observers>
                <add_new_layout>
                    <class>test/observer</class>
                    <method>addNewLayout</method>
                </add_new_layout>
            </observers>
        </controller_action_layout_generate_xml_before>
    </events>
</frontend>

这是Observer.php

public function addNewLayout($observer){
    $layout = $observer->getEvent()->getLayout();
    $update = $layout->getUpdate();

    //$action = $observer->getEvent()->getAction();
    //$fullActionName = $action->getFullActionName();
    //in case you're going to add some conditional (apply these new layout xml on these action or other things, you can modify it by yourself)

    //here is the pieces of layout xml you're going to load (you get it from database)
    $xml = "<reference name='root'><remove name='footer'></remove></reference>";
    $update->addUpdate($xml);

    return;
}

答案 1 :(得分:0)

另一个可能性是使用IEclipseContext - 事件和占位符(不存在)布局xml:

core_layout_update_updates_get_after

观察者中的PHP示例:

<frontend>
    <layout>
        <updates>
            <foobar>
                <file>foo/bar.xml</file>
            </foobar>
        </updates>
    </layout>
    <events>
        <core_layout_update_updates_get_after>
            <observers>
                <foobar>
                    <type>singleton</type>
                    <class>foobar/observer</class>
                    <method>coreLayoutUpdateUpdatesGetAfter</method>
                </foobar>
            </observers>
        </core_layout_update_updates_get_after>
    </events>
</frontend>