diff --git a/core/modules/menu/lib/Drupal/menu/Access/DeleteLinkAccessCheck.php b/core/modules/menu/lib/Drupal/menu/Access/DeleteLinkAccessCheck.php deleted file mode 100644 index 45560dc..0000000 --- a/core/modules/menu/lib/Drupal/menu/Access/DeleteLinkAccessCheck.php +++ /dev/null @@ -1,37 +0,0 @@ -attributes->get('menu_link')) { - // Links defined via hook_menu may not be deleted. Updated items are an - // exception, as they can be broken. - return $menu_link->module !== 'system' || $menu_link->updated; - } - return FALSE; - } -} diff --git a/core/modules/menu/lib/Drupal/menu/MenuFormController.php b/core/modules/menu/lib/Drupal/menu/MenuFormController.php index bedb08b..6573865 100644 --- a/core/modules/menu/lib/Drupal/menu/MenuFormController.php +++ b/core/modules/menu/lib/Drupal/menu/MenuFormController.php @@ -174,10 +174,8 @@ public function menuNameExists($value) { */ protected function actions(array $form, array &$form_state) { $actions = parent::actions($form, $form_state); - $menu = $this->entity; - $system_menus = menu_list_system_menus(); - $actions['delete']['#access'] = !$menu->isNew() && !isset($system_menus[$menu->id()]); + $actions['delete']['#access'] = !$this->entity->isNew() && $this->entity->access('delete'); // Add the language configuration submit handler. This is needed because the // submit button has custom submit handlers. @@ -223,8 +221,10 @@ public function languageConfigurationSubmit(array &$form, array &$form_state) { */ public function save(array $form, array &$form_state) { $menu = $this->entity; + // @todo Get rid of menu_list_system_menus() https://drupal.org/node/1882552 + // Supposed menu item declared by hook_menu() + // Should be moved to submitOverviewForm() $system_menus = menu_list_system_menus(); - if (!$menu->isNew() || isset($system_menus[$menu->id()])) { $this->submitOverviewForm($form, $form_state); } @@ -354,31 +354,27 @@ protected function buildOverviewTreeForm($tree, $delta) { ); // Build a list of operations. $operations = array(); - $links = array(); - $links['edit'] = array( + $operations['edit'] = array( 'title' => t('Edit'), 'href' => 'admin/structure/menu/item/' . $item['mlid'] . '/edit', ); - $operations['edit'] = array('#type' => 'link', '#title' => t('Edit'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/edit'); // Only items created by the menu module can be deleted. - if ($item['module'] == 'menu' || $item['updated'] == 1) { - $links['delete'] = array( + if ($item->access('delete')) { + $operations['delete'] = array( 'title' => t('Delete'), 'href' => 'admin/structure/menu/item/' . $item['mlid'] . '/delete', ); - $operations['delete'] = array('#type' => 'link', '#title' => t('Delete'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/delete'); } // Set the reset column. - elseif ($item['module'] == 'system' && $item['customized']) { - $links['reset'] = array( + elseif ($item->access('reset')) { + $operations['reset'] = array( 'title' => t('Reset'), 'href' => 'admin/structure/menu/item/' . $item['mlid'] . '/reset', ); - $operations['reset'] = array('#type' => 'link', '#title' => t('Reset'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/reset'); } $form[$mlid]['operations'] = array( '#type' => 'operations', - '#links' => $links, + '#links' => $operations, ); } diff --git a/core/modules/menu/lib/Drupal/menu/MenuListController.php b/core/modules/menu/lib/Drupal/menu/MenuListController.php index 139c40b..a9db41e 100644 --- a/core/modules/menu/lib/Drupal/menu/MenuListController.php +++ b/core/modules/menu/lib/Drupal/menu/MenuListController.php @@ -49,16 +49,16 @@ public function getOperations(EntityInterface $entity) { if (isset($operations['edit'])) { $operations['edit']['title'] = t('Edit menu'); + $operations['add'] = array( + 'title' => t('Add link'), + 'href' => $uri['path'] . '/add', + 'options' => $uri['options'], + 'weight' => 20, + ); } if (isset($operations['delete'])) { $operations['delete']['title'] = t('Delete menu'); } - $operations['add'] = array( - 'title' => t('Add link'), - 'href' => $uri['path'] . '/add', - 'options' => $uri['options'], - 'weight' => 20, - ); return $operations; } diff --git a/core/modules/menu/menu.module b/core/modules/menu/menu.module index 6e208c3..36cedbe 100644 --- a/core/modules/menu/menu.module +++ b/core/modules/menu/menu.module @@ -125,7 +125,6 @@ function menu_menu() { */ function menu_entity_info(&$entity_info) { $entity_info['menu']['controllers']['list'] = 'Drupal\menu\MenuListController'; - $entity_info['menu']['controllers']['access'] = 'Drupal\menu\MenuAccessController'; $entity_info['menu']['uri_callback'] = 'menu_uri'; $entity_info['menu']['controllers']['form'] = array( 'add' => 'Drupal\menu\MenuFormController', diff --git a/core/modules/menu/menu.routing.yml b/core/modules/menu/menu.routing.yml index d710470..c5a0d10 100644 --- a/core/modules/menu/menu.routing.yml +++ b/core/modules/menu/menu.routing.yml @@ -24,28 +24,28 @@ menu_link_add: defaults: _content: '\Drupal\menu\Controller\MenuController::addLink' requirements: - _permission: 'administer menu' + _entity_create_access: 'menu_link' menu_link_edit: pattern: '/admin/structure/menu/item/{menu_link}/edit' defaults: _entity_form: 'menu_link' requirements: - _permission: 'administer menu' + _entity_access: 'menu_link.update' menu_link_reset: pattern: 'admin/structure/menu/item/{menu_link}/reset' defaults: _entity_form: 'menu_link.reset' requirements: - _permission: 'administer menu' + _entity_access: 'menu_link.reset' menu_link_delete: pattern: 'admin/structure/menu/item/{menu_link}/delete' defaults: _entity_form: 'menu_link.delete' requirements: - _access_menu_delete_link: 'TRUE' + _entity_access: 'menu_link.delete' menu_menu_add: pattern: '/admin/structure/menu/add' diff --git a/core/modules/menu/menu.services.yml b/core/modules/menu/menu.services.yml deleted file mode 100644 index f68094f..0000000 --- a/core/modules/menu/menu.services.yml +++ /dev/null @@ -1,5 +0,0 @@ -services: - access_check.menu.delete_link: - class: Drupal\menu\Access\DeleteLinkAccessCheck - tags: - - { name: access_check } diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkAccessController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkAccessController.php new file mode 100644 index 0000000..664e7da --- /dev/null +++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkAccessController.php @@ -0,0 +1,48 @@ +hasPermission('administer menu'); + if ($access) { + switch ($operation) { + case 'reset': + // Reset allowed for items defined via hook_menu() and customized. + return $entity->module == 'system' && $entity->customized; + + case 'delete': + // Only items created by the menu module can be deleted. + return $entity->module == 'menu' || $entity->updated == 1; + + } + } + return $access; + } + + /** + * {@inheritdoc} + */ + protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) { + return $account->hasPermission('administer menu'); + } + +} diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php index 8eb4458..9d58de9 100644 --- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php +++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php @@ -208,7 +208,7 @@ public function form(array $form, array &$form_state) { protected function actions(array $form, array &$form_state) { $element = parent::actions($form, $form_state); $element['submit']['#button_type'] = 'primary'; - $element['delete']['#access'] = $this->entity->module == 'menu'; + $element['delete']['#access'] = $this->entity->access('delete'); return $element; } diff --git a/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php b/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php index 2adf1b7..3ff0fdf 100644 --- a/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php +++ b/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php @@ -28,6 +28,7 @@ * module = "menu_link", * controllers = { * "storage" = "Drupal\menu_link\MenuLinkStorageController", + * "access" = "Drupal\menu_link\MenuLinkAccessController", * "render" = "Drupal\Core\Entity\EntityRenderController", * "form" = { * "default" = "Drupal\menu_link\MenuLinkFormController" diff --git a/core/modules/menu/lib/Drupal/menu/MenuAccessController.php b/core/modules/system/lib/Drupal/system/MenuAccessController.php similarity index 78% rename from core/modules/menu/lib/Drupal/menu/MenuAccessController.php rename to core/modules/system/lib/Drupal/system/MenuAccessController.php index b7128c0..52b272d 100644 --- a/core/modules/menu/lib/Drupal/menu/MenuAccessController.php +++ b/core/modules/system/lib/Drupal/system/MenuAccessController.php @@ -2,10 +2,10 @@ /** * @file - * Contains \Drupal\menu\MenuAccessController. + * Contains \Drupal\system\MenuAccessController. */ -namespace Drupal\menu; +namespace Drupal\system; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityAccessController; @@ -25,6 +25,7 @@ protected function checkAccess(EntityInterface $entity, $operation, $langcode, A } elseif ($operation == 'delete') { // System menus could not be deleted. + // @todo Refactor in https://drupal.org/node/1882552 $system_menus = menu_list_system_menus(); if (isset($system_menus[$entity->id()])) { return FALSE; @@ -32,7 +33,7 @@ protected function checkAccess(EntityInterface $entity, $operation, $langcode, A } if (in_array($operation, array('update', 'delete'))) { - return user_access('administer menu', $account); + return $account->hasPermission('administer menu'); } } @@ -40,7 +41,7 @@ protected function checkAccess(EntityInterface $entity, $operation, $langcode, A * {@inheritdoc} */ protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) { - return user_access('administer menu', $account); + return $account->hasPermission('administer menu'); } } diff --git a/core/modules/system/lib/Drupal/system/Plugin/Core/Entity/Menu.php b/core/modules/system/lib/Drupal/system/Plugin/Core/Entity/Menu.php index f12e2a6..ef690c2 100644 --- a/core/modules/system/lib/Drupal/system/Plugin/Core/Entity/Menu.php +++ b/core/modules/system/lib/Drupal/system/Plugin/Core/Entity/Menu.php @@ -20,7 +20,8 @@ * label = @Translation("Menu"), * module = "system", * controllers = { - * "storage" = "Drupal\Core\Config\Entity\ConfigStorageController" + * "storage" = "Drupal\Core\Config\Entity\ConfigStorageController", + * "access" = "Drupal\system\MenuAccessController" * }, * config_prefix = "menu.menu", * entity_keys = {