GroupMenuService.php in Group Menu 8
File
src/GroupMenuService.php
View source
<?php
namespace Drupal\groupmenu;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\group\GroupMembershipLoader;
use Drupal\system\MenuInterface;
class GroupMenuService implements GroupMenuServiceInterface {
protected $entityTypeManager;
protected $currentUser;
protected $membershipLoader;
protected $menuAccess = [];
protected $userMenus = [];
protected $userGroupMenus = [];
protected $groupMenus = [];
public function __construct(EntityTypeManagerInterface $entity_type_manager, AccountInterface $current_user, GroupMembershipLoader $membership_loader) {
$this->entityTypeManager = $entity_type_manager;
$this->currentUser = $current_user;
$this->membershipLoader = $membership_loader;
}
public function menuAccess($op, MenuInterface $menu, AccountInterface $account = NULL) {
if (!isset($account)) {
$account = $this->currentUser;
}
if (isset($this->menuAccess[$op][$account
->id()][$menu
->id()])) {
return $this->menuAccess[$op][$account
->id()][$menu
->id()];
}
if ($account
->hasPermission('administer menu')) {
return $this->menuAccess[$op][$account
->id()][$menu
->id()] = AccessResult::allowed();
}
$plugin_id = 'group_menu:menu';
$group_content_types = $this->entityTypeManager
->getStorage('group_content_type')
->loadByContentPluginId($plugin_id);
if (empty($group_content_types)) {
return $this->menuAccess[$op][$account
->id()][$menu
->id()] = AccessResult::neutral();
}
$group_contents = $this->entityTypeManager
->getStorage('group_content')
->loadByProperties([
'type' => array_keys($group_content_types),
'entity_id' => $menu
->id(),
]);
if (empty($group_contents)) {
return $this->menuAccess[$op][$account
->id()][$menu
->id()] = AccessResult::neutral();
}
$groups = [];
foreach ($group_contents as $group_content) {
$group = $group_content
->getGroup();
$groups[$group
->id()] = $group;
}
foreach ($groups as $group) {
if ($group
->hasPermission("{$op} {$plugin_id} entity", $account)) {
return $this->menuAccess[$op][$account
->id()][$menu
->id()] = AccessResult::allowed();
}
}
return $this->menuAccess[$op][$account
->id()][$menu
->id()] = AccessResult::neutral();
}
public function loadUserGroupMenus($op, AccountInterface $account = NULL) {
if (!isset($account)) {
$account = $this->currentUser;
}
if (isset($this->userMenus[$op][$account
->id()])) {
return $this->userMenus[$op][$account
->id()];
}
$group_memberships = $this->membershipLoader
->loadByUser($account);
$this->userMenus[$op][$account
->id()] = [];
foreach ($group_memberships as $group_membership) {
$this->userMenus[$op][$account
->id()] += $this
->loadUserGroupMenusByGroup($op, $group_membership
->getGroupContent()->gid->target_id, $account);
}
return $this->userMenus[$op][$account
->id()];
}
public function loadUserGroupMenusByGroup($op, $group_id, AccountInterface $account = NULL) {
if (!isset($account)) {
$account = $this->currentUser;
}
if (isset($this->userGroupMenus[$op][$account
->id()][$group_id])) {
return $this->userGroupMenus[$op][$account
->id()][$group_id];
}
$group_menus = $this
->getGroupMenus();
$group_menu_for_group = !empty($group_menus[$group_id]) ? $group_menus[$group_id] : [];
return $this->userGroupMenus[$op][$account
->id()][$group_id] = $group_menu_for_group;
}
public function getGroupMenus() {
if (!$this->groupMenus) {
$plugin_id = 'group_menu:menu';
$menus = $this->entityTypeManager
->getStorage('menu')
->loadMultiple();
$group_content_types = $this->entityTypeManager
->getStorage('group_content_type')
->loadByContentPluginId($plugin_id);
if (!empty($group_content_types)) {
$group_contents = $this->entityTypeManager
->getStorage('group_content')
->loadByProperties([
'type' => array_keys($group_content_types),
]);
foreach ($group_contents as $group_content) {
if (!isset($group_content->gid->target_id) || !isset($group_content->entity_id->target_id)) {
continue;
}
$this->groupMenus[$group_content->gid->target_id][$group_content->entity_id->target_id] = $menus[$group_content->entity_id->target_id];
}
}
}
return $this->groupMenus;
}
}