Уроки PHP.
Урок 17. Шаблоны.
Разделение оформления и содержания - извечная проблема веб-разработчика. Для
держателя небольшого сайта в несколько страниц такой проблемы не возникает.
Изменение дизайна, либо другая правка внешнего вида страниц для него не
представляет трудностей. Однако для крупных веб-ресурсов, порталов смешение этих
двух важнейших компонентов сайта: оформления и содержания - просто недопустимо.
Иначе сайт становится настолько неповоротлив, что владелец ресурса теряет над
ним управление.
Столкнувшись однажды с такой проблемой, сайтостроители начали ломать голову
над тем, как сделать так, чтобы информация не привязывалась никоем образом к
дизайну и наоборот, чтобы внешний вид всего сайта менялся буквально одним
движением руки. Необходимо сказать, что способа идеального разделения оформления
и содержания в наши дни пока не найдено. Но все же созданы определенные
наработки и технологии, которые позволяют максимально приблизиться к этому
идеалу. Прежде всего это технология использования шаблонов.
Что есть шаблон?
Понятие "шаблон" довольно обширное. Но чаще всего под шаблоном понимается
некий документ (обычно в формате HTML), содержащий в себе все оформление
ресурса, либо только его части, а также специальные метки, которые в процессе
генерации страницы заменяются на информационные данные.
Для работы с шаблонами используются специальные веб-приложения (если говорить
о веб-разработках), которые могут обладать различными свойствами и функциями. Но
чаще всего их роль сводится к тому, чтобы заменять вышеуказанные метки на
информационные блоки и соединять полученные части страниц в единое целое.
Наверное, во всех языках вебпрограммирования есть подобные инструменты для
работы с шаблонами: в Perl это FastTemplate (который, кстати, существует и для
PHP, но его использование не рекомендуется, так как приемлемые для работы версии
относятся еще к третьей версии PHP), в отношении PHP - это крупный и
многофункциональный Smarty, а также ряд других более мелких
"шаблонизаторов".
Smarty.
Smarty
- одна из самых крупных разработок подобного рода. Реализован он, как и
практически все приложения подобного типа, в виде класса.
Этот "шаблонизатор" имеет огромное количество возможностей: он не только
осуществляет замену выделенных участков шаблона указанными данными, но и
предоставляет использование внутри шаблона исполняемых участков, функций,
конфигурационных файлов и прочее.
Описывать все его возможности и правила использвования не имеет смысла, так
как на это потребуется не один и не два урока, к тому же к нему написана
довольно хорошая документация, а
примеры использования прилагаются к самому Smarty.
Smarty - это настоящий монстр по работе с шаблонами. Но, как понимаете, за
столь широкую функциональность приходится платить ресурсами сервера и временем
исполнения скрипта на его основе. В некоторых случаях из-за своей громоздкости
Smarty кажется неповоротливым. Поэтому для сравнительно небольших проектов
использование Smarty - обычно далеко не лучший выбор. В этом случае следует
обратить свой взор на более мелкие и менее функциональные, но тем не менее
достойные инструменты.
Другие инструменты для работы с шаблонами.
Здесь я хочу обратить ваше внимание на "шаблонизаторы" на основе функции
eval(). Эта функция расценивает код, заданный в ее аргументе, как код
PHP и, соответственно, исполняет его. Например:
$text = 'Здравствуйте, $name $fam!'; $name = "Артем"; $fam =
"Акатов"; eval('echo "' . $text . '";'); |
Этот примитивный пример работы с мини-шаблоном выведет "Здравствуйте, Артем
Акатов!".
Преимущество данного типа инструментов работы с шаблонами связано с тем, что
от разработчика заранее не требуется определять текст или другую информацию для
меток в шаблоне (в нашем примере таковыми метками служат слова $name и $fam).
Также такие "шаблонизаторы" значительно выигрывают по скорости.
Разовьем пример выше и напишем функцию, которая будет извлекать шаблон из
файла:
function getTemplate($template, $ext = "htm")
{ $templatefolder =
"templates"; // папка для хранения
шаблонов return str_replace("\"","\\\"", implode("",
file($templatefolder."/".$template.".".$ext))); } $name = "Артем"; $fam
= "Акатов"; eval('echo
"'.getTemplate('test').'";'); |
Если в файл test.htm мы поместим текст из переменной $text из
примера выше, то результат выполения данного примера будет аналогичен
предыдущему.
Для удобства работы с данным типом шаблонов пишутся классы. Одним из самых
удачных классов такого рода является класс Евгения Кучерова.
Попробуем с его помощью создать один из вариантов примитивного "движка" для
данного раздела "Уроки". При этом будем использовать записи MySQL, которые мы
внесли на прошлых уроках.
Прежде всего заготовим шаблон. Для этого откроем окно с HTML-кодом данной
страницы и заменим номер урока на переменную $row[id], вместо названия
"Шаблоны" вставим $row[title], весь текст от первого слова "Разделение"
до последнего "встречи!" заменим на $row[body]. Вместо элементов
навигации "Назад, на урок 16" и в месте, где должно было бы располагаться
"Дальше, на урок 18", соответственно ставим $prev и $next.
Сохраним его как page.tpl. Готовый шаблон можно скачать здесь.
Теперь работаем с PHP. Пишем:
require "class.Template.php";
//
относительный путь до класса $tpl = new Template; $id =
(int)getenv("QUERY_STRING"); // извлекаем номер урока из строки
запроса
mysql_connect("host", "artem",
"12345"); mysql_select_db("myphp"); $query = "SELECT * FROM lessons WHERE
id = '$id'"; $result = mysql_query($query); $row =
mysql_fetch_array($result);
if ($id > 1) $prev = "<a href='?".($id - 1)."'>Назад, на урок ".($id
- 1)."</a>";
$query = "SELECT COUNT(*) FROM lessons"; $result =
mysql_query($query); $max = mysql_result($result, 0);
if ($id < $max) $next = "<a href='?".($id + 1)."'>Дальше, на урок
".($id + 1)."</a>"; eval('echo
"'.$tpl->get("page").'";'); |
Это простой пример страницы, имеющей несложную структуру. Но даже на таком
примере видно, как шаблоны упрощают создание веб-приложений.
В заключение.
Конечно, здесь мы разобрали лишь крохотную часть этой обширной темы работы с
шаблонами и рассмотрели лишь малую долю инструментов работы с шаблонами. Но
хотелось бы сказать, что не так уж важно, каким образом вы работаете с шаблонами
и какие средства вы используете, намного важнее то, как вы с ними
работаете. Научиться грамотной работе с шаблонами не так-то просто, понимание
этого приходит только с практикой, и тут я не могу дать определенных
советов.
На этом все. До следующей встречи!
|