Шаблон представляет собой обычный HTML-файл, но помимо обычных тэгов, он также должен содержать специальные отметки для контента.
Я решил сделать это в следующем стиле:
<html>
<head>
<title>Заголовок окна</title>
</head>
<body>
<h1>Добро пожаловать!</h1>
<hr />
<!--Контент-->
<php:Content>
<!--//Контент-->
<hr />
Это пример простого шаблона<br />
Обычный HTML, ничего особенного..
<body>
</html>
Как видите, это обычный HTML-код, однако в 9
строке расположен тэг <php:Content>
, именно в этом месте должен будет появиться в результате указанный контент.
Здесь хотелось бы отметить, что строка <php:Content>
в принципе может быть любой, однако, для большего удобства, я сделал обязательным наличие <php:>
, другими словами, синтаксис определения блока контента следующий:
<php:ИмяБлока>
За счет этого, в одном шаблоне может находиться сколько угодно блоков контента.
Перейдем к классу, который будет всем этим делом управлять. По задумке, класс должен принимать следующие параметры:
<title></title>
)Это минимум, но, конечно же, количество параметров можно запросто увеличить.
Помимо этого, класс также должен склеивать полученные данные воедино и выводить клиенту.
Это немного похоже на MasterPage в ASP.NET.
Но, пожалуй, перейдем к делу, а точнее к телу класса:
<?
/*
Модуль управления шаблонами
Автор: Немиро Алексей
04 марта 2007 года
mailto:admin@kbyte.ru
Copyright (c) Nemiro AS, 2007
*/
class templateController {
public $content; // для хранения контента
public $templateName; // имя файла шаблона
public $errorMessage; // сообщение об ошибке
public $title; // заголовок <title></tile>
// инициализация
function templateController() {
$content = array();
$templateName = "";
$errorMessage = "";
$title = "";
}
// вывод данных
function Fill() {
// загрузка шаблона
$result = file_get_contents($this->templateName);
if (!$result) {
$errorMessage = "<span style="color: Red">
Ошибка: Файл шаблона
<strong>".$this->templateName."</strong>
не найден.</span><br />";
return $errorMessage;
} else {
// ищем <title></title>
$titleTemplate = "(<title>(.*)</title>)|(<TITLE>(.*)</TITLE>)|(<Title>(.*)</Title>)";
if (ereg($titleTemplate, $result, $ss)) {
if ($this->title != NULL) {
$newTitle = $this->title;
$result = ereg_replace($titleTemplate, "<title>$newTitle</title>", $result);
}
}
// поиск и замена блоков контента самим контентом
while ($s = current($this->content)) {
$result = str_replace("<php:".key($this->content).">", $s, $result);
next($this->content);
}
echo $result;
}
}
}
?>
В 18 строке происходит инициализация класса.
В 26 строке функция, которая получает указанный файл шаблона, загружает его, вставляет контент и возвращает результат.
Загрузка файла шаблона происходит в 28 строке, далее 39 строке производится поиск в загруженном шаблоне тегов <title></title>
, и если переменная класса $title
имеет значение отличное от NULL
, то в 42 строке, <title></title>
шаблона меняется на указанный в переменной $title
текст.
Далее, в 48 строке производится поиск блоков контента.
Для определения блоков контента используется ассоциативный массив $content
.
Затем, в 53 строке функция выводит полученный результат.
Сохраните этот класс в отдельном файле, например templateController.php
.
Теперь попробуем все это дело применить в работе.
Первым делом нужно создать файл шаблона, назовем его masterPage.html
, он будет содержать один блок контента - MainContent
:
Файл masterPage.html
<html>
<head>
<title>Заголовок окна</title>
</head>
<body>
<h1>Добро пожаловать!</h1>
<hr />
<!--Контент-->
<php:MainContent>
<!--//Контент-->
<hr />
Это пример простого шаблона<br />
Обычный HTML, ничего особенного..
<body>
</html>
Файл index.php
<?
// присоединяем класс управления шаблонами
require "./templateController.php";
// создаем экземпляр класса управления шаблонами
$master = new templateController();
// указываем новый файл шаблона
$master->templateName = "./masterPage.html";
// указываем контент для блока MainContent
$master->content["MainContent"] = "
<h1>Привет!</h1>n
Это пример работы с шаблонами<br /><br />
Все просто, не правда ли!";
// указываем <title></title>
$master->title = "Это просто ТЕСТ";
// выводим результат
$master->Fill();
?>
В 3 строке в файл index.php
включается файл templateController.php
, в 6 строке инициализируется новый экземпляр класса templateController
, а в 9 строке указывается файл шаблона masterPage.html
.
Далее, в 12 строке формируется контент для блока <php:MainContent>
в файле masterPage.html
, в 18 строке указывается новый заголовок страницы, а затем, в 21 строке выводится готовый html.
Вот, собственно, и все!
Как видите, ничего сложно в этом нет, при этом количество блоков контента может быть любым, также как и файл шаблона!
Собственно, можно даже использовать несколько файлов шаблонов на одной странице, либо использовать данный класс не только для работы с HTML-шаблонами, но и с другими видами шаблонов, тут все уже зависит от вашей фантазии ;)
Удачи!
Алексей Немиро
2007-03-04