Perform deep clone when cloning a part.

Fixes issue #25.
This commit is contained in:
Jan Böhmer 2020-03-08 18:56:00 +01:00
parent ccdac1a94b
commit a3c626d0ab
8 changed files with 92 additions and 7 deletions

View file

@ -224,6 +224,7 @@ class PartController extends AbstractController
/** /**
* @Route("/new", name="part_new") * @Route("/new", name="part_new")
* @Route("/{id}/clone", name="part_clone")
* *
* @param Request $request * @param Request $request
* @param EntityManagerInterface $em * @param EntityManagerInterface $em
@ -233,16 +234,20 @@ class PartController extends AbstractController
* @return Response * @return Response
*/ */
public function new(Request $request, EntityManagerInterface $em, TranslatorInterface $translator, public function new(Request $request, EntityManagerInterface $em, TranslatorInterface $translator,
AttachmentManager $attachmentHelper, AttachmentSubmitHandler $attachmentSubmitHandler): Response AttachmentManager $attachmentHelper, AttachmentSubmitHandler $attachmentSubmitHandler, ?Part $part = null): Response
{ {
$new_part = new Part(); if($part === null) {
$new_part = new Part();
} else {
$new_part = clone $part;
}
$this->denyAccessUnlessGranted('create', $new_part); $this->denyAccessUnlessGranted('create', $new_part);
$cid = $request->get('cid', 1); $cid = $request->get('cid', 1);
$category = $em->find(Category::class, $cid); $category = $em->find(Category::class, $cid);
if (null !== $category) { if (null !== $category && $new_part->getCategory() === null) {
$new_part->setCategory($category); $new_part->setCategory($category);
} }
@ -292,7 +297,7 @@ class PartController extends AbstractController
} }
/** /**
* @Route("/{id}/clone", name="part_clone") * //@Route("/{id}/clone", name="part_clone")
* *
* @param Part $part * @param Part $part
* @param Request $request * @param Request $request
@ -323,6 +328,7 @@ class PartController extends AbstractController
[ [
'part' => $new_part, 'part' => $new_part,
'form' => $form->createView(), 'form' => $form->createView(),
'attachment_helper' => $attachmentHelper,
]); ]);
} }
} }

View file

@ -95,4 +95,23 @@ abstract class AttachmentContainingDBElement extends AbstractNamedDBElement impl
return $this; return $this;
} }
public function __clone()
{
if ($this->id) {
$attachments = $this->attachments;
$this->attachments = new ArrayCollection();
//Set master attachment is needed
foreach ($attachments as $attachment) {
$clone = clone $attachment;
if ($attachment === $this->master_picture_attachment) {
$this->setMasterPictureAttachment($clone);
}
$this->addAttachment($clone);
}
}
//Parent has to be last call, as it resets the ID
parent::__clone();
}
} }

View file

@ -68,8 +68,10 @@ abstract class AbstractDBElement implements \JsonSerializable
public function __clone() public function __clone()
{ {
//Set ID to null, so that an new entry is created if ($this->id) {
$this->id = null; //Set ID to null, so that an new entry is created
$this->id = null;
}
} }
/** /**

View file

@ -89,7 +89,15 @@ abstract class AbstractNamedDBElement extends AbstractDBElement implements Named
public function setName(string $new_name): self public function setName(string $new_name): self
{ {
$this->name = $new_name; $this->name = $new_name;
return $this; return $this;
} }
public function __clone()
{
if ($this->id) {
//We create a new object, so give it a new creation date
$this->addedDate = null;
}
parent::__clone(); // TODO: Change the autogenerated stub
}
} }

View file

@ -156,4 +156,24 @@ class Part extends AttachmentContainingDBElement
{ {
return $this->devices; return $this->devices;
} }
public function __clone()
{
if ($this->id) {
//Deep clone part lots
$lots = $this->partLots;
$this->partLots = new ArrayCollection();
foreach ($lots as $lot) {
$this->addPartLot(clone $lot);
}
//Deep clone order details
$orderdetails = $this->orderdetails;
$this->orderdetails = new ArrayCollection();
foreach ($orderdetails as $orderdetail) {
$this->addOrderdetail(clone $orderdetail);
}
}
parent::__clone();
}
} }

View file

@ -325,4 +325,12 @@ class PartLot extends AbstractDBElement implements TimeStampableInterface
return $this; return $this;
} }
public function __clone()
{
if($this->id) {
$this->addedDate = null;
}
parent::__clone();
}
} }

View file

@ -348,4 +348,18 @@ class Orderdetail extends AbstractDBElement implements TimeStampableInterface
return $this; return $this;
} }
public function __clone()
{
if ($this->id) {
$this->addedDate = null;
$pricedetails = $this->pricedetails;
$this->pricedetails = new ArrayCollection();
//Set master attachment is needed
foreach ($pricedetails as $pricedetail) {
$this->addPricedetail(clone $pricedetail);
}
}
parent::__clone();
}
} }

View file

@ -328,4 +328,12 @@ class Pricedetail extends AbstractDBElement implements TimeStampableInterface
{ {
return 'PD'.sprintf('%06d', $this->getID()); return 'PD'.sprintf('%06d', $this->getID());
} }
public function __clone()
{
if ($this->id) {
$this->addedDate = null;
}
parent::__clone();
}
} }