2013-01-23 46 views
11

Tôi có một loạt các biến mà tôi muốn hiển thị trong mẫu Twig và mỗi biến có thể là chuỗi hoặc ngày.Kiểm tra xem biến có phải là ngày có Twig

Nếu biến là một ngày, tôi muốn áp dụng bộ lọc date như thế này:

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

Và nếu đó là một chuỗi Tôi muốn nó hiển thị nó theo cách thông thường:

{{ my_var }} 

Có cách nào để kiểm tra nếu một biến là một ngày (ví dụ: một thể hiện của đối tượng DateTime PHP)?

+0

vấn đề liên quan đến github: [Xem xét kiểm tra instanceof] (https://github.com/fabpot/Twig/issues/553) –

+0

@DanLee Cảm ơn, điều đó thật thú vị nhưng tôi hiểu tại sao PR đã bị đóng mà không bị hợp nhất vì điều này sẽ giống như một loại hỗn hợp giữa PHP và Twig. –

+0

Có thực sự, nó không thực sự là doanh nghiệp của quan điểm. Nghĩ rằng nó có thể hữu ích nếu bạn thực sự muốn thực hiện toán tử 'instanceof'. –

Trả lời

25

Có lẽ không phải là cách tốt nhất để làm điều đó, nhưng tôi đã tìm ra giải pháp cho vấn đề của mình.

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

Là một đối tượng PHP DateTimegetTimestamp phương pháp nào, đó là một cách để kiểm tra xem biến là một ngày dù tài sản này được thiết lập hay không.

+0

+1 Tôi muốn nói rằng đó là một cách hoàn toàn tốt để làm điều đó, bạn sẽ cần một số loại tuyên bố có điều kiện một nơi nào đó trừ khi bạn muốn tạo một phần mở rộng twig – Prisoner

+0

Bạn có thể thử gọi 'date()' như: 'date (my_var)? my_var | date ('d/m/Y'): my_var'. – cheesemacfly

+3

Phần 'được định nghĩa' được gọi là [Test] (http://twig.sensiolabs.org/doc/templates.html#test-operator) trong Twig. Có lẽ bạn có thể [thêm của riêng bạn] (http://twig.sensiolabs.org/doc/advanced.html#tests) được gọi là 'a_date', và làm một cái gì đó như' {% if my_var là a_date%} ... '? – RikkusRukkus

4

Giải pháp của Michael hoạt động trong hầu hết các trường hợp, nhưng có một số trường hợp đặc biệt bạn nên cân nhắc khi muốn có giải pháp chung.

Đầu tiên, một đối tượng mà bạn thử nghiệm để có phương thức getTimestamp() không phải là một phiên bản DateTime. Tôi có thể điều của nhiều trường hợp khi lĩnh vực dấu thời gian sẽ hữu ích trong một đối tượng, vì vậy tôi sẽ thử nghiệm phương pháp getTimezone() để thay thế.

Thứ hai, nếu my_var là một đối tượng có phương pháp ma thuật __call được xác định, thì tất cả các thử nghiệm như vậy sẽ có kết quả dương. Đó là lý do tại sao tôi đề nghị kiểm tra tiêu cực sau:

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

Trường hợp thứ hai là trường hợp thứ hai tôi gặp khó khăn vì sử dụng các đối tượng Propel ORM. Lớp cơ sở có phương thức __call bắt tất cả các bài kiểm tra của Twig is defined.

Các vấn đề liên quan