Yii2. Валидация формы. Часть 1

09.03.2019

Теги: PHPPOSTWeb-разработкаYii2ТеорияФормаФреймворк

После заполнения полей формы на сайте, необходимо проверить правильность введенных данных. Правила валидации полей формы описываются в методе rules() модели формы. Данный метод должен возвращать массив, в котором к свойствам модели (полям формы) применены те или иные валидаторы.

<?php
namespace app\models;
use yii\base\Model;

class FeedbackForm extends Model
{
    public $name, $email, $body;

    public function attributeLabels() {
        return [
            'name' => 'Ваше имя',
            'email' => 'Ваш email',
            'body' => 'Ваше сообщение',
        ];
    }

    public function rules() {
        return [
            ['name', 'required'], // поле name обязательно для заполнения
            ['email', 'required'] // поле email обязательно для заполнения
        ];
    }
}
/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required']
        ];
    }
}

Yii2 добавит на страницу с формой js-код для проверки полей формы:

<script>
jQuery(function ($) {
    jQuery('#feedback-form').yiiActiveForm(
        [
            {
                "id":"feedbackform-name",
                "name":"name",
                "container":".field-feedbackform-name",
                "input":"#feedbackform-name",
                "validate":function (attribute, value, messages, deferred, $form) {
                    yii.validation.required(
                        value,
                        messages,
                        {"message":"Необходимо заполнить «Ваше имя»."}
                    );
                }
            },
            {
                "id":"feedbackform-email",
                "name":"email",
                "container":".field-feedbackform-email",
                "input":"#feedbackform-email",
                "validate":function (attribute, value, messages, deferred, $form) {
                    yii.validation.required(
                        value,
                        messages,
                        {"message":"Необходимо заполнить «Ваш email»."}
                    );
                }
            }
        ],
        []
    );
});
</script>

Чтобы сообщения об ошибках были на русском языке, необходимо добавить в файл конфигурации:

<?php
/*
 * Файл config/web.php
 */
$config = [
    /* ... */
    'language' => 'ru-RU',
    /* ... */
];

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

/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required', 'message' => 'Это поле обязательно для заполнения']
        ];
    }
}

Добавим еще одно правило для проверки корректности адреса электронной почты:

/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required', 'message' => 'Это поле обязательно для заполнения'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
        ];
    }
}

Добавим проверку длины поля name:

/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // поле name должно быть длиной не менее 2 символов
            ['name', 'string', 'min' => 2],
            // поле name должно быть длиной не более 10 символов
            ['name', 'string', 'max' => 10],
        ];
    }
}
/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // поле name должно быть длиной не менее 2 символов
            ['name', 'string', 'min' => 2, 'tooShort' => 'Поле должно быть длиной не менее 2 символов'],
            // поле name должно быть длиной не более 10 символов
            ['name', 'string', 'max' => 10, 'tooLong' => 'Поле должно быть длиной не более 10 символов'],
        ];
    }
}

Еще один вариант указать минимальную и максимальную длину поля:

/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // поле name должно быть длиной от 2 до 10 символов
            ['name', 'string', 'length' => [2, 10]]
        ];
    }
}

Удалить лишние пробелы и установить значение по умолчанию для поля city:

/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // удалить пробелы для полей name, email и city
            [['name', 'email', 'city'], 'trim'],
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required', 'message' => 'Это поле обязательно для заполнения'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // если поле city пустое, устанавливаем значение Москва
            ['city', 'default', 'value' => 'Москва'],
        ];
    }
}

Можно добавить свой валидатор, но он будет работать только на сервере:

/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // удалить пробелы для полей name, email и city
            [['name', 'email', 'city'], 'trim'],
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required', 'message' => 'Это поле обязательно для заполнения'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // если поле city пустое, устанавливаем значение Москва
            ['city', 'default', 'value' => 'Москва'],
            // проверка названия города, будет работать только на сервере
            [
                'city',
                function ($attribute, $params) {
                    if (!in_array($this->$attribute, ['Москва', 'Минск', 'Астана'])) {
                        $this->addError($attribute, 'Город должен быть Москва, Минск или Астана');
                    }
                },
                'skipOnEmpty' => false
            ],
        ];
    }
}
/* ... */
class FeedbackForm extends Model
{
    /* ... */
    public function rules() {
        return [
            // удалить пробелы для полей name, email и city
            [['name', 'email', 'city'], 'trim'],
            // поля name и email обязательны для заполнения
            [['name', 'email'], 'required', 'message' => 'Это поле обязательно для заполнения'],
            // поле email должно быть корректным адресом почты
            ['email', 'email'],
            // если поле city пустое, устанавливаем значение Москва
            ['city', 'default', 'value' => 'Москва'],
            // проверка названия города, будет работать только на сервере
            ['city', 'validateCity', 'skipOnEmpty' => false],
        ];
    }

    public function validateCity($attribute, $params) {
        if (!in_array($this->$attribute, ['Москва', 'Минск', 'Астана'])) {
            $this->addError($attribute, 'Город должен быть Москва, Минск или Астана');
        }
    }
}

Дополнительно

Поиск: PHP • Web-разработка • Форма • Фреймворк • Form • Validate • Валидация • Rule • Yii2

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.