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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
->add(
    'itemcode', 'text', array(
        'label' => 'Code'
    )
);
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)

Dans la vue si je fais :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
{% for item in form.items %}    
    {{ item.vars.value.itemcode }}  
{% endfor %}
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 ?)

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

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;
    }
}
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
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;
    }
}
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
class ResourceNode
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\Column()
     */
    protected $name;
...
}
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
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';
    }
}
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
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';
    }
}
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
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(),
        );
    }
}
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
{% 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 %}