我通常会在研究后找到解决问题的答案,但今天情况并非如此。
假设我有 2 个实体,“任务”和“任务类别”,每个任务都有一个类别。 我想让我的用户不仅可以将现有类别归于他们的任务,还可以创建新类别。
这是我目前的代码:
<?php
// TaskCategoryType.php
class TaskCategoryType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
;
}
// Some stuff...
和
<?php
// TaskType.php
// Some stuff...
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// Add some fields there
->add(
'category',
TransformableEntityType::class,
['class' => 'AppBundle:TaskCategory']
)
->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$task = $event->getData();
$form = $event->getForm();
if (empty($task['category']['id']) && !empty($task['category']['name'])) {
$task['category']['id'] = null;
$event->setData($task);
$form->remove('category');
$form->add('category', TaskCategoryType::class);
}
})
;
}
// Some stuff...
它可以很好地创建任务,但是当我编辑现有任务时,它会编辑关联的 TaskCategory 而不是创建新任务。 我试图强制创建一个新的 TaskCategory : $task['category']['id'] = null;但它不起作用。
谢谢你的帮助,我真的卡住了:(
编辑:我忘了说我只是将此表单用作 API,这就是为什么我只有一个“类别”字段,否则我会使用另一个“category_new”字段。
最佳答案
好吧,看来我终于找到了一些可行的方法,它不是很漂亮,我对它的完成方式不太满意,但目前我还没有找到任何替代方法。 如果您有更简洁的解决方案,我将很乐意学习。
<?php
class TaskType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// Some fields...
->add(
'category',
TransformableEntityType::class,
['class' => 'AppBundle:TaskCategory']
)
->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$task = $event->getData();
$form = $event->getForm();
if (empty($task['category']['id']) && !empty($task['category']['name'])) {
// If there is no category id but there is a category
// name it means it is a new category. so replace
// the custom entity field with this simple field
$form->remove('category');
$form->add('category', TaskCategoryType::class, ['allow_extra_fields' => true]);
}
})
->addEventListener(FormEvents::SUBMIT, function (FormEvent $event) {
$catForm = $event->getForm()->get('category');
if ($catForm->has('name') && $catForm->get('name')->getData() !== "") {
// If there is a category name it means
// it is a new category.
$category = new TaskCategory(); // Create new category
$category->setName($catForm->get('name')->getData());
$task = $event->getData()->setCategory($category);
$event->setData($task);
}
})
;
}
关于forms - 选择或创建实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38769412/