Magento - 覆盖adminhtml模板文件

时间:2013-01-21 23:21:07

标签: magento magento-1.7

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

和magento论坛上的几个主题

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

我想覆盖

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

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

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

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

4 个答案:

答案 0 :(得分:24)

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属性提供了一个公共setter,这将使这个逻辑更加清晰。

答案 1 :(得分:5)

这似乎是重写块的最简单的解决方案,但这更像是一个肮脏的黑客,而不是一个干净的解决方案。应该非常小心地使用类重写,并且如果可能的话总是避免使用。否则你很快就会遇到冲突,并且更新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);
        }
    }
}

答案 2 :(得分:2)

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

Uncaught Error: The TextInput component wasn't called within a redux-form <Field>. Did you decorate it and forget to add the addField prop to your component?

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

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

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

答案 3 :(得分:1)

模板定义可以在这里找到

class Mage_Adminhtml_Block_Widget_Grid extends Mage_Adminhtml_Block_Widget

in

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
}