如何将Twig表达式作为参数传递给模板,然后使用模板的上下文执行它?

时间:2015-02-10 13:28:34

标签: symfony templates twig

我定义了一个为我的表单构建选择下拉输入的模板:

<p id="{{key | ucfirst}}">
    <span>{{label}} : </span>
    <select required disabled>
        {% for d in data %}
            <option value="{{attribute(d, optionValue)}}" {{(attribute(d, optionValue) == selectedValue)?'selected'}}>{{attribute(d, optionIntitule)}}</option>
        {% endfor %}
    </select>
    <span><em>{{initialValue | default("")}}</em></span>
</p>

然后我只需要包含它,并传递一些数据:

{% include 'selectForm.twig' with {'label': 'Manager'
                                            , 'key': context.manager.id
                                            , 'initialValue': projet.manager.username
                                            , 'data': users
                                            , 'keyValue': 'id'
                                            , 'keyIntitule': 'username'
                                            , 'selectedValue': projet.manager.id) } 
%}

它工作正常,但我想做更多。例如,我想向最终用户展示一个对选项标签更有用的值:<option>Username (email)</option>而不是<option>Username</option>

所以我认为我不能再使用attribute功能了。 我想我可以将an expression传递给我的模板,如下所示:

{% include 'selectForm.twig' with {..., 'keyIntitule': "#{d.username (d.email)}"} %}

但表达式是用直接上下文来评估的,而不是模板的上下文。所以它不起作用。

I also tried with template_from_string但我没有成功(我之前从未使用过这个功能......)

有没有办法将表达式传递给另一个模板,并让它用它自己的上下文来评估表达式?

3 个答案:

答案 0 :(得分:1)

如果您想阻止直接上下文,可以使用include function代替include tag。然后你可以用这种方式禁用上下文(例子来自文档):

{# only the foo variable will be accessible #}
{{ include('template.html', {foo: 'bar'}, with_context = false) }}

答案 1 :(得分:1)

我找到了Twig的template_from_string功能解决方案:

{% include 'selectForm.twig' with {..., 'keyIntitule': template_from_string("{{d.username}} ({{d.email}})")} %}

然后我使用keyIntitule变量作为模板:

<option value="{{attribute(d, optionValue)}}">{% include(keyIntitule) %}</option>

也适用于:

<option value="{{attribute(d, optionValue)}}">{{ include(keyIntitule) }}</option>

答案 2 :(得分:0)

如果使用对象,可以将keyIntitule设置为uniqueName,并在用户实体中定义新方法:

public function getUniqueName()
{
    return sprintf('%s (%s)', $this->getUsername(), $this->getEmail());
}

Twig会调用相应的getter方法。在这种情况下,uniqueName会转换为getUniqueName()