Как загрузить ранее заполненные поля при сбое проверки модели в Yii? - PullRequest
3 голосов
/ 29 мая 2011

Когда пользователь нажимает кнопку «Создать» и проверка модели завершается неудачно, мой сайт перенаправляется на ту же страницу, отображающую точно такую ​​же форму. Я провел некоторое исследование о том, как загрузить ранее введенные значения, чтобы пользователь не вводил их снова. С помощью firebug я мог наблюдать за содержимым поста, и они, похоже, не содержат такой информации.

Посмотрев в Интернете, я увидел, что кто-то предлагает использовать Ajax для отправки формы и возврата в нее данных JSON, указывающих, была ли проверка успешной или нет. Тем не менее, я довольно новичок в Yii и PHP в целом, поэтому мне нужно некоторое руководство, чтобы начать с этим.

Есть ли другой (более простой) способ? В противном случае, как я мог получить возвращение JSON, указывающее, была ли проверка успешной или нет? Спасибо!

1 Ответ

2 голосов
/ 30 мая 2011

Мне кажется, что вам нужно взглянуть на переменные $ _POST, чтобы увидеть, какой зависимый выпадающий список был выбран, и предварительно отрендерить его, когда проверка формы завершится неудачно, чтобы сработали ошибки проверки Yii по умолчанию.Используя эту ссылку в качестве примера:

Сначала выполните рефакторинг части метода actionDynamiccities() в отдельный публичный (бездействующий) метод в вашем контроллере:

public function getCitiesList($country_id) {
    $data=Location::model()->findAll('parent_id=:parent_id', 
              array(':parent_id'=>(int) $country_id));
    return CHtml::listData($data,'id','name');
}

Затем исправьте измененное действие AJAX следующим образом:

public function actionDynamiccities()
{
  $data = $this->getCitiesList($_POST['country_id']);
  foreach($data as $value=>$name)
  {
    echo CHtml::tag('option',
               array('value'=>$value),CHtml::encode($name),true);
  }
}

Затем в файле представления _form.php, в div #city_id, где второй выпадающий список будет AJAXed первым, добавьте немногоФрагмент PHP, подобный следующему:

<div id="city_id">
<?php if(isset($_POST['city_id'])): ?>
  <?php foreach($this->getCitiesList($_POST['country_id']) as $value=>$name): ?>
    <?php echo CHtml::tag('option', array('value'=>$value),CHtml::encode($name),true); ?>
  <?php endforeach; ?>
<?php endif; ?>
</div>

Таким образом, если вы уже отправили форму и установлено значение $ _POST ['country_id'], зависимый раскрывающийся список уже отображается и в нем должны отображаться соответствующие ошибки проверки.,

Если пользователь выбирает другую страну, раскрывающийся список городов следует заменить, как обычно.

Я не тестировал этот код, но он должен работать в принципе.Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...