Проверка формы 

    CodeIgniter обеспечивает комплексную проверку форм и данных, готовит класс, который помогает свести к минимуму объем кода для написания.

    Содержимое Страницы

    Обзор 

    Перед тем, как объяснить как Codeigniter подходит к проверке данных, давайте опишем идеальный сценарий:

    1. Форма отображается.
    2. Вы ее заполняете и отправляете.
    3. Если вы отправили что-то недопустимое или пропустил необходимый пункт, форма отображается заново с вашими данными и с сообщением об ошибке и ее описанием.
    4. Этот процесс продолжается до тех пор, пока не отправите действующую форму.

    В конце, скрипт должен:

    1. Проверить наличие требуемых данных.
    2. Проверить, что данные правильного типа и содержат правильные критерии. Например, если отправляется имя пользователя, то оно должно быть проверено на содержание только разрешенных символов. Оно должна быть минимальной длины и не должна превышать максимальную длину. Имя пользователя не может быть уже существующим именем или даже зарезервированным словом и так далее
    3. Санировать данные для безопасности.
    4. Предварительно форматировать данные в случае необходимости (Для этого данные должны быть обрезаны? Закодировать HTML? И т.д.)
    5. Подготовить данные для вставки в базу данных.

    Хотя ничего ужасного в вышеописаном процессе нет, все равно требуется значительный объема кода для отображения сообщений об ошибках, для чего обычно устанавливают различные управляющие конструкции в HTML форме. В то время как создать форму просто, реализовывать проверку формы вообще очень неприятно и нудно.

    Учебник "Проверка формы" 

    Далее следует Учебник для осуществление проверки формы средствами CodeIgniter.

    В целях осуществления проверки формы вам понадобятся три вещи:

    1. Файл вида содержащий форму.
    2. Вид файла, содержащий “успешное” сообщение, которое будет отображаться после успешной передачи.
    3. Метод контроллера, чтобы получать и обрабатывать отправленные данные.

    Давайте сделаем этих три вещи, используя, пример, форму регистрации.

    Форма 

    Используя текстовый редактор, создайте форму в файле с названием myform.php. Поместите в него этот код и сохраните его в application/views/ папку:

    <html>
    <head>
    <title>My Formtitle>
    head>
    <body>
    
    php echo validation_errors(); ?>
    
     echo form_open('form'); ?>
    
    
    Имя пользователя
    type="text" name="username" value="" size="50" />
    Пароль
    type="text" name="password" value="" size="50" />
    Подтверждение пароля
    type="text" name="passconf" value="" size="50" />
    Email
    type="text" name="email" value="" size="50" />
    type="submit" value="Отправить" />

    Страница сообщения об успехе 

    Используя текстовый редактор, создайте файл с названием formsuccess.php. Поместите в него этот код и сохраните его в application/views/ папку:

    <html>
    <head>
    <title>My Formtitle>
    head>
    <body>
    
    <h3>Ваша форма была успешно отпралена!h3>
    
    <p>php echo anchor('form', 'Заполнить еще раз!'); ?>

    Контроллер 

    Используя текстовый редактор, файл контроллера с названием form.php. Поместите в него этот код и сохраните его в application/controllers/ папку:

    php
    
    class Form extends CI_Controller {
    
            public function index()
            {
                    $this->load->helper(array('form', 'url'));
    
                    $this->load->library('form_validation');
    
                    if ($this->form_validation->run() == FALSE)
                    {
                            $this->load->view('myform');
                    }
                    else
                    {
                            $this->load->view('formsuccess');
                    }
            }
    }
    

    Пробуем! 

    To try your form, visit your site using a URL similar to this one:

    example.com/index.php/form/
    

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

    Поскольку еще не сказали классу проверки что проверять, он возвращает FALSE (булев false) по умолчанию. ``The run()`` метод возвращает TRUE если он успешно применяет ВСЕ свои правила.

    Объяснение 

    Вы заметите несколько вещей о вышеуказанной странице:

    Форма (myform.php) это стандартная веб-форма с парой исключений:

    1. Она использует хелпер форм для создания начала формы. Технически, в этом нет необходимости. Вы можете создать форму, используя стандартный HTML. Однако преимущество использования помощника заключается в том, что он генерирует URL действия (action), основываясь на URL адресе в конфигурационном файле. Это делает ваше приложение более портативным в случае изменения ваших URL.

    2. В верхней части формы вы видите следующий вызов функции:

      php echo validation_errors(); ?>
      

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

    Контроллер (form.php) имеет один метод: index(). Этот метод инициализирует класс и загружает хелпер проверки формы и хелпер URL, вызываемые в файле вида. Он также запускает процедуру проверки. Основывается на результате проверки, если была неуспешной показывается в форме, иначе - страница успеха.

    Настройка правил проверки 

    CodeIgniter позволяет задать столько правил проверки для нужного поля, сколько вам необходимо и в нужном порядке, он даже позволяет подготовку и предварительную обработку данных полей одновременно. Для установки правил проверки нужно использовать set_rules() метод:

    $this->form_validation->set_rules();
    

    Указанный выше метод принимает три параметра в качестве входных параметров:

    1. Имя поля - точное название имени поля в форме.
    2. “Человеческое” имя для поля, в которое будет вставлено сообщение об ошибке. Например, если поле с именем “user” вы могли бы дать ему человеческое имя “Username”.
    3. Правила валидации для этого поля формы.
    4. (опционально) Установка пользовательских сообщений об ошибках на данные правила для текущего поля. Если этот параметр не указан, будет использоваться параметр по умолчанию.

    Примечание

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

    Вот пример. В контроллере (form.php), добавьте этот код чуть ниже инициализации метода валидации :

    $this->form_validation->set_rules('username', 'Username', 'required');
    $this->form_validation->set_rules('password', 'Password', 'required');
    $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
    $this->form_validation->set_rules('email', 'Email', 'required');
    

    Ваш контроллер теперь должен выглядеть так:

    php
    
    class Form extends CI_Controller {
    
            public function index()
            {
                    $this->load->helper(array('form', 'url'));
    
                    $this->load->library('form_validation');
    
                    $this->form_validation->set_rules('username', 'Username', 'required');
                    $this->form_validation->set_rules('password', 'Password', 'required',
                            array('required' => 'You must provide a %s.')
                    );
                    $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
                    $this->form_validation->set_rules('email', 'Email', 'required');
    
                    if ($this->form_validation->run() == FALSE)
                    {
                            $this->load->view('myform');
                    }
                    else
                    {
                            $this->load->view('formsuccess');
                    }
            }
    }
    

    Теперь отправьте форму с пустыми полями и увидите сообщения об ошибках. Если же отправите форму с заполнеными полями, то увидите страницу успешной отправки

    Примечание

    Поля формы заново не заполняются данными при наличии ошибки. Мы вернемся к этому в ближайшее время.

    Настройка правил с использованием массива 

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

    $config = array(
            array(
                    'field' => 'username',
                    'label' => 'Username',
                    'rules' => 'required'
            ),
            array(
                    'field' => 'password',
                    'label' => 'Password',
                    'rules' => 'required',
                    'errors' => array(
                            'required' => 'You must provide a %s.',
                    ),
            ),
            array(
                    'field' => 'passconf',
                    'label' => 'Password Confirmation',
                    'rules' => 'required'
            ),
            array(
                    'field' => 'email',
                    'label' => 'Email',
                    'rules' => 'required'
            )
    );
    
    $this->form_validation->set_rules($config);
    

    Каскадные правила 

    CodeIgniter позволяет объеденить несколько правил вместе. Давайте попробуем. Измените правила в третем параметре метода правил настройки, на это:

    $this->form_validation->set_rules(
            'username', 'Username',
            'required|min_length[5]|max_length[12]|is_unique[users.username]',
            array(
                    'required'      => 'You have not provided %s.',
                    'is_unique'     => 'This %s already exists.'
            )
    );
    $this->form_validation->set_rules('password', 'Password', 'required');
    $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required|matches[password]');
    $this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');
    

    Приведенный выше код устанавливает следующие правила:

    1. Поле имени пользователя не должно быть меньше 5 символов и превышать 12.
    2. Поле пароля должно совпадать с полем подтверждения пароля.
    3. Поле электронной почты должно содержать корректный адрес.

    Давайте попробуем! Отправьте форму без соответствующих данных и увидите новые сообщения об ошибках, соответствующие новым правилам. Существуют многочисленные правила, с которыми вы можете ознакомиться перейдя в раздел настроек.

    Примечание

    Вы можете также передавать массив правил set_rules(), вместо строки. Например:

    $this->form_validation->set_rules('username', 'Username', array('required', 'min_length[5]'));
    

    Готовим данные 

    В дополнение к методу проверки, как тот, что мы использовали выше, можно также подготовить данные различными способами. Например, вы можете установить такие правила:

    $this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[8]');
    $this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required|matches[password]');
    $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
    

    В приведенном выше примере, мы “обрезаем” поля, проверяем длину там где это необходимо и убеждаемся, что оба поля паролей совпали.

    Любая родная PHP функция, которая принимает один параметр может быть использована, как правило это ``htmlspecialchars()``, ``trim()`` и т.д.

    Примечание

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

    Повторное заполнение формы 

    До настоящего времени мы имели лишь дело с ошибками. Пришло время для повторного заполнения полей формы входящими данными. CodeIgniter предлагает несколько вспомогательных функций, которые позволят делать это. Самой популярной является:

    set_value('field name')
    

    Откройте myform.php файл вида и обновите значение каждого поля с помощью set_value() функции:

    Не забудьте указать имя каждого поля в :php:func:`set_value()` вызовах функции!

    <html>
    <head>
    <title>My Formtitle>
    head>
    <body>
    
    php echo validation_errors(); ?>
    
     echo form_open('form'); ?>
    
    
    Username
    type="text" name="username" value=" echo set_value('username'); ?>" size="50" />
    Password
    type="text" name="password" value=" echo set_value('password'); ?>" size="50" />
    Password Confirm
    type="text" name="passconf" value=" echo set_value('passconf'); ?>" size="50" />
    Email Address
    type="text" name="email" value=" echo set_value('email'); ?>" size="50" />
    type="submit" value="Submit" />

    Теперь перезагрузите страницу и отправьте форму с ошибками. Поля формы должны теперь быть повторно заполнены.

    Примечание

    Раздел настройки класса, описанный ниже, содержит методы, позволяющие осуществлять повторное заполнение полей типа