Реализация шаблонов на PHP
Добрый день уважаемые господа! В данной статье я хотел бы затронуть очень важную тему, а именно шаблоны в PHP. В этой статье я приведу простой, но работающий пример «шаблонов», также мы рассмотрим все за и против использования шаблонов.
Использование шаблонов.
Прежде чем использовать шаблоны, подумайте, действительно ли они вам так нужны? В данный момент существует огромное количество коммерческих вариантов шаблонов. Все они работают по одному принципу (значение, замена), но имеют огромное количество наворотов, таких как автоматическое изменения регистра переменных, поиск по регулярным выражениям и т.д., все это конечно хорошо и легко реализуемо. Когда я решил посмотреть «коммерческий» шаблон, я ужаснулся, один его класс весил 398 КБ. Это нормально? Также в сети можно найти множество бесплатных вариантов шаблонов (классы шаблонов в PHPBB, IPB:), но все они много весят и работают не слишком быстро. Я предлагаю вам простой каркас «шаблонов» на PHP, с его помощью можно сделать свой классный шаблонизатор, со всеми необходимыми вам функциями.
За и против.
Приведу вам жизненный пример, не так давно я занимался разработкой программы для одного человека, заранее было обговорено, что я пишу программу, а дизайн это его дело. Через некоторое время, мой заказчик пишет мне, что дизайн для моей программы сделать невозможно. Конечно, человек ничего не знающий в web-программировании будет испытывать огромные затруднения, при построении дизайна в PHP-программе. Главная задача ‘шаблонов’ — это облегчить жизнь дизайнеру. Безусловно, главным плюсом использования шаблонов можно считать то, что дизайнер без помощи программиста сможет изменять свой web-проект. Также мне нравится само разделение — программа и дизайн.
Я не использую шаблоны в своих личных проектах, т.к. они дают дополнительную «нагрузку». Шаблоны это хорошо, но использовать их надо только если пишешь какой, то публичный проект или выполняешь работу на заказ.
Реализация шаблонов на PHP.
И так приступим. Всего у нас будет 2 ключевых файла.
- 1) file2compile.tpl – файл который мы будем парсить
- 2) template.php – главный файл содержащий класс шаблонов
Листинг файла file2compile.tpl:
Листинг файла template.php:
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 код. В данном файле можно найти переменные вида . Это как раз именно те переменные которые мы будем заменять на нужное нам значение.
Файл: template.php
Мы имеем PHP класс, разделенный на 3 функции. В самом начале файла мы объявляем классовые переменные.
- $vars – массив со значениями (переменная, замена).
- $template – файл который мы будем парсить.
Теперь перейдем к описанию функций.
Функция: get_tpl
В качестве аргумента функция принимает имя файла. В теле функции мы проверяем задан ли аргумент и существует ли файл. Если аргумент не задан и файл не существует мы возвращаем значение FALSE. В противном случае мы заполняем классовую переменную(template) содержанием файла.
Функция set_tpl
Функция принимает 2 значения, это переменная (напр.
Функция tpl_parse
Функция не принимает никаких значений. В теле функции мы считывает массив $vars и производим замену установленных переменных на заданные значения.
Использование класса.
Для вывода на экран используйте следующие команды:
get_tpl('template.tpl'); //Файл который мы будем парсить $parse->set_tpl('','Супер сайт'); //Установка переменной $parse->set_tpl('','#F2F2F2'); //Установка переменной < BGCOLOR >$parse->set_tpl('','Это текст обрамленый красным цветом'); //Установка переменной $parse->tpl_parse(); //Парсим print $parse->template; //Выводим нашу страничку ?>
Заключение.
Надеюсь, моя статья поможет вам лучше понять, что такое шаблоны.
Использование tpl-файлов
Сразу скажу, что я уже писал об этой теме здесь: использование tpl-файлов. Однако, не все поняли данный материал, и я решил к нему вернуться и написать всё немного по-другому. Не секрет, что любой серьёзный движок никогда не будет смешивать в своём коде HTML и PHP. Однако, HTML и PHP коды очень тесно взаимосвязаны, поэтому для того, чтобы не нарушать правила «хорошего тона», были придуманы tpl-файлы. Данные файлы служат для хранения HTML-кода с элементами шаблонов, которые подставляются в PHP-коде. Давайте подробнее разберём использование tpl-файлов с примером.
Возьмём с Вами самый элементарный пример — это панель пользователя, где есть его аватарка и приветствие по имени. Первым делом, создадим tpl-файл, и пусть он называется userpanel.tpl. Напоминаю, что это всего лишь кусок HTML-кода с элементами шаблона:
Здравствуйте, %name%!
Ничего сложного, это просто обычный HTML-код. Только вместо определённых значений стоят %элементы_шаблона%.
Теперь разберёмся с PHP-обработкой. Здесь всё будет более, чем абстрактно, но, к сожалению, по-другому никак. Главное — это понять принцип работы. И так PHP-код для обработки созданного tpl-файла:
/* Данная функция, хоть и использует буферы, но суть элементарна: вернуть содержимое файла */
function getTemplate($name) ob_start(); // Начинаем сохрание выходных данных в буфер
include ($name.».tpl»); // Отправляем в буфер содержимое файла
$text = ob_get_clean(); // Очищаем буфер и возвращаем содержимое
return $text; // Возвращение текста из файла
>
$name = «Николай»; // Извлекается из базы
$avatar = «avatars/user_15.jpg»; // Извлекается из базы
/* Начинается замена элементов шаблона на реальные данные */
$userpanel = str_replace(
array(
«%name%»,
«%avatar%»
),
array (
$name,
$avatar
),
getTemplate(«userpanel»)
);
echo $userpanel; // Выводим окончательный результат
?>
Это простейший вариант. Всё прокомментировано, поэтому вопросов по этому примеру возникнуть не должно. И по сути любая страница состоит из таких вот блоков. Ваша задача взять нужные блоки (функция getTemplate()), заменить нужными данными (функция str_replace() и данные полученные, например, из базы), а потом просто соединить все блоки, как обычные строки, и вывести всё на страницу.
Безусловно, без ООП здесь очень проблемно будет. Вы такое количество условий наплодите (страниц же много), что быстро запутаетесь. Но принцип использования tpl-файлов, надеюсь, Вы осознали. Дальше уже самостоятельно подумайте, как всё это обернуть в ООП, чтобы всё было максимально простым с точки зрения понимания кода и его сопровождения в будущем.
Создано 03.02.2012 14:22:45
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 23 ):
А здесь можно было использовать file_get_contents($name.».tpl») вместо getTemplate($name)?
Да, если Вам так удобнее. Просто я привык к буферам, в своё время с ними много работал, но file_get_contents() вполне подходит. Но я настоятельно рекомендую использовать getTemplate(), просто внутри используйте file_get_contents(). Очень часто бывают всякие повторяющиеся элементы (по типу адреса сайта), которые постоянно заменяются и их можно автоматически всегда при вызове getTemplate() сразу заменять. Это резко сокращает количество кода.
Я сделал себе обработку через getTemplate, но тогда не получается сделать включение любого модуля (например опроса, формы авторизации, отдельных файлов)без PHP. Как делать include в TPL?
Это и не нужно делать, всё должно включаться через PHP.
а к чему именно tpl? я лично использую формат файла php — разницы не вижу
Принято так. Можете использовать хоть txt, хоть вообще без расширения, результат будет тот же.
не понятно зачем делать через буфер? у Вас есть похожая статья http://myrusakov.ru/php-use-tpl.html но все без буфера, не могли бы Вы пояснить почему здесь буфер?
Чтобы не выводить содержимое файла до замены элементов шаблона. Но, как я уже писал выше, это Ваше дело — можете использовать метод из статьи, которую привели.
Миша, подскажи как мне потсупить? У меня есть файлы в которых выводится из базы только текст, в нём я могу делать так и проблем не будет : $template = str_replace( array( «%text%» ), array ( $index[‘text’].$view ), getTemplate(«open») ); И у меня есть файлы в которых мне приходиться именно в основном контенте делать большие скрипты с циклами и т.д. Как мне быть с такими файлами? Делать отдельные файлы tpl? или как? А можно ли работу всего скрипта занести в одну переменную? Просто тогда мне бы не надо было создавать идентичные друг другу файлы. Подскажи плиззз
Единственный выход — это создавать новые tpl-файлы, очень похожие на остальные. Это недостаток, но ничего не поделаешь.
Понятно, а почему если в файле с шаблоном стоит цикл после %text% то выдаёт ошибку?
В файле с шаблоном не должно быть циклов.
А как мне тогда выводить те же самые комментарии? Надо делать их блоками?
Надо блок выделить в отдельный tpl-файл, в PHP сделать цикл, который собирает много этих блоков воедино, а затем всю эту кучу вставляет в основной tpl-файл.
Пожалуйста напишите статью как всё это организовать по правильному и удобному. Очень прошу, я могу сделать но даю гарантию что код будет ужасный, напишите пожалуйста