DbHelp.ru
Маленький Yii блог
Комментарии
Гость: wh0cd1144039 [url=http://buy-prednisolone.reisen]buy prednisolone[/url] buy prednisolone 5mg without...
Гость: write my essay for me write an essay write essay my essay writing
Гость: wh0cd660443 [url=http://buy-celebrex.reisen]buy celebrex[/url] how much is celebrex http://buy-celeb...
Гость: wh0cd1144039 [url=http://buyadvair.store]advair[/url] advair http://buyadvair.store [url=http://buy-...
Гость: wh0cd660443 [url=http://buyprozac.shop]buy prozac online uk[/url] buy prozac online http://buyprozac...



Сервер 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 <[email protected]>
* @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. Во всех приложениях большую часть внимания мы с вами (программисты) должны уделять именно безопасности. Мы с вами живем в ... "Перевод : Безопасность"

  2. Поздравляю Всех своих читателей и случайных посетителей с уже наступившим 2011 годом. Желаю Вам в новом году чтобы все ... "Всех с новым годом!"

  3. Данная статья является переводом крохотной заметки в Cookbook-е которая появилась совсем недавно. Разработчики Yii порадовали нас отличной "фичей" которая ... "Добавление контекстной информации (session, user...) в журнал"

[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

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


Код:
Имя: