Как создать tpl файлы на php. PHP-класс для построения шаблонов. Содержимое страницы по умолчанию
Читайте также
Всем привет. Хочу представить очередной велосипед написанный на PHP с использованием Document Object Model. В чем его отличие от остальных трёхколёсных представителей того же вида? На самом деле отличий не так уж и много, он сочетает в себе лучшее из многих. Например:
1. Полное разделение html и php.
2. Никаких дополнительных меток в шаблонах типа
3. Возможность встраивать в верстку содержимое других файлов шаблона, как из php, так и используя специальный тэг в верстке.
4. Возможность создавать любой html-тэг на лету.
5. Возможность сохранение в html файл все что было сгенерировано и собрано.
6. Проверка существования html-файла запрашиваемой страницы перед тем как генерировать шаблон.
Чтобы всем сразу стало понятно на сколько он удобен и прост в обращении, я расскажу и покажу как я его использовал для создания одного из своих проектов (подозреваю что перепишу все свои проекты под него).
Первое что я обычно делаю это получаю всю информацию из БД о странице (ключевые слова, описание страницы, название шаблона и адреса css и js файлов). Все это я сохраняю в массив $head. Дальше я получаю из БД контент и сохраняю в массив $page. И приступаю к работе с классом.
Итак, сначала я вызываю конструктор класса и передаю в него все необходимые параметры:
$tpl = new Template;
$tpl -> ext = TPL_EXTENSION; # расширение файлов в каталоге шаблона
$tpl -> htm = CACHE_EXTENSION; # расширение для уже сгенерированных страниц
$tpl -> skin_dir = DIR_TEMPLATES; # директория, в которой лежат все шаблоны сайта (например templates)
$tpl -> js_dir = DIR_JS; # директория где нужно искать JS файлы
$tpl -> css_dir = DIR_CSS; # директория где лежат CSS
$tpl -> img_dir = DIR_IMG; # директория где картинки
$tpl -> skin = $_SESSION["skin"]; # имя шаблона, который я хочу использовать
$tpl -> cache = DIR_CACHE; # куда сохранять готовые html
$tpl -> log = FILE_T_LOGS; # куда писать логи
$tpl -> tag_start = SYMBOL_START_TAG; # Символ, с которого начинаются переменные в шаблоне
$tpl -> tag_end = SYMBOL_END_TAG; # Символ, которым заканчиваются переменные в шаблоне
$tpl -> dir_delimeter = DIRECTORY_SEPARATOR;
$tpl -> space = SYMBOL_SPACE; # символ, заменяющий пробел.
Фуф, вроде все переменные передали, идем дальше.
Чтобы не заставлять класс делать лишнюю работу, сначала мы проверяем, вдруг у нас уже есть готовый Html-файл запрашиваемой страницы.
if($tpl -> TestPageStatus() === TRUE)
{
require $tpl -> cacheFileName;
}
else
{
$tpl -> page("index"); # передаем имя файла шаблона, кстати их можно передать несколько, через запятую
$tpl -> assign("HEAD",$head);
$tpl -> assign("CONTENT",$page);
$tpl -> build(); # даем команду собрать шаблон
$tpl -> ShowPage(); # выводим.
}
Вот собственно и все методы, которые нужно использовать для того чтобы вывести страницу.
Теперь разберем еще пару-тройку полезных методов этого класса. Допустим что мы уже передали в класс все необходимое, но еще не дали ему команду на вывод, потому-что вдруг вспомнили что нам нужно создать несколько Html-тэгов в шаблоне. Это тоже делается очень просто. Для начала нужно найти блок, в котором мы хотим что-то добавить. Найти можно 2 способами:
$tpl -> findById("findMe");
$tpl -> findByTagName("div");
Метод findById логично подразумевает что в шаблоне все id тэгов уникальны. А метод findByTagName вернет первый подходящий.
Результат который мы получили поиском мы должны передать в метод $tpl -> createChild(), чтобы иметь возможность создавать в найденном элементе, дочерние тэги. Метод createChild кстати, после создания нового элемента, возвращает его нам, так что мы можем использовать только что созданный элемент еще где-нибудь.
Ковыряясь и экспериментируя я нашел 3 способа создания тэгов в шаблоне, поэтому покажу сразу 3 примера. Пример1:
Нам нужно создать
внутри $parent = $tpl -> findById("parent");
$tpl -> createChild($parent,"div", "id=child, class=test");
Получим:
Пример 2:
Нам нужно создать
$parent = $tpl -> findById("parent");
$tpl -> createChild($parent,"div", "id=child,class=test", "Какой-то текст");
Получим:
Пример3:
Нам нужно создать
$parent = $tpl -> findByTagName("span"); # (1)
$tpl -> createChild($parent, "div", "Новый элемент"); # (2)
(1) Поиск родителя не по id, а по тэгу найдет первого подходящего
(2) Если нам не нужны атрибуты, а только значение нового элемента, то их можно не передавать
Получим:
И после этих манипуляций я уже вызываю ShowPage. И тут мы плавно подошли к еще 2 интересным моментам.
Представим ситуацию, что у нас есть шаблон, предположим что это шаблон list.tpl со списком, допустим, мобильных телефонов:
{CONTENT.Brand}
{CONTENT.Model}
{CONTENT.Info}Если мы передали информацию только по 1 телефону, то будет просто произведена замена переменных на их значения, а если мы передали информацию сразу по нескольким телефонам, то класс скопирует этот участок столько раз, сколько вариантов значений к нему пришло. И это он сделает сам, в отличие, например от класса xTemplate, которому приходилось под каждое значение вызывает assign и parse
Правда есть один не очень удобный момент, если после этого блока стоят какие-то еще, например:
{CONTENT.Brand}
{CONTENT.Model}
{CONTENT.Info}То в такой ситуации нам придется применить небольшую хитрость, упаковав наш мобильник
{CONTENT.Brand}
{CONTENT.Model}
{CONTENT.Info}В таком случае все мобильники будут появляться друг за другом, внутри , а «Еще какой-то блок» так и останется внизу.
И, если я ничего не забыл, то последний момент это добавление содержимого других шаблонов в текущий шаблон.
Взываю опять к вашей фантазии.
Представьте что верстальщик хочет чтобы содержимое page.html файла было добавлено в блок файла list.html, для этого он в нужном месте файла list.html дописывает
Количество таких вставок не ограничено и их расположение абсолютно не критично, поэтому можно вставлять их как угодно и в любом количестве.
Вот пожалуй и все, если что-то вспомню, сообщу дополнительно. Спасибо что дочитали до конца.
Теги: php, класс, template, шаблонизатор, парсер
Проще всего делать шаблоны на основе уже сверстанных в HTML статических страниц. Рассмотрим создание и подключение шаблона на примере. Допустим, уже есть HTML-файл такого содержания:
<html > <head > <meta name="description" content= /> <meta name="keywords" content= /> <title > title > <link href="style.css" rel="stylesheet" type="text/css" /> head > <body > // начало меню <table border="1" > <tr > <td > <a href="/" > <b > Главнаяb > a > td > tr > <tr > <td > <a href="/about/" > Обо мнеa > td > tr > <tr > <td > <a href="/me_and_me/" > Я и мировое господствоa > td > tr > <tr > <td > <a href="/contacts/" > Контактыa > td > tr > table > // конец меню <h1 > Главная страницаh1 > <p > p > <p > Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: p > <p > Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: p > <p > Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: p > body > html >Для того, чтобы добавить шаблон в CMS, нужно создать файл в директории tpls/content , например, test.tpl , и вставить туда ваш HTML-код. CSS-файл следует положить в папку css/cms и назвать style.css . Изображения желательно положить в папку images . Не забудьте поменять пути ко всем изображениям и CSS-файлам.
Замечание
В названии файла шаблона нельзя использовать русские буквы!
Чтобы система «увидела » новый шаблон и начала использовать его для вывода страниц, шаблон необходимо добавить в систему. Для этого следует зайти в настройки модуля «Структура », вкладка «Шаблоны » (http://yourdomain.ru/admin/content/config/ ). Вы увидите список уже установленных шаблонов в каждом домене, которые существуют в выбранной языковой версии.
Чтобы подключить новый файл шаблона, заполните в самой нижней свободной строке поля «Название шаблона » (дайте ему какое-нибудь осмысленное название, например «Мой тестовый шаблон ») и «Имя файла » (в нашем случае, test.tpl) и нажмите кнопку «Сохранить ».
Если вы хотите, чтобы этот шаблон использовался в качестве шаблона по умолчанию, поставьте напротив него отметку «Основной ». Теперь этот шаблон будет выбран по умолчанию в выпадающем списке выбора шаблонов. Так же он будет использоваться для вывода системных страниц, которые используют шаблон по умолчанию (Регистрация, Восстановление пароля, Карта сайта).
Шаблоны будут видны в выпадающем списке при редактировании каждой страницы:
Таким образом, на одном сайте можно одновременно использовать много шаблонов, выбирая подходящий шаблон как для отдельной страницы, так и для группы страниц.
Попробуйте создать новую страницу (убедитесь, что в опции «Шаблон дизайна » выбран новый шаблон) и посмотрите, что получилось на сайте.
На сайте должен появиться ваш HTML-шаблон. Но сейчас он статический. Теперь вам надо сделать его динамическим.
Для начала надо определить, какие части HTML-кода будут изменяться. В нашем случае изменяться будут:
заголовок окна
мета-теги keywords и description;
заголовок текста
;
собственно текст;
меню сайта.
Значит, предстоит немного поработать с HTML-шаблоном и вместо изменяющихся участков поставить соответствующие макросы.
Например, в начале HTML-файла заданы мета-теги и тайтл:
<meta name="description" content="описание сайта Василия Пупкина" /> <meta name="keywords" content="Вася Василий Пупкин официальный сайт" /> <title > Сайт Васи Пупкина: Главная страницаtitle >Заменяем их на соответствующие макросы (список макросов дан в приложении):
<meta name="description" content="%description%" /> <meta name="keywords" content="%keywords%" /> <title > %title%title >Теперь система при формировании страниц будет брать мета-теги и тайтл, прописанные для каждой страницы индивидуально, и подставлять их вместо соответствующих макросов. Названия макросов запомнить очень просто.
Аналогично поступим с заголовком текста. Было так:
<h1 > Главная страницаh1 >А станет так. Заголовок текста выводится макросом %header%:
<h1 > %header%h1 >Основной текст страницы тоже изменяется:
<p > Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: p > <p > Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: p > <p > Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: p > <p > Текст обо мне: Текст обо мне: Текст обо мне: Текст обо мне: p >Для вывода основного текста страницы есть макрос %content% :
%content%В начало файла между тегами
и вставляем макрос:Эта строчка подключает функцию быстрого редактирования и другие полезные возможности. При помощи нее вы сможете, нажав Shift +D , быстро перейти к правке текущей страницы сайта или каких-либо ее фрагментов.
В итоге должно получиться следующее:
<html > <head > <meta name="description" content="%description%" /> <meta name="keywords" content="%keywords%" /> <title > %title%title > <link href="style.css" rel="stylesheet" type="text/css" /> %system includeQuickEditJs()% head > <body > // начало меню <table border="1" > <tr > <td > <a href="/" > <b > Главнаяb > a > td > tr > <tr > <td > <a href="/about/" > О компанииa > td > tr > <tr > <td > <a href="/projects/" > Проектыa > td > tr > <tr > <td > <a href="/contacts/" > Контактыa > td > tr > table > // конец меню <h1 > %header%h1 > %content% body > html >Итак, мы сохраняем файл шаблона и смотрим на результат. Теперь страница практически полностью динамическая, за исключением меню. Предстоит «оживить » меню сайта. Посмотрим как сверстано меню:
// начало меню <table border="1" > <tr > <td > <a href="/" > <b > Главнаяb > a > td > tr > <tr > <td > <a href="/about/" > Обо мнеa > td > tr > <tr > <td > <a href="/me_and_me/" > Я и мировое господствоa > td > tr > <tr > <td > <a href="/contacts/" > Контактыa > td > tr > table > // конец менюМеню состоит из пунктов. Само меню как-то оформлено, и у пунктов тоже есть оформление. Например, у всего меню может быть некая рамка или фон, текущий пункт меню может быть выделен жирным и т.п. Также в одном меню могут быть разные уровни.
Выделим обрамление меню:
// начало меню <table border="1" > table > // конец менюПункт меню оформлен так:
<tr > <td > <a href="/contacts/" > Контактыa > td > tr >Текущий пункт меню оформлен по-другому:
<tr > <td > <a href="/" > <b > Главнаяb > a > td > tr >Исходный шаблон меню находится в файле /tpls/content/menu/default.tpl и выглядит так:
%text%Вначале немного непонятно. На самом деле, все очень просто. Посмотрим на первую часть кода:
$FORMS ["menu_block_level1" ] = <<menu_block_level1 ― содержит HTML-обрамление меню;
menu_line_level1 ― содержит HTML-код пункта меню;
menu_line_level1_a ― то же самое, что и menu_line_level1, только используется для активного пункта меню.
Все, что расположено между << При генерации меню, система берет шаблоны пунктов (например, menu_line_level1), и ставит их друг за другом. Получается HTML-код, в котором содержатся все пункты меню. Этот код вставляется вместо макроса %lines%
. Итак, необходимо проставить код, который мы выделили выше (обрамление, пункты меню) в соответствующие блоки. Должно получиться примерно так: Мы уже знаем, что вместо %lines%
система подставляет пункты меню с их HTML-обрамлением. Нам встретились новые макросы. Вместо %link%
вставляется URL пункта меню, а вместо %text%
― текст (определяется в поле «название страницы
»). Теперь меню можно вставить в шаблон страницы макросом %menu%
:: Шаблон готов.
Если вы хотите на каких-то страницах сайта выводить меню по другому шаблону, нужно создать еще один файл с шаблоном меню в той же папке. Например, menu2.tpl . Соответственно, при подключении меню к шаблону страницы вместо %menu%
надо написать немного по-другому: %content menu("menu2")%
. Работа этого и других макросов подробно описана в текущей документации. Работа с ними строится точно по такому же принципу: вы разбиваете необходимый кусок HTML-шаблона на отдельные части, подставляете в соответствующие блоки нужных шаблонов, вставляете на место этого куска соответствующий макрос и он начинает работать. Важно учитывать:
не стоит размещать несколько макросов на одной строке. Вложенные макросы могут не сработать в качестве аргумента у других макросов. Статья поможет пользователям, которые еще довольно мало знакомы с шаблонами Dle и tpl файлов в частности. Статья поможет разобраться в чем их основное предназначение и как с ними работать. Итак начнем в состоящий из шаблонов с расширением *.tpl есть стандартные и обязательные файлы шаблонов, которые должны там присутствовать. При отсутствии одного из файла система будет сообщать о ошибке
, в некоторых случаях интернет-портал не будет работать совсем. addcomments.tpl
- Форма для добавления комментариев только в полной новости. addnews.tpl
- Форма для добавления публикации на веб-ресурс, для заполнения данных о новости: заголовок, категорию новости, короткую и полную новость, поля для облака тегов и различные администраторские функции. comments.tpl
- Отвечает за оформление комментариев, как в полной публикации так и последние комментарии. feedback.tpl
- Основное оформление формы обратной связи с поля заполнения. fullstory.tpl
- Шаблон файл оформление полной новости, дату публикации, автор, количество комментариев, вывод похожих новостей и т.д. info.tpl
- Форма сообщения страницы ошибки на веб-ресурсе, выходит например при неправильной авторизации. informer.tpl
- Файл оформления вывода информера (партнеров или например новости Яндекс и т.д.) на блоге. login.tpl
- Основной файл оформления формы Авторизации, Админ панели lostpassword.tpl
- Форма восстановления (при потери) пароля, выводится только для не авторизованных пользователей. main.tpl
- Основной файл оформления главной страницы вывода информации блога DLE, к которому подключаются остальные шаблоны. navigation.tpl
- Шаблон оформления перехода по страницам, постраничная навигация. offline.tpl
- Страница отключенного сайта при технических работах, если необходимо провести глобальные изменения на веб-проекте. Будет виден всем кроме администрации интернет источника. pm.tpl
- Форма оформления Отправки, Входящих и Отправленных сообщений на интернет-портале дле, отвечает за оформление личных сообщений пользователя. preview.tpl
- Настройки оформления стилей CSS для окна предварительного просмотра при добавлении новости, в которую входит оформление для короткой и полной новости. print.tpl
- Страницы Распечатки для принтера. profile_popup.tpl
- Всплывающее модальное окно при включенном AJAX скрипте, которое выходит при выборе логина пользователя мышкой. Отвечает за оформление POP - Up окна с краткой информацией о пользователе. registration.tpl
- Форма регистрации нового пользователя после принятия правил выдает анкету с полями для заполнения и регистрации. relatednews.tpl
- Форма оформления Вывод похожих новостей. search.tpl
- Выводит страницу простого поиска по веб-ресурсу, куда входит поле для заполнения и кнопки Поиск и Расширенный поиск. searchresult.tpl
- Форма оформления результата поиска, а также при выборе Расширенный поиск выводит поля для заполнения. shortstory.tpl
-Важный шаблон осуществляет оформление короткой новости. speedbar.tpl
- Данный файл выводит полную ссылку на категорию в которой опубликована новость, и отвечает за быстрый переход в нужный раздел (хлебные крошки). static.tpl
- Данный файл шаблона отвечает за оформление и вывод статических страниц созданных в админ панели Dle. static_print.tpl
- Применяется для оформления статической страницы Версия для печати stats.tpl
- Оформление Статистики веб-ресурса, с выводом всей информации. tagscloud.tpl
- Шаблон оформления облака тегов. topnews.tpl
- Применяется для оформления популярных новостей. userinfo.tpl
- Форма оформления профиля информации о пользователи, а также POP - Up окном для последующего редактирования данных, открывается если пользователь зарегистрирован на веб-проекте. vote.tpl
- Используется оформления вывода результатов голосований, как Все опросы на DLE или Всего проголосовало. На данный момент перечислены основные tpl файлы шаблона Dle, с выходом новых версий возможны изменения и добавления новых шаблонов TPL для движка DataLife Engine . Помимо основных шаблонов TPL в DLE, любой пользователь может добавить свои, для удобного оформления, улучшения и установки сторонних модулей на веб-проект! leftblocks.tpl (левый блок веб-проекта) в который добавляются элементы оформления. Внимание! Для нормальной работы файл должен находится в папке с основными шаблонами там же где и main.tpl! {include file="leftblocks.tpl"} Помимо такой вставки есть ещё вариант подключения коротких новостей с помощью шаблонов например: shortstory-1.tpl Короткая новость в который добавляются элементы оформления. Пример вставки: {title}
В main.tpl вставляем тег с настройками: {custom category="2,3" template="shortstory-1" aviable="global" from="0" limit="5" cache="yes"} В результате если вставить такую вставку например: в правый блок, появится ссылка и title последних новостей категории 2 и 3 как на нашем сайте www.сайт
раздел Новости "Модули ДЛЕ " и т.д., где custom category="2,3" (категории из которых берется новость можно добавить ещё через запятую) Также в шаблонах присутствую стандартные папки: Внимание!
Скрипты обязательно должны находиться в папке JS ,в котором должен быть файл.htaccess для защиты от разного рода угроз, если такого файла не будет скрипт не запустится (сработает система защиты Dle). Внимание!
В шаблоне там же где main.tpl должен быть файл.htaccess С таким кодом: Файл.htaccess можно скачать из шаблона дистрибутива движка DataLife Engine Сразу скажу, что я уже писал об этой теме здесь: . Однако, не все поняли данный материал, и я решил к нему вернуться и написать всё немного по-другому. Не секрет, что любой серьёзный движок никогда не будет смешивать в своём коде HTML
и PHP
. Однако, HTML
и PHP
коды очень тесно взаимосвязаны, поэтому для того, чтобы не нарушать правила "хорошего тона", были придуманы tpl-файлы
. Данные файлы служат для хранения HTML-кода с элементами шаблонов
, которые подставляются в PHP-коде
. Давайте подробнее разберём использование tpl-файлов
с примером. Возьмём с Вами самый элементарный пример - это панель пользователя, где есть его аватарка и приветствие по имени. Первым делом, создадим tpl-файл
, и пусть он называется userpanel.tpl
. Напоминаю, что это всего лишь кусок HTML-кода с элементами шаблона
:
Здравствуйте, %name%!
%text%
END;
$FORMS
["menu_line_level1_a"
] = <<%text%
END;
?>
Люди которые хорошо знакомы и не очень с HTML и CSS легко освоят работу с файлами шаблона dle.
Подробно о каждом файле шаблона DataLife Engine
ПС.Правила интернет-портала находятся в статической странице, и не присутствуют в данном шаблоне.
Для этого создается сам шаблон например:
Для подключения такого блока используется тег {include} Например:
Который вставляется в нужном месте main.tpl
template="shortstory-1" (название шаблона)
aviable="global" (глобально для всех, можно установить main вместо global будет только на главной выводится информация)
from="0"
limit="5" (количество публикаций)
cache="yes" (Включить/Выключить кеширование)
bbcodes (Папка с файлами картинок для редактирования таких как Смайлов, HTML цвета и BBcodes)
dleimages (Папка с файлами картинок для оформления рейтинга, закладок, водяного знака и т.д.)
images ((Папка с файлами изображений для оформления шаблона. может иметь разное название)
js (Папка с файлами скриптов JS и т.д.)
style (Папка с файлами каскадов стилей для оформления шаблонов)
Внимание!
Во всех папках шаблона также должен быть файл.htaccess
Пример файла.htaccess с данными внутри:
Order Deny,AllowAllow from all
Order allow,denyDeny from all
Ничего сложного, это просто обычный 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-файлов , надеюсь, Вы осознали. Дальше уже самостоятельно подумайте, как всё это обернуть в ООП , чтобы всё было максимально простым с точки зрения понимания кода и его сопровождения в будущем.