Создайте внутри каталога “application” папку “views”, а внутри папки “views” создайте папку “pages”
Теперь откройте новый файл в вашем редакторе и введите:
<html> <head> <title>Hello!</title> </head> <body> <h1>This is my first view</h1> </body> </html>
Теперь сохраните этот файл в “application/views/pages” как “ko3.php”
Давайте откроем “ko3″ контроллер (“application/classes/controller/ko3.php”)
заменим класс “action_index” на следующие строки:
public function action_index() { $this->response->body(View::factory('pages/ko3')); }
Сохраните и загрузите в браузере “http://localhost/mykohana3/ko3”
Вы увидите надпись “This is my first view” на вашем экране
Код написанный выше достаточно простой
мы используем метод “Factory" для загрузки файла “application/views/pages/ko3.php", который обрабатывает и выводит вид
это не очень интересно так, что давайте вернемся к нашим видам (“application/views/pages/ko3.php”) и добавим после “h1″ тегов:
<?php echo $content;?>
Ваш вид должен выглядеть так:
<html> <head> <title>Hello!</title> </head> <body> <h1>This is my first view</h1> <?php echo $content;?> </body> </html>
Если мы обновим браузер, мы увидим нештатную ошибку "undefined variable"
Так давайте же исправим её привязав данные к переменной в нашем контроллере
Поменяйте контроллер “action_index” на такой:
public function action_index() { $view = View::factory('pages/ko3'); $view->content = 'We have data!'; $this->response->body($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->response->body($view->render());Обрабатывает и выводит вид
Достаточно просто, но есть и другой способ сделать все описанное выше
Вам следует сделать:
public function action_index() { $data['content'] = 'We have data!'; $view = View::factory('pages/ko3', $data); $this->response->body($view->render()); }
Выше используется массив с элементами ключей в виде шаблона имен переменных и данных
Существует 2 способа сделать это
public function action_index() // v4 set { $view = View::factory('pages/ko3') ->set('content', 'We have data!'); $this->response->body($view->render()); }
Выше используется метод видов, который можно использовать как цепочку методов для ваших шаблонных переменных
И еще один способ:
public function action_index() // v5 bind { $content = 'We have data!'; $view = View::factory('pages/ko3') ->bind('content', $content); $this->response->body($view->render()); }
Выше используется bind метод из класса видов
Еще раз, вы можете использовать здесь цепочку методов
Так $content может быть эквивалентна ‘We have data!’, с того момента как мы устанавливаем переменную $content в наш контроллер, вместо привязывания данных к шаблонной переменной
Если мы сделали следующее:
public function action_index() // v6 >>> { $content = 'We have data!'; $view = View::factory('pages/ko3') ->bind('content', $content); $content = 'Our data changed'; $this->response->body($view->render()); } // v6 <<<
Вместо “We have data!” мы увидим “Our data changed”
Давайте теперь сделаем вид с видом внутри!
Создайте папку в “application/views/” под названием “blocks”
Создайте другой файл вида “ko3_inner.php” и вставьте в него:
<h3>This is an inner view</h3>
Сохраните это в папке“application/views/blocks/”
Теперь отредактируйте файл вида “ko3″ (“application/views/pages/ko3.php”) на:
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() // v7 >>> { $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->response->body($view->render()); } // v7 <<<
Это сформирует вид в массив который, будет формироваться с помощью основного вида
Если вы заметили я сделал сначала другие вещи первыми, а только потом вернулся с использованию массива и шаблонных переменных
Далее нам надо отредактировать основой вид (“application/views/pages/ko3.php”)
Линию которую мы ввели до этого теперь заменим на:
???
Теперь вид должен выглядеть так:
<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() // v8 >>> { 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->response->body($view->render()); } // v8 <<<
Теперь если вы редактировали виды - добавьте:
<?php echo $x;?>
Теперь вы можете увидеть “This is a global variable” 2 раза на странице
Как вы можете заметить это очень удобно
Мы используем статический метод “set” из класса видов, он перестает быть доступным для других видов объектов
Вы также можете использовать статический метод “bind” для reference переменных
В следующей части я расскажу про “шаблоны” (улучшенные виды для контроллеров)
удачного кодинга!
Использованы материалы: Unofficial Kohana 3 Wiki
Комментариев нет:
Отправить комментарий