I am working on a custom magento admin module with grids. When you add a new entry, I perform custom validation and throw an error (when & if it occurs) using Mage::getSingleton('adminhtml/session')->addError()
method.
The error message I set does not appear, when I redirect back to the edit form.
This is my save
action on the grid controller:
public function saveAction()
{
// Look For HTTP Post
if ($data = $this->getRequest()->getPost())
{
// Load Data
$manualOrderSyncModel = Mage::getModel('mycompany_mymodule/manualordersync')
->setData($data)
->setId($this->getRequest()->getParam('id'));
// Anticipate Errors
try
{
// Get If Order Number Is Valid
$order = Mage::getModel('sales/order')->load($manualOrderSyncModel->getOrderNumber(), 'increment_id');
if (null === $order->getId())
throw new Exception('No such order exists in the system. Check that order number.');
// Check If This Order Already Exists In Queue
$existingManualOrderSyncModel = Mage::getModel('mycompany_mymodule/manualordersync')
->load($manualOrderSyncModel->getOrderNumber(), 'order_number');
if (null !== $existingManualOrderSyncModel->getId())
{
// Update Existing Entry
$existingManualOrderSyncModel
->setCreatedAt(now())
->setCreatedBy(Mage::getSingleton('admin/session')->getUser()->getUsername())
->setIsSynced(Mycompany_Mymodule_Model_Yesno::NO)
->save();
}
else
{
// Update Timestamps
if ($manualOrderSyncModel->getCreatedAt() == NULL) {
$manualOrderSyncModel
->setCreatedAt(now())
->setCreatedBy(Mage::getSingleton('admin/session')->getUser()->getUsername());
}
$manualOrderSyncModel->save();
}
// Set Success
Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Manual order sync updated.'));
Mage::getSingleton('adminhtml/session')->setManualordersyncData(false);
// Handle Redirect
$this->_redirect('*/*/');
return;
}
catch (Exception $e)
{
// Error
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
Mage::getSingleton('adminhtml/session')->setManualordersyncData($data);
$this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
return;
}
}
// Error
Mage::getSingleton('adminhtml/session')->addError($this->__('Invalid request - unable to find manual order sync to save.'));
$this->_redirect('*/*/');
}
I have noticed, the issue only occurs when I do this:
// Error
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
Mage::getSingleton('adminhtml/session')->setManualordersyncData($data);
$this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
return;
However, If set error and redirect back to grid like this, the error message shows:
// Error
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
Mage::getSingleton('adminhtml/session')->setManualordersyncData($data);
$this->_redirect('*/*/');
return;
This is not ideal because I am no longer in the edit form and I have lost the old data
from the form.
Best Answer
Here is an example of how I use admin sessions on my forms. I use a protected function to get the adminhtml session
Then, when I need it, for error messages I call it this way, from inside a controller
That should produce a message like this on the redirect
Here is my process on creating forms in Magento for the admin. this example is to send emails from our site to test them rather than having to do the action like place an order, or add a comment to a shipment for example.
Step 1, create the module declaration in app/etc/modules This should be named something like Russell_Emaillog.xml
Step 2: Create the Namespace folder to contain our code in app/code/local
Russell so it should look like app/code/local/Russell
Step 3: create all the folders needed for this module in app/code/local/Russell
Emaillog Then inside Emaillog create several folders here is the structure
Step 4: Now that you have all the folders in place you need to put the PHP files in each, I will just put the names of the files for this step so you can create empty php and xml files for now
My response was too large to have this all in one Answer, this is part 1