Пример #1
0
 /**
  * Sort the menu based on weight
  *
  * @param ItemInterface $menuItemA
  * @param ItemInterface $menuItemB
  *
  * @return int
  */
 public static function menuSort(ItemInterface $menuItemA, ItemInterface $menuItemB)
 {
     if ($menuItemA->getExtra('weight') == $menuItemB->getExtra('weight')) {
         return 0;
     }
     return $menuItemA->getExtra('weight') < $menuItemB->getExtra('weight') ? -1 : 1;
 }
Пример #2
0
 public function matchItem(ItemInterface $item)
 {
     if (null === $this->request) {
         return null;
     }
     $route = $this->request->attributes->get('_route');
     if (null === $route) {
         return null;
     }
     $routes = (array) $item->getExtra('routes', array());
     $parameters = (array) $item->getExtra('routesParameters', array());
     foreach ($routes as $testedRoute) {
         if (is_string($testedRoute)) {
             $testedRoute = array('route' => $testedRoute);
             // BC layer for the configuration of route params
             if (isset($parameters[$testedRoute['route']])) {
                 $testedRoute['parameters'] = $parameters[$testedRoute['route']];
                 trigger_error('Using the routeParameters extra is deprecated. The parameters should be passed along the route.', E_USER_DEPRECATED);
             }
         }
         if (!is_array($testedRoute)) {
             throw new \InvalidArgumentException('Routes extra items must be strings or arrays.');
         }
         if ($this->isMatchingRoute($testedRoute)) {
             return true;
         }
     }
     return null;
 }
Пример #3
0
 /**
  * Checks whether an item is current.
  *
  * If the voter is not able to determine a result,
  * it should return null to let other voters do the job.
  *
  * @param ItemInterface $item
  *
  * @return boolean|null
  */
 public function matchItem(ItemInterface $item)
 {
     if ($item->getExtra('link', false) && $this->parentControl) {
         $presenter = $this->parentControl->getPresenter(true);
         $item->setCurrent(call_user_func_array(array($presenter, 'isLinkCurrent'), $item->getExtra('link')));
         return $item->isCurrent();
     }
     return null;
 }
Пример #4
0
 /**
  * unless 'raw' extra isn't set to true, we try to translate the label.
  *
  * @param ItemInterface $item
  * @param array         $options
  *
  * @return string
  */
 protected function renderLabel(ItemInterface $item, array $options)
 {
     if ($options['allow_safe_labels'] && $item->getExtra('safe_label', false)) {
         return $item->getLabel();
     }
     if ($item->getExtra('raw', false) !== false) {
         return $this->escape($item->getLabel());
     }
     return $this->escape(trans($item->getLabel()));
 }
Пример #5
0
 protected function addNavLinkRoute(ItemInterface $menu, $label, $route, $routeParameters = array())
 {
     $item = $menu->addChild($label, array('route' => $route, 'routeParameters' => $routeParameters));
     $item->setExtra('translation_domain', $menu->getExtra('translation_domain'));
     $menu->setExtra('request_uri', $menu->getExtra('request_uri'));
     if ($item->getUri() == $menu->getExtra('request_uri')) {
         $item->setAttribute('class', 'active');
     }
     return $item;
 }
Пример #6
0
 /**
  * Checks whether an item is current.
  *
  * If the voter is not able to determine a result,
  * it should return null to let other voters do the job.
  *
  * @param ItemInterface $item
  * @return boolean|null
  */
 public function matchItem(ItemInterface $item)
 {
     /* @var $request \Symfony\Component\HttpFoundation\Request */
     $request = $this->container->get('request');
     if ($item->getUri() === $request->getRequestUri()) {
         return true;
     }
     if ($item->getExtra('routes') !== null && in_array($request->attributes->get('_route'), $item->getExtra('routes'))) {
         return true;
     }
     return null;
 }
