Php 如何在Symfony 3表单组件中接受类似表的数据

Php 如何在Symfony 3表单组件中接受类似表的数据,php,symfony,Php,Symfony,我想使用Symfony的表单组件实现一个表单,它允许提交相关数据行。每行将包含与该行中其他字段相关的单个字段 生成的HTML看起来像 <div class="row-group"> <input type="text" name="somefield[]"/> <input type="text" name="someotherfield[]"/> <input type="text" name="somemorefield[]"/&g

我想使用Symfony的表单组件实现一个表单,它允许提交相关数据行。每行将包含与该行中其他字段相关的单个字段

生成的HTML看起来像

<div class="row-group">
   <input type="text" name="somefield[]"/>
   <input type="text" name="someotherfield[]"/>
   <input type="text" name="somemorefield[]"/>
</div>
<div class="row-group">
   <input type="text" name="somefield[]"/>
   <input type="text" name="someotherfield[]"/>
   <input type="text" name="somemorefield[]"/>
</div>

我目前的策略是创建一个与Symfony中的DateTimeType类似的自定义字段类型,然后将其倍数添加到CollectionType中

但是我注意到在提交时DateTimeType将天/月/年+时间部分连接成一个字符串,这不是我想要的


似乎应该有一种更简单的方法来实现这一点,而无需创建自定义类型

我基本上按照我在问题中所说的那样,使用从AbstractType和CollectionType扩展而来的自定义FormType解决了这个问题,结果虽然工作量不大,但这绝对不是一个直观的过程

首先,通过扩展AbstractType并指定FormType作为父级来创建自定义表单类型,这是必要的,因为我们的自定义类型将使用多个字段:

class MyCustomType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('one', TextType::class);
        $builder->add('two', TextType::class);
        $builder->add('three', TextType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {

    }

    public function getParent()
    {
        return FormType::class;
    }
}
新的自定义类型将需要一个表单片段:

{# app/Resources/views/form/fields.html.twig #}
{% block my_custom_widget %}
    {% spaceless %}
        {% for child in form %}
            <div>
                {{ form_widget(child) }}
                {{ form_label(child) }}
            </div>
        {% endfor %}
    {% endspaceless %}
{% endblock %}
最后,创建表单。您需要使用createForm()方法的第二个参数加载数据,以获得要显示的字段。如果没有初始数据,则需要修改此项以显示一个空白的MyCustomType:

(由于这个问题:)

提交的数据如下所示:

Array ( [testing] => Array ( [0] => Array ( [one] => [two] => hi123 [three] => goodbye123 ) [1] => Array ( [one] => [two] => hi [three] => goodbye ) ) )

如果您想连接数据或对数据执行其他操作,您可以使用数据转换器来实现这一点:

Toby,关于DateTimeType问题(在您的问题中,您实际上有多个问题),您可以使用

在我的一个表单中,我有一个出生日期字段,下面是一个示例:

->add('dob', null, array(
        'format' => 'dd MMM y',
        'label' => 'Birthdate:',
        'years' => range(2000,1960,1),
))

我查过MySQL,它使用
date
类型,格式是
YYYY-MM-DD
。因此,这可能对您的问题的这一部分有所帮助。

您是否打算在两个div中使用完全相同的
名称
元素?或者你的意思是
somefield1
somefield2
。。或者类似的。我有一些建议,但我只是想验证一下。谢谢@AlvinBunk,我确实打算这么做,但只是想将它们全部输入到一个数组中,但我已经设法找到了一个解决方案,它遵循了Symfony使用自定义FormType和CollectionType组合生成的name=“form[field][0][field\u fragment]”结构。到目前为止,我将发布我的解决方案。
Array ( [testing] => Array ( [0] => Array ( [one] => [two] => hi123 [three] => goodbye123 ) [1] => Array ( [one] => [two] => hi [three] => goodbye ) ) )
->add('dob', null, array(
        'format' => 'dd MMM y',
        'label' => 'Birthdate:',
        'years' => range(2000,1960,1),
))