Bonjour,
je suis actuellement face à un problème et j'avoue que j'ai du mal à voir si une solution peut exister. J'ai bon espoir mais personnellement j'ai beau tourner le problème dans tous les sens je trouve pas.
Mon objectif est d'offrir plusieurs mode de saisie pour une même entité, elle même incluse dans une collection d'une autre entité. J'ai bien compris la notion des forms embed, j'ai bien compris la notion des event forms, mais je n'arrive pas à fusionner les deux. J'explique.
Prenons l'exemple de la tâche avec les tags de la doc officielle. Mon objectif serait ici de contrôler les champs tags du formulaire.
http://symfony.com/doc/current/cookb...llections.html
En objets on a donc :
- Entity Task
- Entity Tag
- Form TaskType
- Form TagType
Pour ce qui est de la notion de form embed, la Task contient une liste de Tags, mappé dans le formulaire par la collection :
$builder->add('tags', 'collection', array('type' => new TagType()));
Pour ce qui est des event forms, j'aurais quelque chose dans ce style :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class TagFieldCreator implements EventSubscriberInterface
{
private $factory;
private $display;
public function __construct(FormFactoryInterface $factory, $display_type)
{
$this->factory = $factory;
$this->display = $display_type;
}
public static function getSubscribedEvents()
{
return array(FormEvents::PRE_SET_DATA => 'preSetData');
}
public function preSetData(DataEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
switch ($this->display)
{
case 'text':
$form->add($this->factory->createNamed('text', 'name'));
break;
case 'select':
$form->add($this->factory->createdNamed('choice', 'name', null, array(
'choices' => array(
'tag1' => 'Tag 1',
'tag2' => 'Tag 2',
'tag3' => 'Tag 3',
)
)));
}
}
} |
Avec ça, mon TagType devrait ressembler à ça :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class TagType extends AbstractType
{
private $display;
public function __construct($display)
{
$this->display = $display;
}
public function buildForm(FormBuilder $builder, array $options)
{
$subscriber = new TagFieldCreator($builder->getFormFactory(), $display);
$builder->addEventSubscriber($subscriber);
}
public function getName()
{
return 'tag';
}
} |
Et mon problème dans tout ça, c'est que si je créais un formulaire simple pour un Tag directement depuis le controleur, j'aurais moyen de savoir quel $display je veux envoyer à mon TagType. Ce qui donnerait quelque chose du style :
$form = $this->createForm(new TagType($display), $tag);
Or, mon TagType est appelé dans la création de la collection, dans la classe TaskType. Rappel :
$builder->add('tags', 'collection', array('type' => new TagType()));
Donc comment à partir d'ici je pourrait différencier mes TagType et en avoir dans ma collection par exemple un en mode 'text' et l'autre en mode 'select' comme décrit dans l'event form?
Merci d'avance à ceux qui auront le courage de réfléchir au problème, après avoir eu le courage de lire et d'essayer de comprendre mon exposé
Partager