В друпале негласно принято держать служебные функции модуля в файле modulename.module
и добавлять именам функций префикс _
, например _node_types_build()
. Некоторые модули выносят функции в .inc
файл и перед вызовом дёргают module_load_include()
. Мне всегда не нравился такой подход, куда приятней хранить все системные функции в отдельном статическом классе. Приятным бонусом является автозагрузка классов, т.е. не надо вручную инклудить файл.
Реализация для Drupal 7
1. Создаём в папке модуля файл modulename_helper.inc
.
2. Реализуем в созданном файле класс modulename_helper
с набором статических функций:
class modulename_helper {
public static function my_function() {
// ...
}
public static function my_other_function() {
// ...
}
}
3. Добавляем в .info
файл модуля строчку:
files[] = modulename_helper.inc
4. Сбрасываем кэш.
5. В любом месте кода пользуемся функциями modulename_helper::my_function()
и modulename_helper::my_other_function()
.
Реализация для Drupal 8+
1. Создаём файл ModulenameHelper.php
в папке src
вашего модуля (т.е. modules/modulename/src/ModulenameHelper.php
относительно корня друпала).
2. Реализуем в созданном файле класс ModulenameHelper
с набором статических функций:
namespace Drupal\modulename;
class ModulenameHelper {
public static function myFunction() {
// ...
}
public static function myOtherFunction() {
// ...
}
}
3. Сбрасываем кэш.
4. В любом месте кода пользуемся функциями ModulenameHelper::myFunction()
и ModulenameHelper::myOtherFunction()
. Перед использованием не забываем добавить в начало файла строчку use Drupal\modulename\ModulenameHelper;
Так же в Drupal 8 можно хранить служебные функции в приватных методах контроллеров, форм, плагинов и т.д., таким образом отдельный класс-хелпер возможно и не понадобится.
- Дружим Sape и Internal Page Cache (вставка динамического содержимого в закэшированную страницу)
- Плагин блока, генерящий динамический контент с помощью #lazy_builder
- Тюнинг кэширования блоков с формой
- Оптимизация кэширования больших меню
- Вставка в CKEditor видео из ВКонтакте и Rutube (расширение модуля CKEditor 5 Media Embed)
Комментарии
Сори, этот метод не будет излишне загружать оперативную память?
наоборот
Это называется Utility pattern.
module_load_include, кстати обычно не нужен. Если подключаемый файл находится в том же модуле, то вполне можно обойтись require/include.
Не верный подход. Поскольку ф-я module_load_include сама использует require_once и делает это с некоторой проверкой (смотри тело ф-и). Да и не Drupal way это.
Вот как раз по этому она и не нужна в большинстве случаев. Нет смысла дергать drupal_get_path и is_file, если точно известно что подключаемый файл находится в этой же директории.
Если с собственно написанными классами все понятно, то что делать уже с готовыми?
Как в Drupal8 правильно подключить тот же самый phpQuery:
или в реализации одного файла phpQuery-onefile.php
или файл phpQuery.php и каталог phpQuery
я как-то интересовался этим вопросом и тогда ничего простого не было, хотя и сейчас вроде конкретики нет. варианты:
* libraries api
* сделать класс сервисом
* добавить класс в автозагрузку
* https://www.drupal.org/project/composer_manager
issues:
* Allow additional external libraries with composer
* Allow a user-editable composer.json file in Drupal's root directory to manage (custom) dependencies
Иногда не могу понять.. как использовать классы или сервисы.. и какой звать...
Как вообще в документации теперь искать необходимое?? раньше нашел функцию и пользуй.. а теперь нашел функцию и фиг поймешь что надо сделать чтоб она сработала :(
Может какие пояснения дашь?
grep + http://grep.xnddx.ru/
А как сейчас актуально и правильно хранить служебные функции кастомного модуля для drupal 9? По прежнему в хелпере или в своем контроллере? И почему именно статический класс? Плохо понимаю ООП но если на пальцах?
Правильно - использовать для этого сервис, но и статический класс можно, если никто не увидит. Почему статический - не нужно создавать экземпляр класса.
Плохо, что для тем не прокатывает :(
Прокатывает, почему нет то https://git.drupalcode.org/project/bootstrap/-/tree/8.x-4.x/src
Добавить комментарий