我定义了一个为我的表单构建选择下拉输入的模板:
<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
但我没有成功(我之前从未使用过这个功能......)
有没有办法将表达式传递给另一个模板,并让它用它自己的上下文来评估表达式?
答案 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()