1. Главная
  2. Форумы
  3. Техподдержка Drupal
  4. Решение проблем

D7-D10 Изменение структуры каталогов модуля.

Главные вкладки

В D7 при разработке модулей, все функции которые были размещены в modules/my_module1, были доступны в modules/my_module2.
При обновлении до D10, такого не происходит. Теперь нужно много переписывать по правилам D10+.
Тем не менее, набор модулей для работы нашей системы, взаимодействует между собой, используя только функции наших модулей.
Некоторые функции конечно от drupal используется, но это ограниченное количество, в основном для получения и синхронизации данных пользователей, в зависимости от ролей при входе в систему и доступу к данным.

Возникают следующие вопросы, на которые есть только поверхностная информация в Интернет:

1. про modules/mymodul1/src/controller много всего написано, а вот про другие каталоги в папке /src практически ни чего.
Может кто ни будь, сделать расширенное описание, с уровнями доступа, стандартными названиями каталогов в custom модулях?

2. Может кто ни будь пробовал написать вариант кода, который объединит несколько модулей без пространства имен? Например, функции my_module1, my_module2, my_module3 доступны друг другу как в D7

Комментарии

Аватар пользователя kosskren kosskren 17 января в 8:27

Называйте каталоги по смыслу. Вот скажем вы хотите подписаться на события связанные с роутами, пусть будет это "RouteSubscriberBase". Структуру файлов/каталогов можно сделать такую

my_module1/src/EventSubscriber/RouteSubscriber.php

Drupal это подхватит без проблем, вы же все равно будите указывать новый сервис "RouteSubscribe" в файле my_module1.services.yml

Если вы создаете/переопределяете плагин, то создайте папку Plugin. Внутри этой папки уже создавайте папки, в зависимости от того, что делаете. Если это плагин связанный с полями, то создайте подпапку "Field"

my_module1/src/Plugin/*
my_module1/src/Plugin/Field/*

Так же всегда можно посмотреть в ядро друпала, его стандартные модули. Там множество подсказок по организации структур папок в модуле.

2. Может кто ни будь пробовал написать вариант кода, который объединит несколько модулей без пространства имен?

Вариант No 1: Используйте сервисы. Сервис это просто класс в папке

my_module1/src/Service/class_name.php

Вы можете перенести все ваши функции из модуля D7 в сервисы. Потом в любом модуле или теме вызывайте их вот так:

<?php
$result
= \Drupal::service('my_module1.your_name_service')->myFunction();
?>

Вариант No 2(менее предпочтительный): Старый добрый include_once. Вам ни кто не мешает его использовать. В вашем модуле в файле "my_module1.module" можете подключить через include_once все ваши функции, которые использовались в D7. Тут главное следить, что бы не конфликтовали имена подключаемых функций.

Аватар пользователя quattro quattro 19 января в 1:42

Спасибо за ответ!
Ноя, немного про другое!
Обратил внимание на то что, если 2 файла находятся в папке modules/custom/my_module/
то функции не доступны между этими двумя файлами, и пространство имён у них одинаковое -Drupal\my_module.
Стоит переместить их в папку modules/custom/my_module/src/, функции становятся доступны.
Ло ломаются функции которые привязаны каталогу модуля.
Я вот про такие нюансы спрашиваю!
Например как повлияет на доступность функций, если файлы разместить в каталоге my_module/src/Plugin/
Я ещё очень плохо понимаю php, Drupal 10, но пока не нашел решения восстановить переменную, если переместить файл в каталог /src/
Вопрос в том, что работа других 2-х модулей в группе, зависит от этого файла ф первом модуле.
В общем, на конкретные вопросы ответа не получил пока, буду пробовать найти решение с помощью Symfony.

Аватар пользователя kosskren kosskren 20 января в 8:33

Обратил внимание на то что, если 2 файла находятся в папке modules/custom/my_module/
то функции не доступны между этими двумя файлами, и пространство имён у них одинаковое -Drupal\my_module.

Допустим ваши два файла называются test_file_1.php и test_file_2.php, тогда в файле modules/custom/my_module/my_module.module вы можете их подключить через include_once вот так

<?php

include_once 'test_file_1.php';
include_once 'test_file_2.php';

Функции из этих двух файлов будут доступны везде.

Стоит переместить их в папку modules/custom/my_module/src/, функции становятся доступны.

Из этой папки друпал автоматом подключает файлы. Создайте файл в котором опишите класс, скажем файл называется ImageEditor.php, полный путь к файлу будет таким: modules/custom/my_module/src/ImageEditor.php.

<?php

namespace Drupal\my_module;

class ImageEditor{

/**
* Ваша функция
*
*/

public function myFunction()
{
return 'Отдаем результат';
}
}

Пример, как этот класс использовать в коде, скажем в контроллере:

<?php

namespace Drupal\my_module\Controller;

use

Drupal\Core\Controller\ControllerBase;
use
Symfony\Component\HttpFoundation\Request;
use
Symfony\Component\HttpFoundation\JsonResponse;
// Говорим, что будем использовать наш класс
use Drupal\my_module\ImageEditor;

class

Editor extends ControllerBase{

public function

editorPage()
{
$imageEditor = new ImageEditor();
$result= $imageEditor ->myFunction();
}
}
?>

Сорри за оформление кода, ни как не смог поправить в редакторе на сайте

Аватар пользователя quattro quattro 20 января в 11:23

Спасибо!
С подсвечиванием функций в одном модуле становится понятным, так можно и без объявления пространства имён в файлах внутри модуля обойтись. Я верно понял?
То есть, вызывая:

$imageEditor = new ImageEditor();
$result= $imageEditor ->myFunction();

myFunction() может быть любая в my_module_1\ ?
Так же, можно вызывать в my_module_2\ ?

Аватар пользователя kosskren kosskren 20 января в 15:11

С подсвечиванием функций в одном модуле становится понятным, так можно и без объявления пространства имён в файлах внутри модуля обойтись. Я верно понял?

Если вы подключаете просто файл с функциями через include_once, то да, можно без пространства имен обойтись. Тут главное следить, что бы названия функций не совпадали с уже используемыми. Если такое произойдет, php выдаст ошибку. Для пример вы создаете функцию и называете ее dump. В таком случае php выдаст ошибку, так как такая функция уже объявлена в ядре друпала.

Если вы подключаете файлы, в которых объявлен класс, то хорошо бы использовать пространство имен. Это позволяет избежать конфликтов в наименовании функций/классов.

myFunction() может быть любая в my_module_1\ ?
Так же, можно вызывать в my_module_2\ ?

Да, можно вызвать где угодно. Обратите внимание на строку.

<?php
use Drupal\my_module\ImageEditor;
?>

Если не нравится использовать "use", то можете вот так сделать:

<?php
$imageEditor
= new \Drupal\my_module\ImageEditor();
$result= $imageEditor ->myFunction();
?>
Логотип drupal.ru

Содержимое сайта публикуется на условиях CreativeCommons Attribution-ShareAlike 3.0 или более поздней версии. Программные коды в тексте статей — на условиях GNU GPL v2 или более поздней версии.

Документация по совместной работе с репозиторием drupal.ru – https://docs.drupal.ru/code

Drupal – торговая марка Дриса Бёйтарта

12+

AltStyle によって変換されたページ (->オリジナル) /