Как стать автором
Обновить

Знакомство с Kohana 3.0 — Части 7, 8, 9

Время на прочтение6 мин
Количество просмотров3K
Автор оригинала: dealtaker.com
Встречайте седьмую, восьмую и девятую части цикла статей по разработке с Kohana PHP V3 (KO3). Предыдущие части можно найти по метке "знакомство с kohana 3.0". В этой статье типа 3-в-1 мы рассмотрим помощники (хелперы), модули и использование сторонних библиотек.

Часть 7: Помощники (хелперы)


Документация Kohana 2.0 приводит для них следующее определение:
Помощники — это удобные функции, которые призваны помочь вам с разработкой.

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

То есть по сути это статические методы, сделанные с целью “помочь” вам в рутинных вещах, вроде работы с массивами или URL. В Kohana есть ряд уже готовых помощников, но мы займемся созданием своего. Открывайте редактор и приступим.

Создайте новую папку “helper” в “/application/classes”. Откройте новый файл и поместите туда следующее:

<?php
class Helper_MyUrl
 {
    public static function SEOIt($str)
     {
        $str = preg_replace(array('/\s/', '/[$.+!*\'(),"]/'), array('-', ""), $str);
        return $str;
     }
 }

Сохраните это как “myurl.php” в только что созданной директории “/application/classes/helper”. Теперь откройте “/application/views/pages/ko3.php” и добавьте в конец эту строку:

<br /><?php echo Helper_MyUrl::SEOIt('This Is a string!!!');?>

После сохранения, открыв в браузере “http://localhost/mykohana3/ko3/”, вы увидите “ThisIsastring” внизу. Довольно просто!

Примечание переводчика: это не обрыв статьи, просто эта часть действительно неприлично короткая. Ничего не могу поделать, извините!

Часть 8: Модули


Модуль – это плагин, способный расширить ядро фреймворка, дать вашему проекту новую секцию (блоги и форумы, например) или же просто предоставить набор классов, доступных глобально. Начнем!

Создайте в папке “modules” новую директорию с названием “fortune”. Внутри “module/fortune” создайте папки “classes” и “views”. Затем в “/module/fortune/classes” создайте папку “kohana”, а в “/module/fortune/views” создайте “fortune”. Дерево директорий должно выглядить примерно так:

modules
+-- fortune
     |-- classes
     |    +-- kohana
     +-- views
          +-- fortune

В папке “/module/fortune/classes/” создайте файл “fortune.php” и поместите в него следующее:

<?php
defined('SYSPATH') or die('No direct script access.');
class Fortune extends Kohana_Fortune{}

Здесь мы просто наследуем класс, который дальше будем создавать. Откройте новый документ и скопируйте туда код:

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

/**
 * Fortune Cookie Module
 */
class Kohana_Fortune
 {
    // Merged configuration settings
    protected $config  = array('view' => 'fortune/default');
    protected $fortune = "";

    /**
     * Creates a new Fortune object.
     *
     * @return Fortune
     */
    public static function factory(array $config = array())
     {
        return new Fortune($config);
     }

    public function __construct(array $config = array())
     {
        // Overwrite system defaults with application defaults
        $this->config = $this->config_group() + $this->config;
     }

    /**
     * Retrieves a fortune config group from the config file. One config group can
     * refer to another as its parent, which will be recursively loaded.
     *
     * @param  STRING fortune config group; "default" if none given
     * @return ARRAY  config settings
     */
    public function config_group($group = 'default')
     {
        // Load the fortune config file
        $config_file     = Kohana::config('fortune');

        // Initialize the $config array
        $config          = array('group' => (string)$group);

        // Recursively load requested config groups
        while(isset($config['group']) && isset($config_file->$config['group']))
         {
           // Temporarily store config group name
           $group   = $config['group'];
           unset($config['group']);

           // Add config group values, not overwriting existing keys
           $config += $config_file->$group;
         }

        // Get rid of possible stray config group names
        unset($config['group']);

        // Return the merged config group settings
        return $config;
     }

    /**
     * Randomly pick a fortune
     *
     * @return STRING fortune text
     */
     public function getFortune()
      {
         // Stolen from: http://fortunes.cat-v.org/plan_9/
         $fortunes      = array('2 is always smaller than 3, even for large values of 2.',
                                'A penny saved is a political breakthrough.',
                                'Avoid reality at all costs.',
                                'Bad taste is timeless.');

         $this->fortune = $fortunes[array_rand($fortunes, 1)];
      }

    /**
     * Renders the fortune.
     *
     * @param  MIXED   string of the view to use, or a View object
     * @return STRING  fortune output (HTML)
     */
    public function render($view = NULL)
     {
        if($view === NULL)
         {
           // Use the view from config
           $view = $this->config['view'];
         }

        if(!$view instanceof View)
         {
            // Load the view file
            $view = View::factory($view);
         }

        $this->getFortune();

        // Pass on the whole Fortune object
        return $view->set(get_object_vars($this))->set('page', $this)->render();
     }

    /**
     * Renders the fortune.
     *
     * @return STRING fortune output (HTML)
     */
    public function __toString()
     {
        return $this->render();
     }
 }

