Encodera

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

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

Оглавление

Макет

Макет — общая рамка всех страниц: тег 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 ?>, все страницы сайта станут одинаковыми: шапка и подвал есть, а содержимого нет, и ошибки при этом не будет. При правке макета следите, чтобы эта строка осталась ровно одна.

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

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