Меня многократно просили дать код шаблонизатора на PHP , которым я пользуюсь. Но прежде чем перейти к этому коду, давайте немного расскажу о наиболее популярном шаблонизаторе - Smarty . Сразу скажу, что я всегда был против всех этих чужих и огромных библиотек. Но Smarty я стерпел и некоторое время использовал, а пот...

Шаблонизатор на PHP

Меня многократно просили дать код шаблонизатора на PHP, которым я пользуюсь. Но прежде чем перейти к этому коду, давайте немного расскажу о наиболее популярном шаблонизаторе - Smarty. Сразу скажу, что я всегда был против всех этих чужих и огромных библиотек. Но Smarty я стерпел и некоторое время использовал, а потом я подумал: "А зачем мне нужна эта помойка, если от шаблонизатора мне нужен минимум функциональности?".

Действительно, а что вообще нужно от шаблонизатора? От него нужно лишь подставлять в нужные места tpl-файлов определённые переменные из PHP. Все говорят, что PHP-код в tpl-файлах - это плохо. А чем лучше Smarty-код в tpl-файлах? Да абсолютно ничем, и это даже хуже, поскольку этот Smarty-код потом преобразуется в PHP-код и выполняется.

Smarty уже так сильно разошёлся, что стал вообще отдельным языком со своим синтаксисом, со своими циклами и условиями. Разве это требуется от шаблонизатора?

Задача шаблонизатора - только подставлять определённые значения в определённые места, а все циклы я могу написать и на PHP, и промежуточный язык для этого не требуется.

Итак, привожу код своего шаблонизатора, которым я настоятельно стоит Вам пользоваться:

<?php
class Template {

  private $dir_tmpl; // Директория с tpl-файлами
  private $data = array(); // Данные для вывода

  public function __construct($dir_tmpl) {
    $this->dir_tmpl = $dir_tmpl;
  }

  /* Метод для добавления новых значений в данные для вывода */
  public function set($name, $value) {
    $this->data[$name] = $value;
  }

  /* Метод для удаления значений из данных для вывода */
  public function delete($name) {
    unset($this->data[$name]);
  }

  /* При обращении, например, к $this->title будет выводиться $this->data["title"] */
  public function __get($name) {
    if (isset($this->data[$name])) return $this->data[$name];
    return "";
  }

  /* Вывод tpl-файла, в который подставляются все данные для вывода */
  public function display($template) {
    $template = $this->dir_tmpl.$template.".tpl";
    ob_start();
    include ($template);
    echo ob_get_clean();
  }
}

?>

Всего 1 файл размером 0.5 КБ, вместо больше 100 файлов и примерно 1 МБ2000 раз больше). Но при этом всё самое важное данный класс сделает.

Теперь создадим tpl-файл (пусть называется menu.tpl), который будет без проблем обработан этим шаблонизатором:

<ul>
  <?php foreach ($this->menu as $link => $name) { ?>
    <li>
      <a href="<?=$link?>"><?=$name?></a>
    </li>
  <?php } ?>
</ul>

И, наконец, давайте напишем PHP-файл, который будет вызывать шаблонизатор:

<?php
  $template = new Template("tmpl/");
  $menu = array();
  $menu["http://site.ru"] = "Главная";
  $menu["http://site.ru/page-1.html"] = "Страница 1";
  $menu["http://site.ru/page-2.html"] = "Страница 2";
  $template->set("menu", $menu);
  $template->display("menu");
?>

Если бы мы использовали Smarty, то у нас было бы всё ровно так же, но в tpl-файле мы бы написали код Smarty, который потом бы заменялся на PHP и выполнялся. А мы же сразу написали этот PHP-код. И какой смысл учить отдельный язык, который будет лишь тормозить работу, а также требует наличие огромной библиотеки?

Надеюсь, этот материал Вам покажет, что не нужно гнаться за бессмысленной функциональностью Smarty. Всё это в гораздо большем объёме есть в PHP, а задача шаблонизатора всего лишь одна - подставлять в tpl-файлы значения, полученные из PHP. Всё.