public function updateAction(Request $request, $id) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('YourBundle:Category')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Category entity.');
}
$editForm = $this->createEditForm($entity);
$editForm->bind($request);
if ($editForm->isValid()) {
foreach ($editForm->get('items')->getData()->getValues() as $u)
$u->setCategory($entity);
$em->flush();
return $this->redirect($this->generateUrl('category_show', array('id' => $id)));
}
return $this->render('YourBundle:Category:edit.html.twig', array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
));
}
См, в Symfony2 сущность со свойством с доктриной комментарием inversedBy является тот, который должен принимать меры, когда вы хотите создать новую связь между двумя таблицами. Вот почему вы можете назначить категорию элементу, но не добавлять предметы в категорию.
Вышеприведенный код является стандартным CRUD-генератором Symfony2 updateAction функция. Единственным изменением является foreach, тем самым принудительно присваивая категорию каждому элементу, который вы выбрали в форме.
Это рудиментарный, но он работает.
ПРИМЕЧАНИЕ. Я не использовал обходной путь для удаления элементов из категории, но аналогичный подход мог бы сделать это. Надеюсь, поможет.
EDIT: ДЛЯ удаляют элементы:
public function updateAction(Request $request, $id) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('YourBundle:Category')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Category entity.');
}
//new line
$before = $entity->getItems()->getValues();
$editForm = $this->createEditForm($entity);
$editForm->bind($request);
//new line
$after = $entity->getItems()->getValues();
if ($editForm->isValid()) {
//new lines
$UNselected = array_diff($before, $after);
foreach ($UNselected as $u) {
$u->setCategory(null);
}
foreach ($after as $u) {
$u->setCategory($entity);
}
//new lines - end
$em->flush();
return $this->redirect($this->generateUrl('category_show', array('id' => $id)));
}
return $this->render('YourBundle:Category:edit.html.twig', array(
'entity' => $entity,
'edit_form' => $editForm->createView(),
));
}
Та же функция, просто включить новые линии.
array_diff будет возвращать элементы, которые были связаны с категорией объекта до покориться и не после того, как подать, а затем с Еогеаспом снова можно назначить нуль в каждой категории этих пунктов, т.е. : разорвать связь между ними.
Второй foreach делает то же, что и исходный ответ. Просто попробуйте это сейчас и скажите мне, если это сработает.
Опять же, рудиментарный, опять же, должен работать.
Взгляните на [Тип поля коллекции] (http://symfony.com/doc/current/reference/forms/types/collection.html) –
hm .. спасибо, но я не хочу делать «добавить» элементы - я хочу только назначить существующие элементы существующей категории. – tokuimo