diff --git a/docs/guide-ru/input-validation.md b/docs/guide-ru/input-validation.md index 86831346da..c11cd388d0 100644 --- a/docs/guide-ru/input-validation.md +++ b/docs/guide-ru/input-validation.md @@ -3,13 +3,15 @@ Как правило, вы никогда не должны доверять данным, полученным от пользователей и всегда проверять их прежде, чем работать с ними и добавлять в базу данных. -Учитывая [модель](structure-models.md) данных которые должен заполнить пользователь, можно проверить эти данные на валидность воспользовавшись методом `[[yii\base\Model::validate()]]`. Метод возвращает логическое значение с результатом валидации ложь/истина. Если данные не валидны, ошибку можно получить воспользовавшись методом `[[yii\base\Model::errors]]`. Рассмотрим пример: +Учитывая [модель](structure-models.md) данных которые должен заполнить пользователь, можно проверить эти данные на валидность воспользовавшись методом [[yii\base\Model::validate()]]. Метод возвращает логическое значение с результатом валидации ложь/истина. Если данные не валидны, ошибку можно получить воспользовавшись методом [[yii\base\Model::errors]]. Рассмотрим пример: ```php $model = new \app\models\ContactForm; -// модель заполненная пользовательскими данными -$model->attributes = \Yii::$app->request->post('ContactForm'); +// заполняем модель пользовательскими данными +$model->load(\Yii::$app->request->post()); +// аналогично следующей строке: +// $model->attributes = \Yii::$app->request->post('ContactForm'); if ($model->validate()) { // все данные корректны @@ -23,7 +25,7 @@ if ($model->validate()) { ## Правила проверки Для того, чтобы `validate()` действительно работал, нужно объявить правила проверки атрибутов. -Правила для проверки нужно указать в методе `[[yii\base\Model::rules()]]`. В следующем примере показано, как +Правила для проверки нужно указать в методе [[yii\base\Model::rules()]]. В следующем примере показано, как правила для проверки модели `ContactForm`, нужно объявлять: ```php @@ -39,7 +41,7 @@ public function rules() } ``` -Метод должен `[[yii\base\Model::rules()|rules()]]` возвращать массив правил, каждое из которых является массивом в следующем формате: +Метод [[yii\base\Model::rules()|rules()]] должен возвращать массив правил, каждое из которых является массивом в следующем формате: ```php [ @@ -78,10 +80,10 @@ public function rules() Когда вызывается метод `validate()` для проверки, он выполняет следующие действия: -1. Определяет, какие атрибуты должны проверяться путем получения списка атрибутов от `[[yii\base\Model::scenarios()]]` - используя текущий `[[yii\base\Model::scenario|scenario]]`. Эти атрибуты называются - *активными атрибутами*. -2. Определяет, какие правила проверки должны использоваться, получив список правил от `[[yii\base\Model::rules()]]` - используя текущий `[[yii\base\Model::scenario|scenario]]`. Эти правила называются - *активными правилами*. +1. Определяет, какие атрибуты должны проверяться путем получения списка атрибутов от [[yii\base\Model::scenarios()]] + используя текущий [[yii\base\Model::scenario|scenario]]. Эти атрибуты называются - *активными атрибутами*. +2. Определяет, какие правила проверки должны использоваться, получив список правил от [[yii\base\Model::rules()]] + используя текущий [[yii\base\Model::scenario|scenario]]. Эти правила называются - *активными правилами*. 3. Каждое активное правило проверяет каждый активный атрибут, который ассоциируется с правилом. Правила проверки выполняются в том порядке, как они перечислены. @@ -93,7 +95,7 @@ public function rules() ### Настройка сообщений об ошибках Большинство валидаторов имеют сообщения об ошибках по умолчанию, которые будут добавлены к модели когда его атрибуты не проходят проверку. -Например, `[[yii\validators\RequiredValidator|required]]` валидатор добавил к модели сообщение об ошибке "Имя пользователя не может быть пустым." когда атрибут `username` не удовлетворил правила этого валидатора. +Например, [[yii\validators\RequiredValidator|required]] валидатор добавил к модели сообщение об ошибке "Имя пользователя не может быть пустым." когда атрибут `username` не удовлетворил правила этого валидатора. Вы можете настроить сообщение об ошибке для каждого правила, указав свойство `message` при объявлении правила, следующим образом: @@ -107,25 +109,25 @@ public function rules() ``` Некоторые валидаторы могут поддерживать дополнительные сообщения об ошибках, чтобы более точно описать причину ошибки. -Например, `[[yii\validators\NumberValidator|number]]` валидатор поддерживает -`[[yii\validators\NumberValidator::tooBig|tooBig]]` и `[[yii\validators\NumberValidator::tooSmall|tooSmall]]` +Например, [[yii\validators\NumberValidator|number]] валидатор поддерживает +[[yii\validators\NumberValidator::tooBig|tooBig]] и [[yii\validators\NumberValidator::tooSmall|tooSmall]] для описания ошибки валидации, когда проверяемое значение является слишком большим и слишком маленьким, соответственно. Вы можете настроить эти сообщения об ошибках, как в настройках валидаторов, так и непосредственно в правилах проверки. ### События валидации -Когда вызывается метод `[[yii\base\Model::validate()]]` он инициализирует вызов двух методов, +Когда вызывается метод [[yii\base\Model::validate()]] он инициализирует вызов двух методов, которые можно переопределить, чтобы настроить процесс проверки: -* `[[yii\base\Model::beforeValidate()]]`: выполнение по умолчанию вызовет `[[yii\base\Model::EVENT_BEFORE_VALIDATE]]` +* [[yii\base\Model::beforeValidate()]]: выполнение по умолчанию вызовет [[yii\base\Model::EVENT_BEFORE_VALIDATE]] событие. Вы можете переопределить этот метод, или обрабатывать это событие, чтобы сделать некоторую предобработку данных (например, форматирование входных данных), метод вызывается до начала валидации. Этот метод должен возвращать логическое значение, указывающее, следует ли продолжать проверку или нет. -* `[[yii\base\Model::afterValidate()]]`: выполнение по умолчанию вызовет `[[yii\base\Model::EVENT_AFTER_VALIDATE]]` +* [[yii\base\Model::afterValidate()]]: выполнение по умолчанию вызовет [[yii\base\Model::EVENT_AFTER_VALIDATE]] событие. Вы можете либо переопределить этот метод или обрабатывать это событие, чтобы сделать некоторую постобработку данных(Например, отформатировать данные удобным для дальнейшей обработки образом), метод вызывается после валидации. ### Условные валидации -Для проверки атрибутов только при выполнении определенных условий, например если один атрибут зависит от значения другого атрибута можно использовать `[[yii\validators\Validator::when|when]]` свойство, чтобы определить такие условия. Например: +Для проверки атрибутов только при выполнении определенных условий, например если один атрибут зависит от значения другого атрибута можно использовать [[yii\validators\Validator::when|when]] свойство, чтобы определить такие условия. Например: ```php [ @@ -135,7 +137,7 @@ public function rules() ] ``` -Это свойство `[[yii\validators\Validator::when|when]]` принимает PHP callable функцию с следующим описанием: +Это свойство [[yii\validators\Validator::when|when]] принимает PHP callable функцию с следующим описанием: ```php /** @@ -147,7 +149,7 @@ function ($model, $attribute) ``` Если вам нужна поддержка условной проверки на стороне клиента, вы должны настроить свойство метода -`[[yii\validators\Validator::whenClient|whenClient]]` которое принимает строку, представляющую JavaScript +[[yii\validators\Validator::whenClient|whenClient]] которое принимает строку, представляющую JavaScript функцию, возвращаемое значение определяет, следует ли применять правило или нет. Например: ```php @@ -202,7 +204,7 @@ function ($model, $attribute) ``` По умолчанию входные данные считаются пустыми, если их значением является пустая строка, пустой массив или null. -Вы можете настроить значение по умолчанию с помощью свойства `[[yii\validators\Validator::isEmpty]]` +Вы можете настроить значение по умолчанию с помощью свойства [[yii\validators\Validator::isEmpty]] используя анонимную функцию. Например: ```php @@ -214,7 +216,7 @@ function ($model, $attribute) ``` > Примечание: большинство валидаторов не обрабатывает пустые входные данные, если их - `[[yii\base\Validator::skipOnEmpty]]` свойство принимает значение по умолчанию true. + [[yii\base\Validator::skipOnEmpty]] свойство принимает значение по умолчанию true. Они просто будут пропущены во время проверки, если связанные с ними атрибуты являются пустыми. Среди [основных валидаторов](tutorial-core-validators.md), только `captcha`, `default`, `filter`, `required`, и `trim` будут обрабатывать пустые входные данные. @@ -225,7 +227,7 @@ function ($model, $attribute) Иногда вам нужно сделать специальную валидацию для значений, которые не связаны с какой-либо модели. Если необходимо выполнить только один тип проверки (например, проверка адреса электронной почты), -вы можете вызвать метод `[[yii\validators\Validator::validate()|validate()]]` нужного валидатора. +вы можете вызвать метод [[yii\validators\Validator::validate()|validate()]] нужного валидатора. Например: ```php @@ -243,7 +245,7 @@ if ($validator->validate($email, $error)) { [unique](tutorial-core-validators.md#unique) валидатор, который предназначен для работы с моделью. Если необходимо выполнить несколько проверок в отношении нескольких значений, -вы можете использовать `[[yii\base\DynamicModel]]`, который поддерживает объявление, как +вы можете использовать [[yii\base\DynamicModel]], который поддерживает объявление, как атрибутов так и правил " на лету". Его использование выглядит следующим образом: ```php @@ -262,9 +264,9 @@ public function actionSearch($name, $email) } ``` -Метод `[[yii\base\DynamicModel::validateData()]]` создает экземпляр `DynamicModel`, определяет +Метод [[yii\base\DynamicModel::validateData()]] создает экземпляр `DynamicModel`, определяет атрибуты, используя приведенные данные (`name` и `email` в этом примере), и затем вызывает -`[[yii\base\Model::validate()]]` +[[yii\base\Model::validate()]] с данными правилами. Кроме того, вы можете использовать следующий "классический" синтаксис для выполнения специальной проверки данных: @@ -285,8 +287,8 @@ public function actionSearch($name, $email) } ``` После валидации, вы можете проверить успешность выполнения вызвав -метод `[[yii\base\DynamicModel::hasErrors()|hasErrors()]]` и затем получить ошибки проверки вызвав -метод `[[yii\base\DynamicModel::errors|errors]]` как это делают нормальные модели. +метод [[yii\base\DynamicModel::hasErrors()|hasErrors()]] и затем получить ошибки проверки вызвав +метод [[yii\base\DynamicModel::errors|errors]] как это делают нормальные модели. Вы можете также получить доступ к динамическим атрибутам, определенным через экземпляр модели, например, `$model->name` и `$model->email`. @@ -310,7 +312,7 @@ public function actionSearch($name, $email) function ($attribute, $params) ``` -Если атрибут не прошел проверку, метод/функция должна вызвать `[[yii\base\Model::addError()]]`, +Если атрибут не прошел проверку, метод/функция должна вызвать [[yii\base\Model::addError()]], чтобы сохранить сообщение об ошибке в модели, для того чтобы позже можно было получить сообщение об ошибке для представления конечным пользователям. @@ -351,7 +353,7 @@ class MyForm extends Model > Примечание: по умолчанию, встроенные валидаторы не будет применяться, если связанные с ними атрибуты получат пустые входные данные, или если они уже не смогли пройти некоторые правила валидации. Если вы хотите, чтобы, что правило применялось всегда, вы можете настроить свойства -`[[yii\validators\Validator::skipOnEmpty|skipOnEmpty]]` и/или `[[yii\validators\Validator::skipOnError|skipOnError]]` +[[yii\validators\Validator::skipOnEmpty|skipOnEmpty]] и/или [[yii\validators\Validator::skipOnError|skipOnError]] свойства false в правиле объявления. Например: > > ```php @@ -363,10 +365,10 @@ class MyForm extends Model ### Автономные валидаторы -Автономный валидатор - это класс, расширяющий `[[yii\validators\Validator]]` или его дочерних класс. +Автономный валидатор - это класс, расширяющий [[yii\validators\Validator]] или его дочерних класс. Вы можете реализовать свою логику проверки путем переопределения метода -`[[yii\validators\Validator::validateAttribute()]]`. Если атрибут не прошел проверку, вызвать -`[[yii\base\Model::addError()]]`, +[[yii\validators\Validator::validateAttribute()]]. Если атрибут не прошел проверку, вызвать +[[yii\base\Model::addError()]], чтобы сохранить сообщение об ошибке в модели, как это делают [встроенные валидаторы](#inline-validators). Например: ```php @@ -386,8 +388,8 @@ class CountryValidator extends Validator ``` Если вы хотите, чтобы ваш валидатор поддерживал проверку значений, без модели, также необходимо переопределить -`[[yii\validators\Validator::validate()]]`. Вы можете также -переопределить `[[yii\validators\Validator::validateValue()]]` +[[yii\validators\Validator::validate()]]. Вы можете также +переопределить [[yii\validators\Validator::validateValue()]] вместо `validateAttribute()` и `validate()`, потому что по умолчанию последние два метода реализуются путем вызова `validateValue()`. @@ -402,14 +404,14 @@ class CountryValidator extends Validator > Информация: Проверка на стороне клиента желательна, но необязательна. Её основная цель заключается в предоставлении пользователям более удобного интерфейса. Так как входные данные, поступают от конечных пользователей, вы никогда не должны доверять верификации на стороне клиента. По этой причине, вы всегда -должны выполнять верификацию на стороне сервера путем вызова `[[yii\base\Model::validate()]]`, +должны выполнять верификацию на стороне сервера путем вызова [[yii\base\Model::validate()]], как описано в предыдущих пунктах. ### Использование валидации на стороне клиента Многие [основные валидаторы](tutorial-core-validators.md) поддерживают проверку на стороне клиента out-of-the-box. -Все, что вам нужно сделать, это просто использовать `[[yii\widgets\ActiveForm]]` для построения HTML-форм. +Все, что вам нужно сделать, это просто использовать [[yii\widgets\ActiveForm]] для построения HTML-форм. Например, `LoginForm` ниже объявляет два правила: один использует [required](tutorial-core-validators.md#required) основные валидаторы, который поддерживается на стороне клиента и сервера; другой использует `validatePassword` @@ -460,21 +462,21 @@ HTML-форма построена с помощью следующего код ``` -Класс `[[yii\widgets\ActiveForm]]` будет читать правила проверки заявленные в модели и генерировать +Класс [[yii\widgets\ActiveForm]] будет читать правила проверки заявленные в модели и генерировать соответствующий код JavaScript для валидаторов, которые поддерживают проверку на стороне клиента. Когда пользователь изменяет значение поля ввода или отправляет форму, JavaScript на стороне клиента будет срабатывать и проверять введенные данные. Если вы хотите отключить проверку на стороне клиента полностью, вы можете настроить свойство -`[[yii\widgets\ActiveForm::enableClientValidation]]` установив значение false. Вы также можете отключить +[[yii\widgets\ActiveForm::enableClientValidation]] установив значение false. Вы также можете отключить проверку на стороне клиента отдельных полей ввода, настроив их с помощью свойства -`[[yii\widgets\ActiveField::enableClientValidation]]` установив значение false. +[[yii\widgets\ActiveField::enableClientValidation]] установив значение false. ### Реализация проверки на стороне клиента Чтобы создать валидатор, который поддерживает проверку на стороне клиента, вы должны реализовать метод -`[[yii\validators\Validator::clientValidateAttribute()]]` возвращающий фрагмент кода JavaScript, +[[yii\validators\Validator::clientValidateAttribute()]] возвращающий фрагмент кода JavaScript, который выполняет проверку на стороне клиента. В JavaScript-коде, вы можете использовать следующие предопределенные переменные: - `attribute`: имя атрибута для проверки. @@ -617,18 +619,33 @@ JS; Это вызовет AJAX-запрос в фоновом режиме, чтобы проверить логин пользователя, сохраняя при этом валидацию на стороне клиента. Выполняя её перед запросом к серверу. -Чтобы включить AJAX-валидацию для всей формы, Вы должны свойство -`[[yii\widgets\ActiveForm::enableAjaxValidation]]` выбрать как `true` и указать `id` формы: +Чтобы включить AJAX-валидацию для одного поля, Вы должны свойство [[yii\widgets\ActiveField::enableAjaxValidation|enableAjaxValidation]] выбрать как `true` и указать уникальный `id` формы: ```php - 'contact-form', - 'enableAjaxValidation' => true, -]); ?> +use yii\widgets\ActiveForm; + +$form = ActiveForm::begin([ + 'id' => 'registration-form', +]); + +echo $form->field($model, 'username', ['enableAjaxValidation' => true]); + +// ... + +ActiveForm::end(); ``` -Вы можете также включить AJAX валидацию или выключать для отдельных полей ввода, настроив их -с помощью свойства `[[yii\widgets\ActiveField::enableAjaxValidation]]`. +Чтобы включить AJAX-валидацию для всей формы, Вы должны свойство +[[yii\widgets\ActiveForm::enableAjaxValidation|enableAjaxValidation]] выбрать как `true` для формы: + +```php +$form = yii\widgets\ActiveForm::begin([ + 'id' => 'contact-form', + 'enableAjaxValidation' => true, +]); +``` + +> Примечание: В случае, если свойство `enableAjaxValidation` указано и у поля и у формы, первый вариант будет иметь приоритет. Также необходимо подготовить сервер для обработки AJAX-запросов валидации. Это может быть достигнуто с помощью следующего фрагмента кода, в контроллере действий: