Этот документ отслеживает потенциальные проблемы обратной совместимости для Joomla! 4. В списке перечислены вопросы, которые потенциально могут привести к поломке расширений.

Основой этого сравнения является Joomla! 3.10.

Обновленные системные требования.

Системные требования были обновлены следующим образом:

  • PHP 7.2.5
  • MySQL 5.6
  • PostgreSQL 11.0
  • Поддержка SQL Server была прекращена.

Расширение PHP MySQL

  • Joomla больше не поддерживает использование PHP драйвера MySQL (который был удален в PHP 7.0). Joomla автоматически попытается использовать расширение MySQLi (доступно с PHP 5.3) или драйвер MySQL PDO (доступен с PHP 5.3). В противном случае не удастся создать подключение к базе данных.
  • Включен строгий режим. Следующие флаги теперь активны по умолчанию в Joomla 4, и вам, возможно, придется соответствующим образом обновить свои запросы к базе данных. Это поможет нам в будущих обновлениях версий MySQL, а также более тесно согласуется с Postgres, чтобы обеспечить более легкую совместимость с запросами на обоих языках.
'STRICT_TRANS_TABLES',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_AUTO_CREATE_USER',
'NO_ENGINE_SUBSTITUTION',

Как следствие, Joomla 4 будет использовать только значения по умолчанию NULL  для нулевой даты. Использование даты по умолчанию 0000-00-00 00:00:00 в Joomla 4 устарело.

Расширение PHP Postgres.

  • Joomla больше не поддерживает использование PHP драйвера pgsql. Joomla автоматически попытается использовать PostgreSQL PDO драйвер (доступен с PHP 5.3 и Joomla 3.9). В противном случае не удастся создать соединение с базой данных Postgres.

Расширение PHP GMP.

Оно необходимо для использования функции  входа в Систему без пароля WebAuthn. Обратите внимание, что расширение PHP GMP устанавливается по умолчанию на большинстве хостинг-сайтов. Системный плагин входа в Систему без пароля WebAuthn включен по умолчанию в Joomla 4 на сайтах https.

Расширение PHP mcrypt.

Оно необходимо для использования класса Joomla\CMS\Crypt\Cipher\CrytoCipher и его псевдонима JCryptCipherCrypto.

Библиотеки CMS.

В Joomla были внесены следующие изменения! CMS библиотеки (это код, который находился в каталоге "libraries/cms" в Joomla! 3.7 и более ранних).

Установка.

  • Установки плагина больше не будут искать файлы xml в разметке папок плагина Joomla! 1.5 .
  • В 3.x только в сценариях плагинов вызывается метод preflight, и ни один из них не делает postflight доступным во время процесса удаления. В 4.0 все типы расширений будут иметь эти хуки, доступные при удалении. Если вы в настоящее время preflight и postflight и предполагаете, что они применимы только в контексте установки / обновления - эта логика теперь неверна, и вы должны использовать маршрут установки (указанный как один из параметров метода)
  • При удалении плагина функция удаления в сценарии расширения теперь запускается перед запуском любых SQL-запросов (теперь это совместимо со всеми другими типами расширений).

Удаленные Классы.

В Joomla были удалены следующие классы! 4.0:

  • JInstallerComponent (вместо этого используйте JInstallerAdapterComponent)
  • JInstallerFile (вместо этого используйте JInstallerAdapterFile)
  • JInstallerLanguage (вместо этого используйте JInstallerAdapterLanguage)
  • JInstallerLibrary (вместо этого используйте JInstallerAdapterLibrary)
  • JInstallerModule (вместо этого используйте JInstallerAdapterModule)
  • JInstallerPackage (вместо этого используйте JInstallerAdapterPackage)
  • JInstallerPlugin (вместо этого используйте JInstallerAdapterPlugin)
  • JInstallerTemplate (вместо этого используйте JInstallerAdapterTemplate)
  • JSubMenuHelper (вместо этого используйте JHtmlSidebar; обратите внимание, что в отличие от JSubMenuHelper, для этого требуется добавить заполнитель в шаблон представления)

Наследование JInstallerAdapter.

JInstallerAdapter больше не расширяется от JAdapterInstance и по своей сути является объектом JObject.

Пользовательские адаптеры установщика теперь должны быть загружены автоматически.

Меню.

JMenu теперь абстрактный класс.

JMenu теперь является абстрактным классом. Подклассы JMenu теперь также должны реализовывать метод load.

Удалено поведение ручного включения .

Логика в JMenu::getInstance() для ручного включения файла из пути includes/menu.php приложения была удалена. Вместо него должен быть автозагружен подкласс JMenu.

JMenuItem.

  • Вы больше не можете получать свойство params из JMenuItem напрямую. Вместо этого используйте метод getParams() (доступен с версии Joomla 3.7)
  • JMenuItem::set и JMenuItem::get были удалены. Свойства должны быть явно названы
  • Теперь существует класс AdministratorMenuItem, который расширяется от MenuItem и содержит дополнительные публичные свойства, используемые для пункта меню Administrator.

Пагинация.

  • Магические функции пагинации pagination_item_active, pagination_item_inactive были удалены. Вместо этого используйте joomla.pagination.link в JLayout
  • Функция магической пагинации pagination pagination_list_render устарела. Вместо этого используйте JLayout joomla.pagination.list

Путь.

Ручное включение поведения удалено.

Логика в JPathway::getInstance() для ручного включения файла из пути includes/pathway.php приложения была удалена. Вместо этого следует автозагрузить подкласс JPathway.

