menu_admin_per_menu.module 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. /**
  3. * @file
  4. * Module file for menu_admin_per_menu.
  5. */
  6. use Drupal\Core\Entity\EntityInterface;
  7. use Drupal\Core\Form\FormStateInterface;
  8. use Drupal\Core\Session\AccountInterface;
  9. use Drupal\menu_link_content\Form\MenuLinkContentForm;
  10. use Drupal\menu_ui\Form\MenuLinkEditForm;
  11. use Drupal\menu_ui\MenuForm;
  12. /**
  13. * Implementation of hook_form_alter().
  14. */
  15. function menu_admin_per_menu_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  16. $form_object = $form_state->getFormObject();
  17. if ($form_object instanceof MenuLinkEditForm
  18. || $form_object instanceof MenuLinkContentForm) {
  19. $account = \Drupal::currentUser();
  20. if (!$account->hasPermission('administer menu')) {
  21. $options = $form['menu_parent']['#options'];
  22. $form['menu_parent']['#options'] = menu_admin_per_menu_filter_parent_options($account, $options);
  23. }
  24. }
  25. if ($form_object instanceof MenuForm) {
  26. $account = \Drupal::currentUser();
  27. if (!$account->hasPermission('administer menu')) {
  28. $form['id']['#access'] = FALSE;
  29. $form['label']['#access'] = FALSE;
  30. $form['description']['#access'] = FALSE;
  31. $form['langcode']['#access'] = FALSE;
  32. }
  33. }
  34. }
  35. /**
  36. * Implements hook_form_BASE_FORM_ID_alter() for node_form.
  37. */
  38. function menu_admin_per_menu_form_node_form_alter(&$form, FormStateInterface $form_state) {
  39. $account = \Drupal::currentUser();
  40. if (!$account->hasPermission('administer menu')) {
  41. /** @var \Drupal\menu_admin_per_menu\MenuAdminPerMenuAccessInterface $allowedMenusService */
  42. $allowedMenusService = \Drupal::service('menu_admin_per_menu.allowed_menus');
  43. $allowed_menus = $allowedMenusService->getPerMenuPermissions($account);
  44. $default_value = &$form['menu']['link']['menu_parent']['#default_value'];
  45. list($current_menu, ) = explode(':', $default_value, 2);
  46. // Disallow editing the menu item if there is a pre-existing menu item
  47. // belonging to a menu the user does not have permission to access.
  48. if (!empty($current_menu) && !in_array($current_menu, $allowed_menus)) {
  49. $form['menu']['#access'] = FALSE;
  50. return;
  51. }
  52. $options = &$form['menu']['link']['menu_parent']['#options'];
  53. $options = menu_admin_per_menu_filter_parent_options($account, $options ? $options : []);
  54. $form['menu']['#access'] = count($options) > 0;
  55. }
  56. }
  57. /**
  58. * Removes menu items for menus a user does not have permission to access.
  59. *
  60. * @param \Drupal\Core\Session\AccountInterface
  61. * The user to check for access.
  62. * @param array $options
  63. * An array of menu item labels keyed by menu item ID.
  64. *
  65. * @return array
  66. * Filtered menu item labels keyed by menu item ID.
  67. */
  68. function menu_admin_per_menu_filter_parent_options(AccountInterface $account, array $options) {
  69. /** @var \Drupal\menu_admin_per_menu\MenuAdminPerMenuAccessInterface $allowedMenusService */
  70. $allowedMenusService = \Drupal::service('menu_admin_per_menu.allowed_menus');
  71. $allowed_menus = $allowedMenusService->getPerMenuPermissions($account);
  72. foreach ($options as $key => $option) {
  73. list($menu, ) = explode(':', $key, 2);
  74. if (!in_array($menu, $allowed_menus)) {
  75. unset($options[$key]);
  76. }
  77. }
  78. return $options;
  79. }
  80. /**
  81. * Implements hook_ENTITY_TYPE_access() for entity type "menu_link_content".
  82. */
  83. function menu_admin_per_menu_menu_link_content_access(EntityInterface $entity, $operation, AccountInterface $account) {
  84. /** @var \Drupal\menu_admin_per_menu\MenuAdminPerMenuAccessInterface $allowedMenusService */
  85. $allowedMenusService = \Drupal::service('menu_admin_per_menu.allowed_menus');
  86. return $allowedMenusService->menuItemAccess($account, $entity);
  87. }