Encodera

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

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

Оглавление

Макеты, элементы и помощники

Шапка, меню и подвал одинаковы на всех страницах. Чтобы не повторять их в каждом шаблоне, 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(): они берут адрес из маршрутов и всегда дают рабочую ссылку.

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

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