/** * Reorder menu based on position attribute * * @param ItemInterface $menu */ protected function sort(ItemInterface $menu) { if ($menu->hasChildren() && $menu->getDisplayChildren()) { $orderedChildren = []; $unorderedChildren = []; $hasOrdering = false; $children = $menu->getChildren(); foreach ($children as &$child) { if ($child->hasChildren() && $child->getDisplayChildren()) { $this->sort($child); } $position = $child->getExtra('position'); if ($position !== null) { $orderedChildren[$child->getName()] = (int) $position; $hasOrdering = true; } else { $unorderedChildren[] = $child->getName(); } } if ($hasOrdering) { asort($orderedChildren); $menu->reorderChildren(array_merge(array_keys($orderedChildren), $unorderedChildren)); } } }
/** * @param \Knp\Menu\ItemInterface $item * @param $attributes * @param $options * @return \Nette\Utils\Html|null */ protected function getList(ItemInterface $item, $attributes, $options) { if (!$item->hasChildren() || 0 === $options['depth'] || !$item->getDisplayChildren()) { return null; } $list = Html::el('ul', $attributes); foreach ($this->getChildren($item, $options) as $child) { $list->add($child); } return $list; }
protected function renderList(ItemInterface $item, array $attributes, array $options) { /** * Return an empty string if any of the following are true: * a) The menu has no children eligible to be displayed * b) The depth is 0 * c) This menu item has been explicitly set to hide its children */ if (!$item->hasChildren() || 0 === $options['depth'] || !$item->getDisplayChildren()) { return ''; } $html = $this->format('<ul>', 'ul', $item->getLevel(), $options); $html .= $this->renderChildren($item, $options); $html .= $this->format('</ul>', 'ul', $item->getLevel(), $options); return $html; }
/** * @see RendererInterface::render */ public function render(ItemInterface $item, array $options = array()) { $options = array_merge($this->getDefaultOptions(), $options); /** * Return an empty string if any of the following are true: * a) The menu has no children eligible to be displayed * b) The depth is 0 * c) This menu item has been explicitly set to hide its children */ if (!$item->hasChildren() || 0 === $options['depth'] || !$item->getDisplayChildren()) { return ''; } $html = $this->format('<ul'.$this->renderHtmlAttributes($item->getAttributes()).'>', 'ul', $item->getLevel()); $html .= $this->renderChildren($item, $options); $html .= $this->format('</ul>', 'ul', $item->getLevel()); return $html; }
/** * Concats the appropriate classes for menu links * * @param ItemInterface $item * @param MatcherInterface $matcher * @param array $options */ public function buildClasses(ItemInterface &$item, MatcherInterface &$matcher, $options) { $showChildren = $item->hasChildren() && $item->getDisplayChildren(); $isAncestor = $matcher->isAncestor($item, $options["matchingDepth"]); $isCurrent = $matcher->isCurrent($item); $class = $item->getAttribute("class"); $classes = $class ? " {$class}" : ""; $classes .= $isCurrent ? " {$options["currentClass"]}" : ""; $classes .= $isAncestor ? " {$options["ancestorClass"]}" : ""; $classes .= $isAncestor && $this->invisibleChildSelected($item, $matcher) ? " {$options["currentClass"]}" : ""; $classes .= $item->actsLikeFirst() ? " {$options["firstClass"]}" : ""; $classes .= $item->actsLikeLast() ? " {$options["lastClass"]}" : ""; $item->setAttribute("class", trim($classes)); }
/** * @param ItemInterface $item * @param integer|null $depth the depth until which children should be exported (null means unlimited) * * @return array */ public function toArray(ItemInterface $item, $depth = null) { $array = array('name' => $item->getName(), 'label' => $item->getLabel(), 'uri' => $item->getUri(), 'attributes' => $item->getAttributes(), 'labelAttributes' => $item->getLabelAttributes(), 'linkAttributes' => $item->getLinkAttributes(), 'childrenAttributes' => $item->getChildrenAttributes(), 'extras' => $item->getExtras(), 'display' => $item->isDisplayed(), 'displayChildren' => $item->getDisplayChildren(), 'current' => $item->isCurrent()); // export the children as well, unless explicitly disabled if (0 !== $depth) { $childDepth = null === $depth ? null : $depth - 1; $array['children'] = array(); foreach ($item->getChildren() as $key => $child) { $array['children'][$key] = $this->toArray($child, $childDepth); } } return $array; }