What's new in Joomla 2.5

From Joomla! Documentation

(Redirected from What's new in Joomla 1.6)

The principal changes introduced in Joomla 1.6 are:

  • New Access Control System - Allows site administrators control over who can view and manage content.
  • Unlimited Depth Organizational Model - 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.
  • One-Click Extension Updates - Allows users to keep sites secure and controlled by simplifying the process of updating extensions.
  • Semantic XHTML Layouts - Provides a better baseline for content presentation.

The following is a more complete list of changes.



  • Consistent UI
  • Consistent Features
  • Richer sample data
  • IE 7+, Firefox 3.x, Safari 4.x
  • PHP 5.2.4+
  • MySQL 5.0.4 (allows for wide varchars)


  • Menu Changes
  • Submenu consistency

Toolbar Features[edit]

  • Save
  • Save & Close
  • Save & New
  • Save as Copy
  • Expired session will return to the page you were on when you got logged out (can be hit and miss)
  • Most search filters allow you to search for a record id via [ id:123 ]
  • "Parameters" are now referred to as "Options"
  • Template Styles
  • Integrated Trash Management
  • Consistent archive support for most content
  • Extension Installer Improvements

Module Enhancements[edit]

  • Publish up and down
  • Add option to display on all pages "except" selected
  • Expanded Category System
  • 404 Page Redirection
  • Better Menu Management
  • Alternative layouts for content, modules and menus (taken from the home template)

New Templates[edit]

  • Atomic
  • Beez2
  • (Administrator) Bluestork (replaces Khephri)
  • (Administrator) Hathor
  • Legacy layer in Milkyway
  • Backend supports layout overrides
  • New Modules
  • New Plugins
  • Content Languages
  • User Login Permissions
  • Activate selected users from the user list now (and filter)
  • Administrator registration approval
  • Polls component removed
  • New codemirror editor

SEO Improvements[edit]

  • Meta decription and keywords for categories
  • Articles can change the page title and page header separately

Global Configuration[edit]

  • Add site name to titles
  • Default Access Level
  • Set Metadata Language (buggy)
  • Unicode Aliases
  • Cookie domain and path
  • User Setting moved to User Manager -> Options
  • Media Settings moved to Media Manager -> Options
  • Server Timezone now a location, not an integer offset
  • New Global Permissions tab

User Manager[edit]

  • Can activate a user from the list now
  • User can be assigned to multiple groups
  • Manage user groups
  • Manager content access levels

Media Manager[edit]

  • Flash uploader fixed

Menu Manager[edit]

Menus List[edit]

  • Rebuild button to press when you brick the menu
  • 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.

Items List[edit]

  • Menus support the language filter
  • Default now called Home
  • Home is now clickable in the menu item list
  • A separate home can be set for different languages
New batch operations[edit]
  • Set access level
  • Copy or move to another part of this or another menu

Edit Item[edit]

  • Improved "Type" selector with human readable view and layout names
  • Note field added
  • New window target
  • New Language assignment
  • New Template style
  • Ability to add & edit Module assignments from this page
  • Ability to create alternative menu items with customised parameters
  • Ability to create multiple alternative layouts for one template
New options for the menu links and pages themselves[edit]
  • Link title attribute
  • Link CSS style
  • Menu image is changed to a modal selector
  • CSS class for page heading
  • Page meta description
  • Page meta keywords
  • Robots options

Articles Manager[edit]

  • Frontpage is now referred to as Featured
  • Article manager uses submenu to quickly skip between articles , categories and featured
  • Sections and categories are now merged.

Articles List[edit]

  • "Missing move and copy; filter by author"
  • New column to show language
  • Filtering by language available

Article Edit[edit]

  • Created by user now selected by modal popup
  • New ability to set the page title from the article
  • Define create, delete, edit and publishing permissions

Archived Articles[edit]

  • In 1.5, Archived Articles had to first be changed to Published or Unpublished before update.
  • In 1.6, an Article with an Archived Status *can* be changed without changing the State first.


Category List[edit]

  • Nested view
  • Filtering on language

Edit Category[edit]

  • New note field
  • Section replaced with ability to assign a parent category
  • Ability to assign content language
New Options (not previously available in 1.5)[edit]
  • Assign alternate layout
  • Define create, delete, edit and publishing permissions
  • Meta description
  • Meta keywords
  • Alternative page title
  • Meta author
  • Meta robots


Banners list[edit]

  • Missing copy toolbar button
  • New archive toolbar button
  • New columns to show meta keywords, purchase type and language
  • New filtering by client and language

Edit Banner[edit]

  • New type toggle for Image or Custom (dynamically changes the available form fields)
  • New alt text field for image
  • New language field
New Options[edit]
  • Ability to set the created date
  • Ability to set start and finish publishing times
  • Ability to set the purchase type
  • Ability to track impressions
  • Ability to track clicks
  • Use own prefix ?
  • Tags renamed to meta
  • Contacts
  • Messaging
  • Newsfeeds
  • Search
  • Weblinks
  • Redirect

Extensions Manager[edit]


  • Module mgr
  • Plugin Mgr
  • Template Mgr
  • Language mgr

Templates Manager[edit]

  • Options - allows you to enable/disable the tp=1 feature


  • Auto create linked contact when creating new user ??

Access Controls[edit]

  • Introduction
  • User Groups
  • Access Levels
  • Permission Layers
  • How Permissions are Inherited
  • How to debrick your site



  • PHP 5.2.4+
  • MySQL 5.0.4 (allows for wide varchars)
  • IE7+, Firefox 3+, Safari 4+
  • Focus on code consistency
  • Focus on code reduction

Usage of PHP Native Functions where possible, for example:

Removed features[edit]

  • ADODB compatibility methods in database classes
  • DOMIT (unsupported XML library)
  • Legacy mode (includes global $mainframe, etc)
  • JTemplate (based on patTemplate)
  • patTemplate (templating engine)
  • PDF support
  • PEAR libraries (due to license incompatibilities)
  • phpgacl
  • PHP 4.0 and 5.0 compatibility files
  • XStandard Editor

Deprecated Features[edit]

  • JController::_acoSection
  • JController::_acoSectionValue
  • JController::authorize()
  • JController::setAccessControl()
  • JDatabase::stderr()
  • JDate::offest
  • JDate::setOffset()
  • JDate::toFormat() - use JDate::format() instead
  • JException::toString()
  • JFactory::getXMLParser()
  • JHtmlBehavior::mootools() - use JHtmlBehavior::framework instead
  • JHtmlGird::access()
  • JHtmlImage::administrator - use JHtml::image instead
  • JHtmlImage::site - use JHtml::image instead
  • JHtmlList::accesslevel()
  • JHtmlList::specificordering() - use JHtml::_('list.ordering')
  • JHtmlList::category()
  • JHtmlSelect::optgroup() - see JHtmlSelect::groupedList()
  • JLanguage::_parseLanguageFiles - renamed to parseLanguageFiles
  • JLanguage::_parseXMLLanguageFile - renamed to parseXMLLanguageFile
  • JLanguage::_parseXMLLanguageFiles - renamed to parseXMLLanguageFiles
  • JObject::toString - replaced with magic method
  • JRegistry::getNameSpaces()
  • JRegistry::getValue()
  • JRegistry::makeNameSpace()
  • JRegistry::setValue()
  • JPane - See JHtmlSliders
  • JParameter - replaced by JForm
  • JSimpleXML, JSimpleXMLElement - Use JXMLElement instead, based on the native SimpleXMLElement
  • JTable::canDelete() - models or controllers should be doing the access checks
  • JTable::toXML()
  • JToolbarHelper customX(), addNewX(), editListX(), editHtmlX(), editCssX(), deleteListX()
  • JUser::authorize() - Use JUser::authorise()
  • JUtility::dump()
  • JUtility::array_unshift_ref() - Not needed in PHP 5
  • JUtility::getHash() - Use JApplication::getHash()
  • JUtility::getToken() - Use JFactory::getSession()->getFormToken()
  • JUtility::isWinOS() - Use JApplication::isWinOS()
  • JUtility::return_bytes() - See InstallerModelWarnings::return_bytes()
  • JUtility::sendMail() - Use JFactory::getMailer()->sendMail()
  • JUtility::sendAdminMail() - Use JFactory::getMailer()->sendMail()
  • JXMLElement::data() - Provided for backward compatibility
  • JXMLElement::getAttribute() - Provided for backward compatibility


  • JTable now automatically looks up the fields from the database schema
  • New JDatabaseQuery - A chained CRUD query builder
  • New JDatabase::getNextRow
  • New JDatabase::getNextObject
  • JDatabase::loadAssocList - Now takes a second argument to just return the value of a column
  • JDatabase::setQuery - Added chaining support

Important Schema Changes[edit]

  • New jos_extensions table to list all extensions
  • Components table information moved and split between jos_extensions and jos_menu (special menu called _adminmenu)

The old phpgacl (jos_core_acl*) and jos_groups tables have been reworked into:

  • jos_assets
  • jos_user_usergroup_map
  • jos_usergroups
  • jos_viewlevels
  • Archived state changed from a value of -1 to +2

Improved MVC[edit]


  • JModelList
  • JModelForm
  • JModelAdmin
  • Format handling (eg JSON)
  • Sub-controller handling


  • JControllerForm
  • JControllerAdmin
  • JController::setMessage takes second arg to set the message type
  • JController can set the default view
  • Added chaining support to several JController methods


  • Semantic core output
  • Milkyway legacy layouts
  • The old component parameters are not automatically added to the menu anymore. You need to explicitly put them in the layout XML files.
  • The menu manager will now detect additional layouts for a given view in the default template.

Form API[edit]

Event manipulation[edit]

  • onContentPrepareForm
  • onContentPrepareData

Translation and Language Support[edit]

See International Enhancements for Version 1.6 for a more complete list of changes in internationalisation features.

  • Support for unicode slugs, eg, SEF URL's with Greek characters
  • 3-letter languages now supported, xxx-XX
  • All existing language keys have been refactored

INI files must validate[edit]

  • Upper case key with no spaces, alphanumeric characters and underscores
  • Quoted values
  • Double quotes within literal strings must use _QQ_ in the form KEY="<a href="_QQ_"index.php"_QQ_">Click</a>"

Javascript translation layer[edit]

  • See the flash uploader script for an example

Local extension language files

Language file API[edit]

  • Pluralisation support
  • Transliteration support for ASCII or Unicode slugs
  • Ignore Search Words
  • Minimum search word length
  • Custom language overrides
  • System language file to support administrator menu and installation (.sys.ini)

Language switcher[edit]

  • Language Filter plugin enables language switching
  • Sets the automatic filtering via JFactory::getApplication()->setLanguageFilter(true)
  • A frontend component with language support would test JFactory::getApplication()->getLanguageFilter(), which returns the selected language code from the Languages Module
  • The language field can be a language code for a single language, or "*" to be displayed for all languages
  • Community extension for language maintenance com_localise

Extension management[edit]

See /tests/_data/installer_packages/ for complete examples of all extensions and manifests.

New installation types[edit]

  • Must include an XML manifest where type="library"
  • Can only be installed into a sub-folder of /libraries/
  • Can extend parts of an existing library, eg /libraries/joomla/database/database/oracle.php
Packages multi-installer[edit]
  • Must include an XML manifest where type="package"
  • A package is a zip of zip's

New installation script[edit]

All install / uninstall scripts should be created as methods in new installation script. The script file name is set using the <scriptfile> tag in the extension manifest file. This new install script can be provided with 5 methods:

  • Runs before anything is run and while the extracted files are in the uploaded temp folder
Could allow for:[edit]
  • secondary extraction of custom zip's
  • version checks to be performed
  • halting the installer on an error

Note: preflight is run for install, update and discover_install, but not for uninstall

install / update[edit]
  • Runs after the database scripts are executed
  • If the extension is new, the install method is run
  • If the extension exists then update method is run if method="upgrade", otherwise assumes that the extension is not meant to be upgradable
  • Runs before any other action is taken (files removal or database processing)
  • Runs after the extension is registered in the database
  • Is not run for the uninstall process (nothing left to do obviously)


  • Does not do any file copying, only works with what it finds
  • Performs preflight, install and postflight
  • Developer of installer has two language files??

Update site[edit]

  • Can publish an XML manifest on your site that can include individual extensions and extension sets.

XML Manifest Changes[edit]

  • <install> is deprecated - use <extension>
  • New <update> tag. Takes a <schemas> tag which can define <schemapath>
  • <params> and <param> tags are deprecated, use <fields>, <fieldsets> and <field> instead

File changes[edit]

  • 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
  • Plugins are now in folders like modules and components
  • See SVN/tests/_data/installer_packages/ for complete examples of all extensions and manifests.
  • The method="upgrade" will compare individual files in the original and incoming manifests and will remove files as appropriate. However, it will not remove differences in the <folder> tags.
  • Future support for rollback


New Events[edit]

  • onBeforeCompileHead
  • onBeforeRender
  • onContentBeforeDelete
  • onContentAfterDelete
  • onContentChangeState
  • onContentPrepare
  • onContentPrepareData
  • onContentPrepareForm
  • onExtensionBeforeInstall
  • onExtensionBeforeUpdate
  • onExtensionBeforeUninstall
  • onExtensionAfterInstall
  • onExtensionAfterUpdate
  • onExtensionAfterUninstall

Renamed Events[edit]

  • onContentAfterSave
  • onContentAfterTitle
  • onContentAfterDisplay
  • onContentBeforeDisplay
  • onContentBeforeSave
  • onContentSearch
  • onContentSearchAreas
  • onUserAuthenticate
  • onUserAfterDelete
  • onUserAfterSave
  • onUserBeforeDelete
  • onUserBeforeSave
  • onUserLogin
  • onUserLogout
  • All content events (except for search and search areas) now pass a 'context' 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.


  • Component can provide custom options for its own categories via optional category.xml
  • Supported via JTableNested

Access Controls[edit]

  • A thing that can be controlled by permissions is registered in the assets table
  • JTable handles this transparently via asset_id field
  • For view permissions, support is as simple as adding
$user = JFactory::getUser();
$groups = implode(',', $user->authorisedLevels());
$query->where('a.access IN (' . $groups . ')');

For action permissions, same format as in 1.5:

$user->authorise($actionName, $assetName)
  • OpenID library has been removed
  • Geshi library moved to plugin folder
  • JRegistry notes defaults to JSON (new format), dynamically converting existing data in INI format
  • New JStream
  • New JApplicationHelper::getComponentName
  • Core icons moved to /media/
  • Backward incompatible change to JEditor::display
  • Added chaining support to JMail
  • JFilterInput can no longer be called statically
  • JHtml::image now supports relative paths
  • All system images are overridable in the default template
  • New JHtmlString
  • Added wincache session handler for IIS
  • New JFilterOutput::stripImages
  • JPath::check takes second arg for separator (to pass to JPath::clean)
  • Expanded configuration support through config.xml (multiple tabs)

Core actions[edit]

  • core.login.site
  • core.login.admin
  • core.admin
  • core.manage
  • core.create
  • core.edit
  • core.edit.state
  • edit.own
  • core.delete
  • Miscellaneous changes

Debug Plugin[edit]

  • More tools for assisting with translation


Some JavaScript (noteable the submitform() and submitbutton() functions have been namespaced and changed to expect id="adminForm" instead of name="adminForm". It is still possible to use name="adminForm" with these functions in Joomla 1.6, however this functionality will likely be removed in the next version. Some old, non-namespaced, functions, for example isChecked() and changeDynaList(), still need name="adminForm". So if you need to use one of these functions you need to use both and id="adminForm" and name="adminForm" or you overwrite Joomla.submitbutton() to customize it, there are some examples of the latter in backend edit layouts.


  • submitform() - use Joomla.submitform() instead
  • submitbutton() - use Joomla.submitbutton() instead

Mootools 1.3[edit]

Mootools has been upgraded to Version 1.3 including the compatibility layer. Code that works with Mootools 1.2 should continue to work just fine.

Cache changes[edit]

API changes relevant to 3rd party developers[edit]

Component view cache[edit]

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's.

Com_contact example:

$safeurlparams = array(
    'catid'=>'INT', 'limit'=>'INT', 


Old cacheid created from URL was retained for backwards compatibility and takes effect if there are no $safeurlparams.

Module cache[edit]

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.

Modes to be set in XML:

  • static - one cache file for all pages with the same module parameters
  • oldstatic - 1.5. definition of module caching, one cache file for all pages with the same module id and user aid. Default for backwards compatibility
  • itemid - changes on itemid change

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.

<field name="cachemode" type="hidden" label="" default="static"> 
<option value="static"></option>

Modes to be called from inside the module:

  • safeuri - id is created from $cacheparams->modeparams array, the same as in component view cache
  • id - module sets own cache id's

To use this modes one must rename cache field in xml to owncache field and call JModuleHelper::ModuleCache from within the module's main php file. This is actually a shortcut to cache callback to avoid code duplication in every module.

An example that uses safeuri mode and replaces uncached $list = modRelatedItemsHelper::getList($params) :

$cacheparams = new stdClass; 
$cacheparams->cachemode = 'safeuri'; 
$cacheparams->class = 'modRelatedItemsHelper'; 
$cacheparams->method = 'getList'; 
$cacheparams->methodparams = $params; 
$cacheparams->modeparams = array('id'=>'int','Itemid'=>'int'); 
$list = JModuleHelper::ModuleCache ($module, $params, $cacheparams);

Functional changes[edit]

Cache administration (Clean cache, Purge cache) now works with all drivers, not only with file cache. New standalone garbage collect script 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.

CMS and framework level functional changes[edit]

Caching is implemented in all components and modules that can potentially gain from cache. Caching has also been added to some most expensive and frequent framework calls JComponentHelper::_load(), JModuleHelper::_load(),JMenuSite::load();

Cache library changes[edit]

Cache library has been completely refactored.

  • Cache handlers have been renamed to controllers to better reflect their role and avoid confusion with cache storage handlers (referred to as drivers in following text).
  • New JCacheController parent class has been added and inheritance has been changed to prevent bugs occurring from controller's and storage handler's get method clashes.


  • getAll() 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)
  • New lock and unlock 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.
  • Workarounds are now consolidated in new JCache getWorkarounds and setWorkarounds methods, are now used by all controllers and their use has been made optional.
  • New makeId() method in JCache that creates cache id from registered url parameters set by components and system plugins


New parent class to Controllers that also functions as an intermediate to JCache. There is no JObject inheritance as otherwise magic __call doesn't work. Change was needed to prevent bugs occurring from controller's and storage handler's get method clashes. They could be renamed but this would break backwards compatibility.


  • _getCacheId method was moved from drivers to their parent JCacheStorage and all drives now use the same method by default
  • CacheItem was moved from cache admin to framework JCacheStorageHelper, it is used by getAll
  • 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.
  • 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.
  • Numerous bugfixes on all levels, most important is proper use of options defaulting to configuration parameters settings and correctly passing from level to level.

Other framework level changes[edit]

  • Safe url parameters registration added to JControler view method.
  • New ModuleCache method in JModuleHelper that performs the above described module cache (in 5 modes) for both, modules and module renderer.
  • JFactory::getFeedParser has been changed to use Joomla caching instead of simplepie's.


Eliminate the usage of JTable for general browsing on the frontend[edit]

  • Session drops the usage of JTable
  • Item views use a dedicated question, not JTable->load

Known Issues[edit]

  • Scaling issues to address



  • Alpha 1: 22 June 2009
  • Alpha 2: 25 October 2009
  • Beta 01: 18 May 2010
  • Beta 02: 31 May 2010
  • Beta 03: 14 June 2010
  • Beta 04: 28 June 2010
  • Beta 05: 12 July 2010
  • Beta 06: 26 July 2010
  • Beta 07: 09 August 2010
  • Beta 08: 23 August 2010
  • Beta 09: 06 September 2010
  • Beta 10: 20 September 2010
  • Beta 11: 03 October 2010
  • Beta 12: 17 October 2010
  • Beta 13: 31 October 2010
  • Beta 14: 14 November 2010
  • Beta 15: 29 November 2010
  • Release Candidate 1: 13 December 2010
  • Version 1.6.0 released 10 January 2011


There's an official Joomla 1.6 infographic available, which shows 10 of the new functions with screenshots.