Маршрутизатор.

Ручное включение поведения удалено.

Логика в JRouter::getInstance() для ручного включения файла из пути includes/router.php приложения была удалена. Вместо этого следует автозагрузить подкласс JRouter.

Изменения подписи метода.

Правила attachBuildRule и attachParseRule теперь указывают на то, что они требуют вызываемых файлов.

JVersion.

Поддержка доступа к константам класса JVersion в качестве свойств класса больше не поддерживается. Константы были введены в Joomla! 3.5, чтобы предотвратить редактирование старых свойств класса.

Следующие устаревшие константы были удалены:

  • JVersion::RELEASE
  • JVersion::DEV_LEVEL
  • JVersion::BUILD

JHtml.

  • Функция register в JHtml теперь имеет указание на то, что для нее требуется вызываемый объект. Подклассы JHtml теперь должны будут соответствовать этой сигнатуре (обратите внимание, что это уже требовалось на уровне кода функции).
  • JHtml::_ больше не позволяет вызывать непубличные методы в JHtml.
  • JHtml::_ теперь является final методом (вы больше не можете переопределить его, если вы создаете подкласс JHtml), и его подпись была изменена, чтобы использовать преимущества современных функций PHP (скалярные и вариативные подсказки типов)
  • JHtmlBootstrap :: modal был удален. Используйте JHtmlBootstrap :: renderModal
  • JHtmlSortablelist :: sortable устарел в пользу JHtmlDraggablelist :: draggable - старый метод действует как прокси для нового метода в настоящее время, чтобы облегчить удаление jQuery UI из ядра Joomla. Все медиаресурсы, относящиеся к исходной реализации jQuery UI, были удалены.
  • JHtmlBatch был удален, так как весь код был перенесен в макеты для переопределения шаблонов. Используйте JLayouts непосредственно в своем коде.

Updater.

  • Мы удалили устаревшую обработку целочисленных клиентов из класса адаптера расширения updater. Пожалуйста, используйте теперь site и administrator, а не целочисленные значения 0 / 1.

Платформа.

Следующие изменения были внесены в Joomla! Platform libraries. В основном это код, находящийся в каталогах libraries/joomla или libraries/legacy в Joomla! 3.

Access.

  • JAccess::$assetPermissionsById и JAccess::$assetPermissionsByName и JAccess::preloadPermissionsParentIdMapping были удалены без замены. Начиная с версии 3.6 мы используем другие методы и свойства класса для оптимизации загрузки активов. О причинах такого сокращения см. в  запросе на исправление ошибок и оптимизацию JAccess.
  • JAccess::getActions был удален. Вместо этого используйте JAccess::getActionsFromFile или JAccess::getActionsFromData.

Application.

Удаленные классы.

Следующие классы были удалены в Joomla! 4.0:

  • JApplicationWebRouter (используйте пакет `joomla/router` вместо этого)
  • JApplicationWebRouterBase (используйте пакет `joomla/router` вместо этого)
  • JApplicationWebRouterRest (используйте пакет `joomla/router` вместо этого)

Все ссылки на JSite и JAdministrator были удалены (это были просто псевдонимы классов с Joomla 3.2).

Утратившие актуальность классы.

Следующие классы были устаревшими и запланированы к удалению в Joomla! 5.0:

  • JApplicationBase (вместо него используйте Joomla\Application\AbstractApplication)

Изменения в CLI/Web-классе.

Классы JApplicationCli и JApplicationWeb были перекомпонованы для расширения из пакета Application Framework. Это прерывает проверку типа для объекта JApplicationBase. Для совместимости рекомендуется проверять, являются ли классы приложений экземпляром Joomla\Application\AbstractApplication (JApplicationBase расширил этот класс с момента появления Joomla! 3.4).

Кроме того, оба этих класса теперь являются абстрактными. Разработчики, реализующие эти классы, должны обеспечить метод doExecute логикой своего приложения.

Для метода registerEvent теперь требуется вызываемый параметр $handler.

Приложения, которые хотят поддерживать как Web, так и CLI приложения, теперь должны использовать интерфейс \Joomla\CMS\Application\CMSApplicationInterface - он содержит общие методы (некоторые из которых в Joomla 3.x находились только в классе JApplicationCms), которые могут быть использованы всем кодом. Настоятельно рекомендуется, чтобы любые пользовательские приложения (особенно CLI-приложения) реализовывали этот интерфейс для облегчения проверки совместимости, одновременно с этим любые подсказки типов должны использовать интерфейс, а не конкретный класс.

JApplicationCli.
  • Старый: JApplicationCli → JApplicationBase → Joomla\Application\AbstractApplication
  • Новый: JApplicationCli → Joomla\Application\AbstractCliApplication → Joomla\Application\AbstractApplication
JApplicationWeb.
  • Старый: JApplicationWeb → JApplicationBase →Joomla\Application\AbstractApplication
  • Новый: JApplicationWeb → Joomla\Application\AbstractWebApplication →Joomla\Application\AbstractApplication
  • Устаревшие способы вызова JApplicationWeb::redirect были удалены
    • С параметрами message и messageType. (Вызовите enqueueMessage отдельно.)
    • Передача значения true/false в качестве 2-го/3-го параметров вместо кода перенаправления приведет к возникновению InvalidArgumentException вместо дефолтного значения 303.
  • JApplicationWeb::$singleValueResponseHeaders был удален, поскольку приложение Framework будет внутренне использовать объекты PSR-7 Response начиная с версии 2.0. Это изменяет способ хранения данных заголовков, так что они всегда представляют собой многомерный массив, где каждый ключ верхнего уровня - это имена заголовков, а значение - это массив, содержащий все значения для этого заголовка.
