コード例 #1
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();
 }
コード例 #2
0
 /**
  * Get controller class path for a given node.
  *
  * @param Node $node
  *
  * @return string
  */
 public function getControllerForNode(Node $node)
 {
     $currentClass = get_class($this);
     $refl = new \ReflectionClass($currentClass);
     $namespace = $refl->getNamespaceName() . '\\Controllers';
     /*
      * Determine if we look for a node-type named controller or
      * a node-named controller.
      */
     if (in_array($node->getNodeName(), static::$specificNodesControllers)) {
         return $namespace . '\\' . StringHandler::classify($node->getNodeName()) . 'Controller';
     } else {
         return $namespace . '\\' . StringHandler::classify($node->getNodeType()->getName()) . 'Controller';
     }
 }
コード例 #3
0
 /**
  * @param RZ\Roadiz\Core\Entities\Node         $node
  * @param RZ\Roadiz\Core\Entities\NodesSources $source
  *
  * @return \Symfony\Component\Form\Form
  */
 private function buildEditSourceForm(Node $node, NodesSources $source)
 {
     $fields = $node->getNodeType()->getFields();
     /*
      * Create source default values
      */
     $sourceDefaults = ['title' => $source->getTitle()];
     foreach ($fields as $field) {
         if (!$field->isVirtual()) {
             $getter = $field->getGetterName();
             if (method_exists($source, $getter)) {
                 $sourceDefaults[$field->getName()] = $source->{$getter}();
             } else {
                 throw new \Exception($getter . ' method does not exist in ' . $node->getNodeType()->getName());
             }
         }
     }
     /*
      * Create subform for source
      */
     $sourceBuilder = $this->getService('formFactory')->createNamedBuilder('source', 'form', $sourceDefaults)->add('title', 'text', ['label' => $this->getTranslator()->trans('title'), 'required' => false, 'attr' => ['data-desc' => '', 'data-dev-name' => '{{ nodeSource.' . StringHandler::camelCase('title') . ' }}']]);
     foreach ($fields as $field) {
         $sourceBuilder->add($field->getName(), $this->getFormTypeFromFieldType($source, $field, $this), $this->getFormOptionsFromFieldType($field));
     }
     return $sourceBuilder->getForm();
 }
コード例 #4
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;
 }