Loading grequest.services.yml +4 −4 Original line number Diff line number Diff line Loading @@ -5,21 +5,21 @@ services: # Specific group relation handlers. group.relation_handler.entity_reference.group_membership_request: class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipEntityReference' class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipRequestEntityReference' arguments: [ '@group.relation_handler.entity_reference' ] shared: false group.relation_handler.operation_provider.group_membership_request: class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipOperationProvider' class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipRequestOperationProvider' arguments: [ '@group.relation_handler.operation_provider', '@current_user', '@string_translation' ] shared: false group.relation_handler.permission_provider.group_membership_request: class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipPermissionProvider' class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipRequestPermissionProvider' arguments: [ '@group.relation_handler.permission_provider' ] shared: false group.relation_handler.post_install.group_membership_request: class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipPostInstall' class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipRequestPostInstall' arguments: [ '@group.relation_handler.post_install', '@entity_type.manager', '@string_translation' ] shared: false src/MembershipRequestManager.php +6 −2 Original line number Diff line number Diff line Loading @@ -149,9 +149,13 @@ class MembershipRequestManager { if ($group->getMember($user)) { throw new \Exception('This user is already a member of the group'); } $plugin_id = 'group_membership_request'; $relationship_type_storage = $this->entityTypeManager->getStorage('group_content_type'); $group_type_id = $group->getGroupType()->id(); $group_relationship = GroupRelationship::create([ 'group_type' => $group->getGroupType()->id(), 'plugin_id' => 'group_membership_request', 'type' => $relationship_type_storage->getRelationshipTypeId($group_type_id, $plugin_id), 'gid' => $group->id(), 'entity_id' => $user->id(), GroupMembershipRequest::STATUS_FIELD => GroupMembershipRequest::REQUEST_NEW, Loading src/Plugin/Group/RelationHandler/GroupMembershipRequestEntityReference.php +3 −1 Original line number Diff line number Diff line <?php namespace Drupal\group\Plugin\Group\RelationHandler; namespace Drupal\grequest\Plugin\Group\RelationHandler; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\group\Plugin\Group\RelationHandler\EntityReferenceInterface; use Drupal\group\Plugin\Group\RelationHandler\EntityReferenceTrait; /** * Configures the entity reference for the group_membership_request relation plugin. Loading src/Plugin/Group/RelationHandler/GroupMembershipOperationProvider.php→src/Plugin/Group/RelationHandler/GroupMembershipRequestOperationProvider.php +25 −6 Original line number Diff line number Diff line Loading @@ -4,18 +4,19 @@ namespace Drupal\grequest\Plugin\Group\RelationHandler; use Drupal\Core\Session\AccountProxyInterface; use Drupal\Core\StringTranslation\TranslationInterface; use Drupal\Core\Url; use Drupal\group\Entity\GroupInterface; use Drupal\group\Plugin\Group\RelationHandler\OperationProviderInterface; use Drupal\group\Plugin\Group\RelationHandler\OperationProviderTrait; /** * Provides operations for the group_membership_request relation plugin. */ class GroupMembershipOperationProvider implements OperationProviderInterface { class GroupMembershipRequestOperationProvider implements OperationProviderInterface { use OperationProviderTrait; /** * Constructs a new GroupMembershipOperationProvider. * Constructs a new GroupMembershipRequestOperationProvider. * * @param \Drupal\group\Plugin\Group\RelationHandler\OperationProviderInterface $parent * The default operation provider. Loading @@ -36,10 +37,9 @@ class GroupMembershipOperationProvider implements OperationProviderInterface { public function getGroupOperations(GroupInterface $group) { $operations = $this->parent->getGroupOperations($group); $account = $this->currentUser(); $entity_instances = $group->getContentByEntityId($this->getPluginId(), $account->id()); $entity_instances = $this->getRelationships($group); $url = $group->toUrl('group-request-membership'); if ($url->access($account) && count($entity_instances) == 0) { if ($url->access($this->currentUser()) && count($entity_instances) == 0) { $operations['group-request-membership'] = [ 'title' => $this->t('Request group membership'), 'url' => $url, Loading @@ -53,4 +53,23 @@ class GroupMembershipOperationProvider implements OperationProviderInterface { return $operations; } /** * Get relationship for the current plugin in the given group. * * @param \Drupal\group\Entity\GroupInterface $group * Group. * * @return array|\Drupal\group\Entity\GroupRelationshipInterface[] * List of group relationships. */ protected function getRelationships(GroupInterface $group) { $entity_instances = []; $user = $this->entityTypeManager()->getStorage('user')->load($this->currentUser()->id()); if (!empty($user)) { $entity_instances = $group->getRelationshipsByEntity($user, $this->pluginId); } return $entity_instances; } } src/Plugin/Group/RelationHandler/GroupMembershipRequestPermissionProvider.php 0 → 100644 +77 −0 Original line number Diff line number Diff line <?php namespace Drupal\grequest\Plugin\Group\RelationHandler; use Drupal\group\Plugin\Group\RelationHandler\PermissionProviderInterface; use Drupal\group\Plugin\Group\RelationHandler\PermissionProviderTrait; /** * Provides group permissions for the group_membership_request relation plugin. */ class GroupMembershipRequestPermissionProvider implements PermissionProviderInterface { use PermissionProviderTrait; /** * Constructs a new GroupMembershipPermissionProvider. * * @param \Drupal\group\Plugin\Group\RelationHandler\PermissionProviderInterface $parent * The default permission provider. */ public function __construct(PermissionProviderInterface $parent) { $this->parent = $parent; } /** * {@inheritdoc} */ public function getPermission($operation, $target, $scope = 'any') { // The following permissions are handled by the admin permission or have a // different permission name. if ($target === 'relationship') { switch ($operation) { case 'view': return "view $scope $this->pluginId $target"; case 'update': case 'create': return FALSE; case 'delete': return $scope === 'own' ? 'leave group' : FALSE; } } return $this->parent->getPermission($operation, $target, $scope); } /** * {@inheritdoc} */ public function buildPermissions() { $permissions = $this->parent->buildPermissions(); // Update the title to make user friendly. $permissions[$this->getAdminPermission()]['title'] = 'Administer membership requests'; $permissions[$this->getRequestGroupMembershipPermission()] = [ 'title' => 'Request group membership', 'allowed for' => ['outsider'], ]; $permissions[$this->getPermission('view', 'relationship')]['title'] = 'View any membership requests'; $permissions[$this->getPermission('view', 'relationship', 'own')]['title'] = 'View own membership requests'; return $permissions; } /** * Get request membership permission. * * @return string * Permission name. */ public function getRequestGroupMembershipPermission() { return 'request group membership'; } } Loading
grequest.services.yml +4 −4 Original line number Diff line number Diff line Loading @@ -5,21 +5,21 @@ services: # Specific group relation handlers. group.relation_handler.entity_reference.group_membership_request: class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipEntityReference' class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipRequestEntityReference' arguments: [ '@group.relation_handler.entity_reference' ] shared: false group.relation_handler.operation_provider.group_membership_request: class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipOperationProvider' class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipRequestOperationProvider' arguments: [ '@group.relation_handler.operation_provider', '@current_user', '@string_translation' ] shared: false group.relation_handler.permission_provider.group_membership_request: class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipPermissionProvider' class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipRequestPermissionProvider' arguments: [ '@group.relation_handler.permission_provider' ] shared: false group.relation_handler.post_install.group_membership_request: class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipPostInstall' class: 'Drupal\grequest\Plugin\Group\RelationHandler\GroupMembershipRequestPostInstall' arguments: [ '@group.relation_handler.post_install', '@entity_type.manager', '@string_translation' ] shared: false
src/MembershipRequestManager.php +6 −2 Original line number Diff line number Diff line Loading @@ -149,9 +149,13 @@ class MembershipRequestManager { if ($group->getMember($user)) { throw new \Exception('This user is already a member of the group'); } $plugin_id = 'group_membership_request'; $relationship_type_storage = $this->entityTypeManager->getStorage('group_content_type'); $group_type_id = $group->getGroupType()->id(); $group_relationship = GroupRelationship::create([ 'group_type' => $group->getGroupType()->id(), 'plugin_id' => 'group_membership_request', 'type' => $relationship_type_storage->getRelationshipTypeId($group_type_id, $plugin_id), 'gid' => $group->id(), 'entity_id' => $user->id(), GroupMembershipRequest::STATUS_FIELD => GroupMembershipRequest::REQUEST_NEW, Loading
src/Plugin/Group/RelationHandler/GroupMembershipRequestEntityReference.php +3 −1 Original line number Diff line number Diff line <?php namespace Drupal\group\Plugin\Group\RelationHandler; namespace Drupal\grequest\Plugin\Group\RelationHandler; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\group\Plugin\Group\RelationHandler\EntityReferenceInterface; use Drupal\group\Plugin\Group\RelationHandler\EntityReferenceTrait; /** * Configures the entity reference for the group_membership_request relation plugin. Loading
src/Plugin/Group/RelationHandler/GroupMembershipOperationProvider.php→src/Plugin/Group/RelationHandler/GroupMembershipRequestOperationProvider.php +25 −6 Original line number Diff line number Diff line Loading @@ -4,18 +4,19 @@ namespace Drupal\grequest\Plugin\Group\RelationHandler; use Drupal\Core\Session\AccountProxyInterface; use Drupal\Core\StringTranslation\TranslationInterface; use Drupal\Core\Url; use Drupal\group\Entity\GroupInterface; use Drupal\group\Plugin\Group\RelationHandler\OperationProviderInterface; use Drupal\group\Plugin\Group\RelationHandler\OperationProviderTrait; /** * Provides operations for the group_membership_request relation plugin. */ class GroupMembershipOperationProvider implements OperationProviderInterface { class GroupMembershipRequestOperationProvider implements OperationProviderInterface { use OperationProviderTrait; /** * Constructs a new GroupMembershipOperationProvider. * Constructs a new GroupMembershipRequestOperationProvider. * * @param \Drupal\group\Plugin\Group\RelationHandler\OperationProviderInterface $parent * The default operation provider. Loading @@ -36,10 +37,9 @@ class GroupMembershipOperationProvider implements OperationProviderInterface { public function getGroupOperations(GroupInterface $group) { $operations = $this->parent->getGroupOperations($group); $account = $this->currentUser(); $entity_instances = $group->getContentByEntityId($this->getPluginId(), $account->id()); $entity_instances = $this->getRelationships($group); $url = $group->toUrl('group-request-membership'); if ($url->access($account) && count($entity_instances) == 0) { if ($url->access($this->currentUser()) && count($entity_instances) == 0) { $operations['group-request-membership'] = [ 'title' => $this->t('Request group membership'), 'url' => $url, Loading @@ -53,4 +53,23 @@ class GroupMembershipOperationProvider implements OperationProviderInterface { return $operations; } /** * Get relationship for the current plugin in the given group. * * @param \Drupal\group\Entity\GroupInterface $group * Group. * * @return array|\Drupal\group\Entity\GroupRelationshipInterface[] * List of group relationships. */ protected function getRelationships(GroupInterface $group) { $entity_instances = []; $user = $this->entityTypeManager()->getStorage('user')->load($this->currentUser()->id()); if (!empty($user)) { $entity_instances = $group->getRelationshipsByEntity($user, $this->pluginId); } return $entity_instances; } }
src/Plugin/Group/RelationHandler/GroupMembershipRequestPermissionProvider.php 0 → 100644 +77 −0 Original line number Diff line number Diff line <?php namespace Drupal\grequest\Plugin\Group\RelationHandler; use Drupal\group\Plugin\Group\RelationHandler\PermissionProviderInterface; use Drupal\group\Plugin\Group\RelationHandler\PermissionProviderTrait; /** * Provides group permissions for the group_membership_request relation plugin. */ class GroupMembershipRequestPermissionProvider implements PermissionProviderInterface { use PermissionProviderTrait; /** * Constructs a new GroupMembershipPermissionProvider. * * @param \Drupal\group\Plugin\Group\RelationHandler\PermissionProviderInterface $parent * The default permission provider. */ public function __construct(PermissionProviderInterface $parent) { $this->parent = $parent; } /** * {@inheritdoc} */ public function getPermission($operation, $target, $scope = 'any') { // The following permissions are handled by the admin permission or have a // different permission name. if ($target === 'relationship') { switch ($operation) { case 'view': return "view $scope $this->pluginId $target"; case 'update': case 'create': return FALSE; case 'delete': return $scope === 'own' ? 'leave group' : FALSE; } } return $this->parent->getPermission($operation, $target, $scope); } /** * {@inheritdoc} */ public function buildPermissions() { $permissions = $this->parent->buildPermissions(); // Update the title to make user friendly. $permissions[$this->getAdminPermission()]['title'] = 'Administer membership requests'; $permissions[$this->getRequestGroupMembershipPermission()] = [ 'title' => 'Request group membership', 'allowed for' => ['outsider'], ]; $permissions[$this->getPermission('view', 'relationship')]['title'] = 'View any membership requests'; $permissions[$this->getPermission('view', 'relationship', 'own')]['title'] = 'View own membership requests'; return $permissions; } /** * Get request membership permission. * * @return string * Permission name. */ public function getRequestGroupMembershipPermission() { return 'request group membership'; } }