<?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=Dieter</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=Dieter"/>
	<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/Special:Contributions/Dieter"/>
	<updated>2026-05-25T23:11:05Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27927</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27927"/>
		<updated>2010-05-22T22:20:14Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Database tables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
In phpGACL, users were called AROs (Access Request Object).&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are held in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are held in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via the jos_usergroup_rule_map table.&lt;br /&gt;
&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such as logging in to backend.&lt;br /&gt;
&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* action, assetgroup and user groups are all mapped to this rule.&lt;br /&gt;
* When three of them map to the same rule then JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets.&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default: Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is a JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27926</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27926"/>
		<updated>2010-05-22T22:15:57Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Core Access Levels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
In phpGACL, users were called AROs (Access Request Object).&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are held in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are held in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via the jos_usergroup_rule_map table.&lt;br /&gt;
&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such as logging in to backend.&lt;br /&gt;
&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* action, assetgroup and user groups are all mapped to this rule.&lt;br /&gt;
* When three of them map to the same rule then JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets.&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default: Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27925</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27925"/>
		<updated>2010-05-22T22:14:33Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
In phpGACL, users were called AROs (Access Request Object).&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are held in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are held in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via the jos_usergroup_rule_map table.&lt;br /&gt;
&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such as logging in to backend.&lt;br /&gt;
&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* action, assetgroup and user groups are all mapped to this rule.&lt;br /&gt;
* When three of them map to the same rule then JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets.&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27924</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27924"/>
		<updated>2010-05-22T22:13:58Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Asset Groups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
In phpGACL, users were called AROs (Access Request Object).&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are held in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are held in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via the jos_usergroup_rule_map table.&lt;br /&gt;
&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such as logging in to backend.&lt;br /&gt;
&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* action, assetgroup and user groups are all mapped to this rule.&lt;br /&gt;
* When three of them map to the same rule then JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27923</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27923"/>
		<updated>2010-05-22T22:10:44Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Actions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
In phpGACL, users were called AROs (Access Request Object).&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are held in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are held in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via the jos_usergroup_rule_map table.&lt;br /&gt;
&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such as logging in to backend.&lt;br /&gt;
&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* Both action, assetgroup and user groups are mapped to this rule.&lt;br /&gt;
*When three of them maps to the same rule JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27922</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27922"/>
		<updated>2010-05-22T22:10:25Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Actions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
In phpGACL, users were called AROs (Access Request Object).&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are held in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are held in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via the jos_usergroup_rule_map table.&lt;br /&gt;
&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such as logging in to backend&lt;br /&gt;
&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* Both action, assetgroup and user groups are mapped to this rule.&lt;br /&gt;
*When three of them maps to the same rule JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27921</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27921"/>
		<updated>2010-05-22T22:09:50Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* User Groups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
In phpGACL, users were called AROs (Access Request Object).&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are held in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are held in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via the jos_usergroup_rule_map table.&lt;br /&gt;
&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such that logging in to backend&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* Both action, assetgroup and user groups are mapped to this rule.&lt;br /&gt;
*When three of them maps to the same rule JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27920</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27920"/>
		<updated>2010-05-22T22:08:48Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* User Groups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
In phpGACL, users were called AROs (Access Request Object).&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are held in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are held in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via jos_usergroup_rule_map table.&lt;br /&gt;
&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such that logging in to backend&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* Both action, assetgroup and user groups are mapped to this rule.&lt;br /&gt;
*When three of them maps to the same rule JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27919</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27919"/>
		<updated>2010-05-22T22:08:17Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* User Groups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
In phpGACL, users were called AROs (Access Request Object).&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are held in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are hold in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via jos_usergroup_rule_map table.&lt;br /&gt;
&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such that logging in to backend&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* Both action, assetgroup and user groups are mapped to this rule.&lt;br /&gt;
*When three of them maps to the same rule JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27918</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27918"/>
		<updated>2010-05-22T22:07:39Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Users */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
In phpGACL, users were called AROs (Access Request Object).&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are hold in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are hold in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via jos_usergroup_rule_map table.&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such that logging in to backend&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* Both action, assetgroup and user groups are mapped to this rule.&lt;br /&gt;
*When three of them maps to the same rule JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27917</id>
		<title>Archived:Access Control System In Joomla 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Archived:Access_Control_System_In_Joomla_1.6&amp;diff=27917"/>
		<updated>2010-05-22T22:06:27Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Sections */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{RightTOC}}&lt;br /&gt;
