Ещё раз о шаблонах
Рано или поздно девелоперу, создающему сайты статусом выше «сайт-визитка», приходится сталкиваться с таким понятием как «шаблоны» или «шаблонизация» визуального представления (не шаблоны проектирования). Что это такое? Механизм шаблонов позволяет отделять визуальное представление веб-приложения (по-скольку работаю только с веб-приложениями, то и рассуждать буду в этом контексте) от бизнес-логики таким образом, чтобы при изменении, например, внутренней логики попутно не приходилось переделывать всю html-верстку. На этом поприще уже давно существует несколько отдельно стоящих флагманских решений, позволяющих создавать довольно гибкие приложения в плане разделения труда дизайнеров-верстальщиков и программистов, а также предотвращать запутанность кода в больших приложениях. Описывать все их нет смысла. Это уже сделано до меня и не один раз. Помимо этого, почти каждая CMS и фрэймворк имеет собственные решения для отделения логики приложения от логики представления.
Конечно, когда речь идет о проекте в десятки тысяч строк кода, когда у заказчика есть возможность нанять и программиста, и верстальщика, то и функционал шаблонов будет только пользой для всех участников проекта. Но когда разработчик в простецкий сайт в 3 страницы начинает втуливать Smarty, это ИМХО уже перебор. В таких случаях я люблю вспоминать выражение Джорджа Шлоснейгла из его замечательной книги «Профессиональное программирование на PHP» – «попытка убить муху молтком».
Действительно, встраивая все тот же Smarty в весьма простой по функционалу сайт, разработчик попросту тратит время. А время, как известно, — деньги. Да и в большинстве случаев заказчику безразлично на каком шаблонизаторе будет работать его сайт. Заказчик больше печется о затраченном времени.
Что же делать, если сайт не «визитка», но и не второй Amazon? Лично я считаю, что в этом случае оптимальное решение проблемы — воспользоваться своей самописной системой шаблонов, весь функционал которой, заточен только для решения узкого круга задач, необходимых для текущего ресурса. Впоследствии вы, возможно, выведите свою «формулу» универсального шаблонизатора с неким минимальным набором функций, расширяемую по мере необходимости в отдельно взятом проекте.
Может показаться, что автор сей статьи весьма скептически относится к Smarty и другим шаблонизаторам. Это не так. Я довольно долго работал с проектом, в котором роль шаблонизатора выполнял все тот же Smarty. И хочу заметить, мне весьма понравилось использование этой системы шаблонов в контексте обширного по функционалу проекта.
- Возможность назначать переменные шаблону
- Отдельное пространство имен переменных для отдельно взятого html-шаблона
- Возможность использования одного шаблона для общего каркаса страницы во избежание повторения конструкций вида require ‘header.tpl’;… require ‘footer.tpl’; в каждом файле
- Проект является интернет-магазином или социальным сообществом
- 10-20 типов страниц. Подчеркиваю — НЕ страниц, а типов страниц. Например: страница описания товара. Т.е. html-шаблон для этого типа страниц будет один, но самих страниц, когда каталог заполнится контентом будет много
Рассмотрим простейший класс, который состоит всего из трех методов.
_tmpl = $filename; > public function assign($name, $value) < $this->_vars[$name] = $value; > public function render() < if (count($this->_vars) > 0) < extract($this->_vars); > $tmplPath ; if (file_exists($tmplPath)) < require $tmplPath; >else < throw new Exception("Шаблон _tmpl> не найден"); > > >
Давайте рассмотрим пример с применением этого класса. Создадим следующую структуру каталогов:
/wwwroot
|
— /classes
| — Template.php
— /templates
| — Main.tpl
| — Catalog.tpl
| — Product.tpl
| — Index.tpl
| — 404.tpl
|— index.php
Страница описания продукта №
Это главная страница сайта
/** * Буферизация вывода. * Все, что будет выводиться echo-м или print-ом, будет попадать в буфер, а не в браузер пользователю. */ ob_start(); // Подключаем шаблонизатор require dirname(__FILE__).'/classes/Template.php'; // Производим проверку маршрутизации и включаем необходимые шаблоны // Если не один из шаблонов не найден, отправляем клиенту код ошибки и показываем шаблон 404.tpl // Если маршрут не задан, выводим главную страницу if (isset($_GET['route']) && $_GET['route'] == 'catalog') < $tmpl = new Template('Catalog'); $tmpl->assign('ID', $_GET['ID']); $tmpl->render(); > else if ($_GET['route']) && $_GET['route'] == 'product') < $tmpl = new Template('Catalog'); $tmpl->assign('ID', $_GET['ID']); $tmpl->render(); > else if (!isset($_GET['route'])) < $tmpl = new Template('Index'); $tmpl->render(); > else < header("HTTP/1.0 404 Not Found"); $tmpl = new Template('404'); $tmpl->render(); > // Получаем содержимое буфера $content = ob_get_clean(); // Инициализируем шаблон каркаса страницы и выводим ранее сгенерированное содержимое $tmpl = new Template('Main'); $tmpl->assign('content', $content); $tmpl->render();
Как видно из примера, содержимое страниц catalog и product изменяется в зависимости от значения $_GET[‘ID’]. Т.о. мы получили два типа шаблонов и неограниченное количество страниц, генерируемых приложением из этих шаблонов.
Вывод: не стремитесь во всех проектах, которыми вы занимаетесь, использовать навороченные библиотеки шаблонизаторов, предоставляющих большое обилие всевозможных инструментов, в большинстве случаев не используемых в должном объеме. Лучше всего написать свое решение, которое поможет сэкономить время, системные ресурсы, а главное — нервы останутся в порядке.
Как использовать файлы TPL
Относительно недавно я писал о том, как создать свой движок для сайта. И там я сказал, что для HTML-кода надо создавать специальные файлы-шаблоны, которые имеют расширение tpl. Однако, один из моих посетителей попросил меня поподробнее рассказать о том, как использовать файлы tpl. И в этой статье я постараюсь подробно рассказать о том, зачем нужны файлы tpl, как их использовать, и приведу небольшой пример.
Файлы tpl используются для написания в них HTML-кода, который впоследствии будет «вытащен» PHP и выведен пользователю на конкретных страницах. Например, в файле tpl может быть форма регистрации. То есть просто HTML-код обычной формы, ничего больше. В другом файле tpl может быть блок с панелью пользователя. В этой панели идёт «Приветствие пользователя» по имени, различные ссылки на редактирование профиля, а также кнопка выхода. Это всё примеры, где регулярно используются файлы tpl.
Однако, есть один очень важный нюанс. Рассмотрим поподробнее файл tpl с панелью пользователя. Я написал, что там идёт приветствие пользователя по имени. Но файл один, а пользователей очень много (следовательно, и имён много). Глупо создавать для каждого пользователя отдельный файл, где жёстко прописано его имя. Поэтому в файлах tpl используются специальные элементы — шаблонизаторы. Они записываются примерно в таком виде: . Давайте приведу пример файла tpl, где используется шаблонизатор (пусть файл называется user_panel.tpl):
Как видите, никаких html>, head> и body> здесь нет. Только тот HTML-код, который отвечает за панель пользователя.
Теперь напишем PHP-код, который этот tpl-файл обрабатывает:
$username = «Пётр»; //Разумеется, это имя Вы должны сначала откуда-то взять, например, из базы данных
$user_panel = file_get_contents(«user_panel.tpl»);
$user_panel = str_replace(«», $username, $user_panel);
echo $user_panel;
?>
Как видите, всё очень и очень легко. Мы здесь получили содержимое файла user_panel.tpl, а затем с помощью функции PHP str_replace() заменили на конкретное имя пользователя.
Это основа, которую необходимо знать для использования tpl-файлов. Далее Вы должны теперь понять, что страница будет собираться по кирпичикам, выводя все tpl-файлы в нужном порядке. Главное преимущество такого подхода, что разделяется программная часть и дизайнерская, благодаря чему становится крайне легко изменять дизайн и код PHP независимо друг от друга.
Создано 07.07.2011 18:33:23
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 22 ):
Михаил, я конечно, ещё не настолько овладел знаниями в области программирования, изучая платный курс(за который тебе отдельное спасибо), но сдается мне, что в написанном коде есть пара, скорее всего, опечаток.. 🙂
Михаил ! вопрос таков. просто не знал где его задать решил тут раз уж применяю tplы. вот к примеру у меня есть переменная имени «$login» и на экране выводится именно к примеру «Олег» А как вот его просклонять правильно ведь не ко всем именам подойжет префикс после его логина к примеру Сообщение от «Олег» — не очень смотрится=((( Как это реализовать?
Это сделать можно только для конечного числа имён. Реализовать это для всех имён не получится. Соответственно, Вы для каждого имени склоняете под всеми необходимыми падежами, а потом вытаскиваете нужный падеж (например, взятый из параметра функции).
Нет там опечаток, кроме той что тег не работает с версии 4,1 HTML
Ты это мне написал? Ты видел дату моего поста??
Спасибо за статью, помню я как раз и не разобрался с шаблонизаторами и фигурными скобками.
Здравствуйте, Михаил. Есть вопрос. Например есть tpl файл для боковой панели. В боковой панели есть подобие виджетов. Они одинаково выглядят и для них я так же сделал один tpl файл. Вот tpl виджета:
Так если я буду в цикле с помощью str_replace() изменять значения и т.д. то они будут меняться для всех виджетов.
for(. ) $text .= str_replace(. ); И вот в $text и будут все 3 виджета.
Сначала делается вёрстка, а уже потом эта вёрстка разбивается на куски и отправляется в tpl-файлы.
Спасибо! Это я понимаю,но в самом же ptl файле не прописывается графика, содержимое и их свойства, и расположение на странице?
Туда прописывается HTML-код, а это и есть всё то, что Вы написали.
Разделение PHP и HTML кода, использование шаблонов
24.07.18 ИТ / PHP 7208
При написании кода на PHP может возникнуть потребность создать в коде элемент на HTML. Начинающие разработчики пишут HTML код прямо в файле с PHP кодом, просто заключая его в кавычки и заменяя в нем переменные данные. Конечно, такой способ прост, позволяет не отвлекаться на дополнительную работу по разделению PHP и HTML. Но это неправильно, необходимо весь HTML код выносить в отдельные файлы – HTML шаблоны.
Почему необходимо отделять HTML от PHP? Причин может быть несколько:
- смешивание кода HTML и PHP в одном файле выглядит некрасиво;
- нет подсветки HTML синтаксиса, загромождается код PHP – ведь обычно HTML код занимает довольно много места;
- невозможно повторное использование HTML кода в других местах веб-приложения;
- когда будет необходимо вносить изменения в HTML – придется долго искать этот участок кода в файле с PHP кодом.
На сегодняшний день для выполнения такой задачи разработаны различные шаблонизаторы, которые как раз созданы для отделения кода от верстки. Но не всегда есть желание использовать что-то стороннее, да и к тому же средствами PHP можно самому реализовать простую систему шаблонизации. Как это сделать?
Для примера создадим файл с расширением tpl, в котором будет храниться HTML код. Это и будет наш шаблон, расширение файла можно сделать любое, tpl здесь просто для примера. Соответственно в редакторе кода можно задать подсветку синтаксиса HTML для этого расширения (к примеру в Notepad++). В этом файле прописываются нужные переменные, которые необходимо будет заменить на нужные данные. Пример шаблона:
Далее создаем некоторую функцию, например – myfunction, в которой есть данные и путь к шаблону:
function myfunction() < $template_path = '/templates/template.tpl'; $data = array( 'variable' =>'Значение', 'variable2' => 'Значение 2', ); $html = get_html($template_path, $data); echo $html; >
Наконец, необходимо создать функцию get_html, которая будет выполнять работу по подключению указанного шаблона и заменять в нем данные. Функция принимает два параметра: путь к шаблону и данные. В цикле происходит проход по всему содержимому массива data и создаются переменные. Затем включается буферизация и подключается шаблон, в котором используются вышесозданные переменные. В завершении прекращаем процесс буферизации и возвращаем готовый HTML код. Примерный код приведен ниже:
function get_html($template_path, $data) < foreach ($data as $key =>$value) < $$key = $value; >ob_start(); require($template_path); $html = ob_get_clean(); return $html; >
Таким образом, отделить HTML от PHP кода без использования сторонних шаблонизаторов не составит труда. Использование шаблонов позволит сделать разработку проекта более удобной и правильной.