Встречайте вторую часть цикла статей по разработке с Kohana PHP V3 (KO3). Первая находится здесь, в случае если вы ее еще не читали. В этот раз мы пройдемся по разработке видов (представлений).
В директории “application” создайте новую папку “views”, а внутри нее папку “pages”. Теперь создайте новый документ в редакторе и вставьте туда:
Сохраните это как “ko3.php” в директории “application/views/pages”. Пока что здесь простенький HTML код, но вскоре мы добавим немного PHP. Давайте откроем контроллер “ko3″ (”application/classes/controller/ko3.php”). Метод “action_index” замените следующим:
Сохраните файл и откройте в браузере “http://localhost/mykohana3/ko3”. Должна появиться строка “This is my first view”. Код выше довольно прост, мы используем метод “Factory” класса “View”, чтобы загрузить файл “application/views/pages/ko3.php”, визуализировать (отрендерить) и вывести его. Не слишком увлекательно, поэтому вернемся к виду (”application/views/pages/ko3.php”) и добавим:
После тэгов “h1″. Вид должен стать таким:
Если сейчас мы обновим страницу в браузере, то увидим ошибку, связанную с не определенной переменной. Поэтому давайте исправим это, приведя метод “Action_Index” к следующему виду:
А вот теперь, обновив браузер, мы увидим надпись “This is my first view”, а под ней “We have data!”. Пройдемся построчно по коду.
Эта строка загружает наш вид (”application/views/pages/ko3.php”) в контроллер.
Здесь мы присваиваем переменной “content” (которую можно использовать в файле вида) значение “We have data!”
Метод render() визуализирует вид, а $this->request->response его выводит на экран.
Достаточно просто, но есть и другой способ сделать то же самое:
При визуализации переменные в виде заменяются на элементы массива с соответствующими ключами. Нужно только не забыть передать этот массив вторым параметром в метод “Factory”.
Но и это еще не все! Осталось два других способа связать переменные вида и контроллера.
Здесь используется метод “set” класса “View”, с помощью которого можно определить все переменные, используемые в виде.
Четвертый способ:
Выше применяется метод “bind” класса “View”. От метода “set” из третьего способа он отличается тем, что вместо непосредственного присваивания значения переменной в виде, он связывает ее с некоторой переменной в контроллере ссылкой.
То есть если мы сделаем так:
То вместо “We have data!” на экране появится надпись “Our data changed”.
Теперь давайте сделаем вид в виде! В директории “application/views/” создайте новую папку “blocks”. Откройте в редакторе новый документ и поместите в него:
Сохраните это как “ko3_inner.php” в только что созданной “application/views/blocks/”. Теперь давайте отредактируем вид “ko3″ (”application/views/pages/ko3.php”), добавив после:
следующую строку:
Наш вид теперь должен выглядеть так:
Если мы обновим страницу, то к выводимым ранее надписям добавится “This is an inner view”. Таким образом удобно использовать статический контент, но мы не сможем использовать переменные напрямую в том виде. Чтобы исправить это, вернемся к нашему контроллеру (”application/classes/controllers/ko3.php”) и приведем метод “Action_Index” к следующему виду:
Это поместит визуализированный вид “blocks/ko3_inner.php” в массив $ko3, который затем будет визуализироваться в основном виде “pages/ko3.php”, который нам сейчас нужно изменить. Строку:
которую мы добавляли ранее, изменим на:
Вид теперь должен выглядеть так:
Осталось изменить внутренний вид (”application/views/blocks/ko3_inner.php”), приведя его к такому виду:
Если вы обновите страницу в браузере после сохранения файла, то должны увидеть следующее:
Неплохо, теперь вы можете делать более гибкие виды, готовые к повторному использованию.
А сейчас узнаем, как сделать глобальные переменные, которые будут доступны вашим видам. Вернемся к контроллеру (”applications/classes/controllers/ko3.php”) и добавим в самом начале метода “Action_Index” строку:
Чтобы метод стал выглядеть так:
Теперь, если вы добавите в виды:
то должны увидеть на странице текст “This is a global variable”.
Также можно делать глобальные ссылки методом “View::bind_global” и эти переменные будут доступны всем экземплярам объекта “View”.
В директории “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”.