Обновление модуля D7-D10

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

Аватар пользователя quattro quattro 25 октября в 16:17
<?php
if (file_exists(conf_path().'/settings-zbase.php')) require_once conf_path().'/settings-zbase.php';
else {
    if(isset(
$db_url)) $zbase_url $db_url// drupal 6 compatibility
    
else if (file_exists(conf_path().'/settings.php')) {
        require_once 
conf_path().'/settings.php';
        
$zbase_url $db_url;
    }
}
?>

В представленном фрагменте кода, для Друпал 10 "conf_path()" - устарел

Как исправить подключение директорию drupal/sites/default для D10?

Комментарии

Аватар пользователя OldWarrior OldWarrior 28 октября в 12:00

quattro wrote: Как исправить подключение директорию drupal/sites/default для D10?

Что мешает самому построить путь к settings.php используя, например, константу DRUPAL_ROOT ?

Однако, в контексте Drupal 10 как-то проще обращаться к методам класса Drupal\Core\Site\Settings для получения значений settings.php. Например:

<?php
...
// Получить все настройки из settings.php
$my_settings = \Drupal\Core\Site\Settings::getAll();
...
// Получить конкретную настройку из settings.php
$setting = \Drupal\Core\Site\Settings::get('install_profile');
...
?>
Аватар пользователя quattro quattro 30 октября в 11:42

"sitePath" пока поставил, вместо "conf_path".
Ещё через сервисы подключить можно:
$site_path = \Drupal::service('site.path');
Но пока не хочется совсем переделывать модуль под D10, так как не знаю когда, Drupal и Symfony смогут сертифицировать под ФСТЭК. Причем в версии ПХП хотя бы 8.2.
Этот первый модуль, который получает доступ к базам данных сайта, и второй базе - биллинга
через файлы настроек.

Сейчас пытаюсь адаптировать другие модули, которые минимально необходимы для работы в связке с этим первым.
Задача включить интерфейс биллинга по адресу url, но чета не получается ...
Пока не понял, как через файл контроллера, подключить адрес этой страницы.
В D7 так:
файл vircadm.module

<?php

require_once 'vircadm-drupal.inc';
require_once 
'vircadm-drupal'.substr(Drupal::VERSION,0,2).'.inc';
require_once 
'vircadm-roles.inc';

// Корень модуля
function vircadm() {
  global 
$user$base_path;
    if (!
$user->uid) {
        
$_REQUEST['destination'] = '?q=vircabo';
        
//drupal_goto(); //функция перенаправления drupal7, 
    
drupal_get_destination();//функция перенаправления drupal10
        
return '';
    }
    
zBaseSetConfig('vircadm');
    
loadConstant('LOGIN');
    
$drupal = (defined("VIRC_TEMPL") && VIRC_TEMPL == false); // не использовать собственный шаблон
    //$drupal = true;
    
$content vircadm_content();
    
$head vircadm_header($drupal);
    if (!
$drupal) {
        include 
'page-vircadm.tpl.php';
        exit;
    }
    return 
$content;
}
?>

Файл vircadm-drupal.inc


<?php
function vircadm_menu() {
  
$items = array();
    
$items['vircadm'] = array(
      
'title' => 'Виртуальный ИРЦ',
      
'page callback' => 'vircadm',
      
'page arguments' => null,
      
'access arguments' => array('access content'),
      
'type' => MENU_CALLBACK//MENU_NORMAL_ITEM,
    
);
}
?>
Аватар пользователя kosskren kosskren 30 октября в 12:38

Начиная с друпал 8, подход к работе значительно поменялся. Для объявления URL используется yml файл. Вот тут по ссылке базовый пример, как создать url и обрабатывать его. Я специально убрал все лишнее из модуля, что бы осталась только часть про URL. Пример модуля

Аватар пользователя quattro quattro 30 октября в 15:18

Понятно что поменялось всё с 8й версии.
В инструкциях друпал написано, что можно подключить отдельный интерфейс, через объявление сервиса, или с помощью метода в файле контроллера.
Спасибо за пример ...
Набор наших модулей, реализуют учётную систему. Например для ЖКХ: https://demo.rcgkh.ru Если авторизоваться там с ролью абонент, то откроется Личный кабинет абонента., но если с любой другой ролью, то откроется как раз интерфейс биллинговой системы, в которой работают сотрудники предприятий ЖКХ.
Приведённый кусок кода выше, определят куда пробросить пользователя после авторизации, зная его роль.
Но, для всех ролей кроме Абонент ЖКХ, открывается интерфейс биллинга, у которого есть всё, и ломать его нет смысла.
В конце приведенного кода, есть подключение nclude page-vircadm.tpl.php и дальше друпал не участвует в отображении интерфейса.

<?php

    

if (!$drupal) {
        include 
'page-vircadm.tpl.php';
        exit;
    }
    return 
$content;

?>

И ещё, в D10 упразднена функция drupal_goto();
замена сходу не сработала.
Сейчас попробовал заменить на Drupal::destination();
посыпались ошибки типа:

Symfony\Component\HttpKernel\Exception\ControllerDoesNotReturnResponseException: Контроллер должен вернуть объект "Symfony\Component\HttpFoundation\Response", но он вернул значение null. Вы забыли добавить инструкцию return где-нибудь в вашем контроллере? in () (строка 98 из core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php).

Аватар пользователя kosskren kosskren 30 октября в 22:34

Для замены drupal_goto() посмотрите на этот класс:
Symfony\Component\HttpFoundation\RedirectResponse;

У меня рабочего примера под рукой нет, но думаю контроллер должен возвращать что-то в этом духе:
return new RedirectResponse($url);

Для проверки роли пользователя можно использовать:
<?php $user = \Drupal::currentUser(); ?>

Так проверяем роль:
<?php $user->hasRole('admin'// true/false ?>

Аватар пользователя OldWarrior OldWarrior 31 октября в 18:21

quattro wrote: "sitePath" пока поставил, вместо "conf_path".

Это лучше всего в вашем случае. Метод DrupalKernel::$sitePath как раз идеален для этого.

quattro wrote: Ещё через сервисы подключить можно:
$site_path = \Drupal::service('site.path');

Deprecated. https://www.drupal.org/project/bs_base/issues/3346593

Аватар пользователя quattro quattro 31 октября в 18:55

OldWarrior wrote: Deprecated. https://www.drupal.org/project/bs_base/issues/3346593

Спасибо! Я сейчас тратил время, чтоб вариант через сервисы попробовать.
Я читал мануалы ориентируясь на D9+, в каком то описании было упомянуто что есть 2 варианта... Значит остался один, через метод класса. Будем теперь методы изучать, !

Аватар пользователя kosskren kosskren 30 октября в 12:18

Добрый день.

Вы пишите про сертификацию ФСТЭК для Drupal и Symfony. Можете подробнее рассказать об этом если в теме? Инициализирует сертификацию сам ФСТЭК по собственному графику или допустим я создаю интернет магазин и могу им заявку отправить на сертификацию.

Аватар пользователя quattro quattro 30 октября в 14:42

День добрый!
Да, подаёте заявку, по форме центра который проводит сертификацию, платите много денег, и ждёте много времени... Пока они будут проверку делать, может что-то скажут переделать...
Но! Проблема в том, что они отстают от сертификации ПО, на актуальных версиях PHP. Не говоря про версии фреймворков...
По этом, в нашем случае необходимо поддерживать вариант работы нашего ПО, так чтоб оно могло работать и на пхп5,6
Насколько я знаю, в начале 2025 года, сертифицированный под ФСТЭК линкус поддерживал только пхп 5,6.