Commit 465b31f9 authored by E R's avatar E R Committed by Nikolay Lobachev
Browse files

Issue #3270134: Request membership link throws error when added to view with multiple group types

parent 58e99671
Loading
Loading
Loading
Loading
+1 −12
Original line number Diff line number Diff line
@@ -2,9 +2,6 @@

namespace Drupal\grequest\Plugin\views\field;

use Drupal\views\Plugin\views\field\EntityLink;
use Drupal\views\ResultRow;

/**
 * Field handler to present a link to approve a membership request.
 *
@@ -12,7 +9,7 @@ use Drupal\views\ResultRow;
 *
 * @ViewsField("approve_membership_request")
 */
class ApproveMembership extends EntityLink {
class ApproveMembership extends MembershipEntityLink {

  /**
   * {@inheritdoc}
@@ -21,14 +18,6 @@ class ApproveMembership extends EntityLink {
    return 'group-approve-membership';
  }

  /**
   * {@inheritdoc}
   */
  protected function renderLink(ResultRow $row) {
    $this->options['alter']['query'] = $this->getDestinationArray();
    return parent::renderLink($row);
  }

  /**
   * {@inheritdoc}
   */
+46 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\grequest\Plugin\views\field;

use Drupal\grequest\Plugin\GroupContentEnabler\GroupMembershipRequest;
use Drupal\views\Plugin\views\field\EntityLink;
use Drupal\views\ResultRow;

/**
 * Field handler to present an entity link.
 */
abstract class MembershipEntityLink extends EntityLink {

  /**
   * {@inheritdoc}
   */
  protected function renderLink(ResultRow $row) {
    $plugin_id = 'group_membership_request';
    /** @var \Drupal\group\Entity\GroupContent $group_content */
    $group_content = $row->_entity;
    $group = $group_content->getGroup();
    $link = NULL;

    // Check if plugin exists.
    if (!$group->getGroupType()->hasContentPlugin($plugin_id)) {
      return $link;
    }
    // Check if current group content is type of group_membership_request.
    if ($group_content->getContentPlugin()->getPluginId() !== $plugin_id) {
      return $link;
    }

    $user = $group_content->getEntity();

    if (!empty($group->getMember($user))) {
      $link = $this->t('Already member');
    }
    elseif ($group_content->get(GroupMembershipRequest::STATUS_FIELD)->first()->value === GroupMembershipRequest::REQUEST_PENDING && $group->hasPermission('administer membership requests', $this->currentUser)) {
      $this->options['alter']['query'] = $this->getDestinationArray();
      $link = parent::renderLink($row);
    }

    return $link;
  }

}
+1 −12
Original line number Diff line number Diff line
@@ -2,9 +2,6 @@

namespace Drupal\grequest\Plugin\views\field;

use Drupal\views\Plugin\views\field\EntityLink;
use Drupal\views\ResultRow;

/**
 * Field handler to present a link to reject a membership request.
 *
@@ -12,7 +9,7 @@ use Drupal\views\ResultRow;
 *
 * @ViewsField("reject_membership_request")
 */
class RejectMembership extends EntityLink {
class RejectMembership extends MembershipEntityLink {

  /**
   * {@inheritdoc}
@@ -21,14 +18,6 @@ class RejectMembership extends EntityLink {
    return 'group-reject-membership';
  }

  /**
   * {@inheritdoc}
   */
  protected function renderLink(ResultRow $row) {
    $this->options['alter']['query'] = $this->getDestinationArray();
    return parent::renderLink($row);
  }

  /**
   * {@inheritdoc}
   */
+12 −5
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@
namespace Drupal\grequest\Plugin\views\field;

use Drupal\Core\Session\AccountInterface;
use Drupal\grequest\Plugin\GroupContentEnabler\GroupMembershipRequest;
use Drupal\group\Entity\GroupInterface;
use Drupal\views\Plugin\views\field\FieldPluginBase;
use Drupal\views\ResultRow;
use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -74,14 +76,20 @@ final class RequestMembership extends FieldPluginBase {
  public function render(ResultRow $values) {
    /** @var \Drupal\group\Entity\Group $group */
    $group = $values->_entity;
    if (!($group instanceof GroupInterface) && !empty($values->_relationship_entities['gid'])) {
      $group = $values->_relationship_entities['gid'];
    }

    $build = NULL;
    if (empty($group) || !$group->getGroupType()->hasContentPlugin('group_membership_request')) {
      return $build;
    }

    $membership_requests = $group->getContentByEntityId('group_membership_request', $this->currentUser->id());
    if (!empty($group->getMember($this->currentUser))) {
      $build['#markup'] = $this->t('Already member');
    }
    elseif (empty($membership_requests)
      && $group->getGroupType()->hasContentPlugin('group_membership_request')
    ) {
    elseif (empty($membership_requests)) {
      if ($group->hasPermission('request group membership', $this->currentUser)) {
        $build = $group->toLink($this->t('Request Membership'), 'group-request-membership')
          ->toString();
@@ -89,14 +97,13 @@ final class RequestMembership extends FieldPluginBase {
    }
    else {
      $membership_request = reset($membership_requests);
      if ($membership_request->grequest_status->value == 0) {
      if ($membership_request->get(GroupMembershipRequest::STATUS_FIELD)->first()->value == GroupMembershipRequest::REQUEST_PENDING) {
        $build['#markup'] = $this->t('Pending membership request');
      }
      else {
        $build['#markup'] = $this->t('Rejected membership request');
      }
    }

    return $build;
  }