1

在我的 Magento Webshop 的后端,我想为 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作为布局句柄。

4

1 回答 1

3

你在这里做错了三件事。

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

许多常见的布局问题来自您正在编辑的 XML 文件,而不是系统加载的 XML 文件。在您的站点中打开开发人员模式,设置display_errors1,然后故意在您的 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的原因。布局选项卡始终显示当前句柄,我可以避免做出让我走错路的假设。

显示 Commerce Bug 句柄的布局表的图像

第三个提示:您是否混淆了left左侧列命名的块?

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

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

在此处输入图像描述

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

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

无需深入了解布局渲染(这需要一本书),在布局生成所有块之后添加一些块。如果是这种情况,您的块在布局 XML 文件中将不可用。

如果查看editAction方法,您可以看到在调用(查找)之后 添加了 tabs 块。这意味着它在布局 xml 文件中不可用。 loadLayoutadminhtml/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_beforecontroller_action_layout_render_before_adminhtml_system_config_edit使用看起来像这样的 PHP 代码

$block = Mage::getSingleton('core/layout')->getBlock('child1');
if($block)
{
    $block->setTemplate('foo.phtml');
}
于 2013-03-13T19:29:39.947 回答