Aleksey Nemiro's curriculum vitae

PHP: Шаблоны – это несложно!

Шаблон

Шаблон представляет собой обычный 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:ИмяБлока>

За счет этого, в одном шаблоне может находиться сколько угодно блоков контента.

Класс управления шаблонами

Перейдем к классу, который будет всем этим делом управлять. По задумке, класс должен принимать следующие параметры:

Это минимум, но, конечно же, количество параметров можно запросто увеличить.

Помимо этого, класс также должен склеивать полученные данные воедино и выводить клиенту.

Это немного похоже на 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