==Overview==&lt;br /&gt;
===Sections===&lt;br /&gt;
Sections are used to group rules, actions, assets and assetgroups for each extension using the table jos_access_sections. This allows us to have completely separate ACL systems for different extensions.&lt;br /&gt;
&lt;br /&gt;
===Users===&lt;br /&gt;
These are users stored in jos_users table. Please note that gid and usertype fields are only there for legacy purposes and are not used in the current ACL system.&lt;br /&gt;
Users can be mapped to rules via jos_user_rule_map table.&lt;br /&gt;
in phpGACL, users were called AROs (Access Request Object)&lt;br /&gt;
&lt;br /&gt;
===User Groups===&lt;br /&gt;
These are user groups that are hold in table jos_usergroups. You can have nested user groups. Each group obviously can hold an unlimited number of users and each user can be assigned to an unlimited number of user groups. These relations are hold in the table jos_user_usergroup_map.&lt;br /&gt;
User groups can be mapped to rules via jos_usergroup_rule_map table.&lt;br /&gt;
===Actions===&lt;br /&gt;
Actions are things your users will perform such that logging in to backend&lt;br /&gt;
===Assets===&lt;br /&gt;
Assets are items that you need to set access control on. For example each article on your site can be an asset and you can set edit permission for them. Currently these are not used in core.&lt;br /&gt;
===Asset Groups===&lt;br /&gt;
These are used for creating different view permissions for a combination of usergroups. (???)&lt;br /&gt;
How this is achieved:&lt;br /&gt;
* First a view action is created with access type 3. (eg. core.view)&lt;br /&gt;
* Then an asset group is created with some user groups in it.&lt;br /&gt;
* A rule is set with the name convention {action_name}.{asset_group_id} (eg. core.view.1 for Public)&lt;br /&gt;
* Both action, assetgroup and user groups are mapped to this rule.&lt;br /&gt;
*When three of them maps to the same rule JUser::getAuthorisedLevels() will also return the new asset group id.&lt;br /&gt;
===Rules===&lt;br /&gt;
Rules are combinations of actions and usergroups (or users) and optionally assets&lt;br /&gt;
There are three types of rules:&lt;br /&gt;
* Type 1: These are rules that allow a user or user group to do an action. For example user group X can log in to backend.&lt;br /&gt;
* Type 2: These are rules that allow a user or user group to do an action on an asset. For example user group X can edit an article with the id of Y.&lt;br /&gt;
* Type 3: These are rules that allow a user or user group to do an action (mostly view) on an asset group. For example user group X can view articles with the asset group of Y. (???)&lt;br /&gt;
==Library==&lt;br /&gt;
TODO&lt;br /&gt;
==Examples==&lt;br /&gt;
===Core Access Levels===&lt;br /&gt;
There are three access levels in core by default Public, Registered, Special. These are access levels. For them we use the action &#039;&#039;core.view&#039;&#039;. Let&#039;s use &#039;&#039;&#039;Special&#039;&#039;&#039; for our example:&lt;br /&gt;
First of all there is an asset group named Special. We need to tie some user groups to it and selecting Manager is enough. Because the system will automatically include its child groups (being Administrator and Super Administrator by default) The rule needed for this level is &#039;&#039;core.view.3&#039;&#039;. As you remember naming convention is action_name.asset_group_id and here our id is 3.&lt;br /&gt;
&lt;br /&gt;
==Database tables==&lt;br /&gt;
&lt;br /&gt;
It seems that this diagram has been deprecated in favor of much simpler structure.&lt;br /&gt;
&lt;br /&gt;
* jos_assets: id, parent_id, lft, rgt, level, name, title, rules&lt;br /&gt;
* jos_usergroups: id, parent_id, lft, rgt, title&lt;br /&gt;
* jos_user_usergroup_map: user_id, group_id&lt;br /&gt;
* jos_viewlevels: id, title, ordering, rules&lt;br /&gt;
&lt;br /&gt;
* jos_categories and jos_content contain foreign key asset_id &lt;br /&gt;
* Rules field is JSON encoded string with content like this: &#039;{&amp;quot;core.admin&amp;quot;:{&amp;quot;7&amp;quot;:1},&amp;quot;core.manage&amp;quot;:{&amp;quot;6&amp;quot;:1}}&#039;&lt;br /&gt;
&lt;br /&gt;
-- Matias 7-Mar-2010&lt;br /&gt;
&lt;br /&gt;
[[Image:Dia_acl_base.png]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=J2.5:What%27s_new_in_Joomla_2.5&amp;diff=27913</id>
		<title>J2.5:What&#039;s new in Joomla 2.5</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=J2.5:What%27s_new_in_Joomla_2.5&amp;diff=27913"/>
		<updated>2010-05-22T21:40:37Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* JCacheStorage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lots of things.&lt;br /&gt;
&lt;br /&gt;
...and:&lt;br /&gt;
* &#039;&#039;&#039;New Access Control System&#039;&#039;&#039; - Allows site administrators control over who can view and manage content.&lt;br /&gt;
* &#039;&#039;&#039;Unlimited Depth Organizational Model&#039;&#039;&#039; - Gives site administrators and content creators user-defined category levels that allow for the creation of a category tree with as many or as few levels for organizing articles and other content as needed.&lt;br /&gt;
* &#039;&#039;&#039;One-Click Extension Updates&#039;&#039;&#039; - Allows users to keep sites secure and controlled by simplifying the process of updating extensions.&lt;br /&gt;
* &#039;&#039;&#039;Semantic XHTML Layouts&#039;&#039;&#039; - Provides a better baseline for content presentation.&lt;br /&gt;
&lt;br /&gt;
...and:&lt;br /&gt;
&lt;br /&gt;
==Administrators==&lt;br /&gt;
===Introduction===&lt;br /&gt;
*Consistent UI&lt;br /&gt;
*Consistent Features&lt;br /&gt;
*Richer sample data&lt;br /&gt;
*IE 7+, Firefox 3.x, Safari 4.x&lt;br /&gt;
*PHP 5.2.4+&lt;br /&gt;
*MySQL 5.0.4 (allows for wide varchars)&lt;br /&gt;
&lt;br /&gt;
===Administrator===&lt;br /&gt;
*Menu Changes&lt;br /&gt;
*Submenu consistency&lt;br /&gt;
&lt;br /&gt;
====Toolbar Features====&lt;br /&gt;
*Save&lt;br /&gt;
*Save &amp;amp; Close&lt;br /&gt;
*Save &amp;amp; New&lt;br /&gt;
*Save as Copy&lt;br /&gt;
*Expired session will return to the page you were on then you got logged out (can be hit and miss)&lt;br /&gt;
*Most search filters allow you to search for a record id via [ id:123 ]&lt;br /&gt;
*&amp;quot;Parameters&amp;quot; are now referred to as &amp;quot;Options&amp;quot;&lt;br /&gt;
*Template Styles&lt;br /&gt;
*Integrated Trash Management&lt;br /&gt;
*Consistent archive support for most content&lt;br /&gt;
*Extension Installer Improvements&lt;br /&gt;
&lt;br /&gt;
===Module Enhancements===&lt;br /&gt;
*Publish up and down&lt;br /&gt;
*Add option to display on all pages &amp;quot;except&amp;quot; selected&lt;br /&gt;
*Expanded Category System&lt;br /&gt;
*404 Page Redirection&lt;br /&gt;
*Better Menu Management&lt;br /&gt;
*Alternative layouts for content, modules and menus (taken from the home template)&lt;br /&gt;
&lt;br /&gt;
===New Templates===&lt;br /&gt;
*Atomic&lt;br /&gt;
*Beez2&lt;br /&gt;
*(Administrator) Bluestork (replaces Khephri)&lt;br /&gt;
*(Administrator) Hathor&lt;br /&gt;
*Legacy layer in Milkyway&lt;br /&gt;
*Backend supports layout overrides&lt;br /&gt;
*New Modules&lt;br /&gt;
*New Plugins&lt;br /&gt;
*Content Languages&lt;br /&gt;
*User Login Permissions&lt;br /&gt;
*Activate selected users from the user list now (and filter)&lt;br /&gt;
*Administrator registration approval&lt;br /&gt;
*Polls component removed&lt;br /&gt;
*New codemirror editor&lt;br /&gt;
&lt;br /&gt;
===SEO Improvements===&lt;br /&gt;
*Meta decription and keywords for categories&lt;br /&gt;
*Articles can change the page title and page header separately&lt;br /&gt;
&lt;br /&gt;
===Global Configuration===&lt;br /&gt;
*Add site name to titles&lt;br /&gt;
*Default Access Level&lt;br /&gt;
*Set Metadata Language (buggy)&lt;br /&gt;
*Unicode Aliases&lt;br /&gt;
*Cookie domain and path&lt;br /&gt;
*User Setting moved to User Manager -&amp;gt; Options&lt;br /&gt;
*Media Settings moved to Media Manager -&amp;gt; Options&lt;br /&gt;
*Debug Modules - allows you to enabled to disable the tp=1 feature&lt;br /&gt;
*Server Timezone now a location, not an integer offset&lt;br /&gt;
*New Global Permissions tab&lt;br /&gt;
&lt;br /&gt;
===User Manager===&lt;br /&gt;
*Can activate a user from the list now&lt;br /&gt;
*User can be assigned to multiple groups&lt;br /&gt;
*Manage user groups&lt;br /&gt;
*Manager content access levels&lt;br /&gt;
&lt;br /&gt;
===Media Manager===&lt;br /&gt;
*Flash uploader fixed&lt;br /&gt;
&lt;br /&gt;
===Menu Manager===&lt;br /&gt;
====Menus List====&lt;br /&gt;
*Rebuild button to press when you brick the menu&lt;br /&gt;
*Clicking the menu name brings up the menu items list rather than going into Edit Menu. To edit the menu, click on the check box next to the name and click on the Edit icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
====Items List====&lt;br /&gt;
*Menus support the language filter&lt;br /&gt;
*Default now called Home&lt;br /&gt;
*Home is now clickable in the menu item list&lt;br /&gt;
*A separate home can be set for different languages&lt;br /&gt;
&lt;br /&gt;
=====New batch operations=====&lt;br /&gt;
*Set access level&lt;br /&gt;
*Copy or move to another part of this or another menu&lt;br /&gt;
&lt;br /&gt;
====Edit Item====&lt;br /&gt;
*Improved &amp;quot;Type&amp;quot; selector with human readable view and layout names&lt;br /&gt;
*Note field added&lt;br /&gt;
*New window target&lt;br /&gt;
*New Language assignment&lt;br /&gt;
*New Template style&lt;br /&gt;
*Ability to add &amp;amp; edit Module assignments from this page&lt;br /&gt;
&lt;br /&gt;
=====New options for the menu links and pages themselves=====&lt;br /&gt;
*Link title attribute&lt;br /&gt;
*Link CSS style&lt;br /&gt;
*Menu image is changed to a modal selector&lt;br /&gt;
*CSS class for page heading&lt;br /&gt;
*Page meta description&lt;br /&gt;
*Page meta keywords&lt;br /&gt;
*Robots options&lt;br /&gt;
&lt;br /&gt;
===Articles Manager===&lt;br /&gt;
*Frontpage is now referred to a Featured&lt;br /&gt;
*Article manager uses submenu to quickly skip between articles , categories and featured&lt;br /&gt;
*Sections and categories are now merged.&lt;br /&gt;
&lt;br /&gt;
====Articles List====&lt;br /&gt;
*&#039;&#039;&amp;quot;Missing move and copy; filter by author&amp;quot;&#039;&#039;&lt;br /&gt;
*New column to show language&lt;br /&gt;
*Filtering by language available&lt;br /&gt;
&lt;br /&gt;
====Article Edit====&lt;br /&gt;
*Created by user now selected by modal popup&lt;br /&gt;
*New ability to set the page title from the article&lt;br /&gt;
*Define create, delete, edit and publishing permissions&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
====Category List====&lt;br /&gt;
*Nested view&lt;br /&gt;
*Filtering on language&lt;br /&gt;
&lt;br /&gt;
====Edit Category====&lt;br /&gt;
*New note field&lt;br /&gt;
*Section replaced with ability to assign a parent category&lt;br /&gt;
*Ability to assign content language&lt;br /&gt;
&lt;br /&gt;
=====New Options (not previously available in 1.5)=====&lt;br /&gt;
*Assign alternate layout&lt;br /&gt;
*Define create, delete, edit and publishing permissions&lt;br /&gt;
*Meta description&lt;br /&gt;
*Meta keywords&lt;br /&gt;
*Alternative page title&lt;br /&gt;
*Meta author&lt;br /&gt;
*Meta robots&lt;br /&gt;
&lt;br /&gt;
===Banners===&lt;br /&gt;
====Banners list====&lt;br /&gt;
*** Missing copy toolbar button&lt;br /&gt;
*New archive toolbar button&lt;br /&gt;
*New columns to show meta keywords, purchase type and language&lt;br /&gt;
*New filtering by client and language &lt;br /&gt;
&lt;br /&gt;
====Edit Banner====&lt;br /&gt;
*New type toggle for Image or Custom (dynamically changes the available form fields)&lt;br /&gt;
*New alt text field for image&lt;br /&gt;
*New language field&lt;br /&gt;
&lt;br /&gt;
=====New Options=====&lt;br /&gt;
*Ability to set the created date&lt;br /&gt;
*Ability to set start and finish publishing times&lt;br /&gt;
*Ability to set the purchase type&lt;br /&gt;
*Ability to track impressions&lt;br /&gt;
*Ability to track clicks&lt;br /&gt;
*Use own prefix ?&lt;br /&gt;
*Tags renamed to meta &lt;br /&gt;
*Contacts&lt;br /&gt;
*Messaging&lt;br /&gt;
*Newsfeeds&lt;br /&gt;
*Search&lt;br /&gt;
*Weblinks&lt;br /&gt;
*Redirect&lt;br /&gt;
&lt;br /&gt;
===Extensions Manager===&lt;br /&gt;
====Discover====&lt;br /&gt;
*Module mgr&lt;br /&gt;
*Plugin Mgr&lt;br /&gt;
*Template Mgr&lt;br /&gt;
*Language mgr&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
*Auto create linked contact when creating new user ??&lt;br /&gt;
&lt;br /&gt;
==Access Controls==&lt;br /&gt;
*Introduction&lt;br /&gt;
*User Groups&lt;br /&gt;
*Access Levels&lt;br /&gt;
*Permission Layers&lt;br /&gt;
*How Permissions are Inherited&lt;br /&gt;
*How to debrick your site&lt;br /&gt;
&lt;br /&gt;
==Developers==&lt;br /&gt;
===Introduction===&lt;br /&gt;
*PHP 5.2.4+&lt;br /&gt;
*MySQL 5.0.4 (allows for wide varchars)&lt;br /&gt;
*IE7+, Firefox 3+, Safari 4+&lt;br /&gt;
*Focus on code consistency&lt;br /&gt;
*Focus on code reduction&lt;br /&gt;
&lt;br /&gt;
Usage of PHP Native Functions where possible, for example:&lt;br /&gt;
*[[JXMLElement]] extends the native [http://php.net/manual/en/book.simplexml.php SimpleXML] class&lt;br /&gt;
*[[JDate]] extends the [http://www.php.net/manual/en/class.datetime.php DateTime] class&lt;br /&gt;
*Native INI parser to load languages&lt;br /&gt;
&lt;br /&gt;
===Removed features===&lt;br /&gt;
*ADODB compatibility methods in database classes&lt;br /&gt;
*DOMIT (unsupported XML library)&lt;br /&gt;
*Legacy mode (includes global $mainframe, etc)&lt;br /&gt;
*JTemplate (based on patTemplate)&lt;br /&gt;
*patTemplate (templating engine)&lt;br /&gt;
*PDF support&lt;br /&gt;
*PEAR libraries (due to license incompatibilities)&lt;br /&gt;
*phpgacl&lt;br /&gt;
*PHP 4.0 and 5.0 compatibility files&lt;br /&gt;
*XStandard Editor&lt;br /&gt;
&lt;br /&gt;
===Deprecated Features===&lt;br /&gt;
*JController::_acoSection&lt;br /&gt;
*JController::_acoSectionValue&lt;br /&gt;
*JController::authorize()&lt;br /&gt;
*JController::setAccessControl()&lt;br /&gt;
*JDatabase::stderr()&lt;br /&gt;
*JDate::offest&lt;br /&gt;
*JDate::setOffset()&lt;br /&gt;
*JDate::toFormat() - use JDate::format() instead&lt;br /&gt;
*JException::toString()&lt;br /&gt;
*JFactory::getXMLParser()&lt;br /&gt;
*JHtmlGird::access()&lt;br /&gt;
*JHtmlImage::administrator - use JHtml::image instead&lt;br /&gt;
*JHtmlImage::site - use JHtml::image instead&lt;br /&gt;
*JHtmlList::accesslevel()&lt;br /&gt;
*JHtmlList::specificordering() - use JHtml::_(&#039;list.ordering&#039;)&lt;br /&gt;
*JHtmlList::category()&lt;br /&gt;
*JHtmlSelect::optgroup() - see JHtmlSelect::groupedList()&lt;br /&gt;
*JLanguage::_parseLanguageFiles - renamed to parseLanguageFiles&lt;br /&gt;
*JLanguage::_parseXMLLanguageFile - renamed to parseXMLLanguageFile&lt;br /&gt;
*JLanguage::_parseXMLLanguageFiles - renamed to parseXMLLanguageFiles&lt;br /&gt;
*JObject::toString - replaced with magic method&lt;br /&gt;
*JRegistry::getNameSpaces()&lt;br /&gt;
*JRegistry::getValue()&lt;br /&gt;
*JRegistry::makeNameSpace()&lt;br /&gt;
*JRegistry::setValue()&lt;br /&gt;
*JPane - See JHtmlSliders&lt;br /&gt;
*JParameter - replaced by JForm&lt;br /&gt;
*JSimpleXML, JSimpleXMLElement - Use JXMLElement instead, based on the native SimpleXMLElement&lt;br /&gt;
*JTable::canDelete() - models or controllers should be doing the access checks&lt;br /&gt;
*JTable::toXML()&lt;br /&gt;
*JToolbarHelper customX(), addNewX(), editListX(), editHtmlX(), editCssX(), deleteListX()&lt;br /&gt;
*JUser::authorize() - Use JUser::authorise()&lt;br /&gt;
*JUtility::dump()&lt;br /&gt;
*JUtility::array_unshift_ref() - Not needed in PHP 5&lt;br /&gt;
*JUtility::getHash() - Use JApplication::getHash()&lt;br /&gt;
*JUtility::getToken() - Use JFactory::getSession()-&amp;gt;getFormToken()&lt;br /&gt;
*JUtility::isWinOS() - Use JApplication::isWinOS()&lt;br /&gt;
*JUtility::return_bytes() - See InstallerModelWarnings::return_bytes()&lt;br /&gt;
*JUtility::sendMail() - Use JFactory::getMailer()-&amp;gt;sendMail()&lt;br /&gt;
*JUtility::sendAdminMail() - Use JFactory::getMailer()-&amp;gt;sendMail()&lt;br /&gt;
*JXMLElement::data() - Provided for backward compatibility&lt;br /&gt;
*JXMLElement::getAttribute() - Provided for backward compatibility&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
*JTable now automatically looks up the fields from the database schema&lt;br /&gt;
*New JDatabaseQuery - A chained CRUD query builder&lt;br /&gt;
*New JDatabase::getNextRow&lt;br /&gt;
*New JDatabase::getNextObject&lt;br /&gt;
*JDatabase::loadAssocList  - Now takes a second argument to just return the value of a column&lt;br /&gt;
*JDatabase::setQuery  - Added chaining support&lt;br /&gt;
&lt;br /&gt;
====Important Schema Changes====&lt;br /&gt;
*New jos_extensions table to list all extensions&lt;br /&gt;
*Components table information moved and split between jos_extensions and jos_menu (special menu called _adminmenu)&lt;br /&gt;
&lt;br /&gt;
The old phpgacl (jos_core_acl*) and jos_groups tables have been reworked into:&lt;br /&gt;
*jos_assets&lt;br /&gt;
*jos_user_usergroup_map&lt;br /&gt;
*jos_usergroups&lt;br /&gt;
*jos_viewlevels&lt;br /&gt;
*Archived state changed from a value of -1 to +2&lt;br /&gt;
&lt;br /&gt;
===Improved MVC===&lt;br /&gt;
====Models====&lt;br /&gt;
*JModelList&lt;br /&gt;
*JModelForm&lt;br /&gt;
*JModelAdmin&lt;br /&gt;
*Format handling (eg JSON)&lt;br /&gt;
*Sub-controller handling&lt;br /&gt;
&lt;br /&gt;
====Controllers====&lt;br /&gt;
*JControllerForm&lt;br /&gt;
*JControllerAdmin&lt;br /&gt;
*JController::setMessage takes second arg to set the message type&lt;br /&gt;
*JController can set the default view&lt;br /&gt;
*Added chaining support to several JController methods&lt;br /&gt;
&lt;br /&gt;
====Views====&lt;br /&gt;
*Semantic core output&lt;br /&gt;
*Milkyway legacy layouts&lt;br /&gt;
*The old component parameters are not automatically added to the menu anymore. You need to explicitly put them in the layout XML files.&lt;br /&gt;
*The menu manager will now detect additional layouts for a given view in the default template.&lt;br /&gt;
&lt;br /&gt;
===Form API===&lt;br /&gt;
====Event manipulation====&lt;br /&gt;
*onContentPrepareForm&lt;br /&gt;
*onContentPrepareFormData&lt;br /&gt;
&lt;br /&gt;
===Translation and Language Support===&lt;br /&gt;
*Support for unicode slugs, eg, SEF URL&#039;s with Greek characters&lt;br /&gt;
*3-letter languages now supported, xxx-XX&lt;br /&gt;
*All existing language keys have been refactored&lt;br /&gt;
&lt;br /&gt;
====INI files must validate====&lt;br /&gt;
*Upper case key with no spaces, alphanumeric characters and underscores&lt;br /&gt;
*Quoted values&lt;br /&gt;
*Double quotes within literal strings must use _QQ_ in the form KEY=&amp;quot;&amp;lt;a href=&amp;quot;_QQ_&amp;quot;index.php&amp;quot;_QQ_&amp;quot;&amp;gt;Click&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Javascript translation layer====&lt;br /&gt;
*See the flash uploader script for an example&lt;br /&gt;
Local extension language files&lt;br /&gt;
&lt;br /&gt;
====Language file API====&lt;br /&gt;
*Pluralisation support&lt;br /&gt;
*Transliteration support for ASCII or Unicode slugs&lt;br /&gt;
*Ignore Search Words&lt;br /&gt;
*Minimum search word length&lt;br /&gt;
*Custom language overrides&lt;br /&gt;
*System language file to support administrator menu and installation (.sys.ini)&lt;br /&gt;
&lt;br /&gt;
====Language switcher====&lt;br /&gt;
*Language Filter plugin enables language switching&lt;br /&gt;
*Sets the automatic filtering via JFactory::getApplication()-&amp;gt;setLanguageFilter(true)&lt;br /&gt;
*A frontend component with language support would test JFactory::getApplication()-&amp;gt;getLanguageFilter(), which returns the selected language code from the Languages Module&lt;br /&gt;
*The language field can be a language code for a single language, or &amp;quot;*&amp;quot; to be displayed for all languages&lt;br /&gt;
*Community extension for language maintenance com_localise&lt;br /&gt;
&lt;br /&gt;
===Extension management===&lt;br /&gt;
====New installation types====&lt;br /&gt;
=====Libraries=====&lt;br /&gt;
*Must include an XML manifest where type=&amp;quot;library&amp;quot;&lt;br /&gt;
*Can only be installed into a sub-folder of /libraries/&lt;br /&gt;
*Can extend parts of an existing library, eg /libraries/joomla/database/database/oracle.php&lt;br /&gt;
&lt;br /&gt;
=====Packages multi-installer=====&lt;br /&gt;
*Must include an XML manifest where type=&amp;quot;package&amp;quot;&lt;br /&gt;
*A package is a zip of zip&#039;s&lt;br /&gt;
&lt;br /&gt;
New install script can be provided with 5 methods:&lt;br /&gt;
=====preflight=====&lt;br /&gt;
*Runs before anything is run and while the extracted files are in the uploaded temp folder&lt;br /&gt;
&lt;br /&gt;
======Could allow for:======&lt;br /&gt;
*secondary extraction of custom zip&#039;s&lt;br /&gt;
*version checks to be performed&lt;br /&gt;
*halting the installer on an error&lt;br /&gt;
&lt;br /&gt;
=====install / update=====&lt;br /&gt;
*Runs after the database scripts are executed&lt;br /&gt;
*If the extension is new, the install method is run&lt;br /&gt;
*If the extension exists then update method is run if method=&amp;quot;upgrade&amp;quot;, otherwise assumes that the extension is not meant to be upgradable&lt;br /&gt;
&lt;br /&gt;
=====postflight=====&lt;br /&gt;
*Runs after the extension is registered in the database&lt;br /&gt;
*Is not run for the uninstall process (nothing left to do obviously)&lt;br /&gt;
&lt;br /&gt;
====Discover====&lt;br /&gt;
*Does not do any file copying, only works with what it finds&lt;br /&gt;
*Performs preflight, install and postflight&lt;br /&gt;
*Developer of installer has two language files??&lt;br /&gt;
&lt;br /&gt;
====Update site====&lt;br /&gt;
*Can publish an XML manifest on your site that can include individual extensions and extension sets.&lt;br /&gt;
&lt;br /&gt;
====XML Manifest Changes====&lt;br /&gt;
*&amp;lt;install&amp;gt; is deprecated - use &amp;lt;extension&amp;gt;&lt;br /&gt;
*New &amp;lt;update&amp;gt; tag. Takes a &amp;lt;schemas&amp;gt; tag which can define &amp;lt;schemapath&amp;gt;&lt;br /&gt;
*&amp;lt;params&amp;gt; and &amp;lt;param&amp;gt; tags are deprecated, use &amp;lt;fields&amp;gt;, &amp;lt;fieldsets&amp;gt; and &amp;lt;field&amp;gt; instead&lt;br /&gt;
&lt;br /&gt;
====File changes====&lt;br /&gt;
*Installation manifest must be the same name as the extension, eg com_foobar/foobar.xml  This helps with discovery (otherwise the function has to go through all the files in the extension folder&lt;br /&gt;
*Plugins are now in folders like modules and components&lt;br /&gt;
*See SVN/tests/_data/installer_packages/ for complete examples of all extensions and manifests.&lt;br /&gt;
*The method=&amp;quot;upgrade&amp;quot; will compare individual files in the original and incoming manifests and will remove files as appropriate.  However, it will not remove differences in the &amp;lt;folder&amp;gt; tags.&lt;br /&gt;
*Future support for rollback&lt;br /&gt;
&lt;br /&gt;
===Events===&lt;br /&gt;
====New Events====&lt;br /&gt;
*onBeforeRender&lt;br /&gt;
*onContentBeforeDelete&lt;br /&gt;
*onContentAfterDelete&lt;br /&gt;
*onContentChangeState&lt;br /&gt;
*onContentPrepareForm&lt;br /&gt;
*onContentPrepareFormData&lt;br /&gt;
*onExtensionBeforeInstall&lt;br /&gt;
*onExtensionBeforeUpdate&lt;br /&gt;
*onExtensionBeforeUninstall&lt;br /&gt;
*onExtensionAfterInstall&lt;br /&gt;
*onExtensionAfterUpdate&lt;br /&gt;
*onExtensionAfterUninstall&lt;br /&gt;
&lt;br /&gt;
====Renamed Events====&lt;br /&gt;
*onContentAfterSave&lt;br /&gt;
*onContentAfterTitle&lt;br /&gt;
*onContentAfterDisplay&lt;br /&gt;
*onContentBeforeDisplay&lt;br /&gt;
*onContentBeforeSave&lt;br /&gt;
*onContentSearch&lt;br /&gt;
*onContentSearchAreas&lt;br /&gt;
*onUserAuthenticate&lt;br /&gt;
*onUserAfterDelete&lt;br /&gt;
*onUserAfterSave&lt;br /&gt;
*onUserBeforeDelete&lt;br /&gt;
*onUserBeforeSave&lt;br /&gt;
*onUserLogin&lt;br /&gt;
*onUserLogout&lt;br /&gt;
*All content events (except for search and search areas) now pass a &#039;context&#039; as the first argument to alert the plugin as to what type of content is being passed.  The plugin event may or may not heed this context.&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
*Component can provide custom options for its own categories via optional category.xml&lt;br /&gt;
*Supported via JTableNested&lt;br /&gt;
&lt;br /&gt;
===Access Controls===&lt;br /&gt;
*A thing that can be controlled by permissions is registered in the assets table&lt;br /&gt;
*JTable handles this transparently via asset_id field&lt;br /&gt;
*For view permissions, support is as simple as adding&lt;br /&gt;
:::$user = JFactory::getUser();&lt;br /&gt;
:::$groups = implode(&#039;,&#039;, $user-&amp;gt;authorisedLevels());&lt;br /&gt;
:::$query-&amp;gt;where(&#039;a.access IN (&#039; . $groups . &#039;)&#039;);&lt;br /&gt;
&lt;br /&gt;
For action permissions, same format as in 1.5:&lt;br /&gt;
$user-&amp;gt;authorise($actionName, $assetName)&lt;br /&gt;
*OpenID library moved to plugin folder&lt;br /&gt;
*Geshi library moved to plugin folder&lt;br /&gt;
*JRegistry notes defaults to JSON (new format), dynamically converting existing data in INI format&lt;br /&gt;
*New JStream&lt;br /&gt;
*New JApplicationHelper::getComponentName&lt;br /&gt;
*Core icons moved to /media/&lt;br /&gt;
*Backward incompatible change to JEditor::display&lt;br /&gt;
*Added chaining support to JMail&lt;br /&gt;
*JFilterInput can no longer be called statically&lt;br /&gt;
*JHtml::image now supports relative paths&lt;br /&gt;
*All system images are overridable in the default template&lt;br /&gt;
*New JHtmlString&lt;br /&gt;
*Added wincache session handler for IIS&lt;br /&gt;
*New JFilterOutput::stripImages&lt;br /&gt;
*JPath::check takes second arg for separator (to pass to JPath::clean)&lt;br /&gt;
*Expanded configuration support through config.xml (multiple tabs)&lt;br /&gt;
&lt;br /&gt;
====Core actions====&lt;br /&gt;
*core.login.site&lt;br /&gt;
*core.login.admin&lt;br /&gt;
*core.admin&lt;br /&gt;
*core.manage&lt;br /&gt;
*core.create&lt;br /&gt;
*core.edit&lt;br /&gt;
*core.edit.state&lt;br /&gt;
*core.delete&lt;br /&gt;
*Miscellaneous changes&lt;br /&gt;
&lt;br /&gt;
===Debug Plugin===&lt;br /&gt;
*More tools for assisting with translation&lt;br /&gt;
&lt;br /&gt;
===Mootools 1.2/1.3===&lt;br /&gt;
*Need to use document.id instead of $&lt;br /&gt;
&lt;br /&gt;
==Cache changes ==&lt;br /&gt;
===API changes relevant to 3rd party developers===&lt;br /&gt;
====Component view cache==== &lt;br /&gt;
&lt;br /&gt;
Component view cache now takes an array of url parameters and their types to create Cacheid. This is a replacement for a previous unsafe way which took the whole URL for this and so opened the doors for DOS attacks via random url parameters added to request URL&#039;s. &lt;br /&gt;
&lt;br /&gt;
Com_contact example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$safeurlparams = array(&lt;br /&gt;
    &#039;id&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;catid&#039;=&amp;gt;&#039;INT&#039;, &#039;limit&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;limitstart&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;filter_order&#039;=&amp;gt;&#039;CMD&#039;, &lt;br /&gt;
    &#039;filter_order_Dir&#039;=&amp;gt;&#039;CMD&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
parent::display($cachable,$safeurlparams);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Old cacheid created from URL was retained for backwards compatibility and takes effect if there are no $safeurlparams.&lt;br /&gt;
&lt;br /&gt;
====Module cache====&lt;br /&gt;
This has been completly reconceptualized. Module cache now has 5 different modes of operation, 3 of them are to be set from module XML file, while 2 are meant to be used from within the module itself. Default is backwards compatible oldstatic mode that requires no changes to a module. &lt;br /&gt;
&lt;br /&gt;
Modes to be set in XML: &lt;br /&gt;
*&#039;&#039;&#039;static&#039;&#039;&#039; - one cache file for all pages with the same module parameters &lt;br /&gt;
*&#039;&#039;&#039;oldstatic&#039;&#039;&#039; - 1.5. definition of module caching, one cache file for all pages with the same module id and user aid. Default for backwards compatibility &lt;br /&gt;
*&#039;&#039;&#039;itemid&#039;&#039;&#039; - changes on itemid change &lt;br /&gt;
&lt;br /&gt;
In addition to cache field that was required in 1.5 there is now another hidden field called cachemode that sets any of the above modes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;cachemode&amp;quot; type=&amp;quot;hidden&amp;quot; label=&amp;quot;&amp;quot; default=&amp;quot;static&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;option value=&amp;quot;static&amp;quot;&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modes to be called from inside the module: &lt;br /&gt;
*&#039;&#039;&#039;safeuri&#039;&#039;&#039; - id is created from $cacheparams-&amp;gt;modeparams array, the same as in component view cache &lt;br /&gt;
*&#039;&#039;&#039;id&#039;&#039;&#039; - module sets own cache id&#039;s &lt;br /&gt;
&lt;br /&gt;
To use this modes one must rename cache field in xml to owncache field and call JModuleHelper::ModuleCache from within the module&#039;s main php file. This is actually a shortcut to cache callback to avoid code duplication in every module. &lt;br /&gt;
&lt;br /&gt;
An example that uses safeuri mode and replaces uncached&lt;br /&gt;
$list = modRelatedItemsHelper::getList($params) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$cacheparams = new stdClass; &lt;br /&gt;
$cacheparams-&amp;gt;cachemode = &#039;safeuri&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;class = &#039;modRelatedItemsHelper&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;method = &#039;getList&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;methodparams = $params; &lt;br /&gt;
$cacheparams-&amp;gt;modeparams = array(&#039;id&#039;=&amp;gt;&#039;int&#039;,&#039;Itemid&#039;=&amp;gt;&#039;int&#039;); &lt;br /&gt;
$list = JModuleHelper::ModuleCache ($module, $params, $cacheparams);&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
====Functional changes==== &lt;br /&gt;
&#039;&#039;&#039;Cache administration (Clean cache, Purge cache) now works with all drivers&#039;&#039;&#039;, not only with file cache. &lt;br /&gt;
&#039;&#039;&#039;New standalone garbage collect script&#039;&#039;&#039; that is to be called from crontab has been added. It can be found in libraries/joomla/utilities/garbagecron.php . For safety reasons it is recommended that it is renamed to something unique.&lt;br /&gt;
&lt;br /&gt;
====CMS and framework level functional changes==== &lt;br /&gt;
&#039;&#039;&#039;Caching is implemented in all components and modules&#039;&#039;&#039; that can potentially gain from cache.&lt;br /&gt;
Caching has also been added to some most expensive and frequent framework calls JComponentHelper::_load(), JModuleHelper::_load(),JMenuSite::load(); &lt;br /&gt;
&lt;br /&gt;
====Cache library changes====&lt;br /&gt;
Cache library has been completely refactored. &lt;br /&gt;
*Cache &#039;&#039;&#039;handlers have been renamed to controllers&#039;&#039;&#039; to better reflect their role and avoid confusion with cache storage handlers (referred to as drivers in following text). &lt;br /&gt;
*&#039;&#039;&#039;New JCacheController&#039;&#039;&#039; parent class has been added and inheritance has been changed to prevent bugs occurring from controller&#039;s and storage handler&#039;s get method clashes. &lt;br /&gt;
&lt;br /&gt;
====JCache==== &lt;br /&gt;
*&#039;&#039;&#039;getAll()&#039;&#039;&#039; method was added to JCache, JCacheStorage and all drivers, and it returns all cached items (this was previously possible only with file driver and hardcoded in administration) &lt;br /&gt;
*New &#039;&#039;&#039;lock and unlock&#039;&#039;&#039; methods were added to JCache, JCacheStorage and drivers. They enable cache item locking and unlocking to prevent errors on parallel accesses and double saves. This functionally was also implemented in controllers. &lt;br /&gt;
*Workarounds are now consolidated in new &#039;&#039;&#039;JCache getWorkarounds and setWorkarounds&#039;&#039;&#039; methods, are now used by all controllers and their use has been made optional. &lt;br /&gt;
*New makeId() method in JCache that creates cache id from registered url parameters set by components and system plugins&lt;br /&gt;
&lt;br /&gt;
====JCacheController==== &lt;br /&gt;
New parent class to Controllers that also functions as an intermediate to JCache. There is no JObject inheritance as otherwise magic __call doesn&#039;t work. &lt;br /&gt;
Change was needed to prevent bugs occurring from controller&#039;s and storage handler&#039;s get method clashes. They could be renamed but this would break backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
====JCacheStorage==== &lt;br /&gt;
*_getCacheId method was moved from drivers to their parent JCacheStorage and all drives now use the same method by default &lt;br /&gt;
*CacheItem was moved from cache admin to framework JCacheStorageHelper, it is used by getAll &lt;br /&gt;
*There are new cachelite and wincache drivers. All other drivers have been fixed with missing functions (gc, clean) added, their code cleaned and tested they should be now working properly. &lt;br /&gt;
*Replaced separate _expire files in filecache driver with timestamps (this should amount to cca. 40% speed gain). The same in all drivers that had this. &lt;br /&gt;
*Numerous bugfixes on all levels, most important is proper use of options defaulting to configuration parameters settings and correctly passing from level to level.&lt;br /&gt;
&lt;br /&gt;
====Other framework level changes==== &lt;br /&gt;
*Safe url parameters registration added to JControler view method. &lt;br /&gt;
*New ModuleCache method in JModuleHelper that performs the above described module cache (in 5 modes) for both, modules and module renderer. &lt;br /&gt;
*JFactory::getFeedParser has been changed to use Joomla caching instead of simplepie&#039;s.&lt;br /&gt;
&lt;br /&gt;
==Performance==&lt;br /&gt;
===Eliminate the usage of JTable for general browsing on the frontend===&lt;br /&gt;
*Session drops the usage of JTable&lt;br /&gt;
*Item views use a dedicated question, not JTable-&amp;gt;load&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
*Still Mootools 1.2. Will be upgrading to 1.3 during the beta process.&lt;br /&gt;
*Scaling issues to address&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
===Releases===&lt;br /&gt;
*Alpha 1: 22 June 2009&lt;br /&gt;
*Alpha 2: 25 October 2009&lt;br /&gt;
*Beta 1: 18 May 2010&lt;br /&gt;
*Beta 2: 2 weeks after Beta 1&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=J2.5:What%27s_new_in_Joomla_2.5&amp;diff=27912</id>
		<title>J2.5:What&#039;s new in Joomla 2.5</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=J2.5:What%27s_new_in_Joomla_2.5&amp;diff=27912"/>
		<updated>2010-05-22T21:39:02Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* JCache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lots of things.&lt;br /&gt;
&lt;br /&gt;
...and:&lt;br /&gt;
* &#039;&#039;&#039;New Access Control System&#039;&#039;&#039; - Allows site administrators control over who can view and manage content.&lt;br /&gt;
* &#039;&#039;&#039;Unlimited Depth Organizational Model&#039;&#039;&#039; - Gives site administrators and content creators user-defined category levels that allow for the creation of a category tree with as many or as few levels for organizing articles and other content as needed.&lt;br /&gt;
* &#039;&#039;&#039;One-Click Extension Updates&#039;&#039;&#039; - Allows users to keep sites secure and controlled by simplifying the process of updating extensions.&lt;br /&gt;
* &#039;&#039;&#039;Semantic XHTML Layouts&#039;&#039;&#039; - Provides a better baseline for content presentation.&lt;br /&gt;
&lt;br /&gt;
...and:&lt;br /&gt;
&lt;br /&gt;
==Administrators==&lt;br /&gt;
===Introduction===&lt;br /&gt;
*Consistent UI&lt;br /&gt;
*Consistent Features&lt;br /&gt;
*Richer sample data&lt;br /&gt;
*IE 7+, Firefox 3.x, Safari 4.x&lt;br /&gt;
*PHP 5.2.4+&lt;br /&gt;
*MySQL 5.0.4 (allows for wide varchars)&lt;br /&gt;
&lt;br /&gt;
===Administrator===&lt;br /&gt;
*Menu Changes&lt;br /&gt;
*Submenu consistency&lt;br /&gt;
&lt;br /&gt;
====Toolbar Features====&lt;br /&gt;
*Save&lt;br /&gt;
*Save &amp;amp; Close&lt;br /&gt;
*Save &amp;amp; New&lt;br /&gt;
*Save as Copy&lt;br /&gt;
*Expired session will return to the page you were on then you got logged out (can be hit and miss)&lt;br /&gt;
*Most search filters allow you to search for a record id via [ id:123 ]&lt;br /&gt;
*&amp;quot;Parameters&amp;quot; are now referred to as &amp;quot;Options&amp;quot;&lt;br /&gt;
*Template Styles&lt;br /&gt;
*Integrated Trash Management&lt;br /&gt;
*Consistent archive support for most content&lt;br /&gt;
*Extension Installer Improvements&lt;br /&gt;
&lt;br /&gt;
===Module Enhancements===&lt;br /&gt;
*Publish up and down&lt;br /&gt;
*Add option to display on all pages &amp;quot;except&amp;quot; selected&lt;br /&gt;
*Expanded Category System&lt;br /&gt;
*404 Page Redirection&lt;br /&gt;
*Better Menu Management&lt;br /&gt;
*Alternative layouts for content, modules and menus (taken from the home template)&lt;br /&gt;
&lt;br /&gt;
===New Templates===&lt;br /&gt;
*Atomic&lt;br /&gt;
*Beez2&lt;br /&gt;
*(Administrator) Bluestork (replaces Khephri)&lt;br /&gt;
*(Administrator) Hathor&lt;br /&gt;
*Legacy layer in Milkyway&lt;br /&gt;
*Backend supports layout overrides&lt;br /&gt;
*New Modules&lt;br /&gt;
*New Plugins&lt;br /&gt;
*Content Languages&lt;br /&gt;
*User Login Permissions&lt;br /&gt;
*Activate selected users from the user list now (and filter)&lt;br /&gt;
*Administrator registration approval&lt;br /&gt;
*Polls component removed&lt;br /&gt;
*New codemirror editor&lt;br /&gt;
&lt;br /&gt;
===SEO Improvements===&lt;br /&gt;
*Meta decription and keywords for categories&lt;br /&gt;
*Articles can change the page title and page header separately&lt;br /&gt;
&lt;br /&gt;
===Global Configuration===&lt;br /&gt;
*Add site name to titles&lt;br /&gt;
*Default Access Level&lt;br /&gt;
*Set Metadata Language (buggy)&lt;br /&gt;
*Unicode Aliases&lt;br /&gt;
*Cookie domain and path&lt;br /&gt;
*User Setting moved to User Manager -&amp;gt; Options&lt;br /&gt;
*Media Settings moved to Media Manager -&amp;gt; Options&lt;br /&gt;
*Debug Modules - allows you to enabled to disable the tp=1 feature&lt;br /&gt;
*Server Timezone now a location, not an integer offset&lt;br /&gt;
*New Global Permissions tab&lt;br /&gt;
&lt;br /&gt;
===User Manager===&lt;br /&gt;
*Can activate a user from the list now&lt;br /&gt;
*User can be assigned to multiple groups&lt;br /&gt;
*Manage user groups&lt;br /&gt;
*Manager content access levels&lt;br /&gt;
&lt;br /&gt;
===Media Manager===&lt;br /&gt;
*Flash uploader fixed&lt;br /&gt;
&lt;br /&gt;
===Menu Manager===&lt;br /&gt;
====Menus List====&lt;br /&gt;
*Rebuild button to press when you brick the menu&lt;br /&gt;
*Clicking the menu name brings up the menu items list rather than going into Edit Menu. To edit the menu, click on the check box next to the name and click on the Edit icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
====Items List====&lt;br /&gt;
*Menus support the language filter&lt;br /&gt;
*Default now called Home&lt;br /&gt;
*Home is now clickable in the menu item list&lt;br /&gt;
*A separate home can be set for different languages&lt;br /&gt;
&lt;br /&gt;
=====New batch operations=====&lt;br /&gt;
*Set access level&lt;br /&gt;
*Copy or move to another part of this or another menu&lt;br /&gt;
&lt;br /&gt;
====Edit Item====&lt;br /&gt;
*Improved &amp;quot;Type&amp;quot; selector with human readable view and layout names&lt;br /&gt;
*Note field added&lt;br /&gt;
*New window target&lt;br /&gt;
*New Language assignment&lt;br /&gt;
*New Template style&lt;br /&gt;
*Ability to add &amp;amp; edit Module assignments from this page&lt;br /&gt;
&lt;br /&gt;
=====New options for the menu links and pages themselves=====&lt;br /&gt;
*Link title attribute&lt;br /&gt;
*Link CSS style&lt;br /&gt;
*Menu image is changed to a modal selector&lt;br /&gt;
*CSS class for page heading&lt;br /&gt;
*Page meta description&lt;br /&gt;
*Page meta keywords&lt;br /&gt;
*Robots options&lt;br /&gt;
&lt;br /&gt;
===Articles Manager===&lt;br /&gt;
*Frontpage is now referred to a Featured&lt;br /&gt;
*Article manager uses submenu to quickly skip between articles , categories and featured&lt;br /&gt;
*Sections and categories are now merged.&lt;br /&gt;
&lt;br /&gt;
====Articles List====&lt;br /&gt;
*&#039;&#039;&amp;quot;Missing move and copy; filter by author&amp;quot;&#039;&#039;&lt;br /&gt;
*New column to show language&lt;br /&gt;
*Filtering by language available&lt;br /&gt;
&lt;br /&gt;
====Article Edit====&lt;br /&gt;
*Created by user now selected by modal popup&lt;br /&gt;
*New ability to set the page title from the article&lt;br /&gt;
*Define create, delete, edit and publishing permissions&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
====Category List====&lt;br /&gt;
*Nested view&lt;br /&gt;
*Filtering on language&lt;br /&gt;
&lt;br /&gt;
====Edit Category====&lt;br /&gt;
*New note field&lt;br /&gt;
*Section replaced with ability to assign a parent category&lt;br /&gt;
*Ability to assign content language&lt;br /&gt;
&lt;br /&gt;
=====New Options (not previously available in 1.5)=====&lt;br /&gt;
*Assign alternate layout&lt;br /&gt;
*Define create, delete, edit and publishing permissions&lt;br /&gt;
*Meta description&lt;br /&gt;
*Meta keywords&lt;br /&gt;
*Alternative page title&lt;br /&gt;
*Meta author&lt;br /&gt;
*Meta robots&lt;br /&gt;
&lt;br /&gt;
===Banners===&lt;br /&gt;
====Banners list====&lt;br /&gt;
*** Missing copy toolbar button&lt;br /&gt;
*New archive toolbar button&lt;br /&gt;
*New columns to show meta keywords, purchase type and language&lt;br /&gt;
*New filtering by client and language &lt;br /&gt;
&lt;br /&gt;
====Edit Banner====&lt;br /&gt;
*New type toggle for Image or Custom (dynamically changes the available form fields)&lt;br /&gt;
*New alt text field for image&lt;br /&gt;
*New language field&lt;br /&gt;
&lt;br /&gt;
=====New Options=====&lt;br /&gt;
*Ability to set the created date&lt;br /&gt;
*Ability to set start and finish publishing times&lt;br /&gt;
*Ability to set the purchase type&lt;br /&gt;
*Ability to track impressions&lt;br /&gt;
*Ability to track clicks&lt;br /&gt;
*Use own prefix ?&lt;br /&gt;
*Tags renamed to meta &lt;br /&gt;
*Contacts&lt;br /&gt;
*Messaging&lt;br /&gt;
*Newsfeeds&lt;br /&gt;
*Search&lt;br /&gt;
*Weblinks&lt;br /&gt;
*Redirect&lt;br /&gt;
&lt;br /&gt;
===Extensions Manager===&lt;br /&gt;
====Discover====&lt;br /&gt;
*Module mgr&lt;br /&gt;
*Plugin Mgr&lt;br /&gt;
*Template Mgr&lt;br /&gt;
*Language mgr&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
*Auto create linked contact when creating new user ??&lt;br /&gt;
&lt;br /&gt;
==Access Controls==&lt;br /&gt;
*Introduction&lt;br /&gt;
*User Groups&lt;br /&gt;
*Access Levels&lt;br /&gt;
*Permission Layers&lt;br /&gt;
*How Permissions are Inherited&lt;br /&gt;
*How to debrick your site&lt;br /&gt;
&lt;br /&gt;
==Developers==&lt;br /&gt;
===Introduction===&lt;br /&gt;
*PHP 5.2.4+&lt;br /&gt;
*MySQL 5.0.4 (allows for wide varchars)&lt;br /&gt;
*IE7+, Firefox 3+, Safari 4+&lt;br /&gt;
*Focus on code consistency&lt;br /&gt;
*Focus on code reduction&lt;br /&gt;
&lt;br /&gt;
Usage of PHP Native Functions where possible, for example:&lt;br /&gt;
*[[JXMLElement]] extends the native [http://php.net/manual/en/book.simplexml.php SimpleXML] class&lt;br /&gt;
*[[JDate]] extends the [http://www.php.net/manual/en/class.datetime.php DateTime] class&lt;br /&gt;
*Native INI parser to load languages&lt;br /&gt;
&lt;br /&gt;
===Removed features===&lt;br /&gt;
*ADODB compatibility methods in database classes&lt;br /&gt;
*DOMIT (unsupported XML library)&lt;br /&gt;
*Legacy mode (includes global $mainframe, etc)&lt;br /&gt;
*JTemplate (based on patTemplate)&lt;br /&gt;
*patTemplate (templating engine)&lt;br /&gt;
*PDF support&lt;br /&gt;
*PEAR libraries (due to license incompatibilities)&lt;br /&gt;
*phpgacl&lt;br /&gt;
*PHP 4.0 and 5.0 compatibility files&lt;br /&gt;
*XStandard Editor&lt;br /&gt;
&lt;br /&gt;
===Deprecated Features===&lt;br /&gt;
*JController::_acoSection&lt;br /&gt;
*JController::_acoSectionValue&lt;br /&gt;
*JController::authorize()&lt;br /&gt;
*JController::setAccessControl()&lt;br /&gt;
*JDatabase::stderr()&lt;br /&gt;
*JDate::offest&lt;br /&gt;
*JDate::setOffset()&lt;br /&gt;
*JDate::toFormat() - use JDate::format() instead&lt;br /&gt;
*JException::toString()&lt;br /&gt;
*JFactory::getXMLParser()&lt;br /&gt;
*JHtmlGird::access()&lt;br /&gt;
*JHtmlImage::administrator - use JHtml::image instead&lt;br /&gt;
*JHtmlImage::site - use JHtml::image instead&lt;br /&gt;
*JHtmlList::accesslevel()&lt;br /&gt;
*JHtmlList::specificordering() - use JHtml::_(&#039;list.ordering&#039;)&lt;br /&gt;
*JHtmlList::category()&lt;br /&gt;
*JHtmlSelect::optgroup() - see JHtmlSelect::groupedList()&lt;br /&gt;
*JLanguage::_parseLanguageFiles - renamed to parseLanguageFiles&lt;br /&gt;
*JLanguage::_parseXMLLanguageFile - renamed to parseXMLLanguageFile&lt;br /&gt;
*JLanguage::_parseXMLLanguageFiles - renamed to parseXMLLanguageFiles&lt;br /&gt;
*JObject::toString - replaced with magic method&lt;br /&gt;
*JRegistry::getNameSpaces()&lt;br /&gt;
*JRegistry::getValue()&lt;br /&gt;
*JRegistry::makeNameSpace()&lt;br /&gt;
*JRegistry::setValue()&lt;br /&gt;
*JPane - See JHtmlSliders&lt;br /&gt;
*JParameter - replaced by JForm&lt;br /&gt;
*JSimpleXML, JSimpleXMLElement - Use JXMLElement instead, based on the native SimpleXMLElement&lt;br /&gt;
*JTable::canDelete() - models or controllers should be doing the access checks&lt;br /&gt;
*JTable::toXML()&lt;br /&gt;
*JToolbarHelper customX(), addNewX(), editListX(), editHtmlX(), editCssX(), deleteListX()&lt;br /&gt;
*JUser::authorize() - Use JUser::authorise()&lt;br /&gt;
*JUtility::dump()&lt;br /&gt;
*JUtility::array_unshift_ref() - Not needed in PHP 5&lt;br /&gt;
*JUtility::getHash() - Use JApplication::getHash()&lt;br /&gt;
*JUtility::getToken() - Use JFactory::getSession()-&amp;gt;getFormToken()&lt;br /&gt;
*JUtility::isWinOS() - Use JApplication::isWinOS()&lt;br /&gt;
*JUtility::return_bytes() - See InstallerModelWarnings::return_bytes()&lt;br /&gt;
*JUtility::sendMail() - Use JFactory::getMailer()-&amp;gt;sendMail()&lt;br /&gt;
*JUtility::sendAdminMail() - Use JFactory::getMailer()-&amp;gt;sendMail()&lt;br /&gt;
*JXMLElement::data() - Provided for backward compatibility&lt;br /&gt;
*JXMLElement::getAttribute() - Provided for backward compatibility&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
*JTable now automatically looks up the fields from the database schema&lt;br /&gt;
*New JDatabaseQuery - A chained CRUD query builder&lt;br /&gt;
*New JDatabase::getNextRow&lt;br /&gt;
*New JDatabase::getNextObject&lt;br /&gt;
*JDatabase::loadAssocList  - Now takes a second argument to just return the value of a column&lt;br /&gt;
*JDatabase::setQuery  - Added chaining support&lt;br /&gt;
&lt;br /&gt;
====Important Schema Changes====&lt;br /&gt;
*New jos_extensions table to list all extensions&lt;br /&gt;
*Components table information moved and split between jos_extensions and jos_menu (special menu called _adminmenu)&lt;br /&gt;
&lt;br /&gt;
The old phpgacl (jos_core_acl*) and jos_groups tables have been reworked into:&lt;br /&gt;
*jos_assets&lt;br /&gt;
*jos_user_usergroup_map&lt;br /&gt;
*jos_usergroups&lt;br /&gt;
*jos_viewlevels&lt;br /&gt;
*Archived state changed from a value of -1 to +2&lt;br /&gt;
&lt;br /&gt;
===Improved MVC===&lt;br /&gt;
====Models====&lt;br /&gt;
*JModelList&lt;br /&gt;
*JModelForm&lt;br /&gt;
*JModelAdmin&lt;br /&gt;
*Format handling (eg JSON)&lt;br /&gt;
*Sub-controller handling&lt;br /&gt;
&lt;br /&gt;
====Controllers====&lt;br /&gt;
*JControllerForm&lt;br /&gt;
*JControllerAdmin&lt;br /&gt;
*JController::setMessage takes second arg to set the message type&lt;br /&gt;
*JController can set the default view&lt;br /&gt;
*Added chaining support to several JController methods&lt;br /&gt;
&lt;br /&gt;
====Views====&lt;br /&gt;
*Semantic core output&lt;br /&gt;
*Milkyway legacy layouts&lt;br /&gt;
*The old component parameters are not automatically added to the menu anymore. You need to explicitly put them in the layout XML files.&lt;br /&gt;
*The menu manager will now detect additional layouts for a given view in the default template.&lt;br /&gt;
&lt;br /&gt;
===Form API===&lt;br /&gt;
====Event manipulation====&lt;br /&gt;
*onContentPrepareForm&lt;br /&gt;
*onContentPrepareFormData&lt;br /&gt;
&lt;br /&gt;
===Translation and Language Support===&lt;br /&gt;
*Support for unicode slugs, eg, SEF URL&#039;s with Greek characters&lt;br /&gt;
*3-letter languages now supported, xxx-XX&lt;br /&gt;
*All existing language keys have been refactored&lt;br /&gt;
&lt;br /&gt;
====INI files must validate====&lt;br /&gt;
*Upper case key with no spaces, alphanumeric characters and underscores&lt;br /&gt;
*Quoted values&lt;br /&gt;
*Double quotes within literal strings must use _QQ_ in the form KEY=&amp;quot;&amp;lt;a href=&amp;quot;_QQ_&amp;quot;index.php&amp;quot;_QQ_&amp;quot;&amp;gt;Click&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Javascript translation layer====&lt;br /&gt;
*See the flash uploader script for an example&lt;br /&gt;
Local extension language files&lt;br /&gt;
&lt;br /&gt;
====Language file API====&lt;br /&gt;
*Pluralisation support&lt;br /&gt;
*Transliteration support for ASCII or Unicode slugs&lt;br /&gt;
*Ignore Search Words&lt;br /&gt;
*Minimum search word length&lt;br /&gt;
*Custom language overrides&lt;br /&gt;
*System language file to support administrator menu and installation (.sys.ini)&lt;br /&gt;
&lt;br /&gt;
====Language switcher====&lt;br /&gt;
*Language Filter plugin enables language switching&lt;br /&gt;
*Sets the automatic filtering via JFactory::getApplication()-&amp;gt;setLanguageFilter(true)&lt;br /&gt;
*A frontend component with language support would test JFactory::getApplication()-&amp;gt;getLanguageFilter(), which returns the selected language code from the Languages Module&lt;br /&gt;
*The language field can be a language code for a single language, or &amp;quot;*&amp;quot; to be displayed for all languages&lt;br /&gt;
*Community extension for language maintenance com_localise&lt;br /&gt;
&lt;br /&gt;
===Extension management===&lt;br /&gt;
====New installation types====&lt;br /&gt;
=====Libraries=====&lt;br /&gt;
*Must include an XML manifest where type=&amp;quot;library&amp;quot;&lt;br /&gt;
*Can only be installed into a sub-folder of /libraries/&lt;br /&gt;
*Can extend parts of an existing library, eg /libraries/joomla/database/database/oracle.php&lt;br /&gt;
&lt;br /&gt;
=====Packages multi-installer=====&lt;br /&gt;
*Must include an XML manifest where type=&amp;quot;package&amp;quot;&lt;br /&gt;
*A package is a zip of zip&#039;s&lt;br /&gt;
&lt;br /&gt;
New install script can be provided with 5 methods:&lt;br /&gt;
=====preflight=====&lt;br /&gt;
*Runs before anything is run and while the extracted files are in the uploaded temp folder&lt;br /&gt;
&lt;br /&gt;
======Could allow for:======&lt;br /&gt;
*secondary extraction of custom zip&#039;s&lt;br /&gt;
*version checks to be performed&lt;br /&gt;
*halting the installer on an error&lt;br /&gt;
&lt;br /&gt;
=====install / update=====&lt;br /&gt;
*Runs after the database scripts are executed&lt;br /&gt;
*If the extension is new, the install method is run&lt;br /&gt;
*If the extension exists then update method is run if method=&amp;quot;upgrade&amp;quot;, otherwise assumes that the extension is not meant to be upgradable&lt;br /&gt;
&lt;br /&gt;
=====postflight=====&lt;br /&gt;
*Runs after the extension is registered in the database&lt;br /&gt;
*Is not run for the uninstall process (nothing left to do obviously)&lt;br /&gt;
&lt;br /&gt;
====Discover====&lt;br /&gt;
*Does not do any file copying, only works with what it finds&lt;br /&gt;
*Performs preflight, install and postflight&lt;br /&gt;
*Developer of installer has two language files??&lt;br /&gt;
&lt;br /&gt;
====Update site====&lt;br /&gt;
*Can publish an XML manifest on your site that can include individual extensions and extension sets.&lt;br /&gt;
&lt;br /&gt;
====XML Manifest Changes====&lt;br /&gt;
*&amp;lt;install&amp;gt; is deprecated - use &amp;lt;extension&amp;gt;&lt;br /&gt;
*New &amp;lt;update&amp;gt; tag. Takes a &amp;lt;schemas&amp;gt; tag which can define &amp;lt;schemapath&amp;gt;&lt;br /&gt;
*&amp;lt;params&amp;gt; and &amp;lt;param&amp;gt; tags are deprecated, use &amp;lt;fields&amp;gt;, &amp;lt;fieldsets&amp;gt; and &amp;lt;field&amp;gt; instead&lt;br /&gt;
&lt;br /&gt;
====File changes====&lt;br /&gt;
*Installation manifest must be the same name as the extension, eg com_foobar/foobar.xml  This helps with discovery (otherwise the function has to go through all the files in the extension folder&lt;br /&gt;
*Plugins are now in folders like modules and components&lt;br /&gt;
*See SVN/tests/_data/installer_packages/ for complete examples of all extensions and manifests.&lt;br /&gt;
*The method=&amp;quot;upgrade&amp;quot; will compare individual files in the original and incoming manifests and will remove files as appropriate.  However, it will not remove differences in the &amp;lt;folder&amp;gt; tags.&lt;br /&gt;
*Future support for rollback&lt;br /&gt;
&lt;br /&gt;
===Events===&lt;br /&gt;
====New Events====&lt;br /&gt;
*onBeforeRender&lt;br /&gt;
*onContentBeforeDelete&lt;br /&gt;
*onContentAfterDelete&lt;br /&gt;
*onContentChangeState&lt;br /&gt;
*onContentPrepareForm&lt;br /&gt;
*onContentPrepareFormData&lt;br /&gt;
*onExtensionBeforeInstall&lt;br /&gt;
*onExtensionBeforeUpdate&lt;br /&gt;
*onExtensionBeforeUninstall&lt;br /&gt;
*onExtensionAfterInstall&lt;br /&gt;
*onExtensionAfterUpdate&lt;br /&gt;
*onExtensionAfterUninstall&lt;br /&gt;
&lt;br /&gt;
====Renamed Events====&lt;br /&gt;
*onContentAfterSave&lt;br /&gt;
*onContentAfterTitle&lt;br /&gt;
*onContentAfterDisplay&lt;br /&gt;
*onContentBeforeDisplay&lt;br /&gt;
*onContentBeforeSave&lt;br /&gt;
*onContentSearch&lt;br /&gt;
*onContentSearchAreas&lt;br /&gt;
*onUserAuthenticate&lt;br /&gt;
*onUserAfterDelete&lt;br /&gt;
*onUserAfterSave&lt;br /&gt;
*onUserBeforeDelete&lt;br /&gt;
*onUserBeforeSave&lt;br /&gt;
*onUserLogin&lt;br /&gt;
*onUserLogout&lt;br /&gt;
*All content events (except for search and search areas) now pass a &#039;context&#039; as the first argument to alert the plugin as to what type of content is being passed.  The plugin event may or may not heed this context.&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
*Component can provide custom options for its own categories via optional category.xml&lt;br /&gt;
*Supported via JTableNested&lt;br /&gt;
&lt;br /&gt;
===Access Controls===&lt;br /&gt;
*A thing that can be controlled by permissions is registered in the assets table&lt;br /&gt;
*JTable handles this transparently via asset_id field&lt;br /&gt;
*For view permissions, support is as simple as adding&lt;br /&gt;
:::$user = JFactory::getUser();&lt;br /&gt;
:::$groups = implode(&#039;,&#039;, $user-&amp;gt;authorisedLevels());&lt;br /&gt;
:::$query-&amp;gt;where(&#039;a.access IN (&#039; . $groups . &#039;)&#039;);&lt;br /&gt;
&lt;br /&gt;
For action permissions, same format as in 1.5:&lt;br /&gt;
$user-&amp;gt;authorise($actionName, $assetName)&lt;br /&gt;
*OpenID library moved to plugin folder&lt;br /&gt;
*Geshi library moved to plugin folder&lt;br /&gt;
*JRegistry notes defaults to JSON (new format), dynamically converting existing data in INI format&lt;br /&gt;
*New JStream&lt;br /&gt;
*New JApplicationHelper::getComponentName&lt;br /&gt;
*Core icons moved to /media/&lt;br /&gt;
*Backward incompatible change to JEditor::display&lt;br /&gt;
*Added chaining support to JMail&lt;br /&gt;
*JFilterInput can no longer be called statically&lt;br /&gt;
*JHtml::image now supports relative paths&lt;br /&gt;
*All system images are overridable in the default template&lt;br /&gt;
*New JHtmlString&lt;br /&gt;
*Added wincache session handler for IIS&lt;br /&gt;
*New JFilterOutput::stripImages&lt;br /&gt;
*JPath::check takes second arg for separator (to pass to JPath::clean)&lt;br /&gt;
*Expanded configuration support through config.xml (multiple tabs)&lt;br /&gt;
&lt;br /&gt;
====Core actions====&lt;br /&gt;
*core.login.site&lt;br /&gt;
*core.login.admin&lt;br /&gt;
*core.admin&lt;br /&gt;
*core.manage&lt;br /&gt;
*core.create&lt;br /&gt;
*core.edit&lt;br /&gt;
*core.edit.state&lt;br /&gt;
*core.delete&lt;br /&gt;
*Miscellaneous changes&lt;br /&gt;
&lt;br /&gt;
===Debug Plugin===&lt;br /&gt;
*More tools for assisting with translation&lt;br /&gt;
&lt;br /&gt;
===Mootools 1.2/1.3===&lt;br /&gt;
*Need to use document.id instead of $&lt;br /&gt;
&lt;br /&gt;
==Cache changes ==&lt;br /&gt;
===API changes relevant to 3rd party developers===&lt;br /&gt;
====Component view cache==== &lt;br /&gt;
&lt;br /&gt;
Component view cache now takes an array of url parameters and their types to create Cacheid. This is a replacement for a previous unsafe way which took the whole URL for this and so opened the doors for DOS attacks via random url parameters added to request URL&#039;s. &lt;br /&gt;
&lt;br /&gt;
Com_contact example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$safeurlparams = array(&lt;br /&gt;
    &#039;id&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;catid&#039;=&amp;gt;&#039;INT&#039;, &#039;limit&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;limitstart&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;filter_order&#039;=&amp;gt;&#039;CMD&#039;, &lt;br /&gt;
    &#039;filter_order_Dir&#039;=&amp;gt;&#039;CMD&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
parent::display($cachable,$safeurlparams);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Old cacheid created from URL was retained for backwards compatibility and takes effect if there are no $safeurlparams.&lt;br /&gt;
&lt;br /&gt;
====Module cache====&lt;br /&gt;
This has been completly reconceptualized. Module cache now has 5 different modes of operation, 3 of them are to be set from module XML file, while 2 are meant to be used from within the module itself. Default is backwards compatible oldstatic mode that requires no changes to a module. &lt;br /&gt;
&lt;br /&gt;
Modes to be set in XML: &lt;br /&gt;
*&#039;&#039;&#039;static&#039;&#039;&#039; - one cache file for all pages with the same module parameters &lt;br /&gt;
*&#039;&#039;&#039;oldstatic&#039;&#039;&#039; - 1.5. definition of module caching, one cache file for all pages with the same module id and user aid. Default for backwards compatibility &lt;br /&gt;
*&#039;&#039;&#039;itemid&#039;&#039;&#039; - changes on itemid change &lt;br /&gt;
&lt;br /&gt;
In addition to cache field that was required in 1.5 there is now another hidden field called cachemode that sets any of the above modes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;cachemode&amp;quot; type=&amp;quot;hidden&amp;quot; label=&amp;quot;&amp;quot; default=&amp;quot;static&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;option value=&amp;quot;static&amp;quot;&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modes to be called from inside the module: &lt;br /&gt;
*&#039;&#039;&#039;safeuri&#039;&#039;&#039; - id is created from $cacheparams-&amp;gt;modeparams array, the same as in component view cache &lt;br /&gt;
*&#039;&#039;&#039;id&#039;&#039;&#039; - module sets own cache id&#039;s &lt;br /&gt;
&lt;br /&gt;
To use this modes one must rename cache field in xml to owncache field and call JModuleHelper::ModuleCache from within the module&#039;s main php file. This is actually a shortcut to cache callback to avoid code duplication in every module. &lt;br /&gt;
&lt;br /&gt;
An example that uses safeuri mode and replaces uncached&lt;br /&gt;
$list = modRelatedItemsHelper::getList($params) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$cacheparams = new stdClass; &lt;br /&gt;
$cacheparams-&amp;gt;cachemode = &#039;safeuri&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;class = &#039;modRelatedItemsHelper&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;method = &#039;getList&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;methodparams = $params; &lt;br /&gt;
$cacheparams-&amp;gt;modeparams = array(&#039;id&#039;=&amp;gt;&#039;int&#039;,&#039;Itemid&#039;=&amp;gt;&#039;int&#039;); &lt;br /&gt;
$list = JModuleHelper::ModuleCache ($module, $params, $cacheparams);&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
====Functional changes==== &lt;br /&gt;
&#039;&#039;&#039;Cache administration (Clean cache, Purge cache) now works with all drivers&#039;&#039;&#039;, not only with file cache. &lt;br /&gt;
&#039;&#039;&#039;New standalone garbage collect script&#039;&#039;&#039; that is to be called from crontab has been added. It can be found in libraries/joomla/utilities/garbagecron.php . For safety reasons it is recommended that it is renamed to something unique.&lt;br /&gt;
&lt;br /&gt;
====CMS and framework level functional changes==== &lt;br /&gt;
&#039;&#039;&#039;Caching is implemented in all components and modules&#039;&#039;&#039; that can potentially gain from cache.&lt;br /&gt;
Caching has also been added to some most expensive and frequent framework calls JComponentHelper::_load(), JModuleHelper::_load(),JMenuSite::load(); &lt;br /&gt;
&lt;br /&gt;
====Cache library changes====&lt;br /&gt;
Cache library has been completely refactored. &lt;br /&gt;
*Cache &#039;&#039;&#039;handlers have been renamed to controllers&#039;&#039;&#039; to better reflect their role and avoid confusion with cache storage handlers (referred to as drivers in following text). &lt;br /&gt;
*&#039;&#039;&#039;New JCacheController&#039;&#039;&#039; parent class has been added and inheritance has been changed to prevent bugs occurring from controller&#039;s and storage handler&#039;s get method clashes. &lt;br /&gt;
&lt;br /&gt;
====JCache==== &lt;br /&gt;
*&#039;&#039;&#039;getAll()&#039;&#039;&#039; method was added to JCache, JCacheStorage and all drivers, and it returns all cached items (this was previously possible only with file driver and hardcoded in administration) &lt;br /&gt;
*New &#039;&#039;&#039;lock and unlock&#039;&#039;&#039; methods were added to JCache, JCacheStorage and drivers. They enable cache item locking and unlocking to prevent errors on parallel accesses and double saves. This functionally was also implemented in controllers. &lt;br /&gt;
*Workarounds are now consolidated in new &#039;&#039;&#039;JCache getWorkarounds and setWorkarounds&#039;&#039;&#039; methods, are now used by all controllers and their use has been made optional. &lt;br /&gt;
*New makeId() method in JCache that creates cache id from registered url parameters set by components and system plugins&lt;br /&gt;
&lt;br /&gt;
====JCacheController==== &lt;br /&gt;
New parent class to Controllers that also functions as an intermediate to JCache. There is no JObject inheritance as otherwise magic __call doesn&#039;t work. &lt;br /&gt;
Change was needed to prevent bugs occurring from controller&#039;s and storage handler&#039;s get method clashes. They could be renamed but this would break backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
====JCacheStorage==== &lt;br /&gt;
*_getCacheId method was moved from drivers to their parent JCacheStorage and all drives now use the same method by default &lt;br /&gt;
*CacheItem was moved from cache admin to framework JCacheStorageHelper , it is used by getAll &lt;br /&gt;
*There are new cachelite and wincache drivers. All other drivers have been fixed with missing functions (gc, clean) added, their code cleaned and tested they should be now working properly. &lt;br /&gt;
*Replaced separate _expire files in filecache driver with timestamps (this should amount to cca. 40% speed gain). The same in all drivers that had this. &lt;br /&gt;
*Numerous bugfixes on all levels, most important is proper use of options defaulting to configuration parameters settings and correctly passing from level to level. &lt;br /&gt;
&lt;br /&gt;
====Other framework level changes==== &lt;br /&gt;
*Safe url parameters registration added to JControler view method. &lt;br /&gt;
*New ModuleCache method in JModuleHelper that performs the above described module cache (in 5 modes) for both, modules and module renderer. &lt;br /&gt;
*JFactory::getFeedParser has been changed to use Joomla caching instead of simplepie&#039;s.&lt;br /&gt;
&lt;br /&gt;
==Performance==&lt;br /&gt;
===Eliminate the usage of JTable for general browsing on the frontend===&lt;br /&gt;
*Session drops the usage of JTable&lt;br /&gt;
*Item views use a dedicated question, not JTable-&amp;gt;load&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
*Still Mootools 1.2. Will be upgrading to 1.3 during the beta process.&lt;br /&gt;
*Scaling issues to address&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
===Releases===&lt;br /&gt;
*Alpha 1: 22 June 2009&lt;br /&gt;
*Alpha 2: 25 October 2009&lt;br /&gt;
*Beta 1: 18 May 2010&lt;br /&gt;
*Beta 2: 2 weeks after Beta 1&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=J2.5:What%27s_new_in_Joomla_2.5&amp;diff=27910</id>
		<title>J2.5:What&#039;s new in Joomla 2.5</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=J2.5:What%27s_new_in_Joomla_2.5&amp;diff=27910"/>
		<updated>2010-05-22T21:33:20Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Functional changes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lots of things.&lt;br /&gt;
&lt;br /&gt;
...and:&lt;br /&gt;
* &#039;&#039;&#039;New Access Control System&#039;&#039;&#039; - Allows site administrators control over who can view and manage content.&lt;br /&gt;
* &#039;&#039;&#039;Unlimited Depth Organizational Model&#039;&#039;&#039; - Gives site administrators and content creators user-defined category levels that allow for the creation of a category tree with as many or as few levels for organizing articles and other content as needed.&lt;br /&gt;
* &#039;&#039;&#039;One-Click Extension Updates&#039;&#039;&#039; - Allows users to keep sites secure and controlled by simplifying the process of updating extensions.&lt;br /&gt;
* &#039;&#039;&#039;Semantic XHTML Layouts&#039;&#039;&#039; - Provides a better baseline for content presentation.&lt;br /&gt;
&lt;br /&gt;
...and:&lt;br /&gt;
&lt;br /&gt;
==Administrators==&lt;br /&gt;
===Introduction===&lt;br /&gt;
*Consistent UI&lt;br /&gt;
*Consistent Features&lt;br /&gt;
*Richer sample data&lt;br /&gt;
*IE 7+, Firefox 3.x, Safari 4.x&lt;br /&gt;
*PHP 5.2.4+&lt;br /&gt;
*MySQL 5.0.4 (allows for wide varchars)&lt;br /&gt;
&lt;br /&gt;
===Administrator===&lt;br /&gt;
*Menu Changes&lt;br /&gt;
*Submenu consistency&lt;br /&gt;
&lt;br /&gt;
====Toolbar Features====&lt;br /&gt;
*Save&lt;br /&gt;
*Save &amp;amp; Close&lt;br /&gt;
*Save &amp;amp; New&lt;br /&gt;
*Save as Copy&lt;br /&gt;
*Expired session will return to the page you were on then you got logged out (can be hit and miss)&lt;br /&gt;
*Most search filters allow you to search for a record id via [ id:123 ]&lt;br /&gt;
*&amp;quot;Parameters&amp;quot; are now referred to as &amp;quot;Options&amp;quot;&lt;br /&gt;
*Template Styles&lt;br /&gt;
*Integrated Trash Management&lt;br /&gt;
*Consistent archive support for most content&lt;br /&gt;
*Extension Installer Improvements&lt;br /&gt;
&lt;br /&gt;
===Module Enhancements===&lt;br /&gt;
*Publish up and down&lt;br /&gt;
*Add option to display on all pages &amp;quot;except&amp;quot; selected&lt;br /&gt;
*Expanded Category System&lt;br /&gt;
*404 Page Redirection&lt;br /&gt;
*Better Menu Management&lt;br /&gt;
*Alternative layouts for content, modules and menus (taken from the home template)&lt;br /&gt;
&lt;br /&gt;
===New Templates===&lt;br /&gt;
*Atomic&lt;br /&gt;
*Beez2&lt;br /&gt;
*(Administrator) Bluestork (replaces Khephri)&lt;br /&gt;
*(Administrator) Hathor&lt;br /&gt;
*Legacy layer in Milkyway&lt;br /&gt;
*Backend supports layout overrides&lt;br /&gt;
*New Modules&lt;br /&gt;
*New Plugins&lt;br /&gt;
*Content Languages&lt;br /&gt;
*User Login Permissions&lt;br /&gt;
*Activate selected users from the user list now (and filter)&lt;br /&gt;
*Administrator registration approval&lt;br /&gt;
*Polls component removed&lt;br /&gt;
*New codemirror editor&lt;br /&gt;
&lt;br /&gt;
===SEO Improvements===&lt;br /&gt;
*Meta decription and keywords for categories&lt;br /&gt;
*Articles can change the page title and page header separately&lt;br /&gt;
&lt;br /&gt;
===Global Configuration===&lt;br /&gt;
*Add site name to titles&lt;br /&gt;
*Default Access Level&lt;br /&gt;
*Set Metadata Language (buggy)&lt;br /&gt;
*Unicode Aliases&lt;br /&gt;
*Cookie domain and path&lt;br /&gt;
*User Setting moved to User Manager -&amp;gt; Options&lt;br /&gt;
*Media Settings moved to Media Manager -&amp;gt; Options&lt;br /&gt;
*Debug Modules - allows you to enabled to disable the tp=1 feature&lt;br /&gt;
*Server Timezone now a location, not an integer offset&lt;br /&gt;
*New Global Permissions tab&lt;br /&gt;
&lt;br /&gt;
===User Manager===&lt;br /&gt;
*Can activate a user from the list now&lt;br /&gt;
*User can be assigned to multiple groups&lt;br /&gt;
*Manage user groups&lt;br /&gt;
*Manager content access levels&lt;br /&gt;
&lt;br /&gt;
===Media Manager===&lt;br /&gt;
*Flash uploader fixed&lt;br /&gt;
&lt;br /&gt;
===Menu Manager===&lt;br /&gt;
====Menus List====&lt;br /&gt;
*Rebuild button to press when you brick the menu&lt;br /&gt;
*Clicking the menu name brings up the menu items list rather than going into Edit Menu. To edit the menu, click on the check box next to the name and click on the Edit icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
====Items List====&lt;br /&gt;
*Menus support the language filter&lt;br /&gt;
*Default now called Home&lt;br /&gt;
*Home is now clickable in the menu item list&lt;br /&gt;
*A separate home can be set for different languages&lt;br /&gt;
&lt;br /&gt;
=====New batch operations=====&lt;br /&gt;
*Set access level&lt;br /&gt;
*Copy or move to another part of this or another menu&lt;br /&gt;
&lt;br /&gt;
====Edit Item====&lt;br /&gt;
*Improved &amp;quot;Type&amp;quot; selector with human readable view and layout names&lt;br /&gt;
*Note field added&lt;br /&gt;
*New window target&lt;br /&gt;
*New Language assignment&lt;br /&gt;
*New Template style&lt;br /&gt;
*Ability to add &amp;amp; edit Module assignments from this page&lt;br /&gt;
&lt;br /&gt;
=====New options for the menu links and pages themselves=====&lt;br /&gt;
*Link title attribute&lt;br /&gt;
*Link CSS style&lt;br /&gt;
*Menu image is changed to a modal selector&lt;br /&gt;
*CSS class for page heading&lt;br /&gt;
*Page meta description&lt;br /&gt;
*Page meta keywords&lt;br /&gt;
*Robots options&lt;br /&gt;
&lt;br /&gt;
===Articles Manager===&lt;br /&gt;
*Frontpage is now referred to a Featured&lt;br /&gt;
*Article manager uses submenu to quickly skip between articles , categories and featured&lt;br /&gt;
*Sections and categories are now merged.&lt;br /&gt;
&lt;br /&gt;
====Articles List====&lt;br /&gt;
*&#039;&#039;&amp;quot;Missing move and copy; filter by author&amp;quot;&#039;&#039;&lt;br /&gt;
*New column to show language&lt;br /&gt;
*Filtering by language available&lt;br /&gt;
&lt;br /&gt;
====Article Edit====&lt;br /&gt;
*Created by user now selected by modal popup&lt;br /&gt;
*New ability to set the page title from the article&lt;br /&gt;
*Define create, delete, edit and publishing permissions&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
====Category List====&lt;br /&gt;
*Nested view&lt;br /&gt;
*Filtering on language&lt;br /&gt;
&lt;br /&gt;
====Edit Category====&lt;br /&gt;
*New note field&lt;br /&gt;
*Section replaced with ability to assign a parent category&lt;br /&gt;
*Ability to assign content language&lt;br /&gt;
&lt;br /&gt;
=====New Options (not previously available in 1.5)=====&lt;br /&gt;
*Assign alternate layout&lt;br /&gt;
*Define create, delete, edit and publishing permissions&lt;br /&gt;
*Meta description&lt;br /&gt;
*Meta keywords&lt;br /&gt;
*Alternative page title&lt;br /&gt;
*Meta author&lt;br /&gt;
*Meta robots&lt;br /&gt;
&lt;br /&gt;
===Banners===&lt;br /&gt;
====Banners list====&lt;br /&gt;
*** Missing copy toolbar button&lt;br /&gt;
*New archive toolbar button&lt;br /&gt;
*New columns to show meta keywords, purchase type and language&lt;br /&gt;
*New filtering by client and language &lt;br /&gt;
&lt;br /&gt;
====Edit Banner====&lt;br /&gt;
*New type toggle for Image or Custom (dynamically changes the available form fields)&lt;br /&gt;
*New alt text field for image&lt;br /&gt;
*New language field&lt;br /&gt;
&lt;br /&gt;
=====New Options=====&lt;br /&gt;
*Ability to set the created date&lt;br /&gt;
*Ability to set start and finish publishing times&lt;br /&gt;
*Ability to set the purchase type&lt;br /&gt;
*Ability to track impressions&lt;br /&gt;
*Ability to track clicks&lt;br /&gt;
*Use own prefix ?&lt;br /&gt;
*Tags renamed to meta &lt;br /&gt;
*Contacts&lt;br /&gt;
*Messaging&lt;br /&gt;
*Newsfeeds&lt;br /&gt;
*Search&lt;br /&gt;
*Weblinks&lt;br /&gt;
*Redirect&lt;br /&gt;
&lt;br /&gt;
===Extensions Manager===&lt;br /&gt;
====Discover====&lt;br /&gt;
*Module mgr&lt;br /&gt;
*Plugin Mgr&lt;br /&gt;
*Template Mgr&lt;br /&gt;
*Language mgr&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
*Auto create linked contact when creating new user ??&lt;br /&gt;
&lt;br /&gt;
==Access Controls==&lt;br /&gt;
*Introduction&lt;br /&gt;
*User Groups&lt;br /&gt;
*Access Levels&lt;br /&gt;
*Permission Layers&lt;br /&gt;
*How Permissions are Inherited&lt;br /&gt;
*How to debrick your site&lt;br /&gt;
&lt;br /&gt;
==Developers==&lt;br /&gt;
===Introduction===&lt;br /&gt;
*PHP 5.2.4+&lt;br /&gt;
*MySQL 5.0.4 (allows for wide varchars)&lt;br /&gt;
*IE7+, Firefox 3+, Safari 4+&lt;br /&gt;
*Focus on code consistency&lt;br /&gt;
*Focus on code reduction&lt;br /&gt;
&lt;br /&gt;
Usage of PHP Native Functions where possible, for example:&lt;br /&gt;
*[[JXMLElement]] extends the native [http://php.net/manual/en/book.simplexml.php SimpleXML] class&lt;br /&gt;
*[[JDate]] extends the [http://www.php.net/manual/en/class.datetime.php DateTime] class&lt;br /&gt;
*Native INI parser to load languages&lt;br /&gt;
&lt;br /&gt;
===Removed features===&lt;br /&gt;
*ADODB compatibility methods in database classes&lt;br /&gt;
*DOMIT (unsupported XML library)&lt;br /&gt;
*Legacy mode (includes global $mainframe, etc)&lt;br /&gt;
*JTemplate (based on patTemplate)&lt;br /&gt;
*patTemplate (templating engine)&lt;br /&gt;
*PDF support&lt;br /&gt;
*PEAR libraries (due to license incompatibilities)&lt;br /&gt;
*phpgacl&lt;br /&gt;
*PHP 4.0 and 5.0 compatibility files&lt;br /&gt;
*XStandard Editor&lt;br /&gt;
&lt;br /&gt;
===Deprecated Features===&lt;br /&gt;
*JController::_acoSection&lt;br /&gt;
*JController::_acoSectionValue&lt;br /&gt;
*JController::authorize()&lt;br /&gt;
*JController::setAccessControl()&lt;br /&gt;
*JDatabase::stderr()&lt;br /&gt;
*JDate::offest&lt;br /&gt;
*JDate::setOffset()&lt;br /&gt;
*JDate::toFormat() - use JDate::format() instead&lt;br /&gt;
*JException::toString()&lt;br /&gt;
*JFactory::getXMLParser()&lt;br /&gt;
*JHtmlGird::access()&lt;br /&gt;
*JHtmlImage::administrator - use JHtml::image instead&lt;br /&gt;
*JHtmlImage::site - use JHtml::image instead&lt;br /&gt;
*JHtmlList::accesslevel()&lt;br /&gt;
*JHtmlList::specificordering() - use JHtml::_(&#039;list.ordering&#039;)&lt;br /&gt;
*JHtmlList::category()&lt;br /&gt;
*JHtmlSelect::optgroup() - see JHtmlSelect::groupedList()&lt;br /&gt;
*JLanguage::_parseLanguageFiles - renamed to parseLanguageFiles&lt;br /&gt;
*JLanguage::_parseXMLLanguageFile - renamed to parseXMLLanguageFile&lt;br /&gt;
*JLanguage::_parseXMLLanguageFiles - renamed to parseXMLLanguageFiles&lt;br /&gt;
*JObject::toString - replaced with magic method&lt;br /&gt;
*JRegistry::getNameSpaces()&lt;br /&gt;
*JRegistry::getValue()&lt;br /&gt;
*JRegistry::makeNameSpace()&lt;br /&gt;
*JRegistry::setValue()&lt;br /&gt;
*JPane - See JHtmlSliders&lt;br /&gt;
*JParameter - replaced by JForm&lt;br /&gt;
*JSimpleXML, JSimpleXMLElement - Use JXMLElement instead, based on the native SimpleXMLElement&lt;br /&gt;
*JTable::canDelete() - models or controllers should be doing the access checks&lt;br /&gt;
*JTable::toXML()&lt;br /&gt;
*JToolbarHelper customX(), addNewX(), editListX(), editHtmlX(), editCssX(), deleteListX()&lt;br /&gt;
*JUser::authorize() - Use JUser::authorise()&lt;br /&gt;
*JUtility::dump()&lt;br /&gt;
*JUtility::array_unshift_ref() - Not needed in PHP 5&lt;br /&gt;
*JUtility::getHash() - Use JApplication::getHash()&lt;br /&gt;
*JUtility::getToken() - Use JFactory::getSession()-&amp;gt;getFormToken()&lt;br /&gt;
*JUtility::isWinOS() - Use JApplication::isWinOS()&lt;br /&gt;
*JUtility::return_bytes() - See InstallerModelWarnings::return_bytes()&lt;br /&gt;
*JUtility::sendMail() - Use JFactory::getMailer()-&amp;gt;sendMail()&lt;br /&gt;
*JUtility::sendAdminMail() - Use JFactory::getMailer()-&amp;gt;sendMail()&lt;br /&gt;
*JXMLElement::data() - Provided for backward compatibility&lt;br /&gt;
*JXMLElement::getAttribute() - Provided for backward compatibility&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
*JTable now automatically looks up the fields from the database schema&lt;br /&gt;
*New JDatabaseQuery - A chained CRUD query builder&lt;br /&gt;
*New JDatabase::getNextRow&lt;br /&gt;
*New JDatabase::getNextObject&lt;br /&gt;
*JDatabase::loadAssocList  - Now takes a second argument to just return the value of a column&lt;br /&gt;
*JDatabase::setQuery  - Added chaining support&lt;br /&gt;
&lt;br /&gt;
====Important Schema Changes====&lt;br /&gt;
*New jos_extensions table to list all extensions&lt;br /&gt;
*Components table information moved and split between jos_extensions and jos_menu (special menu called _adminmenu)&lt;br /&gt;
&lt;br /&gt;
The old phpgacl (jos_core_acl*) and jos_groups tables have been reworked into:&lt;br /&gt;
*jos_assets&lt;br /&gt;
*jos_user_usergroup_map&lt;br /&gt;
*jos_usergroups&lt;br /&gt;
*jos_viewlevels&lt;br /&gt;
*Archived state changed from a value of -1 to +2&lt;br /&gt;
&lt;br /&gt;
===Improved MVC===&lt;br /&gt;
====Models====&lt;br /&gt;
*JModelList&lt;br /&gt;
*JModelForm&lt;br /&gt;
*JModelAdmin&lt;br /&gt;
*Format handling (eg JSON)&lt;br /&gt;
*Sub-controller handling&lt;br /&gt;
&lt;br /&gt;
====Controllers====&lt;br /&gt;
*JControllerForm&lt;br /&gt;
*JControllerAdmin&lt;br /&gt;
*JController::setMessage takes second arg to set the message type&lt;br /&gt;
*JController can set the default view&lt;br /&gt;
*Added chaining support to several JController methods&lt;br /&gt;
&lt;br /&gt;
====Views====&lt;br /&gt;
*Semantic core output&lt;br /&gt;
*Milkyway legacy layouts&lt;br /&gt;
*The old component parameters are not automatically added to the menu anymore. You need to explicitly put them in the layout XML files.&lt;br /&gt;
*The menu manager will now detect additional layouts for a given view in the default template.&lt;br /&gt;
&lt;br /&gt;
===Form API===&lt;br /&gt;
====Event manipulation====&lt;br /&gt;
*onContentPrepareForm&lt;br /&gt;
*onContentPrepareFormData&lt;br /&gt;
&lt;br /&gt;
===Translation and Language Support===&lt;br /&gt;
*Support for unicode slugs, eg, SEF URL&#039;s with Greek characters&lt;br /&gt;
*3-letter languages now supported, xxx-XX&lt;br /&gt;
*All existing language keys have been refactored&lt;br /&gt;
&lt;br /&gt;
====INI files must validate====&lt;br /&gt;
*Upper case key with no spaces, alphanumeric characters and underscores&lt;br /&gt;
*Quoted values&lt;br /&gt;
*Double quotes within literal strings must use _QQ_ in the form KEY=&amp;quot;&amp;lt;a href=&amp;quot;_QQ_&amp;quot;index.php&amp;quot;_QQ_&amp;quot;&amp;gt;Click&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Javascript translation layer====&lt;br /&gt;
*See the flash uploader script for an example&lt;br /&gt;
Local extension language files&lt;br /&gt;
&lt;br /&gt;
====Language file API====&lt;br /&gt;
*Pluralisation support&lt;br /&gt;
*Transliteration support for ASCII or Unicode slugs&lt;br /&gt;
*Ignore Search Words&lt;br /&gt;
*Minimum search word length&lt;br /&gt;
*Custom language overrides&lt;br /&gt;
*System language file to support administrator menu and installation (.sys.ini)&lt;br /&gt;
&lt;br /&gt;
====Language switcher====&lt;br /&gt;
*Language Filter plugin enables language switching&lt;br /&gt;
*Sets the automatic filtering via JFactory::getApplication()-&amp;gt;setLanguageFilter(true)&lt;br /&gt;
*A frontend component with language support would test JFactory::getApplication()-&amp;gt;getLanguageFilter(), which returns the selected language code from the Languages Module&lt;br /&gt;
*The language field can be a language code for a single language, or &amp;quot;*&amp;quot; to be displayed for all languages&lt;br /&gt;
*Community extension for language maintenance com_localise&lt;br /&gt;
&lt;br /&gt;
===Extension management===&lt;br /&gt;
====New installation types====&lt;br /&gt;
=====Libraries=====&lt;br /&gt;
*Must include an XML manifest where type=&amp;quot;library&amp;quot;&lt;br /&gt;
*Can only be installed into a sub-folder of /libraries/&lt;br /&gt;
*Can extend parts of an existing library, eg /libraries/joomla/database/database/oracle.php&lt;br /&gt;
&lt;br /&gt;
=====Packages multi-installer=====&lt;br /&gt;
*Must include an XML manifest where type=&amp;quot;package&amp;quot;&lt;br /&gt;
*A package is a zip of zip&#039;s&lt;br /&gt;
&lt;br /&gt;
New install script can be provided with 5 methods:&lt;br /&gt;
=====preflight=====&lt;br /&gt;
*Runs before anything is run and while the extracted files are in the uploaded temp folder&lt;br /&gt;
&lt;br /&gt;
======Could allow for:======&lt;br /&gt;
*secondary extraction of custom zip&#039;s&lt;br /&gt;
*version checks to be performed&lt;br /&gt;
*halting the installer on an error&lt;br /&gt;
&lt;br /&gt;
=====install / update=====&lt;br /&gt;
*Runs after the database scripts are executed&lt;br /&gt;
*If the extension is new, the install method is run&lt;br /&gt;
*If the extension exists then update method is run if method=&amp;quot;upgrade&amp;quot;, otherwise assumes that the extension is not meant to be upgradable&lt;br /&gt;
&lt;br /&gt;
=====postflight=====&lt;br /&gt;
*Runs after the extension is registered in the database&lt;br /&gt;
*Is not run for the uninstall process (nothing left to do obviously)&lt;br /&gt;
&lt;br /&gt;
====Discover====&lt;br /&gt;
*Does not do any file copying, only works with what it finds&lt;br /&gt;
*Performs preflight, install and postflight&lt;br /&gt;
*Developer of installer has two language files??&lt;br /&gt;
&lt;br /&gt;
====Update site====&lt;br /&gt;
*Can publish an XML manifest on your site that can include individual extensions and extension sets.&lt;br /&gt;
&lt;br /&gt;
====XML Manifest Changes====&lt;br /&gt;
*&amp;lt;install&amp;gt; is deprecated - use &amp;lt;extension&amp;gt;&lt;br /&gt;
*New &amp;lt;update&amp;gt; tag. Takes a &amp;lt;schemas&amp;gt; tag which can define &amp;lt;schemapath&amp;gt;&lt;br /&gt;
*&amp;lt;params&amp;gt; and &amp;lt;param&amp;gt; tags are deprecated, use &amp;lt;fields&amp;gt;, &amp;lt;fieldsets&amp;gt; and &amp;lt;field&amp;gt; instead&lt;br /&gt;
&lt;br /&gt;
====File changes====&lt;br /&gt;
*Installation manifest must be the same name as the extension, eg com_foobar/foobar.xml  This helps with discovery (otherwise the function has to go through all the files in the extension folder&lt;br /&gt;
*Plugins are now in folders like modules and components&lt;br /&gt;
*See SVN/tests/_data/installer_packages/ for complete examples of all extensions and manifests.&lt;br /&gt;
*The method=&amp;quot;upgrade&amp;quot; will compare individual files in the original and incoming manifests and will remove files as appropriate.  However, it will not remove differences in the &amp;lt;folder&amp;gt; tags.&lt;br /&gt;
*Future support for rollback&lt;br /&gt;
&lt;br /&gt;
===Events===&lt;br /&gt;
====New Events====&lt;br /&gt;
*onBeforeRender&lt;br /&gt;
*onContentBeforeDelete&lt;br /&gt;
*onContentAfterDelete&lt;br /&gt;
*onContentChangeState&lt;br /&gt;
*onContentPrepareForm&lt;br /&gt;
*onContentPrepareFormData&lt;br /&gt;
*onExtensionBeforeInstall&lt;br /&gt;
*onExtensionBeforeUpdate&lt;br /&gt;
*onExtensionBeforeUninstall&lt;br /&gt;
*onExtensionAfterInstall&lt;br /&gt;
*onExtensionAfterUpdate&lt;br /&gt;
*onExtensionAfterUninstall&lt;br /&gt;
&lt;br /&gt;
====Renamed Events====&lt;br /&gt;
*onContentAfterSave&lt;br /&gt;
*onContentAfterTitle&lt;br /&gt;
*onContentAfterDisplay&lt;br /&gt;
*onContentBeforeDisplay&lt;br /&gt;
*onContentBeforeSave&lt;br /&gt;
*onContentSearch&lt;br /&gt;
*onContentSearchAreas&lt;br /&gt;
*onUserAuthenticate&lt;br /&gt;
*onUserAfterDelete&lt;br /&gt;
*onUserAfterSave&lt;br /&gt;
*onUserBeforeDelete&lt;br /&gt;
*onUserBeforeSave&lt;br /&gt;
*onUserLogin&lt;br /&gt;
*onUserLogout&lt;br /&gt;
*All content events (except for search and search areas) now pass a &#039;context&#039; as the first argument to alert the plugin as to what type of content is being passed.  The plugin event may or may not heed this context.&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
*Component can provide custom options for its own categories via optional category.xml&lt;br /&gt;
*Supported via JTableNested&lt;br /&gt;
&lt;br /&gt;
===Access Controls===&lt;br /&gt;
*A thing that can be controlled by permissions is registered in the assets table&lt;br /&gt;
*JTable handles this transparently via asset_id field&lt;br /&gt;
*For view permissions, support is as simple as adding&lt;br /&gt;
:::$user = JFactory::getUser();&lt;br /&gt;
:::$groups = implode(&#039;,&#039;, $user-&amp;gt;authorisedLevels());&lt;br /&gt;
:::$query-&amp;gt;where(&#039;a.access IN (&#039; . $groups . &#039;)&#039;);&lt;br /&gt;
&lt;br /&gt;
For action permissions, same format as in 1.5:&lt;br /&gt;
$user-&amp;gt;authorise($actionName, $assetName)&lt;br /&gt;
*OpenID library moved to plugin folder&lt;br /&gt;
*Geshi library moved to plugin folder&lt;br /&gt;
*JRegistry notes defaults to JSON (new format), dynamically converting existing data in INI format&lt;br /&gt;
*New JStream&lt;br /&gt;
*New JApplicationHelper::getComponentName&lt;br /&gt;
*Core icons moved to /media/&lt;br /&gt;
*Backward incompatible change to JEditor::display&lt;br /&gt;
*Added chaining support to JMail&lt;br /&gt;
*JFilterInput can no longer be called statically&lt;br /&gt;
*JHtml::image now supports relative paths&lt;br /&gt;
*All system images are overridable in the default template&lt;br /&gt;
*New JHtmlString&lt;br /&gt;
*Added wincache session handler for IIS&lt;br /&gt;
*New JFilterOutput::stripImages&lt;br /&gt;
*JPath::check takes second arg for separator (to pass to JPath::clean)&lt;br /&gt;
*Expanded configuration support through config.xml (multiple tabs)&lt;br /&gt;
&lt;br /&gt;
====Core actions====&lt;br /&gt;
*core.login.site&lt;br /&gt;
*core.login.admin&lt;br /&gt;
*core.admin&lt;br /&gt;
*core.manage&lt;br /&gt;
*core.create&lt;br /&gt;
*core.edit&lt;br /&gt;
*core.edit.state&lt;br /&gt;
*core.delete&lt;br /&gt;
*Miscellaneous changes&lt;br /&gt;
&lt;br /&gt;
===Debug Plugin===&lt;br /&gt;
*More tools for assisting with translation&lt;br /&gt;
&lt;br /&gt;
===Mootools 1.2/1.3===&lt;br /&gt;
*Need to use document.id instead of $&lt;br /&gt;
&lt;br /&gt;
==Cache changes ==&lt;br /&gt;
===API changes relevant to 3rd party developers===&lt;br /&gt;
====Component view cache==== &lt;br /&gt;
&lt;br /&gt;
Component view cache now takes an array of url parameters and their types to create Cacheid. This is a replacement for a previous unsafe way which took the whole URL for this and so opened the doors for DOS attacks via random url parameters added to request URL&#039;s. &lt;br /&gt;
&lt;br /&gt;
Com_contact example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$safeurlparams = array(&lt;br /&gt;
    &#039;id&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;catid&#039;=&amp;gt;&#039;INT&#039;, &#039;limit&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;limitstart&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;filter_order&#039;=&amp;gt;&#039;CMD&#039;, &lt;br /&gt;
    &#039;filter_order_Dir&#039;=&amp;gt;&#039;CMD&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
parent::display($cachable,$safeurlparams);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Old cacheid created from URL was retained for backwards compatibility and takes effect if there are no $safeurlparams.&lt;br /&gt;
&lt;br /&gt;
====Module cache====&lt;br /&gt;
This has been completly reconceptualized. Module cache now has 5 different modes of operation, 3 of them are to be set from module XML file, while 2 are meant to be used from within the module itself. Default is backwards compatible oldstatic mode that requires no changes to a module. &lt;br /&gt;
&lt;br /&gt;
Modes to be set in XML: &lt;br /&gt;
*&#039;&#039;&#039;static&#039;&#039;&#039; - one cache file for all pages with the same module parameters &lt;br /&gt;
*&#039;&#039;&#039;oldstatic&#039;&#039;&#039; - 1.5. definition of module caching, one cache file for all pages with the same module id and user aid. Default for backwards compatibility &lt;br /&gt;
*&#039;&#039;&#039;itemid&#039;&#039;&#039; - changes on itemid change &lt;br /&gt;
&lt;br /&gt;
In addition to cache field that was required in 1.5 there is now another hidden field called cachemode that sets any of the above modes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;cachemode&amp;quot; type=&amp;quot;hidden&amp;quot; label=&amp;quot;&amp;quot; default=&amp;quot;static&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;option value=&amp;quot;static&amp;quot;&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modes to be called from inside the module: &lt;br /&gt;
*&#039;&#039;&#039;safeuri&#039;&#039;&#039; - id is created from $cacheparams-&amp;gt;modeparams array, the same as in component view cache &lt;br /&gt;
*&#039;&#039;&#039;id&#039;&#039;&#039; - module sets own cache id&#039;s &lt;br /&gt;
&lt;br /&gt;
To use this modes one must rename cache field in xml to owncache field and call JModuleHelper::ModuleCache from within the module&#039;s main php file. This is actually a shortcut to cache callback to avoid code duplication in every module. &lt;br /&gt;
&lt;br /&gt;
An example that uses safeuri mode and replaces uncached&lt;br /&gt;
$list = modRelatedItemsHelper::getList($params) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$cacheparams = new stdClass; &lt;br /&gt;
$cacheparams-&amp;gt;cachemode = &#039;safeuri&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;class = &#039;modRelatedItemsHelper&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;method = &#039;getList&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;methodparams = $params; &lt;br /&gt;
$cacheparams-&amp;gt;modeparams = array(&#039;id&#039;=&amp;gt;&#039;int&#039;,&#039;Itemid&#039;=&amp;gt;&#039;int&#039;); &lt;br /&gt;
$list = JModuleHelper::ModuleCache ($module, $params, $cacheparams);&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
====Functional changes==== &lt;br /&gt;
&#039;&#039;&#039;Cache administration (Clean cache, Purge cache) now works with all drivers&#039;&#039;&#039;, not only with file cache. &lt;br /&gt;
&#039;&#039;&#039;New standalone garbage collect script&#039;&#039;&#039; that is to be called from crontab has been added. It can be found in libraries/joomla/utilities/garbagecron.php . For safety reasons it is recommended that it is renamed to something unique.&lt;br /&gt;
&lt;br /&gt;
====CMS and framework level functional changes==== &lt;br /&gt;
&#039;&#039;&#039;Caching is implemented in all components and modules&#039;&#039;&#039; that can potentially gain from cache.&lt;br /&gt;
Caching has also been added to some most expensive and frequent framework calls JComponentHelper::_load(), JModuleHelper::_load(),JMenuSite::load(); &lt;br /&gt;
&lt;br /&gt;
====Cache library changes====&lt;br /&gt;
Cache library has been completely refactored. &lt;br /&gt;
*Cache &#039;&#039;&#039;handlers have been renamed to controllers&#039;&#039;&#039; to better reflect their role and avoid confusion with cache storage handlers (referred to as drivers in following text). &lt;br /&gt;
*&#039;&#039;&#039;New JCacheController&#039;&#039;&#039; parent class has been added and inheritance has been changed to prevent bugs occurring from controller&#039;s and storage handler&#039;s get method clashes. &lt;br /&gt;
&lt;br /&gt;
====JCache==== &lt;br /&gt;
*&#039;&#039;&#039;getAll()&#039;&#039;&#039; method was added to JCache ,JCacheStorage and all drivers and it returns all cached items (this was previously possible only with file driver and hardcoded in administration) &lt;br /&gt;
*New &#039;&#039;&#039;lock and unlock&#039;&#039;&#039; methods were added to JCache, JCacheStorage and drivers. They enable cache item locking and unlocking to prevent errors on parallel accesses and double saves. This functionally was also implemented in controllers. &lt;br /&gt;
*Workarounds are now consolidated in new &#039;&#039;&#039;JCache getWorkarounds and setWorkarounds&#039;&#039;&#039; methods, are now used by all controllers and their use has been made optional. &lt;br /&gt;
*New makeId() method in JCache that creates cache id from registered url parameters set by components and system plugins &lt;br /&gt;
&lt;br /&gt;
====JCacheController==== &lt;br /&gt;
New parent class to Controllers that also functions as an intermediate to JCache. There is no JObject inheritance as otherwise magic __call doesn&#039;t work. &lt;br /&gt;
Change was needed to prevent bugs occurring from controller&#039;s and storage handler&#039;s get method clashes. They could be renamed but this would break backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
====JCacheStorage==== &lt;br /&gt;
*_getCacheId method was moved from drivers to their parent JCacheStorage and all drives now use the same method by default &lt;br /&gt;
*CacheItem was moved from cache admin to framework JCacheStorageHelper , it is used by getAll &lt;br /&gt;
*There are new cachelite and wincache drivers. All other drivers have been fixed with missing functions (gc, clean) added, their code cleaned and tested they should be now working properly. &lt;br /&gt;
*Replaced separate _expire files in filecache driver with timestamps (this should amount to cca. 40% speed gain). The same in all drivers that had this. &lt;br /&gt;
*Numerous bugfixes on all levels, most important is proper use of options defaulting to configuration parameters settings and correctly passing from level to level. &lt;br /&gt;
&lt;br /&gt;
====Other framework level changes==== &lt;br /&gt;
*Safe url parameters registration added to JControler view method. &lt;br /&gt;
*New ModuleCache method in JModuleHelper that performs the above described module cache (in 5 modes) for both, modules and module renderer. &lt;br /&gt;
*JFactory::getFeedParser has been changed to use Joomla caching instead of simplepie&#039;s.&lt;br /&gt;
&lt;br /&gt;
==Performance==&lt;br /&gt;
===Eliminate the usage of JTable for general browsing on the frontend===&lt;br /&gt;
*Session drops the usage of JTable&lt;br /&gt;
*Item views use a dedicated question, not JTable-&amp;gt;load&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
*Still Mootools 1.2. Will be upgrading to 1.3 during the beta process.&lt;br /&gt;
*Scaling issues to address&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
===Releases===&lt;br /&gt;
*Alpha 1: 22 June 2009&lt;br /&gt;
*Alpha 2: 25 October 2009&lt;br /&gt;
*Beta 1: 18 May 2010&lt;br /&gt;
*Beta 2: 2 weeks after Beta 1&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=J2.5:What%27s_new_in_Joomla_2.5&amp;diff=27909</id>
		<title>J2.5:What&#039;s new in Joomla 2.5</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=J2.5:What%27s_new_in_Joomla_2.5&amp;diff=27909"/>
		<updated>2010-05-22T21:25:18Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Component view cache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lots of things.&lt;br /&gt;
&lt;br /&gt;
...and:&lt;br /&gt;
* &#039;&#039;&#039;New Access Control System&#039;&#039;&#039; - Allows site administrators control over who can view and manage content.&lt;br /&gt;
* &#039;&#039;&#039;Unlimited Depth Organizational Model&#039;&#039;&#039; - Gives site administrators and content creators user-defined category levels that allow for the creation of a category tree with as many or as few levels for organizing articles and other content as needed.&lt;br /&gt;
* &#039;&#039;&#039;One-Click Extension Updates&#039;&#039;&#039; - Allows users to keep sites secure and controlled by simplifying the process of updating extensions.&lt;br /&gt;
* &#039;&#039;&#039;Semantic XHTML Layouts&#039;&#039;&#039; - Provides a better baseline for content presentation.&lt;br /&gt;
&lt;br /&gt;
...and:&lt;br /&gt;
&lt;br /&gt;
==Administrators==&lt;br /&gt;
===Introduction===&lt;br /&gt;
*Consistent UI&lt;br /&gt;
*Consistent Features&lt;br /&gt;
*Richer sample data&lt;br /&gt;
*IE 7+, Firefox 3.x, Safari 4.x&lt;br /&gt;
*PHP 5.2.4+&lt;br /&gt;
*MySQL 5.0.4 (allows for wide varchars)&lt;br /&gt;
&lt;br /&gt;
===Administrator===&lt;br /&gt;
*Menu Changes&lt;br /&gt;
*Submenu consistency&lt;br /&gt;
&lt;br /&gt;
====Toolbar Features====&lt;br /&gt;
*Save&lt;br /&gt;
*Save &amp;amp; Close&lt;br /&gt;
*Save &amp;amp; New&lt;br /&gt;
*Save as Copy&lt;br /&gt;
*Expired session will return to the page you were on then you got logged out (can be hit and miss)&lt;br /&gt;
*Most search filters allow you to search for a record id via [ id:123 ]&lt;br /&gt;
*&amp;quot;Parameters&amp;quot; are now referred to as &amp;quot;Options&amp;quot;&lt;br /&gt;
*Template Styles&lt;br /&gt;
*Integrated Trash Management&lt;br /&gt;
*Consistent archive support for most content&lt;br /&gt;
*Extension Installer Improvements&lt;br /&gt;
&lt;br /&gt;
===Module Enhancements===&lt;br /&gt;
*Publish up and down&lt;br /&gt;
*Add option to display on all pages &amp;quot;except&amp;quot; selected&lt;br /&gt;
*Expanded Category System&lt;br /&gt;
*404 Page Redirection&lt;br /&gt;
*Better Menu Management&lt;br /&gt;
*Alternative layouts for content, modules and menus (taken from the home template)&lt;br /&gt;
&lt;br /&gt;
===New Templates===&lt;br /&gt;
*Atomic&lt;br /&gt;
*Beez2&lt;br /&gt;
*(Administrator) Bluestork (replaces Khephri)&lt;br /&gt;
*(Administrator) Hathor&lt;br /&gt;
*Legacy layer in Milkyway&lt;br /&gt;
*Backend supports layout overrides&lt;br /&gt;
*New Modules&lt;br /&gt;
*New Plugins&lt;br /&gt;
*Content Languages&lt;br /&gt;
*User Login Permissions&lt;br /&gt;
*Activate selected users from the user list now (and filter)&lt;br /&gt;
*Administrator registration approval&lt;br /&gt;
*Polls component removed&lt;br /&gt;
*New codemirror editor&lt;br /&gt;
&lt;br /&gt;
===SEO Improvements===&lt;br /&gt;
*Meta decription and keywords for categories&lt;br /&gt;
*Articles can change the page title and page header separately&lt;br /&gt;
&lt;br /&gt;
===Global Configuration===&lt;br /&gt;
*Add site name to titles&lt;br /&gt;
*Default Access Level&lt;br /&gt;
*Set Metadata Language (buggy)&lt;br /&gt;
*Unicode Aliases&lt;br /&gt;
*Cookie domain and path&lt;br /&gt;
*User Setting moved to User Manager -&amp;gt; Options&lt;br /&gt;
*Media Settings moved to Media Manager -&amp;gt; Options&lt;br /&gt;
*Debug Modules - allows you to enabled to disable the tp=1 feature&lt;br /&gt;
*Server Timezone now a location, not an integer offset&lt;br /&gt;
*New Global Permissions tab&lt;br /&gt;
&lt;br /&gt;
===User Manager===&lt;br /&gt;
*Can activate a user from the list now&lt;br /&gt;
*User can be assigned to multiple groups&lt;br /&gt;
*Manage user groups&lt;br /&gt;
*Manager content access levels&lt;br /&gt;
&lt;br /&gt;
===Media Manager===&lt;br /&gt;
*Flash uploader fixed&lt;br /&gt;
&lt;br /&gt;
===Menu Manager===&lt;br /&gt;
====Menus List====&lt;br /&gt;
*Rebuild button to press when you brick the menu&lt;br /&gt;
*Clicking the menu name brings up the menu items list rather than going into Edit Menu. To edit the menu, click on the check box next to the name and click on the Edit icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
====Items List====&lt;br /&gt;
*Menus support the language filter&lt;br /&gt;
*Default now called Home&lt;br /&gt;
*Home is now clickable in the menu item list&lt;br /&gt;
*A separate home can be set for different languages&lt;br /&gt;
&lt;br /&gt;
=====New batch operations=====&lt;br /&gt;
*Set access level&lt;br /&gt;
*Copy or move to another part of this or another menu&lt;br /&gt;
&lt;br /&gt;
====Edit Item====&lt;br /&gt;
*Improved &amp;quot;Type&amp;quot; selector with human readable view and layout names&lt;br /&gt;
*Note field added&lt;br /&gt;
*New window target&lt;br /&gt;
*New Language assignment&lt;br /&gt;
*New Template style&lt;br /&gt;
*Ability to add &amp;amp; edit Module assignments from this page&lt;br /&gt;
&lt;br /&gt;
=====New options for the menu links and pages themselves=====&lt;br /&gt;
*Link title attribute&lt;br /&gt;
*Link CSS style&lt;br /&gt;
*Menu image is changed to a modal selector&lt;br /&gt;
*CSS class for page heading&lt;br /&gt;
*Page meta description&lt;br /&gt;
*Page meta keywords&lt;br /&gt;
*Robots options&lt;br /&gt;
&lt;br /&gt;
===Articles Manager===&lt;br /&gt;
*Frontpage is now referred to a Featured&lt;br /&gt;
*Article manager uses submenu to quickly skip between articles , categories and featured&lt;br /&gt;
*Sections and categories are now merged.&lt;br /&gt;
&lt;br /&gt;
====Articles List====&lt;br /&gt;
*&#039;&#039;&amp;quot;Missing move and copy; filter by author&amp;quot;&#039;&#039;&lt;br /&gt;
*New column to show language&lt;br /&gt;
*Filtering by language available&lt;br /&gt;
&lt;br /&gt;
====Article Edit====&lt;br /&gt;
*Created by user now selected by modal popup&lt;br /&gt;
*New ability to set the page title from the article&lt;br /&gt;
*Define create, delete, edit and publishing permissions&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
====Category List====&lt;br /&gt;
*Nested view&lt;br /&gt;
*Filtering on language&lt;br /&gt;
&lt;br /&gt;
====Edit Category====&lt;br /&gt;
*New note field&lt;br /&gt;
*Section replaced with ability to assign a parent category&lt;br /&gt;
*Ability to assign content language&lt;br /&gt;
&lt;br /&gt;
=====New Options (not previously available in 1.5)=====&lt;br /&gt;
*Assign alternate layout&lt;br /&gt;
*Define create, delete, edit and publishing permissions&lt;br /&gt;
*Meta description&lt;br /&gt;
*Meta keywords&lt;br /&gt;
*Alternative page title&lt;br /&gt;
*Meta author&lt;br /&gt;
*Meta robots&lt;br /&gt;
&lt;br /&gt;
===Banners===&lt;br /&gt;
====Banners list====&lt;br /&gt;
*** Missing copy toolbar button&lt;br /&gt;
*New archive toolbar button&lt;br /&gt;
*New columns to show meta keywords, purchase type and language&lt;br /&gt;
*New filtering by client and language &lt;br /&gt;
&lt;br /&gt;
====Edit Banner====&lt;br /&gt;
*New type toggle for Image or Custom (dynamically changes the available form fields)&lt;br /&gt;
*New alt text field for image&lt;br /&gt;
*New language field&lt;br /&gt;
&lt;br /&gt;
=====New Options=====&lt;br /&gt;
*Ability to set the created date&lt;br /&gt;
*Ability to set start and finish publishing times&lt;br /&gt;
*Ability to set the purchase type&lt;br /&gt;
*Ability to track impressions&lt;br /&gt;
*Ability to track clicks&lt;br /&gt;
*Use own prefix ?&lt;br /&gt;
*Tags renamed to meta &lt;br /&gt;
*Contacts&lt;br /&gt;
*Messaging&lt;br /&gt;
*Newsfeeds&lt;br /&gt;
*Search&lt;br /&gt;
*Weblinks&lt;br /&gt;
*Redirect&lt;br /&gt;
&lt;br /&gt;
===Extensions Manager===&lt;br /&gt;
====Discover====&lt;br /&gt;
*Module mgr&lt;br /&gt;
*Plugin Mgr&lt;br /&gt;
*Template Mgr&lt;br /&gt;
*Language mgr&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
*Auto create linked contact when creating new user ??&lt;br /&gt;
&lt;br /&gt;
==Access Controls==&lt;br /&gt;
*Introduction&lt;br /&gt;
*User Groups&lt;br /&gt;
*Access Levels&lt;br /&gt;
*Permission Layers&lt;br /&gt;
*How Permissions are Inherited&lt;br /&gt;
*How to debrick your site&lt;br /&gt;
&lt;br /&gt;
==Developers==&lt;br /&gt;
===Introduction===&lt;br /&gt;
*PHP 5.2.4+&lt;br /&gt;
*MySQL 5.0.4 (allows for wide varchars)&lt;br /&gt;
*IE7+, Firefox 3+, Safari 4+&lt;br /&gt;
*Focus on code consistency&lt;br /&gt;
*Focus on code reduction&lt;br /&gt;
&lt;br /&gt;
Usage of PHP Native Functions where possible, for example:&lt;br /&gt;
*[[JXMLElement]] extends the native [http://php.net/manual/en/book.simplexml.php SimpleXML] class&lt;br /&gt;
*[[JDate]] extends the [http://www.php.net/manual/en/class.datetime.php DateTime] class&lt;br /&gt;
*Native INI parser to load languages&lt;br /&gt;
&lt;br /&gt;
===Removed features===&lt;br /&gt;
*ADODB compatibility methods in database classes&lt;br /&gt;
*DOMIT (unsupported XML library)&lt;br /&gt;
*Legacy mode (includes global $mainframe, etc)&lt;br /&gt;
*JTemplate (based on patTemplate)&lt;br /&gt;
*patTemplate (templating engine)&lt;br /&gt;
*PDF support&lt;br /&gt;
*PEAR libraries (due to license incompatibilities)&lt;br /&gt;
*phpgacl&lt;br /&gt;
*PHP 4.0 and 5.0 compatibility files&lt;br /&gt;
*XStandard Editor&lt;br /&gt;
&lt;br /&gt;
===Deprecated Features===&lt;br /&gt;
*JController::_acoSection&lt;br /&gt;
*JController::_acoSectionValue&lt;br /&gt;
*JController::authorize()&lt;br /&gt;
*JController::setAccessControl()&lt;br /&gt;
*JDatabase::stderr()&lt;br /&gt;
*JDate::offest&lt;br /&gt;
*JDate::setOffset()&lt;br /&gt;
*JDate::toFormat() - use JDate::format() instead&lt;br /&gt;
*JException::toString()&lt;br /&gt;
*JFactory::getXMLParser()&lt;br /&gt;
*JHtmlGird::access()&lt;br /&gt;
*JHtmlImage::administrator - use JHtml::image instead&lt;br /&gt;
*JHtmlImage::site - use JHtml::image instead&lt;br /&gt;
*JHtmlList::accesslevel()&lt;br /&gt;
*JHtmlList::specificordering() - use JHtml::_(&#039;list.ordering&#039;)&lt;br /&gt;
*JHtmlList::category()&lt;br /&gt;
*JHtmlSelect::optgroup() - see JHtmlSelect::groupedList()&lt;br /&gt;
*JLanguage::_parseLanguageFiles - renamed to parseLanguageFiles&lt;br /&gt;
*JLanguage::_parseXMLLanguageFile - renamed to parseXMLLanguageFile&lt;br /&gt;
*JLanguage::_parseXMLLanguageFiles - renamed to parseXMLLanguageFiles&lt;br /&gt;
*JObject::toString - replaced with magic method&lt;br /&gt;
*JRegistry::getNameSpaces()&lt;br /&gt;
*JRegistry::getValue()&lt;br /&gt;
*JRegistry::makeNameSpace()&lt;br /&gt;
*JRegistry::setValue()&lt;br /&gt;
*JPane - See JHtmlSliders&lt;br /&gt;
*JParameter - replaced by JForm&lt;br /&gt;
*JSimpleXML, JSimpleXMLElement - Use JXMLElement instead, based on the native SimpleXMLElement&lt;br /&gt;
*JTable::canDelete() - models or controllers should be doing the access checks&lt;br /&gt;
*JTable::toXML()&lt;br /&gt;
*JToolbarHelper customX(), addNewX(), editListX(), editHtmlX(), editCssX(), deleteListX()&lt;br /&gt;
*JUser::authorize() - Use JUser::authorise()&lt;br /&gt;
*JUtility::dump()&lt;br /&gt;
*JUtility::array_unshift_ref() - Not needed in PHP 5&lt;br /&gt;
*JUtility::getHash() - Use JApplication::getHash()&lt;br /&gt;
*JUtility::getToken() - Use JFactory::getSession()-&amp;gt;getFormToken()&lt;br /&gt;
*JUtility::isWinOS() - Use JApplication::isWinOS()&lt;br /&gt;
*JUtility::return_bytes() - See InstallerModelWarnings::return_bytes()&lt;br /&gt;
*JUtility::sendMail() - Use JFactory::getMailer()-&amp;gt;sendMail()&lt;br /&gt;
*JUtility::sendAdminMail() - Use JFactory::getMailer()-&amp;gt;sendMail()&lt;br /&gt;
*JXMLElement::data() - Provided for backward compatibility&lt;br /&gt;
*JXMLElement::getAttribute() - Provided for backward compatibility&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
*JTable now automatically looks up the fields from the database schema&lt;br /&gt;
*New JDatabaseQuery - A chained CRUD query builder&lt;br /&gt;
*New JDatabase::getNextRow&lt;br /&gt;
*New JDatabase::getNextObject&lt;br /&gt;
*JDatabase::loadAssocList  - Now takes a second argument to just return the value of a column&lt;br /&gt;
*JDatabase::setQuery  - Added chaining support&lt;br /&gt;
&lt;br /&gt;
====Important Schema Changes====&lt;br /&gt;
*New jos_extensions table to list all extensions&lt;br /&gt;
*Components table information moved and split between jos_extensions and jos_menu (special menu called _adminmenu)&lt;br /&gt;
&lt;br /&gt;
The old phpgacl (jos_core_acl*) and jos_groups tables have been reworked into:&lt;br /&gt;
*jos_assets&lt;br /&gt;
*jos_user_usergroup_map&lt;br /&gt;
*jos_usergroups&lt;br /&gt;
*jos_viewlevels&lt;br /&gt;
*Archived state changed from a value of -1 to +2&lt;br /&gt;
&lt;br /&gt;
===Improved MVC===&lt;br /&gt;
====Models====&lt;br /&gt;
*JModelList&lt;br /&gt;
*JModelForm&lt;br /&gt;
*JModelAdmin&lt;br /&gt;
*Format handling (eg JSON)&lt;br /&gt;
*Sub-controller handling&lt;br /&gt;
&lt;br /&gt;
====Controllers====&lt;br /&gt;
*JControllerForm&lt;br /&gt;
*JControllerAdmin&lt;br /&gt;
*JController::setMessage takes second arg to set the message type&lt;br /&gt;
*JController can set the default view&lt;br /&gt;
*Added chaining support to several JController methods&lt;br /&gt;
&lt;br /&gt;
====Views====&lt;br /&gt;
*Semantic core output&lt;br /&gt;
*Milkyway legacy layouts&lt;br /&gt;
*The old component parameters are not automatically added to the menu anymore. You need to explicitly put them in the layout XML files.&lt;br /&gt;
*The menu manager will now detect additional layouts for a given view in the default template.&lt;br /&gt;
&lt;br /&gt;
===Form API===&lt;br /&gt;
====Event manipulation====&lt;br /&gt;
*onContentPrepareForm&lt;br /&gt;
*onContentPrepareFormData&lt;br /&gt;
&lt;br /&gt;
===Translation and Language Support===&lt;br /&gt;
*Support for unicode slugs, eg, SEF URL&#039;s with Greek characters&lt;br /&gt;
*3-letter languages now supported, xxx-XX&lt;br /&gt;
*All existing language keys have been refactored&lt;br /&gt;
&lt;br /&gt;
====INI files must validate====&lt;br /&gt;
*Upper case key with no spaces, alphanumeric characters and underscores&lt;br /&gt;
*Quoted values&lt;br /&gt;
*Double quotes within literal strings must use _QQ_ in the form KEY=&amp;quot;&amp;lt;a href=&amp;quot;_QQ_&amp;quot;index.php&amp;quot;_QQ_&amp;quot;&amp;gt;Click&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Javascript translation layer====&lt;br /&gt;
*See the flash uploader script for an example&lt;br /&gt;
Local extension language files&lt;br /&gt;
&lt;br /&gt;
====Language file API====&lt;br /&gt;
*Pluralisation support&lt;br /&gt;
*Transliteration support for ASCII or Unicode slugs&lt;br /&gt;
*Ignore Search Words&lt;br /&gt;
*Minimum search word length&lt;br /&gt;
*Custom language overrides&lt;br /&gt;
*System language file to support administrator menu and installation (.sys.ini)&lt;br /&gt;
&lt;br /&gt;
====Language switcher====&lt;br /&gt;
*Language Filter plugin enables language switching&lt;br /&gt;
*Sets the automatic filtering via JFactory::getApplication()-&amp;gt;setLanguageFilter(true)&lt;br /&gt;
*A frontend component with language support would test JFactory::getApplication()-&amp;gt;getLanguageFilter(), which returns the selected language code from the Languages Module&lt;br /&gt;
*The language field can be a language code for a single language, or &amp;quot;*&amp;quot; to be displayed for all languages&lt;br /&gt;
*Community extension for language maintenance com_localise&lt;br /&gt;
&lt;br /&gt;
===Extension management===&lt;br /&gt;
====New installation types====&lt;br /&gt;
=====Libraries=====&lt;br /&gt;
*Must include an XML manifest where type=&amp;quot;library&amp;quot;&lt;br /&gt;
*Can only be installed into a sub-folder of /libraries/&lt;br /&gt;
*Can extend parts of an existing library, eg /libraries/joomla/database/database/oracle.php&lt;br /&gt;
&lt;br /&gt;
=====Packages multi-installer=====&lt;br /&gt;
*Must include an XML manifest where type=&amp;quot;package&amp;quot;&lt;br /&gt;
*A package is a zip of zip&#039;s&lt;br /&gt;
&lt;br /&gt;
New install script can be provided with 5 methods:&lt;br /&gt;
=====preflight=====&lt;br /&gt;
*Runs before anything is run and while the extracted files are in the uploaded temp folder&lt;br /&gt;
&lt;br /&gt;
======Could allow for:======&lt;br /&gt;
*secondary extraction of custom zip&#039;s&lt;br /&gt;
*version checks to be performed&lt;br /&gt;
*halting the installer on an error&lt;br /&gt;
&lt;br /&gt;
=====install / update=====&lt;br /&gt;
*Runs after the database scripts are executed&lt;br /&gt;
*If the extension is new, the install method is run&lt;br /&gt;
*If the extension exists then update method is run if method=&amp;quot;upgrade&amp;quot;, otherwise assumes that the extension is not meant to be upgradable&lt;br /&gt;
&lt;br /&gt;
=====postflight=====&lt;br /&gt;
*Runs after the extension is registered in the database&lt;br /&gt;
*Is not run for the uninstall process (nothing left to do obviously)&lt;br /&gt;
&lt;br /&gt;
====Discover====&lt;br /&gt;
*Does not do any file copying, only works with what it finds&lt;br /&gt;
*Performs preflight, install and postflight&lt;br /&gt;
*Developer of installer has two language files??&lt;br /&gt;
&lt;br /&gt;
====Update site====&lt;br /&gt;
*Can publish an XML manifest on your site that can include individual extensions and extension sets.&lt;br /&gt;
&lt;br /&gt;
====XML Manifest Changes====&lt;br /&gt;
*&amp;lt;install&amp;gt; is deprecated - use &amp;lt;extension&amp;gt;&lt;br /&gt;
*New &amp;lt;update&amp;gt; tag. Takes a &amp;lt;schemas&amp;gt; tag which can define &amp;lt;schemapath&amp;gt;&lt;br /&gt;
*&amp;lt;params&amp;gt; and &amp;lt;param&amp;gt; tags are deprecated, use &amp;lt;fields&amp;gt;, &amp;lt;fieldsets&amp;gt; and &amp;lt;field&amp;gt; instead&lt;br /&gt;
&lt;br /&gt;
====File changes====&lt;br /&gt;
*Installation manifest must be the same name as the extension, eg com_foobar/foobar.xml  This helps with discovery (otherwise the function has to go through all the files in the extension folder&lt;br /&gt;
*Plugins are now in folders like modules and components&lt;br /&gt;
*See SVN/tests/_data/installer_packages/ for complete examples of all extensions and manifests.&lt;br /&gt;
*The method=&amp;quot;upgrade&amp;quot; will compare individual files in the original and incoming manifests and will remove files as appropriate.  However, it will not remove differences in the &amp;lt;folder&amp;gt; tags.&lt;br /&gt;
*Future support for rollback&lt;br /&gt;
&lt;br /&gt;
===Events===&lt;br /&gt;
====New Events====&lt;br /&gt;
*onBeforeRender&lt;br /&gt;
*onContentBeforeDelete&lt;br /&gt;
*onContentAfterDelete&lt;br /&gt;
*onContentChangeState&lt;br /&gt;
*onContentPrepareForm&lt;br /&gt;
*onContentPrepareFormData&lt;br /&gt;
*onExtensionBeforeInstall&lt;br /&gt;
*onExtensionBeforeUpdate&lt;br /&gt;
*onExtensionBeforeUninstall&lt;br /&gt;
*onExtensionAfterInstall&lt;br /&gt;
*onExtensionAfterUpdate&lt;br /&gt;
*onExtensionAfterUninstall&lt;br /&gt;
&lt;br /&gt;
====Renamed Events====&lt;br /&gt;
*onContentAfterSave&lt;br /&gt;
*onContentAfterTitle&lt;br /&gt;
*onContentAfterDisplay&lt;br /&gt;
*onContentBeforeDisplay&lt;br /&gt;
*onContentBeforeSave&lt;br /&gt;
*onContentSearch&lt;br /&gt;
*onContentSearchAreas&lt;br /&gt;
*onUserAuthenticate&lt;br /&gt;
*onUserAfterDelete&lt;br /&gt;
*onUserAfterSave&lt;br /&gt;
*onUserBeforeDelete&lt;br /&gt;
*onUserBeforeSave&lt;br /&gt;
*onUserLogin&lt;br /&gt;
*onUserLogout&lt;br /&gt;
*All content events (except for search and search areas) now pass a &#039;context&#039; as the first argument to alert the plugin as to what type of content is being passed.  The plugin event may or may not heed this context.&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
*Component can provide custom options for its own categories via optional category.xml&lt;br /&gt;
*Supported via JTableNested&lt;br /&gt;
&lt;br /&gt;
===Access Controls===&lt;br /&gt;
*A thing that can be controlled by permissions is registered in the assets table&lt;br /&gt;
*JTable handles this transparently via asset_id field&lt;br /&gt;
*For view permissions, support is as simple as adding&lt;br /&gt;
:::$user = JFactory::getUser();&lt;br /&gt;
:::$groups = implode(&#039;,&#039;, $user-&amp;gt;authorisedLevels());&lt;br /&gt;
:::$query-&amp;gt;where(&#039;a.access IN (&#039; . $groups . &#039;)&#039;);&lt;br /&gt;
&lt;br /&gt;
For action permissions, same format as in 1.5:&lt;br /&gt;
$user-&amp;gt;authorise($actionName, $assetName)&lt;br /&gt;
*OpenID library moved to plugin folder&lt;br /&gt;
*Geshi library moved to plugin folder&lt;br /&gt;
*JRegistry notes defaults to JSON (new format), dynamically converting existing data in INI format&lt;br /&gt;
*New JStream&lt;br /&gt;
*New JApplicationHelper::getComponentName&lt;br /&gt;
*Core icons moved to /media/&lt;br /&gt;
*Backward incompatible change to JEditor::display&lt;br /&gt;
*Added chaining support to JMail&lt;br /&gt;
*JFilterInput can no longer be called statically&lt;br /&gt;
*JHtml::image now supports relative paths&lt;br /&gt;
*All system images are overridable in the default template&lt;br /&gt;
*New JHtmlString&lt;br /&gt;
*Added wincache session handler for IIS&lt;br /&gt;
*New JFilterOutput::stripImages&lt;br /&gt;
*JPath::check takes second arg for separator (to pass to JPath::clean)&lt;br /&gt;
*Expanded configuration support through config.xml (multiple tabs)&lt;br /&gt;
&lt;br /&gt;
====Core actions====&lt;br /&gt;
*core.login.site&lt;br /&gt;
*core.login.admin&lt;br /&gt;
*core.admin&lt;br /&gt;
*core.manage&lt;br /&gt;
*core.create&lt;br /&gt;
*core.edit&lt;br /&gt;
*core.edit.state&lt;br /&gt;
*core.delete&lt;br /&gt;
*Miscellaneous changes&lt;br /&gt;
&lt;br /&gt;
===Debug Plugin===&lt;br /&gt;
*More tools for assisting with translation&lt;br /&gt;
&lt;br /&gt;
===Mootools 1.2/1.3===&lt;br /&gt;
*Need to use document.id instead of $&lt;br /&gt;
&lt;br /&gt;
==Cache changes ==&lt;br /&gt;
===API changes relevant to 3rd party developers===&lt;br /&gt;
====Component view cache==== &lt;br /&gt;
&lt;br /&gt;
Component view cache now takes an array of url parameters and their types to create Cacheid. This is a replacement for a previous unsafe way which took the whole URL for this and so opened the doors for DOS attacks via random url parameters added to request URL&#039;s. &lt;br /&gt;
&lt;br /&gt;
Com_contact example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$safeurlparams = array(&lt;br /&gt;
    &#039;id&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;catid&#039;=&amp;gt;&#039;INT&#039;, &#039;limit&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;limitstart&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;filter_order&#039;=&amp;gt;&#039;CMD&#039;, &lt;br /&gt;
    &#039;filter_order_Dir&#039;=&amp;gt;&#039;CMD&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
parent::display($cachable,$safeurlparams);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Old cacheid created from URL was retained for backwards compatibility and takes effect if there are no $safeurlparams.&lt;br /&gt;
&lt;br /&gt;
====Module cache====&lt;br /&gt;
This has been completly reconceptualized. Module cache now has 5 different modes of operation, 3 of them are to be set from module XML file, while 2 are meant to be used from within the module itself. Default is backwards compatible oldstatic mode that requires no changes to a module. &lt;br /&gt;
&lt;br /&gt;
Modes to be set in XML: &lt;br /&gt;
*&#039;&#039;&#039;static&#039;&#039;&#039; - one cache file for all pages with the same module parameters &lt;br /&gt;
*&#039;&#039;&#039;oldstatic&#039;&#039;&#039; - 1.5. definition of module caching, one cache file for all pages with the same module id and user aid. Default for backwards compatibility &lt;br /&gt;
*&#039;&#039;&#039;itemid&#039;&#039;&#039; - changes on itemid change &lt;br /&gt;
&lt;br /&gt;
In addition to cache field that was required in 1.5 there is now another hidden field called cachemode that sets any of the above modes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;cachemode&amp;quot; type=&amp;quot;hidden&amp;quot; label=&amp;quot;&amp;quot; default=&amp;quot;static&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;option value=&amp;quot;static&amp;quot;&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modes to be called from inside the module: &lt;br /&gt;
*&#039;&#039;&#039;safeuri&#039;&#039;&#039; - id is created from $cacheparams-&amp;gt;modeparams array, the same as in component view cache &lt;br /&gt;
*&#039;&#039;&#039;id&#039;&#039;&#039; - module sets own cache id&#039;s &lt;br /&gt;
&lt;br /&gt;
To use this modes one must rename cache field in xml to owncache field and call JModuleHelper::ModuleCache from within the module&#039;s main php file. This is actually a shortcut to cache callback to avoid code duplication in every module. &lt;br /&gt;
&lt;br /&gt;
An example that uses safeuri mode and replaces uncached&lt;br /&gt;
$list = modRelatedItemsHelper::getList($params) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$cacheparams = new stdClass; &lt;br /&gt;
$cacheparams-&amp;gt;cachemode = &#039;safeuri&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;class = &#039;modRelatedItemsHelper&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;method = &#039;getList&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;methodparams = $params; &lt;br /&gt;
$cacheparams-&amp;gt;modeparams = array(&#039;id&#039;=&amp;gt;&#039;int&#039;,&#039;Itemid&#039;=&amp;gt;&#039;int&#039;); &lt;br /&gt;
$list = JModuleHelper::ModuleCache ($module, $params, $cacheparams);&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
====Functional changes==== &lt;br /&gt;
&#039;&#039;&#039;Cache administration (Clean cache, Purge cache) now works with all drivers&#039;&#039;&#039;, not only with file cache. &lt;br /&gt;
&#039;&#039;&#039;New standalone garbage collect script&#039;&#039;&#039; that is to be called from crontab has been added. It can be found in libraries/joomla/utilities/garbagecron.php . For safety reasons it is recommended that it is renamed it to something unique. &lt;br /&gt;
&lt;br /&gt;
====CMS and framework level functional changes==== &lt;br /&gt;
&#039;&#039;&#039;Caching is implemented in all components and modules&#039;&#039;&#039; that can potentially gain from cache.&lt;br /&gt;
Caching has also been added to some most expensive and frequent framework calls JComponentHelper::_load(), JModuleHelper::_load(),JMenuSite::load(); &lt;br /&gt;
&lt;br /&gt;
====Cache library changes====&lt;br /&gt;
Cache library has been completely refactored. &lt;br /&gt;
*Cache &#039;&#039;&#039;handlers have been renamed to controllers&#039;&#039;&#039; to better reflect their role and avoid confusion with cache storage handlers (referred to as drivers in following text). &lt;br /&gt;
*&#039;&#039;&#039;New JCacheController&#039;&#039;&#039; parent class has been added and inheritance has been changed to prevent bugs occurring from controller&#039;s and storage handler&#039;s get method clashes. &lt;br /&gt;
&lt;br /&gt;
====JCache==== &lt;br /&gt;
*&#039;&#039;&#039;getAll()&#039;&#039;&#039; method was added to JCache ,JCacheStorage and all drivers and it returns all cached items (this was previously possible only with file driver and hardcoded in administration) &lt;br /&gt;
*New &#039;&#039;&#039;lock and unlock&#039;&#039;&#039; methods were added to JCache, JCacheStorage and drivers. They enable cache item locking and unlocking to prevent errors on parallel accesses and double saves. This functionally was also implemented in controllers. &lt;br /&gt;
*Workarounds are now consolidated in new &#039;&#039;&#039;JCache getWorkarounds and setWorkarounds&#039;&#039;&#039; methods, are now used by all controllers and their use has been made optional. &lt;br /&gt;
*New makeId() method in JCache that creates cache id from registered url parameters set by components and system plugins &lt;br /&gt;
&lt;br /&gt;
====JCacheController==== &lt;br /&gt;
New parent class to Controllers that also functions as an intermediate to JCache. There is no JObject inheritance as otherwise magic __call doesn&#039;t work. &lt;br /&gt;
Change was needed to prevent bugs occurring from controller&#039;s and storage handler&#039;s get method clashes. They could be renamed but this would break backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
====JCacheStorage==== &lt;br /&gt;
*_getCacheId method was moved from drivers to their parent JCacheStorage and all drives now use the same method by default &lt;br /&gt;
*CacheItem was moved from cache admin to framework JCacheStorageHelper , it is used by getAll &lt;br /&gt;
*There are new cachelite and wincache drivers. All other drivers have been fixed with missing functions (gc, clean) added, their code cleaned and tested they should be now working properly. &lt;br /&gt;
*Replaced separate _expire files in filecache driver with timestamps (this should amount to cca. 40% speed gain). The same in all drivers that had this. &lt;br /&gt;
*Numerous bugfixes on all levels, most important is proper use of options defaulting to configuration parameters settings and correctly passing from level to level. &lt;br /&gt;
&lt;br /&gt;
====Other framework level changes==== &lt;br /&gt;
*Safe url parameters registration added to JControler view method. &lt;br /&gt;
*New ModuleCache method in JModuleHelper that performs the above described module cache (in 5 modes) for both, modules and module renderer. &lt;br /&gt;
*JFactory::getFeedParser has been changed to use Joomla caching instead of simplepie&#039;s.&lt;br /&gt;
&lt;br /&gt;
==Performance==&lt;br /&gt;
===Eliminate the usage of JTable for general browsing on the frontend===&lt;br /&gt;
*Session drops the usage of JTable&lt;br /&gt;
*Item views use a dedicated question, not JTable-&amp;gt;load&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
*Still Mootools 1.2. Will be upgrading to 1.3 during the beta process.&lt;br /&gt;
*Scaling issues to address&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
===Releases===&lt;br /&gt;
*Alpha 1: 22 June 2009&lt;br /&gt;
*Alpha 2: 25 October 2009&lt;br /&gt;
*Beta 1: 18 May 2010&lt;br /&gt;
*Beta 2: 2 weeks after Beta 1&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=J2.5:What%27s_new_in_Joomla_2.5&amp;diff=27908</id>
		<title>J2.5:What&#039;s new in Joomla 2.5</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=J2.5:What%27s_new_in_Joomla_2.5&amp;diff=27908"/>
		<updated>2010-05-22T21:16:59Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Discover */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lots of things.&lt;br /&gt;
&lt;br /&gt;
...and:&lt;br /&gt;
* &#039;&#039;&#039;New Access Control System&#039;&#039;&#039; - Allows site administrators control over who can view and manage content.&lt;br /&gt;
* &#039;&#039;&#039;Unlimited Depth Organizational Model&#039;&#039;&#039; - Gives site administrators and content creators user-defined category levels that allow for the creation of a category tree with as many or as few levels for organizing articles and other content as needed.&lt;br /&gt;
* &#039;&#039;&#039;One-Click Extension Updates&#039;&#039;&#039; - Allows users to keep sites secure and controlled by simplifying the process of updating extensions.&lt;br /&gt;
* &#039;&#039;&#039;Semantic XHTML Layouts&#039;&#039;&#039; - Provides a better baseline for content presentation.&lt;br /&gt;
&lt;br /&gt;
...and:&lt;br /&gt;
&lt;br /&gt;
==Administrators==&lt;br /&gt;
===Introduction===&lt;br /&gt;
*Consistent UI&lt;br /&gt;
*Consistent Features&lt;br /&gt;
*Richer sample data&lt;br /&gt;
*IE 7+, Firefox 3.x, Safari 4.x&lt;br /&gt;
*PHP 5.2.4+&lt;br /&gt;
*MySQL 5.0.4 (allows for wide varchars)&lt;br /&gt;
&lt;br /&gt;
===Administrator===&lt;br /&gt;
*Menu Changes&lt;br /&gt;
*Submenu consistency&lt;br /&gt;
&lt;br /&gt;
====Toolbar Features====&lt;br /&gt;
*Save&lt;br /&gt;
*Save &amp;amp; Close&lt;br /&gt;
*Save &amp;amp; New&lt;br /&gt;
*Save as Copy&lt;br /&gt;
*Expired session will return to the page you were on then you got logged out (can be hit and miss)&lt;br /&gt;
*Most search filters allow you to search for a record id via [ id:123 ]&lt;br /&gt;
*&amp;quot;Parameters&amp;quot; are now referred to as &amp;quot;Options&amp;quot;&lt;br /&gt;
*Template Styles&lt;br /&gt;
*Integrated Trash Management&lt;br /&gt;
*Consistent archive support for most content&lt;br /&gt;
*Extension Installer Improvements&lt;br /&gt;
&lt;br /&gt;
===Module Enhancements===&lt;br /&gt;
*Publish up and down&lt;br /&gt;
*Add option to display on all pages &amp;quot;except&amp;quot; selected&lt;br /&gt;
*Expanded Category System&lt;br /&gt;
*404 Page Redirection&lt;br /&gt;
*Better Menu Management&lt;br /&gt;
*Alternative layouts for content, modules and menus (taken from the home template)&lt;br /&gt;
&lt;br /&gt;
===New Templates===&lt;br /&gt;
*Atomic&lt;br /&gt;
*Beez2&lt;br /&gt;
*(Administrator) Bluestork (replaces Khephri)&lt;br /&gt;
*(Administrator) Hathor&lt;br /&gt;
*Legacy layer in Milkyway&lt;br /&gt;
*Backend supports layout overrides&lt;br /&gt;
*New Modules&lt;br /&gt;
*New Plugins&lt;br /&gt;
*Content Languages&lt;br /&gt;
*User Login Permissions&lt;br /&gt;
*Activate selected users from the user list now (and filter)&lt;br /&gt;
*Administrator registration approval&lt;br /&gt;
*Polls component removed&lt;br /&gt;
*New codemirror editor&lt;br /&gt;
&lt;br /&gt;
===SEO Improvements===&lt;br /&gt;
*Meta decription and keywords for categories&lt;br /&gt;
*Articles can change the page title and page header separately&lt;br /&gt;
&lt;br /&gt;
===Global Configuration===&lt;br /&gt;
*Add site name to titles&lt;br /&gt;
*Default Access Level&lt;br /&gt;
*Set Metadata Language (buggy)&lt;br /&gt;
*Unicode Aliases&lt;br /&gt;
*Cookie domain and path&lt;br /&gt;
*User Setting moved to User Manager -&amp;gt; Options&lt;br /&gt;
*Media Settings moved to Media Manager -&amp;gt; Options&lt;br /&gt;
*Debug Modules - allows you to enabled to disable the tp=1 feature&lt;br /&gt;
*Server Timezone now a location, not an integer offset&lt;br /&gt;
*New Global Permissions tab&lt;br /&gt;
&lt;br /&gt;
===User Manager===&lt;br /&gt;
*Can activate a user from the list now&lt;br /&gt;
*User can be assigned to multiple groups&lt;br /&gt;
*Manage user groups&lt;br /&gt;
*Manager content access levels&lt;br /&gt;
&lt;br /&gt;
===Media Manager===&lt;br /&gt;
*Flash uploader fixed&lt;br /&gt;
&lt;br /&gt;
===Menu Manager===&lt;br /&gt;
====Menus List====&lt;br /&gt;
*Rebuild button to press when you brick the menu&lt;br /&gt;
*Clicking the menu name brings up the menu items list rather than going into Edit Menu. To edit the menu, click on the check box next to the name and click on the Edit icon in the toolbar.&lt;br /&gt;
&lt;br /&gt;
====Items List====&lt;br /&gt;
*Menus support the language filter&lt;br /&gt;
*Default now called Home&lt;br /&gt;
*Home is now clickable in the menu item list&lt;br /&gt;
*A separate home can be set for different languages&lt;br /&gt;
&lt;br /&gt;
=====New batch operations=====&lt;br /&gt;
*Set access level&lt;br /&gt;
*Copy or move to another part of this or another menu&lt;br /&gt;
&lt;br /&gt;
====Edit Item====&lt;br /&gt;
*Improved &amp;quot;Type&amp;quot; selector with human readable view and layout names&lt;br /&gt;
*Note field added&lt;br /&gt;
*New window target&lt;br /&gt;
*New Language assignment&lt;br /&gt;
*New Template style&lt;br /&gt;
*Ability to add &amp;amp; edit Module assignments from this page&lt;br /&gt;
&lt;br /&gt;
=====New options for the menu links and pages themselves=====&lt;br /&gt;
*Link title attribute&lt;br /&gt;
*Link CSS style&lt;br /&gt;
*Menu image is changed to a modal selector&lt;br /&gt;
*CSS class for page heading&lt;br /&gt;
*Page meta description&lt;br /&gt;
*Page meta keywords&lt;br /&gt;
*Robots options&lt;br /&gt;
&lt;br /&gt;
===Articles Manager===&lt;br /&gt;
*Frontpage is now referred to a Featured&lt;br /&gt;
*Article manager uses submenu to quickly skip between articles , categories and featured&lt;br /&gt;
*Sections and categories are now merged.&lt;br /&gt;
&lt;br /&gt;
====Articles List====&lt;br /&gt;
*&#039;&#039;&amp;quot;Missing move and copy; filter by author&amp;quot;&#039;&#039;&lt;br /&gt;
*New column to show language&lt;br /&gt;
*Filtering by language available&lt;br /&gt;
&lt;br /&gt;
====Article Edit====&lt;br /&gt;
*Created by user now selected by modal popup&lt;br /&gt;
*New ability to set the page title from the article&lt;br /&gt;
*Define create, delete, edit and publishing permissions&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
====Category List====&lt;br /&gt;
*Nested view&lt;br /&gt;
*Filtering on language&lt;br /&gt;
&lt;br /&gt;
====Edit Category====&lt;br /&gt;
*New note field&lt;br /&gt;
*Section replaced with ability to assign a parent category&lt;br /&gt;
*Ability to assign content language&lt;br /&gt;
&lt;br /&gt;
=====New Options (not previously available in 1.5)=====&lt;br /&gt;
*Assign alternate layout&lt;br /&gt;
*Define create, delete, edit and publishing permissions&lt;br /&gt;
*Meta description&lt;br /&gt;
*Meta keywords&lt;br /&gt;
*Alternative page title&lt;br /&gt;
*Meta author&lt;br /&gt;
*Meta robots&lt;br /&gt;
&lt;br /&gt;
===Banners===&lt;br /&gt;
====Banners list====&lt;br /&gt;
*** Missing copy toolbar button&lt;br /&gt;
*New archive toolbar button&lt;br /&gt;
*New columns to show meta keywords, purchase type and language&lt;br /&gt;
*New filtering by client and language &lt;br /&gt;
&lt;br /&gt;
====Edit Banner====&lt;br /&gt;
*New type toggle for Image or Custom (dynamically changes the available form fields)&lt;br /&gt;
*New alt text field for image&lt;br /&gt;
*New language field&lt;br /&gt;
&lt;br /&gt;
=====New Options=====&lt;br /&gt;
*Ability to set the created date&lt;br /&gt;
*Ability to set start and finish publishing times&lt;br /&gt;
*Ability to set the purchase type&lt;br /&gt;
*Ability to track impressions&lt;br /&gt;
*Ability to track clicks&lt;br /&gt;
*Use own prefix ?&lt;br /&gt;
*Tags renamed to meta &lt;br /&gt;
*Contacts&lt;br /&gt;
*Messaging&lt;br /&gt;
*Newsfeeds&lt;br /&gt;
*Search&lt;br /&gt;
*Weblinks&lt;br /&gt;
*Redirect&lt;br /&gt;
&lt;br /&gt;
===Extensions Manager===&lt;br /&gt;
====Discover====&lt;br /&gt;
*Module mgr&lt;br /&gt;
*Plugin Mgr&lt;br /&gt;
*Template Mgr&lt;br /&gt;
*Language mgr&lt;br /&gt;
&lt;br /&gt;
===Misc===&lt;br /&gt;
*Auto create linked contact when creating new user ??&lt;br /&gt;
&lt;br /&gt;
==Access Controls==&lt;br /&gt;
*Introduction&lt;br /&gt;
*User Groups&lt;br /&gt;
*Access Levels&lt;br /&gt;
*Permission Layers&lt;br /&gt;
*How Permissions are Inherited&lt;br /&gt;
*How to debrick your site&lt;br /&gt;
&lt;br /&gt;
==Developers==&lt;br /&gt;
===Introduction===&lt;br /&gt;
*PHP 5.2.4+&lt;br /&gt;
*MySQL 5.0.4 (allows for wide varchars)&lt;br /&gt;
*IE7+, Firefox 3+, Safari 4+&lt;br /&gt;
*Focus on code consistency&lt;br /&gt;
*Focus on code reduction&lt;br /&gt;
&lt;br /&gt;
Usage of PHP Native Functions where possible, for example:&lt;br /&gt;
*[[JXMLElement]] extends the native [http://php.net/manual/en/book.simplexml.php SimpleXML] class&lt;br /&gt;
*[[JDate]] extends the [http://www.php.net/manual/en/class.datetime.php DateTime] class&lt;br /&gt;
*Native INI parser to load languages&lt;br /&gt;
&lt;br /&gt;
===Removed features===&lt;br /&gt;
*ADODB compatibility methods in database classes&lt;br /&gt;
*DOMIT (unsupported XML library)&lt;br /&gt;
*Legacy mode (includes global $mainframe, etc)&lt;br /&gt;
*JTemplate (based on patTemplate)&lt;br /&gt;
*patTemplate (templating engine)&lt;br /&gt;
*PDF support&lt;br /&gt;
*PEAR libraries (due to license incompatibilities)&lt;br /&gt;
*phpgacl&lt;br /&gt;
*PHP 4.0 and 5.0 compatibility files&lt;br /&gt;
*XStandard Editor&lt;br /&gt;
&lt;br /&gt;
===Deprecated Features===&lt;br /&gt;
*JController::_acoSection&lt;br /&gt;
*JController::_acoSectionValue&lt;br /&gt;
*JController::authorize()&lt;br /&gt;
*JController::setAccessControl()&lt;br /&gt;
*JDatabase::stderr()&lt;br /&gt;
*JDate::offest&lt;br /&gt;
*JDate::setOffset()&lt;br /&gt;
*JDate::toFormat() - use JDate::format() instead&lt;br /&gt;
*JException::toString()&lt;br /&gt;
*JFactory::getXMLParser()&lt;br /&gt;
*JHtmlGird::access()&lt;br /&gt;
*JHtmlImage::administrator - use JHtml::image instead&lt;br /&gt;
*JHtmlImage::site - use JHtml::image instead&lt;br /&gt;
*JHtmlList::accesslevel()&lt;br /&gt;
*JHtmlList::specificordering() - use JHtml::_(&#039;list.ordering&#039;)&lt;br /&gt;
*JHtmlList::category()&lt;br /&gt;
*JHtmlSelect::optgroup() - see JHtmlSelect::groupedList()&lt;br /&gt;
*JLanguage::_parseLanguageFiles - renamed to parseLanguageFiles&lt;br /&gt;
*JLanguage::_parseXMLLanguageFile - renamed to parseXMLLanguageFile&lt;br /&gt;
*JLanguage::_parseXMLLanguageFiles - renamed to parseXMLLanguageFiles&lt;br /&gt;
*JObject::toString - replaced with magic method&lt;br /&gt;
*JRegistry::getNameSpaces()&lt;br /&gt;
*JRegistry::getValue()&lt;br /&gt;
*JRegistry::makeNameSpace()&lt;br /&gt;
*JRegistry::setValue()&lt;br /&gt;
*JPane - See JHtmlSliders&lt;br /&gt;
*JParameter - replaced by JForm&lt;br /&gt;
*JSimpleXML, JSimpleXMLElement - Use JXMLElement instead, based on the native SimpleXMLElement&lt;br /&gt;
*JTable::canDelete() - models or controllers should be doing the access checks&lt;br /&gt;
*JTable::toXML()&lt;br /&gt;
*JToolbarHelper customX(), addNewX(), editListX(), editHtmlX(), editCssX(), deleteListX()&lt;br /&gt;
*JUser::authorize() - Use JUser::authorise()&lt;br /&gt;
*JUtility::dump()&lt;br /&gt;
*JUtility::array_unshift_ref() - Not needed in PHP 5&lt;br /&gt;
*JUtility::getHash() - Use JApplication::getHash()&lt;br /&gt;
*JUtility::getToken() - Use JFactory::getSession()-&amp;gt;getFormToken()&lt;br /&gt;
*JUtility::isWinOS() - Use JApplication::isWinOS()&lt;br /&gt;
*JUtility::return_bytes() - See InstallerModelWarnings::return_bytes()&lt;br /&gt;
*JUtility::sendMail() - Use JFactory::getMailer()-&amp;gt;sendMail()&lt;br /&gt;
*JUtility::sendAdminMail() - Use JFactory::getMailer()-&amp;gt;sendMail()&lt;br /&gt;
*JXMLElement::data() - Provided for backward compatibility&lt;br /&gt;
*JXMLElement::getAttribute() - Provided for backward compatibility&lt;br /&gt;
&lt;br /&gt;
===Database===&lt;br /&gt;
*JTable now automatically looks up the fields from the database schema&lt;br /&gt;
*New JDatabaseQuery - A chained CRUD query builder&lt;br /&gt;
*New JDatabase::getNextRow&lt;br /&gt;
*New JDatabase::getNextObject&lt;br /&gt;
*JDatabase::loadAssocList  - Now takes a second argument to just return the value of a column&lt;br /&gt;
*JDatabase::setQuery  - Added chaining support&lt;br /&gt;
&lt;br /&gt;
====Important Schema Changes====&lt;br /&gt;
*New jos_extensions table to list all extensions&lt;br /&gt;
*Components table information moved and split between jos_extensions and jos_menu (special menu called _adminmenu)&lt;br /&gt;
&lt;br /&gt;
The old phpgacl (jos_core_acl*) and jos_groups tables have been reworked into:&lt;br /&gt;
*jos_assets&lt;br /&gt;
*jos_user_usergroup_map&lt;br /&gt;
*jos_usergroups&lt;br /&gt;
*jos_viewlevels&lt;br /&gt;
*Archived state changed from a value of -1 to +2&lt;br /&gt;
&lt;br /&gt;
===Improved MVC===&lt;br /&gt;
====Models====&lt;br /&gt;
*JModelList&lt;br /&gt;
*JModelForm&lt;br /&gt;
*JModelAdmin&lt;br /&gt;
*Format handling (eg JSON)&lt;br /&gt;
*Sub-controller handling&lt;br /&gt;
&lt;br /&gt;
====Controllers====&lt;br /&gt;
*JControllerForm&lt;br /&gt;
*JControllerAdmin&lt;br /&gt;
*JController::setMessage takes second arg to set the message type&lt;br /&gt;
*JController can set the default view&lt;br /&gt;
*Added chaining support to several JController methods&lt;br /&gt;
&lt;br /&gt;
====Views====&lt;br /&gt;
*Semantic core output&lt;br /&gt;
*Milkyway legacy layouts&lt;br /&gt;
*The old component parameters are not automatically added to the menu anymore. You need to explicitly put them in the layout XML files.&lt;br /&gt;
*The menu manager will now detect additional layouts for a given view in the default template.&lt;br /&gt;
&lt;br /&gt;
===Form API===&lt;br /&gt;
====Event manipulation====&lt;br /&gt;
*onContentPrepareForm&lt;br /&gt;
*onContentPrepareFormData&lt;br /&gt;
&lt;br /&gt;
===Translation and Language Support===&lt;br /&gt;
*Support for unicode slugs, eg, SEF URL&#039;s with Greek characters&lt;br /&gt;
*3-letter languages now supported, xxx-XX&lt;br /&gt;
*All existing language keys have been refactored&lt;br /&gt;
&lt;br /&gt;
====INI files must validate====&lt;br /&gt;
*Upper case key with no spaces, alphanumeric characters and underscores&lt;br /&gt;
*Quoted values&lt;br /&gt;
*Double quotes within literal strings must use _QQ_ in the form KEY=&amp;quot;&amp;lt;a href=&amp;quot;_QQ_&amp;quot;index.php&amp;quot;_QQ_&amp;quot;&amp;gt;Click&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
====Javascript translation layer====&lt;br /&gt;
*See the flash uploader script for an example&lt;br /&gt;
Local extension language files&lt;br /&gt;
&lt;br /&gt;
====Language file API====&lt;br /&gt;
*Pluralisation support&lt;br /&gt;
*Transliteration support for ASCII or Unicode slugs&lt;br /&gt;
*Ignore Search Words&lt;br /&gt;
*Minimum search word length&lt;br /&gt;
*Custom language overrides&lt;br /&gt;
*System language file to support administrator menu and installation (.sys.ini)&lt;br /&gt;
&lt;br /&gt;
====Language switcher====&lt;br /&gt;
*Language Filter plugin enables language switching&lt;br /&gt;
*Sets the automatic filtering via JFactory::getApplication()-&amp;gt;setLanguageFilter(true)&lt;br /&gt;
*A frontend component with language support would test JFactory::getApplication()-&amp;gt;getLanguageFilter(), which returns the selected language code from the Languages Module&lt;br /&gt;
*The language field can be a language code for a single language, or &amp;quot;*&amp;quot; to be displayed for all languages&lt;br /&gt;
*Community extension for language maintenance com_localise&lt;br /&gt;
&lt;br /&gt;
===Extension management===&lt;br /&gt;
====New installation types====&lt;br /&gt;
=====Libraries=====&lt;br /&gt;
*Must include an XML manifest where type=&amp;quot;library&amp;quot;&lt;br /&gt;
*Can only be installed into a sub-folder of /libraries/&lt;br /&gt;
*Can extend parts of an existing library, eg /libraries/joomla/database/database/oracle.php&lt;br /&gt;
&lt;br /&gt;
=====Packages multi-installer=====&lt;br /&gt;
*Must include an XML manifest where type=&amp;quot;package&amp;quot;&lt;br /&gt;
*A package is a zip of zip&#039;s&lt;br /&gt;
&lt;br /&gt;
New install script can be provided with 5 methods:&lt;br /&gt;
=====preflight=====&lt;br /&gt;
*Runs before anything is run and while the extracted files are in the uploaded temp folder&lt;br /&gt;
&lt;br /&gt;
======Could allow for:======&lt;br /&gt;
*secondary extraction of custom zip&#039;s&lt;br /&gt;
*version checks to be performed&lt;br /&gt;
*halting the installer on an error&lt;br /&gt;
&lt;br /&gt;
=====install / update=====&lt;br /&gt;
*Runs after the database scripts are executed&lt;br /&gt;
*If the extension is new, the install method is run&lt;br /&gt;
*If the extension exists then update method is run if method=&amp;quot;upgrade&amp;quot;, otherwise assumes that the extension is not meant to be upgradable&lt;br /&gt;
&lt;br /&gt;
=====postflight=====&lt;br /&gt;
*Runs after the extension is registered in the database&lt;br /&gt;
*Is not run for the uninstall process (nothing left to do obviously)&lt;br /&gt;
&lt;br /&gt;
====Discover====&lt;br /&gt;
*Does not do any file copying, only works with what it finds&lt;br /&gt;
*Performs preflight, install and postflight&lt;br /&gt;
*Developer of installer has two language files??&lt;br /&gt;
&lt;br /&gt;
====Update site====&lt;br /&gt;
*Can publish an XML manifest on your site that can include individual extensions and extension sets.&lt;br /&gt;
&lt;br /&gt;
====XML Manifest Changes====&lt;br /&gt;
*&amp;lt;install&amp;gt; is deprecated - use &amp;lt;extension&amp;gt;&lt;br /&gt;
*New &amp;lt;update&amp;gt; tag. Takes a &amp;lt;schemas&amp;gt; tag which can define &amp;lt;schemapath&amp;gt;&lt;br /&gt;
*&amp;lt;params&amp;gt; and &amp;lt;param&amp;gt; tags are deprecated, use &amp;lt;fields&amp;gt;, &amp;lt;fieldsets&amp;gt; and &amp;lt;field&amp;gt; instead&lt;br /&gt;
&lt;br /&gt;
====File changes====&lt;br /&gt;
*Installation manifest must be the same name as the extension, eg com_foobar/foobar.xml  This helps with discovery (otherwise the function has to go through all the files in the extension folder&lt;br /&gt;
*Plugins are now in folders like modules and components&lt;br /&gt;
*See SVN/tests/_data/installer_packages/ for complete examples of all extensions and manifests.&lt;br /&gt;
*The method=&amp;quot;upgrade&amp;quot; will compare individual files in the original and incoming manifests and will remove files as appropriate.  However, it will not remove differences in the &amp;lt;folder&amp;gt; tags.&lt;br /&gt;
*Future support for rollback&lt;br /&gt;
&lt;br /&gt;
===Events===&lt;br /&gt;
====New Events====&lt;br /&gt;
*onBeforeRender&lt;br /&gt;
*onContentBeforeDelete&lt;br /&gt;
*onContentAfterDelete&lt;br /&gt;
*onContentChangeState&lt;br /&gt;
*onContentPrepareForm&lt;br /&gt;
*onContentPrepareFormData&lt;br /&gt;
*onExtensionBeforeInstall&lt;br /&gt;
*onExtensionBeforeUpdate&lt;br /&gt;
*onExtensionBeforeUninstall&lt;br /&gt;
*onExtensionAfterInstall&lt;br /&gt;
*onExtensionAfterUpdate&lt;br /&gt;
*onExtensionAfterUninstall&lt;br /&gt;
&lt;br /&gt;
====Renamed Events====&lt;br /&gt;
*onContentAfterSave&lt;br /&gt;
*onContentAfterTitle&lt;br /&gt;
*onContentAfterDisplay&lt;br /&gt;
*onContentBeforeDisplay&lt;br /&gt;
*onContentBeforeSave&lt;br /&gt;
*onContentSearch&lt;br /&gt;
*onContentSearchAreas&lt;br /&gt;
*onUserAuthenticate&lt;br /&gt;
*onUserAfterDelete&lt;br /&gt;
*onUserAfterSave&lt;br /&gt;
*onUserBeforeDelete&lt;br /&gt;
*onUserBeforeSave&lt;br /&gt;
*onUserLogin&lt;br /&gt;
*onUserLogout&lt;br /&gt;
*All content events (except for search and search areas) now pass a &#039;context&#039; as the first argument to alert the plugin as to what type of content is being passed.  The plugin event may or may not heed this context.&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
*Component can provide custom options for its own categories via optional category.xml&lt;br /&gt;
*Supported via JTableNested&lt;br /&gt;
&lt;br /&gt;
===Access Controls===&lt;br /&gt;
*A thing that can be controlled by permissions is registered in the assets table&lt;br /&gt;
*JTable handles this transparently via asset_id field&lt;br /&gt;
*For view permissions, support is as simple as adding&lt;br /&gt;
:::$user = JFactory::getUser();&lt;br /&gt;
:::$groups = implode(&#039;,&#039;, $user-&amp;gt;authorisedLevels());&lt;br /&gt;
:::$query-&amp;gt;where(&#039;a.access IN (&#039; . $groups . &#039;)&#039;);&lt;br /&gt;
&lt;br /&gt;
For action permissions, same format as in 1.5:&lt;br /&gt;
$user-&amp;gt;authorise($actionName, $assetName)&lt;br /&gt;
*OpenID library moved to plugin folder&lt;br /&gt;
*Geshi library moved to plugin folder&lt;br /&gt;
*JRegistry notes defaults to JSON (new format), dynamically converting existing data in INI format&lt;br /&gt;
*New JStream&lt;br /&gt;
*New JApplicationHelper::getComponentName&lt;br /&gt;
*Core icons moved to /media/&lt;br /&gt;
*Backward incompatible change to JEditor::display&lt;br /&gt;
*Added chaining support to JMail&lt;br /&gt;
*JFilterInput can no longer be called statically&lt;br /&gt;
*JHtml::image now supports relative paths&lt;br /&gt;
*All system images are overridable in the default template&lt;br /&gt;
*New JHtmlString&lt;br /&gt;
*Added wincache session handler for IIS&lt;br /&gt;
*New JFilterOutput::stripImages&lt;br /&gt;
*JPath::check takes second arg for separator (to pass to JPath::clean)&lt;br /&gt;
*Expanded configuration support through config.xml (multiple tabs)&lt;br /&gt;
&lt;br /&gt;
====Core actions====&lt;br /&gt;
*core.login.site&lt;br /&gt;
*core.login.admin&lt;br /&gt;
*core.admin&lt;br /&gt;
*core.manage&lt;br /&gt;
*core.create&lt;br /&gt;
*core.edit&lt;br /&gt;
*core.edit.state&lt;br /&gt;
*core.delete&lt;br /&gt;
*Miscellaneous changes&lt;br /&gt;
&lt;br /&gt;
===Debug Plugin===&lt;br /&gt;
*More tools for assisting with translation&lt;br /&gt;
&lt;br /&gt;
===Mootools 1.2/1.3===&lt;br /&gt;
*Need to use document.id instead of $&lt;br /&gt;
&lt;br /&gt;
==Cache changes ==&lt;br /&gt;
===API changes relevant to 3rd party developers===&lt;br /&gt;
====Component view cache==== &lt;br /&gt;
&lt;br /&gt;
Component view cache now takes an array of url parameters and their types to create Cacheid. This is a replacement for a previous unsafe way which took the whole URL for this and so opened the doors for DOS attacks via random url parameters added to request URL&#039;s. &lt;br /&gt;
&lt;br /&gt;
Com_contact example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$safeurlparams = array(&lt;br /&gt;
    &#039;id&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;catid&#039;=&amp;gt;&#039;INT&#039;, &#039;limit&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;limitstart&#039;=&amp;gt;&#039;INT&#039;, &lt;br /&gt;
    &#039;filter_order&#039;=&amp;gt;&#039;CMD&#039;, &lt;br /&gt;
    &#039;filter_order_Dir&#039;=&amp;gt;&#039;CMD&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
parent::display($cachable,$safeurlparams);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Old cacheid created from URL was retained for backwards compatibility and takes effect if there are no $saferlparams. &lt;br /&gt;
&lt;br /&gt;
====Module cache====&lt;br /&gt;
This has been completly reconceptualized. Module cache now has 5 different modes of operation, 3 of them are to be set from module XML file, while 2 are meant to be used from within the module itself. Default is backwards compatible oldstatic mode that requires no changes to a module. &lt;br /&gt;
&lt;br /&gt;
Modes to be set in XML: &lt;br /&gt;
*&#039;&#039;&#039;static&#039;&#039;&#039; - one cache file for all pages with the same module parameters &lt;br /&gt;
*&#039;&#039;&#039;oldstatic&#039;&#039;&#039; - 1.5. definition of module caching, one cache file for all pages with the same module id and user aid. Default for backwards compatibility &lt;br /&gt;
*&#039;&#039;&#039;itemid&#039;&#039;&#039; - changes on itemid change &lt;br /&gt;
&lt;br /&gt;
In addition to cache field that was required in 1.5 there is now another hidden field called cachemode that sets any of the above modes. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;field name=&amp;quot;cachemode&amp;quot; type=&amp;quot;hidden&amp;quot; label=&amp;quot;&amp;quot; default=&amp;quot;static&amp;quot;&amp;gt; &lt;br /&gt;
&amp;lt;option value=&amp;quot;static&amp;quot;&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modes to be called from inside the module: &lt;br /&gt;
*&#039;&#039;&#039;safeuri&#039;&#039;&#039; - id is created from $cacheparams-&amp;gt;modeparams array, the same as in component view cache &lt;br /&gt;
*&#039;&#039;&#039;id&#039;&#039;&#039; - module sets own cache id&#039;s &lt;br /&gt;
&lt;br /&gt;
To use this modes one must rename cache field in xml to owncache field and call JModuleHelper::ModuleCache from within the module&#039;s main php file. This is actually a shortcut to cache callback to avoid code duplication in every module. &lt;br /&gt;
&lt;br /&gt;
An example that uses safeuri mode and replaces uncached&lt;br /&gt;
$list = modRelatedItemsHelper::getList($params) : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$cacheparams = new stdClass; &lt;br /&gt;
$cacheparams-&amp;gt;cachemode = &#039;safeuri&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;class = &#039;modRelatedItemsHelper&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;method = &#039;getList&#039;; &lt;br /&gt;
$cacheparams-&amp;gt;methodparams = $params; &lt;br /&gt;
$cacheparams-&amp;gt;modeparams = array(&#039;id&#039;=&amp;gt;&#039;int&#039;,&#039;Itemid&#039;=&amp;gt;&#039;int&#039;); &lt;br /&gt;
$list = JModuleHelper::ModuleCache ($module, $params, $cacheparams);&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
====Functional changes==== &lt;br /&gt;
&#039;&#039;&#039;Cache administration (Clean cache, Purge cache) now works with all drivers&#039;&#039;&#039;, not only with file cache. &lt;br /&gt;
&#039;&#039;&#039;New standalone garbage collect script&#039;&#039;&#039; that is to be called from crontab has been added. It can be found in libraries/joomla/utilities/garbagecron.php . For safety reasons it is recommended that it is renamed it to something unique. &lt;br /&gt;
&lt;br /&gt;
====CMS and framework level functional changes==== &lt;br /&gt;
&#039;&#039;&#039;Caching is implemented in all components and modules&#039;&#039;&#039; that can potentially gain from cache.&lt;br /&gt;
Caching has also been added to some most expensive and frequent framework calls JComponentHelper::_load(), JModuleHelper::_load(),JMenuSite::load(); &lt;br /&gt;
&lt;br /&gt;
====Cache library changes====&lt;br /&gt;
Cache library has been completely refactored. &lt;br /&gt;
*Cache &#039;&#039;&#039;handlers have been renamed to controllers&#039;&#039;&#039; to better reflect their role and avoid confusion with cache storage handlers (referred to as drivers in following text). &lt;br /&gt;
*&#039;&#039;&#039;New JCacheController&#039;&#039;&#039; parent class has been added and inheritance has been changed to prevent bugs occurring from controller&#039;s and storage handler&#039;s get method clashes. &lt;br /&gt;
&lt;br /&gt;
====JCache==== &lt;br /&gt;
*&#039;&#039;&#039;getAll()&#039;&#039;&#039; method was added to JCache ,JCacheStorage and all drivers and it returns all cached items (this was previously possible only with file driver and hardcoded in administration) &lt;br /&gt;
*New &#039;&#039;&#039;lock and unlock&#039;&#039;&#039; methods were added to JCache, JCacheStorage and drivers. They enable cache item locking and unlocking to prevent errors on parallel accesses and double saves. This functionally was also implemented in controllers. &lt;br /&gt;
*Workarounds are now consolidated in new &#039;&#039;&#039;JCache getWorkarounds and setWorkarounds&#039;&#039;&#039; methods, are now used by all controllers and their use has been made optional. &lt;br /&gt;
*New makeId() method in JCache that creates cache id from registered url parameters set by components and system plugins &lt;br /&gt;
&lt;br /&gt;
====JCacheController==== &lt;br /&gt;
New parent class to Controllers that also functions as an intermediate to JCache. There is no JObject inheritance as otherwise magic __call doesn&#039;t work. &lt;br /&gt;
Change was needed to prevent bugs occurring from controller&#039;s and storage handler&#039;s get method clashes. They could be renamed but this would break backwards compatibility.&lt;br /&gt;
&lt;br /&gt;
====JCacheStorage==== &lt;br /&gt;
*_getCacheId method was moved from drivers to their parent JCacheStorage and all drives now use the same method by default &lt;br /&gt;
*CacheItem was moved from cache admin to framework JCacheStorageHelper , it is used by getAll &lt;br /&gt;
*There are new cachelite and wincache drivers. All other drivers have been fixed with missing functions (gc, clean) added, their code cleaned and tested they should be now working properly. &lt;br /&gt;
*Replaced separate _expire files in filecache driver with timestamps (this should amount to cca. 40% speed gain). The same in all drivers that had this. &lt;br /&gt;
*Numerous bugfixes on all levels, most important is proper use of options defaulting to configuration parameters settings and correctly passing from level to level. &lt;br /&gt;
&lt;br /&gt;
====Other framework level changes==== &lt;br /&gt;
*Safe url parameters registration added to JControler view method. &lt;br /&gt;
*New ModuleCache method in JModuleHelper that performs the above described module cache (in 5 modes) for both, modules and module renderer. &lt;br /&gt;
*JFactory::getFeedParser has been changed to use Joomla caching instead of simplepie&#039;s.&lt;br /&gt;
&lt;br /&gt;
==Performance==&lt;br /&gt;
===Eliminate the usage of JTable for general browsing on the frontend===&lt;br /&gt;
*Session drops the usage of JTable&lt;br /&gt;
*Item views use a dedicated question, not JTable-&amp;gt;load&lt;br /&gt;
&lt;br /&gt;
==Known Issues==&lt;br /&gt;
*Still Mootools 1.2. Will be upgrading to 1.3 during the beta process.&lt;br /&gt;
*Scaling issues to address&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
===Releases===&lt;br /&gt;
*Alpha 1: 22 June 2009&lt;br /&gt;
*Alpha 2: 25 October 2009&lt;br /&gt;
*Beta 1: 18 May 2010&lt;br /&gt;
*Beta 2: 2 weeks after Beta 1&lt;br /&gt;
&lt;br /&gt;
[[Category:Joomla! 1.6]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=J1.5:How_to_add_tooltips_to_your_Joomla!_website&amp;diff=15650</id>
		<title>J1.5:How to add tooltips to your Joomla! website</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=J1.5:How_to_add_tooltips_to_your_Joomla!_website&amp;diff=15650"/>
		<updated>2009-09-18T22:42:02Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* Create a Tooltip Using a CSS Class Name */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{review}}&lt;br /&gt;
===Tooltips Overview===&lt;br /&gt;
A tooltips is a piece of text that pops up when you hover the mouse over a region on a website. If you use the Joomla! back end, for example, tooltips are used to help explain the action of different parameters, as shown in the screenshot below: &lt;br /&gt;
&lt;br /&gt;
[[Image:Screen_tooltip_example_20090208.png]]&lt;br /&gt;
&lt;br /&gt;
Tooltips are a great way to give the user access to information without using up space on the screen. You can use basic tooltips just by adding a &amp;quot;title&amp;quot; attribute to a tag. However, this doesn&#039;t give you the option to style the tooltips. With Joomla! version 1.5, it is very easy to add styled tooltips to your site. This tutorial will show you how. &amp;lt;blockquote&amp;gt;&#039;&#039;Note: If you are converting old code, make sure it doesn&#039;t use the prototype.js file.  That file will keep the tooltips from working.&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Activate Tooltip Behavior===&lt;br /&gt;
To start, you must activate the tooltip behavior.  This is done with the following line of code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JHTML::_(&#039;behavior.tooltip&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Note that you only put this line in once per file. A good place is right after the &amp;lt;code&amp;gt;defined(&#039;_JEXEC&#039;) or die(&#039;Restricted access&#039;);&amp;lt;/code&amp;gt; line. If you are curious about what this line does, it inserts the following JavaScript code in the heading of the HTML page:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    window.addEvent(&#039;domready&#039;, function(){ &lt;br /&gt;
       var JTooltips = new Tips($$(&#039;.hasTip&#039;), &lt;br /&gt;
       { maxTitleChars: 50, fixed: false}); &lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This allows tooltips to function, as outlined below.&lt;br /&gt;
&lt;br /&gt;
===Create a Tooltip with the JHTML::tooltip Method===&lt;br /&gt;
One way to create a tooltip is using the JHTML::tooltip method. The API documentation is available at [http://api.joomla.org/Joomla-Framework/HTML/JHTML.html#tooltip http://api.joomla.org/Joomla-Framework/HTML/JHTML.html#tooltip]. The method definition is shown below.  &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
void tooltip (string $tooltip, [string $title = &#039;&#039;], [string $image = &#039;tooltip.png&#039;], &lt;br /&gt;
              [string $text = &#039;&#039;], [string $href = &#039;&#039;], [boolean $link = 1])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The brackets mean the parameter is optional. The first parameter, &amp;quot;$tooltip&amp;quot;, is the only required parameter. The equals specifies the default if you do not pass that parameter. For example, the image file &#039;tooltip.png&#039; is the default image.&lt;br /&gt;
&lt;br /&gt;
The following is a basic tooltip.  Keep in mind that the image variable must be in reference to &#039;includes/js/ThemeOffice&#039;.  Use the prefix &#039;../../../&#039; to reference from the root of the Joomla installation.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JHTML::tooltip(&#039;This is the tooltip text&#039;, &#039;Tooltip title&#039;, &#039;tooltip.png&#039;, &#039;&#039;, &lt;br /&gt;
               &#039;http://www.joomla.org&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The above will make a tooltip using the default &amp;quot;tooltip.png&amp;quot; image, as shown below.[[Image:Tooltip_tutorial_example_screenshot_20090208.png|center|frame]]Clicking the image will take you to &amp;lt;tt&amp;gt;http://www.joola.org&amp;lt;/tt&amp;gt;, since that is the &amp;quot;$href&amp;quot; argument. The HTML source for this tooltip is as follows:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;editlinktip hasTip&amp;quot; title=&amp;quot;Tooltip title::This is the tooltip text&amp;quot; &amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;http://www.joomla.org&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;/my_joomla_path/includes/js/ThemeOffice/tooltip.png&amp;quot; border=&amp;quot;0&amp;quot; alt=&amp;quot;Tooltip&amp;quot;/&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;Internet Explorer Bug: As shown above, when you use the JHTML::tooltip method to create an image tooltip, it creates an &amp;quot;alt&amp;quot; attribute with the value &amp;quot;Tooltip&amp;quot;. The &amp;quot;alt&amp;quot; attribute is used in cases where the image file cannot be found or for accessibility (for example, for blind users). Internet Explorer automatically -- and incorrectly -- displays the &amp;quot;alt&amp;quot; attribute as a tooltip. This means that image tooltips created by JHTML::tooltip (like the example above) will display with two tooltips when viewed with Internet Explorer, as shown below.&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
[[Image:Tooltip_tutorial_ie7bug_20090301.png|center|frame]]&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;You can avoid this problem either by using text tooltips or by not using this method for image tooltips. Instead, just enter the HTML manually and set the &amp;quot;alt&amp;quot; attribute to an empty string (alt=&amp;quot;&amp;quot;).&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code is almost the same as above except the image will not be a link (because the &amp;quot;$href&amp;quot; argument is omitted).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JHTML::tooltip(&#039;This is the tooltip text&#039;, &#039;Tooltip title&#039;, &lt;br /&gt;
               &#039;tooltip.png&#039;, &#039;&#039;, &#039;&#039;, false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A tooltip can be attached to an image or to text. For example, this code &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo JHTML::tooltip(&#039;This is a tooltip attached to text&#039;, &#039;Text Tooltip Title&#039;, &lt;br /&gt;
	            &#039;&#039;, &#039;Hover on this text to see the tooltip&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
will show a tooltip attached to text, as shown below.&lt;br /&gt;
&lt;br /&gt;
[[Image:Tooltip_tutorial_example_screenshot2_20090208.png|center|frame]]&lt;br /&gt;
&lt;br /&gt;
Note that specifying the &amp;quot;$text&amp;quot; parameter will override any image you have passed to tooltip.&lt;br /&gt;
&lt;br /&gt;
===Create a Tooltip Using a CSS Class Name===&lt;br /&gt;
If we look at the HTML page source generated by the &amp;lt;code&amp;gt;JHTML::tooltip&amp;lt;/code&amp;gt; function above, here is what we see:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;editlinktip hasTip&amp;quot; &lt;br /&gt;
      title=&amp;quot;Text Tooltip Title::This is a tooltip attached to text&amp;quot; &lt;br /&gt;
      style=&amp;quot;text-decoration: none; color: #333;&amp;quot;&amp;gt;&lt;br /&gt;
      Hover on this text to see the tooltip&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This function generates an HTML &amp;quot;span&amp;quot; tag with the classes &amp;quot;editlinktip&amp;quot; and &amp;quot;hasTip&amp;quot; and an attribute called &amp;quot;title&amp;quot;. Notice that the the &amp;quot;title&amp;quot; attribute has two parts, &amp;lt;code&amp;gt;&amp;lt;tooltip title&amp;gt;::&amp;lt;tooltip text&amp;gt;&amp;lt;/code&amp;gt; (for example, &amp;quot;Tooltip Title::This is the tooltip text&amp;quot;). You can create a tooltip with only text or with only a title. The title has implications for styling, as we&#039;ll see below.&lt;br /&gt;
&lt;br /&gt;
The Javascript inserted by the &amp;lt;code&amp;gt;JHTML::(&#039;behavior_tooltip&#039;)&amp;lt;/code&amp;gt; command we entered earlier picks up this tag based on the class called &amp;quot;hasTip&amp;quot;. So, a second way of creating a tooltip is to simply create a tag with a class called &amp;quot;hasTip&amp;quot; and an attribute of &amp;quot;title&amp;quot;. For example, this code&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;hasTip&amp;quot; &lt;br /&gt;
   title=&amp;quot;Text Tooltip Title::This is a tooltip attached to text&amp;quot;&amp;gt;&lt;br /&gt;
   Hover on this text to see the tooltip&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
will produce exactly the same effect as the &amp;lt;code&amp;gt;JHTML::tooltip()&amp;lt;/code&amp;gt; example above.&lt;br /&gt;
&lt;br /&gt;
===Adding CSS Styling to the Tooltip===&lt;br /&gt;
The default tooltips, whether using the JHTML::tooltip method or class method, use the following three CSS classes: &amp;lt;tt&amp;gt;.tool-tip&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.tool-title&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;.tool-text&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Here are the default styles.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Tooltips */&lt;br /&gt;
.tool-tip {&lt;br /&gt;
   float: left;&lt;br /&gt;
   background: #ffc;&lt;br /&gt;
   border: 1px solid #D4D5AA;&lt;br /&gt;
   padding: 5px;&lt;br /&gt;
   max-width: 200px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tool-title {&lt;br /&gt;
   padding: 0;&lt;br /&gt;
   margin: 0;&lt;br /&gt;
   font-size: 100%;&lt;br /&gt;
   font-weight: bold;&lt;br /&gt;
   margin-top: -15px;&lt;br /&gt;
   padding-top: 15px;&lt;br /&gt;
   padding-bottom: 5px;&lt;br /&gt;
   background: url(../images/selector-arrow.png) no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.tool-text {&lt;br /&gt;
   font-size: 100%;&lt;br /&gt;
   margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you have a custom CSS file, copy this code and alter it to your liking. Note that the &amp;lt;tt&amp;gt;.tool-title&amp;lt;/tt&amp;gt; class uses by default the &amp;quot;selector-arrow.png&amp;quot; image. This is what gives the outline of the tooltip the little pointer in the upper left of the tooltip box. If you leave out a title in your tooltip, you will just get a rectangle, without the pointer.&lt;br /&gt;
&lt;br /&gt;
===Customizing Your Yooltips===&lt;br /&gt;
Ok, now it&#039;s time to have some fun. The &amp;lt;code&amp;gt;JHTML::_(&#039;behavior.tooltip&#039;)&amp;lt;/code&amp;gt; can take two optional parameters. The first parameter is the name of the CSS class that will be used to identify the tooltip. As we saw earlier, this defaults to &amp;quot;hasTip&amp;quot;. The second optional parameter is an array of parameters that you can use to fine-tune the tooltip functionality. These are explained below. &lt;br /&gt;
* &#039;&#039;&#039;maxTitleChars:&#039;&#039;&#039; The maximum length of the title (the part of the &amp;quot;title&amp;quot; attribute before the &amp;quot;::&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;showDelay, hideDelay:&#039;&#039;&#039; The time to delay showing or hiding the tooltip, in milliseconds. Default is 100.&lt;br /&gt;
* &#039;&#039;&#039;className:&#039;&#039;&#039; The first part of the class name used to style the actual tooltip. The default, as we saw, is &amp;quot;tool&amp;quot;, and the full class names by default are &amp;quot;tool-tip&amp;quot;, &amp;quot;tool-title&#039;, and &amp;quot;tool-text&amp;quot;. So, for example, if we set this to &amp;quot;custom&amp;quot;, we would style the classes &amp;quot;custom-tip&amp;quot;, &amp;quot;custom-title&amp;quot;, and &amp;quot;custom-text&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;fixed:&#039;&#039;&#039; Whether or not to have the tooltip move with the mouse. If set to &amp;quot;true&amp;quot;, the tooltip will be centered below the text or image. If set to &amp;quot;false&amp;quot;, the tooltip will move with the mouse. Default is &amp;quot;false&amp;quot;. &lt;br /&gt;
* &#039;&#039;&#039;onShow, onHide:&#039;&#039;&#039; Functions to call for the onShow and onHide events. We&#039;ll see an example below where we can use these to create a fade-in and fade-out for the tooltip.&lt;br /&gt;
&lt;br /&gt;
In the next section, we&#039;ll show how to use these parameters with some examples.&lt;br /&gt;
&lt;br /&gt;
===Tooltip With Different Classes===&lt;br /&gt;
In this example, we will create a tooltip using different selector and tooltip styling classes. Why might we want to do this? One reason would be if we had different types of tooltips and we wanted to style them differently.&lt;br /&gt;
&lt;br /&gt;
Here is the code to create the tooltip Javascript function:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$toolTipArray = array(&#039;className&#039;=&amp;gt;&#039;custom2&#039;);&lt;br /&gt;
JHTML::_(&#039;behavior.tooltip&#039;, &#039;.hasTip2&#039;, $toolTipArray);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
In this code, we are creating an array with just one element -- to set the &amp;quot;className&amp;quot; parameter to &amp;quot;custom2&amp;quot;. This means that, to style these tooltips, we would use the classes &amp;lt;tt&amp;gt;custom2-tip&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;custom2-title&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;custom2-text&amp;lt;/tt&amp;gt;. Then we call the method with the arguments &amp;quot;.hasTip2&amp;quot; and the array &amp;quot;$toolTipArray&amp;quot;. It can be a little confusing, because we have two CSS classes at work here. The class &amp;quot;.hasTip2&amp;quot; is used in the HTML tag. That is how the Javascript program identifies the tooltips to operate on. The class &amp;quot;custom2&amp;quot; is used as the first part of the three CSS classes to use to style the actual tooltip itself.&lt;br /&gt;
&lt;br /&gt;
To use this new tooltip, we could use the following code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;hasTip2&amp;quot; &lt;br /&gt;
	title=&amp;quot;My Tooltip Title :: Tooltip text for hasTip2 class with custom2 style classes.&amp;quot;&amp;gt;&lt;br /&gt;
	hasTip2 and custom2 example&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Since we set the class to &amp;quot;hasTip2&amp;quot;, this tag will be processed by the new version of the tooltip program. So, if we use both the default tooltip (&amp;quot;hasTip&amp;quot; class) and the new tooltip (&amp;quot;hasTip2&amp;quot; class) in the same page, we can style them differently using &amp;quot;tool-&amp;quot; styles for the default and &amp;quot;custom2-&amp;quot; styles for the &amp;quot;hasTip2&amp;quot; tooltips.&lt;br /&gt;
&lt;br /&gt;
Next, let&#039;s look at a more complex example, shown below.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$toolTipArray = array(&#039;className&#039; =&amp;gt; &#039;custom2&#039;, &#039;showDelay&#039;=&amp;gt;&#039;500&#039;, &lt;br /&gt;
   &#039;hideDelay&#039;=&amp;gt;&#039;500&#039;, &#039;fixed&#039;=&amp;gt;true,&lt;br /&gt;
   &#039;onShow&#039;=&amp;gt;&amp;quot;function(tip) {tip.effect(&#039;opacity&#039;, &lt;br /&gt;
      {duration: 500, wait: false}).start(0,1)}&amp;quot;, &lt;br /&gt;
   &#039;onHide&#039;=&amp;gt;&amp;quot;function(tip) {tip.effect(&#039;opacity&#039;, &lt;br /&gt;
      {duration: 500, wait: false}).start(1,0)}&amp;quot;);&lt;br /&gt;
JHTML::_(&#039;behavior.tooltip&#039;, &#039;.hasTip2&#039;, $toolTipArray); ?&amp;gt; &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Again, we are building an array to pass to the &amp;lt;code&amp;gt;JHTML::_(&#039;behavior.tooltip&#039;)&amp;lt;/code&amp;gt; function. Again, we are setting the &amp;quot;className&amp;quot; parameter to &amp;quot;custom2&amp;quot;. We are also setting the &amp;quot;showDelay&amp;quot; and &amp;quot;hideDelay&amp;quot; parameters to 500 milliseconds (.5 seconds). So the tooltip will show only after the mouse has hovered for this amount of time. &lt;br /&gt;
&lt;br /&gt;
Notice that we are setting the parameter &amp;quot;fixed&amp;quot; to &amp;quot;true&amp;quot; (without the quotes). This means that the tooltip will not move with the mouse. Instead, it will always show centered below the tooltip text or image.&lt;br /&gt;
&lt;br /&gt;
Finally, the tricky part. We are creating functions to pass in to the &amp;quot;onShow&amp;quot; and &amp;quot;onHide&amp;quot; events. These functions cause the tooltip to fade in and fade out over the space of 500 milliseconds. This is done by gradually varying the tooltip&#039;s CSS &amp;quot;opacity&amp;quot; style from &amp;quot;0&amp;quot; (completely transparent) to &amp;quot;1&amp;quot; (completely opaque). If we wanted the tooltip to be partially transparent, we could change these to &amp;lt;code&amp;gt;start(0,.8)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;start(.8,0)&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
These functions are similar to the sample code in the [http://demos111.mootools.net/Tips MooTools demo tutorial]. Click on the link called &amp;quot;js code&amp;quot; and look at the code for the &amp;quot;Tips2&amp;quot; demo. We have just taken the code from the initialize function and incorporated it into the &amp;quot;onShow&amp;quot; and &amp;quot;onHide&amp;quot; functions.&lt;br /&gt;
&lt;br /&gt;
The last line of code above creates the actual Javascript code in our Joomla! document. If we show the page and view source, we see the following:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEvent(&#039;domready&#039;, function(){ &lt;br /&gt;
   var JTooltips = new Tips($$(&#039;.hasTip2&#039;), {&lt;br /&gt;
      maxTitleChars: 50, showDelay: 500, hideDelay: 500, className: &#039;custom2&#039;, &lt;br /&gt;
         fixed: true, &lt;br /&gt;
      onShow: function(tip) {tip.effect(&#039;opacity&#039;, {duration: 500, wait: false}).start(0,1)}, &lt;br /&gt;
      onHide: function(tip) {tip.effect(&#039;opacity&#039;, {duration: 500, wait: false}).start(1,0)}&lt;br /&gt;
   }); &lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
So we can see the effect of the parameters that we passed to the &amp;lt;code&amp;gt;JHTML::_(&#039;behavior.tooltip&#039;)&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;offsets Parameter&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;Note: The &amp;quot;offsets&amp;quot; parameter doesn&#039;t work in version 1.5.9 and earlier because of a bug. As of version 1.5.10 it should work as outlined below.&#039;&#039;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
You can control the x and y distance, in pixels, from the cursor to the tooltip using the &amp;quot;offsets&amp;quot; parameter. This parameter must be an array as shown in the example code below:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// set x (horizontal) distance to 20 pixels, y (vertical) distance to 30 pixels&lt;br /&gt;
$toolTipArray = array(&#039;offsets&#039;=&amp;gt;array(&#039;x&#039;=&amp;gt;20, &#039;y&#039;=&amp;gt;30), &#039;maxtitlechars&#039;=&amp;gt;40);&lt;br /&gt;
JHTML::_(&#039;behavior.tooltip&#039;, &#039;.customOffset&#039;, $toolTipArray);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Using an External Javascript File===&lt;br /&gt;
There are times when you might prefer to work with a separate Javascript file. This gives you complete flexibility to use all of the mootools capabilities. To do this:&lt;br /&gt;
# Create the separate Javascript file and save it somewhere in your Joomla! site (for example, &amp;quot;templates/&amp;lt;your template&amp;gt;/js/yourjsfile.js&amp;quot;.&lt;br /&gt;
# Use the &amp;lt;code&amp;gt;JHTML::script&amp;lt;/code&amp;gt; function to add this script to your document. For example: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
   $filename = &#039;testtooltip.js&#039;; // this file is used for class=&amp;quot;hasTip3&amp;quot; titles&lt;br /&gt;
   $path = &#039;templates/rhuk_milkyway/js/&#039;; // path to the file&lt;br /&gt;
   // true means MooTools will load if it is not already loaded&lt;br /&gt;
   JHTML::script($filename, $path, true); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This will load your script into the document and make sure that the MooTools library is available.&lt;br /&gt;
&lt;br /&gt;
===Complete Code Example===&lt;br /&gt;
Here is an example that incorporates all of the elements discussed in this tutorial. So you can see the code in action, we will create an override of the &amp;quot;mod_stats&amp;quot; Module and add our test code there. We will use the rhuk_milkyway template.&lt;br /&gt;
&lt;br /&gt;
To set up the template override, create a folder called &amp;quot;templates/rhuk_milkyway/html/mod_stats&amp;quot; and copy the file &amp;quot;modules/mod_stats/tmpl/default.php&amp;quot; to this new folder.&lt;br /&gt;
&lt;br /&gt;
After line 2 of this file (&amp;lt;code&amp;gt;defined(&#039;_JEXEC&#039;) or die(&#039;Restricted access&#039;);&amp;lt;/code&amp;gt;), insert the following:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
JHTML::_(&#039;behavior.tooltip&#039;);&lt;br /&gt;
$toolTipArray = array(&#039;className&#039; =&amp;gt; &#039;custom2&#039;, &#039;showDelay&#039;=&amp;gt;&#039;500&#039;, &#039;hideDelay&#039;=&amp;gt;&#039;500&#039;, &lt;br /&gt;
   &#039;fixed&#039;=&amp;gt;&#039;true&#039; &lt;br /&gt;
   , &#039;onShow&#039;=&amp;gt;&amp;quot;function(tip) {tip.effect(&#039;opacity&#039;, &lt;br /&gt;
        {duration: 500, wait: false}).start(0,1)}&amp;quot;&lt;br /&gt;
   , &#039;onHide&#039;=&amp;gt;&amp;quot;function(tip) {tip.effect(&#039;opacity&#039;, &lt;br /&gt;
        {duration: 500, wait: false}).start(1,0)}&amp;quot;);&lt;br /&gt;
JHTML::_(&#039;behavior.tooltip&#039;, &#039;.hasTip2&#039;, $toolTipArray);  // class=&amp;quot;hasTip2&amp;quot; titles&lt;br /&gt;
$filename = &#039;testtooltip.js&#039;; // used for class=&amp;quot;hasTip3&amp;quot; titles&lt;br /&gt;
$path = &#039;templates/rhuk_milkyway/js/&#039;;&lt;br /&gt;
JHTML::script($filename, $path, true); // MooTools will load if it is not already loaded&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Here we are creating the Javascript functions we will need later. The first line is the simple default declaration that will use the &amp;quot;.hasTip&amp;quot; and &amp;quot;tool-&amp;quot; CSS classes. &lt;br /&gt;
&lt;br /&gt;
The next 5 lines create the more customized function that includes the fade-in and fade-out. It uses the &amp;quot;.hasTip2&amp;quot; to create the tip and the classes starting with &amp;quot;custom2-&amp;quot; to style the tooltip.&lt;br /&gt;
&lt;br /&gt;
The last 3 lines reference the external Javascript file, which will be created below. The class information will be contained in that file.&lt;br /&gt;
&lt;br /&gt;
Now, time for some more coding. At the end of the &amp;quot;modules/mod_stats/tmpl/default.php&amp;quot; file, add the code shown below:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Tooltip Examples&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;?php echo JHTML::tooltip(&#039;This is the tooltip text&#039;, &#039;Tooltip title&#039;, &lt;br /&gt;
	&#039;tooltip.png&#039;, &#039;&#039;, &#039;http://www.joomla.org&#039;);?&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;?php echo JHTML::tooltip(&#039;This is a tooltip attached to text&#039;, &#039;Text Tooltip Title&#039;, &lt;br /&gt;
	&#039;&#039;, &#039;Hover on this text to see the tooltip&#039;);?&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;							&lt;br /&gt;
&amp;lt;a class=&amp;quot;hasTip&amp;quot; title=&amp;quot;My Title::Tooltip on &#039;a&#039; tag text using default &#039;hasTip&#039; class&amp;quot; &lt;br /&gt;
	href=&amp;quot;http://www.joomla.org&amp;quot;&amp;gt;Tooltip on a link example&amp;lt;/a&amp;gt; &lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;hasTip2&amp;quot; &lt;br /&gt;
	title=&amp;quot;My Tooltip Title :: Tooltip text for hasTip2 class with custom2 style classes.&amp;quot;&amp;gt;&lt;br /&gt;
	hasTip2 and custom2 example&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;hasTip3&amp;quot; &lt;br /&gt;
	title=&amp;quot;hasTip3 Title::This is using class &#039;hasTip3&#039; using external JS script.&amp;quot;&amp;gt;&lt;br /&gt;
           hasTip3 hover text&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The first two examples using the &amp;lt;code&amp;gt;JHTML::tooltip&amp;lt;/code&amp;gt; function to create the tooltip HTML code. &lt;br /&gt;
&lt;br /&gt;
The third example shows an &amp;quot;a&amp;quot; tag with a tooltip. This illustrates that you can put tooltips on most HTML tags, not just &amp;quot;span&amp;quot; tags. Again, it is using the &amp;quot;hasTip&amp;quot; class, so it will be controlled by the Javascript above called with the &amp;quot;.hasTip&amp;quot; argument and will be styled with the default &amp;quot;tool-&amp;quot; styles.&lt;br /&gt;
&lt;br /&gt;
The fourth example shows a &amp;quot;span&amp;quot; tag using the &amp;quot;hasTip2&amp;quot; class. So it will be styled using the &amp;quot;custom2-&amp;quot; classes and will have the &amp;quot;showDelay&amp;quot; and &amp;quot;hideDelay&amp;quot; of 500 milliseconds and have &amp;quot;fixed&amp;quot; equal to &amp;quot;true&amp;quot; (so the tip will not move with the mouse). Also, it uses the special fade-in and fade-out effects. &lt;br /&gt;
&lt;br /&gt;
The last example will use the Javascript code from the external file, shown below.&lt;br /&gt;
&lt;br /&gt;
Now, some more coding. Create a JavaScript file called &amp;quot;testtooltip.js&amp;quot; and save it into the folder &amp;quot;templates/rhuk_milkyway/js&amp;quot;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEvent(&#039;domready&#039;, function(){&lt;br /&gt;
	   //do your tips stuff in here...&lt;br /&gt;
	   var zoomTip = new Tips($$(&#039;.hasTip3&#039;), {&lt;br /&gt;
	      className: &#039;custom3&#039;, //this is the prefix for the CSS class&lt;br /&gt;
	      offsets: {&lt;br /&gt;
	  		&#039;x&#039;: 20,       //default is 16&lt;br /&gt;
	  		&#039;y&#039;: 30        //default is 16&lt;br /&gt;
              },&lt;br /&gt;
	      initialize:function(){&lt;br /&gt;
	         this.fx = new Fx.Style(this.toolTip, &#039;opacity&#039;, &lt;br /&gt;
	        		 {duration: 1000, wait: false}).set(0);&lt;br /&gt;
	      },&lt;br /&gt;
	      onShow: function(toolTip) {&lt;br /&gt;
	         this.fx.start(0,.8);&lt;br /&gt;
	      },&lt;br /&gt;
	      onHide: function(toolTip) {&lt;br /&gt;
	         this.fx.start(.8,0);&lt;br /&gt;
	      }&lt;br /&gt;
	   });&lt;br /&gt;
	});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This code will operate on the &amp;quot;hasTip3&amp;quot; class and will use style classes starting with &amp;quot;custom3-&amp;quot;. We are setting the x distance (from the cursor to the tooltip) to 20 pixels and the y distance to 30 pixels. This also has the fade-in and fade-out functionality, but the final &amp;quot;opacity&amp;quot; value is set to .8, meaning that the tooltip will be slightly transparent.&lt;br /&gt;
&lt;br /&gt;
Finally, add this to the end of your &amp;quot;templates/rhuk_milkyway/css/template.css&amp;quot; file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.custom2-tip {&lt;br /&gt;
	color: #000;&lt;br /&gt;
	width: 130px;&lt;br /&gt;
	z-index: 13000;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.custom2-title {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 11px;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	color: #024A68;&lt;br /&gt;
	padding: 8px 8px 4px;&lt;br /&gt;
	background: #3CA0D0;&lt;br /&gt;
	border-bottom: 1px solid #024A68;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.custom2-text {&lt;br /&gt;
	font-size: 11px;&lt;br /&gt;
	padding: 4px 8px 8px;&lt;br /&gt;
	background: #63ADD0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.custom3-tip {&lt;br /&gt;
	color: #000;&lt;br /&gt;
	width: 130px;&lt;br /&gt;
	z-index: 13000;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.custom3-title {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 11px;&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	color: #3E4F14;&lt;br /&gt;
	padding: 8px 8px 4px;&lt;br /&gt;
	background: #C3DF7D;&lt;br /&gt;
	border-bottom: 1px solid #B5CF74;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.custom3-text {&lt;br /&gt;
	font-size: 11px;&lt;br /&gt;
	padding: 4px 8px 8px;&lt;br /&gt;
	background: #CFDFA7;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Here we are just adding different colors for the &amp;quot;custom2-&amp;quot; and &amp;quot;custom3-&amp;quot; styles so you can see the effect of the different tooltip code.&lt;br /&gt;
&lt;br /&gt;
Notice that &amp;lt;tt&amp;gt;.custom2-title&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;.custom3-title&amp;lt;/tt&amp;gt; classes do not have a background property. So these tooltips will be a box without the neat little arrow pointing at the mouse. If you wanted, you could create an image similar to &amp;quot;templates/system/images/selector-arrow.png&amp;quot; of the right color and add that as a background to these classes.&lt;br /&gt;
&lt;br /&gt;
===Example Code Screenshots===&lt;br /&gt;
Here are some screenshots taken from the sample code above. The first screenshot shows the modified &amp;quot;mod_stats&amp;quot; modules with our sample code.&lt;br /&gt;
[[Image:Screen_tooltip_example2_20090210.png|center|frame]]&lt;br /&gt;
The screenshot below shows the fade-in effect for the &amp;quot;.hasTip2&amp;quot; tooltip. Notice also that the tooltip is centered below the text. This is the effect of setting &amp;quot;fixed&amp;quot; equal to &amp;quot;true&amp;quot;.&lt;br /&gt;
[[Image:Screen_tooltip_example1_20090209.png|center|frame]]&lt;br /&gt;
The last screenshot shows the different styling for the &amp;quot;.hasTip3&amp;quot; tooltip, based on the &amp;quot;custom3-&amp;quot; CSS class styles. &lt;br /&gt;
[[Image:Screen_tooltip_example3_20090210.png|center|frame]]&lt;br /&gt;
&lt;br /&gt;
===More Information===&lt;br /&gt;
More information about the topics covered in this tutorial is available at the links below. Note that Joomla! version 1.5 uses MooTools version 1.11. The current version of MooTools is 1.2.&lt;br /&gt;
* Joomla API - [http://api.joomla.org http://api.joomla.org]&lt;br /&gt;
* Documentation for 1.11 MooTools Tips: [http://docs111.mootools.net/Plugins/Tips.js http://docs111.mootools.net/Plugins/Tips.js]&lt;br /&gt;
* Mootools demos for version 1.11 - [http://demos111.mootools.net/Tips http://demos111.mootools.net/Tips]&lt;br /&gt;
* Mootools Website - [http://www.mootools.net/ http://www.mootools.net/]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Localisation&amp;diff=2372</id>
		<title>Localisation</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Localisation&amp;diff=2372"/>
		<updated>2008-01-24T22:19:09Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* The challenges and the solutions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{review}}&lt;br /&gt;
&lt;br /&gt;
== Implementation of UTF-8 in Joomla! 1.5 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This text is based on an article rewritten by former core team member David Gal for a German Linux publication.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
UTF-8 is a variable length character encoding using one to four bytes per character, depending on the Unicode symbol. Four bytes may seem like a lot for one character, however, this is required only for special characters outside the Basic Multilingual Plane, which are generally very rare. The first byte (positions 0-127) is used for encoding ASCII which gives the character set full backward compatibility with ASCII.&lt;br /&gt;
&lt;br /&gt;
UTF-8 is becoming the standard and internationally accepted multilingual environment and is the preferred way to communicate non-ASCII characters over the Internet. Being a subset of Unicode, UTF-8 has the special benefit of using less space to store or transmit ASCII. As the bulk of Internet transmissions are using the 7 bit ASCII characters, UTF-8 encoding saves volume and bandwidth.&lt;br /&gt;
&lt;br /&gt;
It also provides a single encoding for all other characters that were previously implemented using 8 bit character codes hand-in-hand with a specific encoding table (i.e iso-8859-2) in order to know how to represent the character code. Up to now this basically limited Web page display to ASCII Latin characters plus one other language or set of diacritic Latin characters (accents and umlauts for example). UTF-8 now provides one code page for all languages.&lt;br /&gt;
&lt;br /&gt;
Migration to UTF-8 promises to be simple for existing ASCII texts as UTF-8 encoding for ASCII has no changes.&lt;br /&gt;
&lt;br /&gt;
=== Implementing in Joomla! – a bit more than setting encoding to ‘utf-8’ ===&lt;br /&gt;
&lt;br /&gt;
Up to now in order to change from one encoding to another all that was required was to change the _ISO definition in the language file resulting in the ‘charset=myNewEncoding’ statement in the html meta tag. This was simple as all encodings were single-byte character encodings. For the entire Joomla! system, a character equals a byte and Joomla! didn’t really care what the character representation of the particular byte is.&lt;br /&gt;
&lt;br /&gt;
Now, in Joomla! 1.5, we are starting to use multi-byte characters and not only that – some are one byte long and some are 3 bytes long. How does this affect Joomla! and what is required to truly be able to state that Joomla! supports UTF-8?&lt;br /&gt;
&lt;br /&gt;
=== There are four affected areas: ===&lt;br /&gt;
&lt;br /&gt;
# The database needs to support utf-8 data storage. For example: a text field of type varchar was given a length of 20 with the intention of being able to store up to 20 characters – which also meant 20 bytes. Now, with UTF-8, 20 characters might mean between 20 and 60 bytes. The database needs to be able to adjust accordingly. Fortunately MySQL version 4.1.2 and up, support UTF-8.&lt;br /&gt;
# The connection between the Joomla! application and the database needs to know the encoding of the data in order to know whether encoding translation is required. (There are cases where the application uses one encoding and the database uses another).&lt;br /&gt;
# The html page needs to know which encoding it carries. This is trivial and all that is required is that the html meta tags will show that the encoding is ‘utf-8’.&lt;br /&gt;
# Joomla’s PHP string handling functions need to be UTF-8 aware. This is not at all trivial as PHP’s regular string functions are all single-byte aware and a special set of functions is needed.&lt;br /&gt;
&lt;br /&gt;
=== The challenges and the solutions ===&lt;br /&gt;
&lt;br /&gt;
The first major challenge was the fact that there are still many hosts that are running MySQL version 4.0.x and older databases. These do not have UTF-8 support. It is possible to store UTF-8 data in non UTF-8 tables. As far as the database is concerned it is storing bytes and returning them to the application when needed.&lt;br /&gt;
&lt;br /&gt;
However, as already mentioned, there is a possibility that the user will want to store a 20 character field that holds UTF-8 characters that are not in the regular ASCII area. If these are committed to a varchar (20) database field – the data will be truncated. This is not only a problem with non “Latin character�? languages (that are normally in the multi-byte area) but also with all European languages with possible the exception of English. Every one of these languages has some special Latin characters (accents and umlauts for example) that are now multi-byte characters. The word ‘käse’ is now 5 bytes long!&lt;br /&gt;
&lt;br /&gt;
The core team rightfully decided that Joomla! 1.5 should also be able to work on older databases and not only that – the backward compatibility should be transparent to the user. The installer now checks for the version of MySQL – if it is version 4.1.2 and up, then UTF-8 tables are created with the user being able to choose the desired collation. If the database is not supporting UTF-8 then the installer actually runs a separate script creating a database structure that provides extra storage space for potentially longer strings. This is anticipated to eliminate the danger of data truncation by the database.&lt;br /&gt;
&lt;br /&gt;
The second major challenge relates to the lack of UTF-8 support in PHP. All standard string functions in PHP are only able to work with single-byte characters. Using these functions on UTF-8 encoded data can result in logical failures and also in data corruption.&lt;br /&gt;
&lt;br /&gt;
The problem lies with the fact that until PHP 6 is released, there is no comprehensive native UTF-8 support in PHP. There is a multi-byte extension named ‘mbstring’ which exists from version 4.1 but it is not loaded by default. In addition it also serves other multi-byte encodings such as some Far Eastern languages. This means that it may be present but not set to the correct settings for UTF-8. An additional extension named ‘iconv’, which has some parallel capability, is present in PHP 5 but optional and missing some functions in PHP 4.&lt;br /&gt;
&lt;br /&gt;
Here again, the core team decided to vote for full backward compatibility and for the solution to be transparent to the user. The solution is a combination of either using PHP provided functions, if they are present, or using a special library of UTF-8 aware string functions, if no PHP native functions are available. This provides the best performance (PHP functions available) together with complete backward compatibility. A Joomla String Class provides this functionality and it will be included in the API for third party developers.&lt;br /&gt;
&lt;br /&gt;
There is no user configuration or setup required regarding PHP UTF-8 support. There is one small exception to this rule which could theoretically occur if, in the host, one or two of the mbstring settings (that cannot be changed from within code) are set to a value that is adverse to UTF-8. The installer will identify this and advise on how to change the setting locally using .htaccess.&lt;br /&gt;
&lt;br /&gt;
=== Migration ===&lt;br /&gt;
&lt;br /&gt;
Considering that data will, in most cases, need to be converted to UTF-8, it will be recommended to migrate existing data to a freshly installed Joomla! 1.1 site and not to perform upgrades of existing Joomla! 1.0.x sites. Specific migration guidance will be provided with the release.&lt;br /&gt;
&lt;br /&gt;
=== The quantum jump ===&lt;br /&gt;
&lt;br /&gt;
Joomla! 1.5 will take a huge jump ahead of the rest of the CMS pack with its Internationalisation features. UTF-8 is undoubted, the big discriminator – all languages with one encoding. In addition, RTL support and the language packs for back-end, installer and help system, make Joomla! 1.5 a complete package for use in any language or combination of languages. JoomFish will be the icing on the cake.&lt;br /&gt;
&lt;br /&gt;
== Language codes - RFC 3066 ==&lt;br /&gt;
&lt;br /&gt;
Providing decent localisation support for Joomla - the kind of support that will carry smoothly across to the work of all extension providers (from language packs to components, modules and plugins), requires a certain amount of attention to some nitty gritty details. A questions that pops up are: “How do we identify a language?” - followed by: “How do we provide a consistent naming convention?” and: “How will everyone know about this?”&lt;br /&gt;
&lt;br /&gt;
Simple - we need a convention - preferably public - hopefully without ambiguity - and it should be kept current.&lt;br /&gt;
&lt;br /&gt;
A little bit of digging unearthed RFC 3066 and a decision was made to use it as the convention for language identification in Joomla as of version 1.5.&lt;br /&gt;
&lt;br /&gt;
This results in the following conventions for the language names :&lt;br /&gt;
# The delimiter between the subtags should be the HYPHEN / MINUS character and not the UNDERSCORE character&lt;br /&gt;
# The first tag with the language tag (based on ISO 639) should use the TWO letter code for a language and not the THREE letter code. The THREE letter code may only be used if a TWO letter code does not exist for the language&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
	<entry>
		<id>https://docs.sandbox.joomla.org/index.php?title=Localisation&amp;diff=2365</id>
		<title>Localisation</title>
		<link rel="alternate" type="text/html" href="https://docs.sandbox.joomla.org/index.php?title=Localisation&amp;diff=2365"/>
		<updated>2008-01-24T15:56:00Z</updated>

		<summary type="html">&lt;p&gt;Dieter: /* The challenges and the solutions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{review}}&lt;br /&gt;
&lt;br /&gt;
== Implementation of UTF-8 in Joomla! 1.5 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This text is based on an article rewritten by former core team member David Gal for a German Linux publication.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
UTF-8 is a variable length character encoding using one to four bytes per character, depending on the Unicode symbol. Four bytes may seem like a lot for one character, however, this is required only for special characters outside the Basic Multilingual Plane, which are generally very rare. The first byte (positions 0-127) is used for encoding ASCII which gives the character set full backward compatibility with ASCII.&lt;br /&gt;
&lt;br /&gt;
UTF-8 is becoming the standard and internationally accepted multilingual environment and is the preferred way to communicate non-ASCII characters over the Internet. Being a subset of Unicode, UTF-8 has the special benefit of using less space to store or transmit ASCII. As the bulk of Internet transmissions are using the 7 bit ASCII characters, UTF-8 encoding saves volume and bandwidth.&lt;br /&gt;
&lt;br /&gt;
It also provides a single encoding for all other characters that were previously implemented using 8 bit character codes hand-in-hand with a specific encoding table (i.e iso-8859-2) in order to know how to represent the character code. Up to now this basically limited Web page display to ASCII Latin characters plus one other language or set of diacritic Latin characters (accents and umlauts for example). UTF-8 now provides one code page for all languages.&lt;br /&gt;
&lt;br /&gt;
Migration to UTF-8 promises to be simple for existing ASCII texts as UTF-8 encoding for ASCII has no changes.&lt;br /&gt;
&lt;br /&gt;
=== Implementing in Joomla! – a bit more than setting encoding to ‘utf-8’ ===&lt;br /&gt;
&lt;br /&gt;
Up to now in order to change from one encoding to another all that was required was to change the _ISO definition in the language file resulting in the ‘charset=myNewEncoding’ statement in the html meta tag. This was simple as all encodings were single-byte character encodings. For the entire Joomla! system, a character equals a byte and Joomla! didn’t really care what the character representation of the particular byte is.&lt;br /&gt;
&lt;br /&gt;
Now, in Joomla! 1.5, we are starting to use multi-byte characters and not only that – some are one byte long and some are 3 bytes long. How does this affect Joomla! and what is required to truly be able to state that Joomla! supports UTF-8?&lt;br /&gt;
&lt;br /&gt;
=== There are four affected areas: ===&lt;br /&gt;
&lt;br /&gt;
# The database needs to support utf-8 data storage. For example: a text field of type varchar was given a length of 20 with the intention of being able to store up to 20 characters – which also meant 20 bytes. Now, with UTF-8, 20 characters might mean between 20 and 60 bytes. The database needs to be able to adjust accordingly. Fortunately MySQL version 4.1.2 and up, support UTF-8.&lt;br /&gt;
# The connection between the Joomla! application and the database needs to know the encoding of the data in order to know whether encoding translation is required. (There are cases where the application uses one encoding and the database uses another).&lt;br /&gt;
# The html page needs to know which encoding it carries. This is trivial and all that is required is that the html meta tags will show that the encoding is ‘utf-8’.&lt;br /&gt;
# Joomla’s PHP string handling functions need to be UTF-8 aware. This is not at all trivial as PHP’s regular string functions are all single-byte aware and a special set of functions is needed.&lt;br /&gt;
&lt;br /&gt;
=== The challenges and the solutions ===&lt;br /&gt;
&lt;br /&gt;
The first major challenge was the fact that there are still many hosts that are running MySQL version 4.0.x and older databases. These do not have UTF-8 support. It is possible to store UTF-8 data in non UTF-8 tables. As far as the database is concerned it is storing bytes and returning them to the application when needed.&lt;br /&gt;
&lt;br /&gt;
However, as already mentioned, there is a possibility that the user will want to store a 20 character field that holds UTF-8 characters that are not in the regular ASCII area. If these are committed to a varchar (20) database field – the data will be truncated. This is not only a problem with non “Latin character�? languages (that are normally in the multi-byte area) but also with all European languages with possible the exception of English. Every one of these languages has some special Latin characters (accents and umlauts for example) that are now multi-byte characters. The word ‘käse’ is now 5 bytes long!&lt;br /&gt;
&lt;br /&gt;
The core team rightfully decided that Joomla! 1.5 should also be able to work on older databases and not only that – the backward compatibility should be transparent to the user. The installer now checks for the version of MySQL – if it is version 4.1.2 and up, then UTF-8 tables are created with the user being able to choose the desired collation. If the database is not supporting UTF-8 then the installer actually runs a separate script creating a database structure that provides extra storage space for potentially longer strings. This is anticipated to eliminate the danger of data truncation by the database.&lt;br /&gt;
&lt;br /&gt;
The second major challenge relates to the lack of UTF-8 support in PHP. All standard string functions in PHP are only able to work with single-byte characters. Using these functions on UTF-8 encoded data can result in logical failures and also in data corruption.&lt;br /&gt;
&lt;br /&gt;
The problem lies with the fact that until PHP 6 is released, there is no comprehensive native UTF-8 support in PHP. There is a multi-byte extension named ‘mbstring’ which exists from version 4.1 but it is not loaded by default. In addition it also serves other multi-byte encodings such as some Far Eastern languages. This means that it may be present but not set to the correct settings for UTF-8. An additional extension named ‘iconv’, which has some parallel capability, is present in PHP 5 but optional and missing some functions in PHP 4.&lt;br /&gt;
&lt;br /&gt;
Here again, the core team decided to vote for full backward compatibility and for the solution to be transparent to the user. The solution is a combination of either using PHP provided functions, if they are present, or using a special library of UTF-8 aware string functions, if no PHP native functions are available. This provides the best performance (PHP functions available) together will complete backward compatibility. A Joomla String Class provides this functionality and it will be included in the API for third party developers.&lt;br /&gt;
&lt;br /&gt;
There is no user configuration or setup required regarding PHP UTF-8 support. There is one small exception to this rule which could theoretically occur if, in the host, one or two of the mbstring settings (that cannot be changed from within code) are set to a value that is adverse to UTF-8. The installer will identify this and advise on how to change the setting locally using .htaccess.&lt;br /&gt;
&lt;br /&gt;
=== Migration ===&lt;br /&gt;
&lt;br /&gt;
Considering that data will, in most cases, need to be converted to UTF-8, it will be recommended to migrate existing data to a freshly installed Joomla! 1.1 site and not to perform upgrades of existing Joomla! 1.0.x sites. Specific migration guidance will be provided with the release.&lt;br /&gt;
&lt;br /&gt;
=== The quantum jump ===&lt;br /&gt;
&lt;br /&gt;
Joomla! 1.5 will take a huge jump ahead of the rest of the CMS pack with its Internationalisation features. UTF-8 is undoubted, the big discriminator – all languages with one encoding. In addition, RTL support and the language packs for back-end, installer and help system, make Joomla! 1.5 a complete package for use in any language or combination of languages. JoomFish will be the icing on the cake.&lt;br /&gt;
&lt;br /&gt;
== Language codes - RFC 3066 ==&lt;br /&gt;
&lt;br /&gt;
Providing decent localisation support for Joomla - the kind of support that will carry smoothly across to the work of all extension providers (from language packs to components, modules and plugins), requires a certain amount of attention to some nitty gritty details. A questions that pops up are: “How do we identify a language?” - followed by: “How do we provide a consistent naming convention?” and: “How will everyone know about this?”&lt;br /&gt;
&lt;br /&gt;
Simple - we need a convention - preferably public - hopefully without ambiguity - and it should be kept current.&lt;br /&gt;
&lt;br /&gt;
A little bit of digging unearthed RFC 3066 and a decision was made to use it as the convention for language identification in Joomla as of version 1.5.&lt;br /&gt;
&lt;br /&gt;
This results in the following conventions for the language names :&lt;br /&gt;
# The delimiter between the subtags should be the HYPHEN / MINUS character and not the UNDERSCORE character&lt;br /&gt;
# The first tag with the language tag (based on ISO 639) should use the TWO letter code for a language and not the THREE letter code. The THREE letter code may only be used if a TWO letter code does not exist for the language&lt;/div&gt;</summary>
		<author><name>Dieter</name></author>
	</entry>
</feed>