diff --git a/core/modules/views/config/schema/views.display.schema.yml b/core/modules/views/config/schema/views.display.schema.yml index d31678f..04e73f2 100644 --- a/core/modules/views/config/schema/views.display.schema.yml +++ b/core/modules/views/config/schema/views.display.schema.yml @@ -34,6 +34,12 @@ views.display.page: weight: type: integer label: 'Weight' + enabled: + type: boolean + label: 'Enabled' + expanded: + type: boolean + label: 'Expanded' menu_name: type: string label: 'Menu name' diff --git a/core/modules/views/src/Plugin/Menu/ViewsMenuLink.php b/core/modules/views/src/Plugin/Menu/ViewsMenuLink.php index 85c2350..1445213 100644 --- a/core/modules/views/src/Plugin/Menu/ViewsMenuLink.php +++ b/core/modules/views/src/Plugin/Menu/ViewsMenuLink.php @@ -9,6 +9,7 @@ use Drupal\Core\Menu\MenuLinkBase; use Drupal\Core\Entity\EntityManagerInterface; +use Drupal\Core\Menu\StaticMenuLinkOverridesInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\views\ViewExecutableFactory; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -31,7 +32,6 @@ class ViewsMenuLink extends MenuLinkBase implements ContainerFactoryPluginInterf 'enabled' => 1, 'title' => 1, 'description' => 1, - 'metadata' => 1, ); /** @@ -139,9 +139,9 @@ public function updateLink(array $new_definition_values, $persist) { $display = &$view->storage->getDisplay($view->current_display); // Just save the title to the original view. $changed = FALSE; - foreach ($new_definition_values as $key => $new_definition_value) { - if (isset($display['display_options']['menu'][$key]) && $display['display_options']['menu'][$key] != $new_definition_values[$key]) { - $display['display_options']['menu'][$key] = $new_definition_values[$key]; + foreach ($overrides as $key => $new_definition_value) { + if (empty($display['display_options']['menu'][$key]) || $display['display_options']['menu'][$key] != $new_definition_value) { + $display['display_options']['menu'][$key] = $new_definition_value; $changed = TRUE; } } diff --git a/core/modules/views/src/Plugin/views/display/Page.php b/core/modules/views/src/Plugin/views/display/Page.php index 7ec3560..9ce148f 100644 --- a/core/modules/views/src/Plugin/views/display/Page.php +++ b/core/modules/views/src/Plugin/views/display/Page.php @@ -132,6 +132,7 @@ protected function defineOptions() { 'title' => array('default' => ''), 'description' => array('default' => ''), 'weight' => array('default' => 0), + 'enabled' => array('default' => 1), 'menu_name' => array('default' => 'main'), 'parent' => array('default' => ''), 'context' => array('default' => ''), @@ -328,6 +329,19 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) { '#markup' => $this->t('Menu selection requires the activation of Menu UI module.'), ); } + $form['menu']['enabled'] = array( + '#type' => 'checkbox', + '#title' => $this->t('Enable menu link'), + '#description' => $this->t('Menu links that are not enabled will not be listed in any menu.'), + '#default_value' => isset($menu['enabled']) ? $menu['enabled'] : 0, + '#states' => array( + 'visible' => array( + array( + ':input[name="menu[type]"]' => array('value' => 'normal'), + ), + ), + ) + ); $form['menu']['weight'] = array( '#title' => $this->t('Weight'), '#type' => 'textfield', diff --git a/core/modules/views/src/Plugin/views/display/PathPluginBase.php b/core/modules/views/src/Plugin/views/display/PathPluginBase.php index d1aee85..c9a8440 100644 --- a/core/modules/views/src/Plugin/views/display/PathPluginBase.php +++ b/core/modules/views/src/Plugin/views/display/PathPluginBase.php @@ -324,6 +324,10 @@ public function getMenuLinks() { $links[$menu_link_id]['title'] = $menu['title']; $links[$menu_link_id]['description'] = $menu['description']; $links[$menu_link_id]['parent'] = $menu['parent']; + $links[$menu_link_id]['enabled'] = $menu['enabled']; + if (isset($menu['expanded'])) { + $links[$menu_link_id]['expanded'] = $menu['expanded']; + } if (isset($menu['weight'])) { $links[$menu_link_id]['weight'] = intval($menu['weight']); diff --git a/core/modules/views/src/Tests/ViewsMenuLinkTest.php b/core/modules/views/src/Tests/ViewsMenuLinkTest.php new file mode 100644 index 0000000..4da964c --- /dev/null +++ b/core/modules/views/src/Tests/ViewsMenuLinkTest.php @@ -0,0 +1,106 @@ +entityManger = $this->container->get('entity.manager'); + $this->menuLinkManager = $this->container->get('plugin.manager.menu.link'); + $this->menuLinkOverrides = $this->container->get('menu_link.static.overrides'); + } + + public function testMenuLinkOverrides() { + /** + * Link from views module. + */ + $views_link = $this->menuLinkManager->getDefinition('views_view:views.test_page_display_menu.page_3'); + $this->assertTrue($views_link['enabled'], 'Menu link is enabled.'); + $this->assertFalse($views_link['expanded'], 'Menu link is not expanded.'); + $views_link['enabled'] = 0; + $views_link['expanded'] = 1; + $this->menuLinkManager->updateDefinition($views_link['id'], $views_link); + $views_link = $this->menuLinkManager->getDefinition($views_link['id']); + $this->assertFalse($views_link['enabled'], 'Menu link is disabled.'); + $this->assertTrue($views_link['expanded'], 'Menu link is expanded.'); + $this->menuLinkManager->rebuild(); + $this->assertFalse($views_link['enabled'], 'Menu link is disabled.'); + $this->assertTrue($views_link['expanded'], 'Menu link is expanded.'); + + /** + * Link from user module. + */ + $user_link = $this->menuLinkManager->getDefinition('user.page'); + $this->assertTrue($user_link['enabled'], 'Menu link is enabled.'); + $user_link['enabled'] = 0; + $views_link['expanded'] = 1; + $this->menuLinkManager->updateDefinition($user_link['id'], $user_link); + $this->assertFalse($user_link['enabled'], 'Menu link is disabled.'); + $this->menuLinkManager->rebuild(); + $this->assertFalse($user_link['enabled'], 'Menu link is disabled.'); + + debug($views_link); + debug($user_link); + + $this->menuLinkOverrides->reload(); + debug($this->menuLinkOverrides->loadOverride($views_link['id'])); + debug($this->menuLinkOverrides->loadOverride($user_link['id'])); + + $this->resetAll(); + + $views_link = $this->menuLinkManager->getDefinition('views_view:views.test_page_display_menu.page_3'); + debug($views_link); + $this->assertFalse($views_link['enabled'], 'Menu link is disabled.'); + $this->assertTrue($views_link['expanded'], 'Menu link is expanded.'); + + $user_link = $this->menuLinkManager->getDefinition('user.page'); + debug($user_link); + $this->assertFalse($user_link['enabled'], 'Menu link is disabled.'); + } + +}