Упрощение Изменения Шаблонов При Использовании Kohana 3.

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

Но в Kohana 3 (насчет других фреймворков, к сожалению, ничего сказать не могу, так как работал с ними лишь поверхностно), во-первых, все файлы View располагаются в папкеviews (ведь шаблоны проще и понятнее для среднестатистического пользователя).

user), а во-вторых, нет механизма выбора нужного файла View из папки Views (кроме его прямого подключения).

Что ж, теперь я хочу рассказать вам, как это реализовать.

Используемая версия фреймворка — 3.0.7, последняя на данный момент. Давайте начнем.



Возможность использовать папку «Шаблоны» вместо «Представления».

Сначала давайте посмотрим на файл Kohana_View, который унаследован фиктивным классом View. Класс довольно простой, но нас конкретно интересует функция set_filename() — именно в ней «жестко» указано, где искать файл View:

public function set_filename($file) { if (($path = Kohana::find_file('views', $file)) === FALSE) { throw new Kohana_View_Exception('The requested view :file could not be found', array( ':file' => $file, )); } // Store the file path locally $this->_file = $path; return $this; }

Теперь давайте создадим наш класс Template, унаследовав Kohana_View и слегка изменив функцию set_filename:

public function set_filename($file) { $folder = 'templates/'.

self::get_name(); if (($path = Kohana::find_file($folder, $file)) === FALSE) { throw new Kohana_View_Exception('The requested layer :file could not be found', array( ':file' => $file, )); } // Store the file path locally $this->_file = $path; return $this; }

Здесь мы видим вызов статической функции, которой нет в родительском классе — self::get_name() — давайте теперь ее напишем.

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



public static function get_name() { $template = DB::select('value') ->from('config') ->where('key', '=', 'template') ->limit(1) ->execute() ->current(); return $template['value']; }

Теперь при необходимости мы легко можем узнать имя текущего шаблона, вызвав Template::get_name().

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

Дальше по списку у нас фабрика – без излишеств:

public static function factory($file = NULL, array $data = NULL) { return new Template($file, $data); }

Вот и все, с файлом шаблона мы закончили, его можно сохранить как application/classes/template.php.

Пишем свой Controller_Template

Теперь напишем собственный контроллер Controller_Template, взяв за основу предлагаемый фреймворком Kohana_Controller_Template:

class Controller_Template extends Controller{ /** * @var string template layer */ public $layer = 'index'; /** * @var boolean auto renders template */ public $auto_render = TRUE; /** * Loads the template object (Template instance) */ public function before() { if($this->auto_render === TRUE) { $this->template = Template::factory($this->layer); return parent::before(); } /** * Assigns the template as the request response. */ public function after() { if($this->auto_render === TRUE) { $this->request->response = $this->template; } return parent::after(); } }

Теперь, скажем, при написании контроллера авторизации, который будет использовать отдельный слой templates/[имя_шаблона]/auth.php, достаточно будет наследовать его от Controller_Template и добавить строку общественный $layer = 'auth'; Вот и все, собственно.

Буду рад, если моя статья кому-то поможет. Также буду рад любой здоровой критике, вопросам, комментариям.

В общем, поэтому и написал.

:) Спасибо за внимание.

Теги: #шаблон #Чулан #кохана #ko3

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.