基于this article,我有一个类似的解决方案。这是一个例子:
public function actionBatchUpdate() {
// retrieve items to be updated in a batch mode
// assuming each item is of model class 'Item'
$items=$this->getItemsToUpdate();
if(isset($_POST['Item'])) {
$valid=true;
foreach($items as $i=>$item) {
if(isset($_POST['Item'][$i]))
$item->attributes=$_POST['Item'][$i];
$valid=$item->validate() && $valid;
}
if($valid) // all items are valid
// ...do something here
}
// displays the view to collect tabular input
$this->render('batchUpdate',array('items'=>$items));
}
问题是,我不知道在流程结束时发生了什么。 如果我没有在这里进行任何重定向:
if ($valid) {
foreach ($models as $model) {
$model->save();
}
}
模型保存得很好,我的验证错误很好,但表单仍然填充。这对我不好。 如果我把重定向放在这里:
if ($valid) {
foreach ($models as $model) {
$model->save();
}
$this->redirect...
}
模型保存得很好,但是我的唯一规则存在验证错误,这些记录已经存在。似乎第二次有模型保存或什么?
如果我把重定向放在这里:
if ($valid) {
foreach ($models as $model) {
$model->save();
}
}
$this->redirect...
模型的保存和重定向很顺利,但我从未得到验证错误。
我曾试图使用未设置的$ _POST,但我不知道缺少什么。我错过了什么?
更新:也许重要的是,我想重定向到基本呈现的同一页面。 我确定无论如何我都需要重定向。 有趣的是,当我在网格中为checkboxcolumn执行此操作时,我只得到了我唯一的验证错误:
'checked' => '$_POST["rendelesGyartmanyId"][$row]',
我这样做,以确保当用户检查了很多复选框,并且有任何验证错误,并且重新加载页面时,没有必要重新检查复选框,但可能这不是一个好的解决方案。
UPDATE_2:不确定,但问题可能是浏览器保留了选定的值......?我发现this thread有类似的问题。
问题是,提交后,并重定向到同一个视图,POST仍然设置,值仍在那里。这就是为什么Yii想要再次提交,但由于我定义了一个独特的规则,我得到了验证错误。它是Yii的常见行为,在处理POST数据后,它是否被重定向到其他地方?有没有其他方法以某种方式重定向到同一页面作为一个干净的开始?我试图取消模型的属性和POST,但是我无法解决它,但也许我只是没有做到这一点。
更新3:非常有趣。如果我注释掉模型保存在这里:
if ($valid) {
foreach ($models as $model) {
// $model->save();
}
$this->redirect...
}
重定向已被识别并正常工作,但只要删除注释,就无法识别重定向。我在那里放了一个假视图命令,这样我就可以看到Yii不认识它。
有人可以告诉我这里发生了什么吗?
非常感谢!
答案 0 :(得分:0)
您是否对表单使用了ajax验证?如果是,请将代码实现到控制器上的ajax validate或设置ajax验证为false。您的代码是正确的:
if ($valid) {
foreach ($models as $model) {
$model->save(false); //The model has been validated, no need to validate again
}
$this->redirect...
}