context.module 3.39 KB
Newer Older
1 2
<?php

3
use Drupal\Core\Routing\RouteMatchInterface;
4
use Drupal\Component\Utility\NestedArray;
5

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/**
 * Implements hook_help().
 */
function context_help($route_name, RouteMatchInterface $route_match) {
  switch ($route_name) {
    case 'help.page.context':
      $output = '';
      $output .= '<h3>' . t('About') . '</h3>';
      $output .= '<p>'.t('The Context module lets users define conditions for when certain reactions should take place.').'</p>';
      $output .= '<p>'.t('An example of a condition could be when viewing a certain node type and blocks should be placed as a reaction when viewing a page with this node type.').'</p>';
      $output .= '<h3>' . t('Uses') . '</h3>';
      $output .= '<dl>';
      $output .= '<dt>' . t('Managing context') . '</dt>';
      $output .= '<dd>' . t('Users with <em>Administer contexts</em> permission can add contextual conditions and reactions for different portions of their site. For each context, they can choose the conditions that trigger this context to be active and choose different aspects of their site that should react to this active context.') . '</dd>';
      $output .= '<dt>' . t('Adding new custom reactions') . '</dt>';
21
      $output .= '<dd>' . t('Reactions for the context module are defined trough the new <a href=":link">Drupal 8 Plugin API</a>.', [':link' =>'https://www.drupal.org/developing/api/8/plugins']) . '</dd>';
22 23 24 25 26 27 28
      $output .= '<dd>' . t('The Context module defines a plugin type named ContextReaction that users can extend when creating their own plugins.') . '</dd>';
      $output .= '<dd>' . t('A context reaction requires a configuration form and execute method. The execution of the plugin is also something that will have to be handled by the author of the reaction.') . '</dd>';
      $output .= '</dl>';
      return $output;
  }
}

29
/**
NormySan's avatar
NormySan committed
30 31
 * Run the body class context reactions if there are any and let them add
 * classes to the page body.
32
 *
NormySan's avatar
NormySan committed
33
 * Implements hook_preprocess_HOOK().
34
 */
NormySan's avatar
NormySan committed
35
function context_preprocess_html(&$variables) {
36 37 38 39 40 41
  /** @var \Drupal\context\ContextManager $context_manager */
  $context_manager = \Drupal::service('context.manager');

  foreach ($context_manager->getActiveReactions('body_class') as $reaction) {
    $variables['attributes'] = NestedArray::mergeDeep($variables['attributes'], $reaction->execute());
  }
42
}
43 44 45 46 47 48 49 50 51 52 53

/**
 * Implements hook_theme_suggestions_page_alter().
 */
function context_theme_suggestions_page_alter(array &$suggestions, array $variables) {
  $context_manager = \Drupal::service('context.manager');
  foreach ($context_manager->getActiveReactions('page_template_suggestions') as $reaction) {
    $template_suggestions = explode(PHP_EOL, $reaction->execute());
    $suggestions = array_merge($suggestions, $template_suggestions);
  }
}
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

/**
 * Implements hook_preprocess_page().
 */
function context_preprocess_page(&$variables) {
  // Active theme for route.
  $current_theme = \Drupal::service('theme.negotiator')->determineActiveTheme(Drupal::routeMatch());

  // Context manager.
  $context_manager = \Drupal::service('context.manager');

  // Disable regions based on regions reaction.
  foreach ($context_manager->getActiveReactions('regions') as $region_reaction) {
    $configuration = $region_reaction->getConfiguration();
    if (isset($configuration['regions'][$current_theme])) {
      foreach ($configuration['regions'][$current_theme] as $region) {
        unset($variables['page'][$region]);
      }
    }
  }

}