1

我想制作一个 Symfony2 Form 选择列表(复选框),但我希望这些选择中的每一个都具有不同的属性,例如:

<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 Form 文档,但看起来您只能将自定义属性添加到整个选择字段,而不是单个选项。
有谁知道这是否可能不创建自定义字段类型或视图?

4

2 回答 2

2

在较新的 Symfony 版本中(我认为自 2.7 起)有一个名为choice_attr的新选项可以满足您的需要

文档中的示例:

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),
        ];
    },
));
于 2017-06-27T09:02:17.720 回答
0

所以我的一个同事有一个解决方案。这并不理想,但我们通过在 twig 模板中创建一个宏来解决这个问题,如下所示:

{% 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) }}

显然,您需要调整逻辑,并可能根据要注入的值传入不同的变量,但基本逻辑在这里。循环遍历每个选项并为其赋予一个属性。值得注意的是,宏独立于模板的其余部分存在,就像常规函数一样。

于 2013-10-08T08:56:59.640 回答