vendor/kunstmaan/node-bundle/Helper/NodeMenuItem.php line 13

Open in your IDE?
  1. <?php
  2. namespace Kunstmaan\NodeBundle\Helper;
  3. use Doctrine\ORM\EntityManager;
  4. use Kunstmaan\NodeBundle\Entity\HasNodeInterface;
  5. use Kunstmaan\NodeBundle\Entity\Node;
  6. use Kunstmaan\NodeBundle\Entity\NodeTranslation;
  7. /**
  8.  * NodeMenuItem
  9.  */
  10. class NodeMenuItem
  11. {
  12.     /**
  13.      * @var EntityManager
  14.      */
  15.     private $em;
  16.     /**
  17.      * @var Node
  18.      */
  19.     private $node;
  20.     /**
  21.      * @var NodeTranslation
  22.      */
  23.     private $nodeTranslation;
  24.     /**
  25.      * @var NodeMenuItem[]
  26.      */
  27.     private $children;
  28.     /**
  29.      * @var NodeMenuItem
  30.      */
  31.     private $parent;
  32.     /**
  33.      * @var NodeMenu
  34.      */
  35.     private $menu;
  36.     /**
  37.      * @param Node                    $node            The node
  38.      * @param NodeTranslation         $nodeTranslation The nodetranslation
  39.      * @param NodeMenuItem|null|false $parent          The parent nodemenuitem
  40.      * @param NodeMenu                $menu            The menu
  41.      */
  42.     public function __construct(Node $nodeNodeTranslation $nodeTranslation$parent falseNodeMenu $menu)
  43.     {
  44.         $this->node $node;
  45.         $this->nodeTranslation $nodeTranslation;
  46.         // false = look up parent later if required (default); null = top menu item; NodeMenuItem = parent item already fetched
  47.         $this->parent $parent;
  48.         $this->menu $menu;
  49.         $this->em $menu->getEntityManager();
  50.     }
  51.     /**
  52.      * @return int
  53.      */
  54.     public function getId()
  55.     {
  56.         return $this->node->getId();
  57.     }
  58.     /**
  59.      * @return Node
  60.      */
  61.     public function getNode()
  62.     {
  63.         return $this->node;
  64.     }
  65.     /**
  66.      * @return NodeTranslation
  67.      */
  68.     public function getNodeTranslation()
  69.     {
  70.         return $this->nodeTranslation;
  71.     }
  72.     /**
  73.      * @return string
  74.      */
  75.     public function getTitle()
  76.     {
  77.         $nodeTranslation $this->getNodeTranslation();
  78.         if ($nodeTranslation) {
  79.             return $nodeTranslation->getTitle();
  80.         }
  81.         return 'Untranslated';
  82.     }
  83.     /**
  84.      * @return bool
  85.      */
  86.     public function getOnline()
  87.     {
  88.         $nodeTranslation $this->getNodeTranslation();
  89.         if ($nodeTranslation) {
  90.             return $nodeTranslation->isOnline();
  91.         }
  92.         return false;
  93.     }
  94.     /**
  95.      * @return string|null
  96.      */
  97.     public function getSlugPart()
  98.     {
  99.         $nodeTranslation $this->getNodeTranslation();
  100.         if ($nodeTranslation) {
  101.             return $nodeTranslation->getFullSlug();
  102.         }
  103.         return null;
  104.     }
  105.     /**
  106.      * @return string
  107.      */
  108.     public function getSlug()
  109.     {
  110.         return $this->getUrl();
  111.     }
  112.     /**
  113.      * @return string
  114.      */
  115.     public function getUrl()
  116.     {
  117.         $nodeTranslation $this->getNodeTranslation();
  118.         if ($nodeTranslation) {
  119.             return $nodeTranslation->getUrl();
  120.         }
  121.         return null;
  122.     }
  123.     /**
  124.      * @return NodeMenuItem|null
  125.      */
  126.     public function getParent()
  127.     {
  128.         if ($this->parent === false) {
  129.             // We need to calculate the parent
  130.             $this->parent $this->menu->getParent($this->node);
  131.         }
  132.         return $this->parent;
  133.     }
  134.     /**
  135.      * @param NodeMenuItem|null|false $parent
  136.      */
  137.     public function setParent($parent false)
  138.     {
  139.         $this->parent $parent;
  140.     }
  141.     /**
  142.      * @param string $class
  143.      *
  144.      * @return NodeMenuItem|null
  145.      */
  146.     public function getParentOfClass($class)
  147.     {
  148.         // Check for namespace alias
  149.         if (strpos($class':') !== false) {
  150.             list($namespaceAlias$simpleClassName) = explode(':'$class);
  151.             $class $this->em->getConfiguration()->getEntityNamespace($namespaceAlias) . '\\' $simpleClassName;
  152.         }
  153.         if ($this->getParent() === null) {
  154.             return null;
  155.         }
  156.         if ($this->parent->getPage() instanceof $class) {
  157.             return $this->parent;
  158.         }
  159.         return $this->parent->getParentOfClass($class);
  160.     }
  161.     /**
  162.      * @return NodeMenuItem[]
  163.      */
  164.     public function getParents()
  165.     {
  166.         $parent $this->getParent();
  167.         $parents = array();
  168.         while ($parent !== null) {
  169.             $parents[] = $parent;
  170.             $parent $parent->getParent();
  171.         }
  172.         return array_reverse($parents);
  173.     }
  174.     /**
  175.      * @param bool $includeHiddenFromNav Include hiddenFromNav nodes
  176.      *
  177.      * @return NodeMenuItem[]
  178.      */
  179.     public function getChildren($includeHiddenFromNav true)
  180.     {
  181.         if (\is_null($this->children)) {
  182.             $children $this->menu->getChildren($this->nodetrue);
  183.             /* @var NodeMenuItem $child */
  184.             foreach ($children as $child) {
  185.                 $child->setParent($this);
  186.             }
  187.             $this->children $children;
  188.         }
  189.         return array_filter($this->children, function (NodeMenuItem $entry) use ($includeHiddenFromNav) {
  190.             if ($entry->getNode()->isHiddenFromNav() && !$includeHiddenFromNav) {
  191.                 return false;
  192.             }
  193.             return true;
  194.         });
  195.     }
  196.     /**
  197.      * @param string $class
  198.      *
  199.      * @return NodeMenuItem[]
  200.      */
  201.     public function getChildrenOfClass($class)
  202.     {
  203.         // Check for namespace alias
  204.         if (strpos($class':') !== false) {
  205.             list($namespaceAlias$simpleClassName) = explode(':'$class);
  206.             $class $this->em->getConfiguration()->getEntityNamespace($namespaceAlias) . '\\' $simpleClassName;
  207.         }
  208.         $result = array();
  209.         $children $this->getChildren();
  210.         foreach ($children as $child) {
  211.             if ($child->getPage() instanceof $class) {
  212.                 $result[] = $child;
  213.             }
  214.         }
  215.         return $result;
  216.     }
  217.     /**
  218.      * Get the first child of class, this is not using the getChildrenOfClass method for performance reasons
  219.      *
  220.      * @param string $class
  221.      *
  222.      * @return NodeMenuItem
  223.      */
  224.     public function getChildOfClass($class)
  225.     {
  226.         // Check for namespace alias
  227.         if (strpos($class':') !== false) {
  228.             list($namespaceAlias$simpleClassName) = explode(':'$class);
  229.             $class $this->em->getConfiguration()->getEntityNamespace($namespaceAlias) . '\\' $simpleClassName;
  230.         }
  231.         foreach ($this->getChildren() as $child) {
  232.             if ($child->getPage() instanceof $class) {
  233.                 return $child;
  234.             }
  235.         }
  236.         return null;
  237.     }
  238.     /**
  239.      * @return HasNodeInterface
  240.      */
  241.     public function getPage()
  242.     {
  243.         return $this->getNodeTranslation()->getPublicNodeVersion()->getRef($this->em);
  244.     }
  245.     /**
  246.      * @return bool
  247.      */
  248.     public function getActive()
  249.     {
  250.         return $this->menu->getActive($this->getSlug());
  251.     }
  252.     /**
  253.      * @return string
  254.      */
  255.     public function getLang()
  256.     {
  257.         return $this->menu->getLocale();
  258.     }
  259. }