0

基于这篇文章,我有一个类似的解决方案。这是一个例子:

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,但我不知道缺少什么。我错过了什么?

更新:也许很重要,我想重定向到基本上呈现的同一页面。我不确定我是否需要重定向。有趣的是,当我在网格中为复选框列执行此操作时,我只会得到我唯一的验证错误:

'checked' => '$_POST["rendelesGyartmanyId"][$row]',

我这样做是为了确保当用户检查了很多复选框,并且有任何验证错误,并且页面被重新加载时,没有必要重新检查复选框,但这可能不是一个好的解决方案。

UPDATE_2:不确定,但也许问题在于浏览器保持选定的值......?我发现这个线程关于类似的问题。

问题是,在提交并重定向到同一个视图之后,POST 仍然设置,并且值仍然在那里。这就是 Yii 想要再次提交的原因,但是由于我定义了一个独特的规则,我得到了验证错误。Yii 的常见行为是在处理 POST 数据后必须重定向到其他地方吗?有没有其他方法可以以某种方式重定向到同一页面作为一个干净的开始?我试图取消设置模型的属性和 POST,但我无法解决它,但也许我只是没有用好方法。

更新3:非常有趣。如果我在这里注释掉模型保存:

if ($valid) {
    foreach ($models as $model) {
        // $model->save();
    }
    $this->redirect...
}

重定向已被识别并且可以正常工作,但是一旦我删除注释,就无法识别重定向。我在那里放了一个错误的查看命令,这样我就可以看到 Yii 无法识别它。

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

4

1 回答 1

0

您是否对表单使用了 ajax 验证?如果是,请在控制器上实现代码以进行 ajax 验证或将 ajax 验证设置为 false。您下面的代码是正确的:

if ($valid) {
   foreach ($models as $model) {
       $model->save(false); //The model has been validated, no need to validate again
   }
   $this->redirect...
}
于 2013-07-15T17:35:55.510 回答