Pull to refresh

Знакомство с Kohana 3.0 — Часть 3

Reading time5 min
Views6.4K
Original author: ellisgl
Встречайте третью часть цикла статей по разработке с Kohana PHP V3 (KO3). Предыдущие части можно найти по метке "знакомство с kohana 3.0". В этот раз речь пойдет о создании шаблонов.

Во второй статье мы рассмотрели виды, а теперь будем наследовать классы Controller'а, что позволит создать шаблон. Шаблон представляет собой вид, который состоит по большей части из (X)HTML кода.

Прежде чем начать заполнять файлы кодом, создадим новую папку в “/application/views/” и назовем ее “templates”. Теперь в любимом редакторе создайте чистый документ и вставьте туда следующее:

<!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/”.

Как видите, этот код по сути выглядит как те виды, которые мы создавали во второй части, только в более расширенной и универсальной, а потому подходящей к использованию во всем проекте, версии. На “foreach” я остановлюсь позже.

На данный момент у нас есть шаблон, но нет указаний системе что-либо с ним делать. Поэтому давайте создадим новый файл со следующим содержимым:

<?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 ot 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” и делаем три базовые операции: делаем некоторые свойства (переменные) доступными нашим методам (экшенам), присваиваем им значения по умолчанию, а затем связываем их с переменными из шаблона перед его визуализацией. Здесь и начинает работать цикл foreach() из шаблона. Он использует статические методы класса-помощника “HTML”: один для загрузки стилей CSS, другой для файлов JavaScript. Эти методы, выполнившись в цикле, создадут корректный HTML-код для подключения файлов. Они принимают как URL, так и относительный путь.

Если вы не знаете, что такое класс-помощник, то вот краткое определение из документации Kohana 2.x:
Помощники — это удобные функции, которые призваны помочь вам с разработкой.

Они похожи на библиотечные функции, но есть небольшое различие. В случае с библиотеками необходимо создавать экземпляр библиотечного класса, чтобы использовать его методы. Помощники же являются статическими методами класса, который автоматически загружается фреймворком, так что нет нужды производить дополнительные действия.

Итак, вернемся к коду. Как вы могли заметить, в нем присутствует упоминание “assets/css/reset.css”, так что давайте с этим разберемся. В корневой папке создайте директорию “assets”, а в ней — “css”. Стили я скопировал из статьи “Create The Perfect CSS Reset” и засунул в файл “reset.css”, который поместил в “assets/css/.” Можете внутри папки “/assets/” также создать директории “images”, “js” и “files”. Эта папка будет использоваться для хранения статических файлов.

Пока еще наше приложение не знает, что со всем этим делать, поэтому давайте изменим наш контроллер. Откройте “/application/classes/controller/ko3.php” и замените строку:

class Controller_Ko3 extends Controller

на:

class Controller_Ko3 extends Controller_DefaultTemplate


Также нужно привести экшен “index” (метод action_index()) к следующему виду:

public function action_index()
 {
    $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);
 }


Сохраните файл. Возможно вы заметили, что добавилась строка “$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()
 {
    $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);
 }


Довольно просто. Возможно вы заметили, что я не заполнил хэдер и футер страницы. Но, уверен, вы догадаетесь, что тут нужно сделать. Подсказка: визуализировать вид в ту переменную (смайлик).

Еще вы можете заметить, что я подключил “assets/css/red.css” и “assets/css/jqtest.js”. Давайте теперь их заполним, начиная с “/assets/css/red.css”:

h1
 {
    color: #FF0000;
 }


Теперь “/assets/js/jqtest.js”:

$("document").ready(function()
                     {
                        alert('Hello Kohana!');
                     });


Сохраните их и обновите сайт. Должно появиться всплывающее окно и первая строка должна стать красной.

Поздравляю, в этой части вы на базе встроенного контроллера «Template» создали свой контроллер, использующий созданный вами же файл шаблона.
Tags:
Hubs:
Total votes 14: ↑7 and ↓70
Comments11

Articles