Свинцовый пепелац

Модифицированная версия PHP шаблонизатора HTML_Template_IT

30 декабря 2014

Вступление

HTML_Template_IT из пакета PEAR был первым шаблонизатором для PHP с которым я познакомился на заре своей веб-мастерской деятельности. HTML_Template_IT - простой в использовании и достаточно легкий для сервера класс, работа которого основана на парсинге шаблона при помощи регулярных выражений с генерацией результирующей страницы «на лету». Самое замечательное что при всей своей простоте этот шаблонизатор отлично подходит как для малых так и для больших проектов.

Сейчас я понимаю, что функционала которым обладает данный класс для его комфортного использования в проектах вполне достаточно, но в свое время я был уверен в обратном. Многие навороченные шаблонизаторы (например Smarty и Twig) позволяют заниматься прямо таки программированием в шаблоне (поддерживаются IF-ы, разнообразные FOR-ы,  LOOP-ы и прочее, вплоть до вставки в шаблон фрагментов исполняемого PHP кода). Это зачастую так усложняет структуру шаблона, что потом в нем разобраться сложнее чем в программной части. Таким образом сводятся на нет преимущества полученные от разделения логики (PHP) от отображения (HTML).

Итак, поработав с некоторым количеством других шаблонизаторов (вплоть до нативных) я сознательно вернулся к использованию HTML_Template_IT. Единственное чего мне в нем не хватало, так это возможности вызова из шаблона функций (или методов классов). Кто-то скажет что это излишество, но мне этот функционал был необходим для проекта над которым я в тот момент работал. Вот я и взялся за некоторую переделку этого класса чтобы, кроме прочего, добавить и этот функционал.

Расскажу о проделанных мной модификациях класса HTML_Template_IT подробнее.

PEAR больше не нужен

Изначально для работы HTML_Template_IT требуется наличия PEAR, который, как оказалось, используется только для обработки возникших при парсинге шаблона ошибок. Ликвидировать эту зависимость оказалось не сложно, но, справедливости ради, отмечу что эту идею я подсмотрел здесь. Так что теперь PEAR для работы шаблонизатора не требуется, а ошибки передаются в функцию trigger_error, которая генерирует warning сообщение пользовательского уровня (error_type = E_USER_WARNING).

Новый синтаксис разметки в шаблоне «плейсхолдеров» (переменных), блоков и прочего

Мне никогда не нравились обозначения выбранные авторами этого шаблонизатора для маркировки в шаблоне «плейсхолдеров», блоков и прочего, поэтому я переделал их на манер XHTML тегов (см. таблицу соответствия новых обозначений старым).

  Вариант HTML_Template_IT 1.3.0 Модернизированный вариант
Замешаемая строка
(переменная)
{varName}
<y:varName />
Блок
<!-- BEGIN blockName -->
... контент блока ...
<!-- END blockName -->
<y:blockName>
... контент блока ...
</y:blockName>
Включение содержимого
файла в код шаблона
<!-- INCLUDE someTmpl.html -->
<y:include src="someTmpl.html" />

Теперь разметка шаблона адекватнее воспринимается и глазом и текстовыми редакторами с подсветкой синтаксиса.

Пример использования шаблонизатора

HTML (templates/main.tpl.html):

<html>
  <head>
    <title><y:pageTitle /></title>
  </head>
  <body>
    <table border="1">
      <y:row>
        <tr>
          <y:cell>
            <td><y:data /></td>
          </y:cell>
        </tr>
      </y:row>
    </table>
  </body>
</html>

PHP:

 <?php
  // массив с демо данными
  $data = array(
    array("Иванов", "Иван", 5),
    array("Петров", "Пётр", 2),
    array("Сидоров", "Андрей", 4)
  );

  require_once "IT.php"; // подключение скрипта

  $tpl = new HTML_Template_IT("templates"); // запуск класса шаблонизатора с указанием директории в которой находятся шаблоны
  $tpl->loadTemplatefile("main.tpl.html"); // какой шаблон (файл) использовать

  $tpl->setVariable("pageTitle", "Пример");

  foreach($data as $name) {
    foreach($name as $cell) {
      // назначение данных для внутреннего блока
      $tpl->setCurrentBlock("cell");
      $tpl->setVariable("data", $cell);
      $tpl->parseCurrentBlock("cell"); // парсинг внутреннего блока
    }
    $tpl->parse("row"); // парсинг внешнего блока
  }
  $tpl->show(); // вывод результирующей страницы на экран
