Changelog

Here is a list of all changes that have been made so far. Contao draws a distinction between major releases (e.g., from version 3 to version 4), minor releases (e.g., from version 3.4 to version 3.5), and bug fix releases (e.g., from version 3.4.4 to version 3.4.5).

Go back

Contao Open Source CMS Changelog

Version 3.0.6 (2013-03-21)

Fixed

Do not add links to news, events, FAQs or newsletters to the sitemap if the target page has not been published (see #5520).

Fixed

Include the local configuration file twice, once before and once after the module configuration files are parsed (see #5490). This will make settings like the debug or safe mode work properly.

Fixed

Correctly set the RSS feed self-reference (see #5478).

Fixed

Remove ­ and   from RSS and Atom feeds (see #5473).

Fixed

Do not remove the grid column margin on mobile devices (see #5475).

Fixed

Store the relative path to the installation in the pathconfig.php (see #5339).

Fixed

Correctly send the comment moderation mails (see #5443).

Fixed

Correctly create the user home directory upon registration (see #5437).

Improved

Made the .htaccess files Apache 2.4 ready (see #5032).

Fixed

Also truncate opened files in File::truncate() (see #5459).

Fixed

Added the "allowTransparency" attribute to the mediabox script (see #5077).

Fixed

The submit button label was not shown in the FormSubmit widget (see #5434).

Fixed

Show invisible elements in the back end preview (see #5449).

Fixed

Allow to create forward pages without a specific target (see #5453).

Fixed

Updated the TinyMCE typolinks plugin (see #5329).

Fixed

Correctly initialize the user's pagemounts (see #5454).

Fixed

Support loading static JavaScripts in the config.php files (see #4890).

Fixed

Show all articles if the article list module is in the same column (see #5373).

Fixed

Do not show mail_ templates from theme folders (see #5379).

Fixed

Consider only published events when finding the calendar boundaries and only render the previous and next links if there are events (see #5426).

Fixed

Do not override the header and footer height in the layout builder (see #5368).

Fixed

Correctly reset fallback, default and "do not copy" fields (see #5252).

Version 3.0.5 (2013-02-19)

Fixed

Removed the pixel unit from the video width and height attributes (see #5383).

Fixed

Correctly load the language files (see #5384).

Version 3.0.4 (2013-02-14)

Fixed

Correctly split the words when adding to the search index (see #5363).

Fixed

If an eagerly loaded relation does not exist, return null instead of an empty model in Model::getRelated() (see #5356).

Fixed

Throw an exception if the file system and the database are out of sync and show a meaningful error message (see #5101).

Fixed

Return an associative array in Model_Collection::fetchEach() if the requested field is not id (see #5134).

Fixed

Make eagerly loaded "pageTree" fields mandatory again (see #4866).

Fixed

Do not use forward pages as upper page in the book navigation (see #5074).

Fixed

Correctly show the "empty news list" note (see #5304).

Fixed

Correctly sort values by an external order field (see #5322).

Fixed

Define the login status constants in the back end (see #4099, #5279).

Fixed

Make sure the drag'n'drop hints do not overlay the field labels (see #5338).

Fixed

Apply the color picker to single fields as well (see #5240).

Fixed

Correctly close the SimpleModal overlay with the escape key (see #5297).

Updated

Update TinyMCE to version 3.5.8 (see #5273).

Fixed

Correctly check for nested arrays in Widget::isValidOption() (see #5328).

Fixed

Preserve the order of multi source fields when exporting a theme (see #5237).

Fixed

Also check whether the target exists when creating new folders (see #5260).

Fixed

Load the core autoload.php files first (see #5261).

Fixed

Support null as column default value in the DCA (see #5252).

New

Added the $blnDoNotCreate option to the Files class, which makes the class write to a temporary file first and then move it to its destination in one atomic operation. This fixes some cache issues (see #5307).

Fixed

Handle @ blocks when importing style sheets (see #5250).

Fixed

Show the newsletter list even if there is no jumpTo page configured in the channel and show the enclosures in the newsletter reader (see #5233).

Fixed

Added an option to load model relations uncached (see #5248, #5102). Also fixed the array_merge() order so the default options can be overriden.

Updated

Updated SimplePie to version 1.3.1 (see #5207).

Updated

Updated SwiftMailer to version 4.3.0 (see #5263).

Fixed

The jQuery accordion script did not work with minified markup (see #5245).

Fixed

Removed the "spaceToUnderscore" option from all alias fields (see #5266).

Fixed

The media content element now supports .ogg files (see #5282).

Fixed

Do not rewrite requests for .mp3, .mp4, .webm or .ogv files (see #5258, #5284).

Fixed

Correctly determin the last run of the command scheduler (see #5278).

Fixed

Make the jQuery accordion behave like the MooTools version (see #5251).

Fixed

Added support for more advanced media queries (see #5236).

Fixed

Added the missing UserGroupModel class (see #5218).

Fixed

Handle the case that glob() returns false (see #5226).

Fixed

The table sorter did not work if jQuery and MooTools were active (see #5228).

Fixed

Copy all content elements if pages are duplicated with childs (see #5241).

Fixed

Added lazy template loading for newsletter mail templates.

Version 3.0.3 (2013-01-08)

Fixed

Do not separate a style sheet with a font-face selector if the definition is invisible or the media type of the style sheet is "all" (see #5216).

Fixed

Looking for theme templates broke the install routine (see #5210).

Fixed

Correctly handle empty newsletter channel selections.

Version 3.0.2 (2013-01-07)

Fixed

Throw an error if FileTree or PageTree widgets are left blank although they are marked as mandatory in the DCA (see #5131).

Fixed

Modules and Hybrids included via content element were shown even if the content element was invisible or not published (see #5203).

Fixed

Do not try to limit the template selection to a particular theme but show all available themes instead (see #5095).

Fixed

Correctly build the comments subscription confirmation URL (see #5201).

Fixed

Update the database if a file is being uploaded in the front end (see #5137).

Fixed

Do not send a 404 header if an enclosure is requested and cannot be find by a module; there might be another module which can (see #5178).

Fixed

Consider the save_callback of the password field in tl_user when a back end user is forced to change his password (see #5138).

Fixed

Random images now open in the lightbox if configured (see #5191).

Fixed

Find e-mail addresse like a@b.com in String::encodeEmail() (see #5175).

Fixed

Make sure there is a minimal MooTools core version for the command scheduler (see #5195).

Fixed

Made Model::getPk() and Model::getTable() static (see #5128).

Fixed

Do not move resources in the file manager if the targets exist. Otherwise the database might get out of sync with the file system (see #5145).

Fixed

Convert automatically generated article alias names if the page uses folder URL style alias names (see #5168).

Fixed

The newsletter system did not yet handle file ID attachments (see #5118).

Fixed

The gallery and downloads element now support using the user's home directory again (see #5113).

Fixed

Added an option to load models uncached (see #5102).

Fixed

Added support for CURRENT_DATE, CURRENT_TIME and CURRENT_TIMESTAMP to the database installer (see #5089).

Fixed

Store the whole database row in Calendar::addEvent() so e.g. RSS feeds with the event text instead of just the teaser are being rendered (see #5085).

Fixed

Purge the internal cache after a module has been (de)activated (see #5016).

Fixed

Do not cache the system/cron/cron.txt file (see #5105).

Fixed

Do not create content elements for news and events which redirect to articles, pages or external URLs during the version 3 update (see #5117).

Fixed

Handle incorrectly closed indexer comments (see #5119).

Fixed

The table content element did not assign the correct CSS class names when there was only one row and one column (see #5140).

Fixed

Consider the dynamic ptable when copying/deleting content elements (see #5041).

Fixed

Scan templates in the autoload creator even if there are no classes (see #5158).

Fixed

Corrected the main column margin when using the layout builder in combination with the responsive grid (see #5170).

Fixed

Consider the sorting order of external style sheets (see #5038).

Fixed

The numeric file mounts of a user were overridden by the real paths (see #5083).

Version 3.0.1 (2012-11-29)

Fixed

Exclude the undo module from the list of allowable back end modules (see #5056).

Fixed

Validator::isAlias() did not support Unicode characters (see #5033).

Fixed

Group the search results by their parent IDs when searching the extended tree view, e.g. the article tree (see #5051).

Fixed

Correctly generate the debug bar markup on XHTML pages (see #5031).

Fixed

Handle radial gradients when importing style sheets (see #4640).

Fixed

More abstract and effective algorithm to determin the number of files in the "purge data" maintenance module (see #5028).

Fixed

Fixed two wrong class paths (see #5027).

Fixed

Correctly add event images to the templates (see #5002).

Changed

Replaced the automatic copyright notice with a meta generator tag.

Fixed

Do not strip tags from passwords (see #4977).

Fixed

Correctly show the number of returned rows in the debug bar (see #4981).

Fixed

Correctly add the RSS feed base URLs (see #4994).

Fixed

Fixed an issue in the mediaelement.js MooTools adapter (see #4917).

Fixed

Correctly assing the classes "first" and "last" in the (mini) calendar if the week does not start on Sunday (see #4970).

Fixed

Correctly handle URL parameters appended to the empty domain (see #4972).

Version 3.0.0 (2012-10-30)

Updated

Updated all vendor scripts and assets to their latest version (see #4966).

Fixed

Handle existing folders during a theme import (see #4952).

Fixed

Show an error message instead of an exception if a template cannot be imported in the install tool (see #4961).

Fixed

Readded the "active" class to the custom navigation module (see #4963).

Fixed

Always convert file IDs to paths when exporting themes (see #4952).

Fixed

Mark active forward pages with "forward" instead of "active" (see #4822).

Updated

Updated jQuery UI to version 1.9.1 (see #4953).

Fixed

Remove HTML tags when overriding the page title (see #4955).

Fixed

Correctly route pages if the language is not added to the URL and there are multiple results or folder URL aliases (see #4872).

Fixed

Do not cache pages if the request contains a token (see #4702).

Fixed

Make the original element passed to a Hybrid object available (see #4556).

Fixed

Show an error message instead of throwing an Exception if the file system and the database are out of sync (see #4438).

Fixed

Removed the deprecated workarounds for storing .xml files in the root directory. Since the autogenerated .xml files now reside in the share/ subfolder, .xml files in the root directory will not be touched by Automator::purgeXmlFiles().

Fixed

Make sure the install tool and – after the version 3 update – the back end remain accessible if the Contao 3 files are just added to an existing Contao 2 installation (which is not recommended) (see #4907).

Fixed

Prevent deleting referenced content elements using "edit multiple" (see #4898).

Fixed

Removed some left-over ENT_COMPAT constants (see #4889).

Fixed

The too simple folder hash algorithm caused issues with the file synchronization and was replaced with a more sophisticated one (see #4934).

Fixed

Updated mediaelement.js to version 2.9.5 (see #4917).

Fixed

If folder URLs are enabled in the back end settings, generate folder URL aliases in the site structure (see #4933).

Fixed

Readded the default value for textareas to the form generator (see #4932).

Fixed

Readded the option to limit the file tree to a certain path (see #4926).

Improved

Added a hint that selected files can be dragged to re-order them (see #4838).

Fixed

Correctly add news and event images as RSS feed enclosures (see #4928).

Fixed

Correctly scale videos (see #4896).

Fixed

Readd a language to the meta editor drop-down if it is deleted (see #4716).

Fixed

Add the static JavaScript file before the non-static ones (see #4890).

Fixed

Correctly check permissions to toggle the visibility of content elements now that they can be used everywhere (see #4894).

Fixed

Added an accessible jQuery accordion variant (see #4900).

Fixed

Correctly link to FAQs via insert tag (see #4905).

Fixed

Correctly handle wildcards in the page and file picker (see #4910).

Fixed

Correctly handle the case that a front end module is included in a page layout more than once (see #4849).

Fixed

Correctly detect the language fragment in the error 404 page (see #4669).

Fixed

Correctly check for the version 2.9 update in the install tool (see #4920).

Fixed

Automatically adjust the CSS framework if the layout builder and the responsive grid are combined (see #4824).

Fixed

Pass the cache status to all recursive replaceInsertTags() calls (see #4402).

Updated

Updated jQuery to version 1.8.2 and jQuery UI to version 1.8.24 (see #4848).

Fixed

The autoload creator now correctly reads files (see #4876).

Fixed

Encode single quotes in JavaScript calls (see #4889).

Fixed

Do not add a content element to news or events without text (see #4882).

Fixed

Fixed the automatic page alias generator (see #4880).

Version 3.0.RC2 (2012-09-27)

Fixed

Correctly handle small class files in the autoload creator (see #4876).

Fixed

The Email class now correctly embeds all kind of images (see #4562).

Fixed

Consider the dynamic parent table when deleting child records (see #4867).

Fixed

Correctly detect the namespace in the autoload creator and support custom configurations per path (see #4776).

Fixed

Do not regenerate the autoload.php files when generating the IDE compatibility file (see #4810).

Fixed

Model class names which cannot be build from the corresponding table name can now be registered in the $GLOBALS['TL_MODELS'] array (see #4796).

Fixed

Removed the back end context menu, because it was buggy in IE and did not work at all on touch-based devices (see #4459).

Fixed

Do not set a right boundary for the calendar navigation if there are events with unlimited recurrences (see #4862).

Fixed

Gradient angles are now converted from the new syntax to the legacy syntax for the prefixed versions (see #4569). This also means that from now on you have to use the new syntax, e.g. "to bottom" instead of "top" and "180deg" instead of "270deg" to generate a top to bottom gradient.

Fixed

Show the hint arrows in all "imageSize" fields by default (see #4326).

Updated

Updated TCPDF to version 5.9.192 and fixed some CHMOD settings (see #4819).

Fixed

Added the classes "first" and "last" to the breadcrumb menu to be more in line with the other navigation templates (see #4833).

Fixed

Correctly link to articles and FAQs when using insert tags (see #4835).

Fixed

Do not add the file picker to the list of referer addresses (see #4855).

Fixed

The CAPTCHA form field now supports the "placeholder" attribute (see #4865).

Fixed

Correctly add enclosures to RSS/Atom feeds (see #4853).

Fixed

Handle numeric IDs in the "image" insert tag (see #4805).

Fixed

If folder URLs are disabled in the back end settings, the "generate alias" job (edit multiple) will generate simple aliases (see #4846).

Fixed

Correctly handle replacements when uploading files (see #4818).

Fixed

Only limit getTemplateGroup() to a theme in the articles module (see #4808).

Fixed

Decode Punycode domains when used via insert tag (see #4753).

Fixed

Correctly handle open tags in String::substrHtml() (see #4773).

Fixed

Correctly handle units when importing style sheets (see #4721).

Fixed

Manually merge the legacy database.sql definitions (see #4766).

Fixed

Skip news archives and calendars without a jumpTo page when creating RSS feeds (see #4784).

Fixed

Index the content of the download(s) element (see #4755).

Fixed

The mediabox plugin did not play Vimeo videos (see #4770).

Fixed

Comments can now be sorted descending again (see #4782).

Fixed

Readded the news list "skip items" feature (see #4783).

Fixed

Use the Validator class to validate date and time formats (see #4762).

Fixed

Do not add invalid "float" commands to images (see #4758).

Fixed

Fixed the CHANGELOG parser in the back end (see #4190).

Fixed

Fixed the SyntaxHighlighter "html-script" option (see #4748).

Fixed

Do not offer to drop all tables when installing an extension (see #4622).

Fixed

Consider the domain, language and publication settings when searching for a folder-style alias (see #4652).

Fixed

Ignore case when entering an extension name in the extension installer of the repository manager (see #4689).

Fixed

Consider the language of a forward target when setting up a forward page or using a {{link}} insert tag (see #4706).

Fixed

Allow to import other white-space values than nowrap (see #4519).

Fixed

Show the teaser text in the full view if a news item or event does not have a text, so linking and commenting is possible (see #4630).

Fixed

The style sheet importer now handles background gradients (see #4640).

Updated

Update jQuery to version 1.8.1 (see #4678).

Fixed

Correctly determine in the install tool whether it is a fresh installation or the version 3 update is required (see #4676). Also, scan the files directory if an administrator account is created during the installation.

Fixed

If an article is selected, do not hide articles in other columns (see #4740).

Fixed

Support uppercase TLDs when validating e-mail addresses (see #4738).

Fixed

Do not show the tool tips if the title is empty (see #4672).

Fixed

Show the back button when editing multiple elements in parent view (see #4709).

Changed

Changed the Controller::replaceInsertTags() logic so non-cacheable tags are preserved by default (see #4712).

Fixed

Correctly link new items and events to articles (see #4728).

Fixed

Output the dynamic HEAD tags before the static ones (see #4700).

Fixed

Do not cache the page if the file parameter is set (see #4702).

Changed

Renamed the public module folders to "assets" (see #4667).

Added

You can now exempt folders from the files synchronisation (see #4522). Exempt folders will also be hidden in the TinyMCE popup file select menu.

Fixed

The newsletter subscription modules now work again (see #4660).

Fixed

Add the static files URL to images added in the rich text editor.

Fixed

Add the SyntaxHighlighter scripts at the page bottom.

Fixed

Do not add the jQuery/MooTools scripts as separate scripts.

Fixed

The new file structure only allows for two static URLs pointing to the upload folder (TL_FILES_URL) and the assets folder (TL_ASSETS_URL) (see #4638). The old constants will remain available for reasons of backwards compatibility.

Fixed

Clone the Model and not the Collection when copying files (see #4628).

Fixed

The "custom navigation" and "quick link" modules did not show if there was only a single page (see #4616).

Fixed

The quick navigation module could not jump to pages named "index" (see #4611).

Fixed

Replaced SplFileInfo::getExtension() which is only available from PHP 5.3.6 with pathinfo($info->getFilename()) (see #4619).

Fixed

Do not send a 404 header if a download element does not find a file to send to the client. There might be other download elements which do (see #4632).

Fixed

Do not create files without file name in the extension creator (see #4635).

Fixed

Moved Controller::restoreBasicEntities() to the String class (see #4646).

Fixed

The file picker can now be accessed properly by regular users.

Fixed

Make the modules' html folders accessible during the update and create the required files in the extension creator as well.

Fixed

Pass the minimum cron timeout value to the cron trigger so minutely cron jobs are correctly executed (the minimum interval used to be 5 minutes).

Fixed

Do not write to the local configuration file in the cron script (see #4483).

Fixed

Downgraded the chosen plugin to make it work again (see #4595).

Version 3.0.RC1 (2012-08-08)

New

Added a config/autoload.ini file to optionally disable the registration of namespaces, classes or templates in the autoload creator (see #4591).

Changed

Renamed the system/modules/*/html folders to public, since the only thing which is not stored in there are HTML files.

New

Moved all vendor PHP libraries to system/vendor and the Contao library to system/modules/core/library. Also moved all vendor JavaScript plugins to the assets folder.

New

Added the "indexPage" hook (see #4506).

New

Added the "prepareFormData" hook (see #4538).

New

Added an option to get notified of new comments by e-mail (see #3858).

Improved

Stop the script execution after the main controller is finished or when a back end or front end template has been output (see #4565). This will prevent code which has been injected at the end of a PHP file from being executed.

Updated

Updated all third-party plugins and libraries to their latest version.

Added

Insert tags can now dynamically add style sheets, JavaScripts and additional head tags to the page (see #4203).

Added

Support nested insert tags (one nesting level) (see #4402). Thanks a lot to Christoph Wiechert for his great finds and hard work.

New

Added a back end upload widget (see #4244).

New

Added the "toggle_view" insert tag to toggle between mobile and desktop view, so the autodetected status can be overridden (see #4308).

Improved

Show some meta information in the "FileTree" widget (see #4330).

Fixed

Removed all unnecessary prefixed format definitions (see #4463).

Changed

Take the external style sheets from the database-aided file system (see #4324).

Improved

File::getContent() now removed BOMs (see #4469).

New

Added an option to limit the page picker to a predefined node set (see #3563). To use the feature, set the rootNodes key in the DCA:

$GLOBALS['TL_DCA'][$table]['fields'][$field]['rootNodes'] = array(2, 6, 7);

Changed

The breadcrumb templates now uses lists to render its links (see #1258).

New

Added the insert tag "post" to access POST data (see #4448).

Fixed

Fall back to CRYPT_SHA256 or CRYPT_BLOWFISH if CRYPT_SHA512 is not available and throw an exception if none of these algorithms exists.

Fixed

Themes can now be linked with a template folder again (see #4360).

New

Content elements can now be used everywhere (no kidding).

Changed

Adjusted the maintenance module to the new Live Update (coming soon).

New

Added a button to the safe mode notice, which allows administrators to disable the safe mode without having to open the back end settings.

Fixed

Use the correct path to font-face style sheets (see #4475).

New

Added a "requestTokenWhitelist" array to the Contao configuration which can be used to exempt domains from the request token check (see #3164). Example:

$GLOBALS['TL_CONFIG']['requestTokenWhitelist'][] = 'facebook.com';

The code above can be added in the local configuration file.

Changed

Make the return value of Database\Result::fetchEach() an associative array with the ID as key and the requested field as value.

Changed

Contao now uses crypt() to generate stronger password hashes (see #3225).

Changed

Load the core modules before the extension modules.

New

Added a separate field to enter the link title to the "hyperlink" and "download" elements (see #4068).

Fixed

Hide the MAX_FILE_SIZE form field if there is no upload field (see #4001).

Changed

Moved the meta viewport tag to its own PHP variable so it can be replaced with a custom version if necessary (see #4335).

Changed

Image galleries are now rendered as unordered lists (see #4130). The Contao CSS framework will format them respecting the "thumbnails per row" setting.

Changed

The session and authentication cookies are now "http-only" (see #4185).

Improved

It is now possible to choose multiple analytics templates (see #4328).

Improved

Improved the "latest changes" overview on the back end welcome page and added links to edit or restore the changed element (see #4336).

New

Added a YouTube content element based on mediaplayer.js (see #4363).

New

Added an additional routine to check boxes, radio buttons and select menus, which compares the user input with the given options (see #4383).

Fixed

Ignore DCA files which do not relate to a database table when building the DCA extracts during installation (see #4316).

Fixed

The Combiner now correctly supports all kind of relative paths (see #4161).

New

Added a jQuery tablesort plugin (see #4393).

Fixed

Adjusted the permission checks and reworked the "content elements everywhere" structure (it is now entirely configured in the DCA).

Fixed

Since the command scheduler now supports minutely jobs, the cron.php file has to be adjusted accordingly (see #4425).

New

Added a development .htaccess file (thanks to Wael M. Nasreddine) (see #4419).

Improved

Do not force a password change in the back end if an administrator switches to an account (see #3984). Thanks a lot to psi-4ward and aschempp for their work.

Improved

If "addLanguageToUrl" is enabled and a request without the language fragment ends up in a 404 error, automatically add the language of the corresponding root page and redirect sending a 301 header (see #4028).

Changed

Passwords can now contain special characters (see #4047).

New

Background images up to a configurable size can optionally be embedded in style sheets as data: string (see #3884).

New

Added "rem" to the list of CSS units (see #4395).

Fixed

Fixed a few remaining issues with the unique pagination variables (see #4141).

Changed

The layout builder now uses the holy grail CSS code to generate the columns. This moves the main column above the left and right column, which is good for SEO purposes and for repsonsive designs. If it turns out that this is not backwards compatible, it can be reverted.

New

Made the Contao CSS framework configurable in the page layout module and added an optional reset style sheet and a responsive 12-column grid. If none of the components are selected, the CSS framework is entirely bypassed.

Fixed

Add the request token to "save and new" requests (see #4329).

Fixed

Make sure the size of a resized image is at least 1 pixel (see #4323).

Version 3.0.beta1 (2012-05-17)

New

Content elements can now be shown/hidden at a certain time (see #4187).

New

Added a video/audio player content element based on mediaelement.js.

Changed

Pagination variables are now unique (see #4141).

New

Added Folder->size to the Folder class (see #3903).

Improved

Added better page titles in the back end (see #3980).

Changed

Made the number of login attempts configurable (see #3923).

Changed

Themes, style sheets, newsletter recipients, list entries and table enties to be imported can now be directly uploaded.

Changed

Do not instantiate the four default objects in System::__construct() anymore, but rather lazy load them when required using __get().

Changed

Made the Cache, Encryption, Environment, Input, RequestToken and Search classes static, again leaving the Singleton routines untouched for for backwards compatibility.

Changed

Made the String methods static and left the Singleton routines so the class can still be used in object context (I actually wonder that PHP supports it, but it does) (see #3898).

New

Added the classes Validator and Idna to encapsulate validation and IDNA domain name encoding in static methods.

New

Added support for minutely cron jobs (see #3895).

Changed

Moved the "getCountries" hook to the end of the getCountries() method so it passes the sorted array instead of the raw one (see #3823).

New

Added the new "Share on Google+" button to the article header.

Changed

Merged the "rep_base" and "rep_client" modules into one "repository" module.

Changed

Merged the "backend" and "frontend" modules into one "core" module and added support for subfolders to structure the different types of classes: "classes", "drivers", "elements", "forms", "models", "modules", "pages" and "widgets".

New

Just to mention it: There is a new DCA option which allows you to add custom buttons to the edit screen (next to "save", "save and close" etc.):

$GLOBALS['TL_DCA']['tl_page']['edit'] => array
(
  'buttons_callback' => array
  (
    array('tl_page', 'addAliasButton')
  )
);

You can see the example in the system/modules/core/dca/tl_page.php file.

Improved

Much better "purge data" maintenance job, which can be extended and uses the Automator to get things done, so every job can also be triggered via cron.

Changed

New approach to handle mobile devices: instead of redirecting to another website root page, you can now define a separate layout for mobile pages. This allows us to re-use the existing site structure and content and to leave out (or include) certain modules, scripts and style sheets if a visitor uses a mobile device.

Improved

Better page layout edit screen: row icons, separate analytics templates, jQuery and MooTools configuration in subpalettes.

Changed

The color picker can now be activated in the data container (see #3874).

Improved

Added an addMultiple() method to the Combiner (see #3814).

Improved

Added $arrFile as fourth parameter of the "getCombinedFile"-hook (see #3945).

Improved

Show the media query in the style sheet overview (see #4042).

Improved

Prevent administrators from disabling their own account (see #4102).

Changed

Removed the IE6 layout fix which added an non-breaking space to every activated column (see #23).

New

Also add the classes "float_above" and "float_below" to image containers (which now can only have the classes "float_left" and "float_right") (see #4157).

Improved

Do not generate links to previous and next months in the calendar if they do not contain any events (see #4160).

Improved

Added a better hint when choosing the position of a new element (tree view).

New

Re-added the developer's module to the core, since it has to be adjusted upon almost every update. Will move the task center to the ER in exchange.

New

Added a diff view to examine the changes between two versions of a record.

New

Added a log rotate job to the Automator.

New

Added a meta wizard to manage file meta information with a GUI.

Improved

Replaced the default browser tooltips with the MooTools tips interface.

New

Added a magic method to the Model and Model\Collection classes, so you can call Model::findByName($name) instead of Model::findBy('name', $name). The first method call will be rewritten to the second one.

New

Added a hash() method to calculate the MD5 hash of files and folders.

New

Added a custom drag&drop sorting order to image gallery elements.

Changed

Moved the changelog file into a protected subdirectory (see #4049).

Improved

Added a much better page picker which opens in a modal window and shows the site structure instead of just a drop-down menu.

Improved

Show a confirmation screen if an invalid URL has been detected instead of the default error screen, so deep linking in the back end remains possible.

New

Check the request token in the back end when $_GET['act'] is set (see #4007).

New

The TreeView is now searchable.

New

Added support for folder-style URLs (see #3921). This is meant as a proof of concept to see whether it works and is useful. We might have to add a feature to the site structure to automatically generate folder-style aliases.

Using folder-style URLs requires one additional database query if the request contains more than one parameter, therefore it can be disabled in the settings.

New

Improved the moo/j_analytics templates and added moo/j_piwik templates in case someone wants to use Piwik instead of Google Analytics.

New

Improved the RSS feed handling of the calendar module accordingly.

New

Improved the RSS feed handling in the news module (will do the same for the calendar module). Feeds are no longer bound to a news archive and can include multiple archives now.

New

Added a nicer dialog script in the back end.

New

Added mootools-mobile.js and swipe support to the mediabox and slimbox.

New

You can now add external style sheets from the files directory to page layouts. They are then treated like the internal style sheets, meaning they can be added to the combiner by adding the |static flag to the file name.

Changed

Rewrote all front end JavaScripts so they run in "no-conflict" mode, which means you don't have to decide "MooTools or jQuery" anymore but can have them both.

New

You can now choose jQuery instead of MooTools in the front end. Also, there is a jQuery mediabox alternative called "colorbox" (template j_colorbox).

Changed

Modified the plugins folder structure to prepare for jQuery support.

Changed

Split the models into Model (single record) and ModelCollection (multiple models) to have a "cleaner" implementaion (thanks to Andreas Schempp).

Changed

Merged the "registration", "rss_reader" and "tpl_editor" module into the core modules ("backend" and "frontend").

New

All front end modules of the core modules now use Models.

New

Added lazy and eager loading of related records to the Model class. Usage:

$objArticle = ArticleModel::findByPk(5);

// The author will be eager loaded (no additional DB query)
echo $objArticle->getRelated('author')->name; // Kevin Jones

// The parent page will be lazy loaded if it is requested
echo $objArticle->getRelated('pid')->title; // Music Academy

Relations are defined in the DCA files.

Changed

All core modules are now using namespaces and can thus be overriden.

Changed

Ported the news extension into its own namespace. Note that this is completely optional and does not have to be done with your custom modules! I am just doing it so the classes can be overriden by an extension.

Changed

Use the TemplateLoader in the getTemplate() and getTemplateGroup() methods.

Improved

Much nicer debug output.

Changed

Modules are now disabled by adding a .skip file instead of using the global inactiveModules array. This way the local configuration file does not have to be included twice in the Config class.

Changed

Moved the Contao framework into the 'library' folder.

Changed

Renamed the default configuration file from config.php to default.php, so hopefully less people will try to edit the file directly.

Changed

Moved the generated scripts to assets/css and assets/js and the thumbnails to assets/images. Also moved the feed files into the share folder.

Changed

Renamed the tl_files directory to files.