Lots of things.
- 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.
- 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
- Save & Close
- Save & New
- Save as Copy
- Expired session will return to the page you were on then 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
- 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)
- (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
- Meta decription and keywords for categories
- Articles can change the page title and page header separately
- 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
- Debug Modules - allows you to enabled to disable the tp=1 feature
- Server Timezone now a location, not an integer offset
- New Global Permissions tab
- Can activate a user from the list now
- User can be assigned to multiple groups
- Manage user groups
- Manager content access levels
- 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.
- 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
- Set access level
- Copy or move to another part of this or another menu
- 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
- 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
- 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.
- "Missing move and copy; filter by author"
- New column to show language
- Filtering by language available
- 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
- 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.
- Nested view
- Filtering on language
- 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)
- Assign alternate layout
- Define create, delete, edit and publishing permissions
- Meta description
- Meta keywords
- Alternative page title
- Meta author
- Meta robots
- Missing copy toolbar button
- New archive toolbar button
- New columns to show meta keywords, purchase type and language
- New filtering by client and language
- New type toggle for Image or Custom (dynamically changes the available form fields)
- New alt text field for image
- New language field
- 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
- Module mgr
- Plugin Mgr
- Template Mgr
- Language mgr
- Auto create linked contact when creating new user ??
- 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:
- 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)
- PHP 4.0 and 5.0 compatibility files
- XStandard Editor
- JDate::toFormat() - use JDate::format() instead
- JHtmlImage::administrator - use JHtml::image instead
- JHtmlImage::site - use JHtml::image instead
- JHtmlList::specificordering() - use JHtml::_('list.ordering')
- 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
- 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
- JToolbarHelper customX(), addNewX(), editListX(), editHtmlX(), editCssX(), deleteListX()
- JUser::authorize() - Use JUser::authorise()
- 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
- 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:
- Archived state changed from a value of -1 to +2
- Format handling (eg JSON)
- Sub-controller handling
- 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.
Translation and Language Support
- 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
- 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>"
- See the flash uploader script for an example
Local extension language files
Language file API
- 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 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
New installation types
- 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
- Must include an XML manifest where type="package"
- A package is a zip of zip's
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:
- secondary extraction of custom zip's
- version checks to be performed
- halting the installer on an error
install / update
- 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 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??
- Can publish an XML manifest on your site that can include individual extensions and extension sets.
XML Manifest Changes
- <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
- 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
- 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
- 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 moved to plugin folder
- 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)
- Miscellaneous changes
- More tools for assisting with translation
- Need to use document.id instead of $
API changes relevant to 3rd party developers
Component view cache
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.
$safeurlparams = array(
Old cacheid created from URL was retained for backwards compatibility and takes effect if there are no $safeurlparams.
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">
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);
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
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
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
- 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
- Session drops the usage of JTable
- Item views use a dedicated question, not JTable->load
- Still Mootools 1.2. Will be upgrading to 1.3 during the beta process.
- Scaling issues to address
- Alpha 1: 22 June 2009
- Alpha 2: 25 October 2009
- Beta 1: 18 May 2010
- Beta 2: 31 May 2010
- Beta 3: 14 June 2010
- Beta 4: 28 June 2010
- Beta 5: 12 July 2010
- Beta 6: 26 July 2010
- Beta 7: 09 August 2010