Недопустимая реализация mymodule form alter была добавлена модулем hook, реализующим alter


Я пытаюсь изменить функции своего модуля menu_ui. Изменение веса моего модуля не помогло, и я прочитал, что hook_module_implements_alter - это правильный путь. Итак, как описано здесь Я добавляю свой модуль в конец реализаций:

/**
 * Implements hook_module_implements_alter.
 */
function mymodule_module_implements_alter(&$implementations, $hook) {
  if ('form_alter' == $hook) {
    $group = $implementations['mecca_hierarchy_access'];
    unset($implementations['mecca_hierarchy_access']);
    $implementations['mecca_hierarchy_access'] = $group;
  }
}

Но это просто бросает:

Неперехваченное исключение PHP RuntimeException: "Недопустимая реализация mymodule_form_alter была добавлена hook_module_implements_alter()" в /path/to/core/lib/Drupal/Core/Extension/ModuleHandler.php строка 591

Изменение моей формы выглядит так:

function mymodule_form_node_form_alter(&$form, FormStateInterface $form_state) {
  // commented code
}

Что я делаю не так?

Author: Alex, 2016-05-18

1 answers

Исключение возникает из следующего кода. (См. ModuleHandler::buildImplementationInfo().)

    // If a new implementation was added, verify that the function exists.
    if (!function_exists($module . '_' . $hook)) {
      throw new \RuntimeException("An invalid implementation {$module}_{$hook} was added by hook_module_implements_alter()");
    }

Это просто происходит потому, что в вашем случае нет никакого mecca_hierarchy_access_form_alter() или подобного крючка, скорее всего, потому, что нет никакого модуля mecca_hierarchy_access.

Код, который вы хотите использовать, вероятно, следующий.

/**
 * Implements hook_module_implements_alter().
 */
function mymodule_module_implements_alter(&$implementations, $hook) {
  if ('form_alter' == $hook && isset($implementations['mymodule'])) {
    $group = $implementations['mymodule'];
    unset($implementations['mymodule']);
    $implementations['mymodule'] = $group;
  }
}

Всегда проверяйте, что реализация вашего модуля еще не была удалена из другого модуля, иначе ваша реализация крючка фактически установила бы $implementations['mymodule'] в NULL.

 3
Author: kiamlaluno, 2016-05-18 12:49:11