Как правильно разместить всп. функции

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

Как правильно разместить всп. функции

Сообщение ShNURoK »

Добрый вечер.
К примеру в базе хранится время в формате Unix time, на сайте надо вывести в некоторых местах в одном формате, в других местах в другом. В модель это пока перетекает как просто $model->time=0123456789.
Поэтому приходится использовать спец. функции. Как в yii это делать правильно. В других фреймворках, это делается хелперами.
Правильно ли я понимаю, что нужно использовать виджет? Или делать аналоги с хелпером?
Или может стоит обрабатывать данные в модели или скажем в файле посреднике, между моделью и контроллером.
Как я понимаю в контроллере этим заниматься не стоит, в связи с их "утолщением".
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: Как правильно разместить всп. функции

Сообщение R3D3 »

Если форматирование даты простое, то сделать в модели в виде метода ->getTimeFormatted() например.
Если форматирование сложное, используется много логики или специальная html верстка, то лучше сделать виджетом.
Yii Jabber Conference: yii@conference.jabber.ru
Dismal
Сообщения: 247
Зарегистрирован: 2011.10.16, 13:25

Re: Как правильно разместить всп. функции

Сообщение Dismal »

как вариант - компонент (extends CComponent)
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Как правильно разместить всп. функции

Сообщение yan »

ShNURoK писал(а):Добрый вечер.
К примеру в базе хранится время в формате Unix time, на сайте надо вывести в некоторых местах в одном формате, в других местах в другом. В модель это пока перетекает как просто $model->time=0123456789.
Поэтому приходится использовать спец. функции. Как в yii это делать правильно. В других фреймворках, это делается хелперами.
Правильно ли я понимаю, что нужно использовать виджет? Или делать аналоги с хелпером?
Или может стоит обрабатывать данные в модели или скажем в файле посреднике, между моделью и контроллером.
Как я понимаю в контроллере этим заниматься не стоит, в связи с их "утолщением".
В компоненте-хелпере вполне нормальное решение мне кажется, еще можно сделать в виде behavior и присоединять к нужной модели.
C0vax
Сообщения: 42
Зарегистрирован: 2011.08.24, 22:28

Re: Как правильно разместить всп. функции

Сообщение C0vax »

я для этих же целей (форматирование дат) сделал класс, только не как компонент... может потом доработаю

Код: Выделить всё


/*
 * Класс для работы с датами.
 */
class DateFormat{
    public static $dbFormat = 'Y-m-d H:i:s';
    public static $compact = 'd.m.Y';
    public static $compactWithTime = 'd.m.Y H:i:s';
    public static $full = 'd F Y';
    public static $fullWithTime = 'd F Y H:i:s';
    public static $compareDate = '%H:%I:%S';
    
    /*
     * Конвертирование даты из строкового формата в формат базы данных
     */
    public static function convertStrToDb($inDate, $format = ''){
        $format = empty($format) ? self::$compactWithTime : $format;
        //$restult = date($format, strtotime($inDate));
        
        $date = DateTime::createFromFormat($format, $inDate);
        $result = $date->format(self::$dbFormat);
        
        return $result;
    }
    
    /*
     * Конвертирование даты из формата базы данных в строковой формат
     */
    public static function convertDbToStr($inDate, $format = ''){
        $format = empty($format) ? self::$compactWithTime : $format;
        
        $date = DateTime::createFromFormat(self::$dbFormat, $inDate);
        $test = new CDateFormatter('ru');
        $result = $test->formatDateTime($date->format($format), 'long', 'short');
        return $result;
    }
    
    /*
     * Сравнение двух дат и вывод результата в необходимом формате
     */
    public static function compareDate($date1, $date2, $format = ''){ 
        $format = empty($format) ? self::$compareDate : $format;
        
        $datetime1 = new DateTime($date1);
        $datetime2 = new DateTime($date2);
        $interval = $datetime1->diff($datetime2);
            
        return $interval->format($format);
    }
    
    /*
     * Вхождение даты в указанный диапазон
     * $start - начало диапазона
     * $finish - конец диапазона
     * $needle - искомая дата
     * $incExt - true - включать крайние значения, false - вхождение между крайними значениями
     */
    public static function outOfRange($start, $finish, $needle, $incExt = true){
        $date1 = strtotime($start);
        $date2 = strtotime($finish);
        $date3 = strtotime($needle);
                
        if($incExt){
            if($date3 >= $date1 && $date3 <= $date2) return true;
        }else{
            if($date3 > $date1 && $date3 < $date2) return true;
        }
        
        return false;
    }
}
 
Может конечно криво ))) но делал спешно под конкретные нужды... может кто что посоветует доработать ??
Ответить