Magento 如何使用事件观察者防止订单被取消?
我正在使用以下代码防止从Magento管理面板取消订单Magento 如何使用事件观察者防止订单被取消?,magento,magento-1.7,magento-1.9,magento-1.8,Magento,Magento 1.7,Magento 1.9,Magento 1.8,我正在使用以下代码防止从Magento管理面板取消订单 <?xml version="1.0"?> <config> <modules> <Muk_OrderCancel> <version>1.0.0</version> </Muk_OrderCancel> </modules> <global>
<?xml version="1.0"?>
<config>
<modules>
<Muk_OrderCancel>
<version>1.0.0</version>
</Muk_OrderCancel>
</modules>
<global>
<models>
<ordercancel>
<class>Muk_OrderCancel_Model</class>
</ordercancel>
</models>
<events>
<sales_order_save_before>
<observers>
<ordercancel>
<type>singleton</type>
<class>Muk_OrderCancel_Model_Observer</class>
<method>canCancelOrder</method>
</ordercancel>
</observers>
</sales_order_save_before>
</events>
<helpers>
<ordercancel>
<class>Muk_OrderCancel_Model_Helper</class>
</ordercancel>
</helpers>
</global>
</config>
1.0.0
Muk_订单取消_模型
独生子女
Muk_订单取消模式观察员
癌症领主
Muk\U订单取消\U模型\U助手
在observer中,我使用以下代码:
<?php
class Muk_OrderCancel_Model_Observer
{
public function canCancelOrder( Varien_Event_Observer $observer )
{
$incrementId = $observer->getEvent()->getOrder()->getData('increment_id');
$order = Mage::getModel('sales/order')->loadByIncrementId($incrementId);
$adminUserSession = Mage::getSingleton('admin/session');
$adminUserId = $adminUserSession->getUser()->getUserId();
$adminUserName = $adminUserSession->getUser()->getUsername();
$adminRoleName = Mage::getModel('admin/user')->load($adminUserId)
->getRole()->getData('role_name');
if($adminRoleName) { //some condition
$order->setActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_CANCEL, false);
}
}
}
在“Mage\u Adminhtml\u Sales\u OrderController”的“取消操作”中:
这意味着订单首先被取消,然后你的观察者开火。虽然我发现这件事:
Mage::dispatchEvent('sales_order_payment_cancel', array('payment' => $this));
在之前激发的“Mage\u Sales\u Model\u Order\u Payment”中:“Mage\u Sales\u Model\u Order”:“registerCancellation”方法
在触发此事件的观察者方法中,可以执行以下操作:
if ($adminRoleName) {
$payment = $observer->getEvent()->getPayment();
$order = $payment->getOrder();
$order->setActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_CANCEL, false);
//Get the existing non cancelled orders if they exist, if not create the array and add it to the admin session.
$orderIds = Mage::getSingleton('adminhtml/session')->getNonCancelledOrders();
if (!$orderIds) {
$orderIds = array($order->getId());
} else {
$orderIds[] = $order->getId();
}
Mage::getSingleton('adminhtml/session')->setNonCancelledOrders($orderIds);
}
接下来,在以下事件的etc/config.xml文件中再添加一个观察者:“controller\u action\u predispatch”:
你清除了缓存吗?@MarkoNovakovic我已经清除了缓存,控件将转到观察者中的方法,但订单仍然被取消。但是如果我尝试从订单网格页面取消订单,它将显示异常页面。我如何防止它发生?抱歉,这是因为最后的Mage::ThroweException,我添加它是为了防止向用户发送订单已取消的成功消息,而不是显示警告。您可以从代码中删除该行,但必须找到一种方法来显示正确的警告或成功消息。我将编辑我的答案。我将尝试,如果您找到任何解决方案,请更新答案。
if ($adminRoleName) {
$payment = $observer->getEvent()->getPayment();
$order = $payment->getOrder();
$order->setActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_CANCEL, false);
//Get the existing non cancelled orders if they exist, if not create the array and add it to the admin session.
$orderIds = Mage::getSingleton('adminhtml/session')->getNonCancelledOrders();
if (!$orderIds) {
$orderIds = array($order->getId());
} else {
$orderIds[] = $order->getId();
}
Mage::getSingleton('adminhtml/session')->setNonCancelledOrders($orderIds);
}
<controller_action_predispatch>
<observers>
<check_session_message>
<type>singleton</type>
<class>Muk_OrderCancel_Model_Observer</class>
<method>checkSessionMessage</method>
</check_session_message>
</observers>
</controller_action_predispatch>
public function checkSessionMessage($observer)
{
//Check if we have admin order view or grid action
$request = Mage::app()->getRequest();
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
if ($module == 'admin' && $controller == 'sales_order') {
if ($action == 'view' || $action == 'index') {
//Check if we have orderIds
$orderIds = Mage::getSingleton('adminhtml/session')->getNonCancelledOrders();
if ($orderIds && count($orderIds) > 0) {
//Unset them from the session
Mage::getSingleton('adminhtml/session')->unsNonCancelledOrders();
//Clear success message
Mage::getSingleton('adminhtml/session')->getMessages(true);
//Add error message
Mage::getSingleton('adminhtml/session')->addError('You are not allowed to cancel the order(s)');
}
}
}
}