如何将数组(可自定义)添加到symfony2表单(带奏鸣曲管理员)?

时间:2016-10-14 15:28:09

标签: php symfony sonata-admin

我有一个简单的形式与索纳塔管理员。

我希望用户可以添加一个整数列表(尽可能多)。之后它将作为一个数组存储在我的对象中:

[1,2,3,6,9]

有没有办法在不创建另一个类的情况下实例化整数?

更新

我知道如何关闭的唯一方法是使用以下选项:

 ->add('type', 'choice', [
                "required"           => true,
                "expanded"           => true,
                "multiple"           => false,
                "choices"            => Campanha::getTypes(),
            ])

但是由于我的选择数量有限,我希望用户可以免费添加数量和他想要的值

2 个答案:

答案 0 :(得分:4)

您需要完成的任务是Data Transformer。看一个例子:

namespace AppBundle\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class ArrayToStringTransformer implements DataTransformerInterface
{
    public function transform($array)
    {
        if (null === $array) {
            $array = array();
        }

        if (!is_array($array)) {
            throw new TransformationFailedException('Expected an array.');
        }

        return implode(',', $array);
    }

    public function reverseTransform($string)
    {
        if (null === $string || '' === $string) {
            return array();
        }

        if (!is_string($string)) {
            throw new TransformationFailedException('Expected a string.');
        }

        return explode(',', $string);
    }
}

稍后,在有数组字段的地方使用它。为了获得更好的可重用性,我们create a custom field type扩展了TextType

namespace AppBundle\Form\Type;

use AppBundle\Form\DataTransformer\ArrayToStringTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;

class ArrayTextType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addModelTransformer(new ArrayToStringTransformer());
    }

    public function getParent()
    {
        return TextType::class;
    }
}

就是这样!现在,您可以使用ArrayTextType

安全地管理阵列字段
// in any controller context

public function fooAction() 
{
    $data = array(
        'tags' => array(1, 2, 3, 4, 5),
    );

    $form = $this->createFormBuilder($data)
        ->add('tags', ArrayTextType::class)
        ->getForm();

    return $this->render('default/index.html.twig', array('form' => $form->createView()));
}

我们也可以使用任何Doctrine array映射字段(即@ORM\Column(name="tags", type="array"))。

输出结果:

TagsTextTypeInput

为了更好地输入数据,我建议使用Bootstrap Tags Input jQuery插件。请参阅示例here

BootstrapTagsInput

答案 1 :(得分:1)

尝试查看sonata_type_native_collection

来自the Sonata Admin Docs

  

此捆绑包通过添加:

来处理本机Symfony集合表单类型      
      如果您将allow_add选项设置为true,则
  • 添加按钮。
  •   如果将allow_delete选项设置为true,则
  • 删除按钮。
  •   

Symfony collection form type

  

此字段类型用于呈现"集合"一些领域或形式。从最简单的意义上讲,它可能是一个TextType字段数组,用于填充数组电子邮件值。

所以,对于你的情况,可能是这样的:

->add('type', 'sonata_type_native_collection', [
    'required' => true,
    'entry_type' => 'number',
    'options' => [
        // Any options you'd like the integer fields to have.
    ]
])

(当然,这根本不能说明您需要对基础模型做出的改变。)

修改:根据@Matheus Oliveira的评论,将'entry_options'数组键更改为'options'