contacts_events-8.x-1.x-dev/modules/contacts_events_segments/src/SegmentAccessControlHandler.php
modules/contacts_events_segments/src/SegmentAccessControlHandler.php
<?php namespace Drupal\contacts_events_segments; use Drupal\contacts_events\Entity\EventInterface; use Drupal\Core\Access\AccessResult; use Drupal\Core\Entity\EntityAccessControlHandler; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Session\AccountInterface; /** * Access control handler for the Event Segment entity. * * @see \Drupal\contacts_events_segments\Entity\Segment */ class SegmentAccessControlHandler extends EntityAccessControlHandler { /** * {@inheritdoc} */ protected $viewLabelOperation = TRUE; /** * {@inheritdoc} */ protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) { /** @var \Drupal\contacts_events_segments\Entity\SegmentInterface $entity */ // Delete should always be forbidden for new entities. if ($operation == 'delete' && $entity->isNew()) { return AccessResult::forbidden()->addCacheableDependency($entity); } // If we don't have an event, deny access. /** @var \Drupal\contacts_events\Entity\EventInterface $event */ $event = $entity->getEvent(); if (!$event) { return AccessResult::forbidden('Cannot check event status.'); } // Check whether day tickets are enabled. if ($this->areSegmentsDisabled($event)) { return AccessResult::forbidden('Segments are not enabled for this event.'); } // View label corresponds to booking, everything else is edit. if ($operation == 'view_label') { return $event->access('book', $account, TRUE); } return $event->access('update', $account, TRUE); } /** * {@inheritdoc} */ protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) { // Deny completely if there is no event in the context. if (empty($context['event'])) { return AccessResult::forbidden('Missing event context.'); } // Check whether day tickets are enabled. if ($this->areSegmentsDisabled($context['event'])) { return AccessResult::forbidden('Segments are not enabled for this event.'); } // Creating a segment requires event edit permission. return $context['event']->access('update', $account, TRUE); } /** * Check whether segments are disabled on the event. * * @param \Drupal\contacts_events\Entity\EventInterface $event * The event to check. * * @return bool * TRUE if segments are disabled. */ protected function areSegmentsDisabled(EventInterface $event): bool { return $event->getSetting('segments', EventInterface::STATUS_DISABLED) == EventInterface::STATUS_DISABLED; } }