コード例 #1
0
ファイル: NodeHandler.php プロジェクト: justinpocta/roadiz
 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;
 }
コード例 #2
0
 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();
 }