в этой части мы поговорим о расширении класса контроллера, который позволяет нам создавать шаблоны
Шаблон - это не более чем вид, который базируется на вашем собственном (X)HTML коде
Перед тем как вставлять код в файл, давайте создадим папку в “/application/views/” под названием “templates”
Теперь откройте IDE в котором вы предпочитаете работать, создайте новый файл и вставьте в него следующее:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Language" content="en-us" /> <title><?php echo $title;?></title> <meta name="keywords" content="<?php echo $meta_keywords;?>" /> <meta name="description" content="<?php echo $meta_description;?>" /> <meta name="copyright" content="<?php echo $meta_copywrite;?>" /> <?php foreach($styles as $file => $type) { echo HTML::style($file, array('media' => $type)), "\n"; }?> <?php foreach($scripts as $file) { echo HTML::script($file, NULL, TRUE), "\n"; }?> </head> <body> <div id="container"> <?php echo $header;?> <?php echo $content;?> <?php echo $footer;?> </div> </body> </html>
И сохраните как “default.php” в вашей папке “/application/views/templates/”.
Как вы можете заметить, это выглядит немного похоже на вид который мы делали немного раньше, но он немного расширен
В отличии от вида, этот шаблон будут использовать почти все ваши проекты
С того времени как мы начнем использовать этот файл как шаблон или каркас, он сократит огромное кол-во кода, который бы пришлось вводить в каждом отображении
Теперь у нас есть шаблон, и наша система ничего не может с ним сделать до тех пор пока мы не скажем
Давайте вернемся к нашей IDE и создадим новый файл и вставим в него следующие строки:
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_DefaultTemplate extends Controller_Template { public $template = 'templates/default'; /** * Initialize properties before running the controller methods (actions), * so they are available to our action. */ public function before() { // Run anything that need to run before this. parent::before(); if($this->auto_render) { // Initialize empty values $this->template->title = ''; $this->template->meta_keywords = ''; $this->template->meta_description = ''; $this->template->meta_copywrite = ''; $this->template->header = ''; $this->template->content = ''; $this->template->footer = ''; $this->template->styles = array(); $this->template->scripts = array(); } } /** * Fill in default values for our properties before rendering the output. */ public function after() { if($this->auto_render) { // Define defaults $styles = array('assets/css/reset.css' => 'screen'); $scripts = array('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'); // Add defaults to template variables. $this->template->styles = array_reverse(array_merge($this->template->styles, $styles)); $this->template->scripts = array_reverse(array_merge($this->template->scripts, $scripts)); } // Run anything that needs to run after this. parent::after(); } }
И сохраним это как “defaulttemplate.php” в папке “/application/classes/controller/”
Написанный выше код расширяет класс “Controller_Template” и делает 3 основные вещи:
инициализирует некоторые переменные на доступность использования их вашими методами (actions) и
присоединяет стандартное значение им,
привязывает их к нашим шаблонным переменным перед тем, как окончательно визуализировать и вывести на экран
Это место где цикл foreach() "вступает в игру"
Цикл foreach() использует статический метод для вспомогательного класса “HTML”, один для загрузки CSS, а другой для загрузки файлов JS
Оба эти вспомогательных метода будут выполнять одно и то же действие через массив и заключать в оболочку определенного тега
Вы наверно удивитесь когда узнаете, что такое “Helper”
вот небольшое определение из документации Kohana PHP 2.x documents:
Helpers – простые, “удобные” функции созданные для того, чтобы облегчить вам разработку
Вспомогательный модули похожи на класс библиотеки, но есть одно отличие
При работе с библиотеками, вы должны создать экземпляр класса библиотек для использования
Хэлперы являются статическими методами класса, и для них не требуется введение экземпляра для работы
Их вполне можно называть “общими функциями”
С библиотеками, вспомогательные классы автоматически запускаются фреймворком, когда их используют, и нет нужды их запускать вручную
Вернемся к нашим баранам
Вы наверное заметили, что присутствует ссылка на “assets/css/reset.css"
В корневом каталоге создайте папку под названием “assets” и в этой папке создайте еще одну под названием “css”
Для файла “reset.css”, я зашел на Serene Destiny и скопировал код из статьи под названием “Создать идеальный CSS reset” и сохранил как “reset.css” в папке “assets/css/”
* { padding: 0; margin: 0; } ul { list-style:none; } a { text-decoration: none; } a:hover { text-decoration: none; } a:visited { text-decoration: none; } a { text-decoration: none; color:#FFFFFF; } a:hover { text-decoration: none; color:#000000; }
Вы можете так же создать другие папки в “/assets/”, может быть “images”, “js” и “files”
В основном папка "assets" используется для хранения статических файлов
Наше приложение не знает, что делать и нам следует модифицировать наш контроллер
Откроем “/application/classes/controller/ko3.php”
Для изменения класса, который мы расширяем, измените эту строку:
class Controller_Ko3 extends Controller
На:
class Controller_Ko3 extends Controller_DefaultTemplate
Нам также нужно сменить наш “index” ( метод action_index() ) на:
public function action_index() // v9 >>> { $ko3_inner = array(); $ko3 = array(); $this->template->title = 'Kohana 3.0'; View::set_global('x', 'This is a global variable'); $ko3_inner['content'] = 'We have more data'; $ko3['content'] = 'We have data'; $ko3['ko3_inner'] = View::factory('blocks/ko3_inner', $ko3_inner) ->render(); $this->template->content = View::factory('pages/ko3', $ko3); } // v9 <<<
Сохраните это
Вы можете заметить, что теперь у нас есть
“$this->template->title = ‘Kohana 3.0?;”
это будет присваивать значение нашей шаблонной переменной “title”
Следующее о чем вам следует знать - отсутствие метода “render()”
Метод “factory()” будет фактически “авто-визуализировать” в нашей шаблонной переменной “content”
Легко, правда?
Есть еще одна вещь, которую мы должны сделать, перед тем как запускать страницу – загрузить файл вида “ko3.php”, который находится в “application/views/pages/”
Вы могли заметить, что в нашем отображении есть весь "шелл" код, так давайте уберем его
Все, что вам нужно иметь в файле отображения:
<h1>This is my first view</h1> <?php echo $content;?> <?php echo $ko3_inner; ?> <br/><?php echo $x;?>
Если вы сейчас загрузите его, вы увидите, что заголовок страницы теперь “Kohana 3.0? и выглядит она немного похоже на страницу из прошлой обучалки
Но если вы посмотрите на код, то он в корне отличается
вы можете сильно удивиться переменным в шаблонах и тому, что с ними делать
Давайте вернемся и отредактируем наш метод “index” еще раз
Сделайте его таким:
public function action_index() // v10 >>> { $ko3_inner = array(); $ko3 = array(); $this->template->title = 'Kohana 3.0'; $this->template->meta_keywords = 'PHP, Kohana, KO3, Framework'; $this->template->meta_description = 'A test of of the KO3 framework'; $this->template->styles = array('assets/css/red.css' => 'screen'); $this->template->scripts = array('assets/js/jqtest.js'); View::set_global('x', 'This is a global variable'); $ko3_inner['content'] = 'We have more data'; $ko3['content'] = 'We have data'; $ko3['ko3_inner'] = View::factory('blocks/ko3_inner', $ko3_inner) ->render(); $this->template->content = View::factory('pages/ko3', $ko3); } // v10 <<<
Довольно просто
Вы наверно заметили, что я не заполнил header и footer
Я уверен, вы знаете , что с ними делать
Подсказка:
Сформируйте отображение к этим переменным
Вы наверно заметили, что я ввел “assets/css/red.css” and “assets/css/jqtest.js”
Давайте сделаем эти файлы начиная с “/assets/css/red.css”:
h1 { color: #FF0000; }
Следующий “/assets/js/jqtest.js”:
$("document").ready(function() { alert('Hello Kohana!'); });
Сохраните и обновите сайт
Вы сможете увидеть всплывающие сообщение об ошибке, и первую строку в тексте выделенную красным
Сегодня мы создали свой шаблон, расширили шаблонный контроллер и наш контроллер стал использовать этот шаблон
Есть куча всего, что можно сделать используя только это
В следующий раз, речь пойдет о моделях
удачного кодинга!
Использованы материалы: Unofficial Kohana 3 Wiki, Kohana PHP 2.x Docs