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

Magento 在Adminhtml的布局句柄中设置模板,magento,layout,handle,adminhtml,Magento,Layout,Handle,Adminhtml,在我的Magento Webshop的后端,我想为System->Config的块设置一个模板。因此,我使用了Mage\u Adminhtml\u System\u ConfigController的布局句柄,我认为这是Adminhtml\u System\u config\u索引。问题是,什么也没发生。即使要删除块,也不会发生任何事情: <adminhtml_system_config_index> <reference name="left">

在我的Magento Webshop的后端,我想为System->Config的块设置一个模板。因此,我使用了
Mage\u Adminhtml\u System\u ConfigController
的布局句柄,我认为这是
Adminhtml\u System\u config\u索引。问题是,什么也没发生。即使要删除块,也不会发生任何事情:

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

myModule/template.phtml
或删除块:

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


我做错了什么?我甚至尝试了
system\u config\u index
作为布局句柄。

您在这里可能做错了三件事

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

许多常见的布局问题都来自您正在编辑的XML文件,而不是系统加载的XML文件。在站点中打开开发者模式,将
display\u errors
设置为
1
,然后故意在XML文件中引入格式不正确的错误并尝试加载页面

<!-- note the trailing greater than sign at the end -->
<adminhtml_system_config_index>
    ...
</adminhtml_system_config_index> >
转发意味着有一个内部重新补丁,但没有http重定向。这意味着你的实际处理是

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

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

通常,Magento的容器块(
left
content
right
等)是而不是模板块。相反,它们是包含多个模板块的容器块(
text/list
block)

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

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

第四个提示:是您试图修改的块,由布局XML添加

在不深入布局渲染(这会)的情况下,在布局生成其所有块之后添加了一些块。如果是这种情况,则块在布局XML文件中不可用

如果查看
editAction
方法,可以看到在调用
loadLayout
之后添加了选项卡块(查找
adminhtml/system\u config\u选项卡
)。这意味着它在布局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进行更改。我会在事件
controller\u action\u layout\u render\u before
controller\u action\u layou render\u before\u adminhtml\u system\u config\u edit
之前使用类似于

$block = Mage::getSingleton('core/layout')->getBlock('child1');
if($block)
{
    $block->setTemplate('foo.phtml');
}

更新:所以我调试了它。布局xml已正确加载。它被困在
Mage\u Core\u Model\u布局中
(企业版1.12.0.2)。如果我使用
left.child1
:如果(!empty($block))
将不成功,那么将不会调用
setTemplate
。如果我使用
left
,它会成功,但正如您所说的,您不能在“text/list”上设置模板。所以我想知道为什么
$block=$this->getBlock($parentName)为左
项。child1
返回false?我试图引用
页脚
,因为它是直接创建的。“为什么我不能用左手栏来做这件事?”tester更新了答案。看起来该块是在布局XML呈现后通过PHP添加的,这意味着它不能通过布局XML文件使用。最后一个问题是:如何将css文件添加到此
left.child1
?我尝试了
$block->addCss(“…”)
Mage::getSingleton('core/layout')->addCss('…'),但没有任何效果。更新:我找到了解决方案:addCss在
head
块上工作。
$block = Mage::getSingleton('core/layout')->getBlock('child1');
if($block)
{
    $block->setTemplate('foo.phtml');
}