Простейший шаблонизатор на PHP

Февраль 17, 2008

Что такое шаблонизатор?

Шаблонизатор — ПО, которое помогает отделить логику приложения от его отображения. Еще вернее — код, который генерирует html-страницу из двух частей:
1. Общий шаблон.
2. Сгенерированный контент.

Для различных задач используются различные типы шаблонизаторов: от простых, не поддерживающих логику, до шаблонизаторов типа Smarty.

Я использую 2 шаблонизатора — один простой, для генерации разовых html-сайтов и один более мощный. Оба они — самописные.
Начнем с простого — возьмем любой html-шаблон и «распотрошим» его.

<html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Title of site</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<link href="http://www.site.ru/css/style.css" rel="stylesheet" type="text/css" />
</head>

<body>
<p id="header">

<a href="{http_folder}" title="Name of your Company">
<img src="images/logo.jpg" alt="Illusty web" />
</a>
</html>
<h1>Your slogan here...</h1>

Вставим нужные фрагменты мета-языка (громкое название обычных меток). Получим что-то вроде

<html>
{doctype}
<html>
<head>
	<title>{title}</title>
	<meta http-equiv="Content-Type" content="text/html; charset={charset}" />
	<link href="{http_root}css/style.css" rel="stylesheet" type="text/css" />
</head>
<body>

<p id="header">
<a href="{http_folder}" title="{site_name}">
<img src="images/logo.jpg" alt="{site_name}" />
</a>
<h1>{site_slogan}</h1>
</html>

Таким образом мы сделали большой шаг вперед — отделили логику представления от кода. Для окончательного «вывода» в нормальный вид нам нужен скрипт-шаблонизатор. Выглядит он примерно так:

<?php
class html_generator
{public $manual_configs;
 public $template;
 public $buffer;

 function __construct()
 {
 }

 public function load_template($type, $name)
 {$this->buffer = file_get_contents('../../sys/templates/'.$type.'/'.$name);
 }
 public function mount_vars($arr)
 {foreach ($arr as $parameter=>$value)
  { $this->buffer = str_replace('{'.$parameter.'}',$value,$this->buffer);
  }
 }
}
?>

Массив $configs выглядит так:

<?php
 ### META ###
 $configs['site_name']		= 'Имя сайта';
 $configs['site_slogan']		= 'Слоган сайта';
 $configs['doctype']		= ''; // не будем вписывать doctype;
?>

Вызов шаблонизатора будет выглядеть вот так:

<?php
$generator = new html_generator();
$generator->load_template('pages','index.html');
$generator->mount_vars($configs);
?>

Не стоит забывать, что это только макет — описание принципа построения простейшего шаблонизатора. Как обычно — стоит его докручивать и писать под свои нужды. В первую очередь — для простых проектов, куда не нужны мощности таких монстров как Smarty.

4 комментариев на “Простейший шаблонизатор на PHP”

  1. Оптимизатор высказал:

    Пишите побольше статей для начинающих :)

  2. RazoR Empire высказал:

    расскажите о своём мощном шаблонизаторе!

  3. Jeurey высказал:

    Оптимизатор, к сожалению, у меня нет дара объяснять все с нуля. Имхо, написание качественного кода определяет, по дефолту, минимальные знания у пользователей, на которые я и ориентируюсь.

    Razor Empire, обязательно выложу в ближайшие дни пример усложненного шаблонизатора. Не скажу, что он на 100% крутой, но сложнее чем этот.

    К тому же, приведу ссылки на блог моего знакомого — он написал с десяток шаблонизаторов, которые постоянно развиваются. Он, посмотрев на комментарии, обещал заняться блогом, начав с шаблонизаторов для PHP :)

  4. Фильм высказал:

    пасиб за инфу )