CraftCMS v3.0.0 Release Notes
Release Date: 2018-04-04 // about 6 years ago-
➕ Added
- 🐎 The codebase has been completely rewritten and refactored to improve performance, maintainability, and extensibility.
- 📄 Craft can now be installed via Composer in addition to a zip file. (#895)
- 🌐 Craft’s setup wizard is now available as a CLI tool in addition to the web-based one.
- 🔌 Plugins are now loaded as Composer dependencies, and implemented as extensions of Yii modules.
- ➕ Added multi-site support.
- ➕ Added the Plugin Store, where plugins can be discovered, trialled, and purchased. (#808)
- 🔌 Plugins can now be updated and removed from within the Control Panel.
- 🔌 Asset sources are now called “volumes”, and plugins can supply their own volume types.
- ➕ Added the Image Editor, which can be used to rotate, crop, and flip images, as well as set focal points on them.
- ➕ Added asset previews, which can be triggered via a “Preview file” action on the Assets index, or with a Shift + Spacebar keyboard shortcut throughout the Control Panel.
- Asset editor HUDs now show image previews. (#837)
- ➕ Added the “Utilities” section to the Control Panel, replacing the Tools area of the Settings page.
- ➕ Added the Debug Toolbar, powered by the Debug Extension for Yii 2.
- ➕ Added support for Content Migrations.
- ➕ Added support for PostgreSQL.
🔄 Changed
- 📱 The Control Panel has been redesigned for better usability, readability and responsiveness.
- 💻 Renamed all “URL Format” things to “URI Format”, in the Control Panel UI and in the code.
- ➕ Added the “Propagate entries across all enabled sites?” section setting. If disabled, entries will only be associated with the site they were created on. (#2330)
- Structure sections and category groups no longer have Nested URL Format settings. (It’s still possible to achieve the same result with a single URI Format setting.)
- ⚡️ When an entry type is updated, Craft now re-saves all entries of that type.
- When a category is deleted, its nested categories are no longer deleted with it.
- Craft no longer re-saves all localizable elements after a new site is created; entries and Matrix blocks are skipped, and plugins that supply custom element types must now re-save their elements manually as well.
- The “New entry” and “New category” buttons on Entries and Categories index pages now load the Edit page for the currently-selected site. (#2236)
- Elements now validate that custom field values will fit within their database columns, for fields with textual or numeric column types.
- 🍱 User photos are now assets. (#933)
- 🍱 Assets now have a “Link” table attribute option.
- 🌐 Volumes’ “Base URL” settings can now begin with
@web
, which is an alias for the root URL that Craft is running from. - Local volumes’ “File System Path” settings can now begin with
@webroot
, which is an alias for the path to the directory thatindex.php
lives in. - Global Sets’ field layouts can now have custom tabs.
- Color inputs can now be left blank.
- Color values within Table fields are now represented by
craft\fields\data\ColorData
objects. - Element titles now get a validation error if they contain any 4+ byte characters (like emoji), on servers running MySQL. (#2513)
- 0️⃣ Lightswitch fields that don’t have a value yet will now be assigned the default field value, even for existing elements. (#2404)
- The system installer now sets the initial admin account’s preferred language to the site language selected in the installation wizard. (#2480)
- Table fields now have “Min Rows”, “Max Rows”, and “Add Row Label” settings. (#2372)
- Table fields now have “Date”, “Time”, “Lightswitch”, and “Color” column type options.
- Color fields now return a
craft\fields\data\ColorData
object, withhex
,rgb
,red
,green
,blue
,r
,g
,b
, andluma
properties. - Matrix fields now have “Manage blocks on a per-site basis”, “Min Blocks”, and “Max Blocks” settings.
- 💻 Matrix fields with only one block type, and equal values for the Min Blocks and Max Blocks settings, now hide the UI for adding and deleting blocks.
- Matrix fields with only one block type will now auto-create the minimum number of blocks required by the field, per the Min Blocks setting, for new elements. (#850)
- ⚡️ The
migrate/up
console command will now update the appropriate schema version in the database after successfully completing all migrations. (#1907) - 👉 Users can now set their preferred language to any supported application language. (#847)
- 👉 Users are no longer logged out when verifying a new email address on their own account. (#1421)
- 🌲 Users no longer get an exception or error message if they click on an invalid/expired email verification link and are already logged in. Instead they’ll be redirected to wherever they would normally be taken immediately after logging in. (#1422)
- If anything prevents a user from being deleted, any changes that were made in preparation for deleting the user are now rolled back.
- ➕ Added
webp
as a web-safe image format. - Craft now checks if the current installation can manipulate an image instead of checking against a predefined list. (#1648, #1545)
- 🗄 The
getCsrfInput()
global function has been renamed tocsrfInput()
. (getCsrfInput() still works but produces a deprecation error.) - The
{% cache %}
tag no longer includes the query string when storing the cache URL. - ➕ Added the
|timestamp
Twig filter, for formatting a date as a user-friendly timestamp. - ➕ Added the
|datetime
Twig filter, for formatting a date with a localized date+time format. - ➕ Added the
|time
Twig filter, for formatting a date with a localized time format. - ➕ Added the
|multisort
Twig filter, which duplicates an array and sorts it withcraft\helpers\ArrayHelper::multisort()
. - ➕ Added the
|atom
and|rss
Twig filters, for formatting dates in Atom and RSS date formats, respectively. - ➕ Added the
|column
Twig filter, for capturing the key/property values of a series of arrays/objects. - ➕ Added the
|index
Twig filter, for indexing an array of arrays/objects by one of their keys/values. - ➕ Added the
|filterByValue
Twig filter. - ➕ Added the
|duration
Twig filter, which converts aDateInterval
object into a human-readable duration. - 0️⃣ The
t
filter now always defaults to translating the given string using thesite
category unless it is otherwise specified (e.g.myString|t('pluginhandle')
). - The
|date
filter can be passed'short'
,'medium'
,'long'
, and'full'
, which will format the date with a localized date format. - 📄 It is now possibly to customize the SQL of element queries, and there are more choices on how the data should be returned.
- 0️⃣ Element queries are no longer limited to 100 results by default.
- The “Failed” message in the queue HUD in the Control Panel now shows the full error message as alt text. (#855)
- ➕ Added the
convertFilenamesToAscii
config setting. - ➕ Added the
preserveExifData
config setting,false
by default and requires Imagick. (#2034) - ➕ Added the
aliases
config setting, providing an easy way to define custom aliases. - ✂ Removed support for automatically determining the values for the
omitScriptNameInUrls
andusePathInfo
config settings. - It’s now possible to override Craft’s application config via
config/app.php
. - It’s now possible to override volume settings via
config/volumes.php
. - 🔌 It’s now possible to override all plugins’ settings via
config/<plugin-handle>.php
. - 📇 Renamed the
runTasksAutomatically
config setting torunQueueAutomatically
. - 🌐 The
translationDebugOutput
config setting will now wrap strings with@
characters if the category isapp
,$
if the category issite
, and%
for anything else. - 🌐 All user-defined strings in the Control Panel (e.g. section names) are now translated using the
site
category, to prevent translation conflicts with Craft’s own Control Panel translations. - Routes can now be stored on a per-site basis, rather than per-locale.
- 🔊 Web requests are now logged to
storage/logs/web.log
. - 🔊 Web requests that result in 404 errors are now logged to
storage/logs/web-404s.log
. - 🔊 Console requests are now logged to
storage/logs/console.log
. - 🔊 Queue requests are now logged to
storage/logs/queue.log
. - Craft 3 now requires PHP 7.0.0 or later.
- Craft 3 now requires MySQL 5.5+ or PostgreSQL 9.5+.
- Craft now takes advantage of the PHP Intl extension when available.
- 👍 Craft now uses Stringy for better string processing support.
- 👍 Craft now uses Flysystem for better asset volume support.
- 👍 Craft now uses Swiftmailer for better email sending support.
- Craft now uses the Yii 2 Queue Extension for managing background tasks.
- 👍 Craft now uses the Zend Feed library for better RSS and Atom processing support.
- ⚡️ Updated Yii to 2.0.15.1.
- ⚡️ Updated Twig to 2.4.
- ⚡️ Updated Guzzle to 6.3.
🗄 Deprecated
- 👀 Many things have been deprecated. See Changes in Craft 3 for a complete list.
🛠 Fixed
- 🛠 Fixed a bug where a PHP session would be started on every template rendering request whether it was needed or not. (#1765)
🔒 Security
- Craft uses OpenSSL for encryption rather than mcrypt, which is far more secure and well-maintained.