Друпал не посилається на мої гачки


9

Я розробляю модуль, але гачки, які я додаю, не використовуються в Drupal. Це відбувається з більш ніж одним гаком.

Я читав документацію на гачки, і не можу знайти нічого, що б пояснило, чому це відбувається. Я перевірив, що я використовую правильні параметри та повертаю правильне значення.

Що я роблю неправильно? Що-небудь мені не вистачає?


Це питання вважається канонічним для тих питань про гачки, на які Drupal не посилається.
kiamlaluno

Відповіді:


13

Розробляючи модуль, слід пам’ятати про наступні примітки.

  • Реалізація гачка, виконаного з модуля, - це функція, назва якої є префіксом короткого імені модуля (також називається ім'ям машини ); з назви гака, зніміть частину гака і замініть його на ім'я машини модуля. Наприклад, реалізація hook_menu()зроблено з example.module є example_menu(). Якщо модуль example_menu.module, а функція є example_menu(), це не вважається hook_menu()реалізацією для example_menu.module.
    Це також означає, наприклад, що hook_form_alter()реалізація в example_form.module не є example_form_alter(), але example_form_form_alter(). В якості іншого прикладу реалізація hook_form_FORM_ID_alter()зробленої для зміни форми, повернутої user_register_form()з example.module, не є example_form_user_register_alter(), алеexample_form_user_register_form_alter(). (Ідентифікатор форми - це user_register_form .)

  • Взагалі кажучи, використання великих літер у назві машини модуля не створює проблем: PHP не робить різниць між myModule_get_value(), та mymodule_get_value(), і $value = myModule_get_value()буде викликати або myModule_get_value(), або mymodule_get_value().
    Хоча, є випадок, коли використання великих літер у назві машини може викликати проблеми: під час визначення гаків оновлення для модуля. drupal_get_schema_versions(), функція, яка повертає список доступних оновлень, містить наступний код.

    // Prepare regular expression to match all possible defined hook_update_N().
    $regexp = '/^(?P<module>.+)_update_(?P<version>\d+)$/';
    $functions = get_defined_functions();
    // Narrow this down to functions ending with an integer, since all
    // hook_update_N() functions end this way, and there are other
    // possible functions which match '_update_'. We use preg_grep() here
    // instead of foreaching through all defined functions, since the loop
    // through all PHP functions can take significant page execution time
    // and this function is called on every administrative page via
    // system_requirements().
    foreach (preg_grep('/_\d+$/', $functions['user']) as $function) {
      // If this function is a module update function, add it to the list of
      // module updates.
      if (preg_match($regexp, $function, $matches)) {
        $updates[$matches['module']][] = $matches['version'];
      }
    }

    Останній рядок, виконаний із, drupal_get_schema_versions()- наступний.

    return empty($updates[$module]) ? FALSE : $updates[$module];

    Якщо ім'я модуля myModule.module, drupal_get_schema_versions('myModule')поверне лише функції з іменем, яке починається з myModule_update і закінчується числом; такі функції, як, наприклад mymodule_update_7120(), не будуть включені, оскільки регулярне вираження, яке використовується drupal_get_schema_versions(), чутливе до регістру Це все ще стосується Drupal 8, оскільки регулярний вираз все ще той самий, що використовується в Drupal 7.

  • Деякі гачки викликаються в конкретні моменти. Наприклад, hook_menu()і hook_menu_alter()викликаються з Drupal 7 після ввімкнення / відключення модуля або після очищення кешу інформації про маршрутизатор; hook_init()не викликається для кешованих сторінок.
    Щойно гачки викликаються через певну подію, вони не зателефонують знову, поки подібна подія не відбудеться. Вони не викликаються у двох послідовних запитах на сторінку.

  • Drupal кешує список гачків, реалізованих з модуля. Якщо ви редагуєте код увімкненого модуля, щоб додати нові гачки, спочатку потрібно відключити та знову включити модуль, інакше Drupal не помітить, що є нові гачки.

  • Переконайтесь, що returnвиписка не пробралася в одну з функцій гака під час рефакторингу. У нього є потенціал зламати не тільки гак, на якому він виявляється, але й викликати ланцюгову реакцію, яка також зламає інші гачки, що ускладнює пошук проблеми.


Також, можливо, варто згадати мою помилку заради інших у майбутньому: НЕ визначайте простір імен у вашому .module (або будь-якому іншому «плоскому», некласовому PHP) файлі. В іншому випадку Drupal не розпізнає ваш файл, тому не виявить гачки, визначені в них.
Балу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.