我正在尝试提交表单,在表单子目录后,当前页面应保持用户输入的数据。如何实现这个目标?
public function actionUpload()
{
$model=new UploadModel();
$basemodel=new BaseContactList();
$importmodel=new ImportedFilesModel();
$importmodel->name =$basemodel->name;
$importmodel->import_date = $now->format('Y-m-d H:i:s');
$importmodel->server_path = $temp;
$importmodel->file_name = $name;
$importmodel->crm_base_contact_id = $crm_base_contact_id;
if ($importmodel->save())
echo "Import saved";
else
echo "Import Not Saved";
unset($_POST['BaseContactList']);
$this->redirect(Yii::app()->request->urlReferrer);
}
此行"$this->redirect(Yii::app()->request->urlReferrer);"
转到上一页,但用户输入的值已清除。如何在不清除表格中的值的情况下重定向到上一页?
答案 0 :(得分:2)
与模型保存失败后查看错误消息时相同。您可以将保存的模型传递给表单,而不是进行重定向。
public function actionIndex(){
$model = new Model();
if (isset($_POST[get_class($model)]){
$model->setAttributes($_POST[get_class($model)]);
if ($model->save()){
//do nothing
//usually people do a redirection here `$this->redirect('index');`
//or you can save a flash message
Yii::app()->user->setFlash('message', 'Successfully save form');
} else {
Yii::app()->user->setFlash('message', 'Failed to save form');
}
}
//this will pass the model posted by the form to the view,
//regardless whether the save is successful or not.
$this->render('index', array('model' => $model));
}
在index
视图中,您可以执行类似的操作。
<?php if (Yii::app()->user->hasFlash('message')):?>
<div class="message"><?php echo Yii::app()->user->getFlash('message');?></div>
<?php endif;?>
<?php echo CHtml::beginForm();?>
<!-- show the form with $model here --->
<?php echo CHtml::endForm();?>
缺点是,当您不小心点击“刷新”按钮(F5)时,它会尝试再次发布该表单。
或者您可以使用setFlash
使用用户会话保存它。
public function actionUpload()
{
$model=new UploadModel();
$basemodel=new BaseContactList();
$importmodel=new ImportedFilesModel();
$importmodel->name =$basemodel->name;
$importmodel->import_date = $now->format('Y-m-d H:i:s');
$importmodel->server_path = $temp;
$importmodel->file_name = $name;
$importmodel->crm_base_contact_id = $crm_base_contact_id;
if ($importmodel->save())
echo "Import saved";
else
echo "Import Not Saved";
unset($_POST['BaseContactList']);
//here we go
Yii::app()->user->setFlash('form', serialize($basemodel));
//
$this->redirect(Yii::app()->request->urlReferrer);
}
在上一个表单中,您将加载会话中的值。
public function actionForm(){
if (Yii::app()->user->hasFlash('form')){
$basemodel = unserialize(Yii::app()->user->getFlash('form');
} else {
$basemodel = new BaseContactList();
}
$this->render('form', array('basemodel' => $basemodel));
}
答案 1 :(得分:1)
我不知道是否需要这么长的代码来做这样的事情,但我可以简单地做到这一点。
假设我有一个 actionUpdate
public function actionUpdate($id)
{
$model=$this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Products']))
{
$model->attributes=$_POST['Products'];
$model->save();
// remove this redirect() line
// $this->redirect(array('view', 'id' => $model->productId));
}
$this->render('update',array(
'model'=>$model,
));
}
如果在您的操作中,您在保存数据后重定向,那么只需删除该行即可完成,如果您再次呈现该表单在以下几行
如果您没有在下一行中渲染表单,那么您可以自己完成,如
if($model->save())
{
$this->render('update',array(
'model'=>$model,
));
Yii::app()->end();
}
答案 2 :(得分:0)
这会吗?
if ($importmodel->save())
$_SERVER['PHP_SELF'];
答案 3 :(得分:-1)
简单重定向到相同的操作并发送作为参数加载的模型