Внимание: данный сайт находится в процессе формирования базового контента - уроков по PHP фреймворку Kohana. Сайт создаётся "для себя" и "как для себя" - что означает повышенные требования как к наглядности, так и работоспособности всех примеров этих уроков. Уроки строятся на базе Kohana 3.2 - наиболее актуальной версии на момент написания. За основу взяты переводы Антона Панкова ( http://prowebportal.com/blog/anton-pankov.html ) ( http://prowebportal.com/blogi/kohana-php/obuchalka-po-kohana-php-3.0-ko3-chast-1.html ) Необходимость в исправлении огромного количества ошибок и неточностей в процессе работы и исходной публикацией, а так-же существенные изменения в коде при переходе к версии 3.2 привели меня к мысли создать свою версию этих уроков и заодно в процессе их создания как следует выучить и закрепить изученный материал. Основной причиной всего этого является моё давнее неумение усвоить принципы и основы ООП. Так, что, как говориться: "Не было бы счастья, да несчастье помогло!" Очень надеюсь, что полученный мною в результате всего этого материал поможет вновь прибывшим в интернет для изучения основ программирования на базе PHP фреймворка Kohana 3.2 и более поздних версий по мере их появления. Как пишет автор оригинального пособия на английском языке: "Удачного Кодинга!"

воскресенье, 18 сентября 2011 г.

Kohana Урок второй






Создайте внутри каталога “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

Комментариев нет:

Отправить комментарий