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

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

Kohana
Перевод
Автор оригинала: 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”.
Теги:знакомство с kohana 3.0kohana 3kohanaфреймворк
Хабы: Kohana
Всего голосов 16: ↑10 и ↓6 +4
Просмотры5.7K

Комментарии 20

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

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

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