View source
<?php
namespace Drupal\site_alert\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\site_alert\GetAlertsInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class SiteAlertBlock extends BlockBase implements ContainerFactoryPluginInterface {
const TIMEOUT_DEFAULT = 300;
protected $getAlerts;
protected $entityTypeManager;
protected $moduleHandler;
public function __construct(array $configuration, $plugin_id, $plugin_definition, GetAlertsInterface $getAlerts, EntityTypeManagerInterface $entityTypeManager, ModuleHandlerInterface $moduleHandler) {
if (empty($entity_type_manager)) {
@trigger_error('Omitting the entity type manager when instantiating ' . __METHOD__ . ' is deprecated in site_alert:8.x-1.1 and will throw an error in site_alert:9.x-1.0. Make sure to pass the entity type manager instead. See https://www.drupal.org/project/site_alert/issues/3118227', E_USER_DEPRECATED);
$entityTypeManager = \Drupal::entityTypeManager();
}
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->getAlerts = $getAlerts;
$this->entityTypeManager = $entityTypeManager;
$this->moduleHandler = $moduleHandler;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('site_alert.get_alerts'), $container
->get('entity_type.manager'), $container
->get('module_handler'));
}
public function build() {
$build = [];
$metadata = new CacheableMetadata();
$storage = $this->entityTypeManager
->getStorage('site_alert');
$scheduled_alerts_present = $storage
->getCacheMaxAge() !== CacheBackendInterface::CACHE_PERMANENT;
$workaround_needed = $scheduled_alerts_present && $this->moduleHandler
->moduleExists('page_cache');
$alerts = $this->getAlerts
->getActiveAlerts();
foreach ($alerts as $alert) {
$metadata
->addCacheableDependency($alert);
if ($workaround_needed) {
continue;
}
$build[] = [
'#theme' => 'site_alert',
'#alert' => [
'severity' => $alert
->getSeverity(),
'label' => $alert
->getLabel(),
'message' => [
'#type' => 'markup',
'#markup' => $alert
->getMessage(),
],
],
];
}
$timeout = $this
->getConfiguration()['timeout'];
if ($timeout > 0 || $workaround_needed) {
$build['#attached'] = [
'library' => [
'site_alert/drupal.site_alert',
],
'drupalSettings' => [
'siteAlert' => [
'timeout' => $timeout,
'workaround_needed' => $workaround_needed,
],
],
];
}
if (!empty($build)) {
$build['#prefix'] = '<div class="site-alert" aria-live="polite">';
$build['#suffix'] = '</div>';
}
$metadata
->applyTo($build);
return $build;
}
public function defaultConfiguration() {
return [
'timeout' => self::TIMEOUT_DEFAULT,
] + parent::defaultConfiguration();
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form = parent::buildConfigurationForm($form, $form_state);
$timeout = $this
->getConfiguration()['timeout'];
$form['timeout'] = [
'#type' => 'number',
'#title' => $this
->t('Timeout'),
'#description' => $this
->t('After how many seconds the alerts should be refreshed. Set to 0 if you do not wish to poll the server for updates.'),
'#default_value' => $timeout,
'#field_suffix' => ' ' . $this
->t('seconds'),
'#required' => TRUE,
'#min' => 0,
];
return $form;
}
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
parent::submitConfigurationForm($form, $form_state);
$this
->setConfigurationValue('timeout', $form_state
->getValue('timeout'));
}
public function getCacheTags() {
$list_cache_tags = $this->entityTypeManager
->getDefinition('site_alert')
->getListCacheTags();
return Cache::mergeTags(parent::getCacheTags(), $list_cache_tags);
}
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), [
'active_site_alerts',
]);
}
public function getCacheMaxAge() {
$storage = $this->entityTypeManager
->getStorage('site_alert');
return $storage
->getCacheMaxAge();
}
}