我的,我想在一个枝条模板来显示一个变量数组,并且每个变量可以是字符串或日期。
如果变量是日期,我想申请的date
过滤器是这样的:
{{ my_var|date('d/m/Y') }}
而如果它是一个字符串,我希望它显示它通常的方式:
{{ my_var }}
有什么方法来测试,如果一个变量是一个日期(即PHP的DateTime对象的实例)?
我的,我想在一个枝条模板来显示一个变量数组,并且每个变量可以是字符串或日期。
如果变量是日期,我想申请的date
过滤器是这样的:
{{ my_var|date('d/m/Y') }}
而如果它是一个字符串,我希望它显示它通常的方式:
{{ my_var }}
有什么方法来测试,如果一个变量是一个日期(即PHP的DateTime对象的实例)?
也许不是最好的方式做到这一点,但我找到了解决我的问题。
{% if my_var.timestamp is defined %}
{{ my_var|date('m/d/Y') }}
{% else %}
{{ my_var }}
{% endif %}
作为DateTime
PHP对象有一个公共getTimestamp
方法,这是一个方法来检查,如果变量是此属性是否设置与否的日期。
迈克尔的解决方案可在大多数情况下,但有些时候你想有一个通用的解决方案,你应该考虑一些特殊情况。
首先,您测试对于具有物体getTimestamp()
方法不必须是一个DateTime
的实例。 我可以在许多情况下事情时,时间戳字段将是一个对象是有用的,所以我会测试getTimezone()
方法来代替。
其次,如果my_var
是具有魔对象__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
映入所有枝条方法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 %}