?>

Результат:

<html>
  <head>
    <title>Пример</title>
  </head>
  <body>
    <table border="1">
      <tr>
        <td>Иванов</td>
        <td>Иван</td>
        <td>5</td>
      </tr>
      <tr>
        <td>Петров</td>
        <td>Пётр</td>
        <td>2</td>
      </tr>
      <tr>
        <td>Сидоров</td>
        <td>Андрей</td>
        <td>4</td>
      </tr>
    </table>
  </body>
</html>

Теперь из шаблона можно вызвать функцию или метод класса

Конечно было бы неразумно позволить вызывать из шаблона любую функцию или метод, поэтому список разрешенных к вызову из шаблона функций/методов должен определятся в программной части (PHP). Для этих целей я добавил классу шаблонизатора метод setFunction(), которому массивом вида array("fncAlias" => "fncName") передаются имена функций (методов классов) которые позволено вызывать из шаблона (fncAlias - псевдоним для функции/метода, по которому она будет вызываться в шаблоне; fncName - имя функции/метода. Имена функций/методов можно задавать по одному (одномерным массивом) или сразу по несколько имён (двумерный массив). Естественно, эти функции/методы должны быть доступны глобально.

При вызове из шаблона функций/методов класса им можно передавать параметры. При этом, у тэга параметра в атрибуте val прописывается передаваемое значение, а в атрибуте type можно указать тип значения. Атрибут type является НЕ обязательным, и в случае если он не указан значение трактуется как строка (string). Поддерживаются следующие типы значений атрибута type: integer, int, boolean, bool, string, float, double, real, array

PHP:

 <?php
  require_once "IT.php"; // подключение скрипта

  $tpl = new HTML_Template_IT("templates"); // запуск класса шаблонизатора с указанием директории в которой находятся шаблоны
  $tpl->loadTemplatefile("main.tpl.html"); // какой шаблон (файл) использовать

  $tpl->setFunction(array("getTime" => "time"));
  $tpl->setFunction(array("getDate" => "date"));

  $tpl->show(); // вывод результирующей страницы на экран
?>

HTML (templates/main.tpl.html):

<html>
  <head>
    <title></title>
  </head>
  <body>

    <!-- вызов функции без передачи параметров - вариант записи 1 -->
    <y:f name="getTime" />

    <!-- вызов функции без передачи параметров - вариант записи 2 -->
    <y:f name="getTime"></y:f>

    <!-- вызов функции с передачей параметров -->
    <y:f name="getDate">
      <y:p val="d.m.Y / H:i" type="string">
    </y:f>

  </body>
</html>

Что еще нужно знать для работы с HTML_Template_IT

Имена «плейсхолдеров» (переменных в шаблоне) могут состоять из заглавных или строчных букв латинского алфавита, цифр, символа подчеркивания, точки и тире (минус).

Имена функций методов могут содержать символы допустимые в PHP для названия функции, а также символов $_->: для обозначения статичных и нестатичных методов.

Дополнительная информация

Для доработки был взят HTML_Template_IT версии 1.3.0

Напоследок

К статье приложен архив, содержащий более развёрнутый пример использования описанного шаблонизатора, более подробно иллюстрирующий возможности класса.

Прикреплённые файлы

  • IT-[edited-by-lead-pepelats].zip (11.07 Кб)
    Описание: Архив с примером использования модифицированной версии шаблонизатора HTML_Template_IT из пакета PEAR
    Тип: Архив ZIP
    Добавлен: 30 декабря 2014
    Скачиваний: 10

Написать комментарий

Имя:
e-mail
(НЕ обязателен, НЕ публикуется на сайте):
Сообщение:
Прикрепить изображение (не более 5 Мб):