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

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

Kohana
В 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. /**<br/> * Вставка стилевых и javascript-файлов<br/> *<br/> * @author Valera Sizov<br/> */
  4. class head
  5. {
  6. static $styleFiles = array();
  7. static $jsFiles = array();
  8. static public function addingFiles($layout)
  9. {
  10. $css = array_merge(Kohana::config('style.files'),self::$styleFiles);
  11. $js = array_merge(Kohana::config('js.files'),self::$jsFiles);
  12. $out = '';
  13. foreach ($css as $file)
  14. {
  15. $out .= '<link rel="stylesheet" type="text/css" href="/static/css/'.$file.'.css">'."\n";
  16. }
  17. foreach ($js as $file)
  18. {
  19. $out .= '<script src="/static/js/'.$file.'.js" type="text/javascript"></script>'."\n";
  20. }
  21. return str_replace('</head>', '$out."\n".</head>', $layout);
  22. }
  23. static public function addCss($css)
  24. {
  25. if(is_array($css)){
  26. self::$styleFiles = array_merge(self::$styleFiles,$css);
  27. } else {
  28. self::$styleFiles = array_merge(self::$styleFiles,array($css));
  29. }
  30. }
  31. static public function addJs($js)
  32. {
  33. if(is_array($js)){
  34. self::$jsFiles = array_merge(self::$jsFiles,$js);
  35. } else {
  36. self::$jsFiles = array_merge(self::$jsFiles,array($js));
  37. }
  38. }
  39. static public function removeCss()
  40. {
  41. Kohana::config_set('style.files', array());
  42. }
  43. static public function removeJs()
  44. {
  45. Kohana::config_set('js.files', array());
  46. }
  47. static public function addOnlyCss($css)
  48. {
  49. self::removeCss();
  50. self::addCss($css);
  51. }
  52. static public function addOnlyJs($js)
  53. {
  54. self::removeJs();
  55. self::addJs($js);
  56. }
  57. }
  58. ?>

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

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

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

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

В хелпере есть целый набор методов.
Планирую еще его немного дописать в строну проверки на дубликаты.
Мой блог
Теги:cssjsviewkohana
Хабы: Kohana
Всего голосов 16: ↑10 и ↓6+4
Просмотры2.6K

Похожие публикации

Лучшие публикации за сутки