You are here

function bootstrap_site_alert_page_top in Bootstrap Site Alert 8

Same name and namespace in other branches
  1. 8.2 bootstrap_site_alert.module \bootstrap_site_alert_page_top()

Implements hook_page_top().

File

./bootstrap_site_alert.module, line 13
The bootstrap_site_alert module file.

Code

function bootstrap_site_alert_page_top(array &$page_top) {

  // Grab our number of alerts.
  $count = \Drupal::state()
    ->get('bootstrap_site_alert_count', 0);
  if (!$count) {
    return;
  }
  for ($i = 0; $i < $count; $i++) {

    // Should we show on admin pages?
    $show_admin = \Drupal::state()
      ->get('bootstrap_site_alert_no_admin' . $i, 0) ? !\Drupal::service('router.admin_context')
      ->isAdminRoute() : TRUE;

    // Checks if we should exclude on the current page.
    $page_match = TRUE;
    $page_match_enabled = \Drupal::state()
      ->get('bootstrap_site_alert_exclude' . $i, 0);
    $paths = mb_strtolower(\Drupal::state()
      ->get('bootstrap_site_alert_only_paths' . $i, ''));

    // Adjust for the front page.
    $paths = str_replace('<front>', ltrim(\Drupal::config('system.site')
      ->get('page.front'), '/'), $paths);
    if ($page_match_enabled && !empty($paths)) {
      $path = ltrim(\Drupal::service('path.current')
        ->getPath(), '/');
      $page_match = \Drupal::service('path.matcher')
        ->matchPath($path, $paths);
    }

    // Set the message if need be..
    if (\Drupal::state()
      ->get('bootstrap_site_alert_active' . $i, 0) && \Drupal::currentUser()
      ->hasPermission('view bootstrap site alerts') && $show_admin && $page_match) {

      // Get variables.
      $level = \Drupal::state()
        ->get('bootstrap_site_alert_severity' . $i, NULL);
      $message = \Drupal::state()
        ->get('bootstrap_site_alert_message' . $i, NULL);
      $alert = '<div class="alert bs-site-alert ' . $level . '" role="alert"';

      // If dismissible, add 'close' button. Also add 'display:none' to the
      // alert element to prevent it from momentarily flickering onscreen
      // before we have a chance to hide it.
      if (\Drupal::state()
        ->get('bootstrap_site_alert_dismiss' . $i, 0)) {
        $alert .= ' style="display:none;">';
        $alert .= '<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>';
      }
      else {
        $alert .= '>';
      }
      $alert .= isset($message['value']) ? t($message['value']) : NULL;
      $alert .= '</div>';
      $page_top['bootstrap_site_alert' . $i] = [
        '#type' => 'inline_template',
        '#template' => $alert,
        '#weight' => 1000,
      ];
    }

    // If dismissable, attach JavaScript file and configure drupalSettings.
    if (\Drupal::state()
      ->get('bootstrap_site_alert_dismiss' . $i)) {

      // A random key is generated whenever an alert has changed. Pass this key
      // to drupalSettings so that it is accessible via JavaScript.
      $key = \Drupal::state()
        ->get('bootstrap_site_alert_key');
      $page_top['bootstrap_site_alert']['#attached'] = [
        'library' => [
          'bootstrap_site_alert/dismissed-cookie',
        ],
        'drupalSettings' => [
          'bootstrap_site_alert' => [
            'dismissedCookie' => [
              'key' => $key,
            ],
          ],
        ],
      ];
    }
  }
}