Есть модуль, в нём завёл файл my_module.api.php. В нём моё недо-api. Почему "недо"? Да потому что это не хуки, а обычные функции, которые мне потом пригодятся в других модулях.
Судя по документации, Drupal сам сканирует модули на наличие php файлов и подключает их.
Но, беда. Немогу вызвать функцию из этого файла в другом модуле.
Где я ошибся?
Ответы
Итак, рассказываю.
-
Друпал из коробки умеет искать классы (и интерфейсы) в файлах из инфо-файла (files[]).
Классический пример — хендлеры вьюсов: http://cgit.drupalcode.org/entityreference_filter/tree/entityreference_f...
Файл entityreference_filter_view_result.inc (название файла роли не играет) будет подгружен автолоадером друпала при вызове классаentityreference_filter_view_result
.
Процедурный код так не подключишь, см. п. 4. -
Некоторые API позволяют выносить файлы с функциями с помощью параметров 'file path'/'file'.
Классический пример —hook_menu()
.page callback
можно выносить в отдельный файл, но вот дляaccess callback
это уже работать не будет. -
Друпал может подгружать файлы групп хуков.
Необязательно всем хукам жить в .module. Видели файлы типа mymodile.tokens.inc, mymodile.variable.inc, mymodule.i18n.inc? Хуки с группами, объявленными с помощьюhook_hook_info()
, можно смело выносить в такие файлы. -
Обычный
require_once
спасёт отца русской демократии.
Бьём файл .module на логические куски и подключаем их сверху с помощьюrequire_once
. Всё.
module_load_include()
— когда вы не уверены, есть ли вообще такой модуль и файл в системе. См. https://twitter.com/drupal_review/status/235380645134745601 -
https://www.drupal.org/project/xautoload
Если планируется много кода, сразу ставьте и не мучайтесь. Умеет и PSR-4, и конструкции типаfiles[] = includes/*.inc
.
Судя по документации, Drupal сам сканирует модули на наличие php файлов и подключает их.
Где я ошибся?
Вот в этом и ошибся. Файл api.php служит для документации хуков. Если тебе нужны вспомогательные функции, то выноси их в отдельный класс статическими методами. Вот пример такой реализации http://cgit.drupalcode.org/sandbox-xandeadx-2160935/tree/
Еще можно подгружать нужные файлы через module_load_include
module_load_include('[расширение файла]', '[модуль]', '[путь до файла относительно папки модуля]');
Приходилось пользоваться, хотя чаще (как сказали выше) пользуюсь статическим классом. Не забываем файл с классом прописывать в info файле модуля