【问题标题】:CollectionType with mixed entry_type具有混合 entry_type 的 CollectionType
【发布时间】:2019-09-23 13:07:59
【问题描述】:

在 Symfony 3 / PHP 7 中,我需要一个接受混合类型(字符串、整数和数组)数组的表单。 CollectionType 的“entry_type”参数只接受一个唯一的类型。我怎样才能有一个混合类型?

$builder
     ->add('value', CollectionType::class, array(
         'entry_type' => ?,
         'allow_add' => true,
         'allow_delete' => true,
     ));

【问题讨论】:

  • 您可以使用简单的TextType,但是……您的用户将如何在您的集合中输入数组?可能您应该使用转换...
  • 用户从前端向我发送一个带有“随机”键/值的数组。任何帮助我的转换示例?
  • 他/她如何发送? html文本输入元素中的“随机”键/值?一个变压器的例子是这个symfony.com/doc/current/form/data_transformers.html

标签: php arrays forms symfony arraycollection


【解决方案1】:

您可以使用嵌入表单。在您的自定义表单类型中,您可以根据需要定义多个输入字段,然后在 CollectionType 中使用它。

// src/Form/TagType.php
namespace App\Form;

use App\Entity\Tag;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class TagType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('string_field')
            ->add('int_field')
            ->add('whatever_field');
    }
}

像这样使用 in 作为 entry_type:

 use App\Form\TagType;

 // ...
 $builder
      ->add('multiple_fields_collection', CollectionType::class, [
          'entry_type' => TagType::class,
          'allow_add' => true,
          'allow_delete' => true,
      ]);

更多信息: https://symfony.com/doc/current/form/form_collections.html

【讨论】:

  • 感谢您的回复。我不能使用带有定义字段的表单,因为我不知道这个数组中会有什么。
  • 我认为你混淆了 'entry_type' 选项的作用。它没有定义如何转换数据。它定义了一个类,描述应该如何威胁值以及应该呈现什么。对于您的需要,您只需要一个 TextType 并且转换应该由您自己在控制器中完成或封装在您自己的类中。但这不是 Symfony 或 Symfony 表单的工作。 $builder->add('field', TextType::class)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
相关资源
最近更新 更多