为Symfony选项字段中的每个选项添加不同的HTML属性

时间:2013-09-18 14:48:09

标签: php symfony checkbox symfony-forms

我想制作一个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表单文档,但看起来您只能将自定义属性作为一个整体添加到选择字段中,而不是单个选项。
有没有人知道如果没有创建自定义字段类型或视图这是否可行?

2 个答案:

答案 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) }}

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