localgov_services-2.1.19/modules/localgov_services_status/src/Plugin/Block/ServiceStatusMessage.php
modules/localgov_services_status/src/Plugin/Block/ServiceStatusMessage.php
<?php
namespace Drupal\localgov_services_status\Plugin\Block;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Condition\ConditionManager;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\condition_field\ConditionAccessResolver;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provides a 'ServiceStatusMessage' block.
*
* @Block(
* id = "localgov_service_status_message",
* admin_label = @Translation("Service status message"),
* )
*/
class ServiceStatusMessage extends BlockBase implements ContainerFactoryPluginInterface {
/**
* Drupal\Core\Condition\ConditionManager definition.
*
* @var \Drupal\Core\Condition\ConditionManager
*/
protected $pluginManagerCondition;
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* Visible service status nodes.
*
* @var \Drupal\node\NodeInterface[]
*/
protected $statusNodes = [];
/**
* Cache contexts for visible service statuses.
*
* @var string[]
*/
protected $cacheContexts = [];
/**
* Cache tags for visible service statuses.
*
* @var string[]
*/
protected $cacheTags = [];
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('plugin.manager.condition'),
$container->get('entity_type.manager')
);
}
/**
* Service status message block constructor.
*
* @param array $configuration
* The plugin configuration.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Condition\ConditionManager $plugin_manager_condition
* The plugin manager condition service.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager service.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, ConditionManager $plugin_manager_condition, EntityTypeManagerInterface $entity_type_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->pluginManagerCondition = $plugin_manager_condition;
$this->entityTypeManager = $entity_type_manager;
// Load service status nodes to display.
$nids = $this->entityTypeManager->getStorage('node')->getQuery()
->condition('type', 'localgov_services_status')
->condition('status', 1)
->accessCheck(TRUE)
->execute();
$nodes = $this->entityTypeManager->getStorage('node')->loadMultiple($nids);
// Check whether service status is visible for given conditions.
foreach ($nodes as $node) {
if (!$node->get('localgov_service_status_visibile')->isEmpty()) {
$conditions = [];
$conditions_config = $node->get('localgov_service_status_visibile')->getValue()[0]['conditions'];
foreach ($conditions_config as $condition_id => $values) {
/** @var \Drupal\Core\Condition\ConditionInterface $condition */
$condition = $this->pluginManagerCondition->createInstance($condition_id, $values);
$conditions[] = $condition;
$this->cacheContexts = Cache::mergeContexts($this->cacheContexts, $condition->getCacheContexts());
$this->cacheTags = Cache::mergeTags($this->cacheTags, $condition->getCacheTags());
}
if (ConditionAccessResolver::checkAccess($conditions, 'or')) {
$this->statusNodes[] = $node;
}
}
}
}
/**
* {@inheritdoc}
*/
public function build() {
$build = [];
$build['#theme'] = 'service_status_message';
$build['#items'] = [];
foreach ($this->statusNodes as $node) {
$build['#items'][] = $this->entityTypeManager->getViewBuilder('node')->view($node, 'message');
}
return $build;
}
/**
* {@inheritdoc}
*/
protected function blockAccess(AccountInterface $account) {
if (empty($this->statusNodes)) {
return AccessResult::neutral()->addCacheableDependency($this);
}
return AccessResult::allowed()->addCacheableDependency($this);
}
/**
* {@inheritdoc}
*/
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), $this->cacheContexts);
}
/**
* {@inheritdoc}
*/
public function getCacheTags() {
// Invalidate cache on changes to localgov_services_status nodes.
return Cache::mergeTags(parent::getCacheTags(), $this->cacheTags, ['node_list:localgov_services_status']);
}
}
