在Adminhtml的布局句柄中设置模板

时间:2013-03-12 21:12:19

标签: magento layout handle adminhtml

在我的Magento网上商店的后端,我想为System-> Config的块设置模板。因此,我使用Mage_Adminhtml_System_ConfigController的布局句柄,我认为adminhtml_system_config_index。问题是,没有任何反应。即使想要删除块,也没有任何反应:

<adminhtml_system_config_index>
    <reference name="left">
        <action method="setTemplate">
            <template>myModule/template.phtml</template>
        </action>   
    </reference>
</adminhtml_system_config_index>

删除块:

<adminhtml_system_config_index>
    <remove name="left" />
</adminhtml_system_config_index>

我做错了什么?我甚至尝试system_config_index作为布局句柄。

1 个答案:

答案 0 :(得分:3)

你在这里做了三件坏事。

第一个提示:您是否正在编辑正确的XML文件?

许多常见的布局问题来自您正在编辑的XML文件,而不是系统加载的XML文件。在您的网站中启用开发人员模式,将display_errors设置为1,然后故意在XML文件中引入格式错误并尝试加载页面。

<!-- note the trailing greater than sign at the end -->
<adminhtml_system_config_index>
    ...
</adminhtml_system_config_index> >

如果页面加载时没有错误,那么您就不会加载您认为的XML文件。

第二个提示:您使用的是正确的布局句柄吗?

我不确定你是谁。尽管默认系统配置页面使用index操作,但此操作实际上会将页面转发到edit操作。

#File: app/code/core/Mage/Adminhtml/controllers/System/ConfigController.php
public function indexAction()
{
    $this->_forward('edit');
}

转发意味着有一个内部重新发送,但没有http重定向。这意味着你的实际句柄是

`adminhtml_system_config_edit`

这就是我使用(免责声明:构建并销售)Commerce Bug的原因。 “布局”选项卡始终显示当前句柄,我可以避免做出让我走错路的假设。

image of layout table showing Commerce Bug handles

第三提示:您是否将名为left的块与左侧列混淆了?

通常,Magento的容器块(leftcontentright等)是模板块。相反,它们是容器块(准确的text/list块),它们包含多个模板块。

这是我使用Commerce Bug的另一个地方,specifically the new Graphviz feature。这将显示任何特定页面的块结构。在出厂默认系统中,您会在“系统配置”页面中看到类似的内容

enter image description here

如您所见,左侧区块没有模板,因此更改其模板将无效。您可能需要的块是left.child1

第四个提示:您尝试修改的块是否由布局XML添加。

如果没有深入到布局渲染(take a book),那么在布局生成所有块之后,会添加一些块。如果是这种情况,您的块将无法在布局XML文件中使用。

如果您查看editAction方法,则可以看到在调用 loadLayout之后添加了标签块(查找adminhtml/system_config_tabs)。这意味着它在布局xml文件中不可用。

public function editAction()
{
    //...    

    //the `loadLayout` method call creates blocks based on layout XML files
    $this->loadLayout();

    $this->_setActiveMenu('system/config');
    $this->getLayout()->getBlock('menu')->setAdditionalCacheKeyInfo(array($current));

    $this->_addBreadcrumb(Mage::helper('adminhtml')->__('System'), Mage::helper('adminhtml')->__('System'),
        $this->getUrl('*/system'));

    //this line add the `child1` block to the layout. (child one is the 
    //name chosen since the block has no explicit name
    $this->getLayout()->getBlock('left')
        ->append($this->getLayout()->createBlock('adminhtml/system_config_tabs')->initTabs());

    //...

这意味着您无法从布局XML文件修改此块的模板。您需要使用侦听适当事件的自定义模块,然后通过PHP进行更改。我会尝试使用类似

的PHP代码来事件controller_action_layout_render_beforecontroller_action_layout_render_before_adminhtml_system_config_edit
$block = Mage::getSingleton('core/layout')->getBlock('child1');
if($block)
{
    $block->setTemplate('foo.phtml');
}