Использование tpl-файлов
Сразу скажу, что я уже писал об этой теме здесь: использование tpl-файлов. Однако, не все поняли данный материал, и я решил к нему вернуться и написать всё немного по-другому. Не секрет, что любой серьёзный движок никогда не будет смешивать в своём коде HTML и PHP. Однако, HTML и PHP коды очень тесно взаимосвязаны, поэтому для того, чтобы не нарушать правила "хорошего тона", были придуманы tpl-файлы. Данные файлы служат для хранения HTML-кода с элементами шаблонов, которые подставляются в PHP-коде. Давайте подробнее разберём использование tpl-файлов с примером.
Возьмём с Вами самый элементарный пример - это панель пользователя, где есть его аватарка и приветствие по имени. Первым делом, создадим tpl-файл, и пусть он называется userpanel.tpl. Напоминаю, что это всего лишь кусок HTML-кода с элементами шаблона:
<p>Здравствуйте, %name%!</p>
<p>
<img src="%avatar%" alt="Аватарка" />
</p>
Ничего сложного, это просто обычный HTML-код. Только вместо определённых значений стоят %элементы_шаблона%.
Теперь разберёмся с PHP-обработкой. Здесь всё будет более, чем абстрактно, но, к сожалению, по-другому никак. Главное - это понять принцип работы. И так PHP-код для обработки созданного tpl-файла:
<?php
/* Данная функция, хоть и использует буферы, но суть элементарна: вернуть содержимое файла */
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-файлов, надеюсь, Вы осознали. Дальше уже самостоятельно подумайте, как всё это обернуть в ООП, чтобы всё было максимально простым с точки зрения понимания кода и его сопровождения в будущем.
-
- Михаил Русаков
Комментарии (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-файл.
Ответить
Пожалуйста напишите статью как всё это организовать по правильному и удобному... Очень прошу, я могу сделать но даю гарантию что код будет ужасный, напишите пожалуйста
Ответить
Вот курс, там как раз всё это делается: http://srs.myrusakov.ru/php
Ответить
Это гениальная конструкция.Хотелось бы увидеть ещё статьи по этой конструкции. Разные варианты этой конструкции
Ответить
Михаил, здравствуйте не могу понять вставляю php код в .tpl файл выводит пустое место, помогите разобраться почему так получается. Спасибо
Ответить
tpl файлы не содержат php кода Можно,конечно,в зависимости от шаблонизатора Но если шаблонизатор,как у Михаила,то .tpl файлы не содержат кода PHP весь код в обработчиках шаблонизатора
Ответить
Не понимаю зачем нужны шаблоны? Я работаю с html кодом на прямую через print. Всегда делал так, а тут отказывается, что это не правильно нужны шаблоны.
Ответить
Шаблоны нужны для удобства. Когда проект большой будет - поймете.
Ответить
Если не сложно, создайте статью про Smarty (шаблонизатор)
Ответить
По скорости работы чтение файлов не лучший вариант для php. Лучше хранить в mysql
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.