Я использую шаблон фронт-контроллера на основе PHP, так что index.php
предоставляет структуру страницы и шаблон, а все содержимое каждой страницы находится во включаемых файлах в /pages/
,
index.php
/pages/home.inc
/pages/about.inc
/pages/contact.inc
Включаемые страницы в основном представляют собой простой HTML-код, поэтому клиенты могут редактировать страницы, не прибегая к слишком сложным вещам.
Проблема с этим макетом заключается в том, что, поскольку вся информация о странице на странице включает в себя, <title>
элемент не может быть заполнен Я мог бы поставить $title
переменные в каждом включают, но загружаются после головы, что слишком поздно:
<html>
<head>
<title><?php echo $title; ?></title> #$title is not set yet!
</head>
<body>
<?php include($content); ?> #now $title is set
</body>
</html>
Важно, чтобы файлы содержимого были автономными и в основном были HTML, но, как я уже говорил, с возможностью иметь и PHP-код, потому что клиенты будут модифицировать их и добавлять слишком много сложности, это проблема. Так, например, настройка отдельной базы данных заголовков страниц не будет работать, потому что клиенты не будут обновлять базу данных при создании новых страниц.
Редактировать: типичная страница включения может выглядеть следующим образом.
<h1>Welcome</h1>
<p>blah</p>
<?php include("nav.php"); ?>
<p>more blah</p>
<p>more blah</p>
<p>more blah</p>
<?php
$pageJavascript = "alert('js!');";
$pageTitle = "Cyberdyne Welcome Page";
?>
Опции:
<?php
ob_start();
include($content);
$body = ob_get_contents();
ob_end_clean();
?>
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
<?php echo $body; ?>
</body>
</html>
Pros:
Cons:
<script type="text/javascript">
with(document) {
window.title = <?php echo json_encode($title); ?>;
}
</script>
Pros:
Cons:
Если есть предположение, заголовок всегда находится в первой строке:
«Заголовок моей страницы»;
$filename = '/pages/home.inc';
$fileLines = file($filename, FILE_SKIP_EMPTY_LINES);
$title = yourFunctionThatStripsKomma($fileLines[0]);
Плохо только то, что вы должны быть уверены, что первая строка имеет заголовок.