Сохраните это как “fortune.php” в “/modules/fortune/classes/kohana”. По большей части класс выглядит как несложная часть ядра Kohana. У нас два свойства типа protected: “config” и “fortune”. “Config” предназначен для, собственно, конфигурации, а в “fortune” хранится одно предсказание судьбы (мы делаем аналог печенек с предсказаниями), которое будет выведено на экран. Дальше у нас метод “factory” для реализации соответствующего паттерна и конструктор, производящий некоторые манипуляции со свойством “config”.

Сердцем класса является метод “getFortune”. Я здесь схитрил и вместо создания модели и получения данных из базы просто использовал массив. Из него берется случайный элемент и записывается в свойство “fortune”.

Далее у нас метод “render()”. Он запускает метод “getFortune()” и визуализирует вид. Его, в свою очередь, вызывает метод “__toString()”.

Создайте новый файл с таким содержимым:

<div style="width: 250px; height: 52px; vertical-align: middle; display: table-cell; text-align: center; border: 1px solid #CCCCCC; border-right-color: #666666; border-bottom-color: #666666;">
  <p><?php echo $fortune;?></p>
</div>

Сохраните его как “default.php” в “/modules/fortune/views/fortune/default.php”. Как видите, я через “echo” вывожу переменную $fortune, которая является свойством типа protected. Это потому, что в методе “render” мы передали все свойства виду, так проще.

Осталось отредактировать еще пару файлов. Откройте “/application/bootstrap.php” и найдите секцию с текстом “Kohana::modules”. Замените ее на это:

Kohana::modules(array(// 'auth'       => MODPATH.'auth',       // Basic authentication
                      // 'codebench'  => MODPATH.'codebench',  // Benchmarking tool
                      'database'   => MODPATH.'database',   // Database access
                      // 'image'      => MODPATH.'image',      // Image manipulation
                      // 'orm'        => MODPATH.'orm',        // Object Relationship Mapping
                      // 'pagination' => MODPATH.'pagination', // Paging of results
                      // 'userguide'  => MODPATH.'userguide',  // User guide and API documentation
                      'fortune'    => MODPATH.'fortune',
                     ));

Мы добавили модуль для предсказаний и включили его во фреймворке. Теперь откройте файл “/application/views/pages/ko3.php” и добавьте в конец строку:

<?php echo Fortune::factory();?>

Открыв в браузере “http://localhost/mykohana3/ko3/”, вы должны увидеть внизу предсказание судьбы!

Часть 9: Использование сторонних библиотек


Прежде всего нужно создать папку “vendors” в директории “application”. В “vendors” создайте папку “Zend” (да, с заглавной “Z”). Дальше необходимо скачать последнюю версию Zend Framework (Minimal Package), на момент публикации это 1.11.2. Откройте архив и извлеките все из “ZendFramework-1.11.2-minimal/library/Zend/” в “application/vendors/Zend”.

Откройте файл “application/bootstrap.php” и над строкой “echo Request::getInstance()” добавьте следующее:

$path = Kohana::find_file('vendors', 'Zend/Loader');

if($path)
 {
    ini_set('include_path',
    ini_get('include_path') . PATH_SEPARATOR . dirname(dirname($path)));

    require_once 'Zend/Loader/Autoloader.php';
    Zend_Loader_Autoloader::getInstance();
 }

Откройте “application/views/pages/ko3.php” и в самом низу вставьте:

<?php $validator = new Zend_Validate_Isbn();?>
<br />978-3-16-148410-0 <?php echo ($validator->isValid('978-3-16-148410-0')) ? 'is' : 'is not';?> valid.
<br />9783161484100 <?php echo ($validator->isValid('9783161484100')) ? 'is' : 'is not';?> valid.

Теперь по адресу “http://localhost/mykohana3/ko3″ вы должны увидеть результаты двух тестов внизу.

Примечание переводчика: хотя дальше автор цикла обещал рассказать о формах, с июня 2010 года новых статей не появлялось. Так что это конец знакомства с Kohana 3.0.
Теги:
Хабы:
Всего голосов 18: ↑8 и ↓10-2
Комментарии5

Публикации

Истории

Ближайшие события

Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
OTUS CONF: GameDev
Дата30 мая
Время19:00 – 20:30
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область