在多个模型验证并保存后,Yii重定向到相同的视图

时间:2013-07-15 12:35:15

标签: validation redirect yii multiple-models

基于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不认识它。

有人可以告诉我这里发生了什么吗?

非常感谢!

1 个答案:

答案 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...
}