Добрый день! Не так давно я начал свое знакомство с фреймворками в принципе и сразу столкнулся со следующим вопросом - как организовать простую смену шаблонов, чтобы в любой момент можно было добавить, скажем, еще одну папку с шаблоном в папку шаблонов и безболезненно изменить шаблоны в будущем.
Но в 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
-
Горячие Клавиши В Оболочке
19 Oct, 24 -
«Сетевая Нирвана» Наступит В 2020 Году
19 Oct, 24