За чистый и ясный код!

Статьи на тему программирования под веб, используя PHP, MySQL, Jquery и многое другое

Создание модуля на фреймворке Kohana

Июль14

В этой статье хочу рассказать как создать свой модуль на фреймворке Kohana.

Что такое модуль, описывается тут

Немного теории

Сам фреймворк имеет 3 основные папки:

application — тут храниться ваш проект
modules — тут модули
system — тут ядро

Все названия папок и файлов, новых и старых, пишутся с маленькой буквы, желательно латинского алфавита, т.к. в методе Kohana::auto_load() все файлы приводятся к нижнему регистру. На это стоит обратить внимание, т.к. на ОС *unix это вылезет и будут потом куча вопросов, а чего у меня (под ОС Windows) работает, а тут нет!!!!! Насчет латиницы, ну тут особых ограничений нет, но принято всё писать латиницей!

Создания модуля

Заходим в папку modules и создаем необходимую нам папку.

Для того, чтобы это было наглядней создадим модуль для получения валюты из центробанка РФ на текущий день (украинского НБУ, не нашел api). Назовем папку модуля — currency (в названии папки можно использовать знак _).

modules

currency

Далее нужно создать простой класс, для какой-то работы, то просто в этой папке его и создаем, например класс назовем Test, значит файл будет называться test.php (расширение должно быть такое, какое описано в index-файле вашего проекта, константа define(‘EXT’, ‘.php’);)

Если же будите использовать MVC паттерн, то надо создать особую структуру папок.

classes -эта папка для классов контроллера и моделей

controller — если есть контроллер, то он храниться тут (назв Controller_Name, файл name.php)

model — тут модель, если есть (Model_Name, name.php)

config — хранятся всяческие настройки для модуля

views — шаблоны для отображения

vendor — библиотеки сторонних производителей

init.php — файл, инициализируемый при подключении модуля

Ессно, что всех этих папок может не быть, это структура папок, скажем по-умолчанию.

Как подключить модуль

Заходим в файл проекта — bootstrap.php и добавляем в описание модулей свой

Kohana::modules(array(
	'auth'       => MODPATH.'auth',       // Basic authentication
	'database'   => MODPATH.'database',   // Database access
	'image'      => MODPATH.'image',      // Image manipulation
	'orm'        => MODPATH.'orm',        // Object Relationship Mapping
	'pagination' => MODPATH.'pagination', // Paging of results
	'cache'      => MODPATH.'cache',      // Cache module
	'currency'	 => MODPATH.'currency',   // Подключения модуля получения валюты!!!!!
));

Загрузка модулей во фрейм будет в той последовательности, в которой они добавления в этот массив.

При загрузке сразу подключается файл init.php, если он есть, при инициализации модуля. Обычно в этом файле пишут роутер по которому будет доступна работа модуля, если такое требуется.

Переходим к практике

Структура папок описано, начнем писать.

Описываем файл инициализации init.php:

// Роутеры для работы с валютами
Route::set('currency', 'getcurrency(/<date>)', array('date'=>'([0-9\/]+)'))
    ->defaults(array(
            'controller' => 'currency',
            'action'     => 'index',
            'date'		 => NULL,
    )
);

Далее описываем работу с контроллером Controller_Currency (currency.php):

class Controller_Currency extends Controller {

	/**
	 * Получение данных по указанному дню
	 *
	 * @return void
	 */
	public function action_index()
	{
		$date = $this->request->param('date', date('d/m/Y'));

		$currency_model = new Model_Curr;
		$currency_data = $currency_model->get_currency_from_server($date);

		print_r($currency_data);
	}
}// End Currency Controller

Описываем работу модели Model_Curr (curr.php):

class Model_Curr extends Model {

	/**
	 * Получения данных с сервера ЦБРФ (http://www.cbr.ru/)
	 *
	 * @param string $date текущая дата
	 * @return string
	 */
	public function get_currency_from_server($date)
	{
		$allow_currency = array('EUR', 'USD');
		$link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date";
		$text = @file_get_contents($link);

		$xml = new SimpleXMLElement($text);

		foreach ($xml->Valute as $curr)
		{
			if(in_array($curr->CharCode, $allow_currency))
			{
				$currency[] = $date . ' ' . $curr->CharCode . ' ' . UTF8::str_ireplace(',', '.', (string)$curr->Value);
			}
		}

		return $currency;
	}
} // End Currency Model

В итоге набираем в строке адреса вашего браузера ссылку http://yourprojectname/getcurrency/14/06/2010

и на экране получаем ответ:

Array
(
    [0] => 24/03/2012 USD 29.4038
    [1] => 24/03/2012 EUR 38.8189
)

Демо тут

Данные по валюте получены. Модуль можно использовать в других проектах.

Подводные камни

При работе с модулями могут произойти некоторые проблемки.
1 Если имеется в проекте роутер с таким же урлом как в файле инициализации модуля, то роутер модуля будет замещен роутером проекта.
Для избегания, просто делаем другой роутер или ставим описание роутера проекта раньше чем описание загрузки модулей в файле bootstrap.php.

2 Если одинаковое название моделей, то модель будет вызвана из проекта, а не из модуля!!! Обойти эту проблему мне не удалось, т.к. само ядро ищет файл в проекте и если найдено поиск дальше не идет, а если нет, то ищется пока не будет найдено. Единственный выход — прописать другое название для модели.

UPD: Пересобрал модуль для версии Kohana 3.2, часть комментариев уже не валидны. Через время выложу на github.com

UPD2: Выложил всё на GitHub

Статья просмотренна 103207 раз, зашло посетителей 28414

  

Облако тегов

cli csv dump events form Kohana locale models MySQL mysqldump orm PHP tools trigger validate газ газовый счетчик итоги кеширование переменные

Облако тегов плагина WP Cumulus для WordPress требует для просмотра Flash Player 9 или выше.

Я на твиттере!

  • у твиттера тоже бывают перерывы...

Календарь

Июль 2010
Пн Вт Ср Чт Пт Сб Вс
« Июн   Сен »
 1234
567891011
12131415161718
19202122232425
262728293031  

Сейчас на сайте