При написании проекта на Framework Kohana мне потребовалось подключить шаблонизатор Twig.
Для начала установим в Kohana модуль для работы с шаблонизатором - я использую этот модуль. Разворачиваем все это дело в кохану в директотрию modules. Twig разворачиваем в vendor - таким образом получется, что файлы шаблонизатора лежат по пути modules\twig\vendor\Twig\lib\Twig\.
В файле application/bootstrap.php для подключения модуля нужно добавить строчку:
Kohana::modules(array( 'twig' => MODPATH.'twig'. ))
Всё, можно использовать в контроллерах так:
$this->response->body( Twig::factory('template_file') );
Здесь template_file — файл шаблона, например main.twig, который ищется в application/views или views всех модулей. Где искать файлы шаблонов и расширение шаблонов указывается в настройках Twig (см. ниже).
Если же понадобится добавить свою функцию в Twig, то сделать это можно так:
В папке Extension создаем файл с нашим расширением, для примера добавим функцию unserialize(). Обратите внимание на имя класса - оно повторяет путь.
class Twig_Extension_Unserializer extends Twig_Extension { //здесь мы и определяем нужную нам функцию public function getFunctions() { return array('unserializer' => new Twig_Function_Function('unserialize', array())); } //обязательно public function getName() { return 'unserializer'; } }
Копируем файл modules\twig\config\twig.php в application\config\twig.php и настраиваем Twig:
return array ( 'environment' => array ( 'debug' => FALSE, 'trim_blocks' => FALSE, 'charset' => 'utf-8', 'base_template_class' => 'Twig_Template', 'cache' => APPPATH.'cache/twig', 'auto_reload' => TRUE, 'strict_variables' => FALSE, 'autoescape' => FALSE, 'optimizations' => -1, ), //************* 'extensions' => array ( // Добавляем нашу функцию unserializer 'Twig_Extension_Unserializer', ), //************* 'templates' => APPPATH.'views', 'suffix' => 'twig', 'context_object' => TRUE, );
Все готово, можно использовать. В шаблоне передается массив записей, поле записи content было сериализировано при записи в базу:
{% block main_content %} {% for item in posts %} {% set a = unserializer(item.content) %} {% endfor %} {% endblock %}
Но этом все.
Мне больше нравится как работает с twig-файлами Codelobster - http://www.codelobster.com/twig.html
Почему то не работает пишет при подключении в контроллере
$this->response->body( Twig::factory('template_file') );
пишет ошибку что не может найти класс Twig
Возможно вы забыли подключить его в bootstrap.php, либо вы его скопировали в другую папку.
Проверьте может у вас константа MODPATH не на тот каталог указывает
Зачем изобретать велосипед? https://github.com/WinterSilence/kohana-tpl
Сделал так, выдало ошибку :
ErrorException [ Fatal Error ]: Class 'Twig_Autoloader' not found
MODPATH\kohana-twig\classes\Kohana\Twig.php [ 35 ]
30 * @throws Kohana_Exception
31 * @return bool
32 */
33 public static function init()
34 {
35 Twig_Autoloader::register();
В чем может быть дело?