Шаблоны
Шаблон (в Yii его называют видом, view) — файл с разметкой страницы. Он отделяет HTML от кода контроллера. Особого языка шаблонов в Yii нет: это обычный файл PHP, где разметка перемежается короткими вставками кода.
Где лежит шаблон
Шаблоны хранятся в папке views, у каждого контроллера своя подпапка с его именем из маршрута: шаблоны PostController — в views/post. Создайте вручную папку и файл views/post/index.php:
<!-- views/post/index.php -->
<h1>Статьи</h1>
<p>Здесь будет список статей.</p>Вывод шаблона
Действие вызывает метод render() с именем файла без расширения:
// controllers/PostController.php
public function actionIndex(): string
{
return $this->render('index');
}Откройте /posts — заголовок «Статьи» появится внутри общего оформления сайта с шапкой и подвалом. Это оформление называется макетом, о нём следующий урок.
Передача данных
Данные передают вторым аргументом render() — массивом:
public function actionIndex(): string
{
$posts = [
['id' => 1, 'title' => 'Первая статья'],
['id' => 2, 'title' => 'Вторая статья'],
];
return $this->render('index', ['posts' => $posts]);
}Ключи массива становятся переменными шаблона: ключ posts — переменной $posts.
<?php
// views/post/index.php
use yii\helpers\Html;
$this->title = 'Статьи';
?>
<h1><?= Html::encode($this->title) ?></h1>
<?php if ($posts === []): ?>
<p>Статей пока нет.</p>
<?php else: ?>
<ul>
<?php foreach ($posts as $post): ?>
<li><?= Html::a(Html::encode($post['title']), ['post/view', 'id' => $post['id']]) ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>На странице появится список из двух ссылок на /posts/1 и /posts/2. Переменная $this в шаблоне — объект вида; значение $this->title макет выводит в заголовке вкладки браузера. Html::a() создаёт ссылку по маршруту.
Экранирование
Html::encode() заменяет символы <, > и & безопасными обозначениями, чтобы текст не превратился в разметку. Через неё выводят всё, что ввёл пользователь или что пришло из базы данных.
Части шаблонов
Повторяющийся фрагмент выносят в отдельный файл, его имя принято начинать с подчёркивания. Создайте views/post/_card.php:
<?php
// views/post/_card.php
use yii\helpers\Html;
?>
<article>
<h2><?= Html::encode($post['title']) ?></h2>
</article>В основном шаблоне фрагмент вставляют так: <?= $this->render('_card', ['post' => $post]) ?>. Здесь render() вызывается у вида и возвращает разметку без макета.
Частая ошибка
Запись <?= $post['title'] ?> выводит значение как есть. Если в заголовке окажется тег <script>, он выполнится в браузере посетителя. Yii не экранирует вывод сам — оборачивайте в Html::encode() каждое значение, которое не является готовой разметкой.