2012-12-14 16 views
32

Czy można sprawdzić, czy podana zmienna jest łańcuchem w Twig?Sprawdź, czy zmienna jest łańcuchem lub tablicą w Twig

Oczekiwane rozwiązanie:

messages.en.yml:

hello: 
    stranger: Hello stranger ! 
    known: Hello %name% ! 

Twig szablon:

{% set title='hello.stranger' %} 
{% set title=['hello.known',{'%name%' : 'hsz'}] %} 

{% if title is string %} 
    {{ title|trans }} 
{% else %} 
    {{ title[0]|trans(title[1]) }} 
{% endif %} 

Czy to możliwe, aby zrobić to w ten sposób? A może masz lepsze rozwiązanie?

+2

Możesz być może coś zrobić z 'iterable' testu? http://twig.sensiolabs.org/doc/tests/iterable.html –

Odpowiedz

86

można zrobić z testu iterable, dodane w twig1.7, jak Wouter J stwierdził w komentarzu:

{# evaluates to true if the foo variable is iterable #} 
{% if users is iterable %} 
    {% for user in users %} 
     Hello {{ user }}! 
    {% endfor %} 
{% else %} 
    {# users is probably a string #} 
    Hello {{ users }}! 
{% endif %} 

referencyjny: iterable

+1

Uwaga: inne obiekty mogą również być "iterowalne", nawet jeśli nie są 'tablica'. Iterable nie jest prawdziwym testem, jeśli coś jest tablicą. Mam odpowiedź, jak zrobić test tablicowy jak "{% if value is array%}" poniżej. http://stackoverflow.com/a/29642662/417822 –

9

Ok, zrobiłem to z:

{% if title[0] is not defined %} 
    {{ title|trans }} 
{% else %} 
    {{ title[0]|trans(title[1]) }} 
{% endif %} 

brzydki, ale działa.

+7

Nie będzie działać, jeśli tablica nie ma nic w '[0]' indeksie –

7

znalazłem iterable nie być wystarczająco dobre, ponieważ inne obiekty mogą być również iterowalne i są wyraźnie inne niż array.

Dlatego należy dodać nowy Twig_SimpleTest, aby sprawdzić, czy pozycja is_array jest znacznie bardziej jednoznaczna. Możesz dodać to do konfiguracji swojej aplikacji/po uruchomieniu gałązki.

$isArray= new Twig_SimpleTest('array', function ($value) { 
    return is_array($value); 
}); 
$twig->addTest($isArray); 

Wykorzystanie staje się bardzo czysty:

{% if value is array %} 
    <!-- handle array --> 
{% else %} 
    <!-- handle non-array --> 
{% endif % } 
+0

Oto tutaj: Ten test zwróci wartość false dla każdego niestandardowego obiektu implementującego ArrayAcces, Traverseable, ... – DarkBee

+0

W porządku, ale głównym problemem jest to, że nie wszystkie elementy 'iterable' są równe. Struktura 'iterable' może wyglądać inaczej w zależności od typu. –

+0

Gdzie ten plik klasy powinien zostać umieszczony w Symfony2? – Aerendir

Powiązane problemy