2016-08-04 76 views
3

我經常在一些研究中找到答案來解決我的問題,但現在情況並非如此。假設我有兩個實體,「Task」和「TaskCategory」,每個任務都有一個類別。 我想讓我的用戶不僅可以將現有的類別歸功於他們的任務,還可以創建新的類別。選擇或創建一個實體

下面的代碼我到目前爲止:

<?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」字段。

+0

如果您在編輯的情況下進入'if'功能? – DOZ

+0

我無法確定它是否是在窗體內編輯/創建的。 只有在未設置類別標識並設置類別名稱的情況下,我纔會進入if。這意味着我試圖創建一個新的類別。 – CuzYouKnow

+0

爲什麼不檢查*。empty($ task ['category'] ['id'])*而不是* empty($ task ['category'] ['id'])* *如果id不爲空(=已經存在),它不是來if-block – Rinat

回答

0

嗯,看來我終於找到了工作,這是不漂亮,我不是它是如何做很高興,但目前我還沒有發現任何替代方案。 如果你有一個更清潔的解決方案,我很樂意學習。

<?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); 
      } 
     }) 
    ; 
} 
0

考慮到您從TaskTaskCategory啓用了cascade-persist協會。我想最好的解決辦法是,使用autocompleter這應該作爲基於標籤工作。

Transformer應該檢查數據庫,如果給出TaskCategory可用,否則創建一個新的。

+0

我也在考慮使用Transformer來完成這項任務。但我認爲創建一個實體並不是他的職責,而且如果存在驗證錯誤,轉換將發生並創建新的實體,即使它未被使用。 沒什麼大不了的,但要注意! – CuzYouKnow

+0

形成我最後的工作,我不認爲如果有驗證,變壓器將創建一個新的條目。可能,我明確地處理了它。稍後我會用一些代碼片段更新你。但只知道,使用「變形金剛」是人生的救星。 :) – Jeet

+0

對不起,我錯過了您的評論,我很樂意看到您的解決方案的一小部分,如果你找到它;-) – CuzYouKnow