Magento 在Adminhtml的布局句柄中设置模板
在我的Magento Webshop的后端,我想为System->Config的块设置一个模板。因此,我使用了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">
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)$parentName的code>为左项。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');
}