Шаблоны в 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 TestController 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'
станет тайтлом страницы.