Шаблоны в MVC на PHP

Представления, которые мы с вами изучали в предыдущем уроке, на самом представляют собой контент страницы. Кроме контента, на странице, как правило, есть еще хедер, сайдбары, футер. Эти части обычно одинаковые на всех страницах сайта.

В нашем фреймворке каждая страница сайта представляет собой один и тот же HTML файл шаблона, к которому для каждой страницы сайта подключается в заданное место контент страницы из представления.

Файл с шаблоном размещается по следующему пути: /project/layouts/default.php.

Согласно правилам фреймворка, в этом файле доступна переменная $content. В том месте, где будет выведена эта переменная и произойдет вставка контента страницы.

По умолчанию этот файл содержит следующий простейший код:

<!DOCTYPE html> <html> <head> <title></title> </head> <body> <?= $content ?> </body> </html>

Разместите в файле с шаблоном вот такой макет сайта:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>тайтл страницы</title> </head> <body> <header> хедер сайта </header> <div class="container"> <aside class="sidebar left"> левый сайдбар </aside> <main> <?= $content ?> </main> <aside class="sidebar right"> правый сайдбар </aside> </div> <footer> футер сайта </footer> </body> </html>

Зайдите на любое действие любого контроллера. Посмотрите, что поменялось.

Тайтл страницы

В файле шаблона также доступна переменная $title, содержащая тайтл страницы. Очевидно, что этот заголовок также будет разным для различных страниц. Давайте используем эту переменную по назначению:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title><?= $title ?></title> <!-- выводим тайтл страницы --> </head> <body> ... </body> </html>

Для того, чтобы задать тайтл для определенного представления необходимо в контроллере записать его в свойство title:

<?php namespace Project\Controllers; use Core\Controller; class Test extends Controller { public function act() { //!! Зададим тайтл: $this->title = 'Действие act контроллера test'; // Отрендерим представление, передав какие-то данные: return $this->render('test/act', [ 'var1' => 'eee', 'var2' => 'bbb', 'var3' => 'kkk', ]); } } ?>

Модифицируйте файл шаблона и все ваши контроллеры так, чтобы для каждого представления выводился свой тайтл.

Пусть в контроллере Page дан следующий массив:

<?php $this->pages = [ 1 => ['title'=>'страница 1', 'text'=>'текст страницы 1'], 2 => ['title'=>'страница 2', 'text'=>'текст страницы 2'], 3 => ['title'=>'страница 3', 'text'=>'текст страницы 3'], ]; ?>

Сделайте действие show, которое будет выводить заданную страницу. Пусть в представлении текст страницы из ключа 'text' будет обернут в абзац, а текст из ключа 'title' станет тайтлом страницы.