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

xmakbtuz  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(139)

基于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();
    }
}

模型保存得很好,我收到验证错误也很好,但表单仍是填充得.这对我来说不太好.如果我在此处放置redirect:

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

模型保存得很好,但是我的唯一规则(即这些记录已存在)出现验证错误。看起来像是第二次保存模型还是什么?
如果我把redirect放在这里:

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

模型的保存和重定向进行得很好,但我从来没有得到验证错误。
我试过取消设置$_POST,但是我不知道缺少了什么。我缺少了什么?
UPDATE:也许这很重要,我想重定向到基本上呈现的相同页面。我不确定我是否需要重定向。有趣的是,当我在checkboxcolumn的网格中这样做时,我只得到了我唯一的验证错误:

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

我这样做,是为了确保当用户选中了很多复选框,并且出现了任何验证错误,并且页面被重新加载时,没有必要重新选中复选框,但这可能不是一个好的解决方案。
UPDATE_2:不确定,但可能问题是浏览器保留选定的值...?我发现this thread有类似的问题。
问题是,提交后,重定向到相同的视图,POST仍然设置,值仍然在那里。这就是为什么Yii想再次提交,但因为我定义了一个独特的规则,我得到了验证错误。这是Yii的常见行为吗,在处理完POST数据后,它必须被重定向到其他地方?难道没有其他方法可以以某种方式重定向到同一页面作为一个干净的开始吗?我试过取消设置模型的属性和POST,但我不能解决它,但也许我只是没有这样做的好方法。
更新3:非常有趣。2如果我在这里注解掉model保存:

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

redirect是可以识别和工作的,但是一旦我删除了注解,redirect就不能被识别了。我在那里放了一个false view命令,这样我就可以看到Yii不能识别它。
谁能给我说清楚这是怎么回事?

eanckbw9

eanckbw91#

您是否使用 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...
}

相关问题