/**
  * @param \DateTime $date
  * @param string $format
  * @return string
  */
 public function prettyDate(\DateTime $date, $format = "default")
 {
     $locale = $this->currentLocale->getCurrentLocale();
     if (isset($this->formats[$format][$locale])) {
         $format = $this->formats[$format][$locale];
     } elseif (isset($this->formats[$format]['default'])) {
         $format = $this->formats[$format]['default'];
     }
     $intlDateFormatter = new IntlDateFormatter($locale, IntlDateFormatter::FULL, IntlDateFormatter::FULL, $date->getTimezone()->getName(), null, $format);
     return $intlDateFormatter->format($date);
 }
 /**
  * @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();
 }
 private function getValueId($value)
 {
     if ($value instanceof HasNodeInterface) {
         return $value->getId();
     } elseif ($value instanceof HasRefInterface) {
         return $value->getRefId();
     } elseif ($value instanceof NodeVersion) {
         return $value->getRefId();
     } elseif ($value instanceof NodeTranslation) {
         $nodeVersion = $value->getPublicNodeVersion();
         return $nodeVersion ? $nodeVersion->getRefId() : null;
     } elseif ($value instanceof Node) {
         $nodeTranslation = $value->getNodeTranslation($this->currentLocale->getCurrentLocale(), true);
         return $nodeTranslation ? $nodeTranslation->getPublicNodeVersion()->getRefId() : null;
     }
     return null;
 }
 /**
  * @param Category $category
  * @param string   $lang
  *
  * @return Branch|null
  */
 public function getBranchByCategory(Category $category, $lang = null)
 {
     $this->initNodeVersions();
     $lang = $lang ?: $this->currentLocale->getCurrentLocale();
     $matches = function (Branch $branch) use($category, $lang) {
         return $category->getNodeId() === $branch->getNodeId() && $lang === $branch->getLang();
     };
     return array_reduce($this->branches, function (Branch $result = null, Branch $branch) use($matches) {
         return $matches($branch) ? $branch : $result;
     });
 }
 public function configureOptions(OptionsResolver $resolver)
 {
     parent::configureOptions($resolver);
     $resolver->setDefaults(['advanced_select' => true, 'root_node' => function (Options $options) {
         return $this->domainConfiguration->getRootNode();
     }, 'lang' => function (Options $options) {
         return $this->currentLocale->getCurrentLocale();
     }, 'class' => function (Options $options) {
         return $this->contentTypeService->getContentTypeClass($options['page_name']);
     }, 'query_builder' => function (Options $options) {
         /** @var QueryBuilder $qb */
         $qb = $options['em']->getRepository($options['class'])->createQueryBuilder('e');
         $node = $options['root_node'];
         if ($node instanceof Node) {
             $qb->setParameters(['left' => $node->getLeft(), 'right' => $node->getRight()]);
         }
         $qb->setParameter('lang', $options['lang']);
         return $qb;
     }, 'empty_value' => ' ', 'required' => false]);
     $resolver->setAllowedTypes('root_node', ['null', Node::class]);
     $resolver->setRequired('page_name');
 }
 /**
  * @param int|null $offset
  * @param int|null $size
  * @return \Elastica\ResultSet
  */
 public function search($offset = null, $size = null)
 {
     $this->language = $this->currentLocale->getCurrentLocale();
     return parent::search($offset, $size);
 }