【问题标题】:Magento - Override adminhtml template fileMagento - 覆盖 adminhtml 模板文件
【发布时间】:2013-01-21 23:21:07
【问题描述】:

我已经阅读了几篇关于堆栈溢出的帖子

以及magento论坛上的几个主题

但是,这些帖子都没有尝试做我想做的事情

我想覆盖

app/design/adminhtml/default/default/template/widget/grid.phtml 

文件,因为此文件包含允许任何人从销售->订单视图导出的 html 的一部分。

注意:我们已在权限->角色视图中禁用此用户角色的所有导出选项

显示“导出到:”->“CSV/Excel XML”功能的代码包含在我上面列出的路径中。我想删除那块 html 并覆盖 Magento 包含的文件。

【问题讨论】:

  • 我会尝试添加一个 local.xml - 或者更好的是一个新的 layout.xml 到您的扩展并更改模板,并删除导出的东西。之后你需要实现一个观察者来监听 controller_action_predispatch_adminhtml_sales_order_export_excelcontroller_action_predispatch_adminhtml_sales_order_export_csv 如果 admin_user_group 是错误的,它会阻止这些操作
  • @FabianBlechschmidt 而不是编辑核心文件,最好的替代方法是更改​​ app/design/frontend/default/theme 而不是 app/design/frontend/default/default
  • @zus Benmarks 在接受的解决方案中描述的内容。定义一个管理主题,然后像前端主题一样使用它——复制文件并更改需要的内容。

标签: magento magento-1.7


【解决方案1】:

Adminhtml 使用与前端相同的主题回退,因此您只需在模块配置 XML 中为您的安装声明一个自定义模板主题:

<stores>
    <admin>
        <design>
            <theme>
                <template>custom</template>
            </theme>
        </design>
    </admin>
</stores>

然后您可以使用您喜欢的任何自定义创建 app/design/adminhtml/default/custom/template/widget/grid.phtml,该文件将优先使用默认/默认 adminhtml 主题。您的解决方案是在呈现导出控制的逻辑中添加 ACL 检查:

<?php if($this->getExportTypes() && {ACL LOGIC}}): ?>
    <td class="export a-right">
        <img src="<?php echo $this->getSkinUrl('images/icon_export.gif') ?>" alt="" class="v-middle"/>&nbsp; <?php echo $this->__('Export to:') ?>
        <select name="<?php echo $this->getId() ?>_export" id="<?php echo $this->getId() ?>_export" style="width:8em;">
        <?php foreach ($this->getExportTypes() as $_type): ?>
            <option value="<?php echo $_type->getUrl() ?>"><?php echo $_type->getLabel() ?></option>
        <?php endforeach; ?>
        </select>
        <?php echo $this->getExportButtonHtml() ?>
    </td>
<?php endif; ?>

虽然这个逻辑在块类中可能更合适地实现,但类重写系统不支持重写父类,让您重写每个子类。在这种情况下,遵守 DRY 胜过在模板中嵌入太多逻辑。此外,这种变化是显而易见的,易于维护。

理想情况下,核心团队应该在 Mage_Adminhtml_Block_Widget_Grid 类中实现此检查,或者至少为 _exportTypes 属性提供一个公共设置器,这将使该逻辑更易于实现。

【讨论】:

  • 是否可以将多个主题声明为备用树?
  • 如果您将核心 adminhtml 主题从“默认/默认”移动到“基本/默认”,那么您可以指定三个自定义主题。
  • @benmarks 而不是编辑核心文件,最好的替代方法是更改​​ app/design/frontend/default/theme 而不是 app/design/frontend/default/default
【解决方案2】:

重写块似乎是最简单的解决方案,但这更像是一个肮脏的黑客而不是一个干净的解决方案。应该非常小心地使用类重写,并且尽可能避免。否则你很快就会遇到冲突,而且更新 Magento 也很麻烦。

通常您可以通过自定义布局更新(即在您的 local.xml 中)更改模板,但在这种情况下,它是一个小部件,不是通过布局 XML 配置的。

所以,进入观察者:创建一个在其config.xml 中包含以下内容的模块

<adminhtml>
    <events>
        <adminhtml_block_html_before>
            <observers>
                <yourmodulename_observer>
                    <class>yourmodulename/observer</class>
                    <method>changeWidgetTemplate</method>
                </yourmodulename_observer>
            </observers>
        </adminhtml_block_html_before>
    </events>
</adminhtml>

如果您不了解上述任何内容,请阅读 Magento 事件和观察者。

现在您将需要观察者本身来实际更改模板,但仅限于这种块类型:

class Your_Modulename_Observer
{
    public function changeWidgetTemplate(Varien_Event_Observer $observer)
    {
        $block = $observer->getEvent()->getBlock();
        if ($block instanceof Mage_Adminhtml_Block_Widget_Grid) {
            // consider getting the template name from configuration
            $template = '...';
            $block->setTemplate($template);
        }
    }
}

【讨论】:

  • 在管理布局路径中使用 local.xml 这样做可能会更好。
  • @FabianBlechschmidt 如果您知道如何在 local.xml 中配置 widgets,请告诉我。这确实是一个更好的解决方案。
  • 不需要小部件。这可能有效: 但我认为这行不通,因为加载布局时,不会创建块。所以你是对的。模板需要在观察者中更改。
【解决方案3】:

Magento - 覆盖 adminhtml 模板文件 将以下代码添加到扩展名的 config.xml 文件(您创建)

   <stores>
    <admin>
        <design>
            <theme>
                <default>default</default>
                <template>rwd</template>
            </theme>
        </design>
    </admin>
</stores>

现在在 adminhtml/default/rwd 包下创建 rwd 文件夹。 并根据需要创建模板和布局文件。

就像我们想要覆盖订单评论 history.phtml 文件一样。

<root>\app\design\adminhtml\default\default\template\sales\order\view\history.phtml
<root>\app\design\adminhtml\default\rwd\template\sales\order\view\history.phtml

【讨论】:

    【解决方案4】:

    可以在这里找到模板定义

    class Mage_Adminhtml_Block_Widget_Grid extends Mage_Adminhtml_Block_Widget
    

    public function __construct($attributes=array())
    

    因此,如果您想从销售订单网格中删除导出 csv(如果您不知道如何使用http://www.magentocommerce.com/wiki/groups/174/changing_and_customizing_magento_code,请使用本指南)并将 __construct 更改为类似,您需要重写销售网格块

    public function __construct($attributes=array())
    {
        parent::__construct($attributes);
        $this->setTemplate('...'); //here is your template
    }
    

    【讨论】:

    • 这行不通。块重写不适用于父类。
    • 是的,fab建议的解决方案更好。但是这个例子会起作用,因为你直接重写 Mage_Adminhtml_Block_Widget_Grid,调用它的 __construct(第一次设置模板的地方),然后设置你的模板。
    • 您似乎误解了 Magento 中类重写的工作方式。 createBlock('group/name') 使用配置对象,但这只会自动加载重写的类定义,然后按名称 指定父类。自动加载器(在加载父类时完全负责)不以任何方式从配置 XML 评估类重写。用Mage_Adminhtml_Block_Widget_Grid 的子类做一个简单的测试,你就会明白我的意思了。
    • 是的,我知道它是如何工作的,这是我的错误。在这个问题中需要直接重写销售订单网格。我改变了答案。
    • @freento 而不是编辑核心文件,最好的替代方法是更改​​ app/design/frontend/default/theme 而不是 app/design/frontend/default/default
    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多