You are here

function domain_menus_menu_link_content_create_access in Domain Menus for Domains 9.x

Same name and namespace in other branches
  1. 3.x domain_menus.module \domain_menus_menu_link_content_create_access()
  2. 9.1.x domain_menus.module \domain_menus_menu_link_content_create_access()

Implements hook_ENTITY_TYPE_create_access().

Allow menu link create access to domain menus based on domain_menus permissions

File

./domain_menus.module, line 190
Domain menus implementation through entity create, delete, and access customizations.

Code

function domain_menus_menu_link_content_create_access(AccountInterface $account, array $context, $entity_bundle) {
  $route = Drupal::routeMatch();
  if ($menu = $route
    ->getParameter('menu')) {
    if (_domain_menus_is_domain_menu($menu)) {
      $menu_id = $menu
        ->id();
      $menu_domains = $menu
        ->getThirdPartySetting("domain_menus", "domains", []);
      $user = \Drupal::entityTypeManager()
        ->getStorage('user')
        ->load($account
        ->id());

      //$user_domains = \Drupal::service('domain_access.manager')->getAccessValues($user);
      $user_domains_string = $user
        ->get(DOMAIN_ACCESS_FIELD)
        ->getString();
      $user_domains = explode(', ', $user_domains_string);
      $menu_and_user_domains = array_intersect($menu_domains, $user_domains);
      $active_domain = \Drupal::service('domain.negotiator')
        ->getActiveDomain();
      $active_domain_id = $active_domain
        ->id();

      // permission check order matters, do "edit assigned domain menus" first
      if ($account
        ->hasPermission('edit assigned domain menus')) {
        if (!empty($menu_and_user_domains)) {
          return AccessResult::allowed();
        }
      }
      elseif ($account
        ->hasPermission('edit active domain menus')) {
        if (in_array($active_domain_id, $menu_and_user_domains)) {
          return AccessResult::allowed();
        }
      }
    }
  }
  return AccessResult::neutral();
}