I have 2 entities ItemSelector which can have several Item. In the view i then want to display a itemselector, with select box of Item. I've read the doc for the prototype part, to have a dynamic add/remove of Item.
The problem is the values passed to the form for item are not selected in the select.
I must be missing a parameter somewhere but i can't find it. I know the values are passed to the form because i can display them (outside the select box)
The item is not selected: below ecn-exo1
<ul class="isel-item" data-prototype="{{ _self.isel_prototype(form.items.vars.prototype)|e }}">
{% for item in form.items %}
<li class="item">
<table class="table">
<tr>
<td class="isel_label">{{ form_label(item.itemcode) }} - {{ item.vars.value.itemcode }}</td>
<td class="isel_widget">{{ form_widget(item.itemcode) }}{{ form_errors(item.itemcode) }}</td>
</tr>
</table>
</li>
{% endfor %}
</ul>
My Controller
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);
}
/*
* Begin dummy init
*/
$item1 = new Item();
$item1->setItemcode(36);
$item2 = new Item();
$item2->setItemcode(38);
$itemSelector->addItem($item1);
$itemSelector->addItem($item2);
/*
* End dummy init
*/
$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);
$em->persist($item);
// to delete the Item entirely, you can also do that
$em->remove($item);
}
}
$em->persist($itemSelector);
$em->flush();
}
return array(
'_resource' => $itemSelector,
'form' => $form->createView(),
);
}
}
The form type : ItemSelectorType
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,
)
)
;
}
And ItemType :
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(
'itemcode', 'entity', array(
'label' => 'Code',
'class' => 'NWAItemSelectorBundle:ItemSelectorResourceNode,
'choice_label' =>'name',
'empty_value' => 'Choose an item',
'query_builder' => function(ItemSelectorResourceNodeRepository $er) use ($resourceType, $namePattern) {
return $er->getQbFilteredBy($resourceType, $namePattern);
}
)
);
}
The ItemSelectorResourceNodeRepository::getQbFilteredBy allow to filter the data to be displayed.