创建子表单并将其以现有形式附加到symfony 3中

法比恩·帕佩(Fabien Papet)

我有这个配置:

ModuleModelType
| - title
| - created
| - subform
| - DevField1 
| - DevField2 
| - etc... 

我想要的是这样的:

ModuleModelType
| - title
| - created
| - subform
|   | - DevField1 
|   | - DevField2 
|   | - etc... 

但是问题是我不知道要向表单中添加哪些用户,因为我正在创建可重用的包,并且我不希望名称冲突。

这是我的代码,如何使它容易实现?我希望开发人员可以创建一个类并将其自己的表单添加到现有表单中。以下现有代码将开发人员的表单添加到第一个表单中,并且如果密钥相同,则可以替换一些现有密钥。实际上,我想将所有开发人员的字段都添加到其中并subform避免这种情况。

<?php
// Into a controller
/** @var ModuleInterface $instance */
$instance = ... ;
$form = $this->createForm(ModuleModelType::class);
$subform= $this->createForm(new FormType());
$instance->buildForm($subform);
$form->add('subform',$subform); // I want to make something like that

interface ModuleInterface
{
    public function buildForm(Form &$form);
}

class Foo implements ModuleInterface
{
    public function buildForm(Form &$builder)
    {
        $builder->add("DevField1", /* type */);
        $builder->add("DevField2", /* type */);
    }
}

class ModuleModelType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('created')
            ->add('subform')
        ;
    }
}
Nainterceptor

我们将假设一些事实:

  • 您想要一个带有“数据”字段的实体
  • 此“数据”字段必须为数组
  • 必须更改表单以处理此“数据”字段
  • 显然,在实体中,我们可以将“数据”信息加载并保存为数组

此行为可以很容易地通过构造函数传递子表单来完成。因为您要与Symfony对抗,所以您会遇到问题,请考虑以下一种标准方式:

  • 有一个具有“数组”字段类型的实体
  • 有两种形式类型:第一种用于处理您的实体,第二种用于处理嵌入的表单。
  • 使用依赖项注入来嵌入正确的表单。(按模块假设两项服务:第一项用于嵌入式表单,第二项针对您。

您的实体:(请考虑使用generate:doctrine:entities生成getter和setter)

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Foo
 *
 * @ORM\Table(name="foo")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\FooRepository")
 */
class Foo
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="some_informations", type="string", length=255)
     */
    private $someInformations;

    /**
     * @var string
     *
     * @ORM\Column(name="Data", type="string", length=255)
     */
    private $data;

    /**
     * @var string
     *
     * @ORM\Column(name="data", type="array")
     */
    private $data;

您的表格

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormTypeInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class FooType extends AbstractType
{
    protected $dataFormName;
    public function __construct($dataFormName)
    {
        $this->dataFormName = $dataFormName;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('someInformations')
            ->add('data', $this->dataFormName)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Foo'
        ));
    }
}

您的子表单

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SubformType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('content')
            ->add('some_data')
        ;
    }
}

此时,您应该可以使用以下命令生成表单:

$foo = new Foo();
$form = $this->createForm('service_name_for_the_form_with_second_embedded', $foo);

旧答案

在这种情况下,您应该假定ModuleInterface扩展了FormTypeInterface。要在$ form-> add中用作FormType,您的类应看起来像一个表单。在这一点上,使用ModuleInterface似乎是无用的。我可以用这种方式为您服务:

<?php
// Into a controller
$instance = new Foo();
$form = $this->createForm(new ModuleModelType($instance));

class Foo extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add("DevField1");
        $builder->add("DevField2");
    }
}

class ModuleModelType extends AbstractType
{
    protected $subform;
    function __construct(FormTypeInterface $subform)
    {
        $this->subform = $subform;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('created')
            ->add('subform', $this->subform)
        ;
    }
}

您还可以使用依赖项注入通过__construct注入$ instance。注意“ Foo”类的命名约定,应为FooType;)

如果您执行这样的操作,那么您的预期表格就可以了。

祝你今天过得愉快,

盖尔

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在pandas数据框中写入行并将其附加到现有数据框中

无法选择列表元素并将其附加到现有的 csv 中

如何创建Turtle克隆并将其附加到列表中?

获取现有文件并将数据附加到现有文件中-U-SQL

如何添加到现有字符串并将其添加到列表中

在 PHP 中创建一个 word 文件并将其附加到邮件中

创建空的 3D numpy 数组并将其附加到每个新的给定值

在内存中创建一个ZipFile并将其附加到电子邮件

如何打开文件并将项目附加到 Python 中的现有列表

查找TreeItem并将其添加到JavaFX中的现有节点

获取特定类型的文件并将其添加到现有的zip文件中

使用 miller shell 命令为每一行创建带有值对的 HASH-ID 键并将其附加到 JSON 对象文件中

从字典中取出所有元素并将其附加到字符串

如何访问变量的值并将其附加到函数中?

如何克隆表行并将其附加到表中?

如何拦截url文件并将其附加到邮件中

Apps 脚本将数据导出到另一个电子表格,在 xlsx 中构建它并将其附加到电子邮件

通过附加到golang中的现有切片来创建新切片

如何在运行时在Delphi中创建自定义属性并将其附加到字段

用gropuby计算熊猫数据框中的元素并将它们附加到现有数据框中

jQuery-创建新元素并将其附加到现有元素

需要创建一个解码器,该解码器从父级别的数据中创建一条记录,并将其附加到elm中的所有子记录中

有没有办法添加一定数量的列表,并将其附加到列表中?

将两列中的数据相乘并将其添加到现有的第三列中

将 HTML 附加到 d3 中的现有工具提示

无法使用 python 将数据附加到 AWS S3 中的现有 csv 文件

在 .aiml 文件中获取所有用户的输入 (<pattern>input</pattern>) 并将其附加到列表中

从txt文件中提取一些文本并将其添加到现有文件中

是否有更快的方法来获取基于线性回归模型的值并将其附加到 DataFrame 中的新列?