social_course-8.x-2.11/src/Plugin/Block/CourseMaterialPagerBlock.php
src/Plugin/Block/CourseMaterialPagerBlock.php
<?php
namespace Drupal\social_course\Plugin\Block;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Controller\TitleResolverInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Routing\RouteObjectInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\group\Entity\GroupInterface;
use Drupal\node\NodeInterface;
use Drupal\social_course\CourseWrapperInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* Provides a 'CourseMaterialPagerBlock' block.
*
* @Block(
* id = "course_material_pager",
* admin_label = @Translation("Course material pager block"),
* context_definitions = {
* "node" = @ContextDefinition("entity:node", required = FALSE)
* }
* )
*/
class CourseMaterialPagerBlock extends BlockBase implements ContainerFactoryPluginInterface {
/**
* The entity repository.
*
* @var \Drupal\Core\Entity\EntityRepositoryInterface
*/
protected $entityRepository;
/**
* The course wrapper.
*
* @var \Drupal\social_course\CourseWrapperInterface
*/
protected $courseWrapper;
/**
* The currently active request object.
*
* @var \Symfony\Component\HttpFoundation\Request
*/
protected $request;
/**
* The title resolver.
*
* @var \Drupal\Core\Controller\TitleResolverInterface
*/
protected $titleResolver;
/**
* Creates a CourseMaterialPagerBlock instance.
*
* @param array $configuration
* The plugin configuration, i.e. an array with configuration values keyed
* by configuration option name. The special key 'context' may be used to
* initialize the defined contexts by setting it to an array of context
* values keyed by context names.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository
* The entity repository.
* @param \Drupal\social_course\CourseWrapperInterface $course_wrapper
* The course wrapper.
* @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
* The request stack.
* @param \Drupal\Core\Controller\TitleResolverInterface $title_resolver
* The title resolver.
*/
public function __construct(
array $configuration,
$plugin_id,
$plugin_definition,
EntityRepositoryInterface $entity_repository,
CourseWrapperInterface $course_wrapper,
RequestStack $request_stack,
TitleResolverInterface $title_resolver,
) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityRepository = $entity_repository;
$this->courseWrapper = $course_wrapper;
$this->request = $request_stack->getCurrentRequest();
$this->titleResolver = $title_resolver;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('entity.repository'),
$container->get('social_course.course_wrapper'),
$container->get('request_stack'),
$container->get('title_resolver')
);
}
/**
* {@inheritdoc}
*/
public function build() {
$node = $this->getContextValue('node');
if ($node instanceof NodeInterface && $node->id()) {
$translation = $this->entityRepository
->getTranslationFromContext($node);
if (!empty($translation)) {
$node->setTitle($translation->getTitle());
}
$title = $node->getTitle();
return [
'#theme' => 'course_material_pager',
'#title' => $title,
'#node' => $node,
'#section_class' => 'page-title',
];
}
else {
if ($route = $this->request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)) {
$title = $this->titleResolver->getTitle($this->request, $route);
return [
'#type' => 'page_title',
'#title' => $title,
];
}
else {
return [
'#type' => 'page_title',
'#title' => '',
];
}
}
}
/**
* {@inheritdoc}
*/
public function getCacheTags() {
$tags = parent::getCacheTags();
$node = $this->getContextValue('node');
if ($node instanceof NodeInterface && $node->id()) {
$this->courseWrapper->setCourseFromMaterial($node);
$tags = Cache::mergeTags($tags, $this->courseWrapper->getCourse()->getCacheTags());
$tags = Cache::mergeTags($tags, $this->courseWrapper->getSectionFromMaterial($node)->getCacheTags());
}
return $tags;
}
/**
* {@inheritdoc}
*/
protected function blockAccess(AccountInterface $account) {
$node = $this->getContextValue('node');
if ($node instanceof NodeInterface && $node->id()) {
$group = $this->courseWrapper
->setCourseFromMaterial($node)
->getCourse();
return AccessResult::allowedIf($group instanceof GroupInterface);
}
else {
return AccessResult::forbidden();
}
}
}
