2016-09-30 83 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以另一種新形式進行響應。這樣用戶不必填寫所有表格,只需要更好的可用性即可獲得所需的內容。

希望它有幫助!