如何在 Magento 管理面板中添加新按钮到订单视图?

Posted

技术标签:

【中文标题】如何在 Magento 管理面板中添加新按钮到订单视图?【英文标题】:How to add new button to order view in Magento admin panel? 【发布时间】:2011-10-02 07:47:43 【问题描述】:

如何在“返回”和“编辑”附近的订单视图页面添加自定义按钮?

【问题讨论】:

【参考方案1】:

如果您想快速完成(即编辑核心文件),请打开 app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php 并添加如下内容:

    $this->_addButton('order_reorder', array(
        'label'     => Mage::helper('sales')->__('Print Labels'),
        'onclick'   => 'window.open(\'/printouts/' . $this->getOrder()->getRealOrderId() . '.pdf\')',
    ));

你可以把它放在这个块之前:

    if ($this->_isAllowedAction('emails') && !$order->isCanceled()) 
        $message = Mage::helper('sales')->__('Are you sure you want to send order email to customer?');
        $this->addButton('send_notification', array(
            'label'     => Mage::helper('sales')->__('Send Email'),
            'onclick'   => "confirmSetLocation('$message', '$this->getEmailUrl()')",
        ));
    

如果您选择接受,您的挑战是在本地创建一个替代核心文件的文件,并将其发布到此处!

【讨论】:

最坏的答案 - 在任何情况下都不要修改核心文件。绝不。简单。没有快速和肮脏 - 保持干净的编码!【参考方案2】:

config.xml:

<global>
    <blocks>
         <adminhtml>
            <rewrite>
                <sales_order_view>Namespace_Module_Block_Adminhtml_Sales_Order_View</sales_order_view>
            </rewrite>
        </adminhtml>
    </blocks>
 </global>

命名空间/模块/块/Adminhtml/Sales/Order/View.php:

class Namespace_Module_Block_Adminhtml_Sales_Order_View extends Mage_Adminhtml_Block_Sales_Order_View 
    public function  __construct() 

        parent::__construct();

        $this->_addButton('button_id', array(
            'label'     => Mage::helper('xxx')->__('Some action'),
            'onclick'   => 'jsfunction(this.id)',
            'class'     => 'go'
        ), 0, 100, 'header', 'header');
    

【讨论】:

'onclick' 方法的示例是 "confirmSetLocation('$message', '$this->getOkToShipUrl()')", 需要调用 parent::__construct();在您的自定义 __construct() 函数中,否则我会得到“无效的块类型”异常。 执行此操作时出现错误。 @james 你说的 parent::__construct 是什么意思? 刚刚得到它,对于其他任何人,我已将其添加为下面的答案 请使用观察者而不是对如此重要的核心类添加重写。使用此解决方案,您可能会在使用其他扩展时遇到问题,并且无需重写即可实现此目的!【参考方案3】:

参考上面关于 parent::__constructor 的 cmets,这对我有用:

class Name_Module_Block_Adminhtml_Sales_Order_View extends Mage_Adminhtml_Block_Sales_Order_View 

    public function  __construct() 
        $this->_addButton('testbutton', array(
            'label'     => Mage::helper('Sales')->__('Toms Button'),
            'onclick'   => 'jsfunction(this.id)',
            'class'     => 'go'
        ), 0, 100, 'header', 'header');

        parent::__construct();

    

【讨论】:

你应该做类似 $return = parent::__construct();在函数的开头,做你的事情,然后返回 $return;最后。 @GabrielQueirozSilva 构造函数没有返回值。这是一个正确的答案。 @MatthiasKleine ops,没有注意到它是一个构造函数。【参考方案4】:

无需核心黑客或重写,只需使用观察者将按钮添加到订单:

<adminhtml>
    <events>
        <adminhtml_widget_container_html_before>
            <observers>
                <your_module>
                    <class>your_module/observer</class>
                    <type>singleton</type>
                    <method>adminhtmlWidgetContainerHtmlBefore</method>
                </your_module>
            </observers>
        </adminhtml_widget_container_html_before>
    </events>
</adminhtml>

然后只需在观察者中检查块的类型是否与订单视图匹配:

public function adminhtmlWidgetContainerHtmlBefore($event)

    $block = $event->getBlock();

    if ($block instanceof Mage_Adminhtml_Block_Sales_Order_View) 
        $message = Mage::helper('your_module')->__('Are you sure you want to do this?');
        $block->addButton('do_something_crazy', array(
            'label'     => Mage::helper('your_module')->__('Export Order'),
            'onclick'   => "confirmSetLocation('$message', '$block->getUrl('*/yourmodule/crazy')')",
            'class'     => 'go'
        ));
    

区块的“getUrl”功能会自动将当前订单id附加到控制器调用中。

【讨论】:

没有类重写,没有改变核心文件 - 很棒的解决方案,我可以确认它至少在 1.8 中有效 这是一个更好的答案。像这样需要子类化来覆盖默认 Magento 类的答案会导致很多扩展冲突和升级不兼容问题。如果 Magento 有使用 Observer 的方法,通常就是方法。

以上是关于如何在 Magento 管理面板中添加新按钮到订单视图?的主要内容,如果未能解决你的问题,请参考以下文章

添加具有订单详细信息功能的自定义按钮 - Magento 2

Magento + Paypal - 订单状态停留在“付款审查”

将 jquery 添加到管理面板内的 Magento 页面 [所见即所得编辑器]

将“添加到购物车”按钮重定向到 Magento 中的不同自定义页面/在 Magento 的产品页面中添加新按钮

如何更改 Magento 订单状态默认流程?

订单未出现在管理面板 shopify 中,但已在 Paypal 中注册