Во всех движках, в которых контент подключается к шаблону сайта, появляется проблема тайтла. Дело в том, что страницы сайта отличаются не только контентами, но и тайтлами. При этом тайтл в коде находится совсем в другом месте.
Поэтому помимо вставки контента, нашему движку нужно указать место для вставки тайтла. Придумаем соответствующую команду для этого:
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<header>
header
</header>
<main>
{{ content }}
</main>
<header>
footer
</header>
</body>
</html>
Давайте теперь рассмотрим варианты, как можно хранить и получать тайтлы страниц.
Тайтлы в массиве
Сделаем теперь файл, в котором в виде массива будем хранить урлы страниц и соответствующие им тайтлы:
<?php
return [
'/page1' => 'page 1 title',
'/dir/page2' => 'page 2 title',
'/dir/sub/page3' => 'page 3 title',
];
?>
На странице index.php
получим массив
тайтлов в переменную:
<?php
$titles = require 'titles.php';
?>
Получим тайтл запрошенной страницы:
<?php
$title = $titles[$url];
?>
Заменим в файле шаблона соответствующую команду на наш тайтл:
<?php
$layout = str_replace('{{ title }}', $title, $layout);
?>
Реализуйте в вашем движке тайтлы, хранящиеся в массиве.
Тайтлы в контенте
Гораздо удобнее хранить тайтл странице в том же месте, где ее контент. Для этого в файле контента можно придумать какую-нибудь команду, задающую файл этой страницы.
Например, можно сделать вот так:
{{ title: "page 1 title" }}
<div>
content 1
</div>
Давайте сделаем так, чтобы движок перед вставкой контента извлекал из него тайтл и вставлял его в соответствующее место шаблона.
Для начала получим тайтл из текста контента:
<?php
preg_match('#{{ title: "(.+?)" }}#', $content, $match);
$title = match[1];
?>
А теперь в тексте контента удалим не нужную больше команду, чтобы она не попала в текст страницы:
<?php
$content = preg_replace('#{{ title: "(.+?)" }}#', '', $content);
?>
Реализуйте в вашем движке тайтлы, хранящиеся в контенте страницы.