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

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

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

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

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

PHP MySQL Extension

  • Joomla больше не поддерживает использование драйвера ext/MySQL PHP (который был удален в PHP 7.0). Joomla автоматически попытается использовать расширение MySQLi (доступно с версии PHP 5.3) или MySQL PDO Driver (доступно с версии 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 больше не поддерживает использование драйвера ext/pgsql PHP. Joomla автоматически попытается использовать PostgreSQL PDO Driver (доступен с PHP 5.3 и Joomla 3.9). В противном случае не удастся создать соединение с базой данных Postgres Database.

Расширение 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.

Manual Include Behavior Removed

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

JMenuItem

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

Pagination

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

Pathway

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

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

Router

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

Логика в 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
  • Old: JApplicationCli  JApplicationBase   Joomla\Application\AbstractApplication
  • New: JApplicationCli  Joomla\Application\AbstractCliApplication   Joomla\Application\AbstractApplication
JApplicationWeb
  • Old: JApplicationWeb  JApplicationBase   Joomla\Application\AbstractApplication
  • New: 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
  • The $_clientId, $_messageQueue and $_name class properties have all been renamed to remove their underscore prefix.
  • Now implements CMSApplicationInterface.
  • If there is an error retrieving a Pathway, Router or Menu object using the respective methods, the exception will now bubble up rather than the method silently catching the exception and returning null.
  • CMSApplication::getInstance will now additionally try to load the user object (using the loadIdentity function).
  • CMSApplication::isSite and CMSApplication::isAdmin have been removed as with the addition of the ConsoleApplication and ApiApplication can give misleading results. Please use CMSApplication::isClient (available from Joomla  3.7). For more information please see Discover on which client your extension code is running.
JApplicationSite

The $_language_filter and $_detect_browser class properties have all been renamed to remove their underscore prefix.

The deprecated method JApplicationSite::getPageParameters has been removed in favour of its alias JApplicationSite::getParams

JApplicationHelper

JApplicationHelper::parseXMLLangMetaFile has been removed without replacement.

Archive

  • The archive package has been removed in favour of the frameworks archive package. Note the API should remain unchanged.
  • Errors handing now uses Exceptions rather than JError

Client

\Joomla\CMS\Client\ClientWrapper has been removed. Use the static methods in \Joomla\CMS\Client\ClientHelper

Crypt

  • JCrypt::hasStrongPasswordSupport has been removed without replacement as all PHP versions Joomla 4 matches will support strong password hashing.

Removed Classes

The following ciphers have been removed in Joomla! 4.0:

  • JCryptCipher3Des
  • JCryptCipherBlowfish
  • JCryptCipherMcrypt
  • JCryptCipherRijndael256
  • JCryptCipherSimple

These have been removed without replacement. Use JCryptCipherCrypto

Removed Methods

  • JCrypt::hasStrongPasswordSupport has been removed without replacement (this attempted to detect bcrypt polyfills on linux hosting but has always returned true since we required PHP 5.3.10 in Joomla 3.3)

Cache

  • JCacheController::get now requires a callable. As a result JCacheControllerCallback::call has been removed.
  • JCacheStorage::test has been removed. Use JCacheStorage::isSupported instead
  • The default storage engines are no longer manually loaded as they are now autoloaded
  • JCacheControllerOutput::start and JCacheControllerOutput::end have been removed without replacement
  • Removed CacheLite storage as it not compatible with PHP7 (which is our minimum version)
  • Error handling now uses Exceptions instead of JError

Component

  • \Joomla\CMS\Component\ComponentRecord no longer extends JObject

Document

Inheritance Change

The following classes have had their inheritance changed:

  • JDocumentError (now extends from \Joomla\Cms\Document\HtmlDocument instead of \Joomla\Cms\Document\Document)

Note as a result of this change rendering an error page resets the document object in Joomla\CMS\Factory::$document, the rationale being we want a clean document to work from; if the error page is triggered we aren't interested in the metadata your component has set, or the media added from some bad module, or whatever plugins are adding to the display. We want a clean environment for rendering the error page only containing the error page's loaded data.

Renderers

  • In order to comply with the RSS feed specification, JDocumentRendererFeedRss now allows the lastBuildDate element to be configured using the JDocumentFeed::$lastBuildDate class property when a feed is rendered. This value defaults to the current time, as is the case with Joomla! 3.x and earlier, however the time can be correctly set by changing this class property to a JDate object representing the desired timestamp.
  • There is now a RendererInterface that all Renderers should implement
  • JDocumentRenderer is now an abstract class and implements RendererInterface
  • As an alternative to <jdoc:include type="head" /> you can now individually load <jdoc:include type="metas" /> for metadata, <jdoc:include type="styles" /> for CSS and <jdoc:include type="scripts" /> for JavaScript. The intention of this is to optionally allow users to place all JavaScript at the bottom of the HTML Document in their templates.

JDocumentFeed

The property type of JDocumentFeed::$lastBuildDate has changed from a string to a JDate object. The property was previously unused by the core Joomla API but extensions may have used it.

Database

  • This package has been replaced by the Joomla Framework Database Package
  • Debug mode has been reworked (see the framework docs for more information [1])

Factory

  • Factory::getApplication no longer takes arguments. These were misleading as it always returned the active application after the first call in the bootstrap, whatever arguments were passed into the function.
  • Factory::getXml has been removed along with JXMLElement. Use SimpleXMLElement directly instead.
  • Factory:: getEditor has been removed use JEditor::getInstance instead.
  • Factory:: getUri has been removed use Uri::getInstance() instead.

Environment

  • JBrowser::isSSLConnection has been removed. Use JApplicationCms::isSSLConnection (available since Joomla 3.2)

Filesystem

  • The filesystem wrapper classes have been removed. Continue using the original static methods.

Filter

  • JFilterInput::_remove has been removed in favour of JFilterInput::remove
  • JFilterInput::_cleanTags has been removed in favour of JFilterInput::cleanTags
  • JFilterInput::_cleanAttributes has been removed in favour of JFilterInput::cleanAttributes
  • JFilterInput::_decode has been removed in favour of JFilterInput::decode
  • JFilterInput::_escapeAttributeValues has been removed in favour of JFilterInput::escapeAttributeValues
  • JFilterInput::_stripCSSExpressions has been removed in favour of JFilterInput::stripCSSExpressions

All of the above deprecations and removals are to allow the class to be reunified with the framework parent class.

Form

  • The libraries/joomla/form/fields and libraries/joomla/form/rules directories are no longer registered to find form classes, all form classes should be autoloaded instead
  • Two new properties added addfieldprefix which registers a namespace prefix for extensions (intended to be used as a replacement for addfieldpath). For example usage please see this Github PR
  • JForm::getControlGroup has been removed use the alias JForm::renderField (available since Joomla 3.2.3)
  • JForm::getControlGroups has been removed use the alias JForm::renderFieldset (available since Joomla 3.2.3)
  • When rendering a field using the hiddenLabel option in JForm - it now only hides the label from the User Interface - the html is still rendered with the sr-only class for screen-reader accessibility purposes.
  • JFormFieldUsergroup has been removed. Use Joomla\CMS\Form\Field\UsergrouplistField instead (available since Joomla 3.2)
  • The Form class has removed the protected methods filterField() and validateField(). This will break any custom Form classes that extends core Form and use these methods. This has been replaced in favour of filtering at the field level (see https://github.com/joomla/joomla-cms/pull/12414 for more information)

Fields

  • JFormFieldFilelist and JFormFieldFolderList have had their filter properties renamed to fileFilter and folderFilter respectively (in order to allow the use of the regular Joomla filter attribute on returned values)
  • JFormPredefinedlistField has its filter properties renamed to optionsFilter (in order to allow the use of the regular Joomla filter attribute on returned values)
  • JFormFieldEditor::save has been removed without replacement
  • JFormFieldText::getSuggestions has been removed in favour of JFormFieldText::getOptions

Wrapper

  • The form wrapper classes have been removed. Continue using the original static methods.

HTTP

Deprecated Classes and Interfaces

The following classes and interfaces have been deprecated and scheduled for removal in Joomla! 5.0:

  • JHttpResponse (use Joomla\Http\Response instead)
  • JHttpTransport (implement Joomla\Http\TransportInterface instead)

Class Changes

The Framework's HTTP package is now included in Joomla! 4.0 and JHttp and the JHttpTransport subclasses have been refactored to use the upstream package.

JHttp
  • JHttp no longer ships with a cacerts.pem bundle in the transports directory use the composer/ca-bundle instead which ships with core.

The JHttp class constructor has been loosened with the following changes:

  • The options parameter is no longer typehinted as a Joomla\Registry\Registry object, an array or any object implementing the ArrayAccess interface can be used instead
  • The transport parameter now allows any Joomla\Http\TransportInterface object.
JHttpTransport

The now deprecated JHttpTransport interface extends Joomla\Http\TransportInterface now and has caused backward compatibility breaking changes in the interface. The constructor is no longer part of the interface, and the interface's `request()` method has had a signature change. Specifically, the second parameter which previously typehinted the JUri class now typehints Joomla\Uri\UriInterface.

JHttpResponse

In refactoring the response object to inherit from the Framework's HTTP package, which is now using the PSR-7 ResponseInterface API, a minor compatibility break has been made in the structure of the response headers. As of 4.0, this will now always be a multi-dimensional array where the key is the header name and the value is an array of values for that header (previously, this was a string).

Image

Deprecated Classes and Interfaces

The following classes and interfaces have been deprecated and scheduled for removal in Joomla! 5.0:

  • JImageFilter (use Joomla\CMS\Image\ImageFilter instead)
  • JImageFilterBackgroundfill (use Joomla\CMS\Image\Filter\Backgroundfill instead)
  • JImageFilterBrightness (use Joomla\CMS\Image\Filter\Brightness instead)
  • JImageFilterContrast (use Joomla\CMS\Image\Filter\Contrast instead)
  • JImageFilterEdgedetect (use Joomla\CMS\Image\Filter\Edgedetect instead)
  • JImageFilterEmboss (use Joomla\CMS\Image\Filter\Emboss instead)
  • JImageFilterGrayscale (use Joomla\CMS\Image\Filter\Grayscale instead)
  • JImageFilterNegate (use Joomla\CMS\Image\Filter\Negate instead)
  • JImageFilterSketchy (use Joomla\CMS\Image\Filter\Sketchy instead)
  • JImageFilterSmooth (use Joomla\CMS\Image\Filter\Smooth instead)

Class Changes

The classes from Framework's Image package have been inlined into CMS and JImage and the JImageFilter subclasses have been refactored to use them. I.e. all classes under Joomla\Image namespace moved to Joomla\CMS\Image namespace.

Menu

  • JMenu::$_items, JMenu::$_default and JMenu::$_active have been had their underscore prefix's removed (note these properties were protected so this only affects custom subclasses of JMenu)

New MVC Layer

  • This has been removed in Joomla 4. We have decided that this effort was not successful and as a result have continued development work on the original MVC Layer (see the "Legacy MVC" section). There is a plugin located on GitHub you can ship with your extensions whilst you migrate them back to the Legacy MVC (note that this is not shipped by default in Joomla 4).

Keychain

Removing the keychain with 4.0 has resulted in the removal of the following class:

  • JKeychain

Pathway

  • JPathway::$_pathway and JPathway::$_count have been had their underscore prefix's removed (note these properties were protected so this only affects custom subclasses of JPathway)
  • JPathway::_makeItem has been removed in favour of JPathway::makeItem (note this method was protected so this only affects custom subclasses of JPathway)

Profiler

  • JProfiler::getmicrotime and JProfiler::getMemory have been removed in favour of the native PHP methods they wrapped (microtime(1) and memory_get_usage() respectively)

Table

  • JTable::__construct database object is now typehinted to be a JDatabaseDriver.
    • Subclasses of JTable will need to ensure they are passing a JDatabaseDriver object to the parent constructor
    • Subclasses of JTable will need to change the method signature of setDbo() if they have an extended version of that method to include the typehint
  • There is a new method JTable::hasField - all instances of property_exists on JTable instances will now use this proxy method instead to allow better interoperability of Table instances
  • The JTableObserver pattern (and corresponding classes) has been removed from JTable. JTable now triggers events and Tags, Content History (and any other custom uses of this pattern) should move to standard plugins.

Mail

The following methods have been removed in Joomla! 4.0:

  • JMail::sendAdminMail has been removed

Exceptions

JMail no longer catches exceptions from PHPMailer. It is now the object calling JMail's responsibility to handle these exceptions as appropriate. In addition if mail sending is disabled in global configuration calling \ Joomla\CMS\Mail\Mail::send() will throw a \Joomla\CMS\Mail\Exception\MailDisabledException.

Language

  • The functions setTransliterator, setPluralSuffixesCallback, setIgnoredSearchWordsCallback, setLowerLimitSearchWordCallback, setUpperLimitSearchWordCallback and setSearchDisplayedCharactersNumberCallback are now typehinted to require a callable.
  • The "_QQ_" placeholder for double quotes has been removed (this only existed to work around an old PHP Bug that has been fixed). Escape double quotes if required (i.e. \")
  • The format for language file names has been changes to ease the work in 3rd party translation tools (such as crowdin). INI language files no longer have to contain the language code (i.e. en-GB.com_contact.ini => com_contact.ini), in this case the special case of en-GB.ini has been renamed to joomla.ini in the core language pack. en-GB.xml has been named langmetadata.xml. There is a b/c layer that will continue to read the old Joomla 3 file names throughout Joomla 4.
  • \Joomla\CMS\Language\Multilanguage::getSiteLangs has been removed. Use \Joomla\CMS\Language\LanguageHelper::getInstalledLanguages(0) instead
  • JLanguage::exists has been removed. Use Joomla\CMS\Language\LanguageHelper::exists instead.
  • The wrapper classes JTextWrapper, LanguageHelperWrapper and TransliterateWrapper have been removed. Continue to use the static methods they wrapped.
  • The pdf_fonts handling/support for language packs (language/pdf_fonts) has been removed from the language installer (see GitHub PR #31288).

Legacy MVC Layer

Legacy Controller

  • JControllerLegacy has been removed from the legacy layer, and we no longer intend to remove it or its subclasses in the near future.
  • JControllerLegacy no longer extends JObject. Controllers should not call any of the methods contained in the JObject class.
  • JControllerLegacy implements an interface for multiple task controllers
  • JControllerLegacy::_construct now takes additional arguments. If you were previously getting a Controller object through JControllerLegacy::getInstance you do not need to change your code.
    • Parameter 2: An optional MVCFactoryInterface instance
    • Parameter 3: An optional CMSApplicationInterface instance
    • Parameter 4: An optional Input instance
    • Parameter 5: An optional FormFactoryInterface instance
  • JControllerForm now uses the StringInflector package to determine the list view. This should improve its ability to determine the list view of more view names. If extension developers find that their list view is no longer being found they should manually set the view_list class property in their controller.

Legacy View

  • JViewLegacy has been removed from the legacy layer, and we no longer intend to remove it or its subclasses in the near future.
  • JViewHtml has been split into two classes - AbstractView and HtmlView. Abstract view contains the logic for accessing models and getting the name of the view and is intended to be a base class for non-Html views. Html view contains the same logic as before.
  • There are now two subclasses of JViewHtml - \Joomla\CMS\MVC\View\ListView and \Joomla\CMS\MVC\View\FormView designed to speed up the development of list and form views and reduce code duplication.

Library

  • JLibraryHelper::_load has been removed. Use \Joomla\CMS\Helper\LibraryHelper::loadLibrary instead.

Session

The session package has undergone a major refactoring to use the Framework's Session package. This change primarily affects the internals of the package; changes to the primary public API through the JSession class are minimal.

String

The old JString class alias has been removed. Use \Joomla\String\StringHelper instead.

Removed Classes and Interfaces

The following classes and interfaces have been removed in Joomla! 4.0:

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

JSession

JSession now extends from the Framework's Joomla\Session\Session class. Many of the methods have a modified signature and a compatibility layer exists to help with the transition.

Namespace Parameter Deprecated

The get, set, has and clear methods previously supported a namespace parameter. This parameter is now deprecated. The namespace should be prepended to the name before calling these methods.

JSession::clear() Repurposed

In the Joomla\Session\Session class, the clear method is used to clear all data from the session store. In JSession, this method is used to remove a single key. When this method is called with parameters, it will call the new Joomla\Session\Session::remove() method.

JSession::getInstance() Deprecated

The singleton getInstance() method has been deprecated. The session object should be retrieved from the active application or the dependency injection container instead.

Session Handlers

In Joomla! 3.x and earlier, session handlers were represented by the JSessionStorage class and its subclasses. In Joomla! 4.0, session handlers are now implementations of Joomla\Session\HandlerInterface (which is an extension of PHP's SessionHandlerInterface. All handlers which were supported in Joomla! 3.x are still available in 4.0 in addition to two additional handlers: a handler natively implementing the APCu extension and a handler supporting Redis.

Social Media Libraries

The facebook, github, google, linkedin, openstreetmap, mediawiki and twitter packages have all been removed from the CMS.

User

  • JUser::getParameters has been removed. You can no longer retrieve all parameters for a user but instead use JUser::getParam to get individual parameters as required.

Helper

  • JUserHelper::getCryptedPassword has been removed. Joomla 4 only supports hashing with the native PHP password_hash function (via JUserHelper::hashPassword (available since Joomla 3.2.1))
  • JUserHelper::getSalt has been removed without replacement (it generated the hash's JUserHelper::getCryptedPassword which is now removed as above)
  • JUserHelper::invalidateCookie, JUserHelper::clearExpiredTokens and JUserHelper::getRememberCookieData have been removed without replacement. They had been unused in core since Joomla 3.2 when their logic was moved into the Cookie Authentication Plugin
  • JUserWrapperHelper has been removed. Continue using the original static methods in JUserHelper.

Classes Removed Without Replacement

  • JNode
  • JTree
  • JGrid
  • JError (use native exceptions when error handling is required)

Utilities

Removed Classes and Interfaces

The following classes and interfaces have been removed in Joomla! 4.0:

  • JArrayHelper

use Joomla\Utilities\ArrayHelper; instead.

External Libraries

The following changes have been made to the external libraries that Joomla! packages and ships.

PHPMailer

Joomla! 4.0 ships with PHPMailer 6. Please review the GitHub repository for relevant changes.

PHPUTF8

At Joomla! 3.4, the PHPUTF8 library lived in two locations in the Joomla! package; `libraries/phputf8` and `libraries/vendor/joomla/string/src/phputf8`. In Joomla! 4.0, the copy of the library in `libraries/phputf8` has been removed. The Joomla\String\StringHelper class exposes many of the library's functions and the Composer autoloader definition imports much of the library as well, however, if you need a feature that is not already included then you should import the required functions from the `libraries/vendor/joomla/string/src/phputf8` path.

SimplePie

The SimplePie library is no longer included with Joomla! 4.0.

jQuery

Joomla! 4.0 ships with jQuery 3. Please review the upgrading guide for relevant changes. Note that we are not including jQuery Migrate anymore either. We recommend using it locally to help debug your code if there are any issues.

jQuery UI

jQuery UI has been removed from Joomla 4. Whilst it hasn't been officially announced as dead, there hasn't been a release of jQuery UI since 2016.

Bootstrap

Joomla! 4.0 ships with Bootstrap 5. Bootstrap 2.3.2 has been removed, however we have left some BS2 classes in to ease the migration (e.g. The old BS2 element-invisible still exists for screenreaders)

FOF

FOF 2.x has been removed.

Templates

All the Joomla! 3 templates - ISIS and Hathor in the backend, and Protostar and Beez in the frontend are no longer supported. The new 4.0 backend template is called Atum and the frontend template is called Cassiopeia.

As a consequence, all extensions must migrate to the new Bootstrap 5 style, away from the current Bootstrap 2.3.2 implementation. For more information about Bootstrap, visit the Bootstrap 5 Website and the Bootstrap 2.3.2 Website.

  • Joomla 4 will load the template favicon first rather than the one in the Joomla Root in keeping with the concept the template is the single source of truth.
  • Frontend components and module views now use Block Element Modifier (BEM) class markup to make it easier for templates to support frameworks other than bootstrap. See the BEM Website for more information on how to build similar classes.

There where also changes to options of the core components that you should take a look at when your tempalte should support 3.x and 4.x at the same time: https://docs.joomla.org/J4.x:Changed_parameters_for_template_providers

Other

  • The $_PROFILER global variable has been removed. Use /Joomla/CMS/Profiler/Profiler::getInstance instead.

Media in Libraries

No media is allowed in the libraries root folder in the CMS. All assets associated with Joomla libraries should be put in the media folder per best practices. Direct access is blocked with a .htaccess and the web.config file in the root of the libraries directory.

Bin

Removing the keychain with 4.0 has resulted in the removal of the entire Bin directory as it only contained keychain.

Components

  • All components have been namespaced and directories reworked accordingly. For more information about this read the tutorial on building a component in Joomla 4.
  • com_admin profile view has been removed. (This appears to have been created historically due to issues accessing com_users. This is no longer the case so all user edits go through com_users edit user view in the backend.)
  • com_actionlogs PHP 5.5 backfill code has been removed and accordingly ActionlogsHelper::getCsvData() is now type hinted to return a Generator object
  • com_actionlogs CSV export headers have been changed to match the strings shown in the UI.
  • Core components have had URL Routing 'Legacy' mode removed from Joomla 3.7. You should either use your .htaccess file or the redirect component to fix any internal URLs that change. You can try the 'Modern' mode in Joomla 3 by following the instructions here
  • The MailTo component has been removed without replacement. If you used this functionality you will need to find an alternative component on JED.
  • In com_contact 's frontend contact view - the contact property has been removed as it was a duplicate of the item property. We chose to keep $this->item as it was consistent with that in the article and tag views. Template overrides will need updating to reflect this.
  • The repeatable field in com_fields has been removed in favour of the new subform field. Data from repeatable fields is automatically migrated to the new subform field but is stored in a different format.
  • The xreference fields have been removed from #__contact_details, #__content and #__newsfeeds as they were unused.

Plugins

  • The Gmail authentication plugin has been removed. For more information please read this blog post
  • Google reCAPTCHA v1 support has been fully removed from the CAPTCHA plugin. This hasn't worked since Q2 2018. Google dropped support for it.
  • The reCAPTCHA plugin now uses Google's official PHP library for CAPTCHA under the hood
  • For plugins using the 3.x compatibility layer, the name result is a protected property for both input parameters and return values. For information on the new recommended approach to plugins please read S:MyLanguage/J4.x:Creating_a_Plugin_for_Joomla
  • For plugins using the 3.x compatibility layer, for any type hints for events that require a class, that class must be autoloaded before the plugin is instantiated.
  • The onContentBeforeSave event now requires the data parameter. This has been passed in \Joomla\CMS\MVC\Model\LegacyModel since 3.7 but is now passed in consistently by core extensions and used by the core Joomla content plugin.
  • Returning before calling parent::__construct() in the constructor of a plugin is no longer supported to avoid queuing the plugin into the event dispatcher.
  • onUserBeforeDataValidation is deprecated as an event in favor of onContentBeforeValidateData (The event was usable by all content types and was not specific to users. Note that both events will be called for the duration of Joomla 4. You should migrate your code to the new event when you no longer need to support Joomla 3.

Administrator Helpers

  • JAdministratorHelper has been removed without replacement. (It's been merged into JApplicationAdministrator.)
  • JSubMenuHelper has been removed without replacement. (Use JHtmlSidebar instead - available since 3.0.)
  • JToolbarHelper has been moved to the main libraries directory.

Modules

  • The administrator module submenu has been removed.
  • Logic of Module Chromes (module styles) in template files html/modules.php have been moved to JLayout files. modChrome_x functions in modules.php are no longer supported. See https://github.com/joomla/joomla-cms/pull/23570 for details.
  • Module Chromes (module styles) modChrome_horz, modChrome_xhtml, modChrome_rounded have been removed from template system without replacement.
  • Module Class Suffixes have been renamed and standardized. These are now called Module Class and are appended to the list of classes in the Module Chrome. (They are no longer rendered in the module output itself.)

Error Handling

  • Joomla will now handle PHP's E_USER_DEPRECATED errors and pipes it into JLog - this is useful for handling deprecations in many 3rd party PHP Libraries (note it will block the page load if debug mode is enabled)
  • Joomla\CMS\Exception\ExceptionHandler now only operates on Exceptions thrown in JApplication::execute. We now use Symfony's ErrorHandler when this fails or exceptions are thrown outside of this. We expect this to have minimal effect on most users and should give a more helpful message in many cases than the traditional "Error displaying the error page" error for users when things go very wrong.
  • Joomla\CMS\Exception\ExceptionHandler is now format aware and will render errors in html, json, xml, feed or cli aware formats
  • The Joomla\CMS\Exception\ExceptionHandler::render() signature is changed to include the Throwable typehint. Before 3.5 when PHP 7 support was added this was typehinted as Exception, and since 3.5 has been typechecked in the code itself.

Base Tag

Previous Joomla versions set a <base> header tag of the current URL in the frontend. This has been removed as it served no clear purpose.

JavaScript

The caption.js file has been removed from Joomla. Use the native HTML elements figure and figcaption. (You can look at JLayout in layouts/joomla/content/intro_image.php for an example).

Namespacing

Class usage like $msg = JText::_( 'Hello man!' ); can now use namespacing. That would turn into $msg = Text::_( 'Hello man!' );. To use namespacing, you need to add the proper namespace declaration. This should be added after the defined('_JEXEC') or die;.

To find out the proper namespace you can either follow the instructions here: SO confused about namespace & enquemessage... or use the generated file pdf reference file: File:J! namespace reference.pdf

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