contacts_events-8.x-1.x-dev/src/Controller/UserEventsController.php
src/Controller/UserEventsController.php
<?php namespace Drupal\contacts_events\Controller; use Drupal\Core\Access\AccessResult; use Drupal\Core\Access\AccessResultReasonInterface; use Drupal\Core\Block\BlockManagerInterface; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Plugin\Context\ContextHandlerInterface; use Drupal\Core\Plugin\Context\EntityContext; use Drupal\Core\Plugin\ContextAwarePluginInterface; use Drupal\Core\Session\AccountInterface; use Drupal\user\UserInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Controller for displaying a user's events (past and upcoming bookings). * * @package Drupal\contacts_events\Controller */ class UserEventsController extends ControllerBase { /** * Block manager. * * @var \Drupal\Core\Block\BlockManagerInterface */ protected $blockManager; /** * Plugin context handler. * * @var \Drupal\Core\Plugin\Context\ContextHandlerInterface */ protected $contextHandler; /** * {@inheritdoc} */ public function __construct(BlockManagerInterface $block_manager, ContextHandlerInterface $context_handler) { $this->blockManager = $block_manager; $this->contextHandler = $context_handler; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('plugin.manager.block'), $container->get('context.handler') ); } /** * Checks access to the given user's events page. * * @param \Drupal\user\UserInterface $user * The user whose events are being viewed. * @param \Drupal\Core\Session\AccountInterface $account * The currently logged in account. * * @return \Drupal\Core\Access\AccessResultInterface * The access result. */ public function access(UserInterface $user, AccountInterface $account) { $result = AccessResult::allowedIfHasPermission($account, 'can manage bookings for contacts_events') ->orIf(AccessResult::allowedIf($account->id() == $user->id()) ->addCacheableDependency($user) ->addCacheableDependency($account)); if ($result instanceof AccessResultReasonInterface) { $result->setReason('User not allowed to manage bookings.'); } return $result; } /** * Displays past and upcoming bookings. * * @param \Drupal\user\UserInterface $user * The user being viewed. * * @return array * Render array. */ public function events(UserInterface $user) { $build = []; // Convert the AccountInterface back into an underlying user entity. $current_user = $this->entityTypeManager()->getStorage('user') ->load($this->currentUser()->id()); $contexts = [ 'current_user' => EntityContext::fromEntity($current_user), 'user' => EntityContext::fromEntity($user), ]; $build['upcoming_title'] = [ '#markup' => $this->t('<h2>Upcoming events</h2>'), ]; $build['upcoming'] = $this->buildBlock('views_block:contacts_events_events-upcoming', $contexts); $build['past_title'] = [ '#markup' => $this->t('<h2>Past events</h2>'), ]; $build['past'] = $this->buildBlock('views_block:contacts_events_events-past', $contexts); return $build; } /** * Builds the block output. * * @param string $block_id * Block ID to build. * @param array $contexts * Contexts for the block. * * @return array * Render array. */ private function buildBlock($block_id, array $contexts) { $block = $this->blockManager->createInstance($block_id); if ($block instanceof ContextAwarePluginInterface) { $this->contextHandler->applyContextMapping($block, $contexts); } return $block->build(); } }