Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Шаблоны

Шаблон (в 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() каждое значение, которое не является готовой разметкой.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.