Кто я?

Я решаю задачи, которые обычно делят на трех специалистов: сисадмина, разработчика и дизайнера.
Пока другие ищут сложные пути, я чиню серверы, поднимаю упавшие сайты, заставляю 1С летать даже на Celeron'ах — и параллельно могу сверстать макет или настроить сигнализацию.
Что в итоге? Не нужно искать разных людей. Один звонок — и я закрываю полный цикл: от настройки ноутбука до построения IT-инфраструктуры офиса под ключ. Облачная экосистема, своя CRM, чаты, 1С, система контроля бизнеса, видеонаблюдение, сигнализация, датчики и мониторинг — всё под единым управлением.
Здесь — мои реальные кейсы за 20 лет. Если техника тупит, сайт упал или нужен свежий софт — вы нашли того, кто справится.

Моё время занято на 60%

Обращайтесь — пока другой клиент не занял остаток!


Забронировать консультацию

iot-блог | контакты
© Digital Specialist | Регион Москва | Не являемся сотрудниками Google, Яндекса и NASA

Как мы починили ошибку JDatabaseDriver в Joomla 5

Проблема: белый экран / критическая ошибка при загрузке страницы

Что произошло?

При открытии сайта на Joomla 5 (после обновление с 4 на 5 версию) мы увидели фатальную ошибку:

TZ_Portfolio_PlusTableContent::__construct(): 
Argument #1 ($db) must be of type JDatabaseDriver, 
Joomla\Database\Mysqli\MysqliDriver given
    

Сайт полностью переставал работать — ни админка, ни публичная часть не загружались.

Почему это случилось?

Наш старый компонент TZ_Portfolio_Plus (портфолио/галерея) был написан для Joomla 3. В третьей версии все базы данных передавались через класс JDatabaseDriver.

Начиная с Joomla 4, разработчики полностью переработали работу с базами данных. Теперь используется объект Joomla\Database\Mysqli\MysqliDriver (и другие драйверы в пространствах имён).

Конструктор класса TZ_Portfolio_PlusTableContent жёстко требовал именно JDatabaseDriver, а Joomla 4 передала ему новый тип данных. PHP не смог выполнить код — отсюда и ошибка.

Как мы чинили (решение)

Мы нашли файл, где определён класс TZ_Portfolio_PlusTableContent. Он находился по пути:

/administrator/components/com_tz_portfolio_plus/tables/content.php
    

Внутри был такой конструктор:

public function __construct(JDatabaseDriver $db)
{
    parent::__construct('#__tz_portfolio_plus_content', 'id', $db);
}
    

Мы заменили жёсткую привязку к JDatabaseDriver на абстрактный драйвер из пространства имён Joomla 4/5:

public function __construct(\Joomla\Database\DatabaseDriver $db)
{
    parent::__construct('#__tz_portfolio_plus_content', 'id', $db);
}
    

После этого сайт заработал мгновенно.

Почему помогло именно это изменение?

  • \Joomla\Database\DatabaseDriver — это общий абстрактный класс для всех драйверов баз данных в Joomla 4/5.
  • MysqliDriver наследуется от DatabaseDriver, поэтому передача объекта стала корректной.
  • При этом мы сохранили контроль типов (не убрали проверку совсем).
  • Код остался совместим и с Joomla 3 (если вдруг откатиться).

Что ещё можно было сделать (альтернативы)

  • Убрать тип аргумента полностьюpublic function __construct($db) — это тоже работает, но менее правильно с точки зрения архитектуры.
  • Обновить компонент — если бы разработчик выпустил версию для Joomla 4.
  • Заменить компонент — на современный аналог, но это дольше.

Совет на будущее (другие похожие ошибки)

Если у вас старый компонент для Joomla 3, при миграции на Joomla 4/5 могут возникнуть похожие проблемы. Вот таблица замен:

Joomla 3 (старый стиль) Joomla 4/5 (новый стиль)
JFactory::getDBO()\Joomla\CMS\Factory::getContainer()->get('DatabaseDriver')
JFactory::getApplication()\Joomla\CMS\Factory::getApplication()
JText::_()\Joomla\CMS\Language\Text::_()
JRoute::_()\Joomla\CMS\Router\Route::_()
JHtml::_()\Joomla\CMS\HTML\HTMLHelper::_()

Итог

Ошибка была связана с несовместимостью типов данных между Joomla 3 и Joomla 4. Исправление заняло буквально одну строчку кода — замена JDatabaseDriver на \Joomla\Database\DatabaseDriver. Сайт полностью восстановлен.

Если вы переезжаете с Joomla 3 на 4 или 5 — проверяйте конструкторы всех таблиц (Table) в сторонних компонентах. Это одна из самых частых ошибок.

← Назад к списку