J'ai 2 entité : ItemSelector et Item : un ItemSelector peut avoir plusieurs Items.
Les Items sont choisis à partir d'une autre entité Resource
J'ai fait un formulaire imbriqué pour créer et choisir les Items depuis un ItemSelector
Disons que j'ai enregistré (à la main pour l'instant) 3 Item
L'un de mes problèmes est que si j'utilise dans ItemType
dans la vue, J'ai les 3 champs affichant les valeurs correctes pour l'entité Item. Mais je veux afficher un champ déroulant dont les valeurs proviennent de l'entité Resource. Dans ce cas, ce ne sont pas les valeurs enregistrées qui sont sélectionné automatiquement(bien que 3 champs select sont affichés, ce qui me laisse penser que je ne dois pas être très loin de la solution)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ->add( 'itemcode', 'text', array( 'label' => 'Code' ) );
Dans la vue si je fais :
j'ai bien les valeurs que j'ai enregistré manuellement (manuellement, car la partie enregistrement ne fonctionne pas non plus - est-ce lié ou pas ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 {% for item in form.items %} {{ item.vars.value.itemcode }} {% endfor %}
ma question est pourquoi les valeurs enregistrées ne sont pas sélectionnées (et il n'y a pas d'erreur affichée). Quel paramètre ou autre ai-je manqué ?
Merci
Entity ItemSelector
Entity Item
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
38
39
40
41
42
43
44
45 class ItemSelector extends AbstractResource { /** * @ORM\OneToMany(targetEntity="NWA\ItemSelectorBundle\Entity\Item", mappedBy="itemselector", cascade={"all"}) */ protected $items; /** * Class constructor */ public function __construct() { $this->items = new ArrayCollection(); } /** * Add item * * @param \NWA\ItemSelectorBundle\Entity\Item $item * * @return ItemSelector */ public function addItem(\NWA\ItemSelectorBundle\Entity\Item $item) { $item->setItemselector($this); $this->items->add($item); } /** * Remove item * * @param \NWA\ItemSelectorBundle\Entity\Item $item */ public function removeItem(\NWA\ItemSelectorBundle\Entity\Item $item) { $this->items->removeElement($item); } /** * Get items * * @return \Doctrine\Common\Collections\Collection */ public function getItems() { return $this->items; } }
and Entity ResourceNode qui contient le liste de tous les items que je peux choisir
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 /** * @ORM\Table(name="nwa__item") * @ORM\Entity(repositoryClass="NWA\ItemSelectorBundle\Repository\ItemRepository") */ class Item { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\Column(name="itemcode", type="integer") */ protected $itemcode; /** * @var ItemSelector * * @ORM\ManyToOne(targetEntity="NWA\ItemSelectorBundle\Entity\ItemSelector", inversedBy="items") * @ORM\JoinColumn(name="itemselector_id", referencedColumnName="id") */ protected $itemselector; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set itemcode * * @param string $itemcode * * @return Item */ public function setItemcode($itemcode) { $this->itemcode = $itemcode; return $this; } /** * Get itemcode * * @return string */ public function getItemcode() { return $this->itemcode; } /** * Set itemselector * * @param \NWA\ItemSelectorBundle\Entity\ItemSelector $itemselector * * @return Item */ public function setItemselector(\NWA\ItemSelectorBundle\Entity\ItemSelector $itemselector = null) { $this->itemselector = $itemselector; return $this; } /** * Get itemselector * * @return \NWA\ItemSelectorBundle\Entity\ItemSelector */ public function getItemselector() { return $this->itemselector; } }
mes Form types : ItemSelectorType : j'affiche un champ sélect
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class ResourceNode { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column() */ protected $name; ... }
ItemType : je récupère les valuers de l'entité Resource
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 class ItemSelectorType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( 'items', 'collection', array( 'type' => new ItemType(), 'by_reference' => false, 'prototype' => true, 'allow_add' => true, 'allow_delete' => true ) ) ; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => 'NWA\ItemSelectorBundle\Entity\ItemSelector', 'translation_domain' => 'resource' )); } public function getName() { return 'nwa_itemselector'; } }
Le controller :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 class ItemType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( 'itemcode', 'entity', array( 'label' => 'Code', 'class' => 'NWAItemSelectorBundle:ItemSelectorResourceNode, 'choice_label' =>'name', ) ); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'NWA\ItemSelectorBundle\Entity\Item' )); } public function getName() { return 'nwa_itemselectorbundle_item'; } }
et enfin le template :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
38
39
40 class ItemSelectorController extends Controller { /** * @EXT\Route("/choose/{id}", name="nwa_choose_item", requirements={"id" = "\d+"}, options={"expose"=true}) * @EXT\ParamConverter("itemselector", class="NWAItemSelectorBundle:ItemSelector", options={"id" = "id"}) * @EXT\Template("NWAItemSelectorBundle:ItemSelector:choose.html.twig") */ public function chooseAction(Request $request, ItemSelector $itemSelector) { $em = $this->getDoctrine()->getManager(); // Create an ArrayCollection of the current Item objects in the database $originalItems = new ArrayCollection(); foreach ($itemSelector->getItems() as $item) { $originalItems->add($item); } $form = $this->get('form.factory') ->create(new ItemSelectorType(), $itemSelector); $form->handleRequest($request); if ($form->isValid()) { // remove the relationship between the item and the ItemSelector foreach ($originalItems as $item) { if (false === $itemSelector->getItems()->contains($item)) { // in a a many-to-one relationship, remove the relationship $item->setItemSelector(null); // to delete the Item entirely $em->remove($item); } } $em->persist($itemSelector); $em->flush(); } return array( '_resource' => $itemSelector, 'form' => $form->createView(), ); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 {% macro isel_prototype(form) %} <table class="table"> <tr> <td class="isel_label">{{ form_label(form.itemcode) }}</td> <td class="isel_widget">{{ form_widget(form.itemcode) }}</td> <td class="isel_error">{{ form_errors(form.itemcode) }}</td> </tr> </table> {% endmacro %} {% block section_content %} <form action="{{ path('cpasimusante_choose_item', {'id': _resource.id}) }}" method="post" {{ form_enctype(form) }} id="form"> <div class="panel panel-default"> <div class="panel-body" id="text_content"> <ul class="isel-item" data-prototype="{{ _self.isel_prototype(form.items.vars.prototype)|e }}"> {% for item in form.items %} <li class="item">{{ _self.isel_prototype(item) }}</li> {% endfor %} </ul> </div> <div class="panel-footer"> <button type="button" class="btn btn-default" >{{ 'cancel'|trans({}, 'platform') }}</button> <button type="submit" class="btn btn-primary">{{ 'save'|trans({}, 'platform') }}</button> </div> </div> </form> {% endblock %}
Partager