Инструменты пользователя

Инструменты сайта


kohana

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

kohana [2018/12/05 05:29] (текущий)
Строка 1: Строка 1:
 +====== Kohana ======
 +
 +{{htmlmetatags>​
 +metatag-description=(Kohana - разработка прекращена.)
 +}}
 +<note warning>​Kohana устарела и больше не поддерживается,​ разработка прекращена. Используйте другие современные фреймверки. Удачи!</​note>​
 +
 +  * Homepage: Framework [[http://​kohanaframework.org|Kohana]]
 +
 +Ниже рассматривается Kohana версии 3.3.0(stable) и выше.
 +
 +**Kohana** PHP5 Framework использует модель [[MVC]]. Установка фреймворка Kohana проста,​ достаточно запустить из корня файл install.php,​ который проверит права на директории logs, cache<​file>​
 +chmod 0777 application/​cache
 +chmod 0777 application/​logs
 +</​file>​ и проверит установлены ли необходимые зависимости [[PHP]]. После устранения всех ошибок файл install.php нужно удалить и комментировать в index.php строки:<​file>​
 +if (file_exists('​install'​.EXT))
 +{
 + // Load the installation check
 + return include '​install'​.EXT;​
 +}
 +</​file>​
 +После установки фреймворка работает только ссылка ​ http://​your.domen/​index.php/​welcome/​index .
 +
 +===== FAQ Kohana 3.3+ =====
 +  * Глобальные настройки ядра Kohana [[http://​kohanaframework.org/​3.0/​guide/​api/​Kohana_Core#​init|Kohana_Core]] и [[http://​kohanaframework.org/​3.3/​guide/​kohana/​bootstrap|Bootstrap]].
 +      * Чтобы убрать (спрятать) index.php в [[URL]] нужно в массиве инициализации ключу index_file присвоить значение FALSE и включить правила для [[mod_rewrite]] в файле [[htaccess#​chpu_shablon_mvc|.htaccess]]. В конфигурационном файле нашего приложения bootstrap.php допишем эту строку<​file>​
 +Kohana::​init(array(
 + '​base_url' ​  => '/',​
 +        '​index_file' ​  => FALSE,
 +));
 +</​file>​
 +  * Для кеширования роутов их нужно поместить в конструкцию If перед методом Route::​cache(TRUE);​. Если всё сделано правильно,​ то сгенерированный кеш будет находится в папке application/​cache/​.<​file>​
 +if (!Route::​cache()) {
 +// Set routes here
 +    Route::​cache(TRUE);​
 +}
 +</​file>​
 +  * Валидация находится в классе Valid (valid.php)
 +  * Произвести очистку всех элементов массива $_POST от пробелов в начале и в конце<​file>​
 +$_POST = Arr::​map('​trim',​ $_POST);
 +</​file>​
 +  * **Методы before() и after()** вызываются соответственно до и после вызова action в контроллере,​ если нужно произвести какие-либо манипуляции с данными. Обязательно в методе before сначала вызывается родительский before, а потом уже манипуляции с нашими данными,​ в методе after сначала работа с данными,​ потом вызов родительского after.
 +  * **Вынести все роуты в отдельный файл** из bootstrap.php. Создадим в папке application новый файл routes.php и переносем в него весь Route::​set('​default'​)… А на его месте в bootstrap.php подключем файл<​file>​
 +// External routes
 +require_once APPPATH . '​routes'​ . EXT;
 +</​file>​
 +  * Ошибка **Kohana_Exception [ 0 ]: Database method list_columns is not supported by Kohana_Database_PDO** говорит о том, что модуль [[ORM]] не может получить при помощи [[PDO]] список полей таблицы. Структура таблиц хранится в переменной $_table_columns и загружается при каждом выполнении скрипта. Для устранения ошибки достаточно вручную заполнить свойство $_table_columns в используемой модели. Например,​ для модуля auth  переопределим модель Model_User, которая использует таблицу users (Model_Role соответственно таблица role)<​file>​
 +<?php defined('​SYSPATH'​) OR die('​No direct access allowed.'​);​
 +
 +class Model_User extends Model_Auth_User {
 +
 +
 +    protected $_table_columns = array(
 +        '​id'​ => NULL,
 +        '​email'​ => NULL,
 +        '​username'​ => NULL,
 +        '​password'​ => NULL,
 +        '​logins'​ => NULL,
 +        '​last_login'​ => NULL,
 +    );
 +}    ​
 +// End User Model
 +</​file>​или переопределить функцию list_columns<​file>​
 +<?php
 +
 +defined('​SYSPATH'​) OR die('​No direct script access.'​);​
 +
 +class ORM extends Kohana_ORM {
 +
 +    /**
 +     * Proxy method to Database list_columns.
 +     *
 +     * @return array
 +     */
 +    public function list_columns() {
 +        switch ($this->​_table_name) {
 +            case '​users':​
 +                return array(
 +                    '​id'​ => NULL,
 +                    '​email'​ => NULL,
 +                    '​username'​ => NULL,
 +                    '​password'​ => NULL,
 +                    '​logins'​ => NULL,
 +                    '​last_login'​ => NULL,
 +                );
 +
 +                break;
 +            case '​roles':​
 +                return array(
 +                    '​id'​ => NULL,
 +                    '​name'​ => NULL,
 +                    '​description'​ => NULL,
 +                );
 +                break;
 +            case '​roles_users':​
 +                return array(
 +                    '​user_id'​ => NULL,
 +                    '​role_id'​ => NULL,
 +                );
 +
 +                break;
 +            case '​user_tokens':​
 +                return array(
 +                    '​id'​ => NULL,
 +                    '​user_id'​ => NULL,
 +                    '​user_agent'​ => NULL,
 +                    '​token'​ => NULL,
 +                    '​created'​ => NULL,
 +                    '​expires'​ => NULL,
 +                );
 +                break;
 +            default:
 +                return array();
 +                break;
 +        }
 +    }
 +
 +}
 +
 +</​file>​
 +  * [[http://​kohanaframework.org/​3.2/​guide/​kohana/​upgrading#​controller-action-parameters|Передача параметров в действие(action) контроллера]].<​file>​
 +Route::​set('​grammar',​ '​grammar/<​grpage>',​ array('​grpage'​ => '​.+'​))
 +        ->​defaults(array(
 +            '​controller'​ => '​grammar',​
 +            '​action'​ => '​index',​
 +        ));
 +</​file><​file>​
 +    public function action_index() {
 +        $output = $this->​request->​param('​grpage',​ 0);
 +
 +        //...
 +</​file>​
 +====== Объекты Request, Response, GET, POST ======
 +  * [[http://​101.brotkin.ru/​guide/​kohana101/​basic/​request|Объект Request]]
 +  * [[http://​kohana3.ru/​request|Request (Обращения)]]
 +Объект **Request** - один из основных элементов ядра фреймворка. В Kohana 3.2 он выполняет следующие задачи:​
 +
 +  * Подготовка запроса. Обработка исходных данных:​ IP клиента,​ заголовки браузера (User_Agent),​ используемый HTTP-метод запроса (GET/​POST/​PUT/​DELETE),​ и т.д. Все эти данные передаются в созданный экземпляр класса Request. Таким образом,​ у каждого объекта создается свое окружение
 +  * Поиск маршрута,​ подходящего под URI запроса
 +  * Запустить необходимый контроллер на выполнение
 +  * Получить от контроллера ответ и сохранить его в виде экземпляра класса **Response**.
 +По сути, объект Request выполняет контроль над выполнением приложения,​ от получения клиентских данных до генерации сервером ответа.
 +  * В Kohana v3.1+ Класс Request имеет методы query() и post() для обработки GET и POST запросов соответственно. Они работают в обе стороны и для получения и для установки:<​file>​
 +// get $_POST data
 +$data = $this->​request->​post();​
 +// returns $_GET['​foo'​] or NULL if not exists
 +$foo = $this->​request->​query('​foo'​); ​
 +
 +// set $_POST['​foo'​] value for the executing request
 +$request->​post('​foo',​ '​bar'​);​
 +// or put array of vars. All existing data will be deleted!
 +$request->​query(array('​foo'​ => '​bar'​));​
 +</​file>​Нужно помнить что установка GET/POST данные не переписывает текущих$_GET/​$_POST значений,​ для отсылки нужно использовать вызов $request->​execute(),​например как в примере ниже.
 +
 +  * **Пример.** Получить содержимое удаленной Веб- страницы в переменную. Аналогично можно обращаться к локальным (собственным) контроллерам<​file>​
 + ​public function action_index() {
 +        $result = Request::​factory('​http://​news.kh.ua'​)->​execute();​
 +        $this->​response->​body($result);​
 +    }
 +</​file>​
 +====== Объект Validation ======
 +Объект класса Validation служит для проверки данных полученных от пользователя,​ например при помощи HTTP [[POST]] запроса.
 +====== Хелперы ======
 +**Хелперы** (Helpers — помощники) - вспомогательные функции доступные в любом месте приложения на Kohana.
 +  * [[http://​kohanaframework.org/​3.3/​guide/​kohana/​helpers|Helpers]]
 +  * [[http://​kohanaframework.su/​helpers|Хелперы в Kohana]]
 +  * [[http://​web-programming.com.ua/​sozdanie-prilozheniya-na-kohana-xelpery-kohana-iz-html-chast-2/​|Хелперы Kohana из HTML. Часть 2]]
 +
 +**Класс HTML:**
 +  * Подключить стили и скрипты<​file>​
 +<?= HTML::​style('​css/​grid.css'​);​ ?>
 +<?= HTML::​script('​js/​content.js'​);​ ?>
 +</​file>​
 +  * **HTML- ссылки:​ HTML::​anchor** ($uri — адрес ссылки,​ $title — текст ссылки,​ Массив $array — (не обязательный параметр) атрибуты,​ по умолчанию null, $protocol ​ - (не обязательный параметр) специфический протокол,​ по умолчанию null) — служит для задания ссылки.:​ <​file>​
 +<?= HTML::​anchor('​user/​profile',​ '​Профиль'​) ?>
 +</​file><​file>​
 +<?php echo HTML::​anchor('/​user/​profile',​ 'My Profile',​array('​rel'​=>'​nofollow',​));?>​
 +</​file>​
 +  * Ссылка на файл: <​file>​
 +echo HTML::​file_anchor('​media/​doc/​user_guide.pdf',​ 'User Guide'​);​
 +</​file>​
 +  * Изображение:​ <​file>​
 +echo HTML::​image('​media/​img/​logo.png',​ array('​alt'​ => 'My Company'​));​
 +</​file>​
 +  * Формирует email адрес для борьбы со спам-ботами:​ <​file>​
 +echo HTML::​email($address);​
 +</​file>​
 +  * **Атрибуты HTML: HTML::​attributes**(array $attrs — не обязательный параметр) — служит для задания атрибутов для HTML тегов. Например,​ мы хотим записать<​file>​
 +<div id=”content”></​div></​file><​file>​
 +<?php echo “<​div”.HTML::​attributes(array(‘id’=>​’content’).”></​div>​” ?>
 +</​file>​
 +
 +**Класс Form:**
 +  * Открытие и закрытие формы:<​file>​
 +echo Form::​open(‘search',​ array('​method'​ => ‘get'​));​
 +echo Form::​close();​
 +</​file>​
 +  * Создать две радиокнопки<​file>​
 +<?= Form::​radio('​name',​ 1, TRUE);?>​Строка
 +<?= Form::​radio('​name',​ 2, FALSE);?>​Столбец
 +</​file>​
 +====== Модули ======
 +[[https://​github.com/​kolanos/​kohana-universe/​|Универсальный git репозитарий для Kohana]] - содержит ссылки на актуальные репозитории со сторонними модулями и ядром системы.
 +  * [[https://​github.com/​samwilson/​kohana_calendar|kohana_calendar]]:​ активировать через bootstrap.php<​file>​
 +Kohana::​modules(array(
 +...
 +    '​calendar'​ => MODPATH . '​kohana_calendar',​ // https://​github.com/​samwilson/​kohana_calendar
 +...
 +</​file>​ Копируем файл kohana_calendar/​views/​calendar.php в директорию application/​views/​ В контроллере запускаем так<​file>​
 +$cal = new Calendar(1,​2008);​ // January, 2008. The default is current month and year
 +$cal->​render();​ // the view is automatically rendered from the library
 +</​file>​
 +===== PDF =====
 +
 +  * [[TCPDF]] + подключение к [[Kohana]]
 +
 +===== Mодуль database (PDO) =====
 +  * [[http://​kohana3.ru/​module/​database|Базы данных]]
 +  * Модуль [[http://​orm.spadefootcode.com/​|LEAP ORM]] поддерживает также и [[SQLite]]. Настройка [[http://​orm.spadefootcode.com/​tutorials/​setting-up-a-database-connection/​|LEAP с SQLite]].
 +  * [[http://​blogocms.ru/​2010/​01/​kohana-dlya-chajnikov-prostejshij-orm/​|Kohana для чайников. Простейший ORM]]
 +
 +Настройка Kohana 3.3.0 для работы с базой данный [[PostgreSQL]] c использованием технологии [[PDO]].
 +
 +  * Для подключения модуля нужно раскомментировать строчку с его названием в файле bootstrap.php:<​file>​
 +Kohana::​modules(array(
 +...
 +     '​database' ​  => MODPATH.'​database', ​  // Database access
 +...
 +));
 +</​file>​
 +  * Файл database.php копируем из «modules/​database/​config/​» в «application/​config/​».
 +  * Редактируем файл «application/​config/​database.php»<​file>​
 +<?php
 +
 +defined('​SYSPATH'​) OR die('​No direct access allowed.'​);​
 +
 +return array
 +    (
 +    '​default'​ => array(
 +        '​type'​ => '​pdo',​
 +        '​connection'​ => array(
 +            '​dsn'​ => '​pgsql:​host=localhost;​dbname=mydb',​
 +            '​username'​ => '​user',​
 +            '​password'​ => '​your_password',​
 +            '​persistent'​ => FALSE,
 +        ),
 +        /**
 +         * string ​  ​identifier ​ set the escaping identifier
 +         */
 +        '​table_prefix'​ => '',​
 +        '​charset'​ => '​utf8',​
 +        '​caching'​ => FALSE,
 +        '​profiling'​ => TRUE,
 +//        '​identifier'​ => '"',​ /*для версии PostgreSQL => 9.1*/
 +    )
 +);
 +</​file>​
 +<note important>​Обязательно укажите строку '​identifier'​ => '"',​ если вы используете [[PDO]], [[ORM]] и [[PostgreSQL]] версии >= 9.1, в связи с изменением [[http://​www.postgresql.org/​docs/​9.1/​static/​sql-syntax-lexical.html|Lexical Structure]]. В противном случае будет возникать ошибка:​ **Database_Exception [ 42601 ]: SQLSTATE[42601]:​ Syntax error: 7 ERROR: syntax error at or near "​."​**
 +</​note>​
 +
 +
 +===== Модуль auth =====
 +  * [[http://​kohana3.ru/​module/​auth|Авторизация. Модуль Auth]]
 +  * [[http://​korzh.net/​2011-04-kohana-3-1-prostaya-autentifikaciya-polzovatelej.html|Kohana 3.1: Простая аутентификация пользователей]]
 +
 +Модуль **Auth**. При использование [[ORM]] роль Login должна быть назначена всем без исключения пользователям иначе авторизация не пройдет (это требование можно использовать для блокировки пользователя).
 +  * Для получения информации о текущем пользователе используется метод get_user($default),​ где $default — необязательный параметр,​ который будет возвращен,​ если авторизация не выполнена. Пример,​ для избежания ошибки **ErrorException [ Fatal Error ]: Cannot use object of type Model_User as array** нужно значения возварашаемые методом get_user()->​ явно приводить к массиву as_array()):<​file>​
 +if (Auth::​instance()->​logged_in()) {
 +       $user = Auth::​instance()->​get_user()->​as_array();​
 +       echo '​Hello,​ ' . $user['​username'​];​
 +}
 +</​file>​или же использовать обращение к объекту<​file>​
 +echo '​Hello,​ ' . $user->​username;​
 +</​file>​
 +===== Модуль Captcha =====
 +  * Модуль [[Captcha]] и Kohana 3.3.0
 +===== Классы =====
 +==== Класс I18n ====
 +
 +  * [[http://​kohanaframework.su/​advanced/​translate_errors|Перевод ошибок валидации]]
 +  * [[http://​kohanaframework.su/​guide/​translation_files|Файлы перевода]]
 +Класс [[I18n]]. В Kohana существует функция <​file>​
 +__()
 +</​file>​ для перевода небольших объемов текста. Например,​ предварительно в каталоге application/​i18n/​ должны быть созданы и заполнены файлы переводов en.php, ru.php, uk.php<​file>​
 +        <​!--Russian-->​
 +        <?php I18n::​lang('​ru'​);​
 +        echo __('​message'​);?>​
 +        <​!--English-->​
 +        <?php I18n::​lang('​en'​);​
 +        echo __('​message'​);?>​
 +        <​!--Ukrainian-->​
 +        <?php I18n::​lang('​uk'​);​
 +        echo __('​message'​);?>​
 +</​file>​
 +==== Класс HTTP ====
 +В версии Kohana 3.2 для перенаправления использовался метод объекта Request->​redirect(),​ в версии выше этот функционал перенесен в класс HTTP.
 +  * Перенаправить на внешний ресурс HTTP::​redirect('​http://​news.kh.ua'​);​
 +  * Перенаправить на локальный контроллер HTTP::​redirect('​admin'​);​
 +====== Kohana и 404 Not Found ======
 +  * [[http://​kohanaframework.org/​3.3/​guide/​kohana/​tutorials/​error-pages#​custom-error-pages|Kohana 3.3 Custom error pages]]
 +В Kohana можно использовать свой обработчик [[HTTP]] ошибок. Создадим обработчик самой распространенной ошибки HTTP 404 Not Found. И укажем ему срабатывать только если переменная Kohana::​$environment равна константе PRODUCTION, в любом другом случае запускать системный обработчик ошибок.
 +  - Переопределяем переменную Kohana::​$environment(по умолчанию значение DEVELOPMENT) при помощи файле [[.htaccess]],​ дописав в него строку<​code>​
 +SetEnv KOHANA_ENV PRODUCTION</​code>​Вместо .htaccess можно переопределять непосрдственно в bootstrap.php.
 +  - Создаем два файла для обработки 404 ошибки application/​classes/​HTTP/​Exception/​404.php и application/​views/​Errors/​404.php. Route::set создавать не надо.<​file>​
 +$ nano application/​classes/​HTTP/​Exception/​404.php
 +<?php defined('​SYSPATH'​) OR die('​No direct script access.'​);​
 +
 +class HTTP_Exception_404 extends Kohana_HTTP_Exception_404 {
 +
 +    public function get_response() {
 +        // Lets log the Exception, Just in case it's important!
 +        Kohana_Exception::​log($this);​
 +
 +        if (Kohana::​$environment >= Kohana::​DEVELOPMENT) {
 +            // Show the normal Kohana error page.
 +            return parent::​get_response();​
 +        } else {
 +
 +            $view = View::​factory('​Errors/​404'​);​
 +
 +            // Remembering that `$this` is an instance of HTTP_Exception_404
 +            $view->​message = $this->​getMessage();​
 +
 +            $response = Response::​factory()
 +                    ->​status(404)
 +                    ->​body($view->​render());​
 +
 +            return $response;
 +        }
 +    }
 +
 +}
 +</​file><​file>​
 +$ nano application/​views/​Errors/​404.php
 +<br />
 +<​h2>​404 Not Found</​h2>​
 +<br />
 +<?= $message ?>
 +<br />
 +</​file>​
 +  * Вызвать 404 ошибку можно самостоятельно:​ <​file>​
 +throw new HTTP_Exception_404('​File not found'​);​
 +</​file>​
 +====== Kohana подключение своих функций ======
 +Иногда возникает потребность подключить(автоподключить) свои функции к Kohana. Наиболее оптимальный и правильный способ это оформить свои пользовательские функции в виде статических методов класса и использовать ​ автоматический загрузчик Kohana. Например,​ создадим класс DFunction в файле DFunction.php<​file>​
 +<?php
 +class DFunction {
 +
 +    static function detectlanguage() {
 +        $langcode = explode(";",​ $_SERVER['​HTTP_ACCEPT_LANGUAGE'​]);​
 +        $langcode = explode(",",​ $langcode['​0'​]);​
 +        return $langcode['​0'​];​
 +
 +        /* Example for use
 +         * $language = DFunction::​detectlanguage();​
 +         * echo "You have chosen $language as your language in your web browser.";​
 +         */
 +    }
 +
 +}
 +</​file>​Чтобы класс подключился автоматически в ядро Kohana - файл DFunction.php должен находиться в директории classes (допускается использовать поддиректории,​ но в этом случае нужно поменять соответственно имя класса),​
  
загрузка...
kohana.txt · Последние изменения: 2018/12/05 05:29 (внешнее изменение)