如何在 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 页面 [所见即所得编辑器]