Pull to refresh

Универсальная шаблонизация для Kohana 3.1

Reading time5 min
Views4.7K
Здравствуйте, уважаемые жители Хабра.

Достаточно долгое время я работал с различными движками, фреймворками и иными самописными вариантами двигателя прогресса PHP, в следствие чего тогда еще юный и жаждущий перемен мозг сложил свое и, как это обычно бывает, весьма амбициозное впечатление о том, что нужно делать всё. Вот, совсем всё.

Копаясь в таких монструозных штуках, как Drupal или Joomla, я понимал, что да, обилие развитого API и наличие большого количества модулей делает такие движки незаменимыми при создании сайтов практически любой сложности, однако, переходя на более простые вещи, вроде MVC фреймворков CodeIgniter или Kohana (последний, по существу, следует концепциям HMVC), приходило понимание, что колоть орехи ракетами земля-земля не всегда удобно, и легкость не только в обращении с кодом, но и в работе самого сайта, что называется, «решает».

В настоящий момент я работаю на MVC (или HMVC, если быть точным) фреймворке Kohana, в частности, на ветках версий 3.0 и 3.1, и, попытавшись найти наиболее полное и элегантное решение для адекватной шаблонизации сайта, я с удивлением обнаружил, что либо мои навыки гугления морально устарели, либо действительно результаты подвели, но однозначно объективного лидера для моей задачи нет.

Собрав некоторые из своих мыслей и наработок, я решил объединить их в удобную и интуитивную систему шаблонизации.

Сразу говорю, приводить весь код не буду, так как он занимает довольно много строк, плюс, включает в себя не описание не только контроллера, но и некоторых представлений, потому расскажу общий принцип работы шаблонизатора с небольшими примерами.

В основе шаблонизации лежит контроллер template.php, который необходимо положить в APPPATH.classes/controller/

Сам управляющий контроллер описан так:
abstract class Controller_Template extends Controller

Следовательно, чтобы ваш контроллер смог использовать возможности шаблонизации, его необходимо наследовать от управляющего, например:
class Controller_Welcome extends Controller_Template

Общие возможности шаблонизатора


  • meta, script, style — функции добавления meta-тегов, ссылок на js скрипты и css-файлы.
  • Заголовок — Установка заголовка страницы.
  • Хлебные крошки — позволяет строить цепь «хлебных крошек» навигации на основе уже созданных в пути.
  • Контент — «блочное» заполнение ключевой переменной $content, являющейся основным содержимым страницы.
  • Регионы — «блочное» заполнение контент-переменных для различных мест на странице, вроде header, footer и так далее.
  • Пейджер — Простая генерация линейки ссылок на странице на основе номера текущей страницы и общего количества элементов.
  • Возвращение трех разных видов контента в зависимости от запроса (HMVC, AJAX или обычный).


На вид, количество функций не особо и впечатляет, но я не ставил перед собой целью (во всяком случае, на первое время) сотворить из этого функционал на уровне phptemplate или чего-то другого более громоздкого и всеобъемлющего. Указанных выше функций хватает, чтобы определить центральную систему шаблонизации сайта, и больше не мучиться, и это главная задача, которая стояла передо мной.

Дальше приведу краткое описание происходящих в контроллере махинаций.

Работа контроллера


Для того, чтобы наш контроллер, для которого мы включаем шаблонизацию, не ругался, необходимо в его функции before указать строчку parent::before() для того, чтобы инициализировать шаблонизатор.

Во время инициирования шаблонизатора и, соответственно, автоматического выполнения его функции before происходят следующие действия:
— Загрузка конфига шаблонизатора
— Проверка и установка пейджера, если передан аргумент page
— Создание «пустого» представления и обнуление шаблонных переменных

После этих действий шаблон уже готов к работе и может запускаться даже без установки каких-либо параметров. Сам запуск осуществляется автоматически, без вызова каких-либо функций вроде render() или других, что избавляет нас от необходимостью следить за процессом генерации контента.

Однако, наша цель ведь, наоборот, стояла в том, чтобы обеспечить нам возможность легкого управления шаблоном, не так ли?

Для модификации страницы можно использовать следующие конструкции в любом месте функций контроллера:

Список предоставляемых функций

  • target($path) — устанавливает путь для главного файла представления, на котором будет работать шаблонизатор. Если путь не установлен, берется стандартный из папки шаблона в представлениях.
  • meta_name($title, $content) — устанавливает мета-тег вида \<meta name='name' content='content'\>.
  • meta_equiv($title, $content) — устанавливает мета-тег вида \<meta http-equiv='name' content='content'\>.
  • breadcrumb($link, $title, $strict = false) — устанавливает хлебную крошку в уже имеющийся путь. С параметром $strict по умолчанию новый путь приклеится к уже существующему, в противном случае будет создана абсолютная ссылка.
  • title($title) — устанавливает заголовок страницы.
  • content($html, $clear = false) — добавляет блок в контент-переменную страницы. По умолчанию в функцию передается готовый к рендеру объект класса VIEW, но в случае установки флага $clear содержимое понимается как чистый html.
  • region($region, $html, $clear = false) — добавляет блок в одну из региональных переменных страницы. Работает по аналогии с функцией content, только требует указать название региона.
  • alias($region, $alias = '') — создает алиас для уже созданного региона страницы. По умолчанию, все регионы хранятся в массиве $regions, а эта функция позволяет задать им прямую переменную вида $алиас
  • add_style($path) — добавляет css файл. Путь берется относительно медиа-пути, указанного в конфиге шаблонизатора.
  • add_script($path) — добавляет js файл. Путь берется относительно медиа-пути, указанного в конфиге шаблонизатора.
  • pager($all) — создает линейку пейджера на основе общего количества каких-либо элементов. Если страница не задана, а функция вызывается, шаблонизатор генерирует линейку для первой страницы.


Мелкие замечания

Указанные выше функции работают в любом порядке и действуют как накопители информации, которая компилируется и рендерится уже после выполнения пользовательского экшена, поэтому нет нужды следить за правильной последовательностью генерации шаблона.

Функции генерации хлебных крошек, пейджера и блоков контента и регионов использую свои представления, хранящиеся в папке представлений шаблонизатора по путям, соответственно, breadcrumbs, pager и blocks.

В зависимости от типа запроса, которым вызывается тот или иной action, шаблонизатор возвращает разный контент. Для HMVC запроса это будет только скомпилированная и отрендеренная контент-переменная страницы, для AJAX запроса будет та же переменная, но завёрнутая в json_encode, а обычный запрос полностью выполнит рендер всей страницы.

Итого



Подводя итоги, скажу еще раз, что шаблонизатор не претендует на звание лучшей темизационной машины для Kohana, а представляет собой просто удобную совокупность идей для облегченного управления видом страницы. Замечу, что здесь есть, куда расти, например, добавить возможность рендера в html или xhtml, прикрутить механизм выгрузки css-стилей и js-скриптов в соответствующие теги style и script для отображения их в результате в качестве текста, а не ссылок на случай AJAX или HMVC-запроса, и еще много других вкусных плюшек, но это будет делаться по мере надобности.

Вскоре эта ветка будет залита в гит, чтобы каждый желающий мог легко скачать и обновлять файлы по мере расширения функционала, а пока приношу извинения за ссылку на файл. Модификации и видоизменения приветствуются.

Надеюсь, этот шаблонизатор кому-то поможет и избавит от лишних проблем.

Спасибо всем за внимание, буду рад услышать конструктивную критику и предложения!
Tags:
Hubs:
+5
Comments34

Articles