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

Original author: ellisgl
  • Translation
Встречайте вторую часть цикла статей по разработке с Kohana PHP V3 (KO3). Первая находится здесь, в случае если вы ее еще не читали. В этот раз мы пройдемся по разработке видов (представлений).

В директории “application” создайте новую папку “views”, а внутри нее папку “pages”. Теперь создайте новый документ в редакторе и вставьте туда:
<html>
 <head>
  <title>Hello!</title>
 </head>
 <body>
  <h1>This is my first view</h1>
 </body>
</html>

Сохраните это как “ko3.php” в директории “application/views/pages”. Пока что здесь простенький HTML код, но вскоре мы добавим немного PHP. Давайте откроем контроллер “ko3″ (”application/classes/controller/ko3.php”). Метод “action_index” замените следующим:
public function action_index()
 {
    $this->request->response = View::factory('pages/ko3');
 }

Сохраните файл и откройте в браузере “http://localhost/mykohana3/ko3”. Должна появиться строка “This is my first view”. Код выше довольно прост, мы используем метод “Factory” класса “View”, чтобы загрузить файл “application/views/pages/ko3.php”, визуализировать (отрендерить) и вывести его. Не слишком увлекательно, поэтому вернемся к виду (”application/views/pages/ko3.php”) и добавим:
<?php echo $content;?>

После тэгов “h1″. Вид должен стать таким:
<html>
 <head>
  <title>Hello!</title>
 </head>
 <body>
  <h1>This is my first view</h1>
  <?php echo $content;?>
 </body>
</html>

Если сейчас мы обновим страницу в браузере, то увидим ошибку, связанную с не определенной переменной. Поэтому давайте исправим это, приведя метод “Action_Index” к следующему виду:
public function action_index()
 {
    $view = View::factory('pages/ko3');
    $view->content = 'We have data!';
    $this->request->response = $view->render();
 }

А вот теперь, обновив браузер, мы увидим надпись “This is my first view”, а под ней “We have data!”. Пройдемся построчно по коду.
$view = View::factory('pages/ko3');

Эта строка загружает наш вид (”application/views/pages/ko3.php”) в контроллер.
$view->content = 'We have data!';

Здесь мы присваиваем переменной “content” (которую можно использовать в файле вида) значение “We have data!”
$this->request->response = $view->render();

Метод render() визуализирует вид, а $this->request->response его выводит на экран.

Достаточно просто, но есть и другой способ сделать то же самое:
public function action_index()
 {
    $data['content'] = 'We have data!';
    $view = View::factory('pages/ko3', $data);
    $this->request->response = $view->render();
 }

При визуализации переменные в виде заменяются на элементы массива с соответствующими ключами. Нужно только не забыть передать этот массив вторым параметром в метод “Factory”.

Но и это еще не все! Осталось два других способа связать переменные вида и контроллера.
public function action_index()
 {
    $view = View::factory('pages/ko3')
                    ->set('content', 'We have data!');
 
    $this->request->response = $view->render();
 }

Здесь используется метод “set” класса “View”, с помощью которого можно определить все переменные, используемые в виде.
Четвертый способ:
public function action_index()
 {
    $content = 'We have data!';
    $view = View::factory('pages/ko3')
                    ->bind('content', $content);
    $this->request->response = $view->render();
 }

Выше применяется метод “bind” класса “View”. От метода “set” из третьего способа он отличается тем, что вместо непосредственного присваивания значения переменной в виде, он связывает ее с некоторой переменной в контроллере ссылкой.
То есть если мы сделаем так:
public function action_index()
 {
    $content = 'We have data!';
    $view = View::factory('pages/ko3')
                    ->bind('content', $content);
    $content = 'Our data changed';
    $this->request->response = $view->render();
 }

То вместо “We have data!” на экране появится надпись “Our data changed”.

Теперь давайте сделаем вид в виде! В директории “application/views/” создайте новую папку “blocks”. Откройте в редакторе новый документ и поместите в него:
<h3>This is an inner view</h3>

Сохраните это как “ko3_inner.php” в только что созданной “application/views/blocks/”. Теперь давайте отредактируем вид “ko3″ (”application/views/pages/ko3.php”), добавив после:
<?php echo $content;?>

следующую строку:
<?php echo View::factory('blocks/ko3_inner')->render(); ?>

Наш вид теперь должен выглядеть так:
<html>
 <head>
  <title>Hello!</title>
 </head>
 <body>
  <h1>This is my first view</h1>
  <?php echo $content;?>
  <?php echo View::factory('blocks/ko3_inner')->render(); ?>
 </body>
</html>

