forms - 选择或创建实体

标签 forms symfony symfony-forms

我通常会在研究后找到解决问题的答案,但今天情况并非如此。

假设我有 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/

相关文章:

javascript - 无法从 React Form 中的选择组件取回提交的数据

php - Symfony - twig - 自动加载器预期类

forms - Symfony2 : 1 form to edit a translatable entity

php - 在 twig symfony 中显示所有表单错误

forms - Symfony2 选择形式 split 成 Twig

forms - Symfony2 验证组和映射

html - 在 HTML5 中,<form> 元素是像 <section> 一样的分段元素吗?

php - POST 和 GET 方法调用同一文件中的函数

javascript - JQuery - 将光标放在文本区域的末尾

javascript - 如何在 assetic 的 Symfony 中使用 CSS 和 JS 压缩