2014-10-11 2 views
7

Я новичок в Twig и я ищу, чтобы превратить формат datetime в время назад как 2 часа назад или 3 дня назад. Существует jquery-плагин (jquery-timeago), который я использую на стороне клиента, но было бы здорово, если бы я мог сделать это с веточкой. Если твинг не входит в этот формат фильтра, есть расширения, которые я могу использовать?Twig - время назад формат

ответ

12

Я узнал, что могу создать собственный фильтр с веточкой Twig_SimpleFilter.

$filter = new Twig_SimpleFilter('timeago', function ($datetime) { 

    $time = time() - strtotime($datetime); 

    $units = array (
    31536000 => 'year', 
    2592000 => 'month', 
    604800 => 'week', 
    86400 => 'day', 
    3600 => 'hour', 
    60 => 'minute', 
    1 => 'second' 
); 

    foreach ($units as $unit => $val) { 
    if ($time < $unit) continue; 
    $numberOfUnits = floor($time/$unit); 
    return ($val == 'second')? 'a few seconds ago' : 
      (($numberOfUnits>1) ? $numberOfUnits : 'a') 
      .' '.$val.(($numberOfUnits>1) ? 's' : '').' ago'; 
    } 

}); 

Затем я добавляю его в моей среде Twig:

$twig = $app->view()->getEnvironment();//because I'm using Twig in Slim framework 
$twig->addFilter($filter); 

Используйте это мой шаблон, как это:

{{2014-10-11 12:54:37|timeago}} 
+0

Я знаю, что это время, так как вы писали, но есть способ, чтобы добавить перевод к вашему решению? Я смог ввести объект Translator в службу, но Symfony не распознает «перевод-идентификаторы». – wawa

3

Если вы используете Twig внутри Symfony, проверить KnpTimeBundle , Включает поддержку «назад» на нескольких языках.

+0

Спасибо, я буду иметь это в виду, но сейчас я собираюсь сделать Slim в этом маленьком проекте. –

12

расширения даты прутика в делает именно то, что вы спрашиваете:

{{ post.published_at|time_diff }} 

В приведенном выше примере вывода будет строка, как 4 секунды назад или в 1 месяц, в зависимости от фильтруемой даты.

Смотреть http://twig.sensiolabs.org/doc/extensions/date.html (больше не работает)

Работа ссылка http://twig-extensions.readthedocs.io/en/latest/date.html

+1

К сожалению, этот фильтр дает неопределенный (или null?), Если разница составляет 0 секунд. Итак, вы должны использовать '{{post.published_at | time_diff? : «прямо сейчас»}} '. Я рекомендую написать специальный фильтр, как было предложено выше. – Travis

+0

Эта ссылка не работает. Была ли эта функция удалена из ветки? Есть ли способ сделать это сейчас? – Bryce

+0

Я добавил рабочую ссылку – 10us

Смежные вопросы