我正在开发一个带有网格的自定义magento管理模块。当您添加一个新条目时,我会执行自定义验证,并使用Mage::getSingleton('adminhtml/session')->addError()
方法抛出一个错误(当发生错误时)。
当我重定向回编辑表单时,我设置的错误消息不会出现。
这是我在电网控制器上的save
操作:
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('*/*/');
}
我注意到,问题只发生在我这样做的时候:
// 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($e->getMessage());
Mage::getSingleton('adminhtml/session')->setManualordersyncData($data);
$this->_redirect('*/*/');
return;
这并不理想,因为我不再处于编辑表单中,并且我已经从表单中丢失了old data
。有什么想法可以解决这个问题吗?
我自己也经历过这个问题,很失望这个问题没有得到任何回复
原因是您的编辑页面未配置为显示会话消息。相反,消息会一直持续到第一次显示,如果您不断尝试,甚至可能会出现同一消息的多个"副本"。
答案是确保您的控制器和布局正在输出消息。
最低要求是控制器中的以下行:
$this->loadLayout();
// other code goes here...
$this->_initLayoutMessages('adminhtml/session'); // <--- this line is key
$this->renderLayout();
如果您使用的会话不是adminhtml/session,那么请初始化这些消息。