DbHelp.ru
Маленький Yii блог
Комментарии
Гость: Намереваетесь оттрахать три киски сразу, обратите взо...
Гость: «Халва» - Карта Рассрочки взять кредит частный займ ...
Гость: Регистрируешься - огромный бонусы. Играешь - огромный ...
Гость: Быстро и качественно придам вашему фото идеальный вид....
Гость: Информативно,продолжай в том же духе [url=http://forum.oncolo...



Сервер Ultima Online - Forest Wars (от создателя данного блога)

Выводим дату по человечески

Рубрика: Компоненты

Оцените эту статью:

Рейтинг: 0.00 (0)
5 Апр. 2009
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com

Yii Framework Blog img http://dbhelp.rublog6 Практически в каждом проекте мы сталкиваемся с тем что нам надо выводить даты. Это может быть все что угодно: дата создания сообщения, дата авторизации и др. Простые числовые даты - не совсем красивое решение. Для того чтобы привести даты из "2008-03-02" в "2 Марта 2008" я написал небольшой виджет.

---

Пример как этот виджет используется у меня в блоге. В отображении просто делаем вот так:

echo $this->widget('PeopleDate',array('date'=>$post->created));

Мы вызываем PeopleDate и передаем в него (в наш виджет) переменную date. В данном случае $post->created у нас содержит в себе дату в формате TIMESTAMP (2009-04-04 23:55:35). После этого наш виджет все это дело пере конвертирует и приведёт в вид: 4 Апр 2009

Для того чтобы виджет работал - надо создать файл PeopleDate.php в папке protected/components. Как использовать виджет в отображении - показано выше. Код файла PeopleDate.php:


/**
* PeopleDate class file
*
* @author Alekseenko Timur <zolter.od@gmail.com>
* @link http://www.dbhelp.ru/
* @copyright Copyright 2009
*/
class PeopleDate extends CWidget
{
public $date;
public $type = 1;

public function init()
{
if (!empty($this->date)) {
switch ($this->type) {
case 1: {
echo $this->dateFormat($this->date);
break;
}
case 2: {
echo $this->getTimeAgo($this->date);
break;
}
}
}
}

function dateFormat($string, $format="%e %b. %Y", $lang = 'ru')
{

if (substr(PHP_OS,0,3) == 'WIN') {
$_win_from = array ('%e', '%T', '%D');
$_win_to = array ('%#d', '%H:%M:%S', '%m/%d/%y');
$format = str_replace($_win_from, $_win_to, $format);
}

if($string != '') {
$out = strftime($format, strtotime($string));
} else {
$out = '';
}

$strFrom = array(
'january', 'jan',
'february', 'feb',
'march', 'mar',
'april', 'apr',
'may', 'may',
'june', 'jun',
'july', 'jul',
'august', 'aug',
'september', 'sep',
'october', 'oct',
'november', 'nov',
'december', 'dec',
'monday',
'tuesday',
'wednesday',
'thursday',
'friday',
'saturday',
'sunday',
'mon',
'tue',
'wed',
'thu',
'fri',
'sat',
'sun',
);
$strTo = array('ru' => array(
'Январь', 'Янв',
'Февраль', 'Фев',
'Март', 'Мар',
'Апрель', 'Апр',
'Май', 'Май',
'Июнь', 'Июн',
'Июль', 'Июл',
'Август', 'Авг',
'Сентябрь', 'Сен',
'Октябрь', 'Окт',
'Ноябрь', 'Ноя',
'Декабрь', 'Дек',
'Понедельник',
'Вторник',
'Среда',
'Четверг',
'Пятница',
'Суббота',
'Воскресенье',
'Пн',
'Вт',
'Ср',
'Чт',
'Пт',
'Сб',
'Вс',
),
'ua' => array(
'Січень','Січ',
'Лютий', 'Лют',
'Березень', 'Бер',
'Квітень', 'Кві',
'Травень', 'Тра',
'Червень', 'Чер',
'Липень', 'Лип',
'Серпень', 'Сер',
'Вересень', 'Вер',
'Жовтень', 'Жов',
'Листопад', 'Лис',
'Грудень', 'Грд',
'Понеділок',
'Вівторок',
'Середа',
'Четвер',
'П\'ятниця',
'Субота',
'Неділя',
'Пн',
'Вт',
'Ср',
'Чт',
'Пт',
'Сб',
'Нд',
)

);

$outOld = $out;

$out = str_replace($strFrom, $strTo[$lang], strtolower($out));
if ($out == strtolower($outOld)){
$out = $outOld;
}
$out = str_replace('Май.', 'мая', $out);
return $out;
}

function dateRidN2R($str)
{
$arrFrom = array(
'январь',
'февраль',
'март',
'апрель',
'май',
'июнь',
'июль',
'август',
'сентябрь',
'октябрь',
'ноябрь',
'декабрь', );
$arrTo = array(
'января',
'февраля',
'марта',
'апреля',
'мая',
'июня',
'июля',
'августа',
'сентября',
'октября',
'ноября',
'декабря');
$str = str_replace($arrFrom, $arrTo, strtolower($str));
return $str;
}

/**
* Переводим TIMESTAMP в формат вида: 5 дн. назад
* или 1 мин. назад и тп.
*
* @param unknown_type $date_time
* @return unknown
*/
function getTimeAgo($date_time)
{
$timeAgo = time() - strtotime($date_time);
$timePer = array(
'day' => array(3600 * 24, 'дн.'),
'hour' => array(3600, ''),
'min' => array(60, 'мин.'),
'sek' => array(1, 'сек.'),
);
foreach ($timePer as $type => $tp) {
$tpn = floor($timeAgo / $tp[0]);
if ($tpn){

switch ($type) {
case 'hour':
if (in_array($tpn, array(1, 21))){
$tp[1] = 'час';
}elseif (in_array($tpn, array(2, 3, 4, 22, 23)) ) {
$tp[1] = 'часa';
}else {
$tp[1] = 'часов';
}
break;
}
return $tpn.' '.$tp[1].' назад';
}
}
}
}
?>

Как видите по коду - виджет настроен на работу с двумя языками. Если вам хочется что бы название месяцев писалось по украински - тогда просто указываем в парраметре $lang = 'ua'. И еще, как вы должны были заметить я добавил еще один бонусный метод для вас.

dateRidN2R($str) - переводит месяц из формата "январь" в "января". Это иногда очень удобно.

Yii Framework Blog img http://dbhelp.rublog7 getTimeAgo($date_time) - очень интересная функция. выводит сколько времени прошло с момента $date_time в человеко понятном формате.
Что бы использовать данный формат вывода в виджете - надо передать параметр $type со значением 2. Т.е. в отображении мы должны сделать вот так вот:

$this->widget('PeopleDate',array('date'=>$post->created, 'type' => 2));

Думаю данный тип вывод понравится многим :)

