contacts_events-8.x-1.x-dev/modules/teams/src/TeamApplicationAccessControlHandler.php

modules/teams/src/TeamApplicationAccessControlHandler.php
<?php

namespace Drupal\contacts_events_teams;

use Drupal\contacts_events_teams\Entity\TeamInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Entity\EntityAccessControlHandler;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Session\AccountInterface;

/**
 * Access controller for the Team application entity.
 *
 * @see \Drupal\contacts_events_teams\Entity\TeamApplication.
 */
class TeamApplicationAccessControlHandler extends EntityAccessControlHandler {

  /**
   * {@inheritdoc}
   */
  protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
    /** @var \Drupal\contacts_events\Entity\EventInterface $event */
    $event = $entity->get('event')->entity;

    if (!$event) {
      return AccessResult::forbidden("This team application doesn't have an event.");
    }

    $event_team_status = (int) $event->getSetting('teams.enabled', TeamInterface::STATUS_CLOSED);

    if ($event_team_status === TeamInterface::STATUS_CLOSED) {
      return AccessResult::forbidden('Teams are not public for this event.')
        ->addCacheableDependency($event);
    }

    /** @var \Drupal\contacts_events_teams\Entity\TeamApplication $entity */
    switch ($operation) {
      // Defer to the team for who can view and manage applications.
      case 'view':
      case 'manage':
        if ($entity->getTeam()) {
          return $entity->getTeam()->access('view', $account, TRUE);
        }
        // If the Team is missing (i.e. it's been deleted since the application
        // was created) then only allow staff to view it.
        return AccessResult::allowedIfHasPermission($account, 'manage all contacts events team applications');

      // Update only available to staff and the person who made the application,
      // so long as the application isn't submitted yet and applications are
      // still open.
      case 'update':
        // Update only available to staff and the person who made the
        // application, so long as the application isn't submitted yet.
        // Staff can update if teams are open/private, applicants can only
        // update if open.
        return AccessResult::allowedIfHasPermission($account, 'manage all contacts events team applications')
          ->orIf(AccessResult::allowedIf($entity->getOwnerId() == $account->id() && $entity->get('state')->value === 'draft' && $event_team_status === TeamInterface::STATUS_OPEN)
            ->addCacheableDependency($entity->getOwner()));
    }

    // Unknown operation, no opinion.
    return AccessResult::neutral();
  }

  /**
   * {@inheritdoc}
   */
  protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) {
    return AccessResult::allowedIfHasPermission($account, 'add team applications');
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc