Codeigniter: Как правильно перенаправить с проверкой формы - PullRequest
5 голосов
/ 04 января 2010

Я понимаю, как это сделать с простой формой без существующих значений, но, скажем, у меня есть представление, которое я могу вызвать через http://domain.com/account/settings. Допустим, у меня есть два поля: имя пользователя, пароль и город , которые все вытащили из БД (кроме пароля конечно). Итак, если пользователь пытается отправить форму и по какой-либо причине не проходит проверку, куда я должен «перенаправить» его? Прямо сейчас у меня он показывает то же представление, но проблема в том, что он снова получает информацию из БД. Должен ли я создавать два разных представления?

Во втором представлении будет показана информация, которую они пытались ввести вместе с сообщением об ошибке.

Ответы [ 5 ]

4 голосов
/ 05 января 2010

Вам не нужно два отдельных вида. Проверьте Form Helper's функции set_value(), set_select(), set_checkbox() и set_radio(). Они повторно заполняют форму после ее представления и проверки. Поэтому в вашем случае вы должны указать поля следующим образом:

<input type="text"
       name="username"
       value="<?php echo set_value('username', $user['username']); ?>" />
<input type="text"
       name="city"
       value="<?php echo set_value('city', $user['city']); ?>" />

По умолчанию вход будет иметь значение $user['city']. Но после неудачной проверки он будет заново заполнен ранее введенными значениями (включая неверные).

Просто помните, что все поля, которые вы хотите заполнить, должны быть пропущены через form_validation библиотеку:

$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('city', 'City', '');
2 голосов
/ 05 января 2010

На том же контроллере вы можете получить что-то вроде этого:

    if ($this->form_validation->run('create_comment') === TRUE)
    {
        $this->comments_model->name     = $this->input->post('name', TRUE);
        $this->comments_model->email    = $this->input->post('email', TRUE);
        $this->comments_model->website  = $this->input->post('website', TRUE);
        $this->comments_model->comment  = $this->input->post('comment', TRUE);
        $this->comments_model->create_comment();
                    redirect(current_url());
    }

    $this->load->view('your_view');

Вот и все.

Идея состоит в том, чтобы перенаправить его на себя или куда угодно, когда валидация возвращает 'true', чтобы мы как бы обновляли страницу, следовательно, обновляли страницу.

Если проверка возвращает «ложь», вам не нужно ничего делать.

1 голос
/ 15 февраля 2012

Была такая же проблема и обнаружил, что перенаправление заставляет вас потерять данные, которые были бы предоставлены form_error (...) или validation_errors (), за исключением того, что вы храните такие данные в сеансе или в массиве, передаваемом в загруженный вид.

Следует отметить, что вы должны перенаправлять, только если данные, которые вы хотите передать, находятся в сеансе, в противном случае вам просто нужно загрузить представление. Последнее гарантирует, что ваши ошибки проверки останутся нетронутыми, когда вы достигнете загруженного представления.

1 голос
/ 05 января 2010

Перенаправить на ту же форму.

А по вашему мнению предоставьте информацию об ошибке посетителю.

Есть два способа сделать это.

  1. Используйте эту ошибку по вашему мнению. Это покажет информацию об ошибке проверки.

    echo validation_errors ('

    ', '

    ');
  2. Или вы можете использовать flashdata ()

В вашем контроллере

...
...
 $this->session->set_flashdata('msg', 'All fields are required. or other useful info here. Please try again!');
redirect('yourcontroller');

И, на ваш взгляд, вам нужно показать это.

<?php
if ($this->session->flashdata('msg')){ //change!
    echo "<div class='message'>";
    echo $this->session->flashdata('msg');
    echo "</div>";
}
?>
0 голосов
/ 12 сентября 2012

Просто загрузите то же представление, если проверка формы не удалась

Контроллер

$userData=array(
'username'=NULL,
'password'=NULL
);
#set form validation rules
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
#get all posted data ,this helps you in two ways,
# 1. Get all form data and can be use here server side
# 2. repopulating the form data by passing to view page
 $userData=$this->input->post(NULL, TRUE);
 #check form validation result
 if ($this->form_validation->run() == TRUE) {
 //do the operation 
 redirect(URL);

}else{
   $this->load->view($view, $userData);
}

Просмотр страницы

<form method=post action='URL'>
<input type='text' name='username'value='<?php echo $username?>'/>
<?php echo (form_error('username')) ? form_error('username', "<div style='color:red'>", "</div>") : ""; ?>
<input type='text' name='password' value='<?php echo $password?>'/>
<?php echo (form_error('username')) ? form_error('username', "<div style='color:red'>", "</div>") : ""; ?>
<input type='submit' value='submit'/>
</form>

Этот код отображает ошибки формы и заполняет форму

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