diff --git a/Routing/MenuComposer.php b/Routing/MenuComposer.php index 224a29083..29e998f0e 100644 --- a/Routing/MenuComposer.php +++ b/Routing/MenuComposer.php @@ -1,6 +1,6 @@ routeCollection->all() as $routeKey => $route) { if ($route->hasOption('menus')) { - foreach ($route->getOption('menus') as $menuKey => $params) { - if ($menuId === $menuKey) { - $route = array(); - $route['route'] = $routeKey; - $route['label'] = $params['label']; - $route['helper'] = - (isset($params['helper'])) ? $params['helper'] : null; - - //add route to the routes array, avoiding duplicate 'order' - // to erase previously added - if (!isset($routes[$params['order']])) { - $routes[$params['order']] = $route; - } else { - $routes[$params['order'] + 1 ] = $route; - } - - } + if (array_key_exists($menuId, $route->getOption('menus'))) { + $route = $route->getOption('menus')[$menuId]; + + $route['key'] = $routeKey; + + $order = $this->resolveOrder($routes, $route['order']); + //we do not want to duplicate order information + unset($route['order']); + $routes[$order] = $route; } } } @@ -72,5 +64,22 @@ class MenuComposer return $routes; } + + /** + * recursive function to resolve the order of a array of routes. + * If the order chosen in routing.yml is already in used, find the + * first next order available. + * + * @param array $routes the routes previously added + * @param int $order + * @return int + */ + private function resolveOrder($routes, $order){ + if (isset($routes[$order])) { + return $this->resolveOrder($routes, $order + 1); + } else { + return $order; + } + } } diff --git a/Tests/Fixtures/App/config/routing.yml b/Tests/Fixtures/App/config/routing.yml index 64f4b9f27..9e42a3faf 100644 --- a/Tests/Fixtures/App/config/routing.yml +++ b/Tests/Fixtures/App/config/routing.yml @@ -8,7 +8,8 @@ chill_main_dummy_0: menus: dummy0: order: 50 - label: 'test0' + label: test0 + otherkey: othervalue dummy1: order: 50 label: test dummy 1 diff --git a/Tests/Services/MenuComposerTest.php b/Tests/Services/MenuComposerTest.php index ee4fccfa9..99b23d23b 100644 --- a/Tests/Services/MenuComposerTest.php +++ b/Tests/Services/MenuComposerTest.php @@ -49,18 +49,37 @@ class MenuComposerTest extends KernelTestCase 'Failing to assert that routes are ordered'); } } - $this->assertSame(array( + + //check that the array are identical, order is not important : + + $expected = array( 50 => array( - 'route' => 'chill_main_dummy_0', + 'key' => 'chill_main_dummy_0', 'label' => 'test0', - 'helper'=> null + 'otherkey' => 'othervalue' ), 51 => array( - 'route' => 'chill_main_dummy_1', + 'key' => 'chill_main_dummy_1', 'label' => 'test1', 'helper'=> 'great helper' - ) + )); + + + foreach ($expected as $order => $route ){ - ), $routes); + } + + //compare arrays + foreach($expected as $order => $route) { + //check the key are the one expected + $this->assertTrue(isset($routes[$order])); + + if (isset($routes[$order])){ #avoid an exception if routes with order does not exists + //sort arrays. Order matters for phpunit::assertSame + ksort($route); + ksort($routes[$order]); + $this->assertSame($route, $routes[$order]); + } + } } }