2012-12-04 14 views
8

変数を使用して特定のマクロ名を呼び出そうとしています。twig変数を使用して、インポートされたマクロサブ関数を動的に呼び出す

私は

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

をインポートされているマクロファイルは今、そのファイル内のすべてのフォーム要素のマクロがありますしている:テキスト、テキストエリア、選択、ラジオなど

私は、配列変数を持っていますそれには要素が含まれています:

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

{{ elements }} 

私がしようとしているのは、これらの要素をマクロから生成することです。

{{ 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) }} 
:私は、次のすべてに同じエラーが発生しようとしている

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

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

しかし、私が何をしたいのか、このようなものである:名前で呼ばれたとき、彼らはうまく動作します

これは、残念ながら、次のエラーがスローされます:

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 

解決策またはより良いスキーマを使用するための助言やアドバイスは非常に役に立ちます。

答えて

15

私はちょうどfabpotによって提供として、他の人は、この答えをすることが考えられません:小枝2では

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

、これはもはや解決策:(私が理解から、ためにありますセキュリティ理由属性はテンプレートにアクセスできません。 – notacouch

関連する問題