Commit b3b93070 authored by Stef De Waele's avatar Stef De Waele Committed by Sascha Grossenbacher
Browse files

Issue #3088219 by joachim, Erik Frèrejean: Inconsistent loading of third party hook implementations

parent 559bc8c1
Loading
Loading
Loading
Loading
+0 −23
Original line number Diff line number Diff line
@@ -205,29 +205,6 @@ function token_entity_type_alter(array &$entity_types) {
  }
}

/**
 * Implements hook_module_implements_alter().
 *
 * Adds missing token support for core modules.
 */
function token_module_implements_alter(&$implementations, $hook) {
  \Drupal::moduleHandler()->loadInclude('token', 'inc', 'token.tokens');

  if ($hook == 'tokens' || $hook == 'token_info' || $hook == 'token_info_alter' || $hook == 'tokens_alter') {
    foreach (_token_core_supported_modules() as $module) {
      if (\Drupal::moduleHandler()->moduleExists($module) && function_exists($module . '_' . $hook)) {
        $implementations[$module] = TRUE;
      }
    }
    // Move token.module to get included first since it is responsible for
    // other modules.
    if (isset($implementations['token'])) {
      unset($implementations['token']);
      $implementations = array_merge(['token' => 'tokens'], $implementations);
    }
  }
}

/**
 * Return the module responsible for a token.
 *
+39 −12
Original line number Diff line number Diff line
@@ -123,12 +123,27 @@ function token_token_info_alter(&$info) {
      ];
    }
  }

  // Call proxy implementations.
  if (\Drupal::moduleHandler()->moduleExists('field')) {
    _field_token_info_alter($info);
  }
}

/**
 * Implements hook_token_info().
 */
function token_token_info() {
  $info = [];

  // Call proxy implementations.
  if (\Drupal::moduleHandler()->moduleExists('book')) {
    $info += _book_token_info();
  }
  if (\Drupal::moduleHandler()->moduleExists('menu_ui')) {
    $info += _menu_ui_token_info();
  }

  // Node tokens.
  if (\Drupal::moduleHandler()->moduleExists('node')) {
    $info['tokens']['node']['source'] = [
@@ -476,6 +491,18 @@ function token_token_info() {
 */
function token_tokens($type, array $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
  $replacements = [];

  // Call proxy implementations.
  if (\Drupal::moduleHandler()->moduleExists('book')) {
    $replacements += _book_tokens($type, $tokens, $data, $options, $bubbleable_metadata);
  }
  if (\Drupal::moduleHandler()->moduleExists('menu_ui')) {
    $replacements += _menu_ui_tokens($type, $tokens, $data, $options, $bubbleable_metadata);
  }
  if (\Drupal::moduleHandler()->moduleExists('field')) {
    $replacements += _field_tokens($type, $tokens, $data, $options, $bubbleable_metadata);
  }

  $language_manager = \Drupal::languageManager();
  $url_options = ['absolute' => TRUE];
  if (isset($options['langcode'])) {
@@ -1182,9 +1209,9 @@ function token_tokens($type, array $tokens, array $data, array $options, Bubblea
}

/**
 * Implements hook_token_info() on behalf of book.module.
 * Proxy implementation of hook_token_info() on behalf of book.module.
 */
function book_token_info() {
function _book_token_info() {
  $info['types']['book'] = [
    'name' => t('Book'),
    'description' => t('Tokens related to books.'),
@@ -1225,9 +1252,9 @@ function book_token_info() {
}

/**
 * Implements hook_tokens() on behalf of book.module.
 * Proxy implementation of hook_tokens() on behalf of book.module.
 */
function book_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
function _book_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
  $replacements = [];

  // Node tokens.
@@ -1291,9 +1318,9 @@ function book_tokens($type, $tokens, array $data, array $options, BubbleableMeta
}

/**
 * Implements hook_token_info() on behalf of menu_ui.module.
 * Proxy implementation of hook_token_info() on behalf of menu_ui.module.
 */
function menu_ui_token_info() {
function _menu_ui_token_info() {
  // Menu tokens.
  $info['types']['menu'] = [
    'name' => t('Menus'),
@@ -1343,9 +1370,9 @@ function menu_ui_token_info() {
}

/**
 * Implements hook_tokens() on behalf of menu_ui.module.
 * Proxy implementation of hook_tokens() on behalf of menu_ui.module.
 */
function menu_ui_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
function _menu_ui_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
  $replacements = [];

  /** @var \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager */
@@ -1502,12 +1529,12 @@ function _token_menu_link_best_match(NodeInterface $node, array $links) {
}

/**
 * Implements hook_token_info_alter() on behalf of field.module.
 * Proxy implementation of hook_token_info_alter() on behalf of field.module.
 *
 * We use hook_token_info_alter() rather than hook_token_info() as other
 * modules may already have defined some field tokens.
 */
function field_token_info_alter(&$info) {
function _field_token_info_alter(&$info) {
  $type_info = \Drupal::service('plugin.manager.field.field_type')->getDefinitions();

  // Attach field tokens to their respecitve entity tokens.
@@ -1683,9 +1710,9 @@ function _token_field_label($entity_type, $field_name) {
}

/**
 * Implements hook_tokens() on behalf of field.module.
 * Proxy implementation of hook_tokens() on behalf of field.module.
 */
function field_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
function _field_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
  $replacements = [];

  $langcode = isset($options['langcode']) ? $options['langcode'] : NULL;