Пример #7
0
 /**
  * @param ItemInterface $parent
  * @param array         $routes
  * @param string|null   $basePath
  */
 public static function addHiddenItems($parent, $routes, $basePath = null)
 {
     $parent->setDisplayChildren(false);
     if (null === $basePath && null !== $parent->getExtra('routes') && isset($parent->getExtra('routes')[0]['route'])) {
         $basePathArray = explode("_", $parent->getExtra('routes')[0]['route']);
         $basePathArray[count($basePathArray) - 1] = '%s';
         $basePath = implode("_", $basePathArray);
     }
     foreach ($routes as $routeIndex => $routeParameters) {
         $route = sprintf($basePath, $routeIndex);
         $parent->addChild($route, ['route' => $route, 'routeParameters' => $routeParameters]);
     }
 }
Пример #8
0
 /**
  * {@inheritdoc}
  */
 public function matchItem(ItemInterface $item)
 {
     $admin = $item->getExtra('admin');
     $match = null;
     if ($admin instanceof AdminInterface && $admin->hasRoute('list') && $admin->isGranted('LIST') && $this->request && $this->request->get('_sonata_admin') == $admin->getCode()) {
         $match = true;
     }
     $route = $item->getExtra('route');
     if ($route && $this->request && $route == $this->request->get('_route')) {
         $match = true;
     }
     return $match;
 }
Пример #9
0
 /**
  * {@inheritdoc}
  */
 public function matchItem(ItemInterface $item)
 {
     if (($page = $this->getPage()) && $page->getId() !== null) {
         return $item->getExtra('_page_id', null) === $page->getId();
     }
     return;
 }
Пример #10
0
 /**
  * @param ItemInterface $item
  *
  * @return bool|null
  */
 public function matchItem(ItemInterface $item)
 {
     if (null === $this->getRequest()) {
         return null;
     }
     $route = $this->getRequest()->attributes->get('_route');
     $routeParameters = $this->getRequest()->attributes->get('_route_params');
     if (null === $route) {
         return null;
     }
     $routes = (array) $item->getExtra('routes', array());
     foreach ($routes as $testedRoute) {
         if ($route == $testedRoute['route']) {
             if (is_array($routeParameters) && 0 < count($routeParameters)) {
                 if (isset($testedRoute['parameters']) && is_array($testedRoute['parameters'])) {
                     $matching = true;
                     foreach ($routeParameters as $index => $value) {
                         if ('_' != substr($index, 0, 1)) {
                             if (!isset($testedRoute['parameters'][$index]) || ($testedRoute['parameters'][$index] != $value && 0 < $testedRoute['parameters'][$index] || !is_numeric($value))) {
                                 $matching = false;
                             }
                         }
                     }
                     if ($matching) {
                         return true;
                     }
                 }
             } else {
                 return true;
             }
         }
     }
     return null;
 }
Пример #11
0
 protected function modifyItem(ItemInterface $item, array $options)
 {
     if (!$item->getExtra('remove_leaf', false)) {
         return;
     }
     if (!$item->hasChildren()) {
         $this->removeItem($item);
     }
 }
Пример #12
0
 public function decorate(KnpMenuItem $knpMenuItem, AdminMenuItem $adminMenuItem)
 {
     if ($adminMenuItem instanceof RoutableItem && $adminMenuItem->getRoute()) {
         $knpMenuItem->setUri($this->router->generate($adminMenuItem->getRoute(), $adminMenuItem->getRouteParameters()));
         $routes = $knpMenuItem->getExtra('routes', array());
         $routes[] = array('route' => $adminMenuItem->getRoute(), 'parameters' => $adminMenuItem->getRouteParameters());
         $knpMenuItem->setExtra('routes', $routes);
     }
 }
Пример #13
0
 /**
  * {@inheritDoc}
  */
 public function matchItem(ItemInterface $item)
 {
     if ($prefix = $item->getExtra('prefix_match', $this->defaultActive)) {
         if (strpos($this->getRequestUri(), $item->getUri()) === 0) {
             return true;
         }
     }
     return null;
 }
 /**
  * {@inheritDoc}
  */
 public function matchItem(ItemInterface $item = null)
 {
     if (!$this->request) {
         return null;
     }
     $content = $item->getExtra('content');
     if (null !== $content && $this->request->attributes->has($this->requestKey) && $this->request->attributes->get($this->requestKey) instanceof $this->childClass && $this->request->attributes->get($this->requestKey)->getParentDocument() === $content) {
         return true;
     }
     return null;
 }
