代码之家  ›  专栏  ›  技术社区  ›  dhh

在Symfony FormBuilder中添加类以选择选项

  •  5
  • dhh  · 技术社区  · 9 年前

    在我的Symfony 2应用程序中,我使用 FormBuilder 创建用于选择生成文档中包含的数据的表单。

    $typeChoices = [
        '001' => 'first factor',
        '002' => 'another factor',
        '003' => 'some surcharge',
        '004' => 'custom discount',
        '005' => 'another surcharge'
    ];
    
    $formDownload = $this->createFormBuilder(array())
        ->add('category', 'entity', array(
            'class' => 'MyApp\CategoryBundle\Entity\Category',
            'choice_label' => 'name'
        ))
        ->add('type', 'choice', array(
            'choices' => $typeChoices,
            'multiple' => true
        ))
        ->add('download', 'submit', array(
            'attr' => array(
                'class' => 'btn-primary'
            ),
        ))
        ->setAction($this->generateUrl('myapp_data_download'))
        ->getForm();
    

    这个 $typeChoices 数据是从 EntityRepository -我只是简化了这个演示的代码。

    这样,将生成如下选择框:

    <select multiple="multiple" class="form-control" required="required" name="form[type][]" id="form_type">
        <option value="001">first factor</option>
        <option value="002">another factor</option>
        <option value="003">some surcharge</option>
        <option value="004">custom discount</option>
        <option value="005">another surcharge</option>
    </select>
    

    如何添加 class 每个的属性 option ? 必须基于来自 实体存储库 。到目前为止,我无法添加 属性 选项 使用 表单生成器 我希望避免手动创建表单标记。

    2 回复  |  直到 9 年前
        1
  •  3
  •   zilongqiu    9 年前

    Symfony 2.7中的新功能: Choice form type refactorization

    在Symfony 2.7中,此表单类型已完全重构为 支持标签、值、索引和属性的动态生成。 由于新选项choice_ label, 选择名称 , 选择值 , 选择属性 , 分组依据(_B) choices_as值 .

    例如,您可以 生成动态选择标签 .

    例子:

    $builder->add('attending', 'choice', array(
        'choices' => array(
            'yes' => true,
            'no' => false,
            'maybe' => null,
        ),
        'choices_as_values' => true,
        'choice_label' => function ($allChoices, $currentChoiceKey) {
            return 'form.choice.'.$currentChoiceKey;
        },
    ));
    

    在你的情况下,你想要 操纵属性类 每个选项的。

    例子:

    $builder->add('attending', 'choice', array(
        'choices' => array(
            'Yes' => true,
            'No' => false,
            'Maybe' => null,
        ),
        'choices_as_values' => true,
        'choice_attr' => function ($allChoices, $currentChoiceKey) {
            if (null === $currentChoiceKey) {
                return array('class' => 'text-muted');
            }
        },
    ));
    

    希望这会有所帮助。

        2
  •  1
  •   Evgeniy Budanov    9 年前

    在Form类中添加Symfony\Component\Form\AbstractType::finishView

    /**
     * @param FormView $view
     * @param FormInterface $form
     * @param array $options
     */
    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        parent::finishView($view, $form, $options);
    
        $additionalAttributes = array();
    
        // myMethod - object method $choice, returns a value that must be replaced by attribute
        foreach ($view->children['type']->vars['choices'] as $id => $choice) {
            $additionalAttributes[$id] = array(
                'class' => $this->propertyAccessor->getValue($choice->data, 'myMethod'),
            );
        }
    
        foreach ($view->children['type']->children as $id => $child) {
            $child->vars['attr'] = array_replace(
                isset($child->vars['attr']) ? $child->vars['attr'] : array(),
                $additionalAttributes[$id]
            );
        }
    }
    

    Symfony2 Form - adding an attribute to the tag option in the select type