Как стать автором
Обновить

Двухпроходное View в Kohana

Время на прочтение5 мин
Количество просмотров2.8K
В Kohana я обычно использую класс Template_Controller. Очень удобно — layout один, изменяешь только контент. Но как быть если на одной какой-то странице нам понадобилось подключить CSS- или JS-файл?! C js- файлом еще ладно, его можно подключить посредине страницы (но это как-то некрасиво), а как же css?! — это невалидно. Подключать на весь layout тоже неохота. Хочу подключать не в контроллере, а в шаблоне к примеру так:
Copy Source | Copy HTML
  1. <?php head::addCSS('main')?>

и так чтобы файл корректно подключился в head документа. Ничего нового здесь нет. В фреймверке symfony это уже реализовано с первой версии. И естественно что другого способа как обрабатывать готовый к выбросу html просто не может быть. Механизм очень простой забираем у Kohana полностью готовый документ и добавляем туда нужные нам строки. Сделать это можно с помощью хука, но я решил сделать это с помощью переопределения контроллера.
Добавляем хелпер head.php в папку application/helpers
Copy Source | Copy HTML
  1. <?php
  2. /* <br/> * Хелпер аккумулирует вставляемые css и js файлы<br/> * И в конце вставляет их в layout<br/> */
  3.  
  4. /**<br/> * Вставка стилевых и javascript-файлов<br/> *<br/> * @author Valera Sizov<br/> */
  5. class head
  6. {
  7.     static $styleFiles = array();
  8.     static $jsFiles = array();
  9.     static public function addingFiles($layout)
  10.     {
  11.         $css = array_merge(Kohana::config('style.files'),self::$styleFiles);
  12.         $js = array_merge(Kohana::config('js.files'),self::$jsFiles);
  13.         $out = '';
  14.         foreach ($css as $file)
  15.         {
  16.             $out .= '<link rel="stylesheet" type="text/css" href="/static/css/'.$file.'.css">'."\n";
  17.         }
  18.         foreach ($js as $file)
  19.         {
  20.             $out .= '<script src="/static/js/'.$file.'.js" type="text/javascript"></script>'."\n";
  21.         }
  22.         return str_replace('</head>', '$out."\n".</head>', $layout);
  23.     }
  24.     static public function addCss($css)
  25.     {
  26.         if(is_array($css)){
  27.             self::$styleFiles = array_merge(self::$styleFiles,$css);
  28.         } else {
  29.             self::$styleFiles = array_merge(self::$styleFiles,array($css));
  30.         }
  31.     }
  32.     static public function addJs($js)
  33.     {
  34.         if(is_array($js)){
  35.             self::$jsFiles = array_merge(self::$jsFiles,$js);
  36.         } else {
  37.             self::$jsFiles = array_merge(self::$jsFiles,array($js));
  38.         }
  39.     }
  40.     static public function removeCss()
  41.     {
  42.         Kohana::config_set('style.files', array());
  43.     }
  44.     static public function removeJs()
  45.     {
  46.         Kohana::config_set('js.files', array());
  47.     }
  48.     static public function addOnlyCss($css)
  49.     {
  50.         self::removeCss();
  51.         self::addCss($css);
  52.     }
  53.     static public function addOnlyJs($js)
  54.     {
  55.         self::removeJs();
  56.         self::addJs($js);
  57.     }
  58.  
  59. }
  60. ?>

Создаем контроллер application/libraries/BaseController.php от которого будем наследовать наши контроллеры:
Copy Source | Copy HTML
  1. <?php
  2. abstract class BaseController extends Template_Controller {
  3.  
  4.     public $template='frontend/layout';
  5.     public function _render()
  6.         {
  7.                 if ($this->auto_render == TRUE)
  8.                 {
  9.                         // Render the template when the class is destroyed
  10.             echo head::addingFiles((string)$this->template);
  11.             //$this->template->render(TRUE);
  12.                 }
  13.         }
  14. }
  15. ?>

И теперь создаем два конфига application/config/style.php:
Copy Source | Copy HTML
  1. <?php
  2. /*Перечисление javascript - файлов которые будут присоеденены к главному шаблону по умолчанию<br/>  потом вы можете переопределить их или дополнить */
  3. $config['files'] = array();
  4.  
  5. ?>

И второй application/config/js.php:
Copy Source | Copy HTML
  1. <?php
  2. /*Перечисление javascript - файлов которые будут присоеденены к главному шаблону по умолчанию<br/>  потом вы можете переопределить их или дополнить */
  3. $config['files'] = array();
  4.  
  5. ?>

На этом все. Можно еще конечно оформить это все в виде модуля, так наверное даже удобнее будет переносить из проекта в проект. Но это кому надо сделает сам.
Теперь прописываем в конфиге дефолтные файлы которые нужно подключать. А далее где необходимо в шаблоне пишем:
Copy Source | Copy HTML
  1. <?php head::addCss('form_contacts')?>

В хелпере есть целый набор методов.
Планирую еще его немного дописать в строну проверки на дубликаты.
Мой блог
Теги:
Хабы:
+4
Комментарии12

Публикации

Изменить настройки темы

Истории

Ближайшие события

PG Bootcamp 2024
Дата16 апреля
Время09:30 – 21:00
Место
МинскОнлайн
EvaConf 2024
Дата16 апреля
Время11:00 – 16:00
Место
МоскваОнлайн
Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн