cancel
Showing results for 
Search instead for 
Did you mean: 

sales_order_place_before event redirect

sales_order_place_before event redirect

I would like on the event sales_order_place_before to make some custom verification and to cancel the placing of the order. What i have tried:

 

public function saleOrderPlaceBefore(Varien_Event_Observer $observer){
          if(!VerificationSuccess()){
                RemoveProduct();
                Mage::throwException(Mage::helper('sales')->__('Product has expired.'));
                //how to redirect after error?
          }
    }

The problem with this approach is that the product is removed from the cart, but the error is shown as an alert box and i would like to redirect the user to some custom page.

After this, i tried directly to redirect to a custom page with something like:

 

public function saleOrderPlaceBefore(Varien_Event_Observer $observer){
            if(!VerificationSuccess()){
                 RemoveProduct();
                 $session = Mage::getSingleton('checkout/session');		
		 $session->addError(Mage::helper('checkout')->__("Product expired!"));
	         Mage::app()->getFrontController()->getResponse()->setRedirect(Mage::getUrl('product-error'));
		 Mage::app()->getResponse()->sendResponse();
		 exit;
              }
        }

 Using this code, i receive the error:

User Error: Some transactions have not been committed or rolled back  in PathToMagento\lib\Varien\Db\Adapter\Pdo\Mysql.php on line 4039

Any ideas how to solve this error or at least how to manage to cancel the placing of the order, remove the expired product and redirect from this observer(i can use other events also) to a custom page?

2 REPLIES

Re: sales_order_place_before event redirect

Hi 

 

I don't where are located these to functions but I think you miss "$this->"

 

public function saleOrderPlaceBefore(Varien_Event_Observer $observer){
   try {
        if(!$productId = $this->_verificationSuccess($observer)){
            $this->_removeProduct($productId);
            $session = Mage::getSingleton('checkout/session');		
		        $session->addError(Mage::helper('checkout')->__("Product expired!"));
            Mage::app()->getFrontController()->getResponse()
                ->setRedirect(Mage::getUrl('product-error'))
                ->sendResponse();
        }
    } catch (Exception $e) {
        Mage::logException($e);
    }
}


// do your validations
protected function _verificationSuccess($observer) {     
    // if success
   return  $productId;
   // if false 
    return false;
}

// remove your product
protected function _removeProduct($productId) {
   $cartHelper = Mage::helper('checkout/cart');
   $items = $cartHelper->getCart()->getItems();        
   foreach ($items as $item) {
       $itemId = $item->getItemId();
       if ($productId == $itemId) {
           $cartHelper->getCart()->removeItem($itemId)->save();
       }
    } 
}

I hope this could help you.

 

 

Problem solved? Click Accept as Solution!
Still stuck? Check out our documentation: http://magento.com/help/documentation

Re: sales_order_place_before event redirect

Unfortunately this does not help me, i only pointed those functions to make a better idea of what i am trying to do. There is a possibility to override the behaviour of an exception?

Something like:

Mage::throwException(Mage::helper('myexceptionoverride')->__('page-to-redirect'));

 and this, instead of popping out the message, to do the redirect. Any links where i can read about something like this would be greatly appreciated.