Я пытаюсь сохранить объект как копию. В той же форме будут две кнопки отправки, одна для сохранения и перезаписывания, а другая - для сохранения в виде копии.Symfony 3 - Сохранить как копию
Сохраните и перезапишите работу должным образом, не можете сказать то же самое для сохранения как копию, до сих пор я обнаружил различные проблемы в моих подходах.
Это действие в мой контроллер:
public function EditAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$checklist = $em->getRepository('AppBundle:Checklist')->find($id);
if (!$checklist) {
throw $this->createNotFoundException('No se ha encontrado el checklist de id ' . $id);
}
$editForm = $this->createForm(ChecklistType::class, $checklist);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
$checklist->setUserModificator($user);
$checklist->setEstado(true);
if ($editForm->get('Save')->isClicked()) {
$em->persist($checklist);
$em->flush();
}
if ($editForm->get('SaveCopy')->isClicked()) {
$copy = clone $checklist;
$copy->setNombre($checklist->getNombre() . ' #COPY' . substr(uniqid(), 8, 4) . '#');
$em->persist($copy);
$em->detach($checklist);
$em->flush();
}
$this->get('session')->getFlashBag()->add('success', "Se ha actualizado el Checklist correctamente.");
return $this->redirectToRoute('listChecklist', array('id' => $id));
}
return $this->render(':checklist:create.html.twig', array(
'edit' => true,
'form' => $editForm->createView(),
));
}
Форма ручки сущности Контрольный список, каждый контрольный список будет иметь коллекцию ChecklistGroups, каждая группа будет иметь коллекцию ChecklistGroupTasks и каждая задача будет иметь коллекцию контрольного спискаGroupTaskCorrective. Эти 4 объекта обрабатываются в форме.
Мой подход работает, если никаких изменений в форме при нажатии кнопки «Сохранить как копию». Мой подход также работает, если единственная модификация заключается в создании новых групп.
Проблемы возникают, когда я создаю как группу, так и новые задачи, вложенные в эту группу.
An exception occurred while executing 'INSERT INTO checklist (Nombre, RotuloB, RotuloR, RotuloM, RotuloNA, RotuloValidador, Codigo, Estado, userCreator, userModifier) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["123", "1", "2", "3", "4", 1, "123", 1, 1, 1]:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '123' for key 'UNIQ_5C696D2F3D3C9410'
Я думаю, Symfony пытается создать копию и в то же время пытается сохранить исходный контрольный список, даже если он явно отсоединена.
Это из моих журналов, как-то он пытается выполнить две вставки запросов:
DEBUG - "START TRANSACTION"
DEBUG - INSERT INTO checklist (Nombre, RotuloB, RotuloR, RotuloM, RotuloNA, RotuloValidador, Codigo, Estado, userCreator, userModifier) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
DEBUG - INSERT INTO checklist (Nombre, RotuloB, RotuloR, RotuloM, RotuloNA, RotuloValidador, Codigo, Estado, userCreator, userModifier) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
DEBUG - "ROLLBACK"
Благодарности
EDIT:
Хорошо, теперь это сохранить новые вложенные объекты я создаю:
/** @var ChecklistGroup $newGroup */
foreach ($copy->getGroups() as $newGroup) {
$newGroup->setChecklist($copy);
/** @var ChecklistTask $newTask */
foreach($newGroup->getTasks() as $newTask)
{
$newTask->setChecklistgroup($newGroup);
/** @var ChecklistTaskCorrective $newCorrective */
foreach($newTask->getCorrectives() as $newCorrective)
{
$newCorrective->setChecklistTask($newTask);
}
}
}
Но теперь я не знаю, как справиться с удалением, например, когда удаление группы. Я попытался отсоединить группу, но symfony пытается удалить ее в фоновом режиме, и я получаю сообщение об ошибке ... «Невозможно удалить отдельный объект».
Можете ли вы добавить свою сущность к нотации и кодого? – goto
Возможно, это хорошая и простая идея создать новый контрольный список, установить все его значения из оригинала, а затем, сохранить и сбросить. – Muriano