Внимание: данный сайт находится в процессе формирования базового контента - уроков по 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

воскресенье, 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

Kohana Урок первый - установка и знакомство

Kohana 3.2


По материалам сайта prowebportal.com (ru) и dealtaker.com (en)

Примечание: везде в тексте, где встречаются адреса вида http://localhost/* вы можете использовать адреса вида http://127.0.0.1/* либо http://YOURHOSTNAME/* где YOURHOSTNAME - имя вашего компьютера в сети.
Все варианты полностью эквивалентны и не сказываются на работоспособности примеров.
Для редактирования соответствия имени хоста локальному адресу 127.0.0.1 и его символьному синониму localhost необходимо отредактировать файл hosts.
В операционной системе MS Windows этот файл расположен по адресу *.
В линукс как правило *.

Проверьте, есть ли у вас всё необходимое для эффективного обучения.
Вот, основные требования:

*AMP (Apache MySQL PHP)
Знание PHP
Знание что такое фреймворк
Знание что такое MVC

Загрузка:

Скачайте последнюю Kohana 3.2 и разархивируйте в любое место.

Установка:

распакуйте скачанный файл в текущую директорию.

в моём случае при распаковке была создана директория "kohana-3.2-master-1".

Откройте эту папку. Откройте новое окно и корневую папку вашего *AMP. В последний раз когда я использовал WAMP сервер путь выглядел так “C:\wamp\www\”.

создайте новую папку “mykohana3″. Скопируйте файлы из “kohana-3.2-master-1” в “mykohana3″. Проверьте что ваш *AMP работает, а затем введите в вашем браузере “http://localhost/mykohana3/”. Все должно быть “OK” и работать.

Если всё “OK”, переименуйте в папке “mykohana3" файл “install.php”.


Далее откройте файл “example.htaccess” и измените следующую строку:

RewriteBase /

на:

RewriteBase /mykohana3/

И сохраните файл как “.htaccess”.

Далее откройте “bootstrap.php”. Файл находится в папке “application” и измените следующую строку:

Kohana::init(array('base_url' => '/'));

на:

Kohana::init(array('base_url'  => '/mykohana3/',
	'index_file'=> ''));

Сохраните и обновите браузер. У вас должно получится что-то вроде “hello, world!” на вашем экране.

Давайте сделаем наш первый контроллер.

Откройте новый документ и введите в него:

defined('SYSPATH') or die('No direct script access.');
class Controller_Ko3 extends Controller
{
	public function action_index()
	{
		$this->response->body() = 'My First Kohana 3.2 Controller';
	}
}

Сохраните как “ko3.php” в папке “application/classes/controller”. Вы могли заметить еще одно отличие от Kohana 2.3.x. В 3.2 немного другая структура каталогов, хотя на самом деле это не такое большое отличие. Теперь, когда вы сохранили, введите в браузер “http://yourhost/mykohana3/ko3″. На экране должно высветиться “My First Kohana 3.2 Controller”.

Вот объяснение кода.

defined('SYSPATH') or die('No direct script access.');

Эта строка говорит PHP не открывать этот файл напрямую. Он может быть введен только, через фреймворк.

class Controller_Ko3 extends Controller

Создает контроллер, который является расширенным классом контроллеров, которые являются частью фреймворка.

public function action_index()

Создает метод под названием “action_index”. Метод “action_index” стандартное действие, которое выполняется фреймворком. Это как файл index.php.

$this->response->body() = 'My First Kohana 3.2 Controller';

Это будет выводить на экран “My First Kohana 3.0 Controller”. Работает по принципу “echo”.


Если вы хотите добавить дополнительное действие в ваш контроллер – вам следует добавить другой метод с префиксом "action_" и дать доступ через “http://localhost/mykohana3/controller/action


Давайте пойдем дальше и добавим новый метод в наш “ko3″ контроллер добавлением следующего “action_index” метод:

	public function action_another()
	{
		$this->response->body('Another action');
	}

Сохраните файл и запустите его через браузер “http://localhost/mykohana3/ko3/another”. Если вы всё сделали правильно, вы увидите надпись "Another action" на вашем экране.

давайте сделаем его более динамичным!

Скопируйте этот код и поставьте после “action_another” method:

	public function action_dynamic()
	{
		$param = $this->request->param();
		$say = $param['id'];
		$this->response->body('You said: '.$say);
	}

Сохраните и загрузите “http://localhost/mykohana3/ko3/dynamic/Monkey” и вы увидите “You said: Monkey

Ждите продолжения, удачного вам кодинга!

Использованы материалы: Unofficial Kohana 3 Wiki

Часть 2 >>