public function render(ItemInterface $item, array $options = array()) { $options = array_merge($this->defaultOptions, $options); $translator = $options['translator']; $itemIterator = new \Knp\Menu\Iterator\RecursiveItemIterator($item); $iterator = new \RecursiveIteratorIterator($itemIterator, \RecursiveIteratorIterator::SELF_FIRST); $items = []; foreach ($iterator as $item) { $translatedLabel = $translator->trans($item->getLabel()); $id = $item->getName(); $itemData = ['id' => strtolower($item->getName()), 'name' => $translatedLabel, 'uri' => $item->getUri()]; $itemData['has_children'] = $item->hasChildren(); $parentId = $item->getParent()->getName(); if ($parentId !== $id) { $itemData['parent'] = strtolower($parentId); if (!isset($items[$parentId]['children'])) { $items[$parentId]['children'] = []; } $items[$parentId]['children'][] = $itemData; } if (isset($items[$id])) { $items[$id] = array_merge($itemData, $items[$id]); } else { $items[$id] = $itemData; } } return $items; }
/** * Set active class to current item and all its parents (so it is automatically opened) * * @param ItemInterface $item */ protected function setActive(ItemInterface $item = null) { if ($item) { $this->setActive($item->getParent()); $item->setAttribute('class', $item->getAttribute('class', '') . ' active'); } }
protected function addSubMenu(ItemInterface $menu, $label) { $menu->addChild($label, array('uri' => '#')); $menu[$label]->setAttribute('class', 'dropdown'); if ($menu->getParent()) { $menu[$label]->setAttribute('class', 'dropdown-submenu'); $menu[$label]->setExtra('submenu', true); } $menu[$label]->setChildrenAttribute('class', 'dropdown-menu'); $menu[$label]->setChildrenAttribute('role', 'menu'); $menu[$label]->setLinkAttribute('class', 'dropdown-toggle'); $menu[$label]->setLinkAttribute('data-toggle', 'dropdown'); $menu[$label]->setLinkAttribute('role', 'button'); $menu[$label]->setLinkAttribute('aria-expanded', 'false'); }