Проверьте, является ли переменная датой с помощью Twig
У меня есть массив переменных, которые я хочу отобразить в шаблоне ветки, и каждая переменная может быть либо строкой, либо датой.
Если переменная является датой, я хочу применить фильтр date
следующим образом:
{{ my_var|date('d/m/Y') }}
И если это строка, я хочу, чтобы она отображалась обычным способом:
{{ my_var }}
Есть ли способ проверить, является ли переменная датой (т. Е. экземпляр объекта PHP DateTime)?
3 answers
Возможно, это не лучший способ сделать это, но я нашел решение своей проблемы.
{% if my_var.timestamp is defined %}
{{ my_var|date('m/d/Y') }}
{% else %}
{{ my_var }}
{% endif %}
Поскольку объект PHP DateTime
имеет открытый метод getTimestamp
, это способ проверить, является ли переменная датой, независимо от того, установлено это свойство или нет.
Решение Майкла работает в большинстве случаев, но есть некоторые особые случаи, которые вам следует учитывать, когда вы хотите иметь универсальное решение.
Во-первых, объект, который вы проверяете на наличие метода 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
.
Вы могли бы добавить функцию 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 %}