class SiteAlertBlock in Site Alert 8
Implements SiteAlertBlock class.
Plugin annotation
@Block(
id = "site_alert_block",
admin_label = @Translation("Site Alert"),
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Component\Plugin\ContextAwarePluginBase implements ContextAwarePluginInterface
- class \Drupal\Core\Plugin\ContextAwarePluginBase implements CacheableDependencyInterface, ContextAwarePluginInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\Core\Block\BlockBase implements BlockPluginInterface, PluginWithFormsInterface, PreviewFallbackInterface uses BlockPluginTrait, ContextAwarePluginAssignmentTrait
- class \Drupal\site_alert\Plugin\Block\SiteAlertBlock implements ContainerFactoryPluginInterface
- class \Drupal\Core\Block\BlockBase implements BlockPluginInterface, PluginWithFormsInterface, PreviewFallbackInterface uses BlockPluginTrait, ContextAwarePluginAssignmentTrait
- class \Drupal\Core\Plugin\ContextAwarePluginBase implements CacheableDependencyInterface, ContextAwarePluginInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\Component\Plugin\ContextAwarePluginBase implements ContextAwarePluginInterface
Expanded class hierarchy of SiteAlertBlock
2 files declare their use of SiteAlertBlock
- SiteAlertCacheTest.php in tests/
src/ Functional/ SiteAlertCacheTest.php - site_alert.module in ./
site_alert.module - Allows admins to display a site-wide alert to all users.
File
- src/
Plugin/ Block/ SiteAlertBlock.php, line 24
Namespace
Drupal\site_alert\Plugin\BlockView source
class SiteAlertBlock extends BlockBase implements ContainerFactoryPluginInterface {
/**
* The default timeout for refreshing site alerts.
*/
const TIMEOUT_DEFAULT = 300;
/**
* The service that retrieves site alerts.
*
* @var \Drupal\site_alert\GetAlertsInterface
*/
protected $getAlerts;
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The module handler.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Constructs a new SiteAlertBlock.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\site_alert\GetAlertsInterface $getAlerts
* The service that retrieves site alerts.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
* The entity type manager service.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler
* The module handler.
*/
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;
}
/**
* {@inheritdoc}
*/
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'));
}
/**
* {@inheritdoc}
*/
public function build() {
$build = [];
$metadata = new CacheableMetadata();
// Due to a bug in Drupal core the cache max age is ignored when the core
// page_cache module is enabled. This bug prevents any cached pages from
// being invalidated in time for a scheduled alert to be displayed. We can
// work around this by injecting the JS code in the page and letting it
// retrieve the first alert on page load. This means that even if the page
// is cached it will poll the server for any available alerts and display
// them. The drawback is that this will always cause a second request to be
// sent which increases server load, so only do this if any alerts are
// actually scheduled.
// @todo Remove this workaround when the core bug is fixed.
// @see https://www.drupal.org/project/site_alert/issues/3121988
/** @var \Drupal\site_alert\SiteAlertStorage $storage */
$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);
// Avoid displaying the alert if we need to work around the core bug. This
// prevents site alerts from briefly flashing in the page in case the bug
// prevents a cached page that contains an alert from being invalidated.
if ($workaround_needed) {
continue;
}
$build[] = [
'#theme' => 'site_alert',
'#alert' => [
'severity' => $alert
->getSeverity(),
'label' => $alert
->getLabel(),
'message' => [
'#type' => 'markup',
'#markup' => $alert
->getMessage(),
],
],
];
}
// Attach the JS code to refresh the site alerts when a timeout is
// configured.
$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;
}
/**
* {@inheritdoc}
*/
public function defaultConfiguration() {
return [
'timeout' => self::TIMEOUT_DEFAULT,
] + parent::defaultConfiguration();
}
/**
* {@inheritdoc}
*/
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;
}
/**
* {@inheritdoc}
*/
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
parent::submitConfigurationForm($form, $form_state);
$this
->setConfigurationValue('timeout', $form_state
->getValue('timeout'));
}
/**
* {@inheritdoc}
*/
public function getCacheTags() {
// The block should be invalidated whenever any site alert changes.
$list_cache_tags = $this->entityTypeManager
->getDefinition('site_alert')
->getListCacheTags();
return Cache::mergeTags(parent::getCacheTags(), $list_cache_tags);
}
/**
* {@inheritdoc}
*/
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), [
'active_site_alerts',
]);
}
/**
* {@inheritdoc}
*/
public function getCacheMaxAge() {
/** @var \Drupal\site_alert\SiteAlertStorageInterface $storage */
$storage = $this->entityTypeManager
->getStorage('site_alert');
return $storage
->getCacheMaxAge();
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
BlockPluginInterface:: |
constant | Indicates the block label (title) should be displayed to end users. | ||
BlockPluginTrait:: |
protected | property | The transliteration service. | |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
protected | function | Returns generic default configuration for block plugins. | |
BlockPluginTrait:: |
protected | function | Indicates whether the block should be shown. | 16 |
BlockPluginTrait:: |
public | function | 16 | |
BlockPluginTrait:: |
public | function | 13 | |
BlockPluginTrait:: |
public | function | 3 | |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | 1 | |
BlockPluginTrait:: |
public | function | 1 | |
BlockPluginTrait:: |
public | function | 3 | |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | Sets the transliteration service. | |
BlockPluginTrait:: |
protected | function | Wraps the transliteration service. | |
BlockPluginTrait:: |
public | function | Most block plugins should not override this method. To add validation for a specific block type, override BlockBase::blockValidate(). | 1 |
ContextAwarePluginAssignmentTrait:: |
protected | function | Builds a form element for assigning a context to a given slot. | |
ContextAwarePluginAssignmentTrait:: |
protected | function | Wraps the context handler. | |
ContextAwarePluginBase:: |
protected | property | The data objects representing the context of this plugin. | |
ContextAwarePluginBase:: |
private | property | Data objects representing the contexts passed in the plugin configuration. | |
ContextAwarePluginBase:: |
protected | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
This code is identical to the Component in order to pick up a different
Context class. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Gets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the value for a defined context. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the values for all defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Set a context on this plugin. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Sets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Sets the value for a defined context. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Validates the set values for the defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function | Implements magic __get() method. | |
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
PluginWithFormsTrait:: |
public | function | ||
PluginWithFormsTrait:: |
public | function | ||
SiteAlertBlock:: |
protected | property | The entity type manager. | |
SiteAlertBlock:: |
protected | property | The service that retrieves site alerts. | |
SiteAlertBlock:: |
protected | property | The module handler. | |
SiteAlertBlock:: |
public | function |
Builds and returns the renderable array for this block plugin. Overrides BlockPluginInterface:: |
|
SiteAlertBlock:: |
public | function |
Creates a generic configuration form for all block types. Individual
block plugins can add elements to this form by overriding
BlockBase::blockForm(). Most block plugins should not override this
method unless they need to alter the generic form elements. Overrides BlockPluginTrait:: |
|
SiteAlertBlock:: |
public static | function |
Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface:: |
|
SiteAlertBlock:: |
public | function |
Overrides BlockPluginTrait:: |
|
SiteAlertBlock:: |
public | function |
The cache contexts associated with this object. Overrides ContextAwarePluginBase:: |
|
SiteAlertBlock:: |
public | function |
The maximum age for which this object may be cached. Overrides ContextAwarePluginBase:: |
|
SiteAlertBlock:: |
public | function |
The cache tags associated with this object. Overrides ContextAwarePluginBase:: |
|
SiteAlertBlock:: |
public | function |
Most block plugins should not override this method. To add submission
handling for a specific block type, override BlockBase::blockSubmit(). Overrides BlockPluginTrait:: |
|
SiteAlertBlock:: |
constant | The default timeout for refreshing site alerts. | ||
SiteAlertBlock:: |
public | function |
Constructs a new SiteAlertBlock. Overrides BlockPluginTrait:: |
|
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
TypedDataTrait:: |
protected | property | The typed data manager used for creating the data types. | |
TypedDataTrait:: |
public | function | Gets the typed data manager. | 2 |
TypedDataTrait:: |
public | function | Sets the typed data manager. | 2 |