Задержка флэш-данных CodeIgniter - PullRequest
3 голосов
/ 20 сентября 2011

Я пытаюсь проверить форму входа в систему и отправить сообщения об ошибках с использованием flashdata. Flashdata, похоже, имеет задержку, она влияет только на вторую отправку (сообщение об ошибке не отображается после первой отправки, нормально после второй), тогда как userdata работает правильно.

Вид>

<?php if ($this->session->flashdata('error_messages')): ?>
  <?php echo $this->session->flashdata('error_messages'); ?>
<?php endif; ?>
<?php echo form_open('user/login', array('name' => 'login_form', 'id' => 'login_form')); ?>
<fieldset>
  <p>
    <?php echo form_label('Username: ', 'username'); ?>
    <?php echo form_input('username', set_value('username', ''), array('id' => 'username', 'placeholder' => 'username')); ?>
  </p>
  <p>
    <?php echo form_label('Password: ', 'password'); ?>
    <?php echo form_password('password', set_value('password', ''), array('id' => 'password', 'placeholder' => '********')); ?>
 </p>
 <p>
   <?php echo form_submit('login', 'Login', array('id' => 'login')); ?>
 </p>

Действие контроллера>

public function login() {
    //user is not logged in, carry on
    if (!user_is_logged_in()) {
        //check if form was already submitted, if yes validate
        if ($this->input->post('login')) {
            $this->load->library('chronos_user');

            //gather data from form
            $username = $this->input->post('username');
            $password = $this->input->post('password');

            //validate form, show error messages if not valid
            if (
                !($this->chronos_user->valid_username($username)) ||
                !($this->chronos_user->unique_username($username))
            )
            {
                $this->chronos_template->set_data('header', array('controller' => 'users', 'action' => 'login', 'title' => 'Login'));
                $this->chronos_template->set_view('content', 'user/login_view');
                $this->chronos_template->view();
            }
            //redirect if ok
            else {
                header("Location http://c4studio.ro");
            }
        }
        //if no form was submitted, just display it
        else {
            $this->chronos_template->set_data('header', array('controller' => 'users', 'action' => 'login', 'title' => 'Login'));
            $this->chronos_template->set_view('content', 'user/login_view');
            $this->chronos_template->view();            
        }
    }
    //user is already logged in, redirect to profile page
    else {
        $profile_url = "Location: ";
        $profile_url .= site_url();
        $profile_url .= "user/profile/";

        header($profile_url);
    }
}

Метод Valid_username>

    public function valid_username($username) {
        if (empty($username)) {

            $this->CI->session->set_flashdata('error_messages', 'Value.');
            return FALSE;
        }
        if (strlen($username) < 3) {
            $this->CI->session->set_flashdata('error_messages', 'Value11.');
            return FALSE;
        }
        return TRUE;
    }

Есть идеи? Также, если кто-то знает лучший способ сделать все это, пожалуйста, дайте мне знать! Спасибо

Ответы [ 2 ]

4 голосов
/ 20 сентября 2011

В соответствии с документацией флэш-данные существуют при следующем запросе к серверу .

Но в вашем случае вы фактически установили флэш-данные в тот же запрос к серверу, что и при отображениивид входа в систему, который был неудачным.Вот почему это не работает.

Лучший способ - просто позволить методу модели возвращать значение true или false и использовать вместо этого это значение.Флэш-данные следует учитывать, только если вы перенаправляете пользователя на страницу с ошибкой или что-то в этом роде.

0 голосов
/ 20 сентября 2011

Как упоминалось @Repox, он работает только при следующем обновлении. Вы предполагаете, что flashdata работает ПРЯМО СЕЙЧАС, когда вы устанавливаете его, но это не требует перезагрузки / обновления новой реальной страницы, прежде чем она станет доступной.

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

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

Вам нужно использовать form_error для возврата всех ошибок формы, не используйте flashdata, они не будут работать так, как вы ожидаете.

Примеры: http://codeigniter.com/user_guide/libraries/form_validation.html#settingerrors

Вы также можете переопределить любое сообщение об ошибке, найденное в языковом файле. Например, чтобы изменить сообщение для «обязательного» правила, вы будете делать это:

$this->form_validation->set_message('required', 'Your custom message here');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...