Если мы обновим страницу, то к выводимым ранее надписям добавится “This is an inner view”. Таким образом удобно использовать статический контент, но мы не сможем использовать переменные напрямую в том виде. Чтобы исправить это, вернемся к нашему контроллеру (”application/classes/controllers/ko3.php”) и приведем метод “Action_Index” к следующему виду:
public function action_index()
 {
    $ko3_inner['content'] = 'We have more data';
    $ko3['content'] = 'We have data';
    $ko3['ko3_inner'] = View::factory('blocks/ko3_inner', $ko3_inner)
                                   ->render();
    $view = View::factory('pages/ko3', $ko3);
    $this->request->response = $view->render();
 }

Это поместит визуализированный вид “blocks/ko3_inner.php” в массив $ko3, который затем будет визуализироваться в основном виде “pages/ko3.php”, который нам сейчас нужно изменить. Строку:
<?php echo View::factory('blocks/ko3_inner')->render(); ?>

которую мы добавляли ранее, изменим на:
<?php echo $ko3_inner; ?>

Вид теперь должен выглядеть так:
<html>
 <head>
  <title>Hello!</title>
 </head>
 <body>
  <h1>This is my first view</h1>
  <?php echo $content;?>
  <?php echo $ko3_inner; ?>
 </body>
</html>

Осталось изменить внутренний вид (”application/views/blocks/ko3_inner.php”), приведя его к такому виду:
<h3>This is an inner view</h3>
<?php echo $content;?>

Если вы обновите страницу в браузере после сохранения файла, то должны увидеть следующее:
This is my first view
 
We have data
 
This is an inner view
 
We have more data

Неплохо, теперь вы можете делать более гибкие виды, готовые к повторному использованию.

А сейчас узнаем, как сделать глобальные переменные, которые будут доступны вашим видам. Вернемся к контроллеру (”applications/classes/controllers/ko3.php”) и добавим в самом начале метода “Action_Index” строку:
View::set_global('x', 'This is a global variable');

Чтобы метод стал выглядеть так:
public function action_index()
 {
    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();
    $view = View::factory('pages/ko3', $ko3);
    $this->request->response = $view->render();
 }

Теперь, если вы добавите в виды:
<br/><?php echo $x;?>

то должны увидеть на странице текст “This is a global variable”.

Также можно делать глобальные ссылки методом “View::bind_global” и эти переменные будут доступны всем экземплярам объекта “View”.
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 20

    –1
    Используй хабракат.
      –5
      а ты мне не тыкай
      +2
      Не используйте 10^10 пробелов подряд… когда не monospace неудобно читать
        +2
        нет, это не злая критика, это — добрые советы ;)
          0
          Согласен, но это в оригинале так. Сейчас исправлю.
          +1
          100+ способов передать переменные в шаблон…
          1. Да, можно bind'ить переменные, но когда это удобно? Новичку нужны полезные примеры
          2. Метод render() вообще в явном виде необязателен — при преобразовании к строке он и так вызовется
          3. Шаблоны можно встраивать друг в друга и в теле шаблона. <? echo View::factory('foo/bar')->set('baz', $baz) ?> Переменная $baz в этом случае берется из области видимости текущего шаблона.

          И т.д.
            +1
            > 2. Метод render() вообще в явном виде необязателен — при преобразовании к строке он и так вызовется

            Согласен, но как вы знаете в методе __toString() нельзя выбрасывать исключения. Это может создать некоторые неудобства, поэтому я предпочитаю всегда явно указывать render(). Где это делать — в контроллере или в view — это уже другой вопрос
              0
              А можно ссылку на источник? Если там есть следующие части.
              +1
              Use <source />, Luke!

              А вообще, ИМХО, механизм подключения вложенных шаблонов как-то тяжеловато выглядит. Мне больше нравится как это сделано в Twig.
                0
                Спасибо за <source />.
                  0
                  механизм подключения вложенных шаблонов? Да его тут как-бы и нет.
                    0
                    Вы статью-то читали?
                      0
                      Да, и там описывается механизм подключения шаблонов и как подключать вложенные шаблоны с помощью этого механизма. Но механизма для подключения вложенных шаблонов тут и в помине нет.
                        0
                        Нравится играть словами? Приведите пример того, что хотели бы увидеть
                          –1
                          Пхахаа, Вы думаете я знаю что хочу? Хочу чтоб было красиво.
                  0
                  http://prowebportal.com/blogi/kohana-php.html — здесь переведены 8 из 9 частей этой обучалки + материалы по библиотекам фреймворка.
                    –1
                    Отвратительное оформление. Больше похоже на машинный перевод оф. документации или еще чего-то
                    0
                    Откуда myfirstkohana3?
                      +1
                      Автор опечатался, я не заметил. Спасибо.

                    Only users with full accounts can post comments. Log in, please.