【问题标题】:Yii redirect to same view after multiple model validation and saveYii 在多个模型验证后重定向到同一个视图并保存
【发布时间】:2013-07-15 12:35:15
【问题描述】:

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

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

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

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

UPDATE_2:不确定,但问题可能在于浏览器保持选定的值...?我发现 this thread 有类似的问题。

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

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

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

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

有人可以帮我解释一下这里发生了什么吗?

【问题讨论】:

    标签: validation redirect yii


    【解决方案1】:

    您是否对表单使用了 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...
    }
    

    【讨论】:

    • 非常感谢您的帮助。现在,如果我填写了所有内容,并且没有验证错误,那就太好了。但是,如果第一次提交时出现验证错误,并且我想更正缺少的字段值,那么我会再次收到此唯一验证错误。
    • 也许很重要,我想重定向到基本上呈现的同一页面。
    • 这是关键:$form = $this->beginWidget('GxActiveForm', array( 'id' => '...-form', 'enableAjaxValidation' => false, )); 将表单小部件的 enableAjaxValidation 属性设置为 false。现在可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    相关资源
    最近更新 更多