/**
  * @param int|null  $parentId             The parent node id
  * @param string    $lang                 The locale
  * @param string    $permission           The permission (read, write, ...)
  * @param AclHelper $aclHelper            The acl helper
  * @param bool      $includeHiddenFromNav Include nodes hidden from
  *                                        navigation or not
  * @param Node      $rootNode             Root node of the current tree
  *
  * @return Node[]
  */
 public function getChildNodes($parentId, $lang, $permission, AclHelper $aclHelper, $includeHiddenFromNav = false, $includeHiddenWithInternalName = false, $rootNode = null)
 {
     $qb = $this->createQueryBuilder('b')->select('b', 't', 'v')->leftJoin('b.nodeTranslations', 't', 'WITH', 't.lang = :lang')->leftJoin('t.publicNodeVersion', 'v', 'WITH', 't.publicNodeVersion = v.id')->where('b.deleted = 0')->setParameter('lang', $lang)->addOrderBy('t.weight', 'ASC')->addOrderBy('t.title', 'ASC');
     if (!$includeHiddenFromNav) {
         if ($includeHiddenWithInternalName) {
             $qb->andWhere('(b.hiddenFromNav != true OR b.internalName IS NOT NULL)');
         } else {
             $qb->andWhere('b.hiddenFromNav != true');
         }
     }
     if (is_null($parentId)) {
         $qb->andWhere('b.parent is NULL');
     } elseif ($parentId !== false) {
         $qb->andWhere('b.parent = :parent')->setParameter('parent', $parentId);
     }
     if ($rootNode) {
         $qb->andWhere('b.lft >= :left')->andWhere('b.rgt <= :right')->setParameter('left', $rootNode->getLeft())->setParameter('right', $rootNode->getRight());
     }
     $query = $aclHelper->apply($qb, new PermissionDefinition(array($permission)));
     return $query->getResult();
 }
 /**
  * Get the node translation for a given url
  *
  * @param string          $urlSlug        The full url
  * @param string          $locale         The locale
  * @param boolean         $includeDeleted Include deleted nodes
  * @param NodeTranslation $toExclude      Optional NodeTranslation instance
  *                                        you wish to exclude
  * @param Node            $rootNode       Optional Root node of the tree you
  *                                        wish to use
  *
  * @return NodeTranslation|null
  */
 public function getNodeTranslationForUrl($urlSlug, $locale = '', $includeDeleted = false, NodeTranslation $toExclude = null, Node $rootNode = null)
 {
     $qb = $this->createQueryBuilder('b')->select('b', 'v')->innerJoin('b.node', 'n', 'WITH', 'b.node = n.id')->leftJoin('b.publicNodeVersion', 'v', 'WITH', 'b.publicNodeVersion = v.id')->addOrderBy('b.online', 'DESC')->addOrderBy('n.sequenceNumber', 'DESC')->setFirstResult(0)->setMaxResults(1);
     if (!$includeDeleted) {
         $qb->andWhere('n.deleted = 0');
     }
     if (!empty($locale)) {
         $qb->andWhere('b.lang = :lang')->setParameter('lang', $locale);
     }
     if (empty($urlSlug)) {
         $qb->andWhere('b.url IS NULL');
     } else {
         $qb->andWhere('b.url = :url');
         $qb->setParameter('url', $urlSlug);
     }
     if (!is_null($toExclude)) {
         $qb->andWhere('NOT b.id = :exclude_id')->setParameter('exclude_id', $toExclude->getId());
     }
     if ($rootNode) {
         $qb->andWhere('n.lft >= :left')->andWhere('n.rgt <= :right')->setParameter('left', $rootNode->getLeft())->setParameter('right', $rootNode->getRight());
     }
     return $qb->getQuery()->getOneOrNullResult();
 }