Здравствуйте!
При разработки собственного модуля возникла необходимость использовать некоторые его функции вне модуля, т.е. сделать некоторые функции глобальными.
Прошу объяснить ряд вопросов:
1. Как правильно называть функции чтобы они были видны в любом месте?
2. Как правильно называть функции чтобы они были видны в любом месте, если они находятся в подмодуле?
3. Я где-то читал что Drupal определяет интерфейс модуля только при первом включении этого модуля. Так ли это? Если это правда, то можно ли еще раз определить интерфейс модуля не выключая модуль? Возможно есть какая-нибудь процедура, типа "Отчистить кэш".
4. Если в модуле есть несколько файлов с кодом, а функции, которые являются интерфейсом, находятся не в файле my_module.module, надо ли о таком файле сообщать в файле my_module.info, чтобы его функции стали видны?
Спасибо за внимание!
Комментарии
1. Если модуль написан в процедурном стиле - все функции (процедуры) будут "глобальными". Drupal загружает все включенные модули.
2. Принято начинать название функции с имени модуля, для того чтоб разграничить пространства имен. Ну, и название должно передавать смысл (задачу) ф-ции, желательно.
3. Поясните, какое значение Вы вкладываете в понятие "интерфейс модуля"? Вы можете подключить любой файл скрипта в любом месте, с помощью конструкций module_load_include (предпочтительно) или require_once.
4. Переменные, особенно глобальные - зло. Drupal автоматически загружает файлы модуля MODULE_NAME.module если он включен, а так же все файлы объявленные в MODULE_NAME.info в директиве files[]. По остальным - читать прошлый пункт.
1. Функции в процедурном стиле
2. Ваш ответ понятен, но ясности не дал. Я столкнулся с такой проблемой:
Включил модуль
Понял что мне необходимо использовать функцию из модуля в другом месте
Искомая функция не находится файле MODULE_NAME.module, в другом. Этот файл я объявил в MODULE_NAME.info в директиве files[].
Попробовал вызвать функцию в devel и в ответ получил что данной функции не существует
3. Интерфейс - глобальные методы и функции модуля. В моем случае именно функции
4. Ошибка вышла - не переменные, а функции.
Вопрос во 2 пункте.
Действительно могу.
Но Ваш ответ ясности не дал. Ведь я сделал как в инструкции - функция начинается с названия модуля. Файл объявил в нужной директиве файла .info. А функция так и не стала глобальной.
А может и стала, просто drual о ней еще не знает.
Мой вопрос в том как сделать функцию глобальной. Вы же не пишите include когда используюуете taxonomy_term_load() . Вот хочу так же.
Перечитайте еще раз.
В .info реквайрить файлы нужно в весьма ограниченных случаях, чаще для загрузки классов. Крайне сомневаюсь что в Вашем случае это необходимо.
Если не хотите инклюдить файл для использования определенной функции - пишите ее в основном файле модуля, или заинклюдьте нужный файл там же для "глобального доступа".
Создается впечатление, что он хочет в info прописать файл ВНЕ ПАПКИ модуля - то есть лежащий совсем в другом месте. А не выходит
Создается впечатление, что он хочет в info прописать файл ВНЕ ПАПКИ модуля - то есть лежащий совсем в другом месте. А не выходит
На всякий случай уточню:
- модуль включен?
- после изменения кода кеш сброшен?
Бывает, что нужно сделать opcache_reset() при некоторых настройках opcache.
Модуль включен
Кэш сброшен
покажите, что в .module и в .info
Да не будет он ниче показывать, вангую это для взлома сайта тема, он там хочет прописать скрипт с другого сайта
файл в папке модуля?
ЗЫ - для старта, очень полезным является "ковыряние" и рассмотрение со всех возможных сторон, модуля Examples for Developers. Там очень много примеров на все случаи жизни.
Качайте, открывайте, смотрите.
А не поясните, с чем связана такая экзотическая необходимость? Мне что-то в голову кроме неприятных для хозяина сайта вещей ничего не приходит.
если функция вызывается из меню - можете через hook_menu указать, в каком файле эта функция находится.
Чтобы функции не висели постоянно на всех страницах нужный файл можно подключать через https://api.drupal.org/api/drupal/includes%21module.inc/function/module_...
Спасибо всем за ответы.
Использую module_load_include();