You are here

function domain_menus_menu_access in Domain Menus for Domains 9.x

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

Implements hook_ENTITY_TYPE_access().

Allow domain menus edit access based on domain_menus permissions

File

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

Code

function domain_menus_menu_access(EntityInterface $entity, $operation, AccountInterface $account) {
  $menu = $entity;
  $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();
}