Symfony表单 - 自动将固定数量的子项添加到集合中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Symfony表单 - 自动将固定数量的子项添加到集合中相关的知识,希望对你有一定的参考价值。

我想在创建父实体时构建一个包含固定数量子节点的集合的表单。它不应该允许添加更多的孩子。在编辑时,它应该自动获取子项,不允许添加更多子项。

使用下面的代码,表单将呈现,但不会显示任何收集子项。

家长表格:

$builder->add('items', CollectionType::class, ['entry_type' => ItemFormType::class]);

ItemFormType:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
        ->add('sujet', TextareaType::class)
        ->add('corrige', TextareaType::class)
        ->add('vrai', CheckboxType::class)
    ;

        $builder
            ->add('annule', CheckboxType::class);
}

public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults([
        'data_class' => Item::class
    ]);
}

树枝:

{% for item in form.items %}
    {% set nomItem = 'Item'~loop.index %}
    {{ nomItem }}
   {{ form_row(item.vrai) }}
   {{ form_row(item.annule) }}
   {{ form_row(item.sujet) }}
   {{ form_row(item.corrige) }}
{% endfor %}

项目(子)实体:

class Item
{
/**
 * @var integer
 *
 * @ORMColumn(name="id", type="integer")
 * @ORMId
 * @ORMGeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORMManyToOne(targetEntity="QC", inversedBy="items", cascade={"persist"})
 * @ORMJoinColumn(name="qc_id", referencedColumnName="id")
 */
protected $qc;

/**
 * @var string
 *
 * @ORMColumn(name="sujet", type="text")
 */
private $sujet;

/**
 * @var string
 *
 * @ORMColumn(name="corrige", type="text", nullable=true)
 */
private $corrige;

/**
 * @var boolean
 *
 * @ORMColumn(name="vrai", type="boolean")
 **/
private $vrai;

/**
 * @var boolean
 *
 * @ORMColumn(name="annule", type="boolean")
 **/
private $annule;

/**
 * @var integer
 * @ORMColumn(name="ordre", type="integer", nullable=true)
 */
private $ordre;
}

QC(父母)实体:

class QC {
    ....
        /**
 * @var ArrayCollection
 * @ORMOneToMany(targetEntity="Item", mappedBy="qc", cascade={"all"})
 * @ORMOrderBy({"ordre" = "asc"})
 */
protected $items;

    ....
}
答案

在您的控制器中,高于规则

$form->handleRequest($request); 

将您的孩子添加到父实体。

$parent = new Parent();
for($i = 0 ; $i < 5 ; $i++) {
    $child = new Child(); // instantiate a new child entity
    $parent->addChild($child); // add this instance to the parent entity
}
/* now build your form and handle the request vars if form has been posted */
$form = $this->createForm('AppBundleFormParentType', $parent);
$form->handleRequest($request); 

这样,您可以在显示表单之前以多种方式“初始化”新实体...

另一答案

这个问题很古老,但这个答案可能仍然适用于其他人。您还可以在父类的construct中定义初始关系,如下所示:

class QC {
    ....

    /**
     * @var ArrayCollection
     * @ORMOneToMany(targetEntity="Item", mappedBy="qc", cascade={"all"})
     * @ORMOrderBy({"order" = "asc"})
     */
    protected $items;

    public function __construct()
    {
        $this->items = new ArrayCollection([
            new Item(),
            new Item(),
            new Item(),
            new Item(),
            new Item(),
            new Item()
        ]);
    }
}

您仍需要在提交时验证控制器中的关系数量。

以上是关于Symfony表单 - 自动将固定数量的子项添加到集合中的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 4 + 奏鸣曲管理包 + 关系。表单正在删除子项,但不仅是 parentId

Symfony & Sonata:如何将 javascript 添加到实体管理表单?

Symfony twig 如何将类添加到表单行

如何自动将用户对象传递给 Symfony 3 表单?

添加 CSS 到表单类型是 Symfony2

向 Symfony 2 表单元素添加错误