Робота з формами ================ В даному розділі ми обговоримо отримання даних від користувачів. На сторінці буде розміщена форма з полями, де можна буде вказати ім’я та email. Отримані дані будуть зображені на сторінці для їх підтвердження. Для того, щоб досягти дану ціль, крім створення [дії](structure-controllers.md) і двох [представлень](structure-views.md) ви створите [модель](structure-models.md). В даному керівництві ви дізнаєтесь: * Як створити [модель](structure-models.md) для даних, вказаних користувачем * Як оголосити правила перевірки введених даних * Як створити HTML форму в [представленні](structure-views.md) Створення моделі ---------------- Створіть клас моделі `EntryForm` та збережіть у файлі `models/EntryForm.php` як показано нижче. Він буде використовуватись для зберігання даних, введених користувачем. Детальніше про присвоєння імен файлам класів читайте в розділі [Автозавантаження класів](concept-autoloading.md). ```php Інформація: Клас [[yii\base\Model]] використовується як батьківський клас для класів моделей, які *не* асоційовані з таблицями бази даних. Клас [[yii\db\ActiveRecord]] зазвичай є батьківським для класів моделей, що відповідають таблицям бази даних. Клас містить 2 публічні властивості `name` і `email`, які використовуються для зберігання даних, вказаних користувачем. Він також містить метод `rules()`, який повертає набір правил перевірки даних. Правила перевірки, оголошені в коді вище означають наступне: * Поля `name` і `email` обов’язкові для заповнення * Поле `email` повино містити правильну адресу email Якщо об’єкт `EntryForm` заповнений даними користувача, то для їх перевірки ви можете викликати метод [[yii\base\Model::validate()|validate()]]. У випадку невдалої перевірки властивість [[yii\base\Model::hasErrors|hasErrors]] дорівнюватиме `true`. За допомогою [[yii\base\Model::getErrors|errors]] можна дізнатись, які саме виникли помилки. ```php name = 'Qiang'; $model->email = 'bad'; if ($model->validate()) { // Good! } else { // Failure! // Use $model->getErrors() } ``` Створення дії ------------- Далі створіть дію `entry` в контролері `site`, точно так, як ви робили це раніше. Процес створення та використання дій описано у розділі [Говоримо «Привіт»](start-hello.md). ```php load(Yii::$app->request->post()) && $model->validate()) { // дані в $model успішно перевірені // робимо щось корисне з $model ... return $this->render('entry-confirm', ['model' => $model]); } else { // або сторінка відображається вперше, або ж є помилка в даних return $this->render('entry', ['model' => $model]); } } } ``` Подія створює об’єкт `EntryForm`. Потім вона намагається заповнити модель даними із масива `$_POST`, доступ до якого забеспечує Yii за допомогою [[yii\web\Request::post()]]. Якщо модель успішно заповнена, тобто користувач відправив дані з HTML форми, то для перевірки даних буде викликаний метод [[yii\base\Model::validate()|validate()]]. > Інформація: `Yii::$app` являє собою глобально доступний екземпляр-одинак [додатка](structure-applications.md) (singleton). Одночасно це є [Service Locator](concept-service-locator.md), який надає доступ до компонентів, типу `request`, `response`, `db` і так далі. В коді выще для доступу до даних з `$_POST` був використаний компонент `request`. Якщо все гаразд, подія зобразить представлення `entry-confirm`, яке покаже користувачу вказані ним дані. В іншому випадку буде зображено представлення `entry`, яке містить HTML форму і помилки перевірки даних, якщо вони є. > Примітка: У цьому дуже простому прикладі ми просто відобразили сторінку підтвердження відправки даних. На практиці, ви повинні розглянути використання [[yii\web\Controller::refresh()|refresh()]] або [[yii\web\Controller::redirect()|redirect()]] для уникнення [проблеми повторного відправлення даних форми](http://en.wikipedia.org/wiki/Post/Redirect/Get). Створення представлення ----------------------- На завершення, створюємо два представлення з іменами `entry-confirm` і `entry`, котрі зображаються дією `entry` з минулого підрозділу. Представлення `entry-confirm` просто зображає ім’я та email. Воно мусить бути збережене у файлі `views/site/entry-confirm.php`. ```php
Ви вказали наступну інформацію: