БЛОГ


JOOMLA, ОШИБКА ПРИ ОБНОВЛЕНИИ – «CALL TO UNDEFINED METHOD»

При обновлении Joomla до версии 3.8 администраторы сайтов иногда сталкиваются с ошибкой -  Call to undefined method JApplicationSite::isClient. Причем ошибка не пропадает даже при восстановлении сайта из резервной копии, но давайте по порядку.

 

К нам обратился заказчик и сообщил, что после обновления до версии 3.8 видит, пустую страницу (белый экран). Поскольку пустая страница является признаком фатальной ошибки, устанавливаем сообщение об ошибках в файле configuration.php  на «максимум», и обновляем страницу лицевой части сайта, где видим:

 

Fatal error: Call to undefined method JApplicationSite::isClient() in /home/[cpanel-user]/public_html/plugins/system/languagefilter/languagefilter.php on line 94

 

Админ панель отображала следующую ошибку:

Fatal error: Call to undefined method JApplicationAdministrator::isClient() in /home/[cpanel-user]/public_html/plugins/system/languagefilter/languagefilter.php on line 94

Примечание. Включение отладки отображало следующую ошибку на сервере и сайте Joomla: Неустранимая ошибка: вызов неопределенного метода JProfiler :: setStart () в / home / [cpanel-user] / public_html / administrator / index. php в строке 45

 

Если вы внимательно посмотрите на приведенные выше ошибки, вы заметите, что проблема заключается в том, что не загружаются 2 основных класса Joomla, JApplicationSite и JApplicationAdministrator . Но почему?

Были проверены все файлы, которые использовались для загрузки основных классов или поддержки загрузки основных классов, в частности, следующих двух файлов:

Файл loader.php, который находится в папке library / cms / class / .

Файл ClassLoader.php, который находится в папке library / vendor / composer .

Сайт работал на версии  PHP 5.4, и поэтому мы переключились на 5.6, а затем на 7.0, а затем на 7.1. Ошибка сохранялась.

Чтобы исключить ошибки хостинга, сайт был перенесен на локальный сервер, где он точно также выдавал «белый экран».

Подобная ошибка возникала несколько лет назад, при обновлении версии 3.1.1 ошибка была вызвана загрузкой старых файлов library Joomla вместо новых.  Итак, мы переименовали папку существующих library в library_old , и скопировали новую копию папки library на сайт … и сайт заработал

Итак, проблема была вызвана неправильным  файлом библиотеки, но каким из них? Мы сделали список файлов и сравнили  с нерабочим сайтом.

Как оказалось, некоторые файлы были подключены по неверным путям.

Например, файл factory.php был включен из папки library / joomla вместо папки library / src . Было также много файлов, включенных в папку library / cms , и эти файлы были включены из папок, которые больше не должны существовать в папке library / cms . Фактически, папка библиотек / cms в Joomla 3.8 содержит только 3 папки (Joomla 3.7.5 имеет 30 папок внутри папки библиотек / cms ).

Вероятно, заказчик либо обновил сайт вручную (например, перезаписав файлы из новой установки Joomla), либо клиент обновил сайт через админ панель, но со старого сервера обновлений Joomla, где процесс обновления не включает удаление старых библиотечные файлы / папки.

В любом случае стоит признать, что это проблема разработчиков Joomla, которая должна учитывать любой вариант обновления. Поскольку разработчики указывают что - «разница с 3.7.5 весьма незначительна», а на деле в структуре файлов в Joomla 3.8 происходит огромное изменение.

Восстановление сайта из резервной копии вернее всего не приносит результата, поскольку файлы из резервной копии перезаписываются поверх существующих. При данной ошибке сначала нужно удалить все файлы из директории сайта, а после чего «откатиться».

Подводя итоги.

Избавиться от ошибки можно двумя способами.

Первый

Итак, если вы видите ошибку Call of undefined JApplicationSite :: isClient () на своем веб-сайте Joomla, попробуйте переименовать папку библиотек в library_old, а затем скопируйте папку library из новой установки Joomla 3.8.

Второй

Загрузите, с заменой файлов ту версию Joomla, на которой сайт работал, а потом через админ панель сделайте обновление, обновление может проходить в несколько этапов. После каждого удачного обновления делайте резервную копию и проверяйте ошибки базы, при необходимости делайте исправления