Расширяем Хелперы

Комментарии: 6  Просмотры: 7 914

Мы с вами уже рассмотрели довольно много классов-Хелперов, самых на мой взгляд интересных и часто используемых. Конечно рассмотрены далеко не все Хелперы фреймворка Кохана и какая-то их часть осталась за кадром. Но все равно может получится так, что существующие Хелперы не смогут охватить полностью весь круг задач, стоящих перед разработчиком при написании сайта, особенно если сайт достаточно сложен. И выход тут один — расширять существующие Хелперы или даже создавать собственные. Но естественно для расширения существующих классов нельзя напрямую редактировать файлы, находящиеся в папке system, об этом мы с вами очень хорошо помним. Но так как Кохана имеет иерархическую структуру, никто не мешает нам произвести все манипуляции с классами в нашей папке application. В этот момент начинаешь мысленно благодарить разработчиков фреймворка. Именно с заботой о нас они создали такую непонятную на первый взгляд структуру, когда в system/classes лежит куча пустых классов вида:

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

А классы с методами лежат в папке system/classes/kohana. С помощью такой структуры можно легко добавить собственные методы в нужный Хелпер при этом не потеряв уже существующие. Делается это следующим образом. Допустим нужно расширить класс HTML. Копируем файл html.php из system/classes в application/classes и просто вставляем в этот файл наш метод. Пусть это будет метод, красиво оформляющий комментарии к статьям. Полностью класс будет выглядеть вот так:

<?php defined('SYSPATH') or die('No direct script access.');
 
class HTML extends Kohana_HTML {
 
    /**
     * Create html text for comments with preventing XSS injections.
     *
     *     echo comment($author, $message, $timestamp);
     *
     * @param   string   author`s name
     * @param   string  message text
     * @param   integer  UNIX timestamp
     * @return  string
     */
    public static function comment($author, $message, $timestamp = FALSE)
    {
        $timestamp = ($timestamp)? (int)$timestamp : time();
        $date = date("d.m.Y");
        $new_text  = '<strong>'. self::chars($author) .'</strong> <i>'. $date .'</i>';
        $new_text .= '<br /><br />'. self::chars($message);
        return $new_text;
    }
 
}

Использование аналогично обычным Хелперам:

    $author = 'Игорь Иванович';
    $message = 'Хочу ничего не делать, а деньги получать';
 
    echo HTML::comment($author, $message);

Обратите внимание, что в своем методе мы используем еще и метод chars этого же класса, для защиты от XSS. То есть «родные» методы Хелпера никуда не делись. Они остались и могут использоваться наравне с вашими добавленными.
Также может возникнуть ситуация, когда вас по каким-то причинам не устраивает какой-то уже существующий метод Хелпера. Например, он не обладает нужным функционалом в рамках текущей задачи. В таком случае вы можете заменить этот метод своим. Для этого достаточно просто обозвать свой метод также, как тот, который вы хотите заменить.
Ну и наконец создание собственных Хелперов совершенно идентично расширению существующих с той лишь разницей, что название файла и класса должно быть уникальным и сам класс не должен ничего наследовать. Что-то вроде такого:

<?php defined('SYSPATH') or die('No direct script access.');
 
class Default {
 
... код Хелпера ...
 
}

Вы можете создавать Хелперы для всех участков кода, которые вам понадобятся в проекте несколько раз. Нужно просто запомнить, что ваш класс с Хелпером должен храниться в папке application/classes и его методы должны быть статическими. Вот и все.

<< Назад | Обсудить на форуме


К записи оставлено 6 коммент.

$timestamp = ($timestamp)? (int)$timestamp : time();
- Это что за на????
PHP НЕ ТИПИЗАРОВАНЫЙ ЯЗЫК, ЕСЛИ КАКОЙ НИБУДЬ ФУНКЦИИ ПОНАДОБИТСЯ ИСПОЛЬЗОВАТЬ INTEGER ОНА СДЕЛАЕТ САМА ПРИВЕДЕНИЕ ТИПОВ!!!!

Точнее интерпретатор php сам сделает

Если честно, я не помню зачем тут вообще timestamp.
А запись…такую запись сами разработчики коханы используют. Вы им напишите, что за на…

Класс date

public static function fuzzy_span($timestamp, $local_timestamp = NULL)
{
    $local_timestamp = ($local_timestamp === NULL) ? time() : (int) $local_timestamp;
...

в PHP можно приводить к типу если это потребуется.

Что вы агритесь, можно нормально написать, поправить, спросить… Если не нравится, сделайте такойже сайт переводите сами доки, разбирайтесь и расширяйте хелперы по своему! А вообще шли бы вы сами «на????»!

«PHP НЕ ТИПИЗАРОВАНЫЙ ЯЗЫК, ЕСЛИ КАКОЙ НИБУДЬ ФУНКЦИИ ПОНАДОБИТСЯ ИСПОЛЬЗОВАТЬ INTEGER ОНА СДЕЛАЕТ САМА ПРИВЕДЕНИЕ ТИПОВ!!!!» —
делал на сайте без базы данных, мини option. В файле xml хранились опции в том числе целочисленные. при чтении опции id = 1 из xml файла и сравнивании ее с $_POST['id'] = 1 — показывало не равные значения до тех пор пока не сделал (int)($id) == $_POST['id'] и почему не привело самостоятельно?



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.