Commit a10c16ff authored by Nikolay Lobachev's avatar Nikolay Lobachev
Browse files

Issue #3304797: Add group relation handlers.

parent be2f8c3a
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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
+6 −2
Original line number Diff line number Diff line
@@ -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,
+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.
+25 −6
Original line number Diff line number Diff line
@@ -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.
@@ -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,
@@ -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;
  }

}
+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