/** * @param ItemInterface $menu * @param array $data * @param array $itemList * @param array $options * * @return \Knp\Menu\ItemInterface */ private function createFromArray(ItemInterface $menu, array $data, array &$itemList, array $options = array()) { $isAllowed = false; foreach ($data as $itemCode => $itemData) { if (!empty($itemList[$itemCode])) { $itemOptions = $itemList[$itemCode]; if (empty($itemOptions['name'])) { $itemOptions['name'] = $itemCode; } if (empty($itemOptions['route']) && empty($itemOptions['uri'])) { $itemOptions['route'] = $itemCode; } if (!empty($itemData['position'])) { $itemOptions['extras']['position'] = $itemData['position']; } $this->moveToExtras($itemOptions, 'translateDomain'); $this->moveToExtras($itemOptions, 'translateParameters'); $newMenuItem = $menu->addChild($itemOptions['name'], array_merge($itemOptions, $options)); if (!empty($itemData['children'])) { $this->createFromArray($newMenuItem, $itemData['children'], $itemList, $options); } $isAllowed = $isAllowed || $newMenuItem->getExtra('isAllowed'); } } $menu->setExtra('isAllowed', $isAllowed); if ($menu->getExtra('hideIfEmpty') && $menu->hasChildren()) { $willDisplaySomeChildren = false; foreach ($menu->getChildren() as $child) { if ($child->isDisplayed() && $child->getExtra('isAllowed')) { $willDisplaySomeChildren = true; break; } } if (!$willDisplaySomeChildren) { $menu->setDisplay(false); } } }
/** * Set uri, display context to menu item * * @param MenuItemInterface $item * @param array $routeParameters * @param array $options * * @return MenuFactoryInterface */ protected function setContext(MenuItemInterface $item, array $routeParameters = array(), array $options = array()) { $display = true; $rootItem = !$item->getName(); $token = $this->security->getToken(); if ($token) { if ($options['roles'] && !$this->security->isGranted($options['roles'])) { $display = false; } if ($display) { foreach ((array) $item->getExtra('oids') as $oidItem) { if (!$this->security->isGranted($oidItem['permissions'], $oidItem['oid'])) { $display = false; break; } } } } if ($options['route'] && !$rootItem) { $acceptedRouteParameters = array_intersect_key($routeParameters, $options['routeAcceptedParameters']); if ($options['routeRequiredParameters'] === $options['routeAcceptedParameters']) { $uri = $this->router->generate($options['route'], $acceptedRouteParameters, $options['routeAbsolute']); $item->setUri($uri); } else { $display = false; } } if (!$display) { if ($options['showNonAuthorized'] && !$token) { $display = true; } if ($options['showAsText']) { $display = true; $item->setUri(null); } } if (!$display) { $item->setDisplay(false); } return $this; }