2017-02-09 3 views
0

У меня есть 2 объекта в symfony, Пользователь и теги, каждый пользователь находится в связи со многими тегами.Форма Symfony, коллекция новых сущностей и сущностей вместе

В моей форме пользователя я хочу иметь возможность выбирать один или несколько тегов и создавать новые.

Как я могу это достичь?

Я читал, как выбрать один тег или создать новый, но это не то, что я хочу.

ответ

0

Выбор 1 или более Isnt слишком трудно: См http://symfony.com/doc/current/reference/forms/types/collection.html

allow_add В частности, используя allow_delete и prototype варианты.

$builder->add('favorite_cities', CollectionType::class, array(
    'entry_type' => EntityType::class, 
    'entry_options' => array(
     'prototype' => true, 
     'allow_add' => true, 
     'allow_delete' => true, 
     'class' => 'AppBundle:Tag' 
    ), 
)); 

Это позволит добавлять и удалять теги, которые существуют, создавая теги в том же контексте, это немного сложнее. То, что вы могли бы сделать, вместо использования объекта тега непосредственно использовать стандартное поле ввода, то в цикле контроллера, чтобы проверить, существует ли тег и ассоциировать его, если он его не создает. Что-то вроде:

// AppBundle/Form/UserType.php 
... 
$builder->add('favorite_cities', CollectionType::class, array(
    'entry_type' => TextType::class, 
    'entry_options' => array(
     'prototype' => true, 
     'allow_add' => true, 
     'allow_delete' => true, 
    ), 
)); 

// AppBundle/Controller/UserController 
... 
public function addFavoriteCitiesAction(Request $request) { 
    $user = ... // However you get your user 
    $form = $this->createForm(UserType::class,$user); 

    if($request->isMethod('POST')) { 
     $form->handleRequest($request); 

     $favCities = $user->getFavoriteCities(); // Should be an array of strings 
     $em = $this->getDoctrine()->getManager(); 
     $tagRepo = $em->getRepository('AppBundle:Tag'); 
     foreach($favCities as $favCity) { 
      $tag = $tagRepo->findOneBy([ 
       'name' => $favCity 
      ]); 
      if(!$tag){ 
       $tag = new Tag(); // AppBundle/Entity/Tag.php ? 
       $tag->setName($favCity); 
       $em->persist($tag); 
      } 
      $user->addTag($tag); 
     } 
     $em->flush(); 
    } 
    return [ 
     'form' => $form->createView(); 
    ]; 

} 

Этот код hasnt был протестирован и более предназначен для отображения и пример, я полагаю, немного о вашей установке, но что-то, как он должен работать для вас.

+0

Хорошо, это возможное решение, но не совсем то, что я ищу. Я хочу, чтобы mantain myTextType, потому что есть много полей и других отношений. –

+0

@ RiccardoCorrò Что вы называете тегами типа? Может быть, это можно адаптировать к этому? – Chausser

+0

Да, может. Но это может усложнить управление, и я могу потерять эффективность форм symfony. –

Смежные вопросы