Encodera

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

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

Оглавление

Шаблоны

Шаблон — файл с разметкой 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() заменяет символы разметки безопасными: < превращается в &lt;. Текст, содержащий тег, покажется на странице как текст, а не выполнится:

<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() каждое значение.

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

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