private function duplicateRec(Node $node, $level) { $childrenArray = []; $sourceArray = []; $childs = new ArrayCollection($node->getChildren()->toArray()); $node->getChildren()->clear(); foreach ($childs as $child) { $childrenArray[] = $this->duplicateRec($child, $level + 1); } $nodeSources = new ArrayCollection($node->getNodeSources()->toArray()); $node->getNodeSources()->clear(); foreach ($nodeSources as $nodeSource) { $nodeSource->setNode(null); $tran = Kernel::getService('em')->merge($nodeSource->getTranslation()); $nodeSource->setTranslation($tran); Kernel::getService('em')->persist($nodeSource); $nsdocs = $nodeSource->getDocumentsByFields(); foreach ($nsdocs as $nsdoc) { $nsdoc->setNodeSource($nodeSource); $doc = Kernel::getService('em')->merge($nsdoc->getDocument()); $nsdoc->setDocument($doc); $f = Kernel::getService('em')->merge($nsdoc->getField()); $nsdoc->setField($f); Kernel::getService('em')->persist($nsdoc); } Kernel::getService('em')->flush(); $sourceArray[] = $nodeSource; } $nodetype = Kernel::getService('em')->merge($node->getNodeType()); $node->setNodeType($nodetype); $node->setParent(null); Kernel::getService('em')->persist($node); foreach ($childrenArray as $child) { $child->setParent($node); } foreach ($sourceArray as $source) { $source->setNode($node); } Kernel::getService('em')->flush(); return $node; }
protected function doTranstype(Node $node, NodeType $nodeType) { /* * Get an association between old fields and new fields * to find data that can be transfered during transtyping. */ $fieldAssociations = []; $oldFields = $node->getNodeType()->getFields(); $er = $this->getService('em')->getRepository('RZ\\Roadiz\\Core\\Entities\\NodeTypeField'); foreach ($oldFields as $oldField) { $matchingField = $er->findOneBy(['nodeType' => $nodeType, 'name' => $oldField->getName(), 'type' => $oldField->getType()]); if (null !== $matchingField) { $fieldAssociations[] = [$oldField, $matchingField]; } } foreach ($node->getNodeSources() as $existingSource) { $sourceClass = "GeneratedNodeSources\\" . $nodeType->getSourceEntityClassName(); $source = new $sourceClass($node, $existingSource->getTranslation()); $source->setTitle($existingSource->getTitle()); foreach ($fieldAssociations as $fields) { if (!$fields[0]->isVirtual()) { /* * Copy simple data from source to another */ $setter = $fields[0]->getSetterName(); $getter = $fields[0]->getGetterName(); $source->{$setter}($existingSource->{$getter}()); } elseif ($fields[0]->getType() === NodeTypeField::DOCUMENTS_T) { /* * Copy documents. */ $documents = $this->getService('em')->getRepository('RZ\\Roadiz\\Core\\Entities\\Document')->findByNodeSourceAndField($existingSource, $fields[0]); foreach ($documents as $document) { $nsDoc = new NodesSourcesDocuments($source, $document, $fields[1]); $source->getDocumentsByFields()->add($nsDoc); } } } // First plan old source deletion. $this->getService('em')->remove($existingSource); $this->getService('em')->flush(); $this->getService('em')->persist($source); foreach ($source->getDocumentsByFields() as $nsDoc) { $this->getService('em')->persist($nsDoc); } $this->getService('em')->flush(); } $node->setNodeType($nodeType); $this->getService('em')->flush(); }