我想制作一个Symfony2表单选项列表(复选框),但我希望每个选项都有不同的属性,例如:
<div class="field inline">
<input type="checkbox" id="form_options_0" name="form[options][]" value="1">
<label for="form_options_0" data="1">Option 1</label>
</div>
<div class="field inline">
<input type="checkbox" id="form_options_1" name="form[options][]" value="2">
<label for="form_options_1" data="2">Option 2</label>
</div>
我尝试查看Symfony表单文档,但看起来您只能将自定义属性作为一个整体添加到选择字段中,而不是单个选项。
有没有人知道如果没有创建自定义字段类型或视图这是否可行?
答案 0 :(得分:2)
在Symfony的更新版本中(我认为自2.7以来)有一个名为choice_attr的新选项可以满足您的需求
doc:
中的示例use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
// ...
$builder->add('attending', ChoiceType::class, array(
'choices' => array(
'Yes' => true,
'No' => false,
'Maybe' => null,
),
'choice_attr' => function($val, $key, $index) {
// adds a class like attending_yes, attending_no, data-*, etc
return [
'class' => 'attending_'.strtolower($key),
];
},
));
答案 1 :(得分:0)
所以我的同事有一个解决方案。它并不理想,但我们通过在树枝模板中创建一个宏来解决这个问题:
{% macro renderOptions(options) %}
{% set length = options|length %}
{% for key in 0..(length - 1) %}
{{ form_row(options[key], {'attr': {'data': options[key].vars['value'] } })}}
{% endfor %}
{% endmacro %}
然后像这样调用它:
{{ _self.renderOptions(form.options) }}
显然,您需要调整逻辑并根据要注入的值传入不同的变量,但基本逻辑就在这里。遍历每个选项并为其提供属性。值得注意的是,宏就像常规函数一样独立于模板的其余部分存在。