2012-12-04 2 views
8

Sto tentando di utilizzare una variabile per chiamare un nome di macro specifico.Utilizzo della variabile ramoscello per chiamare dinamicamente una sottofunzione macro importata

Ho un file macro che viene importato

{% import 'form-elements.html.twig' as forms %} 

Ora in quel file ci sono tutti i macro elementi modulo: il testo, textarea, selezionare, radio, ecc

Ho una variabile di matrice in cui sono presenti elementi:

$elements = array(
    array(
     'type'=>'text, 
     'value'=>'some value', 
     'atts'=>null, 
    ), 
    array(
     'type'=>'text, 
     'value'=>'some other value', 
     'atts'=>null, 
    ), 
); 

{{ elements }} 

quello che sto cercando di fare è generare quegli elementi dalle macro. funzionano bene quando chiamato per nome:

{{ forms.text(element.0.name,element.0.value,element.0.atts) }} 

Tuttavia quello che voglio fare è qualcosa di simile:

{% for element in elements %} 
{{ forms[element.type](element.name,element.value,element.atts) }} 
{% endfor %} 

Ho provato quanto segue tutto con conseguente lo stesso errore:

{{ forms["'"..element.type.."'"](element.name,element.value,element.atts) }} 
{{ forms.(element.type)(element.name,element.value,element.atts) }} 
{{ forms.{element.type}(element.name,element.value,element.atts) }} 

Questo getta, purtroppo, il seguente errore:

Fatal error: Uncaught exception 'LogicException' with message 'Attribute "value" does not exist for Node "Twig_Node_Expression_GetAttr".' in Twig\Environment.php on line 541 

Qualsiasi aiuto o consiglio su una soluzione o uno schema migliore da usare sarebbe molto utile.

risposta

15

Ho solo pensato che altre persone potrebbero voler la risposta a questa, come fornire da fabpot:

This is indeed something that is not supported: calling a macro with a dynamic name (I have added a proper exception to be clearer about the issue).

If you really want to do that, you can do so with the following code:

{{ attribute(forms, element.type, [element.name,element.value,element.atts]) }}

-fabpot

https://github.com/twigphp/Twig/issues/922#issuecomment-11133299

+1

In Twig 2, questo non è più una soluzione :(da quanto ho capito, per l'attributo dei motivi di sicurezza non può accedere ai modelli. – notacouch