/** * @param mixed(string|Node) $nodeOrInternalName * * @return object */ private function getNode($nodeOrInternalName) { if (is_string($nodeOrInternalName)) { return $this->nodeRepo->findOneBy(array('internalName' => $nodeOrInternalName)); } return $nodeOrInternalName; }
/** * @param array $options * * @return mixed */ private function getNodeChildren(array $options) { /** @noinspection PhpUnusedParameterInspection */ $options = (new OptionsResolver())->setDefaults(['depth' => 1, 'refName' => null, 'parent' => null, 'lang' => $this->currentLocale->getCurrentLocale(), 'include_root' => false, 'include_hidden' => false, 'include_offline' => false, 'flatten' => false, 'limit' => 0])->setNormalizer('refName', function ($options, $value) { return $value ? (array) $value : []; })->setAllowedTypes('parent', ['null', Node::class])->setAllowedTypes('depth', 'integer')->setAllowedTypes('limit', 'integer')->setAllowedTypes('include_root', 'bool')->setAllowedTypes('include_hidden', 'bool')->setAllowedTypes('flatten', 'bool')->resolve($options); $qb = $this->nodeRepository->createQueryBuilder('node')->leftJoin('node.nodeTranslations', 'nt', Join::WITH, 'nt.node = node and nt.lang = :lang')->leftJoin('nt.publicNodeVersion', 'nv')->leftJoin('node.parent', 'parent')->select('parent.id as parentId', 'node.id', 'nt.title', 'nt.url', 'nt.lang', 'nv.refId', 'nv.refEntityName', 'node.internalName')->where('nt.lang = :lang')->andWhere('node.deleted = 0')->orderBy('node.lvl, nt.weight')->setParameter('lang', $options['lang']); if ($options['limit']) { $qb->setMaxResults($options['limit']); } if (false === $options['include_hidden']) { $qb->andWhere('node.hiddenFromNav = 0'); } if (false === $options['include_offline']) { $qb->andWhere('nt.online = 1'); } if ($options['refName']) { $qb->andWhere('node.refEntityName in (:refName)')->setParameter('refName', $options['refName']); } $level = 0; $nodeId = null; if ($options['parent']) { /** @var Node $parent */ $parent = $options['parent']; $nodeId = $parent->getId(); $level = $parent->getLevel(); $qb->andWhere('node.lft >= :minLeft')->andWhere('node.rgt <= :maxRight')->setParameter('minLeft', $parent->getLeft())->setParameter('maxRight', $parent->getRight()); if (false === $options['include_root']) { $qb->andWhere('node.id != :nodeId')->setParameter('nodeId', $nodeId); } } if ($options['depth']) { $qb->andWhere('node.lvl <= :maxLevel')->setParameter('maxLevel', $level + $options['depth']); } $children = $qb->getQuery()->getResult(); $flatten = $options['flatten']; /** @noinspection PhpInternalEntityUsedInspection */ return array_reduce($children, function (TreeBuilder $treeBuilder, $item) use($nodeId, $flatten) { $branch = new Branch($item['title'], $item['id'], $item['url'], $item['lang'], $item['refId'], $item['refEntityName'], $item['internalName']); if ($branch->getNodeId() === $nodeId) { $item['parentId'] = null; } elseif ($flatten) { $item['parentId'] = $nodeId; } return $treeBuilder->add($item['parentId'], $branch); }, new TreeBuilder())->getRoot(); }
/** * [Home -> Category -> SubCategory -> Page] * * @param Node $node * * @return \Kunstmaan\NodeBundle\Entity\Node[] * @see getBreadCrumbs * @see getParents * */ public function getNodePath(Node $node) { return $this->nodeRepository->getAllParents($node); }