Как да предотвратите анулиране на поръчка с помощта на наблюдател на събития?

Използвам следния код, за да предотвратя анулирането на поръчката от административния панел на 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);            
        }       
    }
}

Но дори и след активиране на този модул, поръчката се анулира.

Как мога да предотвратя анулирането на поръчката?


person Mukesh    schedule 25.09.2015    source източник
comment
Изчистихте ли кеша?   -  person Marko Novakovic    schedule 25.09.2015
comment
@MarkoNovakovic Изчистих кеша и контролът отива към метода в наблюдателя, но поръчката все още е анулирана.   -  person Mukesh    schedule 26.09.2015


Отговори (1)


В "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".

Във вашия метод на наблюдател, който се задейства при това събитие, можете да направите следното:

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

След това добавете още един наблюдател във вашия файл etc/config.xml за следното събитие: "controller_action_predispatch":

<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)');
            }
        }
    }
}
person zokibtmkd    schedule 27.09.2015
comment
Но ако се опитам да анулирам поръчка от страницата с мрежата за поръчки, тя показва страница с изключения. Как мога да предотвратя това? - person Mukesh; 27.09.2015
comment
Съжалявам, това се дължи на Mage::throwException в края, добавих го, за да предотвратя даването на съобщение за успех на потребителя, че поръчката е отменена, вместо да показва предупреждението. Можете да премахнете този ред от кода, но ще трябва да намерите начин как да покажете правилно предупреждение или съобщение за успех. Ще редактирам отговора си. - person zokibtmkd; 27.09.2015
comment
Ще опитам, ако намерите някакво решение за това, моля, актуализирайте отговора. - person Mukesh; 27.09.2015