Calcular diferencias de fechas con twig

1,693 views
Skip to first unread message

Lucas Serrey

unread,
Dec 14, 2012, 4:21:05 PM12/14/12
to symfo...@googlegroups.com
Hola!

 Necesito calcular diferencias (en días y horas) de fechas, alguien sabe como se puede hacer con twig?

  Por ejemplo, tengo un post del 2012-12-10, si la fecha actual es 2012-12-14, quisiera que me devuelva 4 dias (el nro de días entre una fecha y otra).

  Esto también se podrá hacer para las horas en un mismo día ?

  Ejemplo, dos posts del mismo día pero con dif de 5 horas, es decir, uno el 2012-12-14 13:00:00 y el otro 2012-12-14 18:00:00, que devuelva 5 horas.

     Gracias de antemano a todo el que pueda ayudarme!

            Saludos!

Absalón Valdés Ormeño

unread,
Dec 14, 2012, 4:23:04 PM12/14/12
to symfony-es
y por qué en twig? ese cálculo lo puedes hacer en php con la función date_diff y luego pasas el resultado al template http://php.net/manual/es/datetime.diff.php



--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es



--
Absalon Valdés Ormeño.
http://es.gravatar.com/absalonvaldes

Fran Moreno

unread,
Dec 14, 2012, 7:01:49 PM12/14/12
to symfo...@googlegroups.com
Buenas,

Si existe una función en PHP para lo que quieres, usarla en Twig es muy sencillo, por ejemplo si quisieras hacer:

post1.updatedAt | datediff(post2.updatedAt)

Sólo habría que crear una extensión en Twig, sobrescribir getFilters añadiendo el nuevo filtro y declarar la extensión como servicio, aquí puedes ver un ejemplo de crear la extensión y declararla como servicio:


Y el método getFilters sería:

public function getFilters()
{
    return array(
            'datediff'  => new \Twig_Filter_Function('date_diff')
    );
}

post1.updatedAt sería el primer parámetro y post2.updatedAt el segundo de date_diff, luego hay que tener en cuenta que devuelve un DateInterval, si ese DateInterval lo quieres a un formato determinado puedes usar el filtro date que viene en el core:

post1.updatedAt | datediff(post2.updatedAt) | date("%a días")

Saludos,
Fran Moreno,

Lucas Serrey

unread,
Dec 15, 2012, 9:01:02 AM12/15/12
to symfo...@googlegroups.com
   Finalmente lo resolví con las extensiones twig. Similar a la doc que me pasó Fran pero con una pequeña variante (que es lo mismo y no afecta en nada) y es que registro la extension como servicio en el config.yml en vez de XML..

services:
    Acme.twig.utilidades_extension:
            class: Acme\MiBundle\Twig\UtilidadesExtension
            tags:
                - { name: twig.extension }

De paso cuento que esta declaración sirve para Symfony 2.1, ya que vi por ahí varios ejemplos (supongo q viejos) que devuelven una excepción.

   Gracias por la ayuda! Saludos.

Pablo Braulio

unread,
Dec 18, 2012, 7:35:41 AM12/18/12
to Lista de symfony
Yo creo que twig está pensado para simplemente mostrar datos. Toda la lógica que lleve eso debería hacerse en el controlador.

Saludos cordiales.
Pablo.

Si lo reenvías, ten la precaución de borrar los datos de procedencia que
encabezarían tu reenvío – empezando por mi dirección de correo
electrónico - . Coloca siempre las direcciones de tus contactos en el
campo <CCO> para que viajen discretas, no en el campo <Para> ni en
el<CC>. De esa forma nadie que lo reciba tendrá constancia de las señas
de los demás destinatarios a los que también se remite. Todo ello a fin
de evitar que nadie se aproveche de todas las direcciones que se van
acumulando al pasar de buzón a buzón para el lanzamiento de correo
basura y otras indeseadas lindezas. Aparte claro está de garantizar la
privacidad.



--

magarzon

unread,
Dec 18, 2012, 5:42:58 PM12/18/12
to symfo...@googlegroups.com
Te equivocas.

Imagínate el caso de un template que vas a reutilizar en varios templates, y que muestre por ejemplo esa diferencia de fechas. 

Tendrías tres opciones:

  • En cada uno de los controller  que utilicen esos templates "padre" tienes que hacer el cálculo (se puede meter esto en algún servicio/clase singleton de utilidades para reutilización) y pasarlo en los parámetros, para que luego esté disponible para el template de fechas.
  • Que el template de fechas lo "renderice" un controller/action determinado, que es el que calcula la diferencia de fechas, y en los templates que hacen uso de él en lugar de hacer un include como en la primera opción, hacemos un render de esa action, con todo la sobrecarga que esto supone (se genera una subrequest, que pasa por los filtros/listener, etc).
  • Crear una extensión de twig, que podemos utilizar en cualquier template y que una vez compilado solo significa una llamada a una función php, sencillo, reutilizable y eficiente.
Reply all
Reply to author
Forward
0 new messages