我的控制器(管理员)中有这段代码:
function save(){
$model = $this->getModel('mymodel');
if ($model->store($post)) {
$msg = JText::_( 'Yes!' );
} else {
$msg = JText::_( 'Error :(' );
}
$link = 'index.php?option=com_mycomponent&view=myview';
$this->setRedirect($link, $msg);
}
在模特中我有:
function store(){
$row =& $this->getTable();
$data = JRequest::get('post');
if(strlen($data['fl'])!=0){
return false;
}
[...]
这是有效的 - 生成错误消息,但它返回到项目列表视图。我想留在编辑视图中输入数据。怎么做?
答案 0 :(得分:5)
在您的控制器中,您可以:
if ($model->store($post)) {
$msg = JText::_( 'Yes!' );
} else {
// stores the data in your session
$app->setUserState('com_mycomponent.edit.mymodel.data', $validData);
// Redirect to the edit view
$msg = JText::_( 'Error :(' );
$this->setError('Save failed', $model->getError()));
$this->setMessage($this->getError(), 'error');
$this->setRedirect(JRoute::_('index.php?option=com_mycomponent&view=myview&id=XX'), false));
}
然后,您将需要从会话中加载数据,如:
JFactory::getApplication()->getUserState('com_mycomponent.edit.mymodel.data', array());
通常这会加载到模型中的方法“loadFormData”中。加载数据的位置取决于您如何实现组件。如果您使用Joomla的表单api,则可以将以下方法添加到模型中。
protected function loadFormData()
{
// Check the session for previously entered form data.
$data = JFactory::getApplication()->getUserState('com_mycomponent.edit.mymodel.data', array());
if (empty($data)) {
$data = $this->getItem();
}
return $data;
}
编辑:
但请注意,如果你的控制器继承自“JControllerForm”,Joomla的API已经可以为你完成所有这些,你不需要重写save方法。创建组件的最佳方法是复制Joomla核心组件中的内容,例如com_content
答案 1 :(得分:0)
不建议重写save
或任何方法。
如果您真的想覆盖某些内容并希望在保存之前或之后更新某些内容,则应使用JTable
文件。
例如:
/**
* Example table
*/
class HelloworldTableExample extends JTable
{
/**
* Method to store a node in the database table.
*
* @param boolean $updateNulls True to update fields even if they are null.
*
* @return boolean True on success.
*/
public function store($updateNulls = false)
{
// This change is before save
$this->name = str_replace(' ', '_', $this->name);
if (!parent::store($updateNulls))
{
return false;
}
// This function will be called after saving table
AnotherClass::functionIsCallingAfterSaving();
}
}
您可以使用JTable类扩展任何方法,这是推荐的方法。