You are here

GroupSubscribeFormatter.php in Organic groups 8

File

src/Plugin/Field/FieldFormatter/GroupSubscribeFormatter.php
View source
<?php

declare (strict_types=1);
namespace Drupal\og\Plugin\Field\FieldFormatter;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Routing\RedirectDestinationTrait;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;
use Drupal\og\Og;
use Drupal\og\OgAccessInterface;
use Drupal\og\OgMembershipInterface;
use Drupal\user\EntityOwnerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Plugin implementation for the OG subscribe formatter.
 *
 * @FieldFormatter(
 *   id = "og_group_subscribe",
 *   label = @Translation("OG Group subscribe"),
 *   description = @Translation("Display OG Group subscribe and un-subscribe links."),
 *   field_types = {
 *     "og_group"
 *   }
 * )
 */
class GroupSubscribeFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
  use RedirectDestinationTrait;

  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $currentUser;

  /**
   * The OG access service.
   *
   * @var \Drupal\og\OgAccessInterface
   */
  protected $ogAccess;

  /**
   * The entity type manager service.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * Constructs a new GroupSubscribeFormatter object.
   *
   * @param string $plugin_id
   *   The plugin_id for the formatter.
   * @param mixed $plugin_definition
   *   The plugin implementation definition.
   * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
   *   The definition of the field to which the formatter is associated.
   * @param array $settings
   *   The formatter settings.
   * @param string $label
   *   The formatter label display setting.
   * @param string $view_mode
   *   The view mode.
   * @param array $third_party_settings
   *   Any third party settings settings.
   * @param \Drupal\Core\Session\AccountInterface $current_user
   *   The current user.
   * @param \Drupal\og\OgAccessInterface $og_access
   *   The OG access service.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The entity type manager service.
   *
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, AccountInterface $current_user, OgAccessInterface $og_access, EntityTypeManagerInterface $entity_type_manager) {
    parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
    $this->currentUser = $current_user;
    $this->ogAccess = $og_access;
    $this->entityTypeManager = $entity_type_manager
      ->getStorage('user');
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['label'], $configuration['view_mode'], $configuration['third_party_settings'], $container
      ->get('current_user'), $container
      ->get('og.access'), $container
      ->get('entity_type.manager'));
  }

  /**
   * {@inheritdoc}
   */
  public function viewElements(FieldItemListInterface $items, $langcode) {
    $elements = [];

    // Cache by the OG membership state.
    $elements['#cache']['contexts'] = [
      'og_membership_state',
    ];
    $group = $items
      ->getEntity();
    $entity_type_id = $group
      ->getEntityTypeId();

    // $user = User::load($this->currentUser->id());
    $user = $this->entityTypeManager
      ->load($this->currentUser
      ->id());
    if ($group instanceof EntityOwnerInterface && $group
      ->getOwnerId() == $user
      ->id()) {

      // User is the group manager.
      $elements[0] = [
        '#type' => 'html_tag',
        '#tag' => 'span',
        '#attributes' => [
          'title' => $this
            ->t('You are the group manager'),
          'class' => [
            'group',
            'manager',
          ],
        ],
        '#value' => $this
          ->t('You are the group manager'),
      ];
      return $elements;
    }
    if (Og::isMemberBlocked($group, $user)) {

      // If user is blocked, they should not be able to apply for
      // membership.
      return $elements;
    }
    if (Og::isMember($group, $user, [
      OgMembershipInterface::STATE_ACTIVE,
      OgMembershipInterface::STATE_PENDING,
    ])) {
      $link['title'] = $this
        ->t('Unsubscribe from group');
      $link['url'] = Url::fromRoute('og.unsubscribe', [
        'entity_type_id' => $entity_type_id,
        'group' => $group
          ->id(),
      ]);
      $link['class'] = [
        'unsubscribe',
      ];
    }
    else {

      // If the user is authenticated, set up the subscribe link.
      if ($user
        ->isAuthenticated()) {
        $parameters = [
          'entity_type_id' => $group
            ->getEntityTypeId(),
          'group' => $group
            ->id(),
        ];
        $url = Url::fromRoute('og.subscribe', $parameters);
      }
      else {

        // User is anonymous, link to user login and redirect back to here.
        $url = Url::fromRoute('user.login', [], [
          'query' => $this
            ->getDestinationArray(),
        ]);
      }

      /** @var \Drupal\Core\Access\AccessResult $access */
      if (($access = $this->ogAccess
        ->userAccess($group, 'subscribe without approval', $user)) && $access
        ->isAllowed()) {
        $link['title'] = $this
          ->t('Subscribe to group');
        $link['class'] = [
          'subscribe',
        ];
        $link['url'] = $url;
      }
      elseif (($access = $this->ogAccess
        ->userAccess($group, 'subscribe', $user)) && $access
        ->isAllowed()) {
        $link['title'] = $this
          ->t('Request group membership');
        $link['class'] = [
          'subscribe',
          'request',
        ];
        $link['url'] = $url;
      }
      else {
        $elements[0] = [
          '#type' => 'html_tag',
          '#tag' => 'span',
          '#attributes' => [
            'title' => $this
              ->t('This is a closed group. Only a group administrator can add you.'),
            'class' => [
              'group',
              'closed',
            ],
          ],
          '#value' => $this
            ->t('This is a closed group. Only a group administrator can add you.'),
        ];
        return $elements;
      }
    }
    if (!empty($link['title'])) {
      $link += [
        'options' => [
          'attributes' => [
            'title' => $link['title'],
            'class' => [
              'group',
            ] + $link['class'],
          ],
        ],
      ];
      $elements[0] = [
        '#type' => 'link',
        '#title' => $link['title'],
        '#url' => $link['url'],
      ];
    }
    return $elements;
  }

}

Classes

Namesort descending Description
GroupSubscribeFormatter Plugin implementation for the OG subscribe formatter.