Подробно о файлах *.tpl шаблона Dle их предназначение. PHP-класс для построения шаблонов после него будет напечатан заголовок страницы, и всё это закроется тэгом

После создания info -файла, в принципе, тема уже определена. Это значит, что вы можете зайди в раздел управлением темами http://mysite.ru/admin/build/themes и включить там свою тему. Естестественно, после включения её никакого дизайна вы не увидете - страница приобретёт стиль "чёрное на белом" - на белом фоне чёрный текст.

Однако хочу отметить, что не смотря на то, что в нашей теме никаких файлов кроме mytheme.info не лежит, сайт будет работать так как же как и раньше - выводить весь контент, добавлять блоки в регионы (http://mysite.ru/admin/build/block ) и прочее. Это объясняется тем, что в ядро друпала включены обязательные модули , которые даже при полном отсутствии каких либо файлов в вашей теме (за исключением info-файла) позволяют продолжать работу с друпалом.

Впринципе, всё создание шаблона сводится к перекрытию файлов-шаблонов (они имеют расширение .tpl.php ) стандартных модулей нашей CMS .

Самый важный tpl-файл (tpl - сокращение от template , шаблон) это page.tpl.php . Он отвечает за построение каждой страницы сайта. Давайте разберёмся, из чего же состоит файл шаблона:

  • html код
  • php код
  • javascript код (необязательно)

В каждый файл шаблона друпал передаёт данные сайта в виде стандартных переменных. Для каждого файла шаблона существуют 2 вида переменных:

  • переменные, которые передаются только в этот файл
  • переменные, которые передаются во все файлы

Вот список всех переменных для page.tpl.php :

Общие переменные (для всех файлов):
  • $base_path - базовый путь, куда был установлен друпал
  • $css - массив css-файлов, подключенных к текущему файлу шаблона
  • $directory - путь к папке, в которую установлена тема
  • $is_front - возвращает значение ИСТИНА если вы находитесь на главной странице
  • $logged_in - возвращает значение ИСТИНА если вы залогинились
  • $is_admin - возвращает значение ИСТИНА если вы имеете доступ в админку
Метаданные страницы
  • $language - (объект) Текущий язык, который отображается на сайте
  • $language->language - содержит его текстовое представление
  • $language->dir - содержит направление языка. Это или будет "ltr"(left-to-right) или "rtl"(right-to-left)
  • $head_title - модифицированная версия заголовка страницы, для использования между тэгами
  • $head - вставляется между тэгами . Содержит мета тэги, ключевые слова и т.д.
  • $styles - служит для загрузки всех css -файлов в текущую страницу
  • $scripts - служит для загрузки всех javascript"ов в текущую страницу
  • $body_classes - набор классов css для тэга . Содержит в себе информацию о текущем расположении колонок на сайте, их количестве, текущем url"e и т.д.
Информация о сайте
  • $front_page - адресс главной страницы сайта. Лучше использовать эту переменную для ссылки на главную страницу, т.к. она включает в себя язык домена и преффикс
  • $logo - путь к логотипу сайта, если он включен на сайте
  • $site_name - имя сайта. Может быть пустым, если отключить его в фичах в info-файле. Настраивается в mysite.ru/admin/settings/site-information
  • $site_slogan - слоган сайта. Может быть пустым, если отключить его в фичах в info-файле. Настраивается в mysite.ru/admin/settings/site-information
  • $mission - миссия сайта. Может быть пустой, если отключить её в фичах в info-файле. Настраивается в mysite.ru/admin/settings/site-information
Навигация
  • $search_box - содержит в себе html код, отображающий строку поиска. Может быть пустым если выключить его в info-файле
  • $primary_links
  • $secondary_links - массив, содержащий в себе навигационные ссылки для сайта, если они разрешены в фичах инфо-файла
Содержимое страницы по умолчанию
  • $left - регион. Содержит в себе html код для левой колонки. Если в инфо-файле задать любые регионы, то он пропадает
  • $breadcrumb - "хлебные крошки" для текущей страницы
  • $title - заголовок страницы
  • $help - динамические подсказки, в основном показываются в админке
  • $messages - выводит сообщения об ошибках и предупреждениях на сайте
  • $tabs - ссылки (табы), связывающие текущую страницу с её подстраницами (к примеру для статьи - с её страницей редактирования)
  • $content - содержимое текущей страницы
  • $right - регион. Содержит в себе html код для правой колонки. Если в инфо-файле задать любые регионы, то он пропадает
Нижняя область/закрывающие данные
  • $feed_icon - строка со всеми иконками обратной связи для текущей страницы
  • $footer_message - сообщение внизу страницы. Настраивается в mysite.ru/admin/settings/site-information
  • $footer - регион. Содержит в себе html код для нижней части страницы. Если в инфо-файле задать любые регионы, то он пропадает
  • $closure - закрывающая метка для всех модулей, которые изменяли страницу. Эту переменну обязательно надо выводить после всего динамического содержимого. Лучше всего перед закрытием тэга BODY

Тут перечислены все стандартные переменные . Но вы можете добавлять сюда свои переменные либо в роли регионов через info -файл, либо в любой другой роли через файл template.php (о нём чуть позже).

Теперь я покажу какой код должен находиться в page.tpl.php и в какой код он потом интерпретируется браузерами. Перед вами кусок кода из page.tpl.php :

В первой строке идёт проверка, есть ли вообще заголовок у текущей страницы. Если его нет - то отладчик просто пропустит этот код, и не будет заходить внурть его. Если же заголовок существует, то в html код страницы добавятся тэг , после него будет напечатан заголовок страницы, и всё это закроется тэгом . Если смотреть код этой страницы в браузере, то он выглядел бы так:

Урок 4 . Необходимые файлы для создания шаблона. Page.tpl.php

Таким образом оборачиваются почти все переменные сайта. Это делается для того, чтобы мы могли прописывать стили для контента, заранее не зная, какой он будет.

Вот таким образом выглядит стандартный файл page.tpl.php , который идёт вместе с друпалом. Меняйте название классов, переставляйте местами переменные - и смотрите что из этого получается. Это надо для того, чтобы "пощупать" как оно работает и что выводится в результате.

" />

Это простейший вариант. Всё прокомментировано, поэтому вопросов по этому примеру возникнуть не должно. И по сути любая страница состоит из таких вот блоков. Ваша задача взять нужные блоки (функция getTemplate() ), заменить нужными данными (функция str_replace() и данные полученные, например, из базы), а потом просто соединить все блоки, как обычные строки, и вывести всё на страницу.

Безусловно, без ООП здесь очень проблемно будет. Вы такое количество условий наплодите (страниц же много), что быстро запутаетесь. Но принцип использования tpl-файлов , надеюсь, Вы осознали. Дальше уже самостоятельно подумайте, как всё это обернуть в ООП , чтобы всё было максимально простым с точки зрения понимания кода и его сопровождения в будущем.

Всем привет. Хочу представить очередной велосипед написанный на 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:
Нам нужно создать Новый элемент в первом попавшемся span-элементе

$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 дописывает page и когда класс увидит этот тэг он заменит его на содержимое файла page.html

Количество таких вставок не ограничено и их расположение абсолютно не критично, поэтому можно вставлять их как угодно и в любом количестве.

Вот пожалуй и все, если что-то вспомню, сообщу дополнительно. Спасибо что дочитали до конца.

Теги: php, класс, template, шаблонизатор, парсер