2013-07-15 1 views
0

Основано на this article, у меня есть аналогичное решение. Это пример:Yii перенаправляет на тот же вид после нескольких валидаций модели и сохраняет

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, но я не знаю, чего не хватает. что мне не хватает?

UPDATE: возможно, это важно, что я хотел бы перенаправить на ту же страницу, что в основном сделан. Я не уверен, что мне все равно нужно перенаправить. Интересно то, что я получаю только свою уникальную ошибку проверки назад, когда я делаю это в сетке для 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

Вы использовали проверку ajax для формы? Если да, выполните код для проверки ajax на контроллере или установите ajax validation false.Ваш код ниже справа:

if ($valid) { 
    foreach ($models as $model) { 
     $model->save(false); //The model has been validated, no need to validate again 
    } 
    $this->redirect... 
} 
+0

Большое спасибо за помощь. Теперь, если я заполню все, и ошибок проверки не существует, это хорошо. Но, если есть ошибка проверки для первого представления, и я хочу исправить недостающее значение поля, я снова получаю эту уникальную ошибку проверки. – user2511599

+0

Возможно, это важно, что я хотел бы перенаправить на ту же страницу, что в основном сделан. – user2511599

+0

Это был ключ: '$ form = $ this-> beginWidget ('GxActiveForm', array ( 'id' => '...- form', 'enableAjaxValidation' => false, ));' установка форма виджет ** включеноAjaxValidation ** свойство to ** false **. теперь он работает. – user2511599