Шаблоны
Шаблон — файл с разметкой HTML, в который подставляются данные из контроллера. В CakePHP шаблоны пишут на обычном PHP, отдельного языка шаблонов нет.
Где лежат
Шаблоны находятся в папке templates в корне проекта. У каждого контроллера своя подпапка, у каждого действия свой файл:
| Действие | Файл шаблона |
|---|---|
ArticlesController::index() | templates/Articles/index.php |
ArticlesController::view() | templates/Articles/view.php |
ArticlesController::add() | templates/Articles/add.php |
Файлы создают вручную или командой bin/cake bake template Articles, когда таблица уже есть в базе.
Простой шаблон
Действие передаёт переменную:
// src/Controller/ArticlesController.php
public function index(): void
{
$this->set('title', 'Статьи');
}Шаблон templates/Articles/index.php её выводит:
<h1><?= h($title) ?></h1>Запись <?= ... ?> — короткая форма echo. По адресу /articles появится заголовок «Статьи».
Экранирование
Функция h() заменяет символы разметки безопасными: < превращается в <. Текст, содержащий тег, покажется на странице как текст, а не выполнится:
<p><?= h($comment) ?></p>Через h() выводят всё, что пришло от посетителя или из базы данных.
Список
Передадим из действия массив:
$this->set('articles', ['Первая статья', 'Вторая статья']);<ul>
<?php foreach ($articles as $article): ?>
<li><?= h($article) ?></li>
<?php endforeach; ?>
</ul>В шаблонах используют запись циклов с двоеточием и endforeach — её легче читать среди тегов. На странице появится список из двух пунктов.
Условие
<div>
<?php if (empty($articles)): ?>
<p>Статей пока нет.</p>
<?php else: ?>
<p>Статей: <?= count($articles) ?></p>
<?php endif; ?>
</div>При пустом массиве посетитель увидит «Статей пока нет».
Другой шаблон
Действие может вывести шаблон с другим именем:
public function latest()
{
$this->set('articles', ['Свежая статья']);
return $this->render('index');
}render('index') берёт файл templates/Articles/index.php вместо latest.php — два действия пользуются одним шаблоном.
Частая ошибка
Запись <?= $title ?> без h() выводит значение как есть: если в заголовке статьи окажется тег <script>, он выполнится в браузере каждого посетителя. CakePHP не экранирует вывод сам — оборачивайте в h() каждое значение.