Внимание: данный сайт находится в процессе формирования базового контента - уроков по 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 и более поздних версий по мере их появления. Как пишет автор оригинального пособия на английском языке: "Удачного Кодинга!"

понедельник, 19 сентября 2011 г.

Kohana Урок третий - О расширении класса контроллера, который позволяет создавать шаблоны







В последней обучалке речь шла о видах
в этой части мы поговорим о расширении класса контроллера, который позволяет нам создавать шаблоны
Шаблон - это не более чем вид, который базируется на вашем собственном (X)HTML коде
Перед тем как вставлять код в файл, давайте создадим папку в “/application/views/” под названием “templates
Теперь откройте IDE в котором вы предпочитаете работать, создайте новый файл и вставьте в него следующее:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
	<head>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
		<meta http-equiv="Content-Language" content="en-us" />
		<title><?php echo $title;?></title>
		<meta name="keywords" content="<?php echo $meta_keywords;?>" />
		<meta name="description" content="<?php echo $meta_description;?>" />
		<meta name="copyright" content="<?php echo $meta_copywrite;?>" />
		<?php foreach($styles as $file => $type) { echo HTML::style($file, array('media' => $type)), "\n"; }?>
		<?php foreach($scripts as $file) { echo HTML::script($file, NULL, TRUE), "\n"; }?>
	</head>
	<body>
		<div id="container">
			<?php echo $header;?>
			<?php echo $content;?>
			<?php echo $footer;?>
		</div>
	</body>
</html>

И сохраните как “default.php” в вашей папке “/application/views/templates/”.
Как вы можете заметить, это выглядит немного похоже на вид который мы делали немного раньше, но он немного расширен
В отличии от вида, этот шаблон будут использовать почти все ваши проекты
С того времени как мы начнем использовать этот файл как шаблон или каркас, он сократит огромное кол-во кода, который бы пришлось вводить в каждом отображении
Теперь у нас есть шаблон, и наша система ничего не может с ним сделать до тех пор пока мы не скажем
Давайте вернемся к нашей IDE и создадим новый файл и вставим в него следующие строки:
<?php
	defined('SYSPATH') or die('No direct script access.');

	class Controller_DefaultTemplate extends Controller_Template
	{
		public $template = 'templates/default';

		/**
		* Initialize properties before running the controller methods (actions),
		* so they are available to our action.
		*/
		public function before()
		{
			// Run anything that need to run before this.
			parent::before();

			if($this->auto_render)
			{
				// Initialize empty values
				$this->template->title            = '';
				$this->template->meta_keywords    = '';
				$this->template->meta_description = '';
				$this->template->meta_copywrite   = '';
				$this->template->header           = '';
				$this->template->content          = '';
				$this->template->footer           = '';
				$this->template->styles           = array();
				$this->template->scripts          = array();
			}
		}

		/**
		* Fill in default values for our properties before rendering the output.
		*/
		public function after()
		{
			if($this->auto_render)
			{
				// Define defaults
				$styles                  = array('assets/css/reset.css' => 'screen');
				$scripts                 = array('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js');

				// Add defaults to template variables.
				$this->template->styles  = array_reverse(array_merge($this->template->styles, $styles));
				$this->template->scripts = array_reverse(array_merge($this->template->scripts, $scripts));
			}

			// Run anything that needs to run after this.
			parent::after();
		}
	}

И сохраним это как “defaulttemplate.php” в папке “/application/classes/controller/
Написанный выше код расширяет класс “Controller_Template” и делает 3 основные вещи:
инициализирует некоторые переменные на доступность использования их вашими методами (actions) и
присоединяет стандартное значение им,
привязывает их к нашим шаблонным переменным перед тем, как окончательно визуализировать и вывести на экран
Это место где цикл foreach() "вступает в игру"
Цикл foreach() использует статический метод для вспомогательного класса “HTML”, один для загрузки CSS, а другой для загрузки файлов JS
Оба эти вспомогательных метода будут выполнять одно и то же действие через массив и заключать в оболочку определенного тега
Вы наверно удивитесь когда узнаете, что такое “Helper”
вот небольшое определение из документации Kohana PHP 2.x documents:
Helpers – простые, “удобные” функции созданные для того, чтобы облегчить вам разработку
Вспомогательный модули похожи на класс библиотеки, но есть одно отличие
При работе с библиотеками, вы должны создать экземпляр класса библиотек для использования
Хэлперы являются статическими методами класса, и для них не требуется введение экземпляра для работы
Их вполне можно называть “общими функциями”
С библиотеками, вспомогательные классы автоматически запускаются фреймворком, когда их используют, и нет нужды их запускать вручную
Вернемся к нашим баранам
Вы наверное заметили, что присутствует ссылка на “assets/css/reset.css"
В корневом каталоге создайте папку под названием “assets” и в этой папке создайте еще одну под названием “css
Для файла “reset.css”, я зашел на Serene Destiny и скопировал код из статьи под названием “Создать идеальный CSS reset” и сохранил как “reset.css” в папке “assets/css/
* {
padding: 0;
margin: 0;
}

