Говоримо "Привіт" ================= В даному розділі розглянемо як створити нову сторінку з надписом "Привіт". У процесі вирішення задачі ви створите [дію контролера](structure-controllers.md#creating-actions) і [представлення](structure-views.md): * Додаток опрацює запит і передасть управління відповідній дії, * а дія, у свою чергу, відобразить представлення з надписом "Привіт" кінцевому користувачу. В даному керівництві ви дізнаєтесь як: 1. створити [дію](structure-controllers.md#creating-actions), яка буде відповідати на запити; 2. створити [представлення](structure-views.md), щоб скомпонувати вміст відповіді; 3. додаток відправляє запити до [дії](structure-controllers.md#creating-actions). Створення дії ------------- Для нашої задачі знадобиться [дія](structure-controllers.md#creating-actions) `say`, яка зчитує параметр `message` із запиту і відображає його значення користувачу. Якщо в запиті відсутній параметр `message`, то дія буде відображати "Привіт". > Info: [Дії](structure-controllers.md#creating-actions) являються об’єктами, на які користувач може посилатись для виконання. Дії згруповані в [контролери](structure-controllers.md). Результатом виконання дії є відповідь, яку отримує користувач. Дії повинні оголошуватись в [контролерах](structure-controllers.md). Для простоти, ви можете оголосити дію `say` в уже наявному контролері `SiteController`, який визначений у файлі класу `controllers/SiteController.php`: ```php render('say', ['message' => $message]); } } ``` В наведеному коді дія `say` визначена як метод `actionSay` в класі `SiteController`. Yii використовує префікс `action` для того, щоб відрізняти методи-дії від звичайних методів у класі контролеру. Назва після префікса `action` вважається ідентифікатором відповідної дії. Коли черга доходить до іменування дій, слід розуміти як Yii поводиться з ідентифікаторами дій. Ідентифікатори дій можуть бути лише в нижньому регістрі. Якщо ідентифікатор складається з декількох слів, вони з’єднуються дефісами (наприклад, `create-comment`). Імена методів дій отримуються шляхом видалення дефісів з ідентифікатора, перетворення першої літери кожного слова у верхній регістр і додавання префікса `action`. Наприклад, ідентифікатор дії `create-comment` відповідає методу `actionCreateComment`. Метод дії у нашому прикладі приймає параметр `$message`, який за замовчуванням визначено як `"Привіт"` (так само, як ви звикли визначати значення за замовчуванням для аргументів функції у PHP). Коли додаток отримує запит і визначає, що дія `say` відповідає за його опрацювання, додаток призначає цьому параметру значення однойменного параметра із запиту. Іншими словами, якщо запит містить параметр `message` зі значенням `"До побачення"`, то змінній `$message` всередині дії буде призначено це значення. Всередині метода дії, для відображення [представлення](structure-views.md) з ім’ям `say`, використовується метод [[yii\web\Controller::render()|render()]]. Для того, щоб вивести повідомлення, у представлення передається параметр `message`. Результат формування повертається методом дії. Цей результат приймається додатком та відображається кінцевому користувачу в браузері (як частина цілої HTML-сторінки). Створення представлення ----------------------- [Представлення](structure-views.md) є скриптами, які використовуються для генерування вмісту відповіді. Для нашого додатку ви створите представлення `say`, яке буде виводити параметр `message`, отриманий із методу дії: ```php ``` Представлення `say` мусить бути збережено у файлі `views/site/say.php`. Коли метод [[yii\web\Controller::render()|render()]] викликається в дії, він буде шукати PHP-файл з ім’ям виду `views/ControllerID/ViewName.php`. Варто зазначити, що у вищезазначеному коді параметр `message` [[yii\helpers\Html::encode()|екранується для HTML]] перед відображенням. Це обов’язково, бо параметр приходить від користувача, котрий може спробувати провести [XSS атаку](http://uk.wikipedia.org/wiki/%D0%9C%D1%96%D0%B6%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2%D0%B8%D0%B9_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D1%96%D0%BD%D0%B3), шляхом вставки небезпечного JavaScript кода. Ви можете доповнити представлення `say` HTML-тегами, текстом або кодом PHP. Фактично, представлення `say` є простим PHP-скриптом, який виконується методом [[yii\web\Controller::render()|render()]]. Вміст, який формується скриптом представлення, буде передано додатком користувачу. Спробуємо --------- Після створення дії і представлення, ви можете перейти на нову сторінку по наступному URL: ``` http://hostname/index.php?r=site%2Fsay&message=Привіт+світ ``` ![Привіт, світ](images/start-hello-world.png) Буде відображена сторінка з надписом "Привіт світ". Вона використовує ту ж шапку та футер, що і решта сторінок додатка. Якщо ви не вкажете параметр `message` в URL, то побачите на сторінці лише "Привіт". Це відбувається тому, що `message` передається як параметр в метод `actionSay()`, а коли він не вказаний, використовується значення за замовчуванням "Привіт". > Info: Нова сторінка використовує ту ж шапку та футер, що й решта сторінок, тому що метод [[yii\web\Controller::render()|render()]] автоматично підставляє результат формування представлення `say` в, так званий, [макет](structure-views.md#layouts), який в даному випадку розміщено у `views/layouts/main.php`. Параметр `r` у вищезазначеному URL потребує додаткових пояснень. Він вказує [маршрут](runtime-routing.md), що являє собою унікальний для додатка ідентифікатор, який вказує на дію. Його формат `ControllerID/ActionID`. Коли додаток отримує запит, він перевіряє цей параметр і, використовуючи частину `ControllerID`, визначає який контролер слід використовувати для опрацювання запиту. Потім, контролер використовує частину `ActionID`, щоб визначити яку дію використовувати для виконання реальної роботи. В нашому випадку маршрут `site/say` буде відповідати контролеру `SiteController` і його дії `say`. В результаті, для опрацювання запиту буде викликано метод `SiteController::actionSay()`. > Info: Як і дії, контролери також мають ідентифікатори, котрі однозначно визначають їх в додатку. Ідентифікатори контролерів використовують ті ж самі правила іменування, що і ідентифікатори дій. Імена класів контролерів отримуються шляхом видалення дефісів з ідентифікатора, перетворення першої літери кожного слова у верхній регістр і додавання в кінець слова `Controller`. Наприклад, ідентифікатор контролера `post-comment` відповідає імені класу контролера `PostCommentController`. Підсумок -------- В даному розділі ви торкнулися таких частин шаблону проектування MVC як контролери та представлення. Ви створили дію, як частину контролера, для опрацювання специфічного запиту. А також ви створили представлення для формування вмісту відповіді. В цьому процесі ніяк не використовувалась модель, оскільки в ролі даних виступає тільки простий параметр `message`. Також ви ознайомились із концепцією маршрутизації, котра є сполучною ланкою між запитом користувача і дією контролера. В наступному розділі ви дізнаєтесь як створити модель та додати нову сторінку з HTML-формою.