【问题标题】:Add a different HTML attribute to each option in a Symfony choice field为 Symfony 选择字段中的每个选项添加不同的 HTML 属性
【发布时间】:2013-09-23 09:41:04
【问题描述】:

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

【问题讨论】:

    标签: php symfony checkbox symfony-forms


    【解决方案1】:

    在较新的 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),
            ];
        },
    ));
    

    【讨论】:

      【解决方案2】:

      所以我的一位同事对此有一个解决方案。这并不理想,但我们通过在 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) }}
      

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

      【讨论】:

        猜你喜欢
        • 2015-04-24
        • 2023-03-17
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多