ul {
list-style:none;
}

a {
text-decoration: none;
}

a:hover {
text-decoration: none;
}

a:visited {
text-decoration: none;
}

a {
text-decoration: none;
color:#FFFFFF;
}

a:hover {
text-decoration: none;
color:#000000;
}

Вы можете так же создать другие папки в “/assets/”, может быть “images”, “js” и “files
В основном папка "assets" используется для хранения статических файлов
Наше приложение не знает, что делать и нам следует модифицировать наш контроллер
Откроем “/application/classes/controller/ko3.php
Для изменения класса, который мы расширяем, измените эту строку:
class Controller_Ko3 extends Controller

На:
class Controller_Ko3 extends Controller_DefaultTemplate

Нам также нужно сменить наш “index” ( метод action_index() ) на:
	public function action_index() // v9 >>>
	{
		$ko3_inner               = array();
		$ko3                     = array();
		$this->template->title   = 'Kohana 3.0';

		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();
		$this->template->content = View::factory('pages/ko3', $ko3);
	} // v9 <<<

Сохраните это
Вы можете заметить, что теперь у нас есть
“$this->template->title = ‘Kohana 3.0?;”

это будет присваивать значение нашей шаблонной переменной “title
Следующее о чем вам следует знать - отсутствие метода “render()
Метод “factory()” будет фактически “авто-визуализировать” в нашей шаблонной переменной “content
Легко, правда?
Есть еще одна вещь, которую мы должны сделать, перед тем как запускать страницу – загрузить файл вида “ko3.php”, который находится в “application/views/pages/
Вы могли заметить, что в нашем отображении есть весь "шелл" код, так давайте уберем его
Все, что вам нужно иметь в файле отображения:
<h1>This is my first view</h1>
<?php echo $content;?>
<?php echo $ko3_inner; ?>
<br/><?php echo $x;?>

Если вы сейчас загрузите его, вы увидите, что заголовок страницы теперь “Kohana 3.0? и выглядит она немного похоже на страницу из прошлой обучалки
Но если вы посмотрите на код, то он в корне отличается
вы можете сильно удивиться переменным в шаблонах и тому, что с ними делать
Давайте вернемся и отредактируем наш метод “index” еще раз
Сделайте его таким:
	public function action_index() // v10 >>>
	{
		$ko3_inner                        = array();
		$ko3                              = array();
		$this->template->title            = 'Kohana 3.0';
		$this->template->meta_keywords    = 'PHP, Kohana, KO3, Framework';
		$this->template->meta_description = 'A test of of the KO3 framework';
		$this->template->styles           = array('assets/css/red.css' => 'screen');
		$this->template->scripts          = array('assets/js/jqtest.js');

		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();
		$this->template->content          = View::factory('pages/ko3', $ko3);
	} // v10 <<<

Довольно просто
Вы наверно заметили, что я не заполнил header и footer
Я уверен, вы знаете , что с ними делать
Подсказка:
Сформируйте отображение к этим переменным
Вы наверно заметили, что я ввел “assets/css/red.css” and “assets/css/jqtest.js
Давайте сделаем эти файлы начиная с “/assets/css/red.css”:
h1
{
	color: #FF0000;
}

Следующий “/assets/js/jqtest.js”:
$("document").ready(function()
{
	alert('Hello Kohana!');
});

Сохраните и обновите сайт
Вы сможете увидеть всплывающие сообщение об ошибке, и первую строку в тексте выделенную красным
Сегодня мы создали свой шаблон, расширили шаблонный контроллер и наш контроллер стал использовать этот шаблон
Есть куча всего, что можно сделать используя только это
В следующий раз, речь пойдет о моделях
удачного кодинга!
Использованы материалы: Unofficial Kohana 3 Wiki, Kohana PHP 2.x Docs

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

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