你在这里做错了三件事。
第一个提示:您正在编辑正确的 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的原因。布局选项卡始终显示当前句柄,我可以避免做出让我走错路的假设。
第三个提示:您是否混淆了left
左侧列命名的块?
通常,Magento 的容器块(left
、content
、right
等)不是模板块。相反,它们是包含text/list
多个模板块的容器块(准确地说是块)。
这是我使用 Commerce Bug 的另一个地方,特别是新的 Graphviz 功能。这将向您显示任何特定页面的块结构。在出厂默认系统中,您会在“系统配置”页面看到类似的内容
如您所见,左侧块没有模板,因此更改其模板将无效。您可能想要的块是left.child1
.
第四个提示:您尝试修改的块是否由布局 XML 添加。
无需深入了解布局渲染(这需要一本书),在布局生成所有块之后添加一些块。如果是这种情况,您的块在布局 XML 文件中将不可用。
如果查看editAction
方法,您可以看到在调用(查找)之后 添加了 tabs 块。这意味着它在布局 xml 文件中不可用。 loadLayout
adminhtml/system_config_tabs
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_action_layout_render_before
或controller_action_layout_render_before_adminhtml_system_config_edit
使用看起来像这样的 PHP 代码
$block = Mage::getSingleton('core/layout')->getBlock('child1');
if($block)
{
$block->setTemplate('foo.phtml');
}