Пример #15
0
 public function decorate(KnpMenuItem $knpMenuItem, AdminMenuItem $adminMenuItem)
 {
     if ($adminMenuItem instanceof ElementItem && $adminMenuItem->hasOption('elements')) {
         $routes = $knpMenuItem->getExtra('routes', array());
         /** @var Element $element */
         foreach ($adminMenuItem->getOption('elements') as $element) {
             $routes[] = array('route' => $element->getRoute(), 'parameters' => $element->getRouteParameters());
         }
         $knpMenuItem->setExtra('routes', $routes);
     }
 }
 /**
  * {@inheritDoc}
  */
 public function matchItem(ItemInterface $item = null)
 {
     if (!$this->request) {
         return null;
     }
     $content = $item->getExtra('content');
     if (null !== $content && $this->request->attributes->has($this->requestKey) && $this->request->attributes->get($this->requestKey) === $content) {
         return true;
     }
     return null;
 }
Пример #17
0
 /**
  * @inheritdoc
  */
 public function matchItem(ItemInterface $item)
 {
     if (!$this->validateRequestElement()) {
         return null;
     }
     foreach ($item->getExtra('routes', array()) as $testedRoute) {
         if ($this->isRouteMatchingElement($this->getRequestElement(), $testedRoute['parameters'])) {
             return true;
         }
     }
     return false;
 }
Пример #18
0
 public function matchItem(ItemInterface $item)
 {
     if (null === $this->request) {
         return;
     }
     if (null === ($route = $this->request->route())) {
         return;
     }
     $routes = $item->getExtra('routes', []);
     foreach ($routes as $probe) {
         if ($probe === $route->getName()) {
             return true;
         }
     }
     $patterns = $item->getExtra('patterns', []);
     foreach ($patterns as $pattern) {
         if ($pattern && preg_match($pattern, $route->getName())) {
             return true;
         }
     }
 }
 /**
  * @param ItemInterface $item
  * @return bool|null
  */
 public function matchItem(ItemInterface $item)
 {
     if (null === $this->request) {
         return null;
     }
     $route = $this->request->attributes->get('_route');
     if (null === $route) {
         return null;
     }
     $routes = (array) $item->getExtra('routes', []);
     $parameters = (array) $item->getExtra('routesParameters', []);
     foreach ($routes as $testedRoute) {
         if (!$this->routeMatch($testedRoute, $route)) {
             continue;
         }
         if (isset($parameters[$testedRoute]) && !$this->parametersMatch($parameters[$testedRoute])) {
             return null;
         }
         return true;
     }
     return null;
 }
Пример #20
0
 /**
  * {@inheritDoc}
  */
 public function matchItem(ItemInterface $item)
 {
     if (!$this->request) {
         return null;
     }
     $content = $item->getExtra('content');
     if ($content instanceof Route && $content->hasOption('currentUriPrefix')) {
         $currentUriPrefix = $content->getOption('currentUriPrefix');
         $currentUriPrefix = str_replace('{_locale}', $this->request->getLocale(), $currentUriPrefix);
         if (0 === strncmp($this->request->getPathinfo(), $currentUriPrefix, strlen($currentUriPrefix))) {
             return true;
         }
     }
     return null;
 }
Пример #21
0
 public function matchItem(ItemInterface $item)
 {
     if (null === $this->request) {
         return null;
     }
     $route = $this->request->attributes->get('_route');
     if (null === $route) {
         return null;
     }
     $routes = (array) $item->getExtra('routes', array());
     $parameters = (array) $item->getExtra('routesParameters', array());
     foreach ($routes as $testedRoute) {
         if (is_string($testedRoute)) {
             $testedRoute = array('route' => $testedRoute);
         }
         if (!is_array($testedRoute)) {
             throw new \InvalidArgumentException('Routes extra items must be strings or arrays.');
         }
         if ($this->isMatchingRoute($testedRoute)) {
             return true;
         }
     }
     return null;
 }
