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