Commit 0e18fbf8 by Alexander Makarov

Adjusted Russian translation of forms guide section

parent 707b0a55
Работа с формами Работа с формами
================== ================
В данном разделе мы обсудим как вести работу с формами, чтобы получать данные от пользователя. В данном разделе мы обсудим получение данных от пользователя. На странице будет располагаться форма с полями для ввода
На странице будет располагаться форма с полями для имени и Email. имени и email. Полученные данные будут показаны на странице для их подтверждения.
После получения этих данных от пользователя, они будут показаны на странице для подтверждения.
Чтобы достичь это цели, помимо создания [действия](structure-controllers.md) и двух [представлений](structure-views.md), Чтобы достичь этой цели, помимо создания [действия](structure-controllers.md) и двух [представлений](structure-views.md)
также необходимо создать [модель](structure-models.md). вы создадите [модель](structure-models.md).
В данном руководстве вы изучите В данном руководстве вы изучите:
* Как создавать [модель](structure-models.md), чтобы представлять данные, введенные пользователем; * Как создать [модель](structure-models.md) для данных, введённых пользователем;
* Как объявлять правила, чтобы проверять введенные данные; * Как объявить правила проверки введённых данных;
* Как создавать HTML форму в [представлении](structure-views.md). * Как создать HTML форму в [представлении](structure-views.md).
Создание Модели <a name="creating-model"></a> Создание модели <a name="creating-model"></a>
---------------- ---------------------------------------------
Для представления данных, введенных пользователем, создайте класс модели `EntryForm` как показано ниже и В файле `models/EntryForm.php` создайте класс модели `EntryForm` как показано ниже. Он будет использоваться для
сохраните класс в файле `models/EntryForm.php`. Пожалуйста, ознакомьтесь с разделом [Автозагрузка классов](concept-autoloading.md) хранения данных, введённых пользователем. Подробно о именовании файлов классов читайте в разделе
для большей информации о соглашении именования файлов классов. «[Автозагрузка классов](concept-autoloading.md)».
```php ```php
<?php <?php
...@@ -44,26 +43,25 @@ class EntryForm extends Model ...@@ -44,26 +43,25 @@ class EntryForm extends Model
} }
``` ```
Класс расширяет базовый класс [[yii\base\Model]], который является частью фреймворка и обычно используется Данный класс расширяет класс [[yii\base\Model]], который является частью фреймворка и обычно используется для работы
для представления форм данных. с данными форм.
Класс содержит 2 публичных свойства `name` и `email`, которые используются для хранения Класс содержит 2 публичных свойства `name` и `email`, которые используются для хранения данных, введённых пользователем.
данных, введенных пользователем. Он также содержит метод `rules()`, который возвращает набор правил, Он также содержит метод `rules()`, который возвращает набор правил проверки данных. Правила, объявленные в коде выше
используемых для проверки данных. Правила проверки, объявленные выше, устанавливают что означают следующее:
* оба `name` и `email` обязательны для заполнения; * Поля `name` и `email` обязательны для заполнения;
* свойство `email` должно быть Email адресом в допустимом формате. * В поле `email` должен быть правильный адрес email.
Если объект `EntryForm` заполнен данными, введенными пользователем, вы можете вызвать метод Если объект `EntryForm` заполнен пользовательскими данными, то для их проверки вы можете вызвать метод
[[yii\base\Model::validate()|validate()]], чтобы запустить проверку данных. В случае неудачной [[yii\base\Model::validate()|validate()]]. В случае неудачной проверки свойство [[yii\base\Model::hasErrors|hasErrors]]
проверки свойство [[yii\base\Model::hasErrors|hasErrors]] станет равным `true`, и с помощью [[yii\base\Model::getErrors|errors]] станет равным `true`. С помощью [[yii\base\Model::getErrors|errors]] можно узнать, какие именно ошибки возникли.
вы можете узнать какие ошибки возникли в процессе проверки.
Создание Действия <a name="creating-action"></a> Создание действия <a name="creating-action"></a>
------------------ ------------------------------------------------
Далее, создайте действие `entry` в контроллере `site`, как описывалось ранее. Далее создайте действие `entry` в контроллере `site`, точно так же, как вы делали это ранее.
```php ```php
<?php <?php
...@@ -83,13 +81,13 @@ class SiteController extends Controller ...@@ -83,13 +81,13 @@ class SiteController extends Controller
$model = new EntryForm; $model = new EntryForm;
if ($model->load(Yii::$app->request->post()) && $model->validate()) { if ($model->load(Yii::$app->request->post()) && $model->validate()) {
// допустимые данные в $model // данные в $model удачно проверены
// сделать что-то значимое с $model ... // делаем что-то полезное с $model ...
return $this->render('entry-confirm', ['model' => $model]); return $this->render('entry-confirm', ['model' => $model]);
} else { } else {
// отобразить начальную страницу, либо возникли ошибки при проверке данных // либо стнаница отображается первый раз, либо есть ошибка в данных
return $this->render('entry', ['model' => $model]); return $this->render('entry', ['model' => $model]);
} }
} }
...@@ -97,23 +95,26 @@ class SiteController extends Controller ...@@ -97,23 +95,26 @@ class SiteController extends Controller
``` ```
Действие создает объект `EntryForm`. Затем оно пытается заполнить модель данными из массива `$_POST`, доступ Действие создает объект `EntryForm`. Затем оно пытается заполнить модель данными из массива `$_POST`, доступ
к которому обеспечивает Yii при помощи [[yii\web\Request::post()]]. Если модель успешно заполнена, то есть пользователь отправил данные из HTML формы, к которому обеспечивает Yii при помощи [[yii\web\Request::post()]]. Если модель успешно заполнена, то есть пользователь
то будет вызван метод [[yii\base\Model::validate()|validate()]], чтобы удостовериться в корректности введенных данных. отправил данные из HTML формы, то для проверки данных будет вызван метод [[yii\base\Model::validate()|validate()]].
Если все в порядке, действие отобразит представление `entry-confirm` для подтверждения пользователем верности введенных данных. Если всё в порядке, действие отобразит представление `entry-confirm`, которое показывает пользователю введенные им данные.
Иначе, будет отображено представление `entry`, которое содержит HTML форму вместе с ошибками проверки данных, если таковые есть. В противном случае будет отображено представление `entry`, которое содержит HTML форму и ошибки проверки данных, если
они есть.
> Информация: Выражение `Yii::$app` представляет экземпляр [приложения](structure-applications.md), который реализует паттерн "Одиночка" (Singleton) и доступен глобально. > Информация: `Yii::$app` представляет собой глобально доступный экземпляр-одиночку
Это также и [Service Locator](concept-service-locator.md), дающий доступ к компонентам вроде `request`, `response`, `db` и так далее, чтобы поддерживать конкретный функционал. [приложения](structure-applications.md) (singleton). Одновременно это [Service Locator](concept-service-locator.md),
В коде выше был использован компонент `request` для доступа к данным из `$_POST`. дающий доступ к компонентам вроде `request`, `response`, `db` и так далее. В коде выше для доступа к данным из `$_POST`
был использован компонент `request`.
Создание Представления <a name="creating-views"></a> Создание представления <a name="creating-views"></a>
-------------- ----------------------------------------------------
В заключение, создаем два представления с именами `entry-confirm` и `entry`, которые отображаются действием `entry` из предыдущего подраздела. В заключение, создаём два представления с именами `entry-confirm` и `entry`, которые отображаются действием `entry` из
предыдущего подраздела.
Представление `entry-confirm` просто отображает имя и Email. Оно должно быть сохранено в файле `views/site/entry-confirm.php`. Представление `entry-confirm` просто отображает имя и email. Оно должно быть сохранено в файле `views/site/entry-confirm.php`.
```php ```php
<?php <?php
...@@ -147,58 +148,65 @@ use yii\widgets\ActiveForm; ...@@ -147,58 +148,65 @@ use yii\widgets\ActiveForm;
<?php ActiveForm::end(); ?> <?php ActiveForm::end(); ?>
``` ```
Представление использует мощный [виджет](structure-widgets.md) [[yii\widgets\ActiveForm|ActiveForm]], Для построения HTML формы представление использует мощный [виджет](structure-widgets.md) [[yii\widgets\ActiveForm|ActiveForm]].
чтобы построить HTML форму. Методы `begin()` и `end()` отображают открывающий и закрывающий форму теги, соответственно. Методы `begin()` и `end()` выводят открывающий и закрывающий теги формы. Между этими вызовами создаются поля ввода при
Между двумя этими вызовами создаются поля ввода с помощью метода [[yii\widgets\ActiveForm::field()|field()]]. помощи метода [[yii\widgets\ActiveForm::field()|field()]]. Первым идёт поле для "name", вторым — для "email".
Первое поле для "name", а второе для "email" данных. После полей вызывается метод [[yii\helpers\Html::submitButton()]] для генерации кнопки отправки данных. Далее для генерации кнопки отправки данных вызывается метод [[yii\helpers\Html::submitButton()]].
Попробуем <a name="trying-it-out"></a> Попробуем <a name="trying-it-out"></a>
------------- --------------------------------------
Чтобы увидеть это в работе, используйте браузер, чтобы перейти по следующему URL: Чтобы увидеть всё созданное в работе, откройте в браузере следующий URL:
``` ```
http://hostname/index.php?r=site/entry http://hostname/index.php?r=site/entry
``` ```
Вы увидите страницу с формой и двумя полями для ввода. Перед каждым полем соответствующая надпись указывает какую информацию следует вводить. Вы увидите страницу с формой и двумя полями для ввода. Перед каждым полем имеется подпись, которая указывает, какую
Если вы кликните на кнопку отправки без ввода данных, или если вы введете Email в неверном формате, вы увидите сообщение с ошибкой под каждым проблемным полем. информацию следует вводить. Если вы нажмёте на кнопку отправки без ввода данных или если вы введете email в неверном
формате, вы увидите сообщение с ошибкой рядом с каждым проблемным полем.
![Form with Validation Errors](images/start-form-validation.png) ![Форма с ошибками](images/start-form-validation.png)
После ввода верных данных и их отправки, вы увидите страницу с данными, которые вы только что ввели. После ввода верных данных и их отправки, вы увидите страницу с данными, которые вы только что ввели.
![Confirmation of Data Entry](images/start-entry-confirmation.png) ![Подтверждение введённых данных](images/start-entry-confirmation.png)
### Объяснение "магии" <a name="magic-explained"></a> ### Как работает вся эта «магия» <a name="magic-explained"></a>
Вы можете удивиться как HTML форма работает внутри, так как кажется совершенно волшебным то, как она умеет отображает подписи к полям Вы, скорее всего, задаётесь вопросом о том, как же эта HTML форма работает на самом деле. Весь процесс может показаться
и отображать ошибки проверки данных, если вы ввели что-то некорректное, без перезагрузки страницы. немного волшебным: то как показываются подписи к полям, ошибки проверки данных при некорректном вводе и то что всё это
происходит без перезагрузки страницы.
Да, проверка данных на самом деле проходит на стороне клиента с помощью JavaScript точно также как и на стороне сервера. Да, проверка данных на самом деле происходит и на стороне клиента при помощи JavaScript и на стороне сервера.
[[yii\widgets\ActiveForm]] достаточно умен, чтобы извлечь правила проверки, которые вы объявили в `EntryForm`, преобразовать из в JavaScript код и использовать JavaScript для проведения проверок. [[yii\widgets\ActiveForm]] достаточно продуман, чтобы взять правила проверки, которые вы объявили в `EntryForm`,
В случае, когда вы отключаете JavaScript в вашем браузере, проверка будет проводится на стороне сервера как показано в методе `actionEntry()`. Это дает уверенность в том, что данные корректны при любых обстоятельствах. преобразовать их в JavaScript код и использовать его для проведения проверок. На случай отключения JavaScript в браузере
валидация проводится и на стороне сервера как показано в методе `actionEntry()`. Это даёт уверенность в том, что данные
корректны при любых обстоятельствах.
Подписи для полей генерируются методом `field()`, основываясь на именах свойств модели. Например, надпись `Name` генерируется для свойства `name`. Подписи для полей генерируются методом `field()`, на основе имён свойств модели. Например, подпись `Name` генерируется
Вы можете модифицировать подписи следующим образом: для свойства `name`. Вы можете модифицировать подписи следующим образом:
```php ```php
<?= $form->field($model, 'name')->label('Ваше имя') ?> <?= $form->field($model, 'name')->label('Ваше имя') ?>
<?= $form->field($model, 'email')->label('Ваш Email') ?> <?= $form->field($model, 'email')->label('Ваш Email') ?>
``` ```
> Информация: Yii дает возможность использовать подобные виджеты, чтобы обеспечить быстрое построение сложных и динамичных представлений. > Информация: В Yii есть множество виджетов, позволяющих быстро строить сложные и динамичные представления.
Как вы узнаете позже, написание новых виджетов также крайне простое действие. Вы можете переложить многое из кода представления в виджеты, чтобы использовать это в других местах и упростить разработку в будущем. Как вы узнаете позже, разрабатывать новые виджеты очень просто. Многое из представлений можно вынести в виджеты, чтобы
использовать это повторно в других местах и упростить тем самым разработку в будущем.
Резюме <a name="summary"></a> Резюме <a name="summary"></a>
------- -----------------------------
В данном разделе вы затронули каждую часть из паттерна MVC. Вы изучили как создавать классы моделей для представления и проверки пользовательских данных. В данном разделе вы попробовали каждую часть шаблона проектирования MVC. Вы изучили как создавать классы моделей
для обработки и проверки пользовательских данных.
Вы, также, изучили как получать данные от пользователя и как отображать их обратно. Это задача, которая может занять у вас много времени в процессе разработки приложения. Yii позволяет использовать мощные виджеты, Также, вы изучили как получать данные от пользователя и как показать данные пользователю. Это задача может занимать в
чтобы сделать эти задачи максимально простыми. процессе разработки значительное время. Yii предоставляет мощные виджеты, которые делают задачу максимально простой.
В следующем разделе вы изучите как работать с базами данных, что требуется в большинстве приложений.
В следующем разделе вы изучите как работать с базами данных, которые требуются в большинстве приложений.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment