Вы здесь

Своё API

1

Есть модуль, в нём завёл файл my_module.api.php. В нём моё недо-api. Почему "недо"? Да потому что это не хуки, а обычные функции, которые мне потом пригодятся в других модулях.
Судя по документации, Drupal сам сканирует модули на наличие php файлов и подключает их.
Но, беда. Немогу вызвать функцию из этого файла в другом модуле.
Где я ошибся?

Версия Drupal: 
7.x
Вопрос задан 20.03.2015 - 11:56
Аватар пользователя SAM
SAM
208

Ответы

2

Итак, рассказываю.

  1. Друпал из коробки умеет искать классы (и интерфейсы) в файлах из инфо-файла (files[]).
    Классический пример — хендлеры вьюсов: http://cgit.drupalcode.org/entityreference_filter/tree/entityreference_f...
    Файл entityreference_filter_view_result.inc (название файла роли не играет) будет подгружен автолоадером друпала при вызове класса entityreference_filter_view_result.
    Процедурный код так не подключишь, см. п. 4.

  2. Некоторые API позволяют выносить файлы с функциями с помощью параметров 'file path'/'file'.
    Классический пример — hook_menu(). page callback можно выносить в отдельный файл, но вот для access callback это уже работать не будет.

  3. Друпал может подгружать файлы групп хуков.
    Необязательно всем хукам жить в .module. Видели файлы типа mymodile.tokens.inc, mymodile.variable.inc, mymodule.i18n.inc? Хуки с группами, объявленными с помощью hook_hook_info(), можно смело выносить в такие файлы.

  4. Обычный require_once спасёт отца русской демократии.
    Бьём файл .module на логические куски и подключаем их сверху с помощью require_once. Всё.
    module_load_include() — когда вы не уверены, есть ли вообще такой модуль и файл в системе. См. https://twitter.com/drupal_review/status/235380645134745601

  5. https://www.drupal.org/project/xautoload
    Если планируется много кода, сразу ставьте и не мучайтесь. Умеет и PSR-4, и конструкции типа files[] = includes/*.inc.

Ответ дан 29.03.2015 - 12:39
Аватар пользователя Kate
Kate
21
1

Судя по документации, Drupal сам сканирует модули на наличие php файлов и подключает их.

Где я ошибся?

Вот в этом и ошибся. Файл api.php служит для документации хуков. Если тебе нужны вспомогательные функции, то выноси их в отдельный класс статическими методами. Вот пример такой реализации http://cgit.drupalcode.org/sandbox-xandeadx-2160935/tree/

Ответ дан 20.03.2015 - 13:24
Аватар пользователя drupby
drupby
449
1

Еще можно подгружать нужные файлы через module_load_include

module_load_include('[расширение файла]', '[модуль]', '[путь до файла относительно папки модуля]');

Приходилось пользоваться, хотя чаще (как сказали выше) пользуюсь статическим классом. Не забываем файл с классом прописывать в info файле модуля

Ответ дан 20.03.2015 - 21:41