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