CMSApplication.
  • Свойства класса $_clientId, $_messageQueue и $_name были переименованы, чтобы удалить их префикс подчеркивания.
  • Теперь реализован интерфейс CMSApplicationInterface.
  • Если при извлечении объекта Pathway, Router или Menu с использованием соответствующих методов возникает ошибка, исключение теперь будет всплывать, а не метод, который автоматически улавливает исключение и возвращает null.
  • CMSApplication::getInstance теперь дополнительно попытается загрузить объект user (используя функцию LoadIdentity).
  • CMSApplication::isSite и CMSApplication::isAdmin были удалены, так как с добавлением приложения ConsoleApplication и ApiApplication могут давать вводящие в заблуждение результаты. Пожалуйста, используйте CMSApplication::isClient (доступно с Joomla  3.7). Для получения дополнительной информации, пожалуйста, см. раздел "Узнайте, на каком клиенте работает ваш код расширения".
JApplicationSite.

Свойства класса $_language_filter и $_detect_browser были переименованы, чтобы удалить их префикс подчеркивания.

Устаревший метод JApplicationSite::getPageParameters был удален в пользу его псевдонима JApplicationSite::getParams

JApplicationHelper.

JApplicationHelper::parseXMLLangMetaFile был удален без замены.

Архив.

  • Пакет archive был удален в пользу пакета the frameworks archive. Обратите внимание, что API должен оставаться неизменным.
  • Передача ошибок теперь использует исключения, а не JError

Клиент.

\Joomla\CMS\Client\ClientWrapper был удален. Используйте статические методы в \Joomla\CMS\Client\ClientHelper

Crypt.

  • JCrypt::hasStrongPasswordSupport был удален без замены, так как все версии PHP, соответствующие Joomla 4, будут поддерживать надежное хэширование паролей.

Удаленные классы.

Следующие шифры были удалены в Joomla! 4.0:

  • JCryptCipher3Des
  • JCryptCipherBlowfish
  • JCryptCipherMcrypt
  • JCryptCipherRijndael256
  • JCryptCipherSimple

Они были удалены без замены. Используйте JCryptCipherCrypto.

Удаленные методы.

  • JCrypt::hasStrongPasswordSupport был удален без замены (это попытка обнаружить bcrypt polyfills на хостинге Linux, но всегда возвращало true, так как мы требовали PHP 5.3.10 в Joomla 3.3)

Кэш.

  • JCacheController::get теперь требует вызываемого callable объекта. В результате JCacheControllerCallback::call был удален.
  • JCacheStorage::test был удален. Вместо этого используйте JCacheStorage::isSupported.
  • Механизмы хранения по умолчанию больше не загружаются вручную, поскольку теперь они загружаются автоматически.
  • JCacheControllerOutput::start и JCacheControllerOutput::end были удалены без замены.
  • Удалено хранилище CacheLite , поскольку оно несовместимо с PHP7 (это наша минимальная версия).
  • Обработка ошибок теперь использует исключения вместо JError.

Компонент.

  • \Joomla\CMS\Component\ComponentRecord больше не расширяет JObject.

Документ.

Изменение наследования.

У следующих классов было изменено наследование:

  • JDocumentError (теперь расширяется из \Joomla\Cms\Document\HtmlDocument вместо \Joomla\Cms\Document\Document)

Примечание. в результате этого изменения при рендеринге страницы с ошибкой объект document сбрасывается в Joomla\CMS\Factory::$document, причина в том, что нам нужен чистый документ для работы; если запускается страница с ошибкой, нас не интересуют метаданные, установленные вашим компонентом, или добавленные носители из какого-то плохого модуля или каких-то других плагинов, добавляемых к display. Нам нужна чистая среда для рендеринга страницы ошибки, содержащей только загруженные данные страницы ошибки.

Рендеринг.

  • Чтобы соответствовать спецификации RSS-канала, JDocumentRendererFeedRss теперь позволяет настраивать элемент lastBuildDate с использованием свойства класса JDocumentFeed::$lastBuildDate при отображении канала. Это значение по умолчанию соответствует текущему времени, как и в случае с Joomla! 3.x и более ранние версии, однако время можно правильно установить, изменив это свойство класса на объект JDate, представляющий желаемую временную метку.
  • Теперь существует интерфейс RendererInterface, который должн реализовать все средства рендеринга.
  • JDocumentRenderer теперь является абстрактным классом и реализует интерфейс RendererInterface.
  • В качестве альтернативы <jdoc:include type="head" /> теперь вы можете индивидуально загружать <jdoc:include type="metas" /> для метаданных, <jdoc:include type="styles" /> для CSS и <jdoc:include type="scripts" /> для JavaScript. Цель этого состоит в том, чтобы при необходимости разрешить пользователям размещать весь JavaScript в нижней части HTML-документа в своих шаблонах.

JDocumentFeed.

Тип свойства JDocumentFeed::$lastBuildDate изменен со строки на объект JDate. Это свойство ранее не использовалось основным API Joomla, но расширения, возможно, использовали его.

Database.

  • Этот пакет был заменен пакетом Database Joomla Framework
  • Режим отладки Debug был переработан (дополнительную информацию см. в документации по фреймворку [1])

