Проверьте, является ли переменная датой с помощью Twig


У меня есть массив переменных, которые я хочу отобразить в шаблоне ветки, и каждая переменная может быть либо строкой, либо датой.

Если переменная является датой, я хочу применить фильтр date следующим образом:

{{ my_var|date('d/m/Y') }}

И если это строка, я хочу, чтобы она отображалась обычным способом:

{{ my_var }}

Есть ли способ проверить, является ли переменная датой (т. Е. экземпляр объекта PHP DateTime)?

 11
Author: Michaël Perrin, 2013-01-23

3 answers

Возможно, это не лучший способ сделать это, но я нашел решение своей проблемы.

{% if my_var.timestamp is defined %}
    {{ my_var|date('m/d/Y') }}
{% else %}
    {{ my_var }}
{% endif %}

Поскольку объект PHP DateTime имеет открытый метод getTimestamp, это способ проверить, является ли переменная датой, независимо от того, установлено это свойство или нет.

 25
Author: Michaël Perrin, 2013-01-23 14:42:45

Решение Майкла работает в большинстве случаев, но есть некоторые особые случаи, которые вам следует учитывать, когда вы хотите иметь универсальное решение.

Во-первых, объект, который вы проверяете на наличие метода getTimestamp(), не обязательно должен быть экземпляром DateTime. Я могу вспомнить много случаев, когда поле метки времени было бы полезно в объекте, поэтому вместо этого я бы протестировал метод getTimezone().

Во-вторых, если my_var является объектом, имеющим определенный метод magic __call, то все такие тесты окажутся положительный. Вот почему я предлагаю следующий отрицательный тест:

{% if my_var.timezone is defined and my_var.nonExistingProperty is not defined %}
    {{ my_var|date('m/d/Y') }}
{% else %}
    {{ my_var }}
{% endif %}

Второй случай был тем, с которым я недавно столкнулся из-за использования объектов Propel ORM. Базовый класс имеет метод __call, который перехватывает все тесты Twig is defined.

 5
Author: Jacor, 2014-02-21 17:51:37

Вы могли бы добавить функцию class(my_var), например:

// src/AppBundle/Twig/HelperExtension.php

namespace AppBundle\Twig;

use Twig_Extension;
use Twig_SimpleFunction;

class HelperExtension extends Twig_Extension
{
    public function getFunctions()
    {
        return array(
            new Twig_SimpleFunction('class', array($this, 'getClassName')),
        );
    }

    public function getClassName($object)
    {
        if (!is_object($object)) {
            return null;
        }
        return get_class($object);
    }
}

Использование:

{% if class(my_var) == 'DateTime' %}
    ...
{% endif %}
 0
Author: rybo111, 2018-06-06 13:39:25