Макет
Макет — общая рамка всех страниц: тег html, шапка, меню, подвал. Шаблон действия содержит только свою часть, а Laminas вставляет её в макет. Так шапку меняют в одном файле, а не на каждой странице.
Где лежит макет
В заготовке макет находится в модуле Application: module/Application/view/layout/layout.phtml. Его имя — layout/layout — записано в настройках этого модуля, в разделе view_manager:
// module/Application/config/module.config.php
'view_manager' => [
'template_map' => [
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
],
],template_map — таблица «имя шаблона — файл». Laminas по умолчанию берёт макет с именем layout/layout.
Простой макет
Макет заготовки использует библиотеку Bootstrap и довольно длинный. Замените его содержимое коротким вариантом:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<?= $this->headTitle('Блог')->setSeparator(' — ') ?>
<?= $this->headLink()->prependStylesheet($this->basePath('css/style.css')) ?>
</head>
<body>
<header>
<a href="<?= $this->url('home') ?>">Главная</a>
<a href="<?= $this->url('blog') ?>">Статьи</a>
</header>
<main><?= $this->content ?></main>
<footer>Блог на Laminas</footer>
</body>
</html>Главная строка — $this->content: сюда подставляется готовый HTML шаблона действия. Его не экранируют. Откройте /blog — список статей окажется между шапкой и подвалом.
Заголовок окна
Помощник headTitle() собирает заголовок по частям. Добавьте в начало шаблона module/Blog/view/blog/post/index.phtml строку:
<!-- module/Blog/view/blog/post/index.phtml -->
<?php $this->headTitle('Статьи'); ?>Шаблон действия выполняется раньше макета, поэтому на вкладке браузера появится «Статьи — Блог».
Переменные для макета
Из действия в макет данные передают через помощник layout():
public function indexAction()
{
$this->layout()->setVariable('section', 'blog');
return new ViewModel(['heading' => 'Статьи']);
}В макете значение доступно как $this->section — например, чтобы подсветить текущий пункт меню.
Другой макет
Для раздела с другим оформлением создайте второй файл, например module/Blog/view/layout/admin.phtml, и выберите его в действии:
$this->layout('layout/admin');Файл найдётся через template_path_stack модуля Blog.
Без макета
Иногда нужен только фрагмент HTML — например, для подгрузки через JavaScript. Тогда макет отключают:
$view = new ViewModel(['posts' => $posts]);
$view->setTerminal(true);
return $view;Ответ будет содержать только шаблон действия.
Частая ошибка
Если удалить из макета строку <?= $this->content ?>, все страницы сайта станут одинаковыми: шапка и подвал есть, а содержимого нет, и ошибки при этом не будет. При правке макета следите, чтобы эта строка осталась ровно одна.