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

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

Время на прочтение7 мин
Количество просмотров6K
Автор оригинала: ellisgl
Встречайте вторую часть цикла статей по разработке с 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”.
Теги:
Хабы:
Всего голосов 16: ↑10 и ↓6+4
Комментарии20

Публикации

Истории

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

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань