/** * Responds to GET requests. * * Returns a menu tree for the specified menu name. * * @param int $menu_name * The machine name of the Drupal menu. * * @return \Drupal\rest\ResourceResponse * The response containing the menu tree. * * @throws \Symfony\Component\HttpKernel\Exception\HttpException */ public function get($menu_name = NULL) { if ($menu_name) { // Get menu tree resource config, set at /admin/config/services/menutree. $config = \Drupal::config('menutree_resource.services_settings'); $services_menus = $config->get('services_menus'); // Only allow a response if the menu is in config if (in_array($menu_name, array_filter(array_values($services_menus)))) { $menu_tree = \Drupal::menuTree(); $parameters = new MenuTreeParameters(); $parameters->onlyEnabledLinks(); $tree = $menu_tree->load($menu_name, $parameters); if (!empty($tree)) { $manipulators = array(array('callable' => 'menu.default_tree_manipulators:checkAccess'), array('callable' => 'menu.default_tree_manipulators:generateIndexAndSort')); $tree = $menu_tree->transform($tree, $manipulators); $build = $menu_tree->build($tree); // Clean the menu tree so it's ready for serialisation in a resource response. $items = $this->clean_tree($build['#items']); return new ResourceResponse($items); } throw new NotFoundHttpException(t('Menu with name @menu_name was not found', array('@menu_name' => $menu_name))); } throw new NotFoundHttpException(t('Menu tree @menu_name not allowed.', array('@menu_name' => $menu_name))); } throw new HttpException(t('No menu name was provided')); }
/** * Tests the loadTreeData method. */ public function testLoadTree() { $this->addMenuLink('test1', ''); $this->addMenuLink('test2', 'test1'); $this->addMenuLink('test3', 'test2'); $this->addMenuLink('test4'); $this->addMenuLink('test5', 'test4'); $data = $this->treeStorage->loadTreeData('tools', new MenuTreeParameters()); $tree = $data['tree']; $this->assertEqual(count($tree['test1']['subtree']), 1); $this->assertEqual(count($tree['test1']['subtree']['test2']['subtree']), 1); $this->assertEqual(count($tree['test1']['subtree']['test2']['subtree']['test3']['subtree']), 0); $this->assertEqual(count($tree['test4']['subtree']), 1); $this->assertEqual(count($tree['test4']['subtree']['test5']['subtree']), 0); $parameters = new MenuTreeParameters(); $parameters->setActiveTrail(array('test4', 'test5')); $data = $this->treeStorage->loadTreeData('tools', $parameters); $tree = $data['tree']; $this->assertEqual(count($tree['test1']['subtree']), 1); $this->assertFalse($tree['test1']['in_active_trail']); $this->assertEqual(count($tree['test1']['subtree']['test2']['subtree']), 1); $this->assertFalse($tree['test1']['subtree']['test2']['in_active_trail']); $this->assertEqual(count($tree['test1']['subtree']['test2']['subtree']['test3']['subtree']), 0); $this->assertFalse($tree['test1']['subtree']['test2']['subtree']['test3']['in_active_trail']); $this->assertEqual(count($tree['test4']['subtree']), 1); $this->assertTrue($tree['test4']['in_active_trail']); $this->assertEqual(count($tree['test4']['subtree']['test5']['subtree']), 0); $this->assertTrue($tree['test4']['subtree']['test5']['in_active_trail']); // Add some conditions to ensure that conditions work as expected. $parameters = new MenuTreeParameters(); $parameters->addCondition('parent', 'test1'); $data = $this->treeStorage->loadTreeData('tools', $parameters); $this->assertEqual(count($data['tree']), 1); $this->assertEqual($data['tree']['test2']['definition']['id'], 'test2'); $this->assertEqual($data['tree']['test2']['subtree'], []); // Test for only enabled links. $link = $this->treeStorage->load('test3'); $link['enabled'] = FALSE; $this->treeStorage->save($link); $link = $this->treeStorage->load('test4'); $link['enabled'] = FALSE; $this->treeStorage->save($link); $link = $this->treeStorage->load('test5'); $link['enabled'] = FALSE; $this->treeStorage->save($link); $parameters = new MenuTreeParameters(); $parameters->onlyEnabledLinks(); $data = $this->treeStorage->loadTreeData('tools', $parameters); $this->assertEqual(count($data['tree']), 1); $this->assertEqual($data['tree']['test1']['definition']['id'], 'test1'); $this->assertEqual(count($data['tree']['test1']['subtree']), 1); $this->assertEqual($data['tree']['test1']['subtree']['test2']['definition']['id'], 'test2'); $this->assertEqual($data['tree']['test1']['subtree']['test2']['subtree'], []); }
/** * Tests onlyEnabledLinks(). * * @covers ::onlyEnabledLinks */ public function testOnlyEnabledLinks() { $parameters = new MenuTreeParameters(); $parameters->onlyEnabledLinks(); $this->assertEquals(1, $parameters->conditions['enabled']); }