2013-03-07 13 views
5

di imaging che ho un oggetto e che può essere chiamato in un modello ramoscello come questo:ramoscello convertire una stringa all'oggetto che rappresentano

{{ object1.object2.object3.property3A }} 

bene, mi mostrerà il contenuto se usiamo php scrivere è:

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

la mia domanda è se ho una stringa,

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

e poi si passa alla ramoscello, come Coul ho la proprietà 3A? Per la mia esperienza, siamo in grado di farlo in php in questo modo:

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

Ma io non so come farlo funzionare in ramoscello.

+0

Potrebbe essere possibile usa attributo: http://twig.sensiolabs.org/doc/functions/attribute.html ma non sai come si comporta con più chiamate come la tua, potresti dover dividere il tuo punto, quindi chiamarlo in modo ricorsivo. – catchamonkey

+0

sì, ho provato l'attributo, se hai una proprietà 1A, è facile. ma l'attributo della funzione non funzionerà per il livello mutiple. – ferdinandfly

+0

Da qui la ricorsione, che devi fare da solo, dividi la corda a parte sul primo punto, e se la parte rimanente a destra ha un punto, ricorri di nuovo, altrimenti, restituisci l'attributo usando il lato sinistro del punto, e proprio nell'ultimo ciclo. – catchamonkey

risposta

1

Non l'ho provato, ma penso che sia il trucco.

{# 
    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

Non penso che ci sia una "scorciatoia" per farlo in ramoscello. Se non riesci a trovare un modo semplice per farlo, puoi scrivere la tua estensione, che converte un STRING_TYPE in un VAR_TYPE.

Twig internals potrebbe metterti sulla giusta strada. This è un esempio di cosa è fattibile con l'estensione twig e potrebbe ispirarti.

0

Mi sono imbattuto in una situazione simile. Questa risposta funzionerà solo se l'oggetto di cui hai bisogno è disponibile per il modello e ne conosci il nome con una stringa.

In questo caso, è possibile accedere all'oggetto utilizzando variabile globale di Twig _context:

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

E poi accedere ai metodi e le variabili dell'oggetto come normale:

{{ object1.object2.object3.property3A }}