Макеты, элементы и помощники
Шапка, меню и подвал одинаковы на всех страницах. Чтобы не повторять их в каждом шаблоне, CakePHP даёт три средства: макет — общая рамка страницы, элемент — небольшой повторяющийся фрагмент, помощник — объект, который строит ссылки и теги.
Макет
Макет лежит в templates/layout/default.php и уже есть в проекте. Упростите его до такого:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title><?= h($this->fetch('title')) ?></title>
</head>
<body>
<main>
<?= $this->fetch('content') ?>
</main>
</body>
</html>fetch('content') — место, куда подставляется шаблон действия. Откройте /articles: заголовок «Статьи» теперь окружён этой рамкой.
Заголовок страницы
Шаблон действия передаёт макету значения через блоки:
<div>
<?php $this->assign('title', 'Все статьи'); ?>
<h1>Статьи</h1>
</div>assign() записывает текст в блок title, а макет выводит его вызовом fetch('title') — во вкладке браузера появится «Все статьи».
Элемент
Элементы хранятся в папке templates/element. Создайте вручную файл templates/element/nav.php:
<nav>
<?= $this->Html->link('Главная', '/') ?>
<?= $this->Html->link('Статьи', ['controller' => 'Articles', 'action' => 'index']) ?>
</nav>Подключите его в макете над тегом main:
<body>
<?= $this->element('nav') ?>Меню появится на всех страницах. Данные элементу передают вторым аргументом: $this->element('card', ['article' => $article]).
Помощник Html
Помощники доступны в любом шаблоне как $this->Имя. Html строит ссылки и подключает файлы:
| Вызов | Что создаёт |
|---|---|
$this->Html->link('Текст', ['action' => 'view', 5]) | Ссылку по маршруту |
$this->Html->image('logo.png', ['alt' => 'Логотип']) | Картинку из webroot/img |
$this->Html->css('app') | Подключение webroot/css/app.css |
$this->Html->script('app') | Подключение webroot/js/app.js |
Текст ссылки помощник экранирует сам, h() для него не нужна.
Помощник Url
Когда нужен только адрес, без тега:
<form action="<?= $this->Url->build(['controller' => 'Articles', 'action' => 'index']) ?>">
<input type="search" name="q">
</form>build() вернёт /articles. Массив тот же, что в маршрутах и в redirect().
Другой макет
Создайте templates/layout/admin.php и выберите его в действии:
$this->viewBuilder()->setLayout('admin');Страница этого действия выведется в рамке admin.php.
Частая ошибка
Ссылка, написанная строкой — <a href="/articles/view/5">, — ломается, когда меняется маршрут или сайт переезжает в подпапку. Стройте адреса помощниками Html->link() и Url->build(): они берут адрес из маршрутов и всегда дают рабочую ссылку.