Timeago в Symfony2

В проекте необходимо реализовать дату в виде “год назад”, “10 минут назад” и тп. Для этого есть много решений, но мы воспользуемся TwigExtensions.

Установка расширения

composer require twig/extensions

добавляем расширение в Twig src/AppBundle/Resources/config/twig_extensions.xml,

<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <parameters>
        <parameter key="f_devs_article.twig.timeago.extension.class">Twig_Extensions_Extension_Date</parameter>
    </parameters>

    <services>
        <service id="f_devs_article.twig.timeago.extension" class="%f_devs_article.twig.timeago.extension.class%"
                 public="false">
            <argument type="service" id="translator"/>
            <tag name="twig.extension"/>
        </service>
    </services>

</container>

и не забудем подключить файл

в нашем бандле src/AppBundle/DependencyInjection/AppExtension.php

<?php

namespace AppBundle\DependencyInjection;

//….

class AppExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
//...
        $loader->load('twig_extensions.xml');
    }
}

или в файл /app/config/config.yml

imports:
    - { resource: @AppBundle/Resources/config/twig_extensions.xml }

Добавим переводы

Для русского src/AppBundle/Resources/translations/date.ru.yml

diff:
    ago:
        second: "несколько секунд назад"
        minute: "{1} минуту назад |]1,5[ %count% минуты назад |]4,Inf[ %count% минут назад"
        hour: "{1} час назад |]1,5[ %count% часа назад |]4,Inf[ %count% часов назад"
        day: "{1} день назад |]1,5[ %count% дня назад |]4,Inf[ %count% дней назад"
        month: "{1} месяц назад |]1,5[ %count% месяца назад |]4,Inf[ %count% месяцев назад"
        year: "{1} год назад |]1,5[ %count% года назад |]4,Inf[ %count% лет назад"
    in:
        second: "через несколько секунд"
        minute: "{1} через минуту |]1,5[ через %count% минуты |]4,Inf[ через %count% минут"
        hour: "{1} через час |]1,5[ через %count% часа |]4,Inf[ через %count% часов"
        day: "{1} через день |]1,5[ через %count% дня |]4,Inf[ через %count% дней"
        month: "{1} через месяц |]1,5[ через %count% месяца |]4,Inf[ через %count% месяцев"
        year: "{1} через год |]1,5[ через %count% года |]1,4[ через %count% лет"

Для английского src/AppBundle/Resources/translations/date.en.yml

diff:
    ago:
        second: "a few seconds ago"
        minute: "{1} a minute ago |]1,Inf[ %count% minutes ago"
        hour: "{1} a hour ago |]1,Inf[ %count% hours ago"
        day: "{1} a day ago |]1,Inf[ %count% days ago"
        month: "{1} a month ago |]1,Inf[ %count% months ago"
        year: "{1} a year ago |]1,Inf[ %count% years ago"
    in:
        second: "{1} in a second |]1,Inf[ in a few seconds"
        minute: "{1} in a minute|]1,Inf[ in %count% minutes"
        hour: "{1} in a hour |]1,Inf[ in %count% hours"
        day: "{1} in a day |]1,Inf[ in %count% days"
        month: "{1} in a month |]1,Inf[ in %count% months"
        year: "{1} in a year |]1,Inf[ in %count% years"

Для других языков добавляем по аналогии.

Используем в наших шаблонах

<time>{{ article.updatedAt|time_diff }}</time>

Заключение

Для отображение даты нам надо только подключить и настроить расширение, не надо использовать или писать свое расширение. Так же нам будут доступны даты не только вида “5 минут назад” но и в будущем “через 10 часов”. Если не использовать “translator” тогда дата будет вида “in 1 minute” или “in 5 minutes” для будущего или “10 minutes ago”, “1 hour ago” для прошлого.

Читайте также:

Звездный рейтинг

Доброго времени суток дамы и господа. С помощью этой статьи я хотел бы познакомиться с вами, а заодно опробовать себя в качестве автора. А для того чтобы это знакомство не проходило зря, мы рассмотрим с вами некоторые варианты создания инструмента для оценки чего либо. В интернете прижился такой визуальный элемент как “звездочки”: К примеру: Хотя в последнее время все больше используются оценочные инструменты со сторонних сервисов, например “лайки” от Facebook'a или от Вконтакте, которые позволяют оценить материал только в положительном ключе. Хорошо это или плохо, мы с вами решим как - нибудь в другой раз, а сейчас давайте рассмотрим несколько вариантов реализации традиционных “звездочек”.