Реализация шаблонов на PHP
Вступление.
Добрый день уважаемые господа! В данной статье я хотел бы затронуть очень важную тему, а именно шаблоны в PHP. В этой статье я приведу простой, но работающий пример "шаблонов", также мы рассмотрим все за и против использования шаблонов.
Использование шаблонов.
Прежде чем использовать шаблоны, подумайте, действительно ли они вам так нужны? В данный момент существует огромное количество коммерческих вариантов шаблонов. Все они работают по одному принципу (значение, замена), но имеют огромное количество наворотов, таких как автоматическое изменения регистра переменных, поиск по регулярным выражениям и т.д., все это конечно хорошо и легко реализуемо. Когда я решил посмотреть "коммерческий" шаблон, я ужаснулся, один его класс весил 398 КБ. Это нормально? Также в сети можно найти множество бесплатных вариантов шаблонов (классы шаблонов в PHPBB, IPB:), но все они много весят и работают не слишком быстро. Я предлагаю вам простой каркас "шаблонов" на PHP, с его помощью можно сделать свой классный шаблонизатор, со всеми необходимыми вам функциями.
За и против.
Приведу вам жизненный пример, не так давно я занимался разработкой программы для одного человека, заранее было обговорено, что я пишу программу, а дизайн это его дело. Через некоторое время, мой заказчик пишет мне, что дизайн для моей программы сделать невозможно. Конечно, человек ничего не знающий в web-программировании будет испытывать огромные затруднения, при построении дизайна в PHP-программе. Главная задача 'шаблонов' - это облегчить жизнь дизайнеру. Безусловно, главным плюсом использования шаблонов можно считать то, что дизайнер без помощи программиста сможет изменять свой web-проект. Также мне нравится само разделение - программа и дизайн.
Я не использую шаблоны в своих личных проектах, т.к. они дают дополнительную "нагрузку". Шаблоны это хорошо, но использовать их надо только если пишешь какой, то публичный проект или выполняешь работу на заказ.
Реализация шаблонов на PHP.
И так приступим. Всего у нас будет 2 ключевых файла.
- 1) file2compile.tpl – файл который мы будем парсить
- 2) template.php – главный файл содержащий класс шаблонов
Листинг файла file2compile.tpl:
<html> <head>{TITLE}</head> <body bgcolor={BGCOLOR}> {SOMETPLTAGS} </body> </html>
Листинг файла template.php:
<?php class parse_class { var $vars = array(); var $template; function get_tpl($tpl_name) { if(empty($tpl_name) || !file_exists($tpl_name)) { return false; } else { $this->template = file_get_contents($tpl_name); } } function set_tpl($key,$var) { $this->vars[$key] = $var; } function tpl_parse() { foreach($this->vars as $find => $replace) { $this->template = str_replace($find, $replace, $this->template); } } } $parse = new parse_class; ?>
Теперь я подробно опишу содержание этих двух файлов.
Файл: file2compile.tpl
Тут приведен обычный HTML код. В данном файле можно найти переменные вида {TITLE}. Это как раз именно те переменные которые мы будем заменять на нужное нам значение.
Файл: template.php
Мы имеем PHP класс, разделенный на 3 функции. В самом начале файла мы объявляем классовые переменные.
- $vars – массив со значениями (переменная, замена).
- $template – файл который мы будем парсить.
Теперь перейдем к описанию функций.
Функция: get_tpl
В качестве аргумента функция принимает имя файла. В теле функции мы проверяем задан ли аргумент и существует ли файл. Если аргумент не задан и файл не существует мы возвращаем значение FALSE. В противном случае мы заполняем классовую переменную(template) содержанием файла.
Функция set_tpl
Функция принимает 2 значения, это переменная (напр. {TITLE)} и значение на которое мы будем ее заменять.
Функция tpl_parse
Функция не принимает никаких значений. В теле функции мы считывает массив $vars и производим замену установленных переменных на заданные значения.
Использование класса.
Для вывода на экран используйте следующие команды:
<?php require('template.php'); // Подключаем файл с классом $parse->get_tpl('template.tpl'); //Файл который мы будем парсить $parse->set_tpl('{TITLE}','Супер сайт'); //Установка переменной {TITLE} $parse->set_tpl('{BGCOLOR}','#F2F2F2'); //Установка переменной { BGCOLOR } $parse->set_tpl('{SOMETPLTAGS}','<font color=red>Это текст обрамленый красным цветом</font>'); //Установка переменной {SOMETPLTAGS} $parse->tpl_parse(); //Парсим print $parse->template; //Выводим нашу страничку ?>
Заключение.
Надеюсь, моя статья поможет вам лучше понять, что такое шаблоны.
Оставить комментарий
Комментарии
Для более продвинутой работы следует уточнить :
1. str_replace для большого HTML-файла будет жутко тормозить, ведь каждый раз(сколько "переменных" столько и раз) будет происходить поиск строки $find с самого начала HTML-файла
2. Предложенный вариант в комментариях require($template); весьма удобен, но как быть, если этот шаблон нужно использовать несколько раз(например, это шаблон "плитки" видео которых на странице 30 или больше)?
3. Регулярные выражения использовать нежелательно, тормоза обеспечены.
4. Идеального варианта нет, я написал свой парсер(тормоза при больших HTML-файлах) :
- вместо "переменных" - "макросы" которые состоят из инструкций(знакомые с ассемблером поймут)
- можно задавать переменные и выводить значения других
- можно вызывать методы у расширений(у классов)
- список инструкций можно дополнять
- есть контроль длины, количества и соответствия типов операндов
выглядит это всё вот так :
HTML-код
<~
set |digVar|, '25';
set |strVar|, 'i\'am almost ';
set |anyVar|, |strVar|, |digVar|, 'yr. old';
write |anyVar|;
~>
HTML-код
Но, как я уже сказал, это тоже тормозит.
Нет идеального решения, есть решение подходящие под конкретные нужды.
Хочу сказать, что статья довольно актуальная и неплохо написана, все чётко и понятно, а если Вы ничего не понимаете в php, то лучше перечитайте ещё раз, а не спешите закидать статью плохими отзывами...
<html>
<head></head>
<body>
<?php echo $content; ?>
</body>
</html>
не легче сделать чтото такое?
<code php>
<?php
function theme($template, $data) {
foreach ($data as $key => $value) {
${$key} = $value;
}
require($template);
}
$data = array('content' => 'azazazaza');
theme('test.tpl.php', $data);
?>
</code>
$title = '[TITLE]';
$Btitle = 'Использование шаблонов.';
$descr = '[DESCR]';
$Bdescr = 'Прежде чем использовать шаблоны, подумайте, действительно ли они вам так нужны?';
$homepage = file_get_contents('template/main.tpl');
$template = str_replace($title, $Btitle, $homepage);
$template = str_replace($descr, $Bdescr, $template);
echo $template;
?>
Да, Смарти это достаточно удобно, там есть свои IF, FOREACH, etc.
Но это опять уже получается программинг. Т.е. простому верстальщику просто так не всунешь в руки Смарти и не скажешь "Сверстай сюда",.. Потому что потом за это дело всё равно возмется ПХП-программер, который будет расставлять ПХП...
Я не вижу причин критиковать эту статью (пусть она и написана в бородатом 2006 году), потому что она позволяет ПОНЯТЬ принцип работы шаблонизатора и потом перейти к Смарти, Codeigniter и т.д...
Лично мне очень пригодилась! Спасибо автору!
Хотелось бы узнать про реализацию динамичного вывода контента..
Smarty, может и отсутствовать у хостера.
$parse->get_tpl('template.tpl'); //Файл который мы будем парсить
file2compile.tpl – файл который мы будем парсить
Начиная от детсадовских предпосылок "шаблон нужен для облегчения жизни дизайнера" и "шаблоны создают нагрузку" и заканчивая полной неприспособленностью этой недоделки к реальной жизни.
Автору надо годика три поработать программистом, чтобы начать понимать, что такое шаблоны и зачем они нужны.
а не статьи писать.
А сайту codenet.ru должно быть просто стыдно выкладывать такие поделки.
Если в шаблоне изначально заложено то, что HTML код пишется в коде скрипта, то это не шаблон, а профанация.
Я уже в пятый раз отвечаю на вопросы несчастных читаталей этой статьи - а как им вывести с помощью этого "шаблона" таблицу? Причем читатели, в отличие от автора, понимают, что в скрипте не должно быть HTML. Иначе весь смысл шаблона потеряется. А данный скрипт без этого использовать невозможно.
И не надо делать из Смарти пугало. Есть много движков и не таких монстрообразных, как Смарти. но в которых есть хотя бы обработка блоков, чтобы можно было вынести HTML из кода.
Но как мне кажется, немного не корректный!
Представим себе, что дизайнер имеет доступ только в файл file2compile.tpl
И что? Как он изменит <font color=red>, да никак!
Поэтому автор должен был бы показать file2compile.tpl так:
<html>
<head>{TITLE}</head>
<body bgcolor={BGCOLOR}>
<font color=red>{SOMETPLTAGS}</font>
</body>
</html>
а в PHP файле, строка парсинга переменной {SOMETPLTAGS}
была бы
$parse->set_tpl('{SOMETPLTAGS}','Это текст'); //Установка переменной {SOMETPLTAGS}
Кто-то может скажет, а как же {BGCOLOR}, ведь это относится к дизайну?
Отвечаю: я оставил это потому, что данные об обще-сайтовой гамме могли бы находиться в базе например, и управляться из админки.
С критикой [shaelf / 07 октября 2006, 00:42:01] частично согласен.
Почему частично? Ничего не могу сказать о Smarty ;)
Не кто не мешает убрать. К тому же в Smarty всё подключается плагинами и они легко убираются.
>>Задача была поставлена так - отделить код от дизайна, и она была выполнена.
Наверное вот этим
>>$parse->set_tpl('{SOMETPLTAGS}','<font color=red>Это текст
обрамленый красным цветом</font>'); //Установка переменной {SOMETPLTAGS}
Только тут уже HTML'om занимается программер). Более того, он задаёт внешний вид. Но это не существенно, не так ли?))
>>А Smarty - это всё же фреймворк
С этого места поподробнее прошу.
>>дизайнер должен только писать ХТМЛ
Молодой человек, Вам не смешно? С каких это пор дизайнер должен писать HTML? Мне всегда казалось, что этим занимаются верстальщики))) Нужно пересмотреть свою версию на этот счёт)
>>В смарти можно сказать так: "Смарти тот же ПХП толькос другим синтаксисом"
Конечно можно, только окуратно, а то помидоры ещё не кто не отменял). Относительно недавно разговаривал с человеком (программирует на Перле) и он мне сказал, что РНР то же самое, что и HTML. Может конечно где-то он и прав, только вот это "где-то", я найти так и не смог.
Smarty - это вообще компилируемый шаблонизатор, а это противоречит самой идеологии шаблонов: "дизайнер должен только писать ХТМЛ и ему нет дела до программинга". В смарти можно сказать так: "Смарти тот же ПХП толькос другим синтаксисом"
Статья хорошая, думаю направит начинающих по верному пути.