Пример #22
0
 /**
  * Checks whether an item is current.
  *
  * If the voter is not able to determine a result,
  * it should return null to let other voters do the job.
  *
  * @param ItemInterface $item
  *
  * @return boolean|null
  */
 public function matchItem(ItemInterface $item)
 {
     $request = $this->container->get("request");
     if (is_null($request)) {
         return null;
     }
     $route = $request->attributes->get('_route');
     if (is_null($route)) {
         return null;
     }
     $itemRoutes = (array) $item->getExtra('routes', array());
     if (in_array($route, $itemRoutes, true)) {
         return true;
     }
     foreach ($itemRoutes as $itemRoute) {
         if (is_array($itemRoute) && isset($itemRoute["route"]) && $route === $itemRoute["route"]) {
             return true;
         }
     }
     return null;
 }
Пример #23
0
 /**
  * match item to route
  *
  * @param ItemInterface $item
  *
  * @return null|boolean true if the item is current, null if not
  */
 public function matchItem(ItemInterface $item)
 {
     if (null === $this->request) {
         return null;
     }
     $route = $this->request->attributes->get('_route');
     if (null === $route) {
         return null;
     }
     $routes = (array) $item->getExtra('routes', array());
     foreach ($routes as $itemRoute) {
         if (isset($itemRoute['route'])) {
             if (is_string($itemRoute['route'])) {
                 $itemRoute = array('route' => $itemRoute['route'], 'pattern' => '/' . $itemRoute['route'] . '/');
                 if ($this->isMatchingRoute($itemRoute)) {
                     return true;
                 }
             }
         }
     }
     return null;
 }
 /**
  * @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);
         }
     }
 }
 protected function renderLinkElement(ItemInterface $item, array $options)
 {
     $uri = $item->getExtra('href') ? $item->getExtra('href') : $item->getUri();
     $displayMode = $item->getExtra('display') ? $item->getExtra('display') : 'normal';
     return sprintf('<i class="%s user-action" data-url="%s" data-toggle="tooltip" data-placement="left" title="%s" data-display-mode="%s"></i>', $item->getExtra('icon'), $this->escape($uri), $this->renderLabel($item, $options), $displayMode);
 }
Пример #26
0
 /**
  * @param \Knp\Menu\ItemInterface $item
  * @param \Symfony\Component\HttpFoundation\ParameterBag $requestAttributes
  * @param \FSi\Bundle\AdminBundle\Admin\RedirectableElement $element
  */
 function it_returns_true_if_element_in_current_request_redirects_to_the_element_in_item($item, $requestAttributes, $element)
 {
     $requestAttributes->has('element')->willReturn(true);
     $requestAttributes->get('element')->willReturn($element);
     $element->getId()->willReturn('element_id');
     $element->getSuccessRouteParameters()->willReturn(array('element' => 'element_after_success'));
     $item->getExtra('routes', array())->willReturn(array(array('parameters' => array('element' => 'element_after_success'))));
     $this->matchItem($item)->shouldReturn(true);
 }
Пример #27
0
 protected function renderLinkElement(ItemInterface $item, array $options)
 {
     $uri = $item->getExtra('href') ? $item->getExtra('href') : $item->getUri();
     return sprintf('<a href="%s">%s</a>', $this->escape($uri), $this->renderLabel($item, $options));
 }
Пример #28
0
 /**
  * @param \Knp\Menu\ItemInterface $item
  * @param array $options
  * @return string
  */
 protected function getText(ItemInterface $item, array $options)
 {
     if ($options['allow_safe_labels'] && $item->getExtra('safe_label', false)) {
         return $item->getLabel();
     }
     return $this->escape($item->getLabel());
 }
Пример #29
0
 /**
  * @param Item  $item
  * @param array $options
  *
  * @return string
  */
 protected function renderDivider(Item $item, array $options = array())
 {
     return $this->format('<li' . $this->renderHtmlAttributes(array('class' => 'divider' . $item->getExtra('divider'))) . '>', 'li', $item->getLevel(), $options);
 }
Пример #30
0
 /**
  * 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;
 }