Добрый вечер.
К примеру в базе хранится время в формате Unix time, на сайте надо вывести в некоторых местах в одном формате, в других местах в другом. В модель это пока перетекает как просто $model->time=0123456789.
Поэтому приходится использовать спец. функции. Как в yii это делать правильно. В других фреймворках, это делается хелперами.
Правильно ли я понимаю, что нужно использовать виджет? Или делать аналоги с хелпером?
Или может стоит обрабатывать данные в модели или скажем в файле посреднике, между моделью и контроллером.
Как я понимаю в контроллере этим заниматься не стоит, в связи с их "утолщением".
Как правильно разместить всп. функции
Re: Как правильно разместить всп. функции
Если форматирование даты простое, то сделать в модели в виде метода ->getTimeFormatted() например.
Если форматирование сложное, используется много логики или специальная html верстка, то лучше сделать виджетом.
Если форматирование сложное, используется много логики или специальная html верстка, то лучше сделать виджетом.
Yii Jabber Conference: yii@conference.jabber.ru
Re: Как правильно разместить всп. функции
как вариант - компонент (extends CComponent)
Re: Как правильно разместить всп. функции
В компоненте-хелпере вполне нормальное решение мне кажется, еще можно сделать в виде behavior и присоединять к нужной модели.ShNURoK писал(а):Добрый вечер.
К примеру в базе хранится время в формате Unix time, на сайте надо вывести в некоторых местах в одном формате, в других местах в другом. В модель это пока перетекает как просто $model->time=0123456789.
Поэтому приходится использовать спец. функции. Как в yii это делать правильно. В других фреймворках, это делается хелперами.
Правильно ли я понимаю, что нужно использовать виджет? Или делать аналоги с хелпером?
Или может стоит обрабатывать данные в модели или скажем в файле посреднике, между моделью и контроллером.
Как я понимаю в контроллере этим заниматься не стоит, в связи с их "утолщением".
Re: Как правильно разместить всп. функции
я для этих же целей (форматирование дат) сделал класс, только не как компонент... может потом доработаю
Может конечно криво ))) но делал спешно под конкретные нужды... может кто что посоветует доработать ??
Код: Выделить всё
/*
* Класс для работы с датами.
*/
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;
}
}