2016-09-30 39 views
1

所以我开始学习Symfony。它看起来像一个非常棒的框架,但一些概念仍然模糊,所以请原谅我的问题,这可能似乎愚蠢的你们中的一些人。Symfony - 同一种类型的多种形式

所以我想要做的是制作一个页面,我的用户可以在同一个页面中添加同一个实体的多个实例(比如说5),所以它就像是“在bash中添加项目”页面(有点像phpMyAdmin插入数据页面,您可以在一个页面中添加多行)。

我已经从我的实体中创建了我的FormType,并且当我想添加1个实体时,一切正常,但我不知道如何处理多个实体插入。

我已经尝试通过使用FormCollection,没有任何成功(对不起,我删除了我的代码,所以我不能显示我已经尝试过...)。我也尝试用一个循环生成5种不同的形式,只改变他们的名字,但我不知道如何处理它们。

如果有人能告诉我方式,那对你来说真的很棒!提前致谢!

P.S我使用的Symfony 3.1.4

+0

CollectionType正是您所需要的。只需将数据提交给控制器并循环访问数组以将记录插入数据库。 –

回答

0

如果您将一个窗体嵌套在另一个窗体中,则可以根据需要添加任意多个窗体。因此,如果第一种形式创建一个实体...例如:

的实体形式:

// src/AppBundle/Form/TaskType.php 
namespace AppBundle\Form; 

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

class TaskType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name') 
      ->add('task'); 
    } 

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

的容器形式允许添加多种形式:

// src/AppBundle/Form/ProjectType.php 
namespace AppBundle\Form; 

use src/AppBundle/Form/TaskType.php 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\Form\Extension\Core\Type\CollectionType; 

class ProjectType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('tasks', CollectionType::class, array(
      'entry_type' => TaskType::class, 
      'allow_add' => true // <- don't forgot this part :) 
     )) 
     ->add('save', SubmitType::class); 
    } 
} 

你需要将容器表单连接到某个JavaScript,以便可以动态添加更多的实体表单。那是described in detail in this cookbook article。此外,公平的警告:这是由一个昏昏欲睡,懒惰的大脑打字,并未经过测试,可能不起作用。但它应该把你放在正确的道路上:D祝你好运!

+1

所以我坐下来比昨天更加专注,实际上我使用了CollectionForm来处理好这个问题。使用原型和一切动态添加到我的网页的形式,它的工作很好!你的一小段代码实际上帮助我开始!谢谢! – RaphBlanchet

0

从您的要求,看来你的形式并不大。所以,你应该为此使用AJAX。

加载单个表单,但通过ajax处理提交,成功后,您的控制器应通过JsonResponse以另一种新形式进行响应。这样用户不必填写所有表格,只需要更好的可用性即可获得所需的内容。

希望它有帮助!