sitewide_alerts-1.0.0/sitewide_alerts.module
sitewide_alerts.module
<?php
/**
* @file
* Contains sitewide_alerts.module.
*/
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Url;
use Drupal\sitewide_alerts\SiteAlertMaxLengthCallbacks;
/**
* Implements hook_help().
*/
function sitewide_alerts_help($route_name, RouteMatchInterface $route_match) {
if ($route_name == 'help.page.sitewide_alerts') {
$text = file_get_contents(__DIR__ . '/README.md');
if (!Drupal::moduleHandler()->moduleExists('markdown')) {
return '<pre>' . $text . '</pre>';
}
else {
/** @var \Drupal\markdown\PluginManager\ParserManagerInterface $parser_manager */
$parser_manager = \Drupal::service('plugin.manager.markdown.parser');
$parser = $parser_manager->getDefaultParser([
'render_strategy' => ['type' => 'none'],
]);
return $parser->parse($text);
}
}
return NULL;
}
/**
* Implements hook_theme().
*/
function sitewide_alerts_theme($existing, $type, $theme, $path) {
return [
'site_alerts' => [
'file' => 'sitewide_alerts.theme.inc',
'variables' => [
'alerts' => NULL,
'view_mode' => NULL,
],
],
'site_alert_types' => [
'file' => 'sitewide_alerts.theme.inc',
'variables' => [
'alert_types' => NULL,
'view_mode' => NULL,
],
],
'site_alert_type' => [
'file' => 'sitewide_alerts.theme.inc',
'variables' => [
'site_alert_type' => NULL,
'site_alert_type_icon' => NULL,
'view_mode' => NULL,
],
],
'site_alert_close' => [
'variables' => [
'site_alert' => NULL,
'view_mode' => NULL,
],
],
'site_alert' => [
'file' => 'sitewide_alerts.theme.inc',
'render element' => 'elements',
],
'site_alert__alert_bar' => [
'file' => 'sitewide_alerts.theme.inc',
'base hook' => 'site_alert',
],
];
}
/**
* Implements hook_theme_suggestions_HOOK().
*/
function sitewide_alerts_theme_suggestions_site_alert(array $variables) {
$suggestions = [];
$site_alert = $variables['elements']['#site_alert'];
$sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_');
$suggestions[] = 'site_alert__' . $sanitized_view_mode;
$suggestions[] = 'site_alert__' . $site_alert->id();
$suggestions[] = 'site_alert__' . $site_alert->id() . '__' . $sanitized_view_mode;
return $suggestions;
}
/**
* Implements hook_theme_suggestions_HOOK().
*/
function sitewide_alerts_theme_suggestions_site_alerts(array $variables) {
$suggestions = [];
if (!empty($variables['view_mode'])) {
$sanitized_view_mode = strtr($variables['view_mode'], '.', '_');
$suggestions[] = 'site_alerts__' . $sanitized_view_mode;
}
return $suggestions;
}
/**
* Implements hook_theme_suggestions_HOOK().
*/
function sitewide_alerts_theme_suggestions_site_alert_types(array $variables) {
$suggestions = [];
if (!empty($variables['view_mode'])) {
$sanitized_view_mode = strtr($variables['view_mode'], '.', '_');
$suggestions[] = 'site_alert_types__' . $sanitized_view_mode;
}
return $suggestions;
}
/**
* Implements hook_theme_suggestions_HOOK().
*/
function sitewide_alerts_theme_suggestions_site_alert_type(array $variables) {
$suggestions = [];
if (!empty($variables['view_mode'])) {
$sanitized_view_mode = strtr($variables['view_mode'], '.', '_');
$suggestions[] = 'site_alert_type__' . $sanitized_view_mode;
}
return $suggestions;
}
/**
* Implements hook_theme_suggestions_HOOK().
*/
function sitewide_alerts_theme_suggestions_site_alert_close(array $variables) {
$suggestions = [];
if (!empty($variables['view_mode'])) {
$sanitized_view_mode = strtr($variables['view_mode'], '.', '_');
$suggestions[] = 'site_alert_close__' . $sanitized_view_mode;
}
return $suggestions;
}
/**
* Implements hook_page_top().
*/
function sitewide_alerts_page_top(array &$page_top): void {
/** @var \Drupal\sitewide_alerts\SiteAlertService $site_alert_service */
$site_alert_service = \Drupal::service('sitewide_alerts.site_alert_service');
$position = $site_alert_service->getConfig()->get('position');
if (!empty($position) && $position == 'top') {
$language = \Drupal::languageManager()->getCurrentLanguage()->getId();
$page_top['site_alert'] = $site_alert_service->getSiteAlertBar($language);
}
}
/**
* Implements hook_page_bottom().
*/
function sitewide_alerts_page_bottom(array &$page_bottom): void {
/** @var \Drupal\sitewide_alerts\SiteAlertService $site_alert_service */
$site_alert_service = \Drupal::service('sitewide_alerts.site_alert_service');
$position = $site_alert_service->getConfig()->get('position');
if (!empty($position) && $position == 'bottom') {
$language = \Drupal::languageManager()->getCurrentLanguage()->getId();
$page_bottom['site_alert'] = $site_alert_service->getSiteAlertBar($language);
}
}
/**
* Implements hook_menu_local_tasks_alter().
*/
function sitewide_alerts_menu_local_tasks_alter(&$data, $route_name): void {
if ($route_name == 'sitewide_alerts.config_form') {
$language_manager = \Drupal::languageManager();
$current_language = $language_manager->getCurrentLanguage();
$languages = $language_manager->getLanguages();
foreach ($languages as $language) {
if ($language->getId() != $current_language->getId()) {
$data['tabs'][0]['sitewide_alerts.translate_' . $language->getId() . '_tab'] = [
'#theme' => 'menu_local_task',
'#link' => [
'title' => t('Translate'),
'url' => Url::fromRoute('sitewide_alerts.config_form', [], [
'language' => $language,
]),
'localized_options' => [
'attributes' => [
'title' => t('Site alert settings'),
],
],
],
];
}
}
}
}
/**
* Implements hook_entity_operation().
*/
function sitewide_alerts_entity_operation(EntityInterface $entity) {
$operations = [];
// Add asset refresh operation.
if ($entity->getEntityTypeId() == 'site_alert') {
// Make sure account has permission.
$account = \Drupal::currentUser();
if ($account->hasPermission('tweet site alert')) {
// Tweet site alert operation.
$operations['tweet-site-alert'] = [
'title' => t('Tweet site alert'),
'weight' => 15,
'url' => Url::fromRoute("entity.site_alert.tweet", [
'site_alert' => $entity->id(),
]),
];
}
}
return $operations;
}
/**
* Implements hook_element_info_alter().
*/
function sitewide_alerts_element_info_alter(&$cache): void {
// Add prerender functions to textareas and text fields.
$cache['textfield']['#pre_render'][] = [
SiteAlertMaxLengthCallbacks::class,
'maxlengthPreRender',
];
$cache['textarea']['#pre_render'][] = [
SiteAlertMaxLengthCallbacks::class,
'maxlengthPreRender',
];
$cache['textarea']['#process'][] = [
SiteAlertMaxLengthCallbacks::class,
'processElement',
];
$cache['text_format']['#pre_render'][] = [
SiteAlertMaxLengthCallbacks::class,
'maxlengthPreRender',
];
$cache['text_format']['#process'][] = [
SiteAlertMaxLengthCallbacks::class,
'processElement',
];
}
/**
* Implements hook_entity_extra_field_info().
*/
function sitewide_alerts_entity_extra_field_info() {
$extra = [];
$extra['site_alert']['site_alert']['display']['site_alert_default_link'] = [
'label' => t('Alert default link'),
'description' => t('Site alert default link if alert link is not specified.'),
'visible' => FALSE,
];
return $extra;
}
/**
* Implements hook_ENTITY_TYPE_view().
*/
function sitewide_alerts_site_alert_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode): void {
// Alert default link field.
if ($display->getComponent('site_alert_default_link')) {
// Make sure site alert link is empty or not filled in.
if ($entity->hasField('field_site_alert_link') && $entity->get('field_site_alert_link')->isEmpty()) {
// Make sure we're not hiding the alert link.
if ($entity->hasField('field_site_alert_hide_link') && !$entity->get('field_site_alert_hide_link')->value) {
/** @var \Drupal\sitewide_alerts\SiteAlertService $site_alert_service */
$site_alert_service = \Drupal::service('sitewide_alerts.site_alert_service');
$language = \Drupal::languageManager()->getCurrentLanguage()->getId();
$build['site_alert_default_link'] = $site_alert_service->preRenderDefaultLink($language);
}
}
}
// Alert link field.
if ($display->getComponent('field_site_alert_link')) {
// If hiding the link, we need to destroy the render array.
if ($entity->hasField('field_site_alert_hide_link') && $entity->get('field_site_alert_hide_link')->value) {
$build['field_site_alert_link'] = [];
}
}
}
