Magento 1.8 – Return Error Message from Observer

event-observermagento-1.8

I made a custom module for observer on customer save before event for admin-side

My config file in local/Pavans/Profile/etc

<adminhtml>
        <events>
            <customer_save_before>
                <observers>
                    <pavans_profile>
                        <type>singleton</type>
                        <class>Pavans_Profile_Model_Observer</class>
                        <method>customerSaveAfter</method>
                    </pavans_profile>
                </observers>
            </customer_save_before>

        </events>

    </adminhtml>

It calls my observer before customer data saved

class Pavans_Profile_Model_Observer {
    public function customerSaveAfter(Varien_Event_Observer $observer) 
    { 
        $controller = $observer->getControllerAction();
        $controller->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
        $response = array('error' => false, 'message' => $helper->__('Error'));
        return $controller->getResponse()->setBody(Mage::helper('core')->jsonEncode($response));    

    }
}

I want to pass error message on customer form and stop controller to save customer data, but above code shows me error message

 Call to a member function setFlag() on a non-object

So i'm unable to get object of controller.

I have also tried this

$request = Mage::app()->getRequest();
$action = $request->getActionName();
Mage::app()->getFrontController()->getAction()->setFlag($action, Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
$response = Mage::app()->getResponse();

$json = Mage::helper('core')->jsonEncode(array('error' => -1, 'message' => $this->__('test errror'))); 
$response->setBody($json);

This shows me Error message on form

An error occurred while saving the customer

Above message is not my custom error message

Best Answer

Instead of using

Mage::app()->getFrontController()->getAction()->setFlag($action, Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true)

used

  $response->setHttpResponseCode(500);

try this for

public function customerSaveAfter(Varien_Event_Observer $observer) 
    { 
    try {
        Mage::app()->getResponse()->setHttpResponseCode(500);
         Mage::app()->getResponse()->setBody(Mage::helper('core')->jsonEncode(array('error' => -1, 'message' => $this->__('test errror'))));
    }
    catch (Mage_Core_Exception $e) {
       Mage::app()->getResponse()->setBody($e->getMessage());
    }
    catch (Exception $e){
        Mage::app()->getResponse()->setBody(Mage::helper('customer')->__('Customer move error'.$e));
        Mage::logException($e);
    }

}

See at https://stackoverflow.com/questions/5290639/in-an-observer-method-how-do-you-tell-magento-to-not-process-code-after-the-dis

edit: Can try 200 instead of 500

Or Try this

public function customerSaveAfter(Varien_Event_Observer $observer) 
    { 

            $request = Mage::app()->getRequest();

            $controller=Mage::app()->getFrontController()->getAction();

            if( Mage::app()->getRequest()->isXmlHttpRequest() || Mage::app()->getRequest()->getParam('isAjax')) {
                // Is ajax
                $action = $request->getActionName();
                Mage::app()->getFrontController()->getAction()->setFlag(
                        $action, Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);

                Mage::app()->getResponse()->setHttpResponseCode(200);
                Mage::app()->getResponse()->setHeader('Content-type', 'application/json');

                Mage::app()->getResponse()->setBody(Mage::helper('core')->jsonEncode(array('error' => -1, 'message' => $this->__('test error'))));

            } else {
               // Is form submit
                Mage::getSingleton('customer/session')
                    ->addError(Mage::helper('customer')->__('test error.'));
               Mage::app()->getFrontController()->getAction()->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
                Mage::getSingleton('customer/session')
                    ->setCustomerFormData(Mage::app()->getRequest()->getPost());
               Mage::app()->getFrontController()->getAction()->getResponse()->setRedirect(Mage::getUrl('*/*'));
            }
    }
Related Topic