Вот в принципе и все по данному виджету. Пользуйтесь.



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. Александр Макаров на страницах yiiframework.ru опубликовал перевод очень хорошего рецепта. Хочу заметит что материал будет очень полезен для тех, кто ... "Краткий справочник по валидации форм"

  2. Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут ... "Урок 5 : Многоязычность"

  3. Сегодняшняя статья является переводом "Manage application configuration in different modes" из Cookbook. При создании нашего приложения единственным параметром который ... "Используем много конфигураций в одном приложении"

[guest] Wave

Было сказано: Воскресенье, 14 Июнь 2009

А почему бы не использовать локаль?
setlocale(LC_TIME, 'ru_RU.UTF-8'); //ru_RU.UTF8
echo '<b>На сегодня ('. strftime('%A, %d %B %Y'). ')</b>:';
//На сегодня (воскресенье, 14 июня 2009):

[guest] Гость

Было сказано: Воскресенье, 14 Июнь 2009

Этот вариант будет работать независимо от конфигурации апача?

[adm] zolter

Было сказано: Понедельник, 15 Июнь 2009

to Wave
В принципе тоже вариант. Просто интереснее же написать свой обход на Yii :)

[guest] Wave

Было сказано: Понедельник, 15 Июнь 2009

<i>переводит месяц из формата "январь" в "января".</i>
Тоже не слишком универсально. Локалей у апача куда больше, чем в данном варианте.
А насчёт независимости от конфигурации, честно говоря, не знаю, но мне ещё не попадались хостинги под русскоязычные проекты, которые не поддерживали бы русскую локаль.

[adm] zolter

Было сказано: Понедельник, 15 Июнь 2009

Я с вами полностью согласен!

Просто на момент написания этой статьи я хотел показать на примере как создавать свои виджеты на Yii фреймворке. После чего откапал пару очень старых функций (которые использовал на англ. хостинге где локаль заюзать не было возможности) и скомпоновал в виджет.

В том что помимо такого способа как использовал я есть более гибкие и удобные, я с вами согласен :)

Плюс к этому большую часть внимания читателей я хотел обратить к методу getTimeAgo который часто бывает нужный на сайтах.

[guest] nagash

Было сказано: Среда, 09 Сентябрь 2009

у yii уже есть своя "локаль" :)

//название месяцей (по формату)
$s = Yii::app()->getLocale('ru')->getMonthNames();
//дней недели
$s = Yii::app()->getLocale('uk')->getWeekDayNames();

http://www.yiiframework.com/doc/api/CLocale#getMonthNames-detail

[guest] Гость

Было сказано: Среда, 09 Сентябрь 2009

кстати, а почему не создать набор полезных функций, и объединить их в одном месте?
а то в куче виджетов можно будет со временем затеряться :(

[guest] zolter

Было сказано: Среда, 09 Сентябрь 2009

to nagash
вот за это большое спасибо

[guest] zolter

Было сказано: Среда, 09 Сентябрь 2009

to Гость
так это все есть в апи

[guest] nagash

Было сказано: Среда, 09 Сентябрь 2009

to zolter
пожалуйста.
сам его учу. решил проектик сделать, дабы практикой закрепить.
правда приходиться много в документацию смотреть, не все пока явно :(

[guest] zolter

Было сказано: Среда, 09 Сентябрь 2009

ага, к сожалению доки пока на русском не особо много. а на инглише только по апи и форуму можна что то новое для себя узнать. ну надеюсь к версии 1.1 все будет намного серьезнее

[guest] Гость

Было сказано: Вторник, 26 Апрель 2011

Пример отображения:
echo $this->widget('PeopleDate',array('date'=>$post->created));

- а зачем там эко? - у Вас еко есть вот тут:

case 1: {
echo $this->dateFormat($this->date);
break;
}
case 2: {
echo $this->getTimeAgo($this->date);
break;
}

[guest] Гость

Было сказано: Четверг, 08 Сентябрь 2011

Мля в локаль вынеси

[guest] Гость

Было сказано: Пятница, 15 Июнь 2012

<?php echo Yii::app()->dateFormatter->format(Yii::t('blog','MMMM d, yyyy HH:mm'),$comment->create_time); ?>

[guest] Жека

Было сказано: Четверг, 28 Март 2013

к последнему добавить 'language'=>'ru' в config/main.php

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


Код:
Имя: