- New template engine
- New CMS interface design
- "Page Content" and "Page Settings" are split into two interfaces
- Image/Link insertion moved into a modal dialog instead of a sidebar
- "Add pages" dropdown moved to a more descriptive modal dialog
- Allow usage of "sapphire" framework without the "cms" module
- CMS stylesheets are generated by SCSS to provide more flexible and robust styling
New template engine
The template engine has been completely rewritten, and although it is generally backward compatible, there are new features and some features have been deprecated. See the template upgrading guide and the template reference for more information.
New user interface for CMS
Most aspects of the interface have been redesigned, which necessitated a substantial
redevelopment of the underlying logic and presentation.
If you have customized the admin interface in any way, please review
the detailed changelog for this release. Many interface components have changed completely,
unfortunately there is no clear upgrade path for every interface detail.
As a starting point, have a look at the new templates in
sapphire/admin/templates, as well as the new jQuery.entwine
New tree library
The page tree moved from a bespoke tree library to JSTree,
This includes changes to
Settings-related fields move from
SiteTree->getCMSFields() to new
The fields and tabs are now split into two separate forms, which required a structural
change to the underlying class logic. In case you have added or removed fields
in the "Behaviour" or "Access" tab, please move these customizations to a new
In case of SiteTree extension through
updateCMSFields() and a decorator/extension,
please use the new
SiteTree::$description field to describe purpose of a page type
Please use this static property to describe the purpose of your page types,
which will help users understand the new "Add page" dialog.
For example, a
TeamPage type could be described as "Lists all team members, linking to their profiles".
Note: This property is optional (defaults to an empty string), but its usage is highly encouraged.
Stylesheet preprocessing via SCSS and the "compass" module
CSS files in the
sapphire/admin modules are now generated through
the "compass" SilverStripe module, which uses
the "Compass" framework and the "SCSS" language.
This allows us to build more flexible and expressive stylesheets as a foundation for any
extensions to the CMS interface.
The "compass" module is only required if core stylesheets are modified,
not when simply using the CMS or developing other CMS functionality.
If you want to extend the CMS stylesheets for your own projects without SCSS,
please create a new CSS file and link it into the CMS via
FormField consistently adds classes to HTML elements
The [api:FormField] API has been refactored to use SilverStripe templates
for constructing the field HTML, as well as new accessors for HTML attributes.
This change makes the HTML a bit more predictable, but it also means that
Particularly, CSS class names applied through [api:FormField->addExtraClass()]
and the "type" class are now consistently added to the container
as well as the HTML form element itself.
:::html Before (abbreviated): <div class="field checkbox extraClass"...> <input type="checkbox".../> </div> After (abbreviated): <div class="field checkbox extraClass"...> <input type="checkbox" class="checkbox extraClass".../> </div>
Restructured files and folders
In order to make the
sapphire framework useable without the
we've moved some files around.
CMS base functionality which is not directly related to content pages (
has been moved from the
cms module into a new "sub-module" located in
This includes generic management interfaces like "Files & Images" (
SecurityAdmin) and the
On the other hand,
SiteTree related features were moved from
sapphire to the
Translatable extension into new 'translatable' module
If you are translating your
DataObject classes with the
extension, please install the new module from
The following settings can be removed from your own
_config.php, as they're automatically
Object::add_extension('SiteTree', 'Translatable'); Object::add_extension('SiteConfig', 'Translatable');
Removed "auto-merging" of member records from
Due to security reasons. Please use
DataObject->merge() explicitly if this is desired behaviour.
Unit tests require definition of used
This change was necessary in order to improve performance of the test framework,
and avoid rebuilding the database where no database access is required.
It also won't build any
DataObject subclasses implementing the
unless these are explicitly noted.
SapphireTest->extraDataObjects: List all
TestOnlyclasses relevant to your test class here.
DataObjectclasses to an array of required extensions. Example:
array("MyTreeDataObject" => array("Versioned", "Hierarchy"))
SapphireTest->illegalExtensions: Does the reverse of
requiredExtensions: Removes already applied extensions.
Alternatively, you can enforce database usage by setting
TRUE in your test class.
DataExtensioninstead (the class doesn't implement the GOF "Decorator" pattern)
QueuedEmailDispatchTask: If you make use of these, copy the classes from 2.4 into your project.
ConfirmedFormAction: Use custom fields instead
Notifications: If you make use of this, copy the classes from 2.4 into your project.
TarballArchive: If you make use of these, copy the classes from 2.4 into your project.
XML: Use PHP's built-in SimpleXML instead
DataObjectLog: There is no replacement for this.
GeoIP: Moved to separate "geoip" module