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;
class GroupSubscribeFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
use RedirectDestinationTrait;
protected $currentUser;
protected $ogAccess;
protected $entityTypeManager;
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');
}
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'));
}
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = [];
$elements['#cache']['contexts'] = [
'og_membership_state',
];
$group = $items
->getEntity();
$entity_type_id = $group
->getEntityTypeId();
$user = $this->entityTypeManager
->load($this->currentUser
->id());
if ($group instanceof EntityOwnerInterface && $group
->getOwnerId() == $user
->id()) {
$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)) {
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 ($user
->isAuthenticated()) {
$parameters = [
'entity_type_id' => $group
->getEntityTypeId(),
'group' => $group
->id(),
];
$url = Url::fromRoute('og.subscribe', $parameters);
}
else {
$url = Url::fromRoute('user.login', [], [
'query' => $this
->getDestinationArray(),
]);
}
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;
}
}