Обновился до DLE 13 и перестал работать модуль, как починить?
В 13ой версии Datalife Engine была добавлена система управления плагинами, которая, если кратко, позволяет вносить изменения в файлы без фактического внесения этих самых изменений в файлы движка. Вот именно из-за появления этой системы управления плагинами и могут возникнуть проблемы в работе некоторых модулей.
Первой "жертвой" нововведения стал мой модуль Стол заказов
В комментариях человек привел код ошибки, который мы сейчас разберем.
Fatal error: Uncaught Error: Class 'DLEPlugins' not found in {путь к домену}\engine\classes\templates.class.php:24
Stack trace:
#0 {путь к домену}\engine\mods\orderdesc\lic_71.php(6): require_once()
#1 {путь к домену}\engine\mods\orderdesc\ajax.php(46): include_once('{путь к файлу}')
#2 {main}
thrown in {путь к домену}\engine\classes\templates.class.php on line 24
Проведем краткий ликбез и разберем первую строку, что в ней говорится:
Fatal error: Uncaught Error: Class 'DLEPlugins' not found in {путь к домену}\engine\classes\templates.class.php:24
Тут мы видим критическую ошибку, которая сообщает о том, что используется не объявленный класс DLEPlugins, а конкретно используется в файле engine\classes\templates.class.php в 24й строке.
Ниже идет путь вызова файла (данный текст будет отображаться только на PHP 7.x).
Он позволяет разработчику отследить путь вызова файлов и выяснить где возникла проблема.
К примеру на php 5.6 данная ошибка будет выглядеть примерно так:
Fatal error: Class 'DLEPlugins' not found in {путь к домену}\engine\classes\templates.class.php on line 24
В целом уже все ясно, но для наглядности смотрим 24ю строку файла templates.class.php
require_once (DLEPlugins::Check(ROOT_DIR . '/engine/classes/mobiledetect.class.php'));
Вот как раз тот вызов неизвестного класса, который выбрасывает нам критическую ошибку.
Подобная ошибка будет появляться только в AJAX обработчике.
Ошибка возникает потому, что в файле использует класс DLEPlugins, который, в свою очередь, просто не подключен.
Если мы откроем файл engine/ajax/controller.php, то в самую первую очередь увидим подключение файла:
require_once (ENGINE_DIR . '/classes/plugins.class.php');
Поэтому чтобы наш модуль заработал - достаточно просто подключить этот файл в файле модуля.
За одним маленьким исключением, вместо require_once следует использовать include_once для совместимости с предыдущими версиями DLE:
include_once ENGINE_DIR . '/classes/plugins.class.php';
На вопрос - где именно вставлять эту строку, ответ достаточно прост.
Нужно найти первое подключение любого файла и перед ним вставить вышеуказанную строку.
Строка подключения файла может начинаться на одну из ниже перечисленных функций:
include
include_once
require
require_once
Обычно это будет строка:
include ENGINE_DIR . '/data/config.php';
Для разработчиков предлагаю готовый вариант лоадера для модулей:
https://github.com/San-Dev/DLE-plugins-loader/
На этом пока, пожалуй, все :)
С уважением,
Олег Александрович a.k.a. Sander