Factory.

  • Factory::getApplication больше не принимает аргументы. Это вводило в заблуждение, поскольку оно всегда возвращало активное приложение после первого вызова в начальной загрузке, какие бы аргументы ни были переданы в функцию.
  • Factory::getXml был удален вместе с JXMLElement. Вместо этого используйте SimpleXMLElement напрямую.
  • Factory:: getEditor был удален, вместо этого используйте JEditor::getInstance.
  • Factory:: getUri был удален, вместо этого используйте Uri::getInstance().

Окружение.

  • JBrowser::isSSLConnection был удален. Используйте JApplicationCms::isSSLConnection (доступно начиная с Joomla 3.2)

Файловая система.

  • Классы-оболочки файловой системы JFilesystemWrapperFile, JFilesystemWrapperFolder, JFilesystemWrapperPath  были удалены. Продолжайте использовать исходные статические методы JFile, JFolder, JPath, .

Фильтр.

  • JFilterInput::_remove был удален в пользу JFilterInput::remove.
  • JFilterInput::_cleanTags был удален в пользу JFilterInput::cleanTags.
  • JFilterInput::_cleanAttributes был удален в пользу JFilterInput::cleanAttributes.
  • JFilterInput::_decode был удален в пользу JFilterInput::decode.
  • JFilterInput::_escapeAttributeValues был удален в пользу JFilterInput::escapeAttributeValues.
  • JFilterInput::_stripCSSExpressions был удален в пользу JFilterInput::stripCSSExpressions.

Все вышеперечисленные исключения и удаления предназначены для того, чтобы позволить классу воссоединиться с родительским классом framework.

Форма.

  • Каталоги libraries/joomla/form/fields и libraries/joomla/form/rules не регистрируются для поиска классов форм, вместо этого все классы форм должны быть загружены автоматически.
  • Добавлены два новых свойства addfieldprefix, который регистрирует префикс пространства имен для расширений (предназначен для использования в качестве замены addfieldpath). Пример использования, пожалуйста, смотрите в этом PR на Github
  • JForm::getControlGroup был удален используйте псевдоним JForm::renderField (доступно начиная с Joomla 3.2.3)
  • JForm::getControlGroups был удален используйте псевдоним JForm::renderFieldset (доступно начиная с Joomla 3.2.3)
  • При рендеринге поля с использованием опции hiddenLabel в JForm - теперь она скрывает только метку от пользовательского интерфейса - html по-прежнему отображается с помощью класса sr-only для обеспечения доступности для чтения с экрана.
  • JFormFieldUsergroup был удален. Вместо этого используйте Joomla\CMS\Form\Field\UsergrouplistField (доступно начиная с Joomla 3.2)
  • Класс Form удалил защищенные методы filterField() и validateField(). Это приведет к разрыву любых пользовательских классов форм, которые расширяют основную форму и используют эти методы. Это было заменено в пользу фильтрации на уровне полей (см. https://github.com/joomla/joomla-cms/pull/12414 для получения дополнительной информации)

Поля.

  • Свойства фильтра JFormFieldFilelist и JFormFieldFolderList были переименованы в fileFilter и folderFilter соответственно (чтобы разрешить использование обычного атрибута фильтра Joomla для возвращаемых значений).
  • Свойства фильтра JFormPredefinedlistField переименованы в optionsFilter (чтобы разрешить использование обычного атрибута фильтра Joomla для возвращаемых значений).
  • JFormFieldEditor::save был удален без замены.
  • JFormFieldText::getSuggestions был удален в пользу JFormFieldText::getOptions.

Обертка.

  • Классы FormWrapper были удалены. Продолжайте использовать исходные статические методы класса FormHelper.

HTTP

Устаревшие классы и интерфейсы.

Следующие классы и интерфейсы устарели и запланированы к удалению в Joomla! 5.0:

  • JHttpResponse (вместо этого используйте Joomla\Http\Response)
  • JHttpTransport (вместо этого используйте Joomla\Http\TransportInterface)

Изменения в классе.

HTTP-пакет фреймворка теперь включен в Joomla! 4.0 и подклассы JHttp и JHttpTransport были переработаны для использования вышестоящего пакета.

JHttp
  • JHttp больше не поставляется с пакетом cacerts.pem в каталоге transports вместо этого используйте composer/ca-bundle, который поставляется с ядром.

Конструктор класса JHttp был ослаблен со следующими изменениями:

  • Параметр options больше не вводится как объект Joomla\Registry\Registry, вместо него можно использовать массив или любой объект, реализующий интерфейс ArrayAccess.
  • Параметр transport теперь позволяет использовать любой объект Joomla\Http\TransportInterface.
JHttpTransport

Устаревший интерфейс JHttpTransport теперь расширяет Joomla\Http\TransportInterface и привел к нарушению обратной совместимости в интерфейсе. Конструктор больше не является частью интерфейса, а метод интерфейса request() претерпел изменения. В частности, второй параметр, который ранее вводил класс JUri, теперь вводит Joomla\Uri\UriInterface.

JHttpResponse

При рефакторинге объекта ответа для наследования от HTTP-пакета фреймворка, который теперь использует API-интерфейс PSR-7 ResponseInterface, в структуре заголовков ответов было допущено незначительное нарушение совместимости. Начиная с версии 4.0, теперь это всегда будет многомерный массив, где ключом является имя заголовка, а значением - массив значений для этого заголовка (ранее это была строка).

Image.

Устаревшие классы и интерфейсы.

Следующие классы и интерфейсы устарели и запланированы к удалению в Joomla! 5.0:

  • JImageFilter (вместо этого используйте Joomla\CMS\Image\ImageFilter)
  • JImageFilterBackgroundfill (вместо этого используйте Joomla\CMS\Image\Filter\Backgroundfill)
  • JImageFilterBrightness (вместо этого используйте Joomla\CMS\Image\Filter\Brightness)
  • JImageFilterContrast (вместо этого используйте Joomla\CMS\Image\Filter\Contrast)
  • JImageFilterEdgedetect (вместо этого используйте Joomla\CMS\Image\Filter\Edgedetect)
  • JImageFilterEmboss (вместо этого используйте Joomla\CMS\Image\Filter\Emboss)
  • JImageFilterGrayscale (вместо этого используйте Joomla\CMS\Image\Filter\Grayscale)
  • JImageFilterNegate (вместо этого используйте Joomla\CMS\Image\Filter\Negate)
  • JImageFilterSketchy (вместо этого используйте Joomla\CMS\Image\Filter\Sketchy)
  • JImageFilterSmooth (вместо этого используйте Joomla\CMS\Image\Filter\Smooth)

Изменения в классе.

Классы из пакета Image Фреймворка были встроены в CMS и JImage, а подклассы JImageFilter были переработаны для их использования. Т.е. все классы в пространстве имен Joomla\Image перемещены в пространство имен Joomla\CMS\Image.

Menu

  • У JMenu::$_items, JMenu::$_default и JMenu::$_active был удален префикс подчеркивания (обратите внимание, что эти свойства были защищены, поэтому это влияет только на пользовательские подклассы JMenu)

Новый слой MVC.

  • Это было удалено в Joomla 4. Мы решили, что эта попытка не увенчалась успехом, и в результате продолжили работу над исходным уровнем MVC (см. раздел "Устаревший MVC"). На GitHub есть плагин, который вы можете отправить вместе со своими расширениями, пока вы переносите их обратно на устаревший MVC (обратите внимание, что он не поставляется по умолчанию в Joomla 4).

Keychain.

Удаление Keychain из 4.0 привело к удалению следующего класса:

  • JKeychain

Путь.

  • JPathway::$_pathway и JPathway::$_count были удалены с их префикса подчеркивания (обратите внимание, что эти свойства были защищены, поэтому это влияет только на пользовательские подклассы JPathway)
  • JPathway::_makeItem был удален в пользу JPathway::makeItem (обратите внимание, что этот метод был защищен, поэтому он влияет только на пользовательские подклассы JPathway)

Профилировщик.

  • JProfiler::getmicrotime и JProfiler::getMemory были удалены в пользу встроенных методов PHP, которые они обернули (microtime(1) и memory_get_usage() соответственно)

Таблицы.

  • Объект базы данных JTable::__construct теперь бъявляется как JDatabaseDriver.
    • Подклассы JTable должны будут убедиться, что они передают объект JDatabaseDriver родительскому конструктору.
    • Подклассам JTable потребуется изменить реализацию метода setDbo(), если у них есть расширенная версия этого метода, чтобы включить подсказку типа.
  • Существует новый метод JTable::hasField - все экземпляры property_exists, существующие на JTable, теперь будут использовать этот прокси-метод вместо этого, чтобы обеспечить лучшую совместимость экземпляров таблиц.
  • Шаблон JTableObserver (и соответствующие классы) был удален из JTable. JTable теперь запускает события и теги, история содержимого (Content History) (и любые другие пользовательские варианты использования этого шаблона) должны перейти к стандартным плагинам.

Почта.

Следующие методы были удалены в Joomla! 4.0:

  • JMail::sendAdminMail был удален.

Исключения.

JMail больше не улавливает исключения из PHPMailer. Теперь ответственность за обработку этих исключений соответствующим образом лежит на объекте, вызывающем JMail. Кроме того, если отправка почты отключена в глобальной конфигурации, вызов \Joomla\CMS\Mail\Mail::send() вызовет исключение \Joomla\CMS\Mail\Exception\MailDisabledException.

Язык.

  • Функции setTransliterator, setPluralSuffixesCallback, setIgnoredSearchWordsCallback, setLowerLimitSearchWordCallback, setUpperLimitSearchWordCallback и setSearchDisplayedCharactersNumberCallback теперь привязаны к типу, требующему вызываемого объекта.
  • Заполнитель "_QQ_" для двойных кавычек был удален (он существовал только для того, чтобы обойти старую ошибку PHP, которая была исправлена). Экранируйте двойные кавычки, если требуется (например, \")
  • Формат имен языковых файлов был изменен, чтобы облегчить работу в сторонних инструментах перевода (таких как crowdin). Языковые файлы INI больше не должны содержать код языка (т.е. en-GB.com_contact.ini => com_contact.ini), в этом случае частный случай en-GB.ini был переименован в joomla.ini в основном языковом пакете. en-GB.xml был назван langmetadata.xml . Существует слой b/c, который будет продолжать считывать старые имена файлов Joomla 3 во всей Joomla 4.
  • \Joomla\CMS\Language\Multilanguage::getSiteLangs был удален. Вместо этого используйте \Joomla\CMS\Language\LanguageHelper::getInstalledLanguages(0)
  • JLanguage::exists был удален. Вместо этого используйте Joomla\CMS\Language\LanguageHelper::exists.
  • Классы-оболочки JTextWrapper, LanguageHelperWrapper и TransliterateWrapper были удалены. Продолжайте использовать статические методы, которые они обернули.
  • Обработка/поддержка pdf_fonts языковых пакетов (language/pdf_fonts) была удалена из программы установки языка (см GitHub PR #31288).

Legacy уровень MVC.

Legacy контроллер.

  • JControllerLegacy был удален из legacy - уровня, и мы больше не намерены удалять его или его подклассы в ближайшем будущем.
  • JControllerLegacy больше не расширяет JObject. Контроллеры не должны вызывать ни один из методов, содержащихся в классе JObject.
  • JControllerLegacy реализует интерфейс для нескольких контроллеров задач.
  • JControllerLegacy::_construct теперь принимает дополнительные аргументы. Если вы ранее получали объект контроллера через JControllerLegacy::getInstance, вам не нужно изменять свой код.
    • Параметр 2: Необязательный экземпляр MVCFactoryInterface
    • Параметр 3: Необязательный экземпляр CMSApplicationInterface
    • Параметр 4: Необязательный входной Input экземпляр
    • Параметр 5: Необязательный экземпляр FormFactoryInterface
  • JControllerForm теперь использует пакет StringInflector для определения представления списка. Это должно улучшить его способность определять представление списка из большего количества имен представлений. Если разработчики расширений обнаружат, что их представление списка больше не найдено, им следует вручную установить свойство класса view_list в своем контроллере.

Legacy вид.

  • JViewLegacy был удален из Legacy уровня, и мы больше не намерены удалять его или его подклассы в ближайшем будущем.
  • JViewHtml был разделен на два класса - AbstractView и HtmlView. Абстрактное представление содержит логику для доступа к моделям и получения имени представления и предназначено в качестве базового класса для представлений, отличных от Html. Html-представление содержит ту же логику, что и раньше.
  • В настоящее время существует два подкласса JViewHtml - \Joomla\CMS\MVC\View\ListView и \Joomla\CMS\MVC\View\FormView, предназначенные для ускорения разработки представлений списков и форм и уменьшения дублирования кода.

Библиотека.

  • JLibraryHelper::_load был удален. Вместо этого используйте \Joomla\CMS\Helper\LibraryHelper::loadLibrary.

Сессия.

Пакет сесий подвергся серьезной переработке, чтобы использовать пакет сессий фреймворка. Это изменение в первую очередь затрагивает внутренние компоненты пакета; изменения в основном общедоступном API через класс JSession минимальны.

Строка.

Старый псевдоним класса JString был удален. Вместо этого используйте \Joomla\String\StringHelper.

Удалены классы и интерфейсы.

В Joomla были удалены следующие классы и интерфейсы! 4.0:

  • JSessionExceptionUnsupported
  • JSessionHandlerInterface
  • JSessionHandlerJoomla
  • JSessionHandlerNative
  • JSessionStorage
  • JSessionStorageApc
  • JSessionStorageDatabase
  • JSessionStorageMemcache
  • JSessionStorageMemcached
  • JSessionStorageNone
  • JSessionStorageWincache
  • JSessionStorageXcache

JSession.

JSession теперь расширяется из класса Joomla\Session\Session фреймворка. Многие из методов имеют измененное исполнение, но существует уровень совместимости, который помогает при переходе.

Параметр namespace Устарел.

Методы get, set, has и clear ранее поддерживали параметр namespace. Этот параметр теперь устарел. Пространство имен должно быть добавлено к имени перед вызовом этих методов.

JSession::clear() Перепрофилирован.

В классе Joomla\Session\Session метод clear используется для очистки всех данных из хранилища сессий. В JSession этот метод используется для удаления одного ключа. Когда этот метод вызывается с параметрами, он вызывает новый метод Joomla\Session\Session::remove().

JSession::getInstance() Устарел.

Одноэлементный метод getInstance() устарел. Вместо этого объект сессии следует извлекать из активного приложения или контейнера внедрения зависимостей.

Обработчики сессий.

В Joomla! 3.x и ранее обработчики сессий были представлены классом JSessionStorage и его подклассами. В Joomla! 4.0, обработчики сессий теперь являются реализациями Joomla\Session\HandlerInterface (который является расширением PHP SessionHandlerInterface. Все обработчики, которые поддерживались в Joomla! 3.x по-прежнему доступны в версии 4.0 в дополнение к двум дополнительным обработчикам: обработчику, изначально реализующему расширение APCu, и обработчику, поддерживающему Redis.

JObject.

Класс JObject исключен. Вместо этого используйте \stdClass или \Joomla\Registry\Registry.

Библиотеки социальных Сетей.

Пакеты facebook, github, google, linkedin, openstreetmap, mediawiki и twitter были удалены из CMS.

Пользователь.

  • JUser::getParameters был удален. Вы больше не можете извлекать все параметры для пользователя, а вместо этого используете JUser::getParam для получения отдельных параметров по мере необходимости.

Помощник.

  • JUserHelper::getCryptedPassword был удален. Joomla 4 поддерживает хеширование только с помощью встроенной функции PHP password_hash (через JUserHelper::HashPassword (доступно начиная с Joomla 3.2.1))
  • JUserHelper::getSalt был удален без замены (он сгенерировал хэш JUserHelper::getCryptedPassword, который теперь удален, как указано выше)
  • JUserHelper::invalidateCookie, JUserHelper::clearExpiredTokens и JUserHelper::getRememberCookieData были удалены без замены. Они не использовались в ядре со времен Joomla 3.2, когда их логика была перенесена в плагин аутентификации файлов Cookie
  • JUserWrapperHelper был удален. Продолжайте использовать исходные статические методы в JUserHelper.

Классы Удалены Без Замены.

  • JNode
  • JTree
  • JGrid
  • JError (используйте собственные исключения, когда требуется обработка ошибок)

Утилиты.

Удалены классы и интерфейсы.

В Joomla 4.0 были удалены следующие классы и интерфейсы!:

  • JArrayHelper, вместо этого используйте Joomla\Utilities\ArrayHelper;.

 

Внешние библиотеки.

Следующие изменения были внесены во внешние библиотеки и пакеты Joomla!.

PHPMailer

Joomla! 4.0 поставляется с PHPMailer 6. Пожалуйста, ознакомьтесь с репозиторием GitHub на предмет соответствующих изменений.

PHPUTF8

В Joomla! 3.4, библиотека PHPUTF8 находилась в двух местах в Joomla! пакет; libraries/phputf8 и libraries/vendor/joomla/string/src/phputf8. В Joomla! 4.0, tкопия библиотеки в libraries/phputf8 была удалена. Класс Joomla\String\StringHelper предоставляет многие функции библиотеки, а определение автозагрузчика Composer также импортирует большую часть библиотеки, однако, если вам нужна функция, которая еще не включена, вам следует импортировать необходимые функции из пути libraries/vendor/joomla/string/src/phputf8.

SimplePie

Библиотека SimplePie больше не входит в состав Joomla! 4.0.

jQuery

Joomla! 4.0 поставляется с jQuery 3. Пожалуйста, ознакомьтесь с руководством по обновлению для получения соответствующих изменений. Обратите внимание, что мы также больше не включаем jQuery Migrate. Мы рекомендуем использовать его локально, чтобы помочь отладить ваш код, если возникнут какие-либо проблемы.

jQuery UI

jQuery UI был удален из Joomla 4. Хотя он официально не был объявлен мертвым, jQuery UI не выпускался с 2016 года.

Bootstrap

Joomla! 4.0 поставляется с Bootstrap 5. Bootstrap 2.3.2 был удален, однако мы оставили некоторые классы BS2, чтобы облегчить миграцию (например, старый элемент BS2-невидимый все еще существует для программ чтения с экрана)

FOF

FOF 2.x был удален.

Шаблоны.

Вся Joomla! 3 шаблона - ISIS и Hathor в бэкэнде, а также Protostar и Beez во фронтенде больше не поддерживаются. Новый серверный шаблон 4.0 называется Atum, а шаблон интерфейса называется Cassiopeia.

Как следствие, все расширения должны перейти на новый стиль Bootstrap 5, а не на текущую реализацию Bootstrap 2.3.2. Для получения дополнительной информации о Bootstrap посетите веб-сайт Bootstrap 5 и веб-сайт Bootstrap 2.3.2.

  • Joomla 4 сначала загрузит фавикон шаблона, а не фавикон в корне Joomla, в соответствии с концепцией, согласно которой шаблон является единственным источником истины.
  • Компоненты интерфейса и представления модулей теперь используют разметку класса Block Element Modifier (BEM), чтобы шаблонам было проще поддерживать фреймворки, отличные от bootstrap. Смотрите  веб-сайт BEM для получения дополнительной информации о том, как создавать подобные классы.

Там также внесены изменения в параметры основных компонентов, на которые вам следует обратить внимание, если ваш шаблон должен поддерживать 3.x и 4.x одновременно: J4: Изменены параметры для поставщиков шаблонов.

Другое.

  • Глобальная переменная $_PROFILER была удалена. Вместо этого используйте /Joomla/CMS/Profiler/Profiler::getInstance.

Media в библиотеках.

Никакие медиа не разрешены в корневой папке библиотек в CMS. Все ресурсы, связанные с библиотеками Joomla, должны быть помещены в папку media в соответствии с рекомендациями. Прямой доступ блокируется с помощью .htaccess и файла web.config в корне каталога библиотек.

Bin

Удаление keychain из 4.0 привело к удалению всего каталога Bin, поскольку в нем содержалась только keychain.

Компоненты.

  • Все компоненты были распределены по именам, а каталоги соответствующим образом переработаны. Для получения дополнительной информации об этом ознакомьтесь с руководством по созданию компонента в Joomla 4.
  • просмотр профиля com_admin был удален. (По-видимому, это было создано исторически из-за проблем с доступом к com_users. Это больше не так, поэтому все пользовательские изменения проходят через com_users edit user view в бекэнде.)
  • com_actionlogs PHP 5.5 backfill код был удален, и, соответственно, ActionlogsHelper::getCsvData() теперь имеет подсказку типа для возврата объекта Generator
  • заголовки CSV-экспорта com_actionlog были изменены, чтобы соответствовать строкам, отображаемым в пользовательском интерфейсе.
  • В основных компонентах из Joomla 3.7 был удален "Legacy" режим маршрутизации URL-адресов. Вам следует либо использовать свой файл .htaccess, либо компонент перенаправления, чтобы исправить любые изменяющиеся внутренние URL-адреса. Вы можете попробовать "Modern" режим в Joomla 3, следуя инструкциям здесь
  • Компонент MailTo был удален без замены. Если вы использовали эту функциональность, вам нужно будет найти альтернативный компонент в JED.
  • В интерфейсном представлении контактов com_contact - свойство contact было удалено, поскольку оно было дубликатом свойства item. Мы решили сохранить $this->item, поскольку это соответствовало тому, что было в представлениях статей и тегов. Переопределения шаблонов нуждаются в обновлении, чтобы отразить это.
  • Поле repeatable в com_fields было удалено в пользу нового поля subform. Данные из repeatable полей автоматически переносятся в новое поле subform, но сохраняются в другом формате.
  • Поля xreference были удалены из #__contact_details, #__content и #__news feeds, поскольку они не использовались.

Плагины.

  • Плагин аутентификации Gmail был удален. Для получения дополнительной информации, пожалуйста, прочтите это сообщение в блоге
  • Поддержка Google reCAPTCHA v1 была полностью удалена из плагина CAPTCHA. Это не работает со 2 квартала 2018 года. Google прекратил его поддержку.
  • Плагин reCAPTCHA теперь использует официальную PHP-библиотеку Google для CAPTCHA под капотом
  • Для плагинов, использующих уровень совместимости 3.x, результат name является защищенным свойством как для входных параметров, так и для возвращаемых значений. Для получения информации о новом рекомендуемом подходе к плагинам, пожалуйста, прочитайте  S:MyLanguage/J4.x:Creating_a_Plugin_for_Joomla
  • Для плагинов, использующих уровень совместимости 3.x, для любых подсказок типа для событий, которым требуется класс, этот класс должен быть автоматически загружен до создания экземпляра подключаемого модуля.
  • Для события onContentBeforeSave теперь требуется параметр data. Это было передано в \Joomla\CMS\MVC\Model\LegacyModel начиная с версии 3.7, но теперь последовательно передается основными расширениями и используется основным content плагином Joomla.
  • Возврат перед вызовом parent::__construct() в конструкторе плагина больше не поддерживается, чтобы избежать постановки плагина в очередь в диспетчер событий.
  • onUserBeforeDataValidation устарел как событие в пользу onContentBeforeValidateData (событие было доступно для всех типов контента и не было специфичным для users. Обратите внимание, что оба события будут вызываться во время работы Joomla 4. Вы должны перенести свой код на новое событие, когда вам больше не нужно поддерживать Joomla 3.

Administrator Helpers.

  • JAdministratorHelper был удален без замены. (Он был объединен с JApplicationAdministrator.)
  • JSubMenuHelper был удален без замены. (Вместо этого используйте JHtmlSidebar - доступно с версии 3.0.)
  • JToolbarHelper был перемещен в каталог основных библиотек.

Модули.

  • Модуль админки submenu был удалён.
  • Логика Module Chromes (стилей модулей) в файлах шаблонов html/modules.php были перемещены в файлы JLayout. Функции modChrome_x в modules.php больше не поддерживаются. См. https://github.com/joomla/joomla-cms/pull/23570 для получения подробной информации.
  • Module Chromes (стили модулей) modChrome_horz, modChrome_xhtml, modChrome_rounded были удалены из system шаблонов без замены.
  • Суффиксы классов модулей были переименованы и стандартизированы. Теперь они называются Module Class и добавляются к списку классов в модуле Chrome. (Они больше не отображаются в самом выводе модуля.)

Обработка ошибок.

  • Теперь Joomla будет обрабатывать ошибки E_USER_DEPRECATED PHP и передавать их в JLog - это полезно для обработки устаревших версий во многих сторонних библиотеках PHP (обратите внимание, что это заблокирует загрузку страницы, если включен режим отладки)
  • Joomla\CMS\Exception\ExceptionHandler теперь работает только с исключениями, создаваемыми в JApplication::execute. Теперь мы используем обработчик ошибок Symfony, когда это завершается неудачей или возникают исключения за пределами этого. Мы ожидаем, что это окажет минимальное влияние на большинство пользователей и во многих случаях должно выдавать более полезное сообщение, чем традиционная ошибка "Ошибка отображения страницы ошибки" для пользователей, когда что-то идет не так.
  • Joomla\CMS\Exception\ExceptionHandler теперь поддерживает форматирование и будет отображать ошибки в форматах html, json, xml, feed или cli
  • Реализация Joomla\CMS\Exception\ExceptionHandler::render() изменена, чтобы включить выбрасываемый typehint. До версии 3.5, когда была добавлена поддержка PHP 7, это было введено как исключение, а начиная с версии 3.5 в самом коде была установлена проверка типа.

Базовый Тег

Предыдущие версии Joomla устанавливали тег заголовка <base> текущего URL-адреса во внешнем интерфейсе. Это было удалено, поскольку оно не служило никакой четкой цели.

JavaScript

В caption.js файл был удален из Joomla. Используйте собственные HTML-элементы figure и figcaption. (Вы можете посмотреть на JLayout в layouts/joomla/content/intro_image.php для примера).

Пространство имен.

Использование класса, например $msg = JText::_( 'Привет, чувак!' ); теперь можно использовать пространство имен. Это превратилось бы в $msg = Text::_( 'Привет, чувак!' );. Чтобы использовать пространство имен, вам необходимо добавить соответствующее объявление пространства имен. Это должно быть добавлено после defined('_JEXEC') or die;.

Чтобы найти подходящее пространство имен, вы можете либо следовать инструкциям здесь: Разбераемся с namespace & enquemessage... , либо использовать сгенерированный File:J! namespace reference.pdf

Оригинал статьи.