Php Symfony2-创建字段集

Php Symfony2-创建字段集,php,forms,symfony,fieldset,Php,Forms,Symfony,Fieldset,我正在尝试创建一个基本的字段集模板。我所拥有的是: fieldset.html.twig {% form_theme form _self %} {% block form_row %} <fieldset> <legend></legend> {{ form_row(form) }} </fieldset> {% endblock %} 当前使用情况 $builder->add('neste

我正在尝试创建一个基本的字段集模板。我所拥有的是:

fieldset.html.twig

{% form_theme form _self %}
{% block form_row %}
    <fieldset>
        <legend></legend>
        {{ form_row(form) }}
    </fieldset>
{% endblock %}
当前使用情况

$builder->add('nestedform', new FieldsetType('legend'));
我已经尝试了一切:添加标题作为标签(没有字段渲染的额外标签),模板化整个表单(在这种情况下,我不能添加额外的字段集),等等


我该怎么办?

你走对了。您可以在这里找到一个简单的示例:

我已经将此功能提取到一个捆绑包中,因为我在一些项目中需要它

但基于其他一些答案和想法,这相当于:

class FieldsetType extends AbstractType {

    public function setDefaultOptions ( OptionsResolverInterface $resolver )
    {
        $resolver->setDefaults([
            'legend'    => '',
            'virtual'   => true,
            'options'   => array(),
            'fields'    => array(),
        ]);
    }

    public function buildForm ( FormBuilderInterface $builder, array $options )
    {
        if ( !empty($options['fields']) ) {

            foreach ( $options['fields'] as $field ) {
                $builder->add($field['name'], $field['type'], $field['attr']);
            }
        }
    }

    public function buildView ( FormView $view, FormInterface $form, array $options )
    {
        if (false !== $options['legend']) {
            $view->vars['legend'] = $options['legend'];
        }
    }

    public function getName()
    {
        return 'fieldset';
    }
}

请注意,不鼓励这样做,因此答案应该是搜索解决方案的终点(而不是参考文献的另一个中途停留,随着时间的推移,这些参考文献往往会过时)。请考虑在这里添加一个独立的概要,将链接作为参考。不应该混淆<代码> $field('AtTr')< /> > <代码> $field [AtTr]([AtTr])< /C>。也许我们应该把它命名为选项什么的。是的,你说得对@Pierre。在这一点上存在一些混乱。我想我应该把attr记在名字里。你认为呢?它不能像Symfony期望的那样用于HTML属性。您必须更改父级名称
class FieldsetType extends AbstractType {

    public function setDefaultOptions ( OptionsResolverInterface $resolver )
    {
        $resolver->setDefaults([
            'legend'    => '',
            'virtual'   => true,
            'options'   => array(),
            'fields'    => array(),
        ]);
    }

    public function buildForm ( FormBuilderInterface $builder, array $options )
    {
        if ( !empty($options['fields']) ) {

            foreach ( $options['fields'] as $field ) {
                $builder->add($field['name'], $field['type'], $field['attr']);
            }
        }
    }

    public function buildView ( FormView $view, FormInterface $form, array $options )
    {
        if (false !== $options['legend']) {
            $view->vars['legend'] = $options['legend'];
        }
    }

    public function getName()
    {
        return 'fieldset';
    }
}