2013-03-07 13 views
5

obrazowanie, że mam cel i która może zostać wywołana w szablonie gałązka tak:gałązka przekonwertować ciąg do obiektu, który reprezentować

{{ object1.object2.object3.property3A }} 

dobrze, to pokaże mi treść jeśli używamy php napisać to:

$object1->getObject2()->getObject3()->getProperty3A(); 

Moje pytanie brzmi, czy mam ciąg,

$refString="object1.object2.object3.property3A"; 

a następnie jest on przekazywany do gałązka, jak coul d dostaję właściwość3A? Dla mojego doświadczenia możemy to zrobić w php w ten sposób:

$refString="object1->getObject2()->getObject3()->getProperty3A()"; 
echo $$refString; 

Ale nie wiem jak sprawić, by działało w gałązce.

+0

może być możliwe za pomocą atrybutu: http://twig.sensiolabs.org/doc/functions/attribute.html, ale nie wiesz, jak zachowuje się w przypadku wielu połączeń, takich jak twoje, może być konieczne rozdzielenie kropki, a następnie wywołanie rekursywne. – catchamonkey

+0

tak, próbowałem atrybut, jeśli masz właściwość 1A, to jest łatwe. ale atrybut funkcji nie będzie działał dla mnogiego poziomu. – ferdinandfly

+0

Stąd rekurencja, którą musisz zrobić sam, rozdzieliła sznur na pierwszą kropkę, a jeśli pozostała prawa część ma kropkę, ponownie powróć, w przeciwnym razie zwróć atrybut za pomocą lewej strony kropki, a w ostatniej pętli. – catchamonkey

Odpowiedz

1

Nie testowałem tego, ale myślę, że to załatwi sprawę.

{# 
    recursively reading attributes from an object 
    ! object1 must be available ! 
    theValue is the value of property3A 
#} 
{% for key in "object1.object2.object3.property3A"|split('.') %} 
    {% if not loop.first %}{# skip the 'object1' part #} 
    {% set theValue = attribute(theValue|default(object1), key) %} 
    {% endif %} 
{% endfor %} 
0

Nie sądzę, że istnieje "skrót" do zrobienia tego w gałązce. Jeśli nie możesz znaleźć prostego sposobu, aby to zrobić, możesz napisać własne rozszerzenie, które przekonwertuje STRING_TYPE na VAR_TYPE.

Twig internals może postawić cię na dobrej drodze. This to przykład tego, co jest możliwe z rozszerzeniem gałązki i może Cię zainspirować.

0

Wpadłem na podobną sytuację. Ta odpowiedź będzie działać tylko wtedy, gdy wymagany obiekt jest dostępny dla szablonu i znasz jego nazwę z ciągiem znaków.

W tym przypadku, można uzyskać dostęp do obiektu za pomocą gałązka w zmiennej globalnej _context:

{% set object1 = _context['object1'] %} 

A następnie uzyskać dostęp do metod i zmiennych obiektu jak normalny:

{{ object1.object2.object3.property3A }} 
Powiązane problemy