Шаблоны контроллера
На этой странице рассмотрена только работа с шаблонами из контроллера, то есть их подключение. Внутреннее устройство самих шаблонов рассмотрено в соответствующем разделе.
Инициализация
Для работы с шаблонами внутри контроллера нужно получить экземпляр класса cmsTemplate:
$template = cmsTemplate::getInstance();
или обратиться к свойству объекта контроллера
$this->cms_template;
Т.е. в данном примере $template
будет одно и тоже, что и $this→cms_template
. В файлах контроллеров предпочтительнее использовать $this→cms_template
, поскольку код будет выглядеть чище.
Вывод шаблона
Шаблоны относящиеся к текущему компоненту должны находиться в папке /templates/default/controllers/{имя компонента} и иметь расширение *.tpl.php.
Рассмотрим вывод шаблона на примере компонента example.
Создадим файл /templates/default/controllers/example/hello.tpl.php:
<h1>Hello world! My name is <?php html($name); ?>.</h1>
Шаблон представляет из себя файл, содержащий HTML-разметку и PHP-инструкции для вывода данных. В нашем случае в шаблоне будет выводиться переменная $name. Значение этой переменной будет передаваться из контроллера. Функция html() в шаблоне выводит содержимое переменной (через htmlspecialchars()).
Чтобы вывести созданный шаблон внутри экшена контроллера нужно использовать метод render($template_name[, $data]) полученного ранее объекта $template:
class example extends cmsFrontend{ public function actionIndex(){ // инициализируем систему шаблонов $template = cmsTemplate::getInstance(); // выводим шаблон /templates/default/controllers/example/hello.tpl.php return $template->render('hello', ['name' => 'Vasiliy']); } }
или вот так, что будет равнозначно:
class example extends cmsFrontend{ public function actionIndex(){ // выводим шаблон /templates/default/controllers/example/hello.tpl.php return $this->cms_template->render('hello', ['name' => 'Vasiliy']); } }
Метод render($template_name[, $data[, $request]]) принимает три аргумента:
- Название файла шаблона (без .tpl.php) — файл будет браться из папки шаблонов данного компонента
- (необязательный) Массив данных для вывода в шаблоне — в виде пар Название ⇒ Значение
- (необязательный) Объект request. Если он не указан, то будет использован объект request от контекста контроллера.
Можно в первый параметр метода render сразу передавать массив данных для вывода в шаблоне, пропуская указание имени шаблона. В этом случае имя шаблона будет по имени текущего экшена. Например, всё тот же экшен index:
class example extends cmsFrontend{ public function actionIndex(){ // выводим шаблон /templates/default/controllers/example/index.tpl.php return $this->cms_template->render(['name' => 'Vasiliy']); } }
В этом случае движок будет искать файл index.tpl.php.
Изменение общего макета
Общий макет — это основной шаблон всех страниц сайта, содержащий теги <html>, <head> и <body>. Внутри него выводятся шаблоны компонентов и виджетов.
Каждая тема оформления может включать в себя несколько макетов.
Например, тема оформления поставляемая в комплекте с InstantCMS называется default и содержит два макета - main и admin, которые хранятся в файлах:
- /templates/default/main.tpl.php
- /templates/default/admin.tpl.php
По-умолчанию для всех страниц сайта используется макет main, а компонент «Панель управления» использует макет admin. Переключение макета происходит в контроллере компонента следующим образом:
$this->cms_template->setLayout('admin');
Метод setLayout($layout_name) переключает макет для текущего вызова.
Если компонент использует собственный макет (или несколько макетов) то при смене темы оформления новая тема должна содержать в себе одноименные макеты, иначе компонент не будет совместим с темой.