【问题标题】:Symfony2 - Creating fieldsetsSymfony2 - 创建字段集
【发布时间】:2013-09-03 10:27:00
【问题描述】:

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

fieldset.html.twig

{% form_theme form _self %}
{% block form_row %}
    <fieldset>
        <legend></legend>
        {{ form_row(form) }}
    </fieldset>
{% endblock %}

FieldsetType.php

class FieldsetType extends AbstractType
{
    public function __construct($tituloFieldset="")
    {
        $this->titulo = $tituloFieldset;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'attr' => array(
                'title'=>$this->titulo
            ),
           'mapped'=>false
        ));
    }

    public function getParent()
    {
        return 'form';
    }

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

    private $titulo;
}

当前使用情况

$builder->add('nestedform', new FieldsetType('legend'));

我已经尝试了所有方法:将标题添加为标签(一个没有字段呈现的额外标签)、模板化整个表单(在这种情况下我无法添加额外的字段集)等等。

我该怎么办?

【问题讨论】:

    标签: php forms symfony fieldset


    【解决方案1】:

    我已将此功能提取到一个包中,因为我在一些项目中需要它https://github.com/adamquaile/AdamQuaileFieldsetBundle

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

    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'] 混淆。也许我们应该将其命名为 options 或其他名称。
    • 是的,你是对的@Pierre。对此一直存在一些困惑。我也许 child_attrs 以保持 attr 的名义。你怎么看?
    • 它不能工作,因为 Symfony 会期望attr 用于 HTML 属性。您必须更改父名称
    【解决方案2】:

    你在正确的轨道上。你可以在这里找到一个简单的例子:https://gist.github.com/spcmky/8512371

    【讨论】:

    • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(与另一个中途停留的参考相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多