2015-09-25 92 views
0

我正在使用以下代碼來防止從Magento管理面板取消訂單。如何防止使用事件觀察者取消訂單?

<?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> 

在觀察我使用下面的代碼:

<?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);    
     }  
    } 
} 

但是,即使啓用這個模塊後,訂單被取消得到。

如何防止訂單被取消?

+0

您是否已清除緩存? –

+0

@MarkoNovakovic我已經清除了緩存,並且控件將轉到觀察者中的方法,但是訂單仍被取消。 – Muk

回答

2

在「Mage_Adminhtml_Sales_OrderController」「cancelAction」有云:

$order->cancel() 
     ->save(); 

這意味着順序是先取消,然後你的觀察火災。雖然我發現這個事件:

Mage::dispatchEvent('sales_order_payment_cancel', array('payment' => $this)); 

在 「Mage_Sales_Model_Order_Payment」 之前,它將觸發: 「Mage_Sales_Model_Order」: 「registerCancellation」 的方法。

在你的觀察方法,它觸發此事件上,你可以這樣做:「controller_action_predispatch」:

if ($adminRoleName) { 
$payment = $observer-&gt;getEvent()-&gt;getPayment(); 
$order = $payment-&gt;getOrder(); 
$order-&gt;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')-&gt;getNonCancelledOrders(); 
if (!$orderIds) { 
    $orderIds = array($order-&gt;getId()); 
} else { 
    $orderIds[] = $order-&gt;getId(); 
} 
Mage::getSingleton('adminhtml/session')-&gt;setNonCancelledOrders($orderIds); 
} 

接下來,在你等/ config.xml文件下列事件中添加一個多個觀測

<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)'); 
      } 
     } 
    } 
} 
+0

謝謝,它爲我工作。 – Muk

+0

但是,如果我嘗試從訂單網格頁取消訂單,它會顯示異常頁。我可以如何防止它發生? – Muk

+0

對不起,這是因爲在最後的法師:: throwException,我已經添加它,以防止給用戶成功的消息,該訂單已被取消,而不是顯示警告。您可以從代碼中刪除該行,但您必須找到一種方法來顯示正確的警告或成功消息。我會編輯我的答案。 – zokibtmkd

相關問題