12

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

和magento论坛上的几个线程

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

我想覆盖

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

文件,因为该文件包含 html 的一部分,允许任何人从 sales->order 视图导出。

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

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

4

4 回答 4

25

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属性提供一个公共设置器,这会使这个逻辑更容易实现。

于 2013-01-22T13:47:34.440 回答
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);
        }
    }
}
于 2013-01-22T00:04:17.103 回答
2

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
于 2017-11-03T13:43:28.863 回答
1

模板定义可以在这里找到

class Mage_Adminhtml_Block_Widget_Grid extends Mage_Adminhtml_Block_Widget

public function __construct($attributes=array())

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

public function __construct($attributes=array())
{
    parent::__construct($attributes);
    $this->setTemplate('...'); //here is your template
}
于 2013-01-21T23:29:28.690 回答