2013-01-23 2 views
11

Twig 템플릿에 표시 할 변수 배열이 있으며 각 변수는 문자열 또는 날짜가 될 수 있습니다. 변수가 날짜 인 경우변수가 Twig가있는 날짜인지 확인합니다.

는,이 같은 date 필터를 적용하려면 :

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

를 그리고이 문자열 인 경우에 나는 그것을 일반적인 방법으로 표시 할 :

{{ my_var }} 

을 변수가 날짜 (즉, PHP DateTime 객체의 인스턴스)인지 테스트 할 수있는 방법이 있습니까?

+0

github의 관련 문제 : [instanceof 테스트 고려] (https://github.com/fabpot/Twig/issues/553) –

+0

@ DanLee 감사합니다. 흥미 롭습니다.하지만 왜 PR가 병합되지 않고 닫혔는지 이해합니다. 이것은 PHP와 Twig 사이의 일종의 혼합처럼 보일 것입니다. –

+0

네, 정말로보기의 사업이 아닙니다. 'instanceof' 연산자를 구현하고 싶다면 도움이 될 것이라고 생각했습니다. –

답변

25

어쩌면 최선의 방법은 아니지만 제 문제에 대한 해결책을 찾았습니다. DateTime PHP 객체가 공공 getTimestamp 방법이 있기 때문에

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

, 그것은 변수가이 속성이 설정 여부 날짜가 있는지 확인하는 방법입니다.

+0

+1 나뭇 가지 확장을 만들고 싶지 않으면 어떤 종류의 조건문이 필요할 것입니다. – Prisoner

+0

다음과 같이'date() '를 호출 할 수 있습니다 : date (my_var)? my_var | 날짜 ('d/m/Y') : my_var'. – cheesemacfly

+3

'정의 됨'부분은 Twig에서 [Test] (http://twig.sensiolabs.org/doc/templates.html#test-operator)라고합니다. 아마도'a_date'라고 불리는 (자신의) http://twig.sensiolabs.org/doc/advanced.html#tests를 추가 할 수 있고'{% if my_var is a_date %} ... '와 같은 일을 할 수 있습니까? – RikkusRukkus

4

대부분의 경우 마이클 솔루션이 작동하지만 보편적 인 솔루션을 원할 때 고려해야 할 특별한 경우가 있습니다.

먼저 getTimestamp() 메서드를 사용하여 테스트 할 개체가 DateTime 인스턴스 일 필요는 없습니다. 타임 스탬프 필드가 객체에서 유용 할 때가 많아서 getTimezone() 메소드를 대신 테스트 할 수 있습니다.

둘째로, my_var이 마법 __call 메서드가 정의 된 개체 인 경우 모든 그러한 테스트는 양성으로 나타납니다. 그래서 다음과 같은 부정적인 테스트를 제안합니다 :

두 번째 사례는 Propel ORM 개체를 사용하여 최근에 어려움을 겪은 사례입니다. 기본 클래스에는 모든 Twig is defined 테스트를 포착하는 __call 메서드가 있습니다.

관련 문제