<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.sandbox.joomla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sharky</id>
	<title>Joomla! Documentation - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.sandbox.joomla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sharky"/>
	<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/Special:Contributions/Sharky"/>
	<updated>2026-07-09T17:34:45Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=J3.x:Adding_custom_fields/Implement_into_your_component&amp;diff=760439</id>
		<title>J3.x:Adding custom fields/Implement into your component</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=J3.x:Adding_custom_fields/Implement_into_your_component&amp;diff=760439"/>
		<updated>2020-10-20T08:36:53Z</updated>

		<summary type="html">&lt;p&gt;Sharky: Correct method name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;languages /&amp;gt;&amp;lt;/noinclude&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
{{section portal heading|icon=plug|title=&amp;lt;translate&amp;gt;&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
Implementation into your component&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
{{J3.x:Adding_custom_fields/TOC/&amp;lt;translate&amp;gt;&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
en&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Implement fields into your component == &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
This article describes how to apply a basic implementation of the custom fields feature to your custom component.&amp;lt;/translate&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
Ever wanted to show additional attributes in your items? Through custom fields, you have a seamlessly integrated way to show them in the backend and frontend of your site.&amp;lt;/translate&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
Custom fields offers 15 different types, if you need more you can [[S:MyLanguage/J3.x:Creating_a_Plugin_for_Joomla|create your own plugin]]&amp;lt;/translate&amp;gt;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
The custom fields extension is placed in core and can be used in a similar way to the categories extension.&lt;br /&gt;
Basically there are just 2 files you need to extend with the following code for the basic backend part.&amp;lt;/translate&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Note!&#039;&#039;&#039; In the example code we will use for your component the name &amp;lt;tt&amp;gt;com_example&amp;lt;/tt&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== The Backend Part === &amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== How to add fields to the backend lists ==== &amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
Similar to &amp;lt;tt&amp;gt;com_categories&amp;lt;/tt&amp;gt; there are just a few lines needed to add the fields in the backend view.&lt;br /&gt;
Just add the following lines to the method &amp;lt;code&amp;gt;addSubmenu&amp;lt;/code&amp;gt; in your component helper class.&amp;lt;/translate&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
The used context needs to match the context you want to implement the fields in. An example of context could be &amp;lt;tt&amp;gt;com_content.article&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;com_weblinks.weblink&amp;lt;/tt&amp;gt;. We’re using &amp;lt;tt&amp;gt;com_example.item&amp;lt;/tt&amp;gt; here as example. Only the context option needs to be changed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if (JComponentHelper::isEnabled(&#039;com_fields&#039;))&lt;br /&gt;
{&lt;br /&gt;
	JHtmlSidebar::addEntry(&lt;br /&gt;
		JText::_(&#039;JGLOBAL_FIELDS&#039;),&lt;br /&gt;
		&#039;index.php?option=com_fields&amp;amp;context=com_example.item&#039;,&lt;br /&gt;
		$vName == &#039;fields.fields&#039;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	JHtmlSidebar::addEntry(&lt;br /&gt;
		JText::_(&#039;JGLOBAL_FIELD_GROUPS&#039;),&lt;br /&gt;
		&#039;index.php?option=com_fields&amp;amp;view=groups&amp;amp;context=com_example.item&#039;,&lt;br /&gt;
		$vName == &#039;fields.groups&#039;&lt;br /&gt;
	);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Implement the ACL ==== &amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
Now the ACL part needs to be done. You have to add the following lines to your access xml file just before the closing &amp;lt;code&amp;gt;&amp;lt;/access&amp;gt;&amp;lt;/code&amp;gt; in that file. Here they are defined and will allow your users to choose the ACL settings in your implementation of &amp;lt;tt&amp;gt;com_fields&amp;lt;/tt&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
	&amp;lt;section name=&amp;quot;fieldgroup&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;action name=&amp;quot;core.create&amp;quot; title=&amp;quot;JACTION_CREATE&amp;quot; description=&amp;quot;COM_FIELDS_GROUP_PERMISSION_CREATE_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;action name=&amp;quot;core.delete&amp;quot; title=&amp;quot;JACTION_DELETE&amp;quot; description=&amp;quot;COM_FIELDS_GROUP_PERMISSION_DELETE_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;action name=&amp;quot;core.edit&amp;quot; title=&amp;quot;JACTION_EDIT&amp;quot; description=&amp;quot;COM_FIELDS_GROUP_PERMISSION_EDIT_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;action name=&amp;quot;core.edit.state&amp;quot; title=&amp;quot;JACTION_EDITSTATE&amp;quot; description=&amp;quot;COM_FIELDS_GROUP_PERMISSION_EDITSTATE_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;action name=&amp;quot;core.edit.own&amp;quot; title=&amp;quot;JACTION_EDITOWN&amp;quot; description=&amp;quot;COM_FIELDS_GROUP_PERMISSION_EDITOWN_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;action name=&amp;quot;core.edit.value&amp;quot; title=&amp;quot;JACTION_EDITVALUE&amp;quot; description=&amp;quot;COM_FIELDS_GROUP_PERMISSION_EDITVALUE_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/section&amp;gt;&lt;br /&gt;
	&amp;lt;section name=&amp;quot;field&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;action name=&amp;quot;core.delete&amp;quot; title=&amp;quot;JACTION_DELETE&amp;quot; description=&amp;quot;COM_FIELDS_FIELD_PERMISSION_DELETE_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;action name=&amp;quot;core.edit&amp;quot; title=&amp;quot;JACTION_EDIT&amp;quot; description=&amp;quot;COM_FIELDS_FIELD_PERMISSION_EDIT_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;action name=&amp;quot;core.edit.state&amp;quot; title=&amp;quot;JACTION_EDITSTATE&amp;quot; description=&amp;quot;COM_FIELDS_FIELD_PERMISSION_EDITSTATE_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;action name=&amp;quot;core.edit.value&amp;quot; title=&amp;quot;JACTION_EDITVALUE&amp;quot; description=&amp;quot;COM_FIELDS_FIELD_PERMISSION_EDITVALUE_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/section&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
There is one more entry setting in that file:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
    &amp;lt;action name=&amp;quot;core.edit.value&amp;quot; title=&amp;quot;JACTION_EDITVALUE&amp;quot; description=&amp;quot;JACTION_EDITVALUE_COMPONENT_DESC&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
This entry should be made under the normal settings in your component (and also in the access xml file) as it allows users in the group to edit any value of custom fields submitted in your component.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Result === &amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
If you completed these steps, your backend part for fields implementation is done. The users can now create fields and assign them to an item.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== The Frontend Part === &amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
Now let&#039;s go to the frontend part. It is easy as the fields are rendered, through the [[S:MyLanguage/Plugin/Events#Content|Plugin/Events/Content]] events on the frontend.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
To display fields on the frontend, you need to implement the content plugin events in your component.&amp;lt;/translate&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Important&#039;&#039;&#039; here is where you pass the same context that you used in the backend to the events.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
See:&amp;lt;/translate&amp;gt;&lt;br /&gt;
*[[S:MyLanguage/Plugin/Events/Content#onContentAfterTitle|onContentAfterTitle]]&lt;br /&gt;
*[[S:MyLanguage/Plugin/Events/Content#onContentBeforeDisplay|onContentBeforeDisplay]]&lt;br /&gt;
*[[S:MyLanguage/Plugin/Events/Content#onContentAfterDisplay|onContentAfterDisplay]]&lt;br /&gt;
*[[S:MyLanguage/Plugin/Events/Content#onContentPrepare|onContentPrepare]]&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
After the onContentPrepare event is fired with the context you can find the attached fields in &amp;lt;tt&amp;gt;$item-&amp;gt;jcfields&amp;lt;/tt&amp;gt; property if you want to render the fields using in your layouts / views.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Tips, Tricks &amp;amp; Hidden Features === &amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
Here you can find some tips and tricks on what can be gone wrong with your implementation as well as some hidden features of com_fields.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== The fields tab don’t show up in my component&#039;s edit view ==== &amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
In some components the edit views in backend and/or frontend are hardcoded and can&#039;t be changed / extended using plugins. But as the fields uses a plugin to add the fields to your component you need to support that in order to support fields. You can make sure that fields are rendered e.g. by implementing the following layout in your component edit view:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
    &amp;lt;?php $this-&amp;gt;ignore_fieldsets = array(&#039;general&#039;, &#039;info&#039;, &#039;detail&#039;, &#039;jmetadata&#039;, &#039;item_associations&#039;); ?&amp;gt;&lt;br /&gt;
    &amp;lt;?php echo JLayoutHelper::render(&#039;joomla.edit.params&#039;, $this); ?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
The first line makes sure we ignore the (eventually hardcoded fieldsets) and than render the dynamic fields tab using the &amp;lt;code&amp;gt;joomla.edit.params&amp;lt;/code&amp;gt; layout.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Public helper classes and API ==== &amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
The class FieldsHelper has some public API functions to work with fields.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
    JLoader::register(&#039;FieldsHelper&#039;, JPATH_ADMINISTRATOR . &#039;/components/com_fields/helpers/fields.php&#039;);&lt;br /&gt;
    $fields = FieldsHelper::getFields(&#039;com_example.item&#039;, $item, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
The field model itself allows to get and store the value of a field.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=php&amp;gt;&lt;br /&gt;
    JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . &#039;/components/com_fields/models&#039;, &#039;FieldsModel&#039;);&lt;br /&gt;
    $fieldModel = JModelLegacy::getInstance(&#039;Field&#039;, &#039;FieldsModel&#039;, array(&#039;ignore_request&#039; =&amp;gt; true));&lt;br /&gt;
    $fieldModel-&amp;gt;setFieldValue($fieldId, $item-&amp;gt;id, &#039;demo value&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== ACL support ==== &amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
* Every field has an access level&lt;br /&gt;
* Every field has a new permission edit.value&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;JFactory::getUser()-&amp;gt;authorise(&#039;edit.value&#039;, ‘com_example.item.field.&#039; . (int) $field-&amp;gt;id);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== More Information === &amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://www.youtube.com/watch?v=7ikOaOKyo6s | JAB16 - &amp;lt;translate&amp;gt;&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
Custom Fields in Joomla for developers - English&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://www.youtube.com/watch?v=F_Ni15icn1U | JD16AT - &amp;lt;translate&amp;gt;&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
Custom fields since Joomla 3.7 - English&amp;lt;/translate&amp;gt;&lt;br /&gt;
* https://joomla.digital-peak.com/images/blog/JDD16%20Custom%20fields%20in%20Joomla%20for%20developers.pdf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;div class=&amp;quot;large-6 columns&amp;quot;&amp;gt;{{Basic button|S:MyLanguage/J3.x:Adding_custom_fields/What components are supporting custom fields|&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
Prev: What components are supporting custom fields&amp;lt;/translate&amp;gt;|class=expand success}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;large-6 columns&amp;quot;&amp;gt;{{Basic button|S:MyLanguage/J3.x:Adding_custom_fields/Overrides|&amp;lt;translate&amp;gt;&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
Next: Use custom fields in your overrides&amp;lt;/translate&amp;gt;|class=expand success}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:Custom Fields]]&lt;br /&gt;
[[Category:Beginners]]&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Component_Development]]&lt;br /&gt;
[[Category:Joomla! 3.x]]&lt;br /&gt;
[[Category:Joomla! 3.7]]&lt;br /&gt;
[[Category:Joomla! 3.8]]&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sharky</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Potential_backward_compatibility_issues_in_Joomla_4&amp;diff=707972</id>
		<title>Potential backward compatibility issues in Joomla 4</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Potential_backward_compatibility_issues_in_Joomla_4&amp;diff=707972"/>
		<updated>2020-08-04T05:41:55Z</updated>

		<summary type="html">&lt;p&gt;Sharky: Draggable typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;languages /&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{{incomplete}}{{RightTOC}}&amp;lt;translate&amp;gt;&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
This document tracks potential backward compatibility issues for Joomla! 4. Listed are issues which potentially break extensions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
The base of this comparison is Joomla! 3.10.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Updated System Requirements == &amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
The system requirements have been updated as follows:&lt;br /&gt;
*PHP 7.2.5&lt;br /&gt;
*MySQL 5.6&lt;br /&gt;
*PostgreSQL 11.0&lt;br /&gt;
*SQL Server support has been dropped.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== PHP MySQL Extension === &amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
*Joomla no longer supports using PHP&#039;s ext/mysql driver (which was removed in PHP 7.0). Joomla will automatically try and use the mysqli extension (available since PHP 5.3) or the mysql PDO Driver (available since PHP 5.3) else it will fail to create a database connection.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:196--&amp;gt; * Strict mode has been enabled. The following flags are now active by default in Joomla 4 and you may have to update your database queries accordingly. This will help us with future MySQL version upgrades and also aligns more closely with Postgres to enable easier compatibility with queries in both languages.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&#039;STRICT_TRANS_TABLES&#039;,&lt;br /&gt;
&#039;ERROR_FOR_DIVISION_BY_ZERO&#039;,&lt;br /&gt;
&#039;NO_AUTO_CREATE_USER&#039;,&lt;br /&gt;
&#039;NO_ENGINE_SUBSTITUTION&#039;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As a consequence, Joomla 4 will only use &#039;&#039;&#039;NULL date defaults&#039;&#039;&#039;. The use of the &amp;quot;invalid default date&amp;quot; 0000-00-00 00:00:00 in Joomla 4 has been deprecated.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHP Postgres Extension === &amp;lt;!--T:105--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:106--&amp;gt; Joomla no longer supports using PHP&#039;s ext/pgsql driver. Joomla will automatically try and use the PostgreSQL PDO Driver (available since PHP 5.3 and Joomla 3.9) else it will fail to create a database connection with a Postgres Database.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== PHP GMP Extension === &amp;lt;!--T:211--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:212--&amp;gt; This is required for using the WebAuthn feature. Note it is installed by default on the majority of hosting sites.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== PHP mcrypt Extension === &amp;lt;!--T:213--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:214--&amp;gt; This is required for using the Joomla\CMS\Crypt\Cipher\CrytoCipher class and it&#039;s alias JCryptCipherCrypto.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CMS Libraries == &amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
The following changes have been made to Joomla! CMS libraries (this is primarily code that was found in the “libraries/cms” directory in Joomla! 3.7 and earlier).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Installer === &amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:107--&amp;gt; Plugin discover installs will no longer search for xml files in the Joomla! 1.5 plugin folder layouts&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:108--&amp;gt; In 3.x, only plugins scripts have the preflight method called and none make postflight available during the uninstall process. All extensions types will have these hooks available in 4.0 when being uninstalled. If you currently preflight and postflight and assume they only apply in an install/update context - this logic is now incorrect and you should use the install route (given as one of the method parameters)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:109--&amp;gt; When uninstalling a plugin the uninstall function in the extension script is now triggered before triggering any SQL queries (this is now consistent with all other extension types).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes ==== &amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
The following classes have been removed in Joomla! 4.0:&lt;br /&gt;
*JInstallerComponent (use JInstallerAdapterComponent instead)&lt;br /&gt;
*JInstallerFile (use JInstallerAdapterFile instead)&lt;br /&gt;
*JInstallerLanguage (use JInstallerAdapterLanguage instead)&lt;br /&gt;
*JInstallerLibrary (use JInstallerAdapterLibrary instead)&lt;br /&gt;
*JInstallerModule (use JInstallerAdapterModule instead)&lt;br /&gt;
*JInstallerPackage (use JInstallerAdapterPackage instead)&lt;br /&gt;
*JInstallerPlugin (use JInstallerAdapterPlugin instead)&lt;br /&gt;
*JInstallerTemplate (use JInstallerAdapterTemplate instead)&lt;br /&gt;
*JSubMenuHelper (use JHtmlSidebar instead; note that in contrast to JSubMenuHelper, this requires an addition of a placeholder in your view template)&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== JInstallerAdapter Inheritance ==== &amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
JInstallerAdapter no longer extends from JAdapterInstance and inherently JObject.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:110--&amp;gt; Custom Installer Adapters must now be autoloaded.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Menu === &amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== JMenu is now an abstract class ==== &amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
JMenu is now an abstract class. Subclasses of JMenu must now also implement a load method.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Manual Include Behavior Removed ==== &amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
The logic in JMenu::getInstance() to manually include a file from the application&#039;s includes/menu.php path has been removed. The JMenu subclass should be autoloaded instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JMenuItem ====&lt;br /&gt;
* You can no longer retrieve the params property from JMenuItem directly. Use the getParams() method instead (available since Joomla 3.7)&lt;br /&gt;
* JMenuItem::set and JMenuItem::get have been removed. Properties must be explicitly named&lt;br /&gt;
* There is now a AdministratorMenuItem class which extends from MenuItem that contains extra public properties used for the Administrator menu item.&lt;br /&gt;
&lt;br /&gt;
=== Pagination ===&lt;br /&gt;
* The magic pagination functions &#039;&#039;pagination_item_active&#039;&#039;, &#039;&#039;pagination_item_inactive&#039;&#039; have been removed. Use the JLayout&#039;s joomla.pagination.link instead&lt;br /&gt;
* The magic pagination function &#039;&#039;pagination_list_render&#039;&#039; is deprecated. Use the JLayout joomla.pagination.list instead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pathway === &amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Manual Include Behavior Removed ==== &amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
The logic in JPathway::getInstance() to manually include a file from the application&#039;s includes/pathway.php path has been removed. The JPathway subclass should be autoloaded instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Router === &amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Manual Include Behavior Removed ==== &amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
The logic in JRouter::getInstance() to manually include a file from the application&#039;s includes/router.php path has been removed. The JRouter subclass should be autoloaded instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Method Signature Changes ==== &amp;lt;!--T:111--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:112--&amp;gt; The attachBuildRule and attachParseRule are now typehinted to require callables.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== JVersion === &amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
Support for accessing the JVersion class constants as class properties is no longer supported. The constants were introduced in Joomla! 3.5 to prevent the old class properties from being edited.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:113--&amp;gt; The following deprecated constants have been removed:&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JVersion::RELEASE&lt;br /&gt;
* JVersion::DEV_LEVEL&lt;br /&gt;
* JVersion::BUILD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== JHtml === &amp;lt;!--T:114--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:115--&amp;gt; The register function in JHtml is now typehinted to require a callable. Subclasses of JHtml will now need to match this signature (note this was already required at the function code level already).&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:116--&amp;gt; JHtml::_ no longer allows you to call non-public methods in JHtml&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:117--&amp;gt; JHtml::_ is now a final method (you can no longer override it if you subclass JHtml) and it&#039;s signature has changed to take advantage of modern PHP features (scalar and variadic typehints)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:191--&amp;gt; JHtmlBootstrap::modal has been removed. Use JHtmlBootstrap::renderModal&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JHtmlSortablelist::sortable has been deprecated in favour of JHtmlDraggablelist::draggable - the old method acts as a proxy to the new method currently to facilitate the removal of jQuery UI from Joomla Core. All media assets relating to the original jQuery UI implementation have been removed.&lt;br /&gt;
* JHtmlBatch has been removed as all the code had been moved to layouts for template overrides. Use the JLayouts directly in your code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Updater === &amp;lt;!--T:209--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:210--&amp;gt;&lt;br /&gt;
* We removed the deprecated integer client handling from the updater extension adapter class. Please use &#039;&#039;&#039;site&#039;&#039;&#039; and &#039;&#039;&#039;administrator&#039;&#039;&#039; and not any more the integer values &#039;&#039;&#039;0&#039;&#039;&#039; / &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Platform == &amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
The following changes have been made to Joomla! Platform libraries (this is primarily code found in the `libraries/joomla` or `libraries/legacy` directories in Joomla! 3).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access ===&lt;br /&gt;
* JAccess::$assetPermissionsById and JAccess::$assetPermissionsByName and JAccess::preloadPermissionsParentIdMapping have been removed without replacement. Since 3.6 we&#039;ve used other methods and class properties to optimize the loading of assets (see [https://github.com/joomla/joomla-cms/pull/12850 this PR] for the reasons why this was deprecated)&lt;br /&gt;
* JAccess::getActions has been removed. Use JAccess::getActionsFromFile or JAccess::getActionsFromData instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Application === &amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes ==== &amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
The following classes have been removed in Joomla! 4.0:&lt;br /&gt;
*JApplicationWebRouter (use the `joomla/router` package instead)&lt;br /&gt;
*JApplicationWebRouterBase (use the `joomla/router` package instead)&lt;br /&gt;
*JApplicationWebRouterRest (use the `joomla/router` package instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All references to JSite and JAdministrator have been removed (these were just class alias&#039; since Joomla 3.2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Deprecated Classes ==== &amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
The following classes have been deprecated and scheduled for removal in Joomla! 5.0:&lt;br /&gt;
*JApplicationBase (use Joomla\Application\AbstractApplication instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== CLI/Web Class Changes ==== &amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
The JApplicationCli and JApplicationWeb classes have been recomposed to extend from the Framework&#039;s Application package instead. This breaks type checks for a JApplicationBase object. For forward compatibility, it is recommended to check if application classes are an instance of Joomla\Application\AbstractApplication (JApplicationBase has extended this class since Joomla! 3.4).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
Additionally, both of these classes are now abstract. Developers implementing these classes must provide a `doExecute` method with their application&#039;s logic.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:118--&amp;gt; The registerEvent method is now typehinted to require a callable for the $handler parameter.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:178--&amp;gt; Applications that want to support both Web and CLI Applications should now typehint against the \Joomla\CMS\Application\ CMSApplicationInterface - this contains common methods (some of which in Joomla 3.x were only found in the JApplicationCms class) that can be used by all code. It&#039;s strongly recommended any custom applications (especially CLI applications) implement this interface to make compatibility checks easier, simultaneously any typehints should use the interface rather than a concrete class.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JApplicationCli =====&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
Old:&amp;lt;/translate&amp;gt; JApplicationCli {{rarr}} JApplicationBase {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
New:&amp;lt;/translate&amp;gt; JApplicationCli {{rarr}} Joomla\Application\AbstractCliApplication {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
&lt;br /&gt;
===== JApplicationWeb =====&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
Old:&amp;lt;/translate&amp;gt; JApplicationWeb {{rarr}} JApplicationBase {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
New:&amp;lt;/translate&amp;gt; JApplicationWeb {{rarr}} Joomla\Application\AbstractWebApplication {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:179--&amp;gt;&lt;br /&gt;
* The legacy ways of calling JApplicationWeb::redirect have been removed&lt;br /&gt;
** With a message and messageType parameters (call enqueueMessage separately)&lt;br /&gt;
** Passing in a true/false value as the 2nd/3rd params instead of a redirect code will give an InvalidArgumentException instead of defaulting to a 303&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:180--&amp;gt; * JApplicationWeb::$singleValueResponseHeaders has been removed because the Framework Application will be internally using PSR-7 Response objects as of its 2.0 release. This changes how the headers data is stored so it is always a multi-dimensional array with each top level key being the header names and the value being an array holding all of the values for that header.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== CMSApplication =====&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:119--&amp;gt; The $_clientId, $_messageQueue and $_name class properties have all been renamed to remove their underscore prefix.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:181--&amp;gt; Now implements CMSApplicationInterface&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:182--&amp;gt; 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&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:183--&amp;gt; CMSApplication::getInstance will now additionally try and load the user object (using the loadIdentity function)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:206--&amp;gt; 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 {{JVer | 3.7}}). For more information please see [[S:MyLanguage/J3.x:Discover_on_which_client_your_extension_code_is_running|Discover on which client your extension code is running]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JApplicationSite =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:120--&amp;gt;&lt;br /&gt;
The $_language_filter and $_detect_browser class properties have all been renamed to remove their underscore prefix.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:121--&amp;gt; The deprecated method JApplicationSite::getPageParameters has been removed in favour of it&#039;s alias JApplicationSite::getParams&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JApplicationHelper =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:122--&amp;gt; JApplicationHelper::parseXMLLangMetaFile has been removed without replacement.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Archive === &amp;lt;!--T:123--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:124--&amp;gt; The archive package has been removed in favour of the frameworks archive package. Note the API should remain unchanged.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:184--&amp;gt; Errors handing now uses Exceptions rather than JError&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Client ===&lt;br /&gt;
\Joomla\CMS\Client\ClientWrapper has been removed. Use the static methods in \Joomla\CMS\Client\ClientHelper&lt;br /&gt;
&lt;br /&gt;
=== Crypt ===&lt;br /&gt;
* JCrypt::hasStrongPasswordSupport has been removed without replacement as all PHP versions Joomla 4 matches will support strong password hashing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes ==== &amp;lt;!--T:98--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:99--&amp;gt;&lt;br /&gt;
The following ciphers have been removed in Joomla! 4.0:&amp;lt;/translate&amp;gt;&lt;br /&gt;
*JCryptCipher3Des&lt;br /&gt;
*JCryptCipherBlowfish&lt;br /&gt;
*JCryptCipherMcrypt&lt;br /&gt;
*JCryptCipherRijndael256&lt;br /&gt;
*JCryptCipherSimple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:100--&amp;gt;&lt;br /&gt;
These have been removed without replacement. Use JCryptCipherCrypto&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Methods ==== &amp;lt;!--T:167--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:185--&amp;gt; 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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Cache === &amp;lt;!--T:186--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:126--&amp;gt; JCacheController::get now requires a callable. As a result JCacheControllerCallback::call has been removed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:127--&amp;gt; JCacheStorage::test has been removed. Use JCacheStorage::isSupported instead&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:128--&amp;gt; The default storage engines are no longer manually loaded as they are now autoloaded&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:129--&amp;gt; JCacheControllerOutput::start and JCacheControllerOutput::end have been removed without replacement&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:130--&amp;gt; Removed CacheLite storage as it not compatible with PHP7 (which is our minimum version)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:187--&amp;gt; Error handling now uses Exceptions instead of JError&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Component === &amp;lt;!--T:131--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:132--&amp;gt; \Joomla\CMS\Component\ComponentRecord no longer extends JObject&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Document === &amp;lt;!--T:101--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Inheritance Change ==== &amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:44--&amp;gt;&lt;br /&gt;
The following classes have had their inheritance changed:&lt;br /&gt;
*JDocumentError (now extends from \Joomla\Cms\Document\HtmlDocument instead of \Joomla\Cms\Document\Document)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:133--&amp;gt; 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&#039;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&#039;s loaded data.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Renderers ==== &amp;lt;!--T:134--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:135--&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:136--&amp;gt; There is now a RendererInterface that all Renderers should implement&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:137--&amp;gt; JDocumentRenderer is now an abstract class and implements RendererInterface&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:188--&amp;gt; As an alternative to &amp;lt;jdoc:include type=&amp;quot;head&amp;quot; /&amp;gt; you can now individually load &amp;lt;jdoc:include type=&amp;quot;metas&amp;quot; /&amp;gt; for metadata, &amp;lt;jdoc:include type=&amp;quot;styles&amp;quot; /&amp;gt; for CSS and &amp;lt;jdoc:include type=&amp;quot;scripts&amp;quot; /&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JDocumentFeed ====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:45--&amp;gt;&lt;br /&gt;
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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Database === &amp;lt;!--T:138--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:139--&amp;gt; This package has been replaced by the Joomla Framework Database Package&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:197--&amp;gt; Debug mode has been reworked (see the framework docs for more information&amp;lt;/translate&amp;gt; [https://github.com/joomla-framework/database])&lt;br /&gt;
&lt;br /&gt;
=== Factory ===&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:140--&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:141--&amp;gt; Factory::getXml has been removed along with JXMLElement. Use SimpleXMLElement directly instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:142--&amp;gt; Factory:: getEditor has been removed use JEditor::getInstance instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Environment === &amp;lt;!--T:198--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;noinclude&amp;gt;JBrowser::isSSLConnection has been removed. Use JApplicationCms::isSSLConnection (available since Joomla 3.2)&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Filesystem === &amp;lt;!--T:207--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:208--&amp;gt; The filesystem wrapper classes have been removed. Continue using the original static methods.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filter ===&lt;br /&gt;
* JFilterInput::_remove has been removed in favour of JFilterInput::remove&lt;br /&gt;
* JFilterInput::_cleanTags has been removed in favour of JFilterInput::cleanTags&lt;br /&gt;
* JFilterInput::_cleanAttributes has been removed in favour of JFilterInput::cleanAttributes&lt;br /&gt;
* JFilterInput::_decode has been removed in favour of JFilterInput::decode&lt;br /&gt;
* JFilterInput::_escapeAttributeValues has been removed in favour of JFilterInput::escapeAttributeValues&lt;br /&gt;
* JFilterInput::_stripCSSExpressions has been removed in favour of JFilterInput::stripCSSExpressions&lt;br /&gt;
&lt;br /&gt;
All of the above deprecations and removals are to allow the class to be reunified with the framework parent class.&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:143--&amp;gt; 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&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:192--&amp;gt; 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 [https://github.com/joomla/joomla-cms/pull/16419 this Github PR]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:193--&amp;gt; JForm::getControlGroup has been removed use the alias JForm::renderField (available since Joomla 3.2.3)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:194--&amp;gt; JForm::getControlGroups has been removed use the alias JForm::renderFieldset (available since Joomla 3.2.3)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:199--&amp;gt; JFormFieldUsergroup has been removed. Use Joomla\CMS\Form\Field\UsergrouplistField instead (available since Joomla 3.2)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fields ====&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:205--&amp;gt;&lt;br /&gt;
JFormFieldFilelist and JFormFieldFolderList have had their filter properties renamed to &amp;lt;code&amp;gt;fileFilter&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;folderFilter&amp;lt;/code&amp;gt; respectively (in order to allow the use of the regular Joomla filter attribute on returned values)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JFormPredefinedlistField has its filter properties renamed to &amp;lt;code&amp;gt;optionsFilter&amp;lt;/code&amp;gt; (in order to allow the use of the regular Joomla filter attribute on returned values)&lt;br /&gt;
* JFormFieldEditor::save has been removed without replacement&lt;br /&gt;
* JFormFieldText::getSuggestions has been removed in favour of JFormFieldText::getOptions&lt;br /&gt;
&lt;br /&gt;
=== Wrapper ===&lt;br /&gt;
* The form wrapper classes have been removed. Continue using the original static methods.&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Deprecated Classes and Interfaces ==== &amp;lt;!--T:47--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:48--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been deprecated and scheduled for removal in Joomla! 5.0:&lt;br /&gt;
*JHttpResponse (use Joomla\Http\Response instead)&lt;br /&gt;
*JHttpTransport (implement Joomla\Http\TransportInterface instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Class Changes ==== &amp;lt;!--T:49--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:50--&amp;gt;&lt;br /&gt;
The Framework&#039;s HTTP package is now included in Joomla! 4.0 and JHttp and the JHttpTransport subclasses have been refactored to use the upstream package.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JHttp =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:51--&amp;gt;&lt;br /&gt;
The JHttp class constructor has been loosened with the following changes:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:52--&amp;gt;&lt;br /&gt;
*The options parameter is no longer typehinted as a Joomla\Registry\Registry object, an array or any object implementing the [https://secure.php.net/manual/en/class.arrayaccess.php ArrayAccess] interface can be used instead&lt;br /&gt;
*The transport parameter now allows any Joomla\Http\TransportInterface object.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JHttpTransport =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:53--&amp;gt;&lt;br /&gt;
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&#039;s `request()` method has had a signature change.  Specifically, the second parameter which previously typehinted the JUri class now typehints Joomla\Uri\UriInterface.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JHttpResponse =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:54--&amp;gt;&lt;br /&gt;
In refactoring the response object to inherit from the Framework&#039;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).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Image === &amp;lt;!--T:55--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Deprecated Classes and Interfaces ==== &amp;lt;!--T:56--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:57--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been deprecated and scheduled for removal in Joomla! 5.0:&lt;br /&gt;
* JImageFilter (use Joomla\CMS\Image\ImageFilter instead)&lt;br /&gt;
* JImageFilterBackgroundfill (use Joomla\CMS\Image\Filter\Backgroundfill instead)&lt;br /&gt;
* JImageFilterBrightness (use Joomla\CMS\Image\Filter\Brightness instead)&lt;br /&gt;
* JImageFilterContrast (use Joomla\CMS\Image\Filter\Contrast instead)&lt;br /&gt;
* JImageFilterEdgedetect (use Joomla\CMS\Image\Filter\Edgedetect instead)&lt;br /&gt;
* JImageFilterEmboss (use Joomla\CMS\Image\Filter\Emboss instead)&lt;br /&gt;
* JImageFilterGrayscale (use Joomla\CMS\Image\Filter\Grayscale instead)&lt;br /&gt;
* JImageFilterNegate (use Joomla\CMS\Image\Filter\Negate instead)&lt;br /&gt;
* JImageFilterSketchy (use Joomla\CMS\Image\Filter\Sketchy instead) &lt;br /&gt;
* JImageFilterSmooth (use Joomla\CMS\Image\Filter\Smooth instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Class Changes ==== &amp;lt;!--T:58--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:59--&amp;gt;&lt;br /&gt;
The classes from Framework&#039;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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Menu === &amp;lt;!--T:144--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:145--&amp;gt; JMenu::$_items, JMenu::$_default and JMenu::$_active have been had their underscore prefix&#039;s removed (note these properties were protected so this only affects custom subclasses of JMenu)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== New MVC Layer ===&lt;br /&gt;
* 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 &amp;quot;Legacy MVC&amp;quot; section). There is a plugin located [https://github.com/joomla-extensions/legacy-mvc 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).&lt;br /&gt;
&lt;br /&gt;
=== Keychain ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:146--&amp;gt; Removing the keychain with 4.0 has resulted in the removal of the following class:&amp;lt;/translate&amp;gt;&lt;br /&gt;
*JKeychain&lt;br /&gt;
&lt;br /&gt;
=== Pathway ===&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:147--&amp;gt; JPathway::$_pathway and JPathway::$_count have been had their underscore prefix&#039;s removed (note these properties were protected so this only affects custom subclasses of JPathway)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:148--&amp;gt; JPathway::_makeItem has been removed in favour of JPathway::makeItem (note this method was protected so this only affects custom subclasses of JPathway)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Profiler ===&lt;br /&gt;
* JProfiler::getmicrotime and JProfiler::getMemory have been removed in favour of the native PHP methods they wrapped (&amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;microtime(1)&amp;lt;/source&amp;gt; and &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;memory_get_usage()&amp;lt;/source&amp;gt; respectively&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Table === &amp;lt;!--T:149--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:150--&amp;gt;&lt;br /&gt;
* JTable::__construct database object is now typehinted to be a JDatabaseDriver.&lt;br /&gt;
** Subclasses of JTable will need to ensure they are passing a JDatabaseDriver object to the parent constructor&lt;br /&gt;
** 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&lt;br /&gt;
* 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&lt;br /&gt;
* 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Mail === &amp;lt;!--T:62--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:63--&amp;gt;&lt;br /&gt;
The following methods have been removed in Joomla! 4.0:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:64--&amp;gt;&lt;br /&gt;
* JMail::sendAdminMail has been removed&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exceptions ====&lt;br /&gt;
JMail no longer catches exceptions from PHPMailer. It is now the object calling JMail&#039;s responsibility to handle these exceptions as appropriate. In addition if mail sending is disabled in global configuration calling &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;\ Joomla\CMS\Mail\Mail::send()&amp;lt;/source&amp;gt; will throw a &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;\Joomla\CMS\Mail\Exception\MailDisabledException&amp;lt;/source&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Language === &amp;lt;!--T:151--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:152--&amp;gt;&lt;br /&gt;
* The functions setTransliterator, setPluralSuffixesCallback, setIgnoredSearchWordsCallback, setLowerLimitSearchWordCallback, setUpperLimitSearchWordCallback and setSearchDisplayedCharactersNumberCallback are now typehinted to require a callable.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;&amp;quot;_QQ_&amp;quot;&amp;lt;/tt&amp;gt; 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. &amp;lt;tt&amp;gt;\&amp;quot;&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* 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 =&amp;gt; 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.&lt;br /&gt;
* \Joomla\CMS\Language\Multilanguage::getSiteLangs has been removed. Use \Joomla\CMS\Language\LanguageHelper::getInstalledLanguages(0) instead&lt;br /&gt;
* JLanguage::exists has been removed. Use Joomla\CMS\Language\LanguageHelper::exists instead.&lt;br /&gt;
* The wrapper classes JTextWrapper, LanguageHelperWrapper and TransliterateWrapper have been removed. Continue to use the static methods they wrapped&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Legacy MVC Layer === &amp;lt;!--T:65--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Legacy Controller ==== &amp;lt;!--T:66--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:67--&amp;gt;&lt;br /&gt;
* JControllerLegacy has been removed from the legacy layer, and we no longer intend to remove it or it&#039;s subclasses in the near future.&lt;br /&gt;
* JControllerLegacy no longer extends JObject. Controllers should not call any of the methods contained in the JObject class.&lt;br /&gt;
* JControllerLegacy implements an interface for multiple task controllers&lt;br /&gt;
* 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.&lt;br /&gt;
** Parameter 2: An optional MVCFactoryInterface instance&lt;br /&gt;
** Parameter 3: An optional CMSApplicationInterface instance&lt;br /&gt;
** Parameter 4: An optional Input instance&lt;br /&gt;
** Parameter 5: An optional FormFactoryInterface instance&lt;br /&gt;
* JControllerForm now using the StringInflector package to determine the list view. This should improve it&#039;s ability to guess 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Legacy View ==== &amp;lt;!--T:153--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:154--&amp;gt;&lt;br /&gt;
* JViewLegacy has been removed from the legacy layer, and we no longer intend to remove it or it&#039;s subclasses in the near future.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
* JLibraryHelper::_load has been removed. Use \Joomla\CMS\Helper\LibraryHelper::loadLibrary instead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Session === &amp;lt;!--T:68--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:69--&amp;gt;&lt;br /&gt;
The session package has undergone a major refactoring to use the Framework&#039;s Session package.  This change primarily effects the internals of the package; changes to the primary public API through the JSession class are minimal.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:195--&amp;gt; The old JString class alias has been removed. Use \Joomla\String\StringHelper instead&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes and Interfaces ==== &amp;lt;!--T:70--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:71--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been removed in Joomla! 5.0:&amp;lt;/translate&amp;gt;&lt;br /&gt;
*JSessionExceptionUnsupported&lt;br /&gt;
*JSessionHandlerInterface&lt;br /&gt;
*JSessionHandlerJoomla&lt;br /&gt;
*JSessionHandlerNative&lt;br /&gt;
*JSessionStorage&lt;br /&gt;
*JSessionStorageApc&lt;br /&gt;
*JSessionStorageDatabase&lt;br /&gt;
*JSessionStorageMemcache&lt;br /&gt;
*JSessionStorageMemcached&lt;br /&gt;
*JSessionStorageNone&lt;br /&gt;
*JSessionStorageWincache&lt;br /&gt;
*JSessionStorageXcache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== JSession ==== &amp;lt;!--T:72--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:73--&amp;gt;&lt;br /&gt;
JSession now extends from the Framework&#039;s Joomla\Session\Session class.  Many of the methods have a modified signature and a compatibility layer exists to help with the transition.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== Namespace Parameter Deprecated ===== &amp;lt;!--T:74--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:75--&amp;gt;&lt;br /&gt;
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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== JSession::clear() Repurposed ===== &amp;lt;!--T:76--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:77--&amp;gt;&lt;br /&gt;
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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== JSession::getInstance() Deprecated ===== &amp;lt;!--T:78--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:79--&amp;gt;&lt;br /&gt;
The singleton getInstance() method has been deprecated.  The session object should be retrieved from the active application or the dependency injection container instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== Session Handlers ===== &amp;lt;!--T:80--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:81--&amp;gt;&lt;br /&gt;
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&#039;s [https://secure.php.net/manual/en/class.sessionhandlerinterface.php 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Social Media Libraries === &amp;lt;!--T:155--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:156--&amp;gt; The facebook, github, google, linkedin, openstreetmap, mediawiki and twitter packages have all been removed from the CMS.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
==== Helper ====&lt;br /&gt;
* 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))&lt;br /&gt;
* JUserHelper::getSalt has been removed without replacement (it generated the hash&#039;s JUserHelper::getCryptedPassword which is now removed as above)&lt;br /&gt;
* 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&lt;br /&gt;
* JUserWrapperHelper has been removed. Continue using the original static methods in JUserHelper.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Classes Removed Without Replacement === &amp;lt;!--T:82--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JNode&lt;br /&gt;
* JTree&lt;br /&gt;
* JGrid&lt;br /&gt;
* JError &amp;lt;translate&amp;gt;&amp;lt;!--T:189--&amp;gt; (use native exceptions when error handling is required)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Utilities ==== &amp;lt;!--T:102--&amp;gt; &lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== Removed Classes and Interfaces ===== &amp;lt;!--T:103--&amp;gt; &lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:104--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been removed in Joomla! 4.0:&lt;br /&gt;
*JArrayHelper&lt;br /&gt;
use Joomla\Utilities\ArrayHelper; instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External Libraries == &amp;lt;!--T:83--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:84--&amp;gt;&lt;br /&gt;
The following changes have been made to the external libraries that Joomla! packages and ships.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHPMailer ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:85--&amp;gt;&lt;br /&gt;
Joomla! 4.0 ships with PHPMailer 6.0.  Please review [https://github.com/PHPMailer/PHPMailer/blob/6.0/UPGRADING.md the upgrading guide] for relevant changes.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHPUTF8 ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:86--&amp;gt;&lt;br /&gt;
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&#039;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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SimplePie ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:87--&amp;gt;&lt;br /&gt;
The SimplePie library is no longer included with Joomla! 4.0.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== jQuery ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:88--&amp;gt;&lt;br /&gt;
Joomla! 4.0 ships with jQuery 3.  Please review [https://jquery.com/upgrade-guide/3.0/ 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== jQuery UI ===&lt;br /&gt;
jQuery UI has been removed from Joomla 4. Whilst it hasn&#039;t been officially announced as dead, there hasn&#039;t been a release of jQuery UI since 2016.&lt;br /&gt;
&lt;br /&gt;
=== Bootstrap ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:89--&amp;gt;&lt;br /&gt;
Joomla! 4.0 ships with Bootstrap 4. 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)&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== FOF ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:157--&amp;gt; FOF 2.x has been removed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Templates == &amp;lt;!--T:90--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:91--&amp;gt;&lt;br /&gt;
All the Joomla! 3 templates - ISIS and Hathor in the backend, and protostar and Beeze in the frontend are no longer supported. The new 4.0 backend template is called Atum and the frontend template is called Cassiopeia.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:158--&amp;gt; As a consequence, all extensions must migrate to the new Bootstrap 4 style, away from the current Bootstrap 2.3.2 implementation. For more information about Bootstrap 4: [http://getbootstrap.com/docs/4.0/getting-started/introduction/]. For more information about Bootstrap 2.3.2: [http://getbootstrap.com/2.3.2/]&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Frontend components and module views now use BEM class markup to make it easier for templates to support frameworks other than bootstrap. See [http://getbem.com/ the BEM website] for more information on how to build similar classes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other == &amp;lt;!--T:95--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* The $_PROFILER global variable has been removed. Use \Joomla\CMS\Profiler\Profiler::getInstance instead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Media in Libraries === &amp;lt;!--T:159--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:160--&amp;gt; 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 as per best practices. Direct access is blocked with a .htaccess and web.config file in the root of the libraries directory.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Bin === &amp;lt;!--T:96--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:97--&amp;gt;&lt;br /&gt;
Removing the keychain with 4.0 has resulted in the removal of the entire Bin directory as it only contained keychain.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Components === &amp;lt;!--T:200--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:201--&amp;gt; All components have been namespaced and directories reworked accordingly. For more information about this read the tutorial on building a component in Joomla 4&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:202--&amp;gt; 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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:203--&amp;gt; com_actionlogs php 5.5 backfill code has been removed and accordingly &amp;lt;source inline lang=&amp;quot;php&amp;quot;&amp;gt;ActionlogsHelper::getCsvData()&amp;lt;/source&amp;gt; is now type hinted to return a &amp;lt;source inline lang=&amp;quot;php&amp;quot;&amp;gt;Generator&amp;lt;/source&amp;gt; object&amp;lt;/translate&amp;gt;&lt;br /&gt;
* com_actionlogs CSV export headers have been changed to match the strings shown in the UI.&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:204--&amp;gt; Core components have had URL Routing &#039;Legacy&#039; 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 &#039;Modern&#039; mode in Joomla 3 by following the instructions [[S:MyLanguage/J3.x:New_Routing_System|here]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* The MailTo component has been removed without replacement. If you used this functionality you will need to find an alternative component on JED&lt;br /&gt;
* In com_contact &#039;s frontend contact view - the contact property has been removed as it was a duplicate of the item property. We chose to keep $this-&amp;gt;item as it was consistent with that in the article and tag views. Template overrides will need updating to reflect this.&lt;br /&gt;
* 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.&lt;br /&gt;
* the xreference fields have been removed from &#039;&#039;#__contact_details&#039;&#039;, &#039;&#039;#__content&#039;&#039; and &#039;&#039;#__newsfeeds&#039;&#039; as they were unused&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Plugins === &amp;lt;!--T:161--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:162--&amp;gt; The gmail authentication plugin has been removed. For more information please read [https://developer.joomla.org/news/724-removal-of-the-gmail-authentication-plugin-as-of-joomla-4-0.html this blog post]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:163--&amp;gt; Recaptcha v1 support has been fully removed from the captcha plugin - this has no longer worked since Q2 2018 due to google dropping support for it.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:164--&amp;gt; The Recaptcha plugin now uses google&#039;s official php library for captcha under the hood&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:168--&amp;gt; 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]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* For plugins using the 3.x compatibility layer any type hints for events that require a class - the class *must* be autoloaded before the plugin is instantiated&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:190--&amp;gt; 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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* Returning before calling &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;parent::__construct()&amp;lt;/source&amp;gt; in the constructor of a plugin is no longer supported to avoid queuing the plugin into the event dispatcher&lt;br /&gt;
* *onUserBeforeDataValidation* is deprecated as an event in favor of *onContentBeforeValidateData* (as the event was usable by all content types and was not specific to users. Note both events will be called for the duration of Joomla 4 - however you should migrate your code to the new event when you no longer need to support Joomla 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Administrator Helpers === &amp;lt;!--T:169--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:170--&amp;gt; JAdministratorHelper has been removed without replacement (it&#039;s been merged into JApplicationAdministrator)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:171--&amp;gt; JSubMenuHelper has been removed without replacement (use JHtmlSidebar instead - available since 3.0)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:172--&amp;gt; JToolbarHelper has been moved to the main libraries directory&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Modules === &amp;lt;!--T:173--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:174--&amp;gt; The administrator module &amp;quot;submenu&amp;quot; has been removed&amp;lt;/translate&amp;gt;&lt;br /&gt;
* Logic of &amp;quot;Module Chromes&amp;quot; (module styles) in template files &amp;lt;code&amp;gt;html/modules.php&amp;lt;/code&amp;gt; have been moved to &amp;lt;code&amp;gt;JLayout&amp;lt;/code&amp;gt; files. &amp;lt;code&amp;gt;modChrome_x&amp;lt;/code&amp;gt; functions in &amp;lt;code&amp;gt;modules.php&amp;lt;/code&amp;gt; are no longer supported. See https://github.com/joomla/joomla-cms/pull/23570 for details.&lt;br /&gt;
* &amp;quot;Module Chromes&amp;quot; (module styles) &amp;lt;code&amp;gt;modChrome_horz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modChrome_xhtml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modChrome_rounded&amp;lt;/code&amp;gt; have been removed from template &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; without replacement.&lt;br /&gt;
* Module Class Suffixes have been renamed and standardized. These 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)&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Error Handling === &amp;lt;!--T:165--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:166--&amp;gt; Joomla will now handle PHP&#039;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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:175--&amp;gt; Joomla\CMS\Exception\ExceptionHandler now only operates on Exceptions thrown in JApplication::execute. We now use Symfony&#039;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 &amp;quot;Error displaying the error page&amp;quot; error for users when things go very wrong.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:176--&amp;gt; Joomla\CMS\Exception\ExceptionHandler is now format aware and will render errors in html, json, xml, feed or cli aware formats&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:177--&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base Tag ===&lt;br /&gt;
Previous Joomla versions set a &#039;&#039;&amp;lt;base&amp;gt;&#039;&#039; header tag of the current URL in the frontend. This has been removed as it served no clear purpose.&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
* caption.js has been removed from Joomla. Use the native HTML elements &#039;&#039;figure&#039;&#039; and &#039;&#039;figcaption&#039;&#039; (you can look the JLayout in layouts/joomla/content/intro_image.php for an example).&lt;br /&gt;
&lt;br /&gt;
=== Namespacing ===&lt;br /&gt;
Class usage like &#039;&#039;$msg = JText::_( &#039;Hello man!&#039; );&#039;&#039; can now use namespacing.&amp;lt;br /&amp;gt;&lt;br /&gt;
Which would turn into &#039;&#039;$msg = Text::_( &#039;Hello man!&#039; );&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
To use namespacing you need to add the proper namespace declaration.&amp;lt;br /&amp;gt;&lt;br /&gt;
This should be added after the &#039;&#039;defined(&#039;_JEXEC&#039;) or die;&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To find out the proper namespace you can either follow the instructions &amp;lt;br /&amp;gt;&lt;br /&gt;
here: https://groups.google.com/forum/#!topic/joomla-dev-general/1ua9zIqlcVc &amp;lt;br /&amp;gt;&lt;br /&gt;
or use the generated file pdf reference file.&lt;br /&gt;
[[File:J! namespace reference.pdf|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Compatibility{{#translation:}}]]&lt;br /&gt;
[[Category:Development{{#translation:}}]]&lt;br /&gt;
[[Category:Platform{{#translation:}}]]&lt;br /&gt;
[[Category:Migration{{#translation:}}]]&lt;br /&gt;
[[Category:Update Working Group{{#translation:}}]]&lt;br /&gt;
[[Category:Joomla! 4.x{{#translation:}}]]&lt;br /&gt;
[[Category:Joomla! 4.0{{#translation:}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sharky</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Potential_backward_compatibility_issues_in_Joomla_4&amp;diff=707971</id>
		<title>Potential backward compatibility issues in Joomla 4</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Potential_backward_compatibility_issues_in_Joomla_4&amp;diff=707971"/>
		<updated>2020-08-04T05:41:23Z</updated>

		<summary type="html">&lt;p&gt;Sharky: Draggable typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;languages /&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{{incomplete}}{{RightTOC}}&amp;lt;translate&amp;gt;&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
This document tracks potential backward compatibility issues for Joomla! 4. Listed are issues which potentially break extensions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
The base of this comparison is Joomla! 3.10.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Updated System Requirements == &amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
The system requirements have been updated as follows:&lt;br /&gt;
*PHP 7.2.5&lt;br /&gt;
*MySQL 5.6&lt;br /&gt;
*PostgreSQL 11.0&lt;br /&gt;
*SQL Server support has been dropped.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== PHP MySQL Extension === &amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
*Joomla no longer supports using PHP&#039;s ext/mysql driver (which was removed in PHP 7.0). Joomla will automatically try and use the mysqli extension (available since PHP 5.3) or the mysql PDO Driver (available since PHP 5.3) else it will fail to create a database connection.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:196--&amp;gt; * Strict mode has been enabled. The following flags are now active by default in Joomla 4 and you may have to update your database queries accordingly. This will help us with future MySQL version upgrades and also aligns more closely with Postgres to enable easier compatibility with queries in both languages.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&#039;STRICT_TRANS_TABLES&#039;,&lt;br /&gt;
&#039;ERROR_FOR_DIVISION_BY_ZERO&#039;,&lt;br /&gt;
&#039;NO_AUTO_CREATE_USER&#039;,&lt;br /&gt;
&#039;NO_ENGINE_SUBSTITUTION&#039;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As a consequence, Joomla 4 will only use &#039;&#039;&#039;NULL date defaults&#039;&#039;&#039;. The use of the &amp;quot;invalid default date&amp;quot; 0000-00-00 00:00:00 in Joomla 4 has been deprecated.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHP Postgres Extension === &amp;lt;!--T:105--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:106--&amp;gt; Joomla no longer supports using PHP&#039;s ext/pgsql driver. Joomla will automatically try and use the PostgreSQL PDO Driver (available since PHP 5.3 and Joomla 3.9) else it will fail to create a database connection with a Postgres Database.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== PHP GMP Extension === &amp;lt;!--T:211--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:212--&amp;gt; This is required for using the WebAuthn feature. Note it is installed by default on the majority of hosting sites.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== PHP mcrypt Extension === &amp;lt;!--T:213--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:214--&amp;gt; This is required for using the Joomla\CMS\Crypt\Cipher\CrytoCipher class and it&#039;s alias JCryptCipherCrypto.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CMS Libraries == &amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
The following changes have been made to Joomla! CMS libraries (this is primarily code that was found in the “libraries/cms” directory in Joomla! 3.7 and earlier).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Installer === &amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:107--&amp;gt; Plugin discover installs will no longer search for xml files in the Joomla! 1.5 plugin folder layouts&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:108--&amp;gt; In 3.x, only plugins scripts have the preflight method called and none make postflight available during the uninstall process. All extensions types will have these hooks available in 4.0 when being uninstalled. If you currently preflight and postflight and assume they only apply in an install/update context - this logic is now incorrect and you should use the install route (given as one of the method parameters)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:109--&amp;gt; When uninstalling a plugin the uninstall function in the extension script is now triggered before triggering any SQL queries (this is now consistent with all other extension types).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes ==== &amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
The following classes have been removed in Joomla! 4.0:&lt;br /&gt;
*JInstallerComponent (use JInstallerAdapterComponent instead)&lt;br /&gt;
*JInstallerFile (use JInstallerAdapterFile instead)&lt;br /&gt;
*JInstallerLanguage (use JInstallerAdapterLanguage instead)&lt;br /&gt;
*JInstallerLibrary (use JInstallerAdapterLibrary instead)&lt;br /&gt;
*JInstallerModule (use JInstallerAdapterModule instead)&lt;br /&gt;
*JInstallerPackage (use JInstallerAdapterPackage instead)&lt;br /&gt;
*JInstallerPlugin (use JInstallerAdapterPlugin instead)&lt;br /&gt;
*JInstallerTemplate (use JInstallerAdapterTemplate instead)&lt;br /&gt;
*JSubMenuHelper (use JHtmlSidebar instead; note that in contrast to JSubMenuHelper, this requires an addition of a placeholder in your view template)&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== JInstallerAdapter Inheritance ==== &amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
JInstallerAdapter no longer extends from JAdapterInstance and inherently JObject.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:110--&amp;gt; Custom Installer Adapters must now be autoloaded.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Menu === &amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== JMenu is now an abstract class ==== &amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
JMenu is now an abstract class. Subclasses of JMenu must now also implement a load method.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Manual Include Behavior Removed ==== &amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
The logic in JMenu::getInstance() to manually include a file from the application&#039;s includes/menu.php path has been removed. The JMenu subclass should be autoloaded instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JMenuItem ====&lt;br /&gt;
* You can no longer retrieve the params property from JMenuItem directly. Use the getParams() method instead (available since Joomla 3.7)&lt;br /&gt;
* JMenuItem::set and JMenuItem::get have been removed. Properties must be explicitly named&lt;br /&gt;
* There is now a AdministratorMenuItem class which extends from MenuItem that contains extra public properties used for the Administrator menu item.&lt;br /&gt;
&lt;br /&gt;
=== Pagination ===&lt;br /&gt;
* The magic pagination functions &#039;&#039;pagination_item_active&#039;&#039;, &#039;&#039;pagination_item_inactive&#039;&#039; have been removed. Use the JLayout&#039;s joomla.pagination.link instead&lt;br /&gt;
* The magic pagination function &#039;&#039;pagination_list_render&#039;&#039; is deprecated. Use the JLayout joomla.pagination.list instead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pathway === &amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Manual Include Behavior Removed ==== &amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
The logic in JPathway::getInstance() to manually include a file from the application&#039;s includes/pathway.php path has been removed. The JPathway subclass should be autoloaded instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Router === &amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Manual Include Behavior Removed ==== &amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
The logic in JRouter::getInstance() to manually include a file from the application&#039;s includes/router.php path has been removed. The JRouter subclass should be autoloaded instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Method Signature Changes ==== &amp;lt;!--T:111--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:112--&amp;gt; The attachBuildRule and attachParseRule are now typehinted to require callables.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== JVersion === &amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
Support for accessing the JVersion class constants as class properties is no longer supported. The constants were introduced in Joomla! 3.5 to prevent the old class properties from being edited.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:113--&amp;gt; The following deprecated constants have been removed:&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JVersion::RELEASE&lt;br /&gt;
* JVersion::DEV_LEVEL&lt;br /&gt;
* JVersion::BUILD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== JHtml === &amp;lt;!--T:114--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:115--&amp;gt; The register function in JHtml is now typehinted to require a callable. Subclasses of JHtml will now need to match this signature (note this was already required at the function code level already).&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:116--&amp;gt; JHtml::_ no longer allows you to call non-public methods in JHtml&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:117--&amp;gt; JHtml::_ is now a final method (you can no longer override it if you subclass JHtml) and it&#039;s signature has changed to take advantage of modern PHP features (scalar and variadic typehints)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:191--&amp;gt; JHtmlBootstrap::modal has been removed. Use JHtmlBootstrap::renderModal&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JHtmlSortablelist::sortable has been deprecated in favour of JHtmlDragdablelist::draggable - the old method acts as a proxy to the new method currently to facilitate the removal of jQuery UI from Joomla Core. All media assets relating to the original jQuery UI implementation have been removed.&lt;br /&gt;
* JHtmlBatch has been removed as all the code had been moved to layouts for template overrides. Use the JLayouts directly in your code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Updater === &amp;lt;!--T:209--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:210--&amp;gt;&lt;br /&gt;
* We removed the deprecated integer client handling from the updater extension adapter class. Please use &#039;&#039;&#039;site&#039;&#039;&#039; and &#039;&#039;&#039;administrator&#039;&#039;&#039; and not any more the integer values &#039;&#039;&#039;0&#039;&#039;&#039; / &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Platform == &amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
The following changes have been made to Joomla! Platform libraries (this is primarily code found in the `libraries/joomla` or `libraries/legacy` directories in Joomla! 3).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access ===&lt;br /&gt;
* JAccess::$assetPermissionsById and JAccess::$assetPermissionsByName and JAccess::preloadPermissionsParentIdMapping have been removed without replacement. Since 3.6 we&#039;ve used other methods and class properties to optimize the loading of assets (see [https://github.com/joomla/joomla-cms/pull/12850 this PR] for the reasons why this was deprecated)&lt;br /&gt;
* JAccess::getActions has been removed. Use JAccess::getActionsFromFile or JAccess::getActionsFromData instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Application === &amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes ==== &amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
The following classes have been removed in Joomla! 4.0:&lt;br /&gt;
*JApplicationWebRouter (use the `joomla/router` package instead)&lt;br /&gt;
*JApplicationWebRouterBase (use the `joomla/router` package instead)&lt;br /&gt;
*JApplicationWebRouterRest (use the `joomla/router` package instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All references to JSite and JAdministrator have been removed (these were just class alias&#039; since Joomla 3.2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Deprecated Classes ==== &amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
The following classes have been deprecated and scheduled for removal in Joomla! 5.0:&lt;br /&gt;
*JApplicationBase (use Joomla\Application\AbstractApplication instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== CLI/Web Class Changes ==== &amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
The JApplicationCli and JApplicationWeb classes have been recomposed to extend from the Framework&#039;s Application package instead. This breaks type checks for a JApplicationBase object. For forward compatibility, it is recommended to check if application classes are an instance of Joomla\Application\AbstractApplication (JApplicationBase has extended this class since Joomla! 3.4).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
Additionally, both of these classes are now abstract. Developers implementing these classes must provide a `doExecute` method with their application&#039;s logic.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:118--&amp;gt; The registerEvent method is now typehinted to require a callable for the $handler parameter.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:178--&amp;gt; Applications that want to support both Web and CLI Applications should now typehint against the \Joomla\CMS\Application\ CMSApplicationInterface - this contains common methods (some of which in Joomla 3.x were only found in the JApplicationCms class) that can be used by all code. It&#039;s strongly recommended any custom applications (especially CLI applications) implement this interface to make compatibility checks easier, simultaneously any typehints should use the interface rather than a concrete class.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JApplicationCli =====&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
Old:&amp;lt;/translate&amp;gt; JApplicationCli {{rarr}} JApplicationBase {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
New:&amp;lt;/translate&amp;gt; JApplicationCli {{rarr}} Joomla\Application\AbstractCliApplication {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
&lt;br /&gt;
===== JApplicationWeb =====&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
Old:&amp;lt;/translate&amp;gt; JApplicationWeb {{rarr}} JApplicationBase {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
New:&amp;lt;/translate&amp;gt; JApplicationWeb {{rarr}} Joomla\Application\AbstractWebApplication {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:179--&amp;gt;&lt;br /&gt;
* The legacy ways of calling JApplicationWeb::redirect have been removed&lt;br /&gt;
** With a message and messageType parameters (call enqueueMessage separately)&lt;br /&gt;
** Passing in a true/false value as the 2nd/3rd params instead of a redirect code will give an InvalidArgumentException instead of defaulting to a 303&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:180--&amp;gt; * JApplicationWeb::$singleValueResponseHeaders has been removed because the Framework Application will be internally using PSR-7 Response objects as of its 2.0 release. This changes how the headers data is stored so it is always a multi-dimensional array with each top level key being the header names and the value being an array holding all of the values for that header.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== CMSApplication =====&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:119--&amp;gt; The $_clientId, $_messageQueue and $_name class properties have all been renamed to remove their underscore prefix.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:181--&amp;gt; Now implements CMSApplicationInterface&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:182--&amp;gt; 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&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:183--&amp;gt; CMSApplication::getInstance will now additionally try and load the user object (using the loadIdentity function)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:206--&amp;gt; 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 {{JVer | 3.7}}). For more information please see [[S:MyLanguage/J3.x:Discover_on_which_client_your_extension_code_is_running|Discover on which client your extension code is running]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JApplicationSite =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:120--&amp;gt;&lt;br /&gt;
The $_language_filter and $_detect_browser class properties have all been renamed to remove their underscore prefix.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:121--&amp;gt; The deprecated method JApplicationSite::getPageParameters has been removed in favour of it&#039;s alias JApplicationSite::getParams&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JApplicationHelper =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:122--&amp;gt; JApplicationHelper::parseXMLLangMetaFile has been removed without replacement.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Archive === &amp;lt;!--T:123--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:124--&amp;gt; The archive package has been removed in favour of the frameworks archive package. Note the API should remain unchanged.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:184--&amp;gt; Errors handing now uses Exceptions rather than JError&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Client ===&lt;br /&gt;
\Joomla\CMS\Client\ClientWrapper has been removed. Use the static methods in \Joomla\CMS\Client\ClientHelper&lt;br /&gt;
&lt;br /&gt;
=== Crypt ===&lt;br /&gt;
* JCrypt::hasStrongPasswordSupport has been removed without replacement as all PHP versions Joomla 4 matches will support strong password hashing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes ==== &amp;lt;!--T:98--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:99--&amp;gt;&lt;br /&gt;
The following ciphers have been removed in Joomla! 4.0:&amp;lt;/translate&amp;gt;&lt;br /&gt;
*JCryptCipher3Des&lt;br /&gt;
*JCryptCipherBlowfish&lt;br /&gt;
*JCryptCipherMcrypt&lt;br /&gt;
*JCryptCipherRijndael256&lt;br /&gt;
*JCryptCipherSimple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:100--&amp;gt;&lt;br /&gt;
These have been removed without replacement. Use JCryptCipherCrypto&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Methods ==== &amp;lt;!--T:167--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:185--&amp;gt; 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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Cache === &amp;lt;!--T:186--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:126--&amp;gt; JCacheController::get now requires a callable. As a result JCacheControllerCallback::call has been removed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:127--&amp;gt; JCacheStorage::test has been removed. Use JCacheStorage::isSupported instead&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:128--&amp;gt; The default storage engines are no longer manually loaded as they are now autoloaded&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:129--&amp;gt; JCacheControllerOutput::start and JCacheControllerOutput::end have been removed without replacement&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:130--&amp;gt; Removed CacheLite storage as it not compatible with PHP7 (which is our minimum version)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:187--&amp;gt; Error handling now uses Exceptions instead of JError&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Component === &amp;lt;!--T:131--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:132--&amp;gt; \Joomla\CMS\Component\ComponentRecord no longer extends JObject&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Document === &amp;lt;!--T:101--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Inheritance Change ==== &amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:44--&amp;gt;&lt;br /&gt;
The following classes have had their inheritance changed:&lt;br /&gt;
*JDocumentError (now extends from \Joomla\Cms\Document\HtmlDocument instead of \Joomla\Cms\Document\Document)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:133--&amp;gt; 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&#039;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&#039;s loaded data.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Renderers ==== &amp;lt;!--T:134--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:135--&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:136--&amp;gt; There is now a RendererInterface that all Renderers should implement&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:137--&amp;gt; JDocumentRenderer is now an abstract class and implements RendererInterface&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:188--&amp;gt; As an alternative to &amp;lt;jdoc:include type=&amp;quot;head&amp;quot; /&amp;gt; you can now individually load &amp;lt;jdoc:include type=&amp;quot;metas&amp;quot; /&amp;gt; for metadata, &amp;lt;jdoc:include type=&amp;quot;styles&amp;quot; /&amp;gt; for CSS and &amp;lt;jdoc:include type=&amp;quot;scripts&amp;quot; /&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JDocumentFeed ====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:45--&amp;gt;&lt;br /&gt;
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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Database === &amp;lt;!--T:138--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:139--&amp;gt; This package has been replaced by the Joomla Framework Database Package&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:197--&amp;gt; Debug mode has been reworked (see the framework docs for more information&amp;lt;/translate&amp;gt; [https://github.com/joomla-framework/database])&lt;br /&gt;
&lt;br /&gt;
=== Factory ===&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:140--&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:141--&amp;gt; Factory::getXml has been removed along with JXMLElement. Use SimpleXMLElement directly instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:142--&amp;gt; Factory:: getEditor has been removed use JEditor::getInstance instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Environment === &amp;lt;!--T:198--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;noinclude&amp;gt;JBrowser::isSSLConnection has been removed. Use JApplicationCms::isSSLConnection (available since Joomla 3.2)&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Filesystem === &amp;lt;!--T:207--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:208--&amp;gt; The filesystem wrapper classes have been removed. Continue using the original static methods.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filter ===&lt;br /&gt;
* JFilterInput::_remove has been removed in favour of JFilterInput::remove&lt;br /&gt;
* JFilterInput::_cleanTags has been removed in favour of JFilterInput::cleanTags&lt;br /&gt;
* JFilterInput::_cleanAttributes has been removed in favour of JFilterInput::cleanAttributes&lt;br /&gt;
* JFilterInput::_decode has been removed in favour of JFilterInput::decode&lt;br /&gt;
* JFilterInput::_escapeAttributeValues has been removed in favour of JFilterInput::escapeAttributeValues&lt;br /&gt;
* JFilterInput::_stripCSSExpressions has been removed in favour of JFilterInput::stripCSSExpressions&lt;br /&gt;
&lt;br /&gt;
All of the above deprecations and removals are to allow the class to be reunified with the framework parent class.&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:143--&amp;gt; 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&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:192--&amp;gt; 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 [https://github.com/joomla/joomla-cms/pull/16419 this Github PR]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:193--&amp;gt; JForm::getControlGroup has been removed use the alias JForm::renderField (available since Joomla 3.2.3)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:194--&amp;gt; JForm::getControlGroups has been removed use the alias JForm::renderFieldset (available since Joomla 3.2.3)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:199--&amp;gt; JFormFieldUsergroup has been removed. Use Joomla\CMS\Form\Field\UsergrouplistField instead (available since Joomla 3.2)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fields ====&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:205--&amp;gt;&lt;br /&gt;
JFormFieldFilelist and JFormFieldFolderList have had their filter properties renamed to &amp;lt;code&amp;gt;fileFilter&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;folderFilter&amp;lt;/code&amp;gt; respectively (in order to allow the use of the regular Joomla filter attribute on returned values)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JFormPredefinedlistField has its filter properties renamed to &amp;lt;code&amp;gt;optionsFilter&amp;lt;/code&amp;gt; (in order to allow the use of the regular Joomla filter attribute on returned values)&lt;br /&gt;
* JFormFieldEditor::save has been removed without replacement&lt;br /&gt;
* JFormFieldText::getSuggestions has been removed in favour of JFormFieldText::getOptions&lt;br /&gt;
&lt;br /&gt;
=== Wrapper ===&lt;br /&gt;
* The form wrapper classes have been removed. Continue using the original static methods.&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Deprecated Classes and Interfaces ==== &amp;lt;!--T:47--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:48--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been deprecated and scheduled for removal in Joomla! 5.0:&lt;br /&gt;
*JHttpResponse (use Joomla\Http\Response instead)&lt;br /&gt;
*JHttpTransport (implement Joomla\Http\TransportInterface instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Class Changes ==== &amp;lt;!--T:49--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:50--&amp;gt;&lt;br /&gt;
The Framework&#039;s HTTP package is now included in Joomla! 4.0 and JHttp and the JHttpTransport subclasses have been refactored to use the upstream package.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JHttp =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:51--&amp;gt;&lt;br /&gt;
The JHttp class constructor has been loosened with the following changes:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:52--&amp;gt;&lt;br /&gt;
*The options parameter is no longer typehinted as a Joomla\Registry\Registry object, an array or any object implementing the [https://secure.php.net/manual/en/class.arrayaccess.php ArrayAccess] interface can be used instead&lt;br /&gt;
*The transport parameter now allows any Joomla\Http\TransportInterface object.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JHttpTransport =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:53--&amp;gt;&lt;br /&gt;
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&#039;s `request()` method has had a signature change.  Specifically, the second parameter which previously typehinted the JUri class now typehints Joomla\Uri\UriInterface.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JHttpResponse =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:54--&amp;gt;&lt;br /&gt;
In refactoring the response object to inherit from the Framework&#039;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).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Image === &amp;lt;!--T:55--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Deprecated Classes and Interfaces ==== &amp;lt;!--T:56--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:57--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been deprecated and scheduled for removal in Joomla! 5.0:&lt;br /&gt;
* JImageFilter (use Joomla\CMS\Image\ImageFilter instead)&lt;br /&gt;
* JImageFilterBackgroundfill (use Joomla\CMS\Image\Filter\Backgroundfill instead)&lt;br /&gt;
* JImageFilterBrightness (use Joomla\CMS\Image\Filter\Brightness instead)&lt;br /&gt;
* JImageFilterContrast (use Joomla\CMS\Image\Filter\Contrast instead)&lt;br /&gt;
* JImageFilterEdgedetect (use Joomla\CMS\Image\Filter\Edgedetect instead)&lt;br /&gt;
* JImageFilterEmboss (use Joomla\CMS\Image\Filter\Emboss instead)&lt;br /&gt;
* JImageFilterGrayscale (use Joomla\CMS\Image\Filter\Grayscale instead)&lt;br /&gt;
* JImageFilterNegate (use Joomla\CMS\Image\Filter\Negate instead)&lt;br /&gt;
* JImageFilterSketchy (use Joomla\CMS\Image\Filter\Sketchy instead) &lt;br /&gt;
* JImageFilterSmooth (use Joomla\CMS\Image\Filter\Smooth instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Class Changes ==== &amp;lt;!--T:58--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:59--&amp;gt;&lt;br /&gt;
The classes from Framework&#039;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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Menu === &amp;lt;!--T:144--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:145--&amp;gt; JMenu::$_items, JMenu::$_default and JMenu::$_active have been had their underscore prefix&#039;s removed (note these properties were protected so this only affects custom subclasses of JMenu)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== New MVC Layer ===&lt;br /&gt;
* 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 &amp;quot;Legacy MVC&amp;quot; section). There is a plugin located [https://github.com/joomla-extensions/legacy-mvc 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).&lt;br /&gt;
&lt;br /&gt;
=== Keychain ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:146--&amp;gt; Removing the keychain with 4.0 has resulted in the removal of the following class:&amp;lt;/translate&amp;gt;&lt;br /&gt;
*JKeychain&lt;br /&gt;
&lt;br /&gt;
=== Pathway ===&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:147--&amp;gt; JPathway::$_pathway and JPathway::$_count have been had their underscore prefix&#039;s removed (note these properties were protected so this only affects custom subclasses of JPathway)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:148--&amp;gt; JPathway::_makeItem has been removed in favour of JPathway::makeItem (note this method was protected so this only affects custom subclasses of JPathway)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Profiler ===&lt;br /&gt;
* JProfiler::getmicrotime and JProfiler::getMemory have been removed in favour of the native PHP methods they wrapped (&amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;microtime(1)&amp;lt;/source&amp;gt; and &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;memory_get_usage()&amp;lt;/source&amp;gt; respectively&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Table === &amp;lt;!--T:149--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:150--&amp;gt;&lt;br /&gt;
* JTable::__construct database object is now typehinted to be a JDatabaseDriver.&lt;br /&gt;
** Subclasses of JTable will need to ensure they are passing a JDatabaseDriver object to the parent constructor&lt;br /&gt;
** 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&lt;br /&gt;
* 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&lt;br /&gt;
* 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Mail === &amp;lt;!--T:62--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:63--&amp;gt;&lt;br /&gt;
The following methods have been removed in Joomla! 4.0:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:64--&amp;gt;&lt;br /&gt;
* JMail::sendAdminMail has been removed&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exceptions ====&lt;br /&gt;
JMail no longer catches exceptions from PHPMailer. It is now the object calling JMail&#039;s responsibility to handle these exceptions as appropriate. In addition if mail sending is disabled in global configuration calling &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;\ Joomla\CMS\Mail\Mail::send()&amp;lt;/source&amp;gt; will throw a &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;\Joomla\CMS\Mail\Exception\MailDisabledException&amp;lt;/source&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Language === &amp;lt;!--T:151--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:152--&amp;gt;&lt;br /&gt;
* The functions setTransliterator, setPluralSuffixesCallback, setIgnoredSearchWordsCallback, setLowerLimitSearchWordCallback, setUpperLimitSearchWordCallback and setSearchDisplayedCharactersNumberCallback are now typehinted to require a callable.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;&amp;quot;_QQ_&amp;quot;&amp;lt;/tt&amp;gt; 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. &amp;lt;tt&amp;gt;\&amp;quot;&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* 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 =&amp;gt; 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.&lt;br /&gt;
* \Joomla\CMS\Language\Multilanguage::getSiteLangs has been removed. Use \Joomla\CMS\Language\LanguageHelper::getInstalledLanguages(0) instead&lt;br /&gt;
* JLanguage::exists has been removed. Use Joomla\CMS\Language\LanguageHelper::exists instead.&lt;br /&gt;
* The wrapper classes JTextWrapper, LanguageHelperWrapper and TransliterateWrapper have been removed. Continue to use the static methods they wrapped&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Legacy MVC Layer === &amp;lt;!--T:65--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Legacy Controller ==== &amp;lt;!--T:66--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:67--&amp;gt;&lt;br /&gt;
* JControllerLegacy has been removed from the legacy layer, and we no longer intend to remove it or it&#039;s subclasses in the near future.&lt;br /&gt;
* JControllerLegacy no longer extends JObject. Controllers should not call any of the methods contained in the JObject class.&lt;br /&gt;
* JControllerLegacy implements an interface for multiple task controllers&lt;br /&gt;
* 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.&lt;br /&gt;
** Parameter 2: An optional MVCFactoryInterface instance&lt;br /&gt;
** Parameter 3: An optional CMSApplicationInterface instance&lt;br /&gt;
** Parameter 4: An optional Input instance&lt;br /&gt;
** Parameter 5: An optional FormFactoryInterface instance&lt;br /&gt;
* JControllerForm now using the StringInflector package to determine the list view. This should improve it&#039;s ability to guess 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Legacy View ==== &amp;lt;!--T:153--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:154--&amp;gt;&lt;br /&gt;
* JViewLegacy has been removed from the legacy layer, and we no longer intend to remove it or it&#039;s subclasses in the near future.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
* JLibraryHelper::_load has been removed. Use \Joomla\CMS\Helper\LibraryHelper::loadLibrary instead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Session === &amp;lt;!--T:68--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:69--&amp;gt;&lt;br /&gt;
The session package has undergone a major refactoring to use the Framework&#039;s Session package.  This change primarily effects the internals of the package; changes to the primary public API through the JSession class are minimal.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:195--&amp;gt; The old JString class alias has been removed. Use \Joomla\String\StringHelper instead&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes and Interfaces ==== &amp;lt;!--T:70--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:71--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been removed in Joomla! 5.0:&amp;lt;/translate&amp;gt;&lt;br /&gt;
*JSessionExceptionUnsupported&lt;br /&gt;
*JSessionHandlerInterface&lt;br /&gt;
*JSessionHandlerJoomla&lt;br /&gt;
*JSessionHandlerNative&lt;br /&gt;
*JSessionStorage&lt;br /&gt;
*JSessionStorageApc&lt;br /&gt;
*JSessionStorageDatabase&lt;br /&gt;
*JSessionStorageMemcache&lt;br /&gt;
*JSessionStorageMemcached&lt;br /&gt;
*JSessionStorageNone&lt;br /&gt;
*JSessionStorageWincache&lt;br /&gt;
*JSessionStorageXcache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== JSession ==== &amp;lt;!--T:72--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:73--&amp;gt;&lt;br /&gt;
JSession now extends from the Framework&#039;s Joomla\Session\Session class.  Many of the methods have a modified signature and a compatibility layer exists to help with the transition.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== Namespace Parameter Deprecated ===== &amp;lt;!--T:74--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:75--&amp;gt;&lt;br /&gt;
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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== JSession::clear() Repurposed ===== &amp;lt;!--T:76--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:77--&amp;gt;&lt;br /&gt;
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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== JSession::getInstance() Deprecated ===== &amp;lt;!--T:78--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:79--&amp;gt;&lt;br /&gt;
The singleton getInstance() method has been deprecated.  The session object should be retrieved from the active application or the dependency injection container instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== Session Handlers ===== &amp;lt;!--T:80--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:81--&amp;gt;&lt;br /&gt;
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&#039;s [https://secure.php.net/manual/en/class.sessionhandlerinterface.php 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Social Media Libraries === &amp;lt;!--T:155--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:156--&amp;gt; The facebook, github, google, linkedin, openstreetmap, mediawiki and twitter packages have all been removed from the CMS.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
==== Helper ====&lt;br /&gt;
* 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))&lt;br /&gt;
* JUserHelper::getSalt has been removed without replacement (it generated the hash&#039;s JUserHelper::getCryptedPassword which is now removed as above)&lt;br /&gt;
* 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&lt;br /&gt;
* JUserWrapperHelper has been removed. Continue using the original static methods in JUserHelper.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Classes Removed Without Replacement === &amp;lt;!--T:82--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JNode&lt;br /&gt;
* JTree&lt;br /&gt;
* JGrid&lt;br /&gt;
* JError &amp;lt;translate&amp;gt;&amp;lt;!--T:189--&amp;gt; (use native exceptions when error handling is required)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Utilities ==== &amp;lt;!--T:102--&amp;gt; &lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== Removed Classes and Interfaces ===== &amp;lt;!--T:103--&amp;gt; &lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:104--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been removed in Joomla! 4.0:&lt;br /&gt;
*JArrayHelper&lt;br /&gt;
use Joomla\Utilities\ArrayHelper; instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External Libraries == &amp;lt;!--T:83--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:84--&amp;gt;&lt;br /&gt;
The following changes have been made to the external libraries that Joomla! packages and ships.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHPMailer ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:85--&amp;gt;&lt;br /&gt;
Joomla! 4.0 ships with PHPMailer 6.0.  Please review [https://github.com/PHPMailer/PHPMailer/blob/6.0/UPGRADING.md the upgrading guide] for relevant changes.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHPUTF8 ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:86--&amp;gt;&lt;br /&gt;
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&#039;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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SimplePie ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:87--&amp;gt;&lt;br /&gt;
The SimplePie library is no longer included with Joomla! 4.0.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== jQuery ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:88--&amp;gt;&lt;br /&gt;
Joomla! 4.0 ships with jQuery 3.  Please review [https://jquery.com/upgrade-guide/3.0/ 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== jQuery UI ===&lt;br /&gt;
jQuery UI has been removed from Joomla 4. Whilst it hasn&#039;t been officially announced as dead, there hasn&#039;t been a release of jQuery UI since 2016.&lt;br /&gt;
&lt;br /&gt;
=== Bootstrap ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:89--&amp;gt;&lt;br /&gt;
Joomla! 4.0 ships with Bootstrap 4. 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)&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== FOF ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:157--&amp;gt; FOF 2.x has been removed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Templates == &amp;lt;!--T:90--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:91--&amp;gt;&lt;br /&gt;
All the Joomla! 3 templates - ISIS and Hathor in the backend, and protostar and Beeze in the frontend are no longer supported. The new 4.0 backend template is called Atum and the frontend template is called Cassiopeia.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:158--&amp;gt; As a consequence, all extensions must migrate to the new Bootstrap 4 style, away from the current Bootstrap 2.3.2 implementation. For more information about Bootstrap 4: [http://getbootstrap.com/docs/4.0/getting-started/introduction/]. For more information about Bootstrap 2.3.2: [http://getbootstrap.com/2.3.2/]&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Frontend components and module views now use BEM class markup to make it easier for templates to support frameworks other than bootstrap. See [http://getbem.com/ the BEM website] for more information on how to build similar classes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other == &amp;lt;!--T:95--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* The $_PROFILER global variable has been removed. Use \Joomla\CMS\Profiler\Profiler::getInstance instead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Media in Libraries === &amp;lt;!--T:159--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:160--&amp;gt; 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 as per best practices. Direct access is blocked with a .htaccess and web.config file in the root of the libraries directory.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Bin === &amp;lt;!--T:96--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:97--&amp;gt;&lt;br /&gt;
Removing the keychain with 4.0 has resulted in the removal of the entire Bin directory as it only contained keychain.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Components === &amp;lt;!--T:200--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:201--&amp;gt; All components have been namespaced and directories reworked accordingly. For more information about this read the tutorial on building a component in Joomla 4&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:202--&amp;gt; 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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:203--&amp;gt; com_actionlogs php 5.5 backfill code has been removed and accordingly &amp;lt;source inline lang=&amp;quot;php&amp;quot;&amp;gt;ActionlogsHelper::getCsvData()&amp;lt;/source&amp;gt; is now type hinted to return a &amp;lt;source inline lang=&amp;quot;php&amp;quot;&amp;gt;Generator&amp;lt;/source&amp;gt; object&amp;lt;/translate&amp;gt;&lt;br /&gt;
* com_actionlogs CSV export headers have been changed to match the strings shown in the UI.&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:204--&amp;gt; Core components have had URL Routing &#039;Legacy&#039; 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 &#039;Modern&#039; mode in Joomla 3 by following the instructions [[S:MyLanguage/J3.x:New_Routing_System|here]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* The MailTo component has been removed without replacement. If you used this functionality you will need to find an alternative component on JED&lt;br /&gt;
* In com_contact &#039;s frontend contact view - the contact property has been removed as it was a duplicate of the item property. We chose to keep $this-&amp;gt;item as it was consistent with that in the article and tag views. Template overrides will need updating to reflect this.&lt;br /&gt;
* 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.&lt;br /&gt;
* the xreference fields have been removed from &#039;&#039;#__contact_details&#039;&#039;, &#039;&#039;#__content&#039;&#039; and &#039;&#039;#__newsfeeds&#039;&#039; as they were unused&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Plugins === &amp;lt;!--T:161--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:162--&amp;gt; The gmail authentication plugin has been removed. For more information please read [https://developer.joomla.org/news/724-removal-of-the-gmail-authentication-plugin-as-of-joomla-4-0.html this blog post]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:163--&amp;gt; Recaptcha v1 support has been fully removed from the captcha plugin - this has no longer worked since Q2 2018 due to google dropping support for it.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:164--&amp;gt; The Recaptcha plugin now uses google&#039;s official php library for captcha under the hood&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:168--&amp;gt; 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]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* For plugins using the 3.x compatibility layer any type hints for events that require a class - the class *must* be autoloaded before the plugin is instantiated&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:190--&amp;gt; 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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* Returning before calling &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;parent::__construct()&amp;lt;/source&amp;gt; in the constructor of a plugin is no longer supported to avoid queuing the plugin into the event dispatcher&lt;br /&gt;
* *onUserBeforeDataValidation* is deprecated as an event in favor of *onContentBeforeValidateData* (as the event was usable by all content types and was not specific to users. Note both events will be called for the duration of Joomla 4 - however you should migrate your code to the new event when you no longer need to support Joomla 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Administrator Helpers === &amp;lt;!--T:169--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:170--&amp;gt; JAdministratorHelper has been removed without replacement (it&#039;s been merged into JApplicationAdministrator)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:171--&amp;gt; JSubMenuHelper has been removed without replacement (use JHtmlSidebar instead - available since 3.0)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:172--&amp;gt; JToolbarHelper has been moved to the main libraries directory&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Modules === &amp;lt;!--T:173--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:174--&amp;gt; The administrator module &amp;quot;submenu&amp;quot; has been removed&amp;lt;/translate&amp;gt;&lt;br /&gt;
* Logic of &amp;quot;Module Chromes&amp;quot; (module styles) in template files &amp;lt;code&amp;gt;html/modules.php&amp;lt;/code&amp;gt; have been moved to &amp;lt;code&amp;gt;JLayout&amp;lt;/code&amp;gt; files. &amp;lt;code&amp;gt;modChrome_x&amp;lt;/code&amp;gt; functions in &amp;lt;code&amp;gt;modules.php&amp;lt;/code&amp;gt; are no longer supported. See https://github.com/joomla/joomla-cms/pull/23570 for details.&lt;br /&gt;
* &amp;quot;Module Chromes&amp;quot; (module styles) &amp;lt;code&amp;gt;modChrome_horz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modChrome_xhtml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modChrome_rounded&amp;lt;/code&amp;gt; have been removed from template &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; without replacement.&lt;br /&gt;
* Module Class Suffixes have been renamed and standardized. These 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)&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Error Handling === &amp;lt;!--T:165--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:166--&amp;gt; Joomla will now handle PHP&#039;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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:175--&amp;gt; Joomla\CMS\Exception\ExceptionHandler now only operates on Exceptions thrown in JApplication::execute. We now use Symfony&#039;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 &amp;quot;Error displaying the error page&amp;quot; error for users when things go very wrong.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:176--&amp;gt; Joomla\CMS\Exception\ExceptionHandler is now format aware and will render errors in html, json, xml, feed or cli aware formats&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:177--&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base Tag ===&lt;br /&gt;
Previous Joomla versions set a &#039;&#039;&amp;lt;base&amp;gt;&#039;&#039; header tag of the current URL in the frontend. This has been removed as it served no clear purpose.&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
* caption.js has been removed from Joomla. Use the native HTML elements &#039;&#039;figure&#039;&#039; and &#039;&#039;figcaption&#039;&#039; (you can look the JLayout in layouts/joomla/content/intro_image.php for an example).&lt;br /&gt;
&lt;br /&gt;
=== Namespacing ===&lt;br /&gt;
Class usage like &#039;&#039;$msg = JText::_( &#039;Hello man!&#039; );&#039;&#039; can now use namespacing.&amp;lt;br /&amp;gt;&lt;br /&gt;
Which would turn into &#039;&#039;$msg = Text::_( &#039;Hello man!&#039; );&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
To use namespacing you need to add the proper namespace declaration.&amp;lt;br /&amp;gt;&lt;br /&gt;
This should be added after the &#039;&#039;defined(&#039;_JEXEC&#039;) or die;&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To find out the proper namespace you can either follow the instructions &amp;lt;br /&amp;gt;&lt;br /&gt;
here: https://groups.google.com/forum/#!topic/joomla-dev-general/1ua9zIqlcVc &amp;lt;br /&amp;gt;&lt;br /&gt;
or use the generated file pdf reference file.&lt;br /&gt;
[[File:J! namespace reference.pdf|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Compatibility{{#translation:}}]]&lt;br /&gt;
[[Category:Development{{#translation:}}]]&lt;br /&gt;
[[Category:Platform{{#translation:}}]]&lt;br /&gt;
[[Category:Migration{{#translation:}}]]&lt;br /&gt;
[[Category:Update Working Group{{#translation:}}]]&lt;br /&gt;
[[Category:Joomla! 4.x{{#translation:}}]]&lt;br /&gt;
[[Category:Joomla! 4.0{{#translation:}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sharky</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Potential_backward_compatibility_issues_in_Joomla_4&amp;diff=707970</id>
		<title>Potential backward compatibility issues in Joomla 4</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Potential_backward_compatibility_issues_in_Joomla_4&amp;diff=707970"/>
		<updated>2020-08-04T05:40:09Z</updated>

		<summary type="html">&lt;p&gt;Sharky: Update Image documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;languages /&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{{incomplete}}{{RightTOC}}&amp;lt;translate&amp;gt;&amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
This document tracks potential backward compatibility issues for Joomla! 4. Listed are issues which potentially break extensions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
The base of this comparison is Joomla! 3.10.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Updated System Requirements == &amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
The system requirements have been updated as follows:&lt;br /&gt;
*PHP 7.2.5&lt;br /&gt;
*MySQL 5.6&lt;br /&gt;
*PostgreSQL 11.0&lt;br /&gt;
*SQL Server support has been dropped.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== PHP MySQL Extension === &amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
*Joomla no longer supports using PHP&#039;s ext/mysql driver (which was removed in PHP 7.0). Joomla will automatically try and use the mysqli extension (available since PHP 5.3) or the mysql PDO Driver (available since PHP 5.3) else it will fail to create a database connection.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:196--&amp;gt; * Strict mode has been enabled. The following flags are now active by default in Joomla 4 and you may have to update your database queries accordingly. This will help us with future MySQL version upgrades and also aligns more closely with Postgres to enable easier compatibility with queries in both languages.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&#039;STRICT_TRANS_TABLES&#039;,&lt;br /&gt;
&#039;ERROR_FOR_DIVISION_BY_ZERO&#039;,&lt;br /&gt;
&#039;NO_AUTO_CREATE_USER&#039;,&lt;br /&gt;
&#039;NO_ENGINE_SUBSTITUTION&#039;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As a consequence, Joomla 4 will only use &#039;&#039;&#039;NULL date defaults&#039;&#039;&#039;. The use of the &amp;quot;invalid default date&amp;quot; 0000-00-00 00:00:00 in Joomla 4 has been deprecated.   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHP Postgres Extension === &amp;lt;!--T:105--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:106--&amp;gt; Joomla no longer supports using PHP&#039;s ext/pgsql driver. Joomla will automatically try and use the PostgreSQL PDO Driver (available since PHP 5.3 and Joomla 3.9) else it will fail to create a database connection with a Postgres Database.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== PHP GMP Extension === &amp;lt;!--T:211--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:212--&amp;gt; This is required for using the WebAuthn feature. Note it is installed by default on the majority of hosting sites.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== PHP mcrypt Extension === &amp;lt;!--T:213--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:214--&amp;gt; This is required for using the Joomla\CMS\Crypt\Cipher\CrytoCipher class and it&#039;s alias JCryptCipherCrypto.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CMS Libraries == &amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
The following changes have been made to Joomla! CMS libraries (this is primarily code that was found in the “libraries/cms” directory in Joomla! 3.7 and earlier).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Installer === &amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:107--&amp;gt; Plugin discover installs will no longer search for xml files in the Joomla! 1.5 plugin folder layouts&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:108--&amp;gt; In 3.x, only plugins scripts have the preflight method called and none make postflight available during the uninstall process. All extensions types will have these hooks available in 4.0 when being uninstalled. If you currently preflight and postflight and assume they only apply in an install/update context - this logic is now incorrect and you should use the install route (given as one of the method parameters)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:109--&amp;gt; When uninstalling a plugin the uninstall function in the extension script is now triggered before triggering any SQL queries (this is now consistent with all other extension types).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes ==== &amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
The following classes have been removed in Joomla! 4.0:&lt;br /&gt;
*JInstallerComponent (use JInstallerAdapterComponent instead)&lt;br /&gt;
*JInstallerFile (use JInstallerAdapterFile instead)&lt;br /&gt;
*JInstallerLanguage (use JInstallerAdapterLanguage instead)&lt;br /&gt;
*JInstallerLibrary (use JInstallerAdapterLibrary instead)&lt;br /&gt;
*JInstallerModule (use JInstallerAdapterModule instead)&lt;br /&gt;
*JInstallerPackage (use JInstallerAdapterPackage instead)&lt;br /&gt;
*JInstallerPlugin (use JInstallerAdapterPlugin instead)&lt;br /&gt;
*JInstallerTemplate (use JInstallerAdapterTemplate instead)&lt;br /&gt;
*JSubMenuHelper (use JHtmlSidebar instead; note that in contrast to JSubMenuHelper, this requires an addition of a placeholder in your view template)&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== JInstallerAdapter Inheritance ==== &amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
JInstallerAdapter no longer extends from JAdapterInstance and inherently JObject.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:110--&amp;gt; Custom Installer Adapters must now be autoloaded.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Menu === &amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== JMenu is now an abstract class ==== &amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
JMenu is now an abstract class. Subclasses of JMenu must now also implement a load method.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Manual Include Behavior Removed ==== &amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
The logic in JMenu::getInstance() to manually include a file from the application&#039;s includes/menu.php path has been removed. The JMenu subclass should be autoloaded instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JMenuItem ====&lt;br /&gt;
* You can no longer retrieve the params property from JMenuItem directly. Use the getParams() method instead (available since Joomla 3.7)&lt;br /&gt;
* JMenuItem::set and JMenuItem::get have been removed. Properties must be explicitly named&lt;br /&gt;
* There is now a AdministratorMenuItem class which extends from MenuItem that contains extra public properties used for the Administrator menu item.&lt;br /&gt;
&lt;br /&gt;
=== Pagination ===&lt;br /&gt;
* The magic pagination functions &#039;&#039;pagination_item_active&#039;&#039;, &#039;&#039;pagination_item_inactive&#039;&#039; have been removed. Use the JLayout&#039;s joomla.pagination.link instead&lt;br /&gt;
* The magic pagination function &#039;&#039;pagination_list_render&#039;&#039; is deprecated. Use the JLayout joomla.pagination.list instead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pathway === &amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Manual Include Behavior Removed ==== &amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
The logic in JPathway::getInstance() to manually include a file from the application&#039;s includes/pathway.php path has been removed. The JPathway subclass should be autoloaded instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Router === &amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Manual Include Behavior Removed ==== &amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
The logic in JRouter::getInstance() to manually include a file from the application&#039;s includes/router.php path has been removed. The JRouter subclass should be autoloaded instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Method Signature Changes ==== &amp;lt;!--T:111--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:112--&amp;gt; The attachBuildRule and attachParseRule are now typehinted to require callables.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== JVersion === &amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
Support for accessing the JVersion class constants as class properties is no longer supported. The constants were introduced in Joomla! 3.5 to prevent the old class properties from being edited.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:113--&amp;gt; The following deprecated constants have been removed:&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JVersion::RELEASE&lt;br /&gt;
* JVersion::DEV_LEVEL&lt;br /&gt;
* JVersion::BUILD&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== JHtml === &amp;lt;!--T:114--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:115--&amp;gt; The register function in JHtml is now typehinted to require a callable. Subclasses of JHtml will now need to match this signature (note this was already required at the function code level already).&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:116--&amp;gt; JHtml::_ no longer allows you to call non-public methods in JHtml&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:117--&amp;gt; JHtml::_ is now a final method (you can no longer override it if you subclass JHtml) and it&#039;s signature has changed to take advantage of modern PHP features (scalar and variadic typehints)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:191--&amp;gt; JHtmlBootstrap::modal has been removed. Use JHtmlBootstrap::renderModal&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JHtmlSortablelist::sortable has been deprecated in favour of JHtmlDragablelist::dragable - the old method acts as a proxy to the new method currently to facilitate the removal of jQuery UI from Joomla Core. All media assets relating to the original jQuery UI implementation have been removed.&lt;br /&gt;
* JHtmlBatch has been removed as all the code had been moved to layouts for template overrides. Use the JLayouts directly in your code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Updater === &amp;lt;!--T:209--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:210--&amp;gt;&lt;br /&gt;
* We removed the deprecated integer client handling from the updater extension adapter class. Please use &#039;&#039;&#039;site&#039;&#039;&#039; and &#039;&#039;&#039;administrator&#039;&#039;&#039; and not any more the integer values &#039;&#039;&#039;0&#039;&#039;&#039; / &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Platform == &amp;lt;!--T:28--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:29--&amp;gt;&lt;br /&gt;
The following changes have been made to Joomla! Platform libraries (this is primarily code found in the `libraries/joomla` or `libraries/legacy` directories in Joomla! 3).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access ===&lt;br /&gt;
* JAccess::$assetPermissionsById and JAccess::$assetPermissionsByName and JAccess::preloadPermissionsParentIdMapping have been removed without replacement. Since 3.6 we&#039;ve used other methods and class properties to optimize the loading of assets (see [https://github.com/joomla/joomla-cms/pull/12850 this PR] for the reasons why this was deprecated)&lt;br /&gt;
* JAccess::getActions has been removed. Use JAccess::getActionsFromFile or JAccess::getActionsFromData instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Application === &amp;lt;!--T:30--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes ==== &amp;lt;!--T:31--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
The following classes have been removed in Joomla! 4.0:&lt;br /&gt;
*JApplicationWebRouter (use the `joomla/router` package instead)&lt;br /&gt;
*JApplicationWebRouterBase (use the `joomla/router` package instead)&lt;br /&gt;
*JApplicationWebRouterRest (use the `joomla/router` package instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All references to JSite and JAdministrator have been removed (these were just class alias&#039; since Joomla 3.2)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Deprecated Classes ==== &amp;lt;!--T:33--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
The following classes have been deprecated and scheduled for removal in Joomla! 5.0:&lt;br /&gt;
*JApplicationBase (use Joomla\Application\AbstractApplication instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== CLI/Web Class Changes ==== &amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:36--&amp;gt;&lt;br /&gt;
The JApplicationCli and JApplicationWeb classes have been recomposed to extend from the Framework&#039;s Application package instead. This breaks type checks for a JApplicationBase object. For forward compatibility, it is recommended to check if application classes are an instance of Joomla\Application\AbstractApplication (JApplicationBase has extended this class since Joomla! 3.4).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
Additionally, both of these classes are now abstract. Developers implementing these classes must provide a `doExecute` method with their application&#039;s logic.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:118--&amp;gt; The registerEvent method is now typehinted to require a callable for the $handler parameter.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:178--&amp;gt; Applications that want to support both Web and CLI Applications should now typehint against the \Joomla\CMS\Application\ CMSApplicationInterface - this contains common methods (some of which in Joomla 3.x were only found in the JApplicationCms class) that can be used by all code. It&#039;s strongly recommended any custom applications (especially CLI applications) implement this interface to make compatibility checks easier, simultaneously any typehints should use the interface rather than a concrete class.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JApplicationCli =====&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:38--&amp;gt;&lt;br /&gt;
Old:&amp;lt;/translate&amp;gt; JApplicationCli {{rarr}} JApplicationBase {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
New:&amp;lt;/translate&amp;gt; JApplicationCli {{rarr}} Joomla\Application\AbstractCliApplication {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
&lt;br /&gt;
===== JApplicationWeb =====&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
Old:&amp;lt;/translate&amp;gt; JApplicationWeb {{rarr}} JApplicationBase {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
New:&amp;lt;/translate&amp;gt; JApplicationWeb {{rarr}} Joomla\Application\AbstractWebApplication {{rarr}} Joomla\Application\AbstractApplication&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:179--&amp;gt;&lt;br /&gt;
* The legacy ways of calling JApplicationWeb::redirect have been removed&lt;br /&gt;
** With a message and messageType parameters (call enqueueMessage separately)&lt;br /&gt;
** Passing in a true/false value as the 2nd/3rd params instead of a redirect code will give an InvalidArgumentException instead of defaulting to a 303&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:180--&amp;gt; * JApplicationWeb::$singleValueResponseHeaders has been removed because the Framework Application will be internally using PSR-7 Response objects as of its 2.0 release. This changes how the headers data is stored so it is always a multi-dimensional array with each top level key being the header names and the value being an array holding all of the values for that header.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== CMSApplication =====&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:119--&amp;gt; The $_clientId, $_messageQueue and $_name class properties have all been renamed to remove their underscore prefix.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:181--&amp;gt; Now implements CMSApplicationInterface&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:182--&amp;gt; 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&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:183--&amp;gt; CMSApplication::getInstance will now additionally try and load the user object (using the loadIdentity function)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:206--&amp;gt; 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 {{JVer | 3.7}}). For more information please see [[S:MyLanguage/J3.x:Discover_on_which_client_your_extension_code_is_running|Discover on which client your extension code is running]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JApplicationSite =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:120--&amp;gt;&lt;br /&gt;
The $_language_filter and $_detect_browser class properties have all been renamed to remove their underscore prefix.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:121--&amp;gt; The deprecated method JApplicationSite::getPageParameters has been removed in favour of it&#039;s alias JApplicationSite::getParams&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JApplicationHelper =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:122--&amp;gt; JApplicationHelper::parseXMLLangMetaFile has been removed without replacement.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Archive === &amp;lt;!--T:123--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:124--&amp;gt; The archive package has been removed in favour of the frameworks archive package. Note the API should remain unchanged.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:184--&amp;gt; Errors handing now uses Exceptions rather than JError&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Client ===&lt;br /&gt;
\Joomla\CMS\Client\ClientWrapper has been removed. Use the static methods in \Joomla\CMS\Client\ClientHelper&lt;br /&gt;
&lt;br /&gt;
=== Crypt ===&lt;br /&gt;
* JCrypt::hasStrongPasswordSupport has been removed without replacement as all PHP versions Joomla 4 matches will support strong password hashing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes ==== &amp;lt;!--T:98--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:99--&amp;gt;&lt;br /&gt;
The following ciphers have been removed in Joomla! 4.0:&amp;lt;/translate&amp;gt;&lt;br /&gt;
*JCryptCipher3Des&lt;br /&gt;
*JCryptCipherBlowfish&lt;br /&gt;
*JCryptCipherMcrypt&lt;br /&gt;
*JCryptCipherRijndael256&lt;br /&gt;
*JCryptCipherSimple&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:100--&amp;gt;&lt;br /&gt;
These have been removed without replacement. Use JCryptCipherCrypto&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Methods ==== &amp;lt;!--T:167--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:185--&amp;gt; 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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Cache === &amp;lt;!--T:186--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:126--&amp;gt; JCacheController::get now requires a callable. As a result JCacheControllerCallback::call has been removed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:127--&amp;gt; JCacheStorage::test has been removed. Use JCacheStorage::isSupported instead&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:128--&amp;gt; The default storage engines are no longer manually loaded as they are now autoloaded&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:129--&amp;gt; JCacheControllerOutput::start and JCacheControllerOutput::end have been removed without replacement&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:130--&amp;gt; Removed CacheLite storage as it not compatible with PHP7 (which is our minimum version)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:187--&amp;gt; Error handling now uses Exceptions instead of JError&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Component === &amp;lt;!--T:131--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:132--&amp;gt; \Joomla\CMS\Component\ComponentRecord no longer extends JObject&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Document === &amp;lt;!--T:101--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Inheritance Change ==== &amp;lt;!--T:43--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:44--&amp;gt;&lt;br /&gt;
The following classes have had their inheritance changed:&lt;br /&gt;
*JDocumentError (now extends from \Joomla\Cms\Document\HtmlDocument instead of \Joomla\Cms\Document\Document)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:133--&amp;gt; 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&#039;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&#039;s loaded data.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Renderers ==== &amp;lt;!--T:134--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:135--&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:136--&amp;gt; There is now a RendererInterface that all Renderers should implement&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:137--&amp;gt; JDocumentRenderer is now an abstract class and implements RendererInterface&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:188--&amp;gt; As an alternative to &amp;lt;jdoc:include type=&amp;quot;head&amp;quot; /&amp;gt; you can now individually load &amp;lt;jdoc:include type=&amp;quot;metas&amp;quot; /&amp;gt; for metadata, &amp;lt;jdoc:include type=&amp;quot;styles&amp;quot; /&amp;gt; for CSS and &amp;lt;jdoc:include type=&amp;quot;scripts&amp;quot; /&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JDocumentFeed ====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:45--&amp;gt;&lt;br /&gt;
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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Database === &amp;lt;!--T:138--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:139--&amp;gt; This package has been replaced by the Joomla Framework Database Package&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:197--&amp;gt; Debug mode has been reworked (see the framework docs for more information&amp;lt;/translate&amp;gt; [https://github.com/joomla-framework/database])&lt;br /&gt;
&lt;br /&gt;
=== Factory ===&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:140--&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:141--&amp;gt; Factory::getXml has been removed along with JXMLElement. Use SimpleXMLElement directly instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:142--&amp;gt; Factory:: getEditor has been removed use JEditor::getInstance instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Environment === &amp;lt;!--T:198--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;noinclude&amp;gt;JBrowser::isSSLConnection has been removed. Use JApplicationCms::isSSLConnection (available since Joomla 3.2)&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Filesystem === &amp;lt;!--T:207--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:208--&amp;gt; The filesystem wrapper classes have been removed. Continue using the original static methods.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Filter ===&lt;br /&gt;
* JFilterInput::_remove has been removed in favour of JFilterInput::remove&lt;br /&gt;
* JFilterInput::_cleanTags has been removed in favour of JFilterInput::cleanTags&lt;br /&gt;
* JFilterInput::_cleanAttributes has been removed in favour of JFilterInput::cleanAttributes&lt;br /&gt;
* JFilterInput::_decode has been removed in favour of JFilterInput::decode&lt;br /&gt;
* JFilterInput::_escapeAttributeValues has been removed in favour of JFilterInput::escapeAttributeValues&lt;br /&gt;
* JFilterInput::_stripCSSExpressions has been removed in favour of JFilterInput::stripCSSExpressions&lt;br /&gt;
&lt;br /&gt;
All of the above deprecations and removals are to allow the class to be reunified with the framework parent class.&lt;br /&gt;
&lt;br /&gt;
=== Form ===&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:143--&amp;gt; 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&amp;lt;/translate&amp;gt;&lt;br /&gt;
*&amp;lt;translate&amp;gt;&amp;lt;!--T:192--&amp;gt; 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 [https://github.com/joomla/joomla-cms/pull/16419 this Github PR]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:193--&amp;gt; JForm::getControlGroup has been removed use the alias JForm::renderField (available since Joomla 3.2.3)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:194--&amp;gt; JForm::getControlGroups has been removed use the alias JForm::renderFieldset (available since Joomla 3.2.3)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* 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.&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:199--&amp;gt; JFormFieldUsergroup has been removed. Use Joomla\CMS\Form\Field\UsergrouplistField instead (available since Joomla 3.2)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fields ====&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:205--&amp;gt;&lt;br /&gt;
JFormFieldFilelist and JFormFieldFolderList have had their filter properties renamed to &amp;lt;code&amp;gt;fileFilter&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;folderFilter&amp;lt;/code&amp;gt; respectively (in order to allow the use of the regular Joomla filter attribute on returned values)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JFormPredefinedlistField has its filter properties renamed to &amp;lt;code&amp;gt;optionsFilter&amp;lt;/code&amp;gt; (in order to allow the use of the regular Joomla filter attribute on returned values)&lt;br /&gt;
* JFormFieldEditor::save has been removed without replacement&lt;br /&gt;
* JFormFieldText::getSuggestions has been removed in favour of JFormFieldText::getOptions&lt;br /&gt;
&lt;br /&gt;
=== Wrapper ===&lt;br /&gt;
* The form wrapper classes have been removed. Continue using the original static methods.&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Deprecated Classes and Interfaces ==== &amp;lt;!--T:47--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:48--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been deprecated and scheduled for removal in Joomla! 5.0:&lt;br /&gt;
*JHttpResponse (use Joomla\Http\Response instead)&lt;br /&gt;
*JHttpTransport (implement Joomla\Http\TransportInterface instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Class Changes ==== &amp;lt;!--T:49--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:50--&amp;gt;&lt;br /&gt;
The Framework&#039;s HTTP package is now included in Joomla! 4.0 and JHttp and the JHttpTransport subclasses have been refactored to use the upstream package.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JHttp =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:51--&amp;gt;&lt;br /&gt;
The JHttp class constructor has been loosened with the following changes:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:52--&amp;gt;&lt;br /&gt;
*The options parameter is no longer typehinted as a Joomla\Registry\Registry object, an array or any object implementing the [https://secure.php.net/manual/en/class.arrayaccess.php ArrayAccess] interface can be used instead&lt;br /&gt;
*The transport parameter now allows any Joomla\Http\TransportInterface object.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JHttpTransport =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:53--&amp;gt;&lt;br /&gt;
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&#039;s `request()` method has had a signature change.  Specifically, the second parameter which previously typehinted the JUri class now typehints Joomla\Uri\UriInterface.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== JHttpResponse =====&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:54--&amp;gt;&lt;br /&gt;
In refactoring the response object to inherit from the Framework&#039;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).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Image === &amp;lt;!--T:55--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Deprecated Classes and Interfaces ==== &amp;lt;!--T:56--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:57--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been deprecated and scheduled for removal in Joomla! 5.0:&lt;br /&gt;
* JImageFilter (use Joomla\CMS\Image\ImageFilter instead)&lt;br /&gt;
* JImageFilterBackgroundfill (use Joomla\CMS\Image\Filter\Backgroundfill instead)&lt;br /&gt;
* JImageFilterBrightness (use Joomla\CMS\Image\Filter\Brightness instead)&lt;br /&gt;
* JImageFilterContrast (use Joomla\CMS\Image\Filter\Contrast instead)&lt;br /&gt;
* JImageFilterEdgedetect (use Joomla\CMS\Image\Filter\Edgedetect instead)&lt;br /&gt;
* JImageFilterEmboss (use Joomla\CMS\Image\Filter\Emboss instead)&lt;br /&gt;
* JImageFilterGrayscale (use Joomla\CMS\Image\Filter\Grayscale instead)&lt;br /&gt;
* JImageFilterNegate (use Joomla\CMS\Image\Filter\Negate instead)&lt;br /&gt;
* JImageFilterSketchy (use Joomla\CMS\Image\Filter\Sketchy instead) &lt;br /&gt;
* JImageFilterSmooth (use Joomla\CMS\Image\Filter\Smooth instead)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Class Changes ==== &amp;lt;!--T:58--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:59--&amp;gt;&lt;br /&gt;
The classes from Framework&#039;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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Menu === &amp;lt;!--T:144--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:145--&amp;gt; JMenu::$_items, JMenu::$_default and JMenu::$_active have been had their underscore prefix&#039;s removed (note these properties were protected so this only affects custom subclasses of JMenu)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== New MVC Layer ===&lt;br /&gt;
* 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 &amp;quot;Legacy MVC&amp;quot; section). There is a plugin located [https://github.com/joomla-extensions/legacy-mvc 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).&lt;br /&gt;
&lt;br /&gt;
=== Keychain ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:146--&amp;gt; Removing the keychain with 4.0 has resulted in the removal of the following class:&amp;lt;/translate&amp;gt;&lt;br /&gt;
*JKeychain&lt;br /&gt;
&lt;br /&gt;
=== Pathway ===&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:147--&amp;gt; JPathway::$_pathway and JPathway::$_count have been had their underscore prefix&#039;s removed (note these properties were protected so this only affects custom subclasses of JPathway)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:148--&amp;gt; JPathway::_makeItem has been removed in favour of JPathway::makeItem (note this method was protected so this only affects custom subclasses of JPathway)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Profiler ===&lt;br /&gt;
* JProfiler::getmicrotime and JProfiler::getMemory have been removed in favour of the native PHP methods they wrapped (&amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;microtime(1)&amp;lt;/source&amp;gt; and &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;memory_get_usage()&amp;lt;/source&amp;gt; respectively&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Table === &amp;lt;!--T:149--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:150--&amp;gt;&lt;br /&gt;
* JTable::__construct database object is now typehinted to be a JDatabaseDriver.&lt;br /&gt;
** Subclasses of JTable will need to ensure they are passing a JDatabaseDriver object to the parent constructor&lt;br /&gt;
** 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&lt;br /&gt;
* 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&lt;br /&gt;
* 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Mail === &amp;lt;!--T:62--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:63--&amp;gt;&lt;br /&gt;
The following methods have been removed in Joomla! 4.0:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:64--&amp;gt;&lt;br /&gt;
* JMail::sendAdminMail has been removed&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Exceptions ====&lt;br /&gt;
JMail no longer catches exceptions from PHPMailer. It is now the object calling JMail&#039;s responsibility to handle these exceptions as appropriate. In addition if mail sending is disabled in global configuration calling &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;\ Joomla\CMS\Mail\Mail::send()&amp;lt;/source&amp;gt; will throw a &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;\Joomla\CMS\Mail\Exception\MailDisabledException&amp;lt;/source&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Language === &amp;lt;!--T:151--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:152--&amp;gt;&lt;br /&gt;
* The functions setTransliterator, setPluralSuffixesCallback, setIgnoredSearchWordsCallback, setLowerLimitSearchWordCallback, setUpperLimitSearchWordCallback and setSearchDisplayedCharactersNumberCallback are now typehinted to require a callable.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;&amp;quot;_QQ_&amp;quot;&amp;lt;/tt&amp;gt; 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. &amp;lt;tt&amp;gt;\&amp;quot;&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* 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 =&amp;gt; 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.&lt;br /&gt;
* \Joomla\CMS\Language\Multilanguage::getSiteLangs has been removed. Use \Joomla\CMS\Language\LanguageHelper::getInstalledLanguages(0) instead&lt;br /&gt;
* JLanguage::exists has been removed. Use Joomla\CMS\Language\LanguageHelper::exists instead.&lt;br /&gt;
* The wrapper classes JTextWrapper, LanguageHelperWrapper and TransliterateWrapper have been removed. Continue to use the static methods they wrapped&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Legacy MVC Layer === &amp;lt;!--T:65--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Legacy Controller ==== &amp;lt;!--T:66--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:67--&amp;gt;&lt;br /&gt;
* JControllerLegacy has been removed from the legacy layer, and we no longer intend to remove it or it&#039;s subclasses in the near future.&lt;br /&gt;
* JControllerLegacy no longer extends JObject. Controllers should not call any of the methods contained in the JObject class.&lt;br /&gt;
* JControllerLegacy implements an interface for multiple task controllers&lt;br /&gt;
* 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.&lt;br /&gt;
** Parameter 2: An optional MVCFactoryInterface instance&lt;br /&gt;
** Parameter 3: An optional CMSApplicationInterface instance&lt;br /&gt;
** Parameter 4: An optional Input instance&lt;br /&gt;
** Parameter 5: An optional FormFactoryInterface instance&lt;br /&gt;
* JControllerForm now using the StringInflector package to determine the list view. This should improve it&#039;s ability to guess 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Legacy View ==== &amp;lt;!--T:153--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:154--&amp;gt;&lt;br /&gt;
* JViewLegacy has been removed from the legacy layer, and we no longer intend to remove it or it&#039;s subclasses in the near future.&lt;br /&gt;
* 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.&lt;br /&gt;
* 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Library ===&lt;br /&gt;
* JLibraryHelper::_load has been removed. Use \Joomla\CMS\Helper\LibraryHelper::loadLibrary instead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Session === &amp;lt;!--T:68--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:69--&amp;gt;&lt;br /&gt;
The session package has undergone a major refactoring to use the Framework&#039;s Session package.  This change primarily effects the internals of the package; changes to the primary public API through the JSession class are minimal.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:195--&amp;gt; The old JString class alias has been removed. Use \Joomla\String\StringHelper instead&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Removed Classes and Interfaces ==== &amp;lt;!--T:70--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:71--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been removed in Joomla! 5.0:&amp;lt;/translate&amp;gt;&lt;br /&gt;
*JSessionExceptionUnsupported&lt;br /&gt;
*JSessionHandlerInterface&lt;br /&gt;
*JSessionHandlerJoomla&lt;br /&gt;
*JSessionHandlerNative&lt;br /&gt;
*JSessionStorage&lt;br /&gt;
*JSessionStorageApc&lt;br /&gt;
*JSessionStorageDatabase&lt;br /&gt;
*JSessionStorageMemcache&lt;br /&gt;
*JSessionStorageMemcached&lt;br /&gt;
*JSessionStorageNone&lt;br /&gt;
*JSessionStorageWincache&lt;br /&gt;
*JSessionStorageXcache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== JSession ==== &amp;lt;!--T:72--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:73--&amp;gt;&lt;br /&gt;
JSession now extends from the Framework&#039;s Joomla\Session\Session class.  Many of the methods have a modified signature and a compatibility layer exists to help with the transition.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== Namespace Parameter Deprecated ===== &amp;lt;!--T:74--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:75--&amp;gt;&lt;br /&gt;
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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== JSession::clear() Repurposed ===== &amp;lt;!--T:76--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:77--&amp;gt;&lt;br /&gt;
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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== JSession::getInstance() Deprecated ===== &amp;lt;!--T:78--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:79--&amp;gt;&lt;br /&gt;
The singleton getInstance() method has been deprecated.  The session object should be retrieved from the active application or the dependency injection container instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== Session Handlers ===== &amp;lt;!--T:80--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:81--&amp;gt;&lt;br /&gt;
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&#039;s [https://secure.php.net/manual/en/class.sessionhandlerinterface.php 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Social Media Libraries === &amp;lt;!--T:155--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:156--&amp;gt; The facebook, github, google, linkedin, openstreetmap, mediawiki and twitter packages have all been removed from the CMS.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
==== Helper ====&lt;br /&gt;
* 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))&lt;br /&gt;
* JUserHelper::getSalt has been removed without replacement (it generated the hash&#039;s JUserHelper::getCryptedPassword which is now removed as above)&lt;br /&gt;
* 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&lt;br /&gt;
* JUserWrapperHelper has been removed. Continue using the original static methods in JUserHelper.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Classes Removed Without Replacement === &amp;lt;!--T:82--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* JNode&lt;br /&gt;
* JTree&lt;br /&gt;
* JGrid&lt;br /&gt;
* JError &amp;lt;translate&amp;gt;&amp;lt;!--T:189--&amp;gt; (use native exceptions when error handling is required)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Utilities ==== &amp;lt;!--T:102--&amp;gt; &lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
===== Removed Classes and Interfaces ===== &amp;lt;!--T:103--&amp;gt; &lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:104--&amp;gt;&lt;br /&gt;
The following classes and interfaces have been removed in Joomla! 4.0:&lt;br /&gt;
*JArrayHelper&lt;br /&gt;
use Joomla\Utilities\ArrayHelper; instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External Libraries == &amp;lt;!--T:83--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:84--&amp;gt;&lt;br /&gt;
The following changes have been made to the external libraries that Joomla! packages and ships.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHPMailer ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:85--&amp;gt;&lt;br /&gt;
Joomla! 4.0 ships with PHPMailer 6.0.  Please review [https://github.com/PHPMailer/PHPMailer/blob/6.0/UPGRADING.md the upgrading guide] for relevant changes.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHPUTF8 ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:86--&amp;gt;&lt;br /&gt;
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&#039;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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SimplePie ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:87--&amp;gt;&lt;br /&gt;
The SimplePie library is no longer included with Joomla! 4.0.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== jQuery ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:88--&amp;gt;&lt;br /&gt;
Joomla! 4.0 ships with jQuery 3.  Please review [https://jquery.com/upgrade-guide/3.0/ 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== jQuery UI ===&lt;br /&gt;
jQuery UI has been removed from Joomla 4. Whilst it hasn&#039;t been officially announced as dead, there hasn&#039;t been a release of jQuery UI since 2016.&lt;br /&gt;
&lt;br /&gt;
=== Bootstrap ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:89--&amp;gt;&lt;br /&gt;
Joomla! 4.0 ships with Bootstrap 4. 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)&amp;lt;/translate&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== FOF ===&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:157--&amp;gt; FOF 2.x has been removed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Templates == &amp;lt;!--T:90--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:91--&amp;gt;&lt;br /&gt;
All the Joomla! 3 templates - ISIS and Hathor in the backend, and protostar and Beeze in the frontend are no longer supported. The new 4.0 backend template is called Atum and the frontend template is called Cassiopeia.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:158--&amp;gt; As a consequence, all extensions must migrate to the new Bootstrap 4 style, away from the current Bootstrap 2.3.2 implementation. For more information about Bootstrap 4: [http://getbootstrap.com/docs/4.0/getting-started/introduction/]. For more information about Bootstrap 2.3.2: [http://getbootstrap.com/2.3.2/]&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 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.&lt;br /&gt;
* Frontend components and module views now use BEM class markup to make it easier for templates to support frameworks other than bootstrap. See [http://getbem.com/ the BEM website] for more information on how to build similar classes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other == &amp;lt;!--T:95--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* The $_PROFILER global variable has been removed. Use \Joomla\CMS\Profiler\Profiler::getInstance instead&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Media in Libraries === &amp;lt;!--T:159--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:160--&amp;gt; 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 as per best practices. Direct access is blocked with a .htaccess and web.config file in the root of the libraries directory.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Bin === &amp;lt;!--T:96--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:97--&amp;gt;&lt;br /&gt;
Removing the keychain with 4.0 has resulted in the removal of the entire Bin directory as it only contained keychain.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Components === &amp;lt;!--T:200--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:201--&amp;gt; All components have been namespaced and directories reworked accordingly. For more information about this read the tutorial on building a component in Joomla 4&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:202--&amp;gt; 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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:203--&amp;gt; com_actionlogs php 5.5 backfill code has been removed and accordingly &amp;lt;source inline lang=&amp;quot;php&amp;quot;&amp;gt;ActionlogsHelper::getCsvData()&amp;lt;/source&amp;gt; is now type hinted to return a &amp;lt;source inline lang=&amp;quot;php&amp;quot;&amp;gt;Generator&amp;lt;/source&amp;gt; object&amp;lt;/translate&amp;gt;&lt;br /&gt;
* com_actionlogs CSV export headers have been changed to match the strings shown in the UI.&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:204--&amp;gt; Core components have had URL Routing &#039;Legacy&#039; 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 &#039;Modern&#039; mode in Joomla 3 by following the instructions [[S:MyLanguage/J3.x:New_Routing_System|here]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* The MailTo component has been removed without replacement. If you used this functionality you will need to find an alternative component on JED&lt;br /&gt;
* In com_contact &#039;s frontend contact view - the contact property has been removed as it was a duplicate of the item property. We chose to keep $this-&amp;gt;item as it was consistent with that in the article and tag views. Template overrides will need updating to reflect this.&lt;br /&gt;
* 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.&lt;br /&gt;
* the xreference fields have been removed from &#039;&#039;#__contact_details&#039;&#039;, &#039;&#039;#__content&#039;&#039; and &#039;&#039;#__newsfeeds&#039;&#039; as they were unused&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Plugins === &amp;lt;!--T:161--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:162--&amp;gt; The gmail authentication plugin has been removed. For more information please read [https://developer.joomla.org/news/724-removal-of-the-gmail-authentication-plugin-as-of-joomla-4-0.html this blog post]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:163--&amp;gt; Recaptcha v1 support has been fully removed from the captcha plugin - this has no longer worked since Q2 2018 due to google dropping support for it.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:164--&amp;gt; The Recaptcha plugin now uses google&#039;s official php library for captcha under the hood&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:168--&amp;gt; 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]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* For plugins using the 3.x compatibility layer any type hints for events that require a class - the class *must* be autoloaded before the plugin is instantiated&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:190--&amp;gt; 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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* Returning before calling &amp;lt;source lang=&amp;quot;php&amp;quot; inline&amp;gt;parent::__construct()&amp;lt;/source&amp;gt; in the constructor of a plugin is no longer supported to avoid queuing the plugin into the event dispatcher&lt;br /&gt;
* *onUserBeforeDataValidation* is deprecated as an event in favor of *onContentBeforeValidateData* (as the event was usable by all content types and was not specific to users. Note both events will be called for the duration of Joomla 4 - however you should migrate your code to the new event when you no longer need to support Joomla 3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Administrator Helpers === &amp;lt;!--T:169--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:170--&amp;gt; JAdministratorHelper has been removed without replacement (it&#039;s been merged into JApplicationAdministrator)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:171--&amp;gt; JSubMenuHelper has been removed without replacement (use JHtmlSidebar instead - available since 3.0)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:172--&amp;gt; JToolbarHelper has been moved to the main libraries directory&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Modules === &amp;lt;!--T:173--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:174--&amp;gt; The administrator module &amp;quot;submenu&amp;quot; has been removed&amp;lt;/translate&amp;gt;&lt;br /&gt;
* Logic of &amp;quot;Module Chromes&amp;quot; (module styles) in template files &amp;lt;code&amp;gt;html/modules.php&amp;lt;/code&amp;gt; have been moved to &amp;lt;code&amp;gt;JLayout&amp;lt;/code&amp;gt; files. &amp;lt;code&amp;gt;modChrome_x&amp;lt;/code&amp;gt; functions in &amp;lt;code&amp;gt;modules.php&amp;lt;/code&amp;gt; are no longer supported. See https://github.com/joomla/joomla-cms/pull/23570 for details.&lt;br /&gt;
* &amp;quot;Module Chromes&amp;quot; (module styles) &amp;lt;code&amp;gt;modChrome_horz&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modChrome_xhtml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;modChrome_rounded&amp;lt;/code&amp;gt; have been removed from template &amp;lt;code&amp;gt;system&amp;lt;/code&amp;gt; without replacement.&lt;br /&gt;
* Module Class Suffixes have been renamed and standardized. These 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)&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Error Handling === &amp;lt;!--T:165--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:166--&amp;gt; Joomla will now handle PHP&#039;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)&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:175--&amp;gt; Joomla\CMS\Exception\ExceptionHandler now only operates on Exceptions thrown in JApplication::execute. We now use Symfony&#039;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 &amp;quot;Error displaying the error page&amp;quot; error for users when things go very wrong.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:176--&amp;gt; Joomla\CMS\Exception\ExceptionHandler is now format aware and will render errors in html, json, xml, feed or cli aware formats&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:177--&amp;gt; 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.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Base Tag ===&lt;br /&gt;
Previous Joomla versions set a &#039;&#039;&amp;lt;base&amp;gt;&#039;&#039; header tag of the current URL in the frontend. This has been removed as it served no clear purpose.&lt;br /&gt;
&lt;br /&gt;
=== Javascript ===&lt;br /&gt;
* caption.js has been removed from Joomla. Use the native HTML elements &#039;&#039;figure&#039;&#039; and &#039;&#039;figcaption&#039;&#039; (you can look the JLayout in layouts/joomla/content/intro_image.php for an example).&lt;br /&gt;
&lt;br /&gt;
=== Namespacing ===&lt;br /&gt;
Class usage like &#039;&#039;$msg = JText::_( &#039;Hello man!&#039; );&#039;&#039; can now use namespacing.&amp;lt;br /&amp;gt;&lt;br /&gt;
Which would turn into &#039;&#039;$msg = Text::_( &#039;Hello man!&#039; );&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
To use namespacing you need to add the proper namespace declaration.&amp;lt;br /&amp;gt;&lt;br /&gt;
This should be added after the &#039;&#039;defined(&#039;_JEXEC&#039;) or die;&#039;&#039;.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To find out the proper namespace you can either follow the instructions &amp;lt;br /&amp;gt;&lt;br /&gt;
here: https://groups.google.com/forum/#!topic/joomla-dev-general/1ua9zIqlcVc &amp;lt;br /&amp;gt;&lt;br /&gt;
or use the generated file pdf reference file.&lt;br /&gt;
[[File:J! namespace reference.pdf|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Compatibility{{#translation:}}]]&lt;br /&gt;
[[Category:Development{{#translation:}}]]&lt;br /&gt;
[[Category:Platform{{#translation:}}]]&lt;br /&gt;
[[Category:Migration{{#translation:}}]]&lt;br /&gt;
[[Category:Update Working Group{{#translation:}}]]&lt;br /&gt;
[[Category:Joomla! 4.x{{#translation:}}]]&lt;br /&gt;
[[Category:Joomla! 4.0{{#translation:}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sharky</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Plugin/Events/System&amp;diff=643918</id>
		<title>Plugin/Events/System</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Plugin/Events/System&amp;diff=643918"/>
		<updated>2019-11-27T06:38:34Z</updated>

		<summary type="html">&lt;p&gt;Sharky: Remove reference to onBeforeExecute event&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This topic is aimed at &amp;quot;global&amp;quot; system events, including those triggered on every page load (onAfterInitialise, onAfterRoute, onAfterDispatch, onAfterRender). Visit [[Plugin/Events|Plugin Events]] for a complete list over available core events.&lt;br /&gt;
&lt;br /&gt;
== onAfterInitialise ==&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
This event is triggered after the framework has loaded and the application initialise method has been called.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
=== Return Value ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
=== Called in files ===&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;administrator/index.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== onAfterRoute ==&lt;br /&gt;
=== Description ===&lt;br /&gt;
&lt;br /&gt;
This event is triggered after the framework has loaded and initialised and the router has routed the client request.&lt;br /&gt;
&lt;br /&gt;
Routing is the process of examining the request environment to determine which component should receive the request. The component optional parameters are then set in the request object that will be processed when the application is being dispatched.&lt;br /&gt;
&lt;br /&gt;
When this event triggers, the router has parsed the route and pushed the request parameters into JInput to be retrieved by the application.&lt;br /&gt;
&lt;br /&gt;
====Beware====&lt;br /&gt;
&lt;br /&gt;
It&#039;s bad practice to instantiate the &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt; object inside this and earlier running plugin events. Don&#039;t use &amp;lt;code&amp;gt;Factory::getApplication()-&amp;gt;getDocument()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Factory::getDocument();&amp;lt;/code&amp;gt; or HTMLHelper/JHtml methods in &amp;lt;code&amp;gt;function onAfterRoute()&amp;lt;/code&amp;gt; that instantiate the &amp;lt;code&amp;gt;Document&amp;lt;/code&amp;gt; too early (e.g. for loading scripts or stylesheets). See also comments [https://github.com/joomla/joomla-cms/pull/25669#issuecomment-513574075 github.com/joomla/joomla-cms/pull/25669#issuecomment-513574075] and [https://github.com/joomla/joomla-cms/pull/25669#issuecomment-513574282 github.com/joomla/joomla-cms/pull/25669#issuecomment-513574282]&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
=== Return Value ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
=== Used in files ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;administrator/index.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onAfterDispatch==&lt;br /&gt;
=== Description ===&lt;br /&gt;
This event is triggered after the framework has dispatched the application.&lt;br /&gt;
&lt;br /&gt;
Dispatching is the process of pulling the option from the request object and mapping them to a component. If the component does not exist, it handles determining a default component to dispatch.&lt;br /&gt;
&lt;br /&gt;
When this event is triggered the output of the component is available in the document buffer.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
=== Return Value ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
=== Used in files ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;index.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;administrator/index.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onBeforeRender==&lt;br /&gt;
=== Description ===&lt;br /&gt;
This event is triggered immediately before the framework has rendered the application.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
=== Return Value ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
=== Used in files ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;includes/application.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;administrator/includes/application.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onAfterRender==&lt;br /&gt;
=== Description ===&lt;br /&gt;
This event is triggered after the framework has rendered the application.&lt;br /&gt;
&lt;br /&gt;
When this event is triggered the output of the application is available in the response buffer.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
=== Return Value ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
=== Used in files ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;includes/application.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;administrator/includes/application.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onBeforeCompileHead==&lt;br /&gt;
=== Description ===&lt;br /&gt;
This event is triggered before the framework creates the Head section of the Document.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
===Return Value===&lt;br /&gt;
&lt;br /&gt;
None.&lt;br /&gt;
&lt;br /&gt;
===Used in files===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;libraries/joomla/document/html/renderer/head.php&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This is an example system plugin.  Please note that because system plugins are loaded before any other event group, they may also contain any other event.&lt;br /&gt;
&lt;br /&gt;
The following class would be located in the file &amp;lt;tt&amp;gt;/plugins/system/example/example.php&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
defined(&#039;_JEXEC&#039;) or die;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Example system plugin&lt;br /&gt;
 *&lt;br /&gt;
 * @since  1.0&lt;br /&gt;
 */&lt;br /&gt;
class plgSystemExample extends JPlugin&lt;br /&gt;
{&lt;br /&gt;
	/**&lt;br /&gt;
	 * Constructor.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   object  &amp;amp;$subject  The object to observe.&lt;br /&gt;
	 * @param   array   $config	An optional associative array of configuration settings.&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   1.0&lt;br /&gt;
	 */&lt;br /&gt;
	public function __construct(&amp;amp;$subject, $config)&lt;br /&gt;
	{&lt;br /&gt;
		// Calling the parent Constructor&lt;br /&gt;
		parent::__construct($subject, $config);&lt;br /&gt;
&lt;br /&gt;
		// Do some extra initialisation in this constructor if required&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Listener for the `onAfterInitialise` event&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   1.0&lt;br /&gt;
	 */&lt;br /&gt;
	public function onAfterInitialise()&lt;br /&gt;
	{&lt;br /&gt;
		// Do something onAfterInitialise&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Listener for the `onAfterRoute` event&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   1.0&lt;br /&gt;
	 */&lt;br /&gt;
	public function onAfterRoute()&lt;br /&gt;
	{&lt;br /&gt;
		// Do something onAfterRoute&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Listener for the `onAfterDispatch` event&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   1.0&lt;br /&gt;
	 */&lt;br /&gt;
	public function onAfterDispatch()&lt;br /&gt;
	{&lt;br /&gt;
		// Do something onAfterDispatch&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Listener for the `onAfterRender` event&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return  void&lt;br /&gt;
	 *&lt;br /&gt;
	 * @since   1.0&lt;br /&gt;
	 */&lt;br /&gt;
	public function onAfterRender()&lt;br /&gt;
	{&lt;br /&gt;
		// Do something onAfterRender&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The plugin&#039;s XML installation file would be located at &amp;lt;tt&amp;gt;/plugins/system/example/example.xml&amp;lt;/tt&amp;gt; would be defined as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;extension version=&amp;quot;3.7&amp;quot; type=&amp;quot;plugin&amp;quot; group=&amp;quot;system&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;plg_system_example&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;author&amp;gt;Author&amp;lt;/author&amp;gt;&lt;br /&gt;
  &amp;lt;creationDate&amp;gt;Month 2008&amp;lt;/creationDate&amp;gt;&lt;br /&gt;
  &amp;lt;copyright&amp;gt;Copyright (C) 2008 Holder. All rights reserved.&amp;lt;/copyright&amp;gt;&lt;br /&gt;
  &amp;lt;license&amp;gt;GNU General Public License&amp;lt;/license&amp;gt;&lt;br /&gt;
  &amp;lt;authorEmail&amp;gt;email&amp;lt;/authorEmail&amp;gt;&lt;br /&gt;
  &amp;lt;authorUrl&amp;gt;url&amp;lt;/authorUrl&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;1.0.1&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;description&amp;gt;An example system plugin&amp;lt;/description&amp;gt;&lt;br /&gt;
  &amp;lt;files&amp;gt;&lt;br /&gt;
	&amp;lt;filename plugin=&amp;quot;example&amp;quot;&amp;gt;example.php&amp;lt;/filename&amp;gt;&lt;br /&gt;
  &amp;lt;/files&amp;gt;&lt;br /&gt;
  &amp;lt;config&amp;gt;&lt;br /&gt;
	&amp;lt;fields name=&amp;quot;params&amp;quot;&amp;gt;&lt;br /&gt;
	  &amp;lt;fieldset name=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;field&lt;br /&gt;
			name=&amp;quot;example&amp;quot;&lt;br /&gt;
			type=&amp;quot;text&amp;quot;&lt;br /&gt;
			default=&amp;quot;&amp;quot;&lt;br /&gt;
			label=&amp;quot;Example&amp;quot;&lt;br /&gt;
			description=&amp;quot;An example text parameter&amp;quot;&lt;br /&gt;
		/&amp;gt;&lt;br /&gt;
	  &amp;lt;/fieldset&amp;gt;&lt;br /&gt;
	&amp;lt;/fields&amp;gt;&lt;br /&gt;
  &amp;lt;/config&amp;gt;&lt;br /&gt;
&amp;lt;/extension&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More system Plugin examples can be found here: https://github.com/joomla/joomla-cms/tree/staging/plugins/system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Plugin Development]][[Category:Specifications]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sharky</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Plugin/Events&amp;diff=643917</id>
		<title>Plugin/Events</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Plugin/Events&amp;diff=643917"/>
		<updated>2019-11-27T06:37:21Z</updated>

		<summary type="html">&lt;p&gt;Sharky: Remove reference to onBeforeExecute event&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;languages /&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;{{Joomla version|version=3.x|}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
Joomla! ships with a variety of core events, organised into groups.  These are described in the following topics.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Authentication === &amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Authentication#onUserAuthenticate|onUserAuthenticate]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Captcha === &amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Captcha#onInit|onInit]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Captcha#onDisplay|onDisplay]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Captcha#onCheckAnswer|onCheckAnswer]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Content === &amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentPrepare|onContentPrepare]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentAfterTitle|onContentAfterTitle]] ({{JVer|3.0}} &amp;lt;translate&amp;gt;&amp;lt;!--T:24--&amp;gt; and higher&amp;lt;/translate&amp;gt;)&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentBeforeDisplay|onContentBeforeDisplay]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentAfterDisplay|onContentAfterDisplay]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentBeforeSave|onContentBeforeSave]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentAfterSave|onContentAfterSave]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentPrepareForm|onContentPrepareForm]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentPrepareData|onContentPrepareData]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentBeforeDelete|onContentBeforeDelete]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentAfterDelete|onContentAfterDelete]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentChangeState|onContentChangeState]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentSearch|onContentSearch]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Content#onContentSearchAreas|onContentSearchAreas]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Editors === &amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Editor#onInit|onInit]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Editor#onSave|onSave]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Editor#onSetContent|onSetContent]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Editor#onDisplay|onDisplay]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Editor#onGetContent|onGetContent]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Editor#onGetInsertMethod|onGetInsertMethod]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Extensions === &amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Extension#onExtensionAfterInstall|onExtensionAfterInstall]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Extension#onExtensionAfterUninstall|onExtensionAfterUninstall]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Extension#onExtensionAfterUpdate|onExtensionAfterUpdate]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Extension#onExtensionAfterUpdate|onExtensionBeforeSave]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Extension#onExtensionAfterUpdate|onExtensionAfterSave]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Extension#onExtensionAfterDelete|onExtensionAfterDelete]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Finder === &amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Finder#onFinderCategoryChangeState|onFinderCategoryChangeState]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Finder#onFinderChangeState|onFinderChangeState]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Finder#onFinderBeforeDelete|onFinderAfterDelete]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Finder#onFinderAfterDelete|onFinderAfterDelete]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Finder#onFinderBeforeSave|onFinderBeforeSave]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Finder#onFinderAfterSave|onFinderAfterSave]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Privacy === &amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Privacy#onPrivacyCanRemoveData|onPrivacyCanRemoveData]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Privacy#onPrivacyExportRequest|onPrivacyExportRequest]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Privacy#onPrivacyRemoveData|onPrivacyRemoveData]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Quick Icons === &amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Quickicon#onGetIcons|onGetIcons]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Sampledata === &amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt; &lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/SampleData#onSampledataGetOverview|onSampledataGetOverview]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/SampleData#onAjaxSampledataApplyStep1|onAjaxSampledataApplyStep1]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/SampleData#onAjaxSampledataApplyStep2|onAjaxSampledataApplyStep2]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/SampleData#onAjaxSampledataApplyStep3|onAjaxSampledataApplyStep3]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== System === &amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/System#onAfterInitialise|onAfterInitialise]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/System#onAfterRoute|onAfterRoute]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/System#onAfterDispatch|onAfterDispatch]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/System#onAfterRender|onAfterRender]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/System#onBeforeRender|onBeforeRender]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/System#onBeforeCompileHead|onBeforeCompileHead]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== User === &amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserAuthorisation|onUserAuthorisation]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserAuthorisationFailure|onUserAuthorisationFailure]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserBeforeSave|onUserBeforeSave]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserAfterSave|onUserAfterSave]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserBeforeDelete|onUserBeforeDelete]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserAfterDelete|onUserAfterDelete]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserLogin|onUserLogin]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserLoginFailure|onUserLoginFailure]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserAfterLogin|onUserAfterLogin]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserLogout|onUserLogout]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserBeforeSaveGroup|onUserBeforeSaveGroup]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserAfterSaveGroup|onUserAfterSaveGroup]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserBeforeDeleteGroup|onUserBeforeDeleteGroup]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserAfterDeleteGroup|onUserAfterDeleteGroup]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/User#onUserAfterRemind|onUserAfterRemind]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Other Core Component Events === &amp;lt;!--T:2--&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Actionlog Component ==== &amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Actionlog#onAfterLogPurge|onAfterLogPurge]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Actionlog#onAfterLogExport|onAfterLogExport]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Cache Component ==== &amp;lt;!--T:21--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Cache#onAfterPurge|onAfterPurge]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Checkin Component ==== &amp;lt;!--T:22--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Checkin#onAfterCheckin|onAfterCheckin]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Config Component ==== &amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Config#onApplicationAfterSave|onApplicationAfterSave]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Contact Component ==== &amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Contact#onValidateContact|onValidateContact]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Contact#onSubmitContact|onSubmitContact]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Installer Component ==== &amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Install#onInstallerBeforeInstallation|onInstallerBeforeInstallation]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Install#onInstallerBeforeInstaller|onInstallerBeforeInstaller]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Install#onInstallerAfterInstaller|onInstallerAfterInstaller]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Menu Component ==== &amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Menu#onAfterGetMenuTypeOptions|onAfterGetMenuTypeOptions]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==== Module ==== &amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Module#onRenderModule|onRenderModule]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Module#onAfterRenderModule|onAfterRenderModule]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Module#onAfterRenderModules|onAfterRenderModules]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Module#onPrepareModuleList|onPrepareModuleList]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Module#onAfterModuleList|onAfterModuleList]]&lt;br /&gt;
* [[S:MyLanguage/Plugin/Events/Module#onAfterCleanModuleList|onAfterCleanModuleList]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Plugin Development|Events{{#translation:}}]]&lt;br /&gt;
[[Category:Specifications{{#translation:}}]]&lt;br /&gt;
[[Category:Tutorials{{#translation:}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sharky</name></author>
	</entry>
</feed>