Version 4 supported
This version of Silverstripe CMS is still supported though will not receive any additional features. Go to documentation for the most recent stable version.



This version introduces many breaking changes, which in most projects can be managed through a combination of automatic upgrade processes as well as manual code review. This changelogs described all API changes in detail.

Read Upgrading to Silverstripe 4 for a detailed step-by-step guide on upgrading your Silverstripe 3 project to Silverstripe 4. It describes how to use an automated upgrader tool to make the job easier. For users upgrading to later versions, please see the specific 4.1.0 and 4.2.0 changelogs.



  • Minimum version dependencies have increased; PHP 5.6 and Internet Explorer 11 (or other modern browser) are required.
  • All code has been migrated to follow the PSR-2 coding standard. Most significantly, all Silverstripe classes are now namespaced, and some have been renamed. This has major implications for arrangement of templates, as well as other references to classes via string literals or configuration.
  • All code earlier marked as deprecated for 4.0 has now been removed (check our deprecation process)
  • Core modules are installed in the vendor/ folder by default (other modules can opt-in, see guide)
  • 4.1.0 only Support for public webroot folder public/ (details)


  • Better core support for Versioning: Addition of campaigns to allow batches of related or inter-dependent objects to be published as a single "changeset".
  • Record ownership and Campaigns: Dependencies between versioned objects can be declared using the new ownership API, so that developers can ensure that relational consistency is maintained during publishing This new system can be managed via the new "Campaigns" CMS section (blog post)
  • Rewrite literal table names: Use $table = SilverStripe\ORM\DataObject::getSchema()->tableForField($model, $field) instead of $model directly.


  • Asset storage has been abstracted, and a new concept of DBFile references via database column references now exists in addition to references via the existing File dataobject. File security and protected files are now a core feature (details)
  • Assets are uploaded as drafts by default, and need to be published (often as part of pages) (details)
  • Draft and protected assets are served by PHP rather than the webserver (details)
  • Asset admin has been replaced with a purely ReactJS powered upgrade, and split out module called asset-admin.



  • Template locations and references: Templates require the folder path inside the templates folder, and Core templates are placed in paths following the class namespace, e.g. FormField is now SilverStripe/Forms/FormField. When using the <% include %> syntax, you can leave out the Includes folder in the path.
  • Modules need to declare which files need to be exposed via the new vendor-plugin, using symlinks to link to files from the publicly accessible resources folder.
  • Explicit text casting on template variables Calling $MyField on a DataObject in templates will by default cast MyField as Text which means it will be safely encoded.
  • Template variable casting (e.g. <h1>$Title</h1>) is enforced by default, which will ensure safe HTML encode unless explicitly opted out (details)
  • Themes are now configured to cascade, where you can specify a list of themes, and have the template engine search programmatically through a prioritised list when resolving template and CSS file paths.
  • The GDBackend and ImagickBackend classes have been replaced by a unified InterventionBackend which uses the intervention/image library to power manipualations.


  • A new front-end development process has been developed for the construction of JavaScript based components, prominently featuring ReactJS to develop highly functional CMS content areas. A new standard form schema API has been developed to allow back-end PHP constructed forms to scaffold themselves within ReactJS powered sections.
  • CMS CSS has been re-developed using Bootstrap v4 as a base (blog post)

Detailed changes

index.php and .htaccess rewrites

The location of Silverstripe's "entry file" has changed. Your project and server environment will need to adjust the path to this file from framework/main.php to public/index.php. Use the index.php file from silverstripe/recipe-core as a reference to ensure the contents of your index.php file is correct.

If you are running Apache, adjust your .htaccess file. For other webservers, please consult the installation guides. Since 4.0, URL rewrite capabilities are required, unless you use PHP's built-in webserver through silverstripe/serve.

Object class replaced by traits

Object has been superseded by traits.

  • Injectable: Provides MyClass::create() and MyClass::singleton()
  • Configurable: Provides MyClass::config()
  • Extensible: Provides all methods related to extensions (e.g. add_extension()).

Upgrade subclass use:

-class MyClass extends Object
+use SilverStripe\Core\Extensible;
+use SilverStripe\Core\Injector\Injectable;
+use SilverStripe\Core\Config\Configurable;
+class MyClass
+    use Extensible;
+    use Injectable;
+    use Configurable;

Upgrade references to $this->class:



Upgrade parse_class_spec():

-$spec = Object::parse_class_spec($spec);
+$spec = ClassInfo::parse_class_spec($spec);

Upgrade create_from_string():

-$obj = Object::create_from_string('Varchar(100)');
+$obj = Injector::inst()->create('Varchar(100)');

Upgrade extension use

-Object::add_extension('File', 'Versioned');
+DataObject::add_extension(File::class, Versioned::class); // alternate

-$has = Object::has_extension('File', 'Versioned');
+$has = File::has_extension(Versioned::class);
+$has = DataObject::has_extension(File::class, Versioned::class); // alternate

-$extensions = Object::get_extensions('File');
+$extensions = File::get_extensions();
+$extensions = DataObject::get_extensions(File::class); // alternate

Rewrite literal table names

In 3.x the class name of any DataObject matched the table name, but in 4.x all classes are namespaced, and it is necessary to map between table and class for querying the database.

In order to ensure you are using the correct table for any class a new DataObjectSchema service is available to manage these mappings (see Versioned documentation). For example, the below shows how you would update a query with a hard-coded table name:

public function countDuplicates($model, $fieldToCheck)
    $query = new SilverStripe\ORM\Queries\SQLSelect();
+    $table = SilverStripe\ORM\DataObject::getSchema()->tableForField($model, $field);
-    $query->setFrom("\"{$model}\"");
+    $query->setFrom("\"{$table}\"");
-    $query->setWhere(["\"{$model}\".\"{$field}\"" => $model->$fieldToCheck]);
+    $query->setWhere(["\"{$table}\".\"{$field}\"" => $model->$fieldToCheck]);
    return $query->count();

Rewrite literal class names

You'll need to update any strings that represent class names and make sure they're fully qualified. In particular, relationship definitions such as has_one and has_many will need to be updated to refer to fully qualified class names.

In configs and with literal PHP strings it is recommended to use the PHP ::class constant, as demonstrated below.

+ use SilverStripe\ORM\DataObject;
+ use SilverStripe\Security\Member;
class MyClass extends DataObject
    private static $has_one = [
-    'Author' => 'Member',
+    'Author' => Member::class,

In the context of YAML, the magic constant ::class does not apply. Fully qualified class names must be hard coded.

  property: value

Controllers renamed

The convention for naming controllers is now [MyPageType]Controller, where it used to be [MyPageType]_Controller. This change was made to be more compatible with the PSR-2 standards.

You can still use, for example, Page_Controller, but you will get a deprecation notice. It is best to change it to PageController during your upgrade process. Keep in mind any modules or other thirdparty code that extend PageController are likely to assume that class exists.

By default, a controller for a page type must reside in the same namespace as its page. To use different logic, override SiteTree::getControllerName().

Template locations and references

Templates are now more strict about their locations. Case is now also checked on case-sensitive filesystems.

Either include the folder in the template name (renderWith('') => renderWith('emails/')), move the template into the correct directory, or both.

Core template locations have moved - if you're including or overriding these (e.g. for FormField templates) please adjust to the new paths. The forms folder no longer exists, and instead template locations will be placed in paths that match the class namespace, SilverStripe\Forms.

When using the <% include %> template tag you can continue to leave out the Includes folder, but this will search templates in the base folder if no Include can be found.

<% include Sidebar %> will match Includes/, but will also match if the former is not present.

Please refer to our template syntax for details.

Config settings should be set to private static

Class configuration defined as static properties need to be marked as private to take effect:

-public static $allowed_actions = [
+private static $allowed_actions = [

Module paths can't be hardcoded

You should no longer rely on modules being placed in a deterministic folder (e.g. /framework), and use getters on the Module object instead. They expect a module composer name, followed by the module relative path, separated by a double colon. This prepares Silverstripe for moving modules out of the webroot at a later point.

Usage in templates:

-<img src="framework/images/image.png" />
+<img src="$ModulePath(silverstripe/framework)/images/image.png" />

-<% require css("framework/css/styles.css") %>
+<% require css("silverstripe/framework: css/styles.css") %>

Usage in Requirements:

+Requirements::css('silverstripe/framework: css/styles.css');

Usage with custom logic:

+use SilverStripe\Core\Manifest\ModuleLoader;
+use SilverStripe\View\ThemeResourceLoader;
+use SilverStripe\View\SSViewer;

-$moduleFilePath = FRAMEWORK_DIR . '/MyFile.php';
+$moduleFilePath = ModuleLoader::getModule('silverstripe/framework')->getResource('MyFile.php')->getRelativePath();

-$baseFilePath = BASE_PATH . '/composer.json';
+$baseFilePath = Director::baseFolder() . '/composer.json';

-$mysiteFilePath = 'mysite/css/styles.css';
+$mysiteFilePath = ModuleLoader::getModule('mysite')->getResource('css/styles.css')->getRelativePath();

-$themesFilePath = SSViewer::get_theme_folder() . '/css/styles.css';
+$themes = SSViewer::get_themes();
+$themesFilePath = ThemeResourceLoader::inst()->findThemedResource('css/styles.css', $themes);

-$themeFolderPath = THEMES_DIR . '/simple';
+$themeFolderPath = ThemeResourceLoader::inst()->getPath('simple');

Usage for Page and ModelAdmin:

namespace App\PageType;

use Page;

class ListingPage extends Page
    private static $icon = 'mycompany/silverstripe-mymodule: client/images/sitetree_icon.png';
namespace App\Admin;

use SilverStripe\Admin\ModelAdmin;

class MyCustomModelAdmin extends ModelAdmin
    private static $menu_icon = 'mycompany/silverstripe-mymodule: client/images/modeladmin_icon.png';

To ensure consistency, we've also deprecated support for path constants:

  • Deprecated CMS_DIR and CMS_PATH
  • Deprecated THEMES_DIR and THEMES_PATH

Adapt tooling to modules in vendor folder

Silverstripe modules can now be installed like any other composer package: In the vendor/ folder instead of the webroot. Modules need to opt in to this behaviour after they've ensured that no hardcoded path references exist (see "Upgrade module paths in file references").

All core modules have been moved over already:


Since the vendor/ folder isn't publicly accessible, modules need to declare which files need to be exposed via the new vendor-plugin (e.g. images or CSS/JS files). These files will be either symlinked or copied into a new resources/ folder automatically on composer install.

If your deployment process relies on composer install on the production environment, and this environment supports symlinks, you don't need to change anything. If you deploy release archives or upload code via FTP, either ensure those archives can correctly extract symlinks, or explicitly switch to the "copy" mode to avoid symlinks.

At this point, you should consider using a public/ folder as the webroot, which was introduced in the newer 4.1.0 release. The same vendor-plugin mechanism should be used to expose public files in your themes and project folders.

SS_Log replaced with PSR-3 logging

One of the great changes that comes with Silverstripe 4 is the introduction of PSR-3 compatible logger interfaces. This means we can use thirdparty services like Monolog. SS_Log has been replaced with a logger which can be accessed using the LoggerInterface::class service.

For instance, code which logs errors should be upgraded as below:

-SS_Log::log('My error message', SS_Log::ERR);
+use Psr\Log\LoggerInterface;
+use SilverStripe\Core\Injector\Injector;
+Injector::inst()->get(LoggerInterface::class)->error('My error message');

If necessary, you may need to customise either the default logging handler, or one of the error formatters. For example, if running unit tests you may want to suppress errors. You can temporarily disable logging by setting a NullHandler

Name: custom-dev-logging
After: dev-logging
  environment: dev
# Replace default handler with null
  Monolog\Handler\HandlerInterface: Monolog\Handler\NullHandler

Alternatively you can customise one or both of the below services:

  • Monolog\Formatter\FormatterInterface.detailed service, which is used for displaying detailed error messages useful for developers.
  • Monolog\Formatter\FormatterInterface.friendly service, which is used to display "error" page content to visitors of the site who encounter errors.

For example, a custom error page generator could be added as below:

Name: custom-errorpage
  - '#loggingformatters'
    class: WebDesignGroup\ShopSite\Logging\ErrorPageFormatter

WebDesignGroup\ShopSite\Logging\ErrorPageFormatter should be a class that implements the Monolog\Formatter\FormatterInterface interface.

Replace $project with YAML config

The global $project is deprecated in favour of the configuration setting SilverStripe\Core\Manifest\ModuleManifest.project.

Changes to mysite/_config.php:

-global $project;
-$project = 'mysite';
-include 'conf/ConfigureFromEnv.php';

And also add to mysite/_config/mysite.yml:

  project: mysite

Session object removes static methods

Session object is no longer statically accessible via Session::inst(). Instead, Session is a member of the current request.

public function httpSubmission($data, $form, $request)
-    Session::set('loggedIn', null);
+    $request->getSession()->set('loggedIn', null);

In some places it may still be necessary to access the session object where no request is available. In rare cases it is still possible to access the request of the current controller via Controller::curr()->getRequest() to gain access to the current session.

Extensions are now singletons

Extensions are now all singletons, meaning that state stored as protected vars within extensions are now shared across all object instances that use this extension.

As a result, you must take care that all protected vars are either refactored to be stored against the owner object, or are keyed in a fashion distinct to the parent.

class MyExtension extends Extension {
    public function getContent() {
-        if (!$this->contentCache) {
-            $this->contentCache = $this->generateContent();
-        }
-        return $this->contentCache;
+        $contentCache = $this->owner->getField('contentCache');
+        if (!$contentCache) {
+            $contentCache = $this->generateContent();
+            $this->owner->setField('contentCache', $contentCache);
+        }
+        return $contentCache;

When using extensions with distinct constructor arguments it's advisable to use yml to register those constructor arguments and use a service name or alias in private static $extensions. Please review the default service definitions below:

Name: versionedextension
  # Versioning only
    class: SilverStripe\Versioned\Versioned
      mode: Versioned
  # Staging and Versioning
    class: SilverStripe\Versioned\Versioned
      mode: StagedVersioned
  # Default is alias for .stagedversioned
  SilverStripe\Versioned\Versioned: '%$SilverStripe\Versioned\Versioned.stagedversioned'

Upgrade your extension references:

class MyClass extends DataObject {
    private static $extensions = [
-        Versioned::class . '(Versioned)',
+        Versioned::class . '.versioned',

JavaScript files in framework/admin

Most JavaScript files in framework/javascript have been removed, and are bundled through Webpack into a combined file instead. If you have referenced these files elsewhere, please consider running the ES6 source files in vendor/silverstripe/admin/client/src/legacy through your own transpiling and bundle process.

This also includes JavaScript i18n support, and the removal of the i18n::js_i18n configuration option used in Requirements::add_i18n_javascript().

The CMS UI is moving away from Requirements::combine_files() in favour of Webpack. This method is being considered for deprecation in future versions.

All JavaScript thirdparty dependencies have either been moved to NPM (see package.json), or moved into the framework/admin/thirdparty folder. If you are hotlinking to any of these files, please consider packaging your own versions in your projects and modules. For CMS modules, you can also use many library globals which the core bundles already expose (see Build Tooling).

One commonly linked thirdparty dependency is jquery.js bundled with Silverstripe:

framework/thirdparty/jquery/jquery.js => framework/admin/thirdparty/jquery/jquery.js

If you have customised the CMS UI (via JavaScript or CSS), please read our guide to customise the admin interface.

Explicit text casting on template variables

Now whenever a $Variable is used in a template, regardless of whether any casts or methods are suffixed to the reference, it will be cast to either an explicit DBField for that field, or the value declared by the default_cast on the parent object.

The default value of default_cast is Text, meaning that now many cases where a field was left un-uncoded, this will now be safely encoded via Convert::raw2xml. In cases where un-cast fields were used to place raw HTML into templates, this will now encode this until explicitly cast for that field.

You can resolve this in your model by adding an explicit cast to HTML for those fields.

use SilverStripe\View\ViewableData;
use SilverStripe\Core\Convert;

class MyObject extends ViewableData
+    private static $casting = [
+        'SomeHTML' => 'HTMLText'
+    ];

    public function getSomeHTML
-        $title = Convert::raw2xml($this->Title);
+        $title = Convert::raw2xml($this->Title);
        return "<h1>{$title}</h1>";

If you need to encode a field (such as HTMLText) for use in HTML attributes, use .ATT instead, or if used in an actual XML file use .CDATA (see template casting).

Replace UploadField with injected service

This field has been superseded by a new class provided by the asset-admin module, which provides a more streamlined simpler mechanism for uploading File dataobjects.

A helper service FileHandleField is provided to assist with dependency injection. Where the asset-admin module is not installed this service will fall back to the FileField class instead. Usages of UploadField will need to be upgraded as below.

use SilverStripe\Forms\FieldList;
-use SilverStripe\AssetAdmin\Forms\UploadField;
+use SilverStripe\Forms\FileHandleField;
+use SilverStripe\Core\Injector\Injector;
use SilverStripe\ORM\DataObject;

class MyClass extends DataObject
    public function getCMSFields()
        return new FieldList(
-            new UploadField('Files')
+            Injector::inst()->create(FileHandleField::class, 'Files')

I18n placeholders, plurals and i18nEntityProvider

In many cases, localisation strings which worked in 3.x will continue to work in 4.0, however certain patterns have been deprecated and will be removed in 5.0. These include:

  • _t() calls with sprintf-style placeholders (%s). Replace with named placeholders instead.
  • _t() calls with non-associative injection arguments. Please use an associative array for all arguments.
  • _t() calls which do not include a default value will now raise a warning. This can be disabled by setting the i18n.missing_default_warning config to false.

If you attempt to use non-associative injection arguments with named placeholders, the result will now trigger an exception.

Implementors of i18nEntityProvider should note that the return type for provideI18nEntities() has changed as well. The non-associative array return type is deprecated. If returning a default string for a module other than itself, it should return an array with the default and module keys respectively.

Full locale-rule respecting localisation for plural forms is now supported. The default key for an object plural form is <Namespaced\ClassName>.PLURALS, and follows CLDR array form for each pluralisation. See the CLDR chart for reference.

The below demonstrates how you can provide new localisation strings for an object, including both plurals and cross-module localisations.

namespace App\Model;

use SilverStripe\ORM\DataObject;

class MyObject extends DataObject, implements i18nEntityProvider
    public function provideI18nEntities()
        return [
            'MyObject.SINGULAR_NAME' => 'object',
            'MyObject.PLURAL_NAME' => 'objects',
            'MyObject.PLURALS' => [
                'one' => 'An object',
                'other' => '{count} objects',
            'AnotherSection.DESCRIPTION' => [
                'default' => 'This is the description for this section',
                'module' => 'extendedmodule',

In YML format this will be expressed as the below:


    SINGULAR_NAME: 'object'
    PLURAL_NAME: 'objects'
      one: 'An object',
      other: '{count} objects'


    DESCRIPTION: 'This is the description for this section'

Usage of these pluralised strings is through the existing _t() method, and require a | pipe-delimeter with a {count} argument.

namespace App\Model;

use SilverStripe\ORM\DataObject;

class MyObject extends DataObject
    // ...

    public function pluralise($count)
        return _t('MyObject.PLURALS', 'An object|{count} objects', [ 'count' => $count ]);

In templates this can also be invoked as below:

<%t MyObject.PLURALS 'An item|{count} items' count=$Count %>

Removed Member.DateFormat and Member.TimeFormat database settings

We're using native HTML5 date and time pickers in DateField and TimeField now (discussion), where the browser localises the output based on the browser/system preferences. In this context it no longer makes sense to give users control over their own date and time formats in their CMS profile. Consequently, we've also removed MemberDatetimeOptionsetField.

Member->getDateFormat() and Member->getTimeFormat() still exist, and default to the IntlDateFormatter defaults for the selected locale.

New asset storage mechanism

File system has been abstracted into an abstract interface. By default, the out of the box filesystem uses Flysystem with a local storage mechanism (under the assets directory). In order to fully use this mechanism, we need to adjust files and their database entries, through a file migration task.

Note: In order to allow draft files and multiple versions of file contents, we're adding a "content hash" to the file paths by default. Before 4.4.0, this was in effect for both public and protected URLs. Starting with 4.4.0, only protected URLs receive those "content hashes". Public files have a "canonical URL" which doesn't change when file contents are replaced (4.4.0). See our "File Management" guide for more information.

Depending on your server configuration, it may also be necessary to adjust your assets folder permissions. Please see the the Tips & Tricks forum guide for configuration instruction.

Image handling

As all image-specific manipulations has been refactored from Image into an ImageManipulations trait, which is applied to both File and DBFile. These both implement a common interface AssetContainer, which has the getIsImage() method. In some cases, it may be preferable to invoke this method to detect if the asset is an image or not, rather than checking the subclass, as the asset may also be a DBFile with an image filter applied, rather than an instance of the Image dataobject.

In addition, a new file category image/supported has been added, which is a subset of the image category. This is the subset of all image types which may be assigned to the Image dataobject, and may have manipulations applied to it. This should be used as the file type restriction on any UploadField which is intended to upload images for manipulation.

-if($file instanceof Image) {
-    $upload = new UploadField();
-    $upload->setAllowedFileCategories('image');
+if ($file->getIsImage()) {
+    $upload = new UploadField(); // see higher about using FileHandleField instead
+    $upload->setAllowedFileCategories('image/supported');

In cases where image-only assets may be assigned to relationships then your datamodel should specify explicitly an Image datatype, or refer to DBFile('image/supported').

namespace App\Model;

use SilverStripe\Assets\Image;
use SilverStripe\ORM\DataObject;

class MyObject extends DataObject
    private static $has_one = [
        'ImageObject' => Image::class,
    private static $db = [
        'ImageField' => "DBFile('image/supported')",

Writing to File dataobjects or the assets folder

In the past all that was necessary to write a File DataObject to the database was to ensure a physical file existed in the assets folder, and that the Filename of the DataObject was set to the same location.

Since the storage of physical files is no longer a standard location, it's necessary to delegate the writing of such files to the asset persistence layer. As a wrapper for an individual file, you can use any of the setFrom* methods to assign content from a local (e.g. temporary) file, a stream, or a string of content. You would need to upgrade your code as below.

-function importTempFile($tmp)
-    copy($tmp, ASSETS_PATH . '/imported/' . basename($tmp));
-    $file = new File();
-    $file->setFilename('assets/imported/'.basename($tmp));
-    $file->write();
+public function importTempFile($tmp)
+    Versioned::reading_stage('Stage');
+    $file = new File();
+    $file->setFromLocalFile($tmp, 'imported/' . basename($tmp));
+    $file->write();
+    $file->doPublish();

Note that 'assets' is no longer present in the new code, and the path beneath what was once assets is now used to generate the 'filename' value. This is because there is no longer an assumption that files are stored in the assets folder.

There are other important considerations in working with File dataobjects which differ from legacy:

  • File synchronisation is no longer automatic. This is due to the fact that there is no longer a 1-to-1 relationship between physical files and File DataObjects.
  • Folder DataObjects are now purely logical DataObjects, and perform no actual filesystem folder creation on write.
  • All Files are versioned, which means that by default, new File records will not be visible to the public site. You will need to make sure to invoke ->doPublish() on any File DataObject you wish visitors to be able to see.

You can disable File versioning by adding the following to your _config.php

use SilverStripe\Assets\File;


Custom image manipulations

As file storage and handling has been refactored into the abstract interface, many other components which were once specific to Image.php have now been moved into a shared ImageManipulation trait. Manipulations of file content, which are used to generate what are now called "variants" of assets, is now a generic API available to both File and DBFile classes through this trait.

Custom manipulations, applied via extensions, must be modified to use the new API. For instance, code which sizes images to a fixed width should be updated as below:


// in app/src/Extension/MyImageExtension.php
namespace App\Extension;

use SilverStripe\Assets\Image_Backend;

class MyImageExtension extends SilverStripe\ORM\DataExtension
    public function GalleryThumbnail($height)
        return $this->getFormattedImage('GalleryThumbnail', $height);

    public function generateGalleryThumbnail(Image_Backend $backend, $height)
        return $backend->paddedResize(300, $height);
// in _config.php
use App\Extension\MyImageExtension;
use SilverStripe\Assets\Image;


Now image manipulations are implemented with a single method via a callback generator:

// in app/src/Extension/MyImageExtension.php
namespace App\Extension;

use SilverStripe\Assets\Image_Backend;

class MyImageExtension extends SilverStripe\Core\Extension
    public function GalleryThumbnail($height)
        // Generates the manipulation key
        $variant = $this->owner->variantName(__FUNCTION__, $height);

        // Instruct the backend to search for an existing variant with this key,
        // and include a callback used to generate this image if it doesn't exist
        return $this->owner->manipulateImage($variant, function (Image_Backend $backend) use ($height) {
            return $backend->paddedResize(300, $height);
// in _config.php
use App\Extension\MyImageExtension;
use SilverStripe\Assets\File;
use SilverStripe\Filesystem\Storage\DBFile;


There are a few differences in this new API:

  • The extension is no longer specific to DataObjects, so it uses the generic Extension class instead of DataExtension
  • This extension is added to both DBFile and File, or order to make this manipulation available to non-dataobject file references as well, but it could be applied to either independently.
  • A helper method variantName is invoked in order to help generate a unique variant key. Custom code may use another generation mechanism.
  • Non-image files may also have manipulations, however the specific manipulateImage should not be used in this case. A generic manipulate method may be used, although the callback for this method both is given, and should return, an AssetStore instance and file tuple (Filename, Hash, and Variant) rather than an Image_Backend.

Customising file edit form fields

In 3.x, customisation of the edit form for files and images could be done using the conventional updateCMSFields(FieldList $fields) hook. In 4.x, this method no longer has any influence on the file edit form that gets rendered in asset-admin. Instead, create an extension for FileFormFactory and use the updateFormFields(FieldList $fields) hook.

In this example, we'll add a description field to the File object and give it an editable field in the CMS.

# app/_config/extensions.yml
    - App\Extension\MyFileExtension

    - App\Extension\MyFormFactoryExtension
// app/src/Extension/MyFileExtension.php
namespace App\Extension;

use SilverStripe\ORM\DataExtension;

class MyFileExtension extends DataExtension
    private static $db = [
        'Description' => 'Text',
// app/src/Extension/MyFormFactoryExtension.php
namespace App\Extension;

use SilverStripe\Core\Extension;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextareaField;

class MyFormFactoryExtension extends Extension
    public function updateFormFields(FieldList $fields)
            TextareaField::create('Description', 'Description')

File or image shortcode handler

The handle_shortcode methods have been removed from the core File and Image classes and moved to separate classes in their own respective namespace. Image and File do not implement the ShortcodeHandler interface anymore. The shortcode handler for File has been moved to SilverStripe\Assets\ShortcodesFileShortcodeProvider and the Image handler has been moved to SilverStripe\Assets\Shortcodes\ImageShortcodeProvider

Example of changed shortcode handling:

+use SilverStripe\Assets\Shortcodes\FileShortcodeProvider;
class MyShortcodeUser extends Object
    private $content;

    public function Content($arguments, $parser, $shortcode)
-        return File::handle_shortcode($arguments, $this->content, $parser, $shortcode);
+        return FileShortcodeProvider::handle_shortcode($arguments, $this->content, $parser, $shortcode);

Composite db fields

The CompositeDBField interface has been replaced with an abstract class, DBComposite. In many cases, custom code that handled saving of content into composite fields can be removed, as it is now handled by the base class.

The below describes the minimum amount of effort required to implement a composite DB field.

namespace App\Form\Field;

use SilverStripe\Forms\TextField;
use SilverStripe\ORM\FieldType\DBComposite;

class MyAddressField extends DBComposite
    private static $composite_db = [
        'Street' => 'Varchar(200)',
        'Suburb' => 'Varchar(100)',
        'City' => 'Varchar(100)',
        'Country' => 'Varchar(100)',

    public function scaffoldFormField($title = null, $params = null)
        return TextField::create($this->getName(), $title);

Removed DataObject::database_fields or DataObject::db

The methods DataObject::database_fields(), DataObject::custom_database_fields() and DataObject::db() have been removed.

Instead, to get all database fields for a dataobject, including base fields (such as ID, ClassName, Created, and LastEdited), use DataObject::getSchema()->databaseFields($className, $aggregate = true). To omit the base fields, pass a value of false as the $aggregate parameter, e.g. DataObject::getSchema()->databaseFields(Member::class, false).

Composite database fields are omitted from the databaseFields() method. To get those, use DataObject::getSchema()->compositeFields($className, $aggregate = true).

Rewrite SQLQuery to more specific classes

Instead of SQLQuery, you should now use SQLSelect, SQLUpdate, SQLInsert or SQLDelete - check the 3.2.0 upgrading notes for details.


-function augmentSQL(SQLQuery &$query, DataQuery &$dataQuery = null)
+public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null)
    if(!preg_match('/MyField/', implode(' ', $query->getWhere()))) {
-        $query->addWhere('"MyField" = \'foo\'');
+        $query->addWhere(['"MyField"' => 'foo']);

Upgrade BuildTask classes

Similarly to the $table_name configuration property for DataObjects, you should define a private static $segment for BuildTask instances to ensure that you can still run your task via sake dev/tasks/MyTask. Without defining it, the default will be a fully-qualified class name like sake dev/tasks/App-Task-MyTask. This can also be configured in YAML.

namespace App\Task;

use SilverStripe\Dev\BuildTask;

class MyTask extends BuildTask
    private static $segment = 'MyTask';

Moved ErrorPage into a new module

NOTE: This is included automatically if you switch to using the recipe-cms module.

ErrorPage has been moved to a separate silverstripe/errorpage module to allow for alternative approaches to managing error responses. The module is installed by default on new projects, but needs to be added to existing projects to preserve functionality on the existing "Page not found" and "Server error" pages in the CMS.

composer require silverstripe/errorpage

Alternatively you can implement your own onBeforeHTTPError() handling to present custom errors. By default, Silverstripe will display a plaintext "not found" message when the module isn't installed. Check the module upgrading guide for more configuration API changes on the ErrorPage class.

Server configuration files for assets

Server configuration files for /assets are no longer static, and are regenerated via a set of standard Silverstripe templates on flush. These templates include:

  • Template for public permissions on the Apache server.
  • Template for public permissions on the IIS server.
  • Template for the protected store on the Apache server (should deny all requests).
  • Template for the protected store on the IIS server (should deny all requests).

You will need to make sure that these files are writable via the web server, and that any necessary configuration customisation is done via overriding these templates.

Depending on your server configuration, it may also be necessary to adjust your assets folder permissions. Please see the the Tips & Tricks forum for configuration instruction.

If upgrading from an existing installation, make sure to invoke ?flush=all at least once.

See our "File Security" guide for more information.

TinyMCE v4

Please see the TinyMCE upgrading guide to assist with upgrades to customisations to TinyMCE v3.

In Framework 4.0 the user interface for TinyMCE has been trimmed down considerably, with certain toolbar buttons removed from the default CMS configuration:

  • Strikethrough
  • Styles dropdown
  • Block quotes
  • Horizontal Rule
  • Undo / Redo
  • Cut / Paste as word
  • Select all
  • Fullscreen

However, these function may be enabled on a case by case basis through modification of the default TinyMCE config, or by creating custom configurations (check TinyMCE documentation).

The optional ss_macron plugin for inserting Māori diacritical marks has been removed from core. You can configure the built-in charmap plugin instead:

use SilverStripe\Forms\HTMLEditor\HtmlEditorConfig;

$editor = HtmlEditorConfig::get('cms');
$editor->addButtonsToLine(1, 'charmap');
$editor->setOption('charmap_append', [
    ['256','A - macron'],
    ['274','E - macron'],
    ['298','I - macron'],
    ['332','O - macron'],
    ['362','U - macron'],
    ['257','a - macron'],
    ['275','e - macron'],
    ['299','i - macron'],
    ['333','o - macron'],
    ['363','u - macron'],

DataObject models with the Versioned extension

In most cases, versioned models with the default versioning parameters will not need to be changed. However, there are now additional restrictions on the use of custom stage names.

Rather than declaring the list of stages a model has, the constructor for Versioned will take a single mode parameter, which declares whether or not the model is versioned and has a draft and live stage, or alternatively if it only has versioning without staging.

Each form of this extension is registered under the appropriate service identifier, which you should use in your model as below:

namespace App\Model;

use SilverStripe\ORM\Versioning\Versioned;

 * This model has staging and versioning. Stages will be "Stage" and "Live"
class MyStagedModel extends SilverStripe\ORM\DataObject
    private static $extensions = [
        Versioned::class . '.stagedversioned',
namespace App\Model;

use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\Versioning\Versioned;

 * This model has versioning only, and will not has a draft or live stage, nor be affected by the current stage.
class MyVersionedModel extends DataObject
    private static $extensions = [
        Versioned::class . '.versioned',

Additionally, the following API methods have been added:

  • Versioned::publishRecursive Publishes this object, and all owned objects
  • Versioned::publishSingle Publishes this object, but not owned objects
  • Versioned::copyVersionToStage Replaces the old publish method.

These methods are deprecated:

  • Versioned::publish Replaced by Versioned::copyVersionToStage
  • Versioned::doPublish Replaced by Versioned::publishRecursive

New ownership API

In order to support the recursive publishing of dataobjects, a new API has been developed to allow developers to declare dependencies between versioned objects.

namespace App\PageType;

class ProductPage extends Page
    private static $owns = [
        // This page depends on banners, declared as a separate 'has_many'
        // This page depends on the footer image, declared as a separate 'has_one'
    // ...

This is done to ensure that the published state of linked components are consistent with their "owner". Without the concept of ownership, these linked components could be implicitly exposed on the frontend, which may not align with the intent of the content author.

For instance, on a products page which has a list of products, the products should not be published unless the products page is, too. The ownership API solves this by allowing you to declare a two-way relationship between objects, typically, but not necessarily, linked by a database relationship (has_many, many_many, etc.).

namespace App\PageType;

use App\Model\Product;
use Page;

class ProductPage extends Page
    private static $has_many = [
        'Products' => Product::class,

    private static $owns = [
namespace App\Model;

use App\PageType\ProductPage;
use SilverStripe\ORM\DataObject;
use SilverStripe\Versioned\Versioned;

class Product extends DataObject
    private static $extensions = [

    private static $has_one = [
        'Parent' => ProductPage::class,

If your objects are linked by something other than a database relationship, for instance, a custom getter that is computed at runtime, the same rules can be applied, as long as you provide an $owned_by setting on the child object.

For more information, see the DataObject ownership documentation and the versioning documentation

ChangeSet batch publishing

ChangeSet objects have been added, which allow groups of objects to be published in a single atomic transaction. This API will utilise the ownership API to ensure that changes to any object include all necessary changes to owners or owned entities within the same changeset.

New [image] shortcode in HTMLText fields

The new Ownership API relies on relationships between objects. Many of these relationships are already made explicit through has_one, has_many and many_many. Images inserted into HTMLText fields (through a WYSIWYG editor) need to be tracked as well. Instead of <img> tags, the field will insert [image] shortcodes which point to the database identifier of the Image record rather than its path on the filesystem. The shortcode will be automatically replaced when the field is rendered. Newly inserted images will automatically receive the shortcode and ownership tracking, and existing <img> will continue to work.

Renamed DBField and subclasses

All DBField subclasses are namespaced, have a DB prefix, and drop any existing SS_ prefix. For example, Text becomes SilverStripe\ORM\FieldType\DBText, and SS_Datetime becomes SilverStripe\ORM\FieldType\DBDatetime. Since they are aliased to their old name, you likely won't need to change your DataObject::$db definitions. If you are instantiating or otherwise referencing those classes directly (not through strings), they'll likely get rewritten automatically through the upgrader tool.


use SilverStripe\ORM\DataObject;
+use SilverStripe\ORM\FieldType\DBVarchar;

class MyObject extends DataObject
    private static $db = [
        'Number' => 'Int',
-        'Time' => 'SS_Datetime'
+        'Time' => 'Datetime'

    public function TextNumber()
-        return new Varchar('TextNumber', 'Number is ' . $this->Number);
+        return new DBVarchar('TextNumber', 'Number is ' . $this->Number);

Removed RestfulService

The RestfulService API was a (poor) attempt at a built-in HTTP client. We've removed it, and recommend using Guzzle instead.

Removed oembed

Instead of Oembed, the framework now relies on oscarotero/Embed to handle getting the shortcode-data for embedding. If you have custom embedding-code relying on Oembed, please refer to the documentation provided by this package.

Configurable admin URL

The default admin/ URL to access the CMS interface can now be changed via a custom Director routing rule for AdminRootController. If your website or module has hard coded admin URLs in PHP, templates or JavaScript, make sure to update those with the appropriate function or config call. See CMS architecture for language specific functions.

Custom authenticators

The methods register() and unregister() on Authenticator are deprecated in favour of the Config system. This means that any custom Authenticator needs to be registered through the YAML config. Check the Authentication docs for details how to setup a custom handler.

    - MyVendor\MyModule\MyAuthenticator

If there is no authenticator registered, Authenticator will try to fall back on the default_authenticator, which can be changed using the following config, replacing the MemberAuthenticator with your authenticator:

  default_authenticator: SilverStripe\Security\MemberAuthenticator

As soon as a custom authenticator is registered, the default authenticator will not be available anymore, unless enabled specifically in the config. By default, the SilverStripe\Security\MemberAuthenticator is seen as the default authenticator until it's explicitly set in the config.

Every request is now authenticated against an IdentityStore interface. By default that's a CookieAuthenticationHandler and a SessionAuthenticationHandler, which are called from the AuthenticationHandler. If there is a valid Member, it is set on Security::setCurrentUser(), which defaults to null. IdentityStores are responsible for logging members in and out (e.g. destroy cookies and sessions, or instantiate them).

Config is now immutable

Performance optimisations have been made to Config which, under certain circumstances, require developer care when modifying or caching config values. The top level config object is now immutable on application bootstrap, and requires a developer to invoke Config::modify() to make mutable prior to modification. This will immediately have a slight performance hit, so should be done sparingly, and avoided at all if possible in performance intensive applications.

The Config::inst()->update() method is deprecated, and replaced with Config::modify()->set() and Config::modify()->merge() to respectively replace and merge config.

When config is merged (either via modification or merged between YAML blocks) falsey-values (including nulls) now replace any prior values (even arrays).

One removed feature is the Config::FIRST_SET option. Either use uninherited config directly on the class directly, or use the inherited config lookup. As falsey values now overwrite all parent class values, it is now generally safer to use the default inherited config, where in the past you would need to use FIRST_SET.

Replace Zend_Cache with symfony/cache

We have replaced the unsupported Zend_Cache library with symfony/cache. This also allowed us to remove Silverstripe's Cache API and use dependency injection with a standard PSR-16 cache interface instead.

Caches should be retrieved through Injector instead of Cache::factory(), and have a slightly different API (e.g. set() instead of save()).

-$cache = Cache::factory('myCache');
+use Psr\SimpleCache\CacheInterface;
+$cache = Injector::inst()->get(CacheInterface::class . '.myCache');

// create a new item by trying to get it from the cache
-$myValue = $cache->load('myCacheKey');
+$myValue = $cache->get('myCacheKey');

// set a value and save it via the adapter
-$cache->save(1234, 'myCacheKey');
+$cache->set('myCacheKey', 1234);

// retrieve the cache item
-if (!$cache->load('myCacheKey')) {
-    // ... item does not exists in the cache
+if (!$cache->has('myCacheKey')) {
+    // ... item does not exists in the cache

// Remove a cache key

With the necessary minimal config in _config/mycache.yml

Name: mycache
    factory: SilverStripe\Core\Cache\CacheFactory
      namespace: 'mycache'

Caches are now configured through dependency injection services instead of PHP. See our "Caching" docs for more details.

Before (mysite/_config.php):

        'servers' => [
            'host' => 'localhost',
            'port' => 11211,
Cache::pick_backend('primary_memcached', 'any', 10);

After (mysite/_config/config.yml):

# setup cache
  - '#corecache'
    class: 'Memcached'
      - [ addServer, [ 'localhost', 11211 ] ]
    class: 'SilverStripe\Core\Cache\MemcachedCacheFactory'
      client: '%$MemcachedClient

User-code style upgrades

Although it is not mandatory to upgrade project code to follow Silverstripe and PSR-2 standard it is highly recommended to ensure that code is consistent. The below sections will assist you with bringing yourself up to speed.

Please note that before upgrading user code style it is necessary to run the standard upgrade path to fix references and usages of framework API.

Updating custom DataObject models to use existing table names

Once you have namespaced your user code it will be necessary to customise the table_name config for your dataobjects, in order to ensure the correct table is used after upgrade. It is recommended to point this to the base name of the class, excluding namespace, as in 3.x.

namespace WebDesignGroup\ShopSite;
use SilverStripe\ORM\DataObject;
use Page;
class GalleryPage extends Page
+    private static $table_name = 'GalleryPage';

Class name remapping

If you've namespaced one of your custom page types, you may notice a message in the CMS telling you it's obsolete. This is likely because the ClassName field in the SiteTree table still contains the singular model name, e.g. GalleryPage and that when you change it to WebDesignGroup\ShopSite\GalleryPage then everything works again.

The dev/build task is configured to look for a legacy class name mapping configuration setting and will update this for you automatically. You can use this to add DB upgrading rules for your own classes.

For example, you could upgrade references to the newly namespaced Banner class by adding this to your mysite/_config/legacy.yml file:

    GalleryPage: WebDesignGroup\ShopSite\GalleryPage

The next time you run a dev/build the class name for all GalleryPage pages will be automatically updated to the new WebDesignGroup\ShopSite\GalleryPage

PSR-2 coding standard compliance

You can use the PHP codesniffer tool to not only detect and lint PSR-2 coding errors, but also do some minimal automatic code style migration.

  • Install the necessary library: composer require squizlabs/php_codesniffer
  • Copy Silverstripe standards config file from framework/phpcs.xml to your project root: cp ./framework/phpcs.xml ./phpcs.xml
  • Run the automatic upgrade tool on your code folder vendor/bin/phpcbf ./mysite/code
  • Run the automatic linting tool to detect and manually fix other errors: vendor/bin/phpcs ./mysite/code

Repeat the final step and manually repair suggested changes, as necessary, until you no longer have any linting issues.

PSR-4 autoloading for project code

While not critical to an upgrade, Silverstripe 4.0 has adopted the PSR-4 autoloading standard for the core modules, so it's probably a good idea to be consistent.

You can implement this in your composer configuration like so:

    "autoload": {
        "psr-4": {
            "WebDesignGroup\\ShopSite\\": "mysite/src/"

Now you just need to ensure that each class site in the correct folder location (including case sensitivity) to match its namespace. For example, WebDesignGroup\ShopSite\Model\GalleryItem.php should live at mysite/src/Model/GalleryItem.php.

Note that you don’t have to use src/ as the root folder name. You can continue to use code/ if you want to. Silverstripe has adopted the PSR-4 approach and have also started to use src/ as a default folder location instead of code/. If you’re going to change, it's probably a good time to do it while you're upgrading.

For examples, take a look at the file/folder structure and to the composer.json configuration in either the framework or cms modules.

Please note that there are changes to template structure which in some cases require templates to be in a folder location that matches the namespace of the class that it belongs to, e.g. themes/mytheme/templates/MyVendor/Foobar/Model/

API changes


  • Minimum PHP version raised to 5.6 (with support for PHP 7.x)
  • Dropped support for PHP safe mode (removed PHP 5.4).
  • Once PHP versions become unsupported by the PHP Project, we drop support for those versions in the next minor release This means PHP 5.6 and PHP 7.0 support will become unsupported in Dec 2018.
  • Minimum CMS browser requirement raised from Internet Explorer 8 to Internet Explorer 11
  • Updated PHPUnit from 3.7 to 4.8 (upgrade notes). Please remove any PHPUnit related require_once() calls (e.g. in FeatureContext definitions of the behat-extension module). Run composer require --dev 'phpunit/phpunit:~4.8' on existing projects to pull in the new dependency.
  • always_populate_raw_post_data will now raise a deprecation warning in install.php when running in PHP 5.x, unless set to -1. This is due to $HTTP_RAW_POST_DATA being removed in PHP 7. See the PHP documentation for more information.
  • Admin URL can now be configured via custom Director routing rule
  • Controller::init visibility changed to protected. Use Controller::doInit() instead.
  • Controller::join_links supports an array of link sections.
  • Object::useCustomClass has been removed. You should use the config API with Injector instead. {#object-usecustomclass}
  • Object::invokeWithExtensions now has the same method signature as Object::extend and behaves the same way.
  • ServiceConfigurationLocator is now an interface not a class.
  • i18nTextCollectorTask merge is now true by default.
  • Object has been broken up into various traits, each of which can be added to other objects independently:

    • Configurable Provides Config API helper methods
    • Injectable Provides Injector API helper methods
    • Extensible Allows extensions to be applied
  • Convert class has extra methods for formatting file sizes in PHP ini compatible format

    • Convert::memstring2bytes() will parse a PHP ini memory size.
    • Convert::bytes2memstring() will format the memory size with the appropriate scale.
  • SiteTree.alternatePreviewLink is deprecated. Use updatePreviewLink instead.
  • Injector dependencies no longer automatically inherit from parent classes.
  • $action parameter to Controller::Link() method is standardised.
  • Moved test database cleanup task from sake dev/tests/cleanupdb to sake dev/tasks/CleanupTestDatabasesTask
  • Injector::load given a src parameter will no longer guess the service name from the filename. Now the service name will either by the array key, or the class parameter value.
  • Uniqueness checks for File.Name is performed on write only (not in setName())
  • Created Resettable interface to better declare objects which should be reset between tests.
  • Added a server requirement for the php-intl extension (shipped by default with most PHP distributions)
  • Replaced Zend_Date and Zend_Locale with the php-intl extension.
  • Consistently use CLDR date formats (rather than a mix of CLDR and date() formats)
  • Moved config into a new module: silverstripe/config. See upgrading notes below.
  • Falsey config values (null, 0, false, etc) can now replace non-falsey values.
  • Introduced new ModuleLoader manifest, which allows modules to be found via composer name. e.g. $cms = ModuleLoader::inst()->getManifest()->getModule('silverstripe/cms')
  • ClassManifest::getOwnerModule() now returns a Module object instance.
  • Moved Object::parse_class_spec() to ClassInfo
  • Removed create_from_spec(). Supportede by Injector natively.
  • Moved Controller::Link() to parent class (RequestHandler)
  • Moved Controller::redirect() to parent class (RequestHandler)
  • Moved Controller::redirectBack() to parent class (RequestHandler)
  • RequestHandler::Link() now relies on the url_segment handler being provided for the class. If left unset, this will raise an error.

    • RequestHandler::getBackURL() and getReturnReferer() have been added to safely inspect the current request to see if there is a URL to redirect back to.
  • Renamed LeftAndMain_TreeNode to CMSMain_TreeNode
  • Removed LeftAndMain::SiteTreeAsUL() (override left in CMSMain)
  • Removed LeftAndMain::setApplicationLink() (Deprecated from 3.x)
  • Removed LeftAndMain::setApplicationName() (Deprecated from 3.x)
  • Moved LeftAndMain::getSiteTreeFor() to CMSMain
  • Moved LeftAndMain::getsubtree() to CMSMain
  • Moved LeftAndMain::updatetreenodes() to CMSMain
  • Moved LeftAndMain::savetreenodes() to CMSMain
  • Renamed LeftAndMain::EditorToolbar() to Modals(). Returns a ModalController handler instance rather than a HTMLEditorField_Toolbar
  • Removed Director::$dev_servers and Director::$test_servers
  • Removed Director::$urlParams and Director::setUrlParams()
  • Removed Director.alternate_host. Use Director.alternate_base_url instead.
  • Removed Director.alternate_protocol. Use Director.alternate_base_url instead.
  • 'BlockUntrustedIPS' env setting has been removed. All IPs are untrusted unless SS_TRUSTED_PROXY_IPS is set to '*' See Environment Management docs for full details.
  • SS_TRUSTED_PROXY_HOST_HEADER, SS_TRUSTED_PROXY_PROTOCOL_HEADER, and SS_TRUSTED_PROXY_IP_HEADER are no longer supported. These settings should go into the Injector service configuration for TrustedProxyMiddleware instead.
  • Removed SS_HOST environment constant. Use SS_BASE_URL instead.
  • Member::canLogIn() now returns boolean. Use Member::validateCanLogin() to get a ValidationResult
  • Moved Security::has_default_admin to DefaultAdminService::hasDefaultAdmin()
  • Moved Security::check_default_admin to DefaultAdminService::isDefaultAdminCredentials()
  • Moved Security::default_admin_torname to DefaultAdminService::getDefaultAdminUsername()
  • Moved Security::default_admin_password to DefaultAdminService::getDefaultAdminPassword()
  • Moved Security::setDefaultAdmin to DefaultAdminService::setDefaultAdmin()
  • Moved Security::clearDefaultAdmin to DefaultAdminService::clearDefaultAdmin()
  • Moved Security::findAnAdministrator to DefaultAdminService::findOrCreateDefaultAdmin()
  • Deprecated Member::checkPassword(). Use Authenticator::checkPassword() instead
  • Deprecated RequestFilter. Use HTTPMiddleware instead.
  • Changed RequestFilter: The $session and $dataModel variables removed from preRequest / postRequest.
  • Extension instances are now singletons and no longer are constructed once per extended object. See the 'Upgrade extensions to work as singletons' section on this page for more information.
  • Removed ConfigureFromEnv.php
  • Changed Session object to avoid static access (Session::inst()). Use it from the current request via $request->getSession() instead. All static methods have been removed, and the inst_ prefix removed from all instance members.
  • Director.rules config no longer support redirect:<url> directly via config.
  • Removed Director::get_environment_type() and Director::set_environment_type(). Get the Kernel instance via injector and query getEnvironment() instead. (e.g. $type = Injector::inst()->get(Kernel::class)->getEnvironment())
  • Removed Director.environment_type to configure the environment via YAML. Use a .env file to manage environment settings.
  • Removed increase_xdebug_nesting_level_to() (functionality has been inlined into AppKernel)
  • Moved set_increase_time_limit_max() to Environment::setTimeLimitMax()
  • Moved get_increase_time_limit_max() to Environment::getTimeLimitMax()
  • Moved set_increase_memory_limit_max() to Environment::setMemoryLimitMax()
  • Moved get_increase_memory_limit_max() to Environment::getMemoryLimitMax()
  • Moved increase_time_limit_to() to Environment::increaseTimeLimitTo()
  • Moved increase_memory_limit_to() to Environment::increaseMemoryLimitTo()
  • Moved translate_memstring() to Convert::memstring2bytes.
  • Moved getTempFolder() to TempFolder::getTempFolder()
  • Removed getTempParentFolder()
  • Removed getTempFolderUsername()
  • Removed CMSMain::buildbrokenlinks()
  • Removed Injector::unregisterAllObjects(). Use unregisterObjects to unregister groups of objects limited by type instead.
  • Removed SS_Log. Use Injector::inst()->get(LoggerInterface::class) instead.
  • Removed CMSBatchAction_Delete
  • Removed CMSBatchAction_DeleteFromLive
  • Removed CMSMain.enabled_legacy_actions config.
  • CMSmain.getCMSTreeTitle is now ignored on extensions. Use updateCMSTreeTitle in extensions instead.
  • Removed ability to run tests via web requests (, use the standard CLI command instead (vendor/bin/phpunit).
  • Removed dev/jstests/ controller
  • Removed TestRunner and JSTestRunner
  • Removed PhpUnitWrapper, PhpUnitWrapper_3_4, PhpUnitWrapper_3_5, PhpUnitWrapper_Generic, SapphireTestSuite APIs
  • Removed SapphireTestReporter and CliTestReporter
  • Removed SapphireTest::skipTest(), use markTestSkipped() in a setUp() method instead
  • debugmethods querystring argument has been removed from debugging.
  • Moved ErrorPage into a new module: silverstripe/errorpage. See upgrading notes in that module.
  • Removed VirtualPage_Controller. Virtual pages will now share whichever controller the “target” page uses
  • Removed Config_LRU
  • Removed SilverStripeInjectionCreator
  • Removed i18n::get_translatable_modules method.
  • Removed i18nTextCollector_Writer_Php
  • i18nTextCollector no longer collects from themes/<theme> root dir. Modules which provide themes via <moduleName>/themes/<theme> are now preferred.
  • Removed i18nSSLegacyAdapter
  • Removed FunctionalTest::stat()
  • Removed LeftAndMainMarkingFilter
  • Removed Controller::getFormOwner()
  • Removed TeamCityListener
  • Removed the Spyc YAML library. Please load it yourself, or use the included Symfony YAML component.
  • Removed RestfulService. Use Guzzle instead (details)
  • Removed Oembed in favour of a oscarotero/Embed
  • Removed TextParser and BBCodeParser. These are available in an archived module, silverstripe-archive/bbcodeparser
  • Removed ViewableData::ThemeDir. Use ThemeResourceLoader::findThemedResource in conjunction with SSViewer::get_themes instead.
  • Removed Config::FIRST_SET and Config::INHERITED
  • Removed RequestHandler.require_allowed_actions. This is now fixed to on and cannot be disabled.
  • Removed ClassManifest::getModules(). Use ModuleLoader instead
  • Removed ClassManifest::getConfigDirs(). Use ModuleLoader instead
  • Removed ClassManifest::getConfigs(). Use ModuleLoader instead
  • Removed Session::set_config() and Session::get_config(). Use the Session.timeout config setting instead
  • Removed Security::set_login_recording() and Security::get_login_recording(). Use the Security.login_recording config setting instead.
  • Removed ModelAsController::find_old_page(). Use OldPageRedirector::find_old_page() instead
  • Removed RootURLController:set_default_homepage_link() and RootURLController::get_default_homepage_link(). Use the RootURLController.default_homepage_link config setting instead.
  • Removed CreditCardField, CountryDropdownField, PhoneNumberField, MemberDatetimeOptionsetField, InlineFormAction. Use custom code instead
  • Removed ResetFormAction, use FormAction::create()->setAttribute('type', 'reset') instead
  • Injector now complies with PSR-11. Accordingly, hasService() has been renamed to has(), and get() will throw SilverStripe\Core\Injector\InjectorNotFoundException when the service can't be found.
  • Removed CustomMethods::createMethod(). Use closures instead.
  • Removed Extension::$ownerBaseClass property. You should use $this->owner->baseClass() instead. The second argument of Extension::setOwner() has also been removed.
  • Deprecated ClassInfo::baseDataClass(). Use DataObject::getSchema()->baseDataClass() instead.
  • Deprecated ClassInfo::table_for_object_field(). Use DataObject::getSchema()->tableForField() instead
  • Deprecated Config::inst()->update(). Use Config::modify()->set() or Config::modify()->merge() instead.


  • Deprecated SQLQuery in favour SQLSelect (details)
  • Added DataObject.many_many 'through' relationships now support join dataobjects in place of automatically generated join tables. See the [/developer_guides/relations](datamodel relationship docs) for more info.
  • Added DataList::filter() by null now internally generates "IS NULL" or "IS NOT NULL" conditions appropriately on queries.
  • Changed DataObject constructor to require an additional parameter, which must be included in subclasses.
  • DataObject::db now returns composite fields.
  • DataObject::ClassName field has been refactored into a DBClassName type field (instead of a string).
  • DataObject::can() has new method signature with $context parameter.
  • DataObject::duplicate() now requires explicit flag to duplicate belongs_many_many (off by default), but now works with unsaved relations. By default only many_many are duplicated.
  • HTMLText no longer enables shortcodes by default. Two injector aliases have been created for this class which can be used to select the correct behaviour. Use HTMLText for shortcodes enabled, and HTMLFragment without shortcodes enabled (the new default).
  • Renamed String::NoHTML() to Plain()
  • Removed String::LimitWordCountXML(). Use LimitWordCount() instead.
  • Removed String::BigSummary(). Use Summary() instead.
  • Changed HTMLText limit methods to operate on plain text rather than attempt to manipulate the underlying HTML.
  • FormField::Title() and FormField::RightTitle() are now cast as plain text by default (but can be overridden).
  • Renamed FormField#createTag() to FormField::create_tag()
  • Hierarchy class has had much of it's functionality refactored out into MarkedSet:

    • isMarked()
    • isTreeOpened()
    • isExpanded()
    • markByID()
    • markPartialTree()
    • markExpanded()
    • markUnexpanded()
    • markToExpose()
    • markClosed()
    • markOpened()
    • markedNodeIDs()
    • getChildrenAsUL() replaced with renderChildren(), which now takes a template name.
    • markingFilterMatches() (and made protected)
    • markChildren() (and made protected)
  • Search filter classes (e.g. ExactMatchFilter) are now registered with Injector via a new DataListFilter. prefix convention. see search filter documentation for more information.
  • Permission::flush_permission_cache() renamed to reset() and added to Resettable interface.
  • Changed Versioned constructor now only allows a single string to declare whether staging is enabled or not. The number of names of stages are no longer able to be specified. See below for upgrading notes for models with custom stages.
  • Renamed Versioned::reading_stage() to set_stage() (throws an error if setting an invalid stage)
  • Renamed Versioned::current_stage() to get_stage()
  • Removed Versioned::getVersionedStages()
  • Removed Versioned::get_live_stage(). Use the Versioned::LIVE constant instead.
  • Removed Versioned::getDefaultStage(). Use the Versioned::DRAFT constant instead.
  • Changed Versioned::$versionableExtensions from private static to protected static
  • Added Versioned::hasStages() to check if an object has a given stage.
  • Added Versioned::stageTable() to get the table for a given class and stage.
  • Any extension declared via versionableExtensions config on Versioned dataobject must now VersionableExtension interface at a minimum. Translatable has been removed from default versionableExtensions
  • The default CMS delete behaviour for versioned dataobjects is now to delete from both draft and live stages, and to save to the archive. There is no longer a separate "Archive" action.
  • Any writes to versioned dataobjects (in either Draft or Live) will always write to the draft (main) table as a source of truth. This means that records created in Live mode will always be available to the CMS and in draft mode.
  • _versions suffixed tables are now renamed to _Versions. This fix will be automatically applied during dev/build.
  • A lot of standard versioned API has been refactored from SiteTree into Versioned extension.
  • All versioned DataObjects have canPublish(), canArchive(), canUnpublish() permission checks
  • All versioned Dataobjects have doPublish(), doArchive(), doPublish(), and doUnpublish() actions. However, do*() methods will no longer automatically check can*() permissions, and must be done by usercode before invocation.
  • Moved SiteTree::getIsAddedToStage() to Versioned::isOnDraftOnly()
  • Moved SiteTree::getIsModifiedOnStage() to Versioned::isModifiedOnDraft()
  • Moved SiteTree::isPublished() to Versioned.
  • Renamed SiteTree::getExistsOnLive() to isPublished()
  • Added Versioned::isOnDraft()
  • Added Versioned::isArchived()
  • Added Versioned::isOnLiveOnly()
  • Added ChangeSet and ChangeSetItem for batch publishing of versioned dataobjects.
  • Added DataObject.table_name config to customise the database table for any record.
  • Added DataObjectSchema class to assist with mapping between classes and tables.
  • Changed DataObject.indexes to use columns instead of value to define index contents.
  • Changed Money to treat values as empty only if Amount field is null. If an Amount value is provided without a Currency specified, it will be formatted as per the current locale.
  • Removed DatabaseAdmin#clearAllData(). Use DB::get_conn()->clearAllData() instead
  • Moved SapphireTest temp DB methods into a new TempDatabase class. This allows applications to create temp databases when not running tests.
  • Moved SapphireTest::using_temp_db() to TempDatabase->isUsed()
  • Moved SapphireTest::kill_temp_db() to TempDatabase->kill()
  • Moved SapphireTest::empty_temp_db() to TempDatabase->clearAllData()
  • Moved SapphireTest::create_temp_db() to TempDatabase->build()
  • Moved SapphireTest::delete_all_temp_dbs() to TempDatabase->deleteAll()
  • Moved SapphireTest::resetDBSchema() to TempDatabase->resetSchema()
  • DBDate, DBTime and DBDatetime have changed methods:

    • Added getTimestamp() to get the respective date / time as unix timestamp (seconds since 1970-01-01)
    • Changed Format() method to use CLDR format strings, rather than PHP format string. e.g. d/m/Y H:i:s (PHP format) should be replaced with to dd/MM/y HH:mm:ss (CLDR format).
    • Added getISOFormat() to return the standard date/time ISO 8601 pattern in CLDR format.
    • Changed setValue() method to expect dates and times to be passed in ISO 8601 format (y-MM-dd) or (HH:mm:ss). Certain date formats will attempt to parse with the below restrictions:

      • /, . or - are supported date separators, but will be replaced with - internally.
      • US date formats (m-d-y / y-d-m) will not be supported and may be parsed incorrectly. (Note: Date form fields will still support localised date formats).
      • dd-MM-y will be converted to y-MM-dd internally.
      • 2-digit values for year will now raise errors.
    • Changed FormatFromSettings() to default to Nice() format if no member is logged in.
    • Changed Nice(), Long() and Full() methods to follow standard formatting rules for the current locale, rather than pre-defined formats.
    • Added Short() to format concise date/time values, as a shorter version than Nice
    • Added getFormatter() to return a locale-specific date/time formatter.
    • Added DBTime::FormatFromSettings()
  • Deprecated globals $database and $databaseConfig. Use DB::setConfig() instead.
  • Removed DataModel
  • Changed DataObject::can*() methods to no longer accept a member ID. These must now be passed a Member object or left null
  • Moved DataObject::db() to DataObjectSchema::fieldSpec() and DataObjectSchema::fieldSpecs()
  • Moved DataObject::manyManyComponent() to DataObjectSchema (access through DataObject->getSchema())
  • Moved DataObject::belongsToComponent() to DataObjectSchema (access through DataObject->getSchema())
  • Moved DataObject::hasOneComponent() to DataObjectSchema (access through DataObject->getSchema())
  • Moved DataObject::hasManyComponent() to DataObjectSchema (access through DataObject->getSchema())
  • Moved DataObject::getRemoteJoinField() to DataObjectSchema (access through DataObject->getSchema())
  • Moved DataObject::database_fields() to DataObjectSchema::databaseFields()
  • Moved DataObject::has_own_table() to DataObjectSchema::classHasTable()
  • Moved DataObject::composite_fields() to DataObjectSchema::compositeFields()
  • Moved DataObject::manyManyExtraFieldsForComponent() to DataObjectSchema
  • Deprecated DataObject::$destroyed
  • Removed DataObject::validateModelDefinitions. Relations are now validated within DataObjectSchema
  • Removed DataObject methods hasOwnTableDatabaseField, has_own_table_database_field and {#dataobject-has-own} hasDatabaseFields are superseded by DataObjectSchema::fieldSpec. Use $schema->fieldSpec($class, $field, DataObjectSchema::DB_ONLY | DataObjectSchema::UNINHERITED ). Exclude uninherited option to search all tables in the class hierarchy.
  • Renamed DataObject::is_composite_field() to DataObjectSchema::compositeField()
  • Renamed DataObject::custom_database_fields()to DataObjectSchema::databaseFields() or DataObjectSchema::fieldSpecs() instead.
  • Removed DataList::getRelation, as it was mutable. Use DataList::applyRelation instead, which is immutable.
  • Member Field 'RememberLoginToken' removed, replaced with 'RememberLoginHashes' has_many relationship
  • Removed UpgradeSiteTreePermissionSchemaTask
  • Removed EncryptAllPasswordsTask
  • Removed DBString::LimitWordCountXML() method. Use LimitWordCount() for XML safe version.
  • Removed SiteTree::getExistsOnLive(). Use isPublished() instead.
  • Removed SiteTree::getIsDeletedFromStage(). Use isOnDraft() instead (inverse case).
  • Changed DataObject.many_many to remove triangular resolution. Both the many_many and belongs_many_many must point directly to the specific class on the opposing side, not a subclass or parent.
  • Removed DataObject::validateModelDefinitions(). Validation and parsing of config is now handled within DataObjectSchema.
  • CMSBatchAction_Delete removed. Use CMSBatchAction_Archive instead.
  • Removed Date::past_date()
  • Removed Date::prior_monday()
  • Removed Date::weekday()
  • Removed Date::next_day()
  • Removed Date::day_before()
  • Removed Date::days_between()
  • Removed Date::nice_format(). Use locale-specific formatting for Nice()
  • Removed Time::nice_format(). Use locale-specific formatting for Nice()
  • Removed Datetime::nice_format(). Use locale-specific formatting for Nice()
  • Removed Time::TwelveHour()
  • Removed Time::Nice24()
  • Removed Money::NiceWithShortname()
  • Removed Money::NiceWithName()
  • Removed Money::getShortName()
  • Removed Money::getCurrencyName()
  • Removed additional arguments from Money::getSymbol(). The result of this value is now localised based on the currency code assigned to the Money instance
  • Removed Money::getAllowedCurrencies. Apply validation to MoneyField instead.
  • Removed Hierarchy::parentStack() removed. Use getAncestors() instead
  • Removed Hierarchy::doAllChildrenIncludingDeleted(). Use AllChildrenIncludingDeleted() instead
  • Removed Hierarchy::naturalNext()
  • Removed Hierarchy::naturalPrev()
  • Removed Hierarchy::markingFinished()


  • Image manipulations have been moved into a new ImageManipulation trait.
  • Removed CMSFileAddController
  • UploadField::setAllowedFileCategories('image') now excludes non-resizeable images. 'unresizeable_image' is can be used to validate these types.
  • Image_Backend API now loads and saves from AssetContainer instances rather than local files.
  • The following File categories have been renamed: 'zip' to 'archive', 'doc' to 'document', and 'mov' to 'video'
  • File::updateLinks() no longer takes urls as parameters. All file links are now identified either by the DataObject::ID in a data-fileid property, or via shortcodes. This is necessary because file urls are no longer able to identify assets.
  • Extension point HtmlEditorField::processImage has been removed, and moved to Image::regenerateImageHTML()
  • Upload::load() now stores assets directly without saving into a File dataobject.
  • Protected file storage is now a core Framework API. See File Security for more information.
  • File is now versioned, and should be published before they can be used on the frontend. See file migration for upgrade notes.
  • New filesystem abstraction including new DBFile database field to hold file references.
  • ShortcodeHandler interface to help generate standard handlers for HTML shortcodes in the editor.
  • File::handle_shortcode() and Image::handle_shortcode() have moved to their own classes in SilverStripe\Assets\Shortcodes, and are named FileShortcodeProvider and ImageShortcodeProvider respectively.
  • AssetNameGenerator interface, including a DefaultAssetNameGenerator implementation, which is used to generate renaming suggestions based on an original given filename in order to resolve file duplication issues.
  • GeneratedAssetHandler API now used to store and manage generated files (such as those used for error page cache or combined files).
  • Requirements_Minifier API can be used to declare any new mechanism for minifying combined required files. By default this API is provided by the JSMinifier class, but user code can substitute their own.
  • AssetControlExtension is applied by default to all DataObjects, in order to support the management of linked assets and file protection.
  • ProtectedFileController class is used to serve up protected assets.
  • AssetAdaptor has a new config default_server which helps tell the code which server type to use if no matching type was found by scanning the server software - defaults to apache

The following image manipulations have been removed:

  • Renamed Image::SetRatioSize() to Fit()
  • Renamed Image::SetWidth() to ScaleWidth()
  • Renamed Image::SetHeight() to ScaleHeight()
  • Renamed Image::SetSize() to Pad()
  • Renamed Image::PaddedImage() to Pad()
  • Renamed Image::CroppedImage() to Fill()
  • Renamed Image::AssetLibraryPreview() to PreviewThumbnail()
  • Renamed Image::AssetLibraryThumbnail() to CMSThumbnail()

The following File methods have been removed. Since there is no longer any assumed local path for any file, methods which dealt with such paths may no longer be relied on.

  • Removed File::deletedatabaseOnly()
  • Renamed File::link_shortcode_handler() to handle_shortcode()
  • Removed File::setParentID()
  • Removed File::getFullPath()
  • Removed File::getRelativePath()
  • Removed File::Content database field (wasn't used by core)

Image manipulations have been moved out of Image and now available to any File or DBFile which has the appropriate mime types. The following file manipulations classes and methods have been removed:

  • Removed Image_Cached
  • Removed Image::regenerateFormattedImages()
  • Removed Image::getGeneratedImages()
  • Removed Image::deleteFormattedImages()
  • Removed Image::handle_shortcode() moved to SilverStripe\Assets\Shortcodes\ImageShortcodeProvider::handle_shortcode()
  • Removed AssetAdmin::deleteunusedthumbnails()
  • Removed AssetAdmin::getUnusedThumbnails()
  • Removed Folder_UnusedAssetsField
  • Removed Folder::syncChildren()
  • Removed Folder::constructChild()
  • Removed Folder::addUploadToFolder()
  • Removed RegenerateCachedImagesTask
  • Removed CleanImageManipulationCache
  • Removed Filesystem::sync()
  • Removed AssetAdmin::doSync()

Templates and form

  • Upgrade to TinyMCE 4.x
  • Templates now use a standard template lookup system via SSViewer::get_templates_by_class() which builds a candidate list for a given class. Actual resolution of existing templates for any list of candidates is actually performed by SSViewer::chooseTemplate
  • HtmlEditorConfig is now an abstract class, with a default implementation TinyMCEConfig for the built in TinyMCE editor.
  • HtmlEditorField::setEditorConfig() may now take an instance of a HtmlEditorConfig class, as well as a standard config identifier name.
  • HeaderField requires a $name constructor argument (new HeaderField('MyName', 'My Title')
  • FormField templates no longer look in the 'forms' folder for templates. As all form fields are now namespaced, the path for these templates will now match the namespace of the given class instead.
  • $module parameter in themedCSS() and themedJavascript() removed.
  • Ability to select a theme through admin/settings has been removed from SiteConfig. Please use SSViewer.themes config instead.
  • FormAction::setValidationExempt()) can be used to turn on or off form validation for individual actions
  • GridField edit form now has improved support for versioned DataObjects, with basic publishing actions available when editing records.
  • PopoverField added to provide popup-menu behaviour in react forms (currently not available for non-react forms).
  • Introduction of experimental FormFactory API as a substitute for DataObject classes being responsible for building their own form fields. This builds a form based on a given controller and model, and can be customised on a case by case basis. This has been introduced initially for the asset-admin module.
  • Introduced AssetAdmin\Forms\UploadField as a React-friendly version of UploadField. This may also be used in normal entwine forms for managing files in a similar way to UploadField. However, this does not support inline editing of files.
  • Added method FormField::setSubmittedValue($value, $data) to process input submitted from form submission, in contrast to FormField::setValue($value, $data) which is intended to load its value from the ORM. The second argument to setValue() has been added.
  • FormField::create_tag() moved to SilverStripe\View\HTML->createTag().
  • CompositeField::setID() is removed. ID is generated from name indirectly. Use SilverStripe\Form\FormField::setName() instead
  • Changed ListboxField to multiple only. Previously, this field would operate as either a single select (default) or multi-select through setMultiple(). Now this field should only be used for multi-selection. Single-selection should be done using a regular DropdownField.
  • GroupedDropdownField::setDisabled() now only accepts a list of values instead of a list of grouped values. The method now expects a non-associative array of values (not titles) or an SS_List.

The following methods and properties on Requirements_Backend have been renamed: {#requirements}

  • Renamed $combine_files to $combinedFiles
  • Renamed $combine_js_with_min to $minifyCombinedFiles
  • Renamed $write_header_comments to $writeHeaderComment
  • Renamed $write_js_to_body to $writeJavascriptToBody
  • Renamed $force_js_to_bottom to $forceJSToBottom
  • Renamed get_combined_files_enabled() to getCombinedFilesEnabled()
  • Renamed set_combined_files_enabled() to setCombinedFilesEnabled()
  • Renamed get_suffix_requirements() to getSuffixRequirements()
  • Renamed set_suffix_requirements() to setSuffixRequirements()
  • Renamed get_custom_scripts() to getCustomScripts()
  • Renamed unblock_all() to unblockAll()
  • Renamed include_in_response() to includeInResponse()
  • Renamed combine_files() to combineFiles()
  • Renamed get_combine_files() to getCombinedFiles()
  • Renamed clear_combined_files() to clearCombinedFiles()
  • Renamed process_combined_files() to processCombinedFiles()
  • Renamed set_write_js_to_body() to setWriteJavascriptToBody()
  • Renamed set_force_js_to_bottom() to setForceJSToBottom()
  • Added get_minify_combined_js_files() and set_minify_combined_js_files()
  • Added get_force_js_to_bottom()
  • Added get_write_js_to_body()
  • Changed includeInHTML() to remove the first parameter ($template)

A new config Requirements_Backend.combine_in_dev has been added in order to allow combined files to be forced on during development. If this is off, combined files is only enabled in live environments.

Form validation has been refactored significantly. A new FormMessage trait has been created to {#form-validation} handle FormField and Form messages. This trait has a newsetMessage() API to assign a message, type, and cast. Use getMessage(), getMessageType(), getMessageCast() and getMessageCastingHelper() to retrieve them.

Form behaviour methods have been changed:

  • __construct() now allows a RequestHandler to be passed as a first argument, rather than a controller. In addition this argument is now optional. This allows forms to be constructed as a model only.
  • validate is replaced with validationResult instead, which returns a ValidationResult instance. This is no longer automatically persisted in the state by default, unless a redirection occurs. You can also save any response in the state by manually invoking saveFormState inside a custom validation response handler.
  • Renamed setupFormErrors() to restoreFormState()
  • Renamed resetValidation() to clearFormState()
  • Added loadMessagesFrom() to load a ValidationResult into a form.
  • Changed setMessage() to accept $cast as a third parameter (instead of a $escapeHtml boolean)
  • Removed messageForForm(). Use setMessage() or sessionMessage() instead.
  • Added getSessionValidationResult() / setSessionValidationResult() to get / set session errors
  • Added getSessionData() / setSessionData() to get / set field values cached in the session
  • Removed addErrorMessage(). Use sessionMessage() or sessionError() to add a form level message, throw a ValidationException during submission, or add a custom validator.
  • Form is no longer a RequestHandler, but implements the HasRequestHandler interface and returns a FormRequestHandler instance from getRequestHandler(). the Form constructor no longer has any mandatory parameters, and the first parameter allows a non-Controller RequestHandler to be passed.
  • Moved buttonClicked() to FormRequestHandler
  • Moved checkAccessAction() to FormRequestHandler
  • Moved handleField() to FormRequestHandler
  • Moved httpSubmission() to FormRequestHandler
  • Moved Link() to FormRequestHandler

Validator methods have changed:

  • Changed validate() to return a ValidationResult instance.
  • Removed requireField(). Use RequiredFields subclass instead.

ValidationResult now has these methods:

  • Added serialize() / unserialize() for saving within session state
  • Renamed messageList() to getMessages()
  • Changed error() to addMessage() / addError() / addFieldMessage() / addFieldError()
  • Renamed valid() to isValid()

ValidationException has these changes:

  • Changed constructor to remove second argument ($message). It now only accepts $result, which may be a string, and optional $code

New DatetimeField methods replace getConfig() / setConfig(): {#datetimefield}

  • Added getTimezone() / setTimezone()
  • Added getDateTimeOrder() / setDateTimeOrder()
  • Added getLocale() / setLocale()
  • Removed datavaluefield config as internal data value is now fixed to ISO 8601 format

The DatetimeField has changed behaviour:

  • It uses a combined input instead of a composite from DateField and TimeField Consequently, getDateField() and getTimeField() have been removed.
  • It returns ISO 8601 normalised dates by default in Value(), which include a "T" separator between date and time. This is required to allow HTML5 input. Either use setHTML5(false) to set your custom format, or use dataValue() to retrieve a whitespace separated representation.
  • It no longer accepts setValue() as an array with 'date' and 'time' keys
  • Added getHTML5() / setHTML5()

New DateField methods replace getConfig() / setConfig(): {#datefield}

  • Added getDateFormat() / setDateFormat()
  • Added getMinDate() / setMinDate()
  • Added getMaxDate() / setMaxDate()
  • Added getLocale() / setLocale()

The DateField has changed behavior:

  • DateField no longer provides a jQuery UI date picker (showcalendar option), and uses HTML5 date pickers by default instead.
  • DateField provides an optional polyfill for browsers without HTML5 date picker support
  • The dmyfields option has been replced with native HTML5 behaviour (as one single <input type=date>).
  • getClientLocale / setClientLocale have been removed (handled by DateField->locale and browser settings)

New TimeField methods replace getConfig() / setConfig() {#timefield}

  • Added getTimeFormat() / setTimeFormat()
  • Added getLocale() / setLocale()

Further API changes:

  • Removed TabularStyle
  • Removed NestedForm
  • Removed FieldList->getTabPathRewrites()
  • Removed FieldList->setTabPathRewrites()
  • Removed FieldList->rewriteTabPath()
  • Removed Form->transformTo()
  • Removed Form->callfieldmethod()
  • Removed Form->single_field_required()
  • Removed Form->current_action()
  • Removed Form->set_current_action()
  • Removed Form->testSubmission()
  • Removed Form->testAjaxSubmission()
  • Removed ValidationResult->messageList()
  • Removed ValidationResult->codeList()
  • Removed ValidationResult->message()
  • Removed ValidationResult->starredList()
  • Removed ValidationResult->error()
  • Removed ValidationResult->valid()
  • Removed template
  • Removed FormField::dontEscape(). Escaping is now managed on a class by class basis.
  • Removed PermissionCheckboxSetField::getAssignedPermissionCodes()
  • Removed Requirements::delete_combined_files()
  • Removed NumericField_Readonly. Use setReadonly(true) instead.
  • Removed SSViewer->set_source_file_comments()
  • Removed SSViewer->get_source_file_comments()
  • Removed SSViewer->getOption()
  • Removed SSViewer->setOption()
  • Removed MemberDatetimeOptionsetField (no replacement)
  • Removed DateField_View_JQuery (replaced with native HTML5 support in DateField)
  • Moved HTMLEditorField_Toolbar to SilverStripe\Admin\ModalController
  • Moved HTMLEditorField_Embed toSilverStripe\AssetAdmin\EmbedResource
  • Removed HTMLEditorField_File
  • Removed HTMLEditorField_Flash
  • Removed HTMLEditorField_Image


  • Upgrade of i18n to symfony/translation
  • Localisation based on language-only (without any specific locale) is now supported
  • i18nEntityProvider::provideI18nEntities() Now is expected to return only a single array map of key to default values.
  • i18n keys for '.PLURAL_NAME' and '.SINGULAR_NAME' have been changed back to use the namespaced class names for all DataObject subclasses, rather than just the basename without namespace.
  • i18n key for locale-respective pluralisation rules added as '.PLURALS'. These can be configured within YAML in array format as per ruby i18n pluralization rules.
  • Moved i18n.all_locales config setting to SilverStripe\i18n\Data\Locales.locales
  • Moved i18n.common_languages config setting to SilverStripe\i18n\Data\Locales.languages
  • Moved i18n.likely_subtags config setting to SilverStripe\i18n\Data\Locales.likely_subtags
  • Moved i18n.tinymce_lang config setting to SilverStripe\Forms\HTMLEditor\TinyMCEConfig.tinymce_lang
  • Moved i18n::get_tinymce_lang() to SilverStripe\Forms\HTMLEditor\TinyMCEConfig::get_tinymce_lang()
  • Moved i18n::get_locale_from_lang() to SilverStripe\i18n\Data\Locales::localeFromLang()
  • Moved i18n::get_lange_from_locale() to SilverStripe\i18n\Data\Locales::langFromLocale()
  • Moved i18n::validate_locale() to SilverStripe\i18n\Data\Locales::validate()
  • Moved i18n::get_common_languages() to SilverStripe\i18n\Data\Locales::getLanguages()
  • Moved i18n::get_locale_name() to SilverStripe\i18n\Data\Locales::localeName()
  • Moved i18n::get_language_name() to SilverStripe\i18n\Data\Locales::languageName()
  • Moved i18n.module_priority config setting to SilverStripe\i18n\Data\Sources.module_priority
  • Moved i18n::get_owner_module() to SilverStripe\Core\Manifest\ClassManifest::getOwnerModule() This now returns a Module object instance instead of a string.
  • Moved i18n::get_existing_translations() to SilverStripe\i18n\Data\Sources::getKnownLocales()
  • Removed Zend_Translate
  • Changed i18n::_t() to remove support for sprintf-style %s arguments
  • Changed i18n::_t() to remove support for non-associative injection with named parameters
  • Removed i18n::get_language_name()
  • Removed i18n::get_language_code()
  • Removed i18n::get_common_locales()
  • Removed i18n.common_locales


  • Changed Mailer to an interface
  • Email re-written to be powered by SwiftMailer
  • Default template body variable renamed from $Body to $EmailContent
  • Renamed Email->setTemplate() to Email->setHTMLTemplate()
  • Added Email->setPlainTemplate() for rendering plain versions of email
  • Renamed Email->populateTemplate() to Email->setData()


  • is_running_tests() is no longer public and user code should not rely on this. Test-specific behaviour should be implemented in setUp() and tearDown()
  • Removed setUpOnce(). Please use setUpBeforeClass()
  • Removed tearDownOnce(). Please use tearDownAfterClass()
  • Removed TestListener
  • Renamed $requiredExtensions to $required_extensions (and made static)
  • Renamed $extraDataObjects to $extra_dataobjects (and made static)
  • Renamed $extraControllers to $extra_controllers (and made static)


  • LoginForm now has an abstract method getAuthenticatorName(). If you have made subclasses of this, you will need to define this method and return a short name describing the login method.
  • MemberLoginForm has a new constructor argument for the authenticator class, although this is usually constructed by MemberAuthenticator and won't affect normal use.
  • Authenticator methods register() and unregister() are deprecated in favour of using Config
  • Unused SetPassword property removed from Member. Use Member::changePassword or set Password directly.

Change log


  • 2017-05-09 30986b4ea Lock out users who dont exist in the DB (Daniel Hensby) - See ss-2017-002
  • 2016-05-03 70480f5ee HtmlEditorField_Toolbar#viewfile not whitelisting URLs (Damian Mooyman) - See ss-2015-027

API changes

  • 2017-10-05 b996e2c22 Extensions are now stateless (Damian Mooyman)
  • 2017-09-27 f686b5082 Rename assert dos to assert list (Werner M. Krauß)
  • 2017-09-05 496b9c8c Implement insert-anchor modal (Damian Mooyman)
  • 2017-09-04 a9c479f2 Allow SiteTree::Link to be extended (Damian Mooyman)
  • 2017-08-23 595ba75a5 Make FormField::hasClass return a boolean instead of an int (Robbie Averill)
  • 2017-08-14 c14233f74 Enable config files to be loaded for behat tests (Damian Mooyman)
  • 2017-08-08 2c54e331 Virtual pages now respect cascade_deletes on source page (Damian Mooyman)
  • 2017-08-08 323644c7b Implement cascade_deletes (Damian Mooyman)
  • 2017-07-31 078a508d7 Replace legacy tiny_mce_gzip compressor with asset generator (Damian Mooyman)
  • 2017-07-26 3364f5c5 Use setTitleField to use MenuTitle for selecting internal links (Damian Mooyman)
  • 2017-07-16 f4af1fab Remove Report::add_excluded_report() and make excluded_reports configurable (Robbie Averill)
  • 2017-07-12 2b266276c Implement new module sorting pattern (Aaron Carlino)
  • 2017-07-12 a69600fa Update module sorting (Damian Mooyman)
  • 2017-07-11 ccda816f9 added flatList argument for generating the json tree list with a context string property (Christopher Joe)
  • 2017-07-11 2d04b84 Convert installer to recipe (Damian Mooyman)
  • 2017-06-27 cf511562 Remove REPORTS_DIR and its use. (Sam Minnee)
  • 2017-06-27 ef6db273 Remove CMS_PATH and CMS_DIR (Sam Minnee)
  • 2017-06-27 741166e36 ModulePath template global now takes any composer package name. (Sam Minnee)
  • 2017-06-25 69fe16689 Director::handleRequest() is no longer static - use a Director service (Sam Minnee)
  • 2017-06-25 d20ab50f9 Stronger Injector service unregistration (Damian Mooyman)
  • 2017-06-25 e92c63c54 Remove $sid argument of Session::start() (Sam Minnee)
  • 2017-06-23 10866c080 Replace Director::direct() with Director::handleRequest(). (Sam Minnee)
  • 2017-06-22 b30f410ea Deprecate RequestFilter. (Sam Minnee)
  • 2017-06-22 3873e4ba0 Refactor bootstrap, request handling (Damian Mooyman)
  • 2017-06-15 024371c37 authentication ValidationResult handling to pass by-reference (Damian Mooyman)
  • 2017-06-15 62d095305 Update DefaultAdmin services (Damian Mooyman)
  • 2017-06-12 77ec2b90 Removed ErrorPage (Jonathon Menz)
  • 2017-06-10 413b4936a Add extension hook to FormField::extraClass() (Damian Mooyman)
  • 2017-06-09 0559da7f s for Authenticator refactor (Damian Mooyman)
  • 2017-06-09 03125b8c s for Authenticator refactor (Simon Erkelens)
  • 2017-05-25 f82f0844 Add insert internal link modal (Damian Mooyman)
  • 2017-05-25 e7d87add9 Remove legacy HTMLEditor classes (Damian Mooyman)
  • 2017-05-22 2e94a11 Add pgsql + behat tests to installer (Damian Mooyman)
  • 2017-05-19 ad43a8292 Consistent use of inst() naming across framework (Robbie Averill)
  • 2017-05-19 963d9197d Ensure that all DataQuery joins are aliased based on relationship name (Damian Mooyman)
  • 2017-05-19 100048da3 PSR-11 compliance (fixes #6594) (#6931) (Ingo Schommer)
  • 2017-05-17 fba8e2c24 Remove Object class (Damian Mooyman)
  • 2017-05-12 906a4c444 Add streamable response object (Damian Mooyman)
  • 2017-05-12 23e1aa8c Refactor inherited permissions (#1811) (Damian Mooyman)
  • 2017-05-11 0b70b008b Implement InheritedPermission calculator (#6877) (Damian Mooyman)
  • 2017-05-11 259f957ce Rename services to match FQN of interface / classes (Damian Mooyman)
  • 2017-05-11 49e559b0 Rename services to match FQN of interface / classes (Damian Mooyman)
  • 2017-05-08 484a4ec4 Removed deprecated RootURLController:set_default_homepage_link (Ingo Schommer)
  • 2017-05-08 7c2f49d44 Removed RootURLController:set_default_homepage_link() (Ingo Schommer)
  • 2017-05-08 cec983b62 Removed deprecated ModelAsController::find_old_page() (Ingo Schommer)
  • 2017-05-08 de41e145 Removed deprecated ModelAsController::find_old_page() (Ingo Schommer)
  • 2017-05-08 5784a7d2d Removed deprecated Security::set_login_recording() (Ingo Schommer)
  • 2017-05-08 2a7c76e9e Removed deprecated DatabaseAdmin#clearAllData() (Ingo Schommer)
  • 2017-05-08 81e5c7ac4 Removed deprecated Session::set_config() (Ingo Schommer)
  • 2017-05-08 1d438d3fb Remove deprecated FormAction::createTag() (Ingo Schommer)
  • 2017-05-08 75b7e1906 Remove deprecated SS_HOST (Ingo Schommer)
  • 2017-05-08 0d9b38363 Removed legacy form fields (fixes #6099) (Ingo Schommer)
  • 2017-05-02 963568d7 Refactor inheritable permissions (Damian Mooyman)
  • 2017-04-28 03750acbe Namespace i18n keys (Damian Mooyman)
  • 2017-04-28 b1c59d40 Namespace i18n keys (Damian Mooyman)
  • 2017-04-27 61388b153 Rewrite Date and Time fields to support HTML5 (Damian Mooyman)
  • 2017-04-26 de8abe116 rename (Ingo Schommer)
  • 2017-04-23 7af7e6719 Security.authenticators is now a map, not an array (Sam Minnee)
  • 2017-04-21 df100b87 Upgrade to behat 3 (Damian Mooyman)
  • 2017-04-21 0a55ff9f8 Remove SapphireTestReporter and CliTestReporter (Ingo Schommer)
  • 2017-04-17 64e802f79 Move createTag to HTML class (Damian Mooyman)
  • 2017-04-13 f54ff29 Remove BlockUntrustedIPs (Damian Mooyman)
  • 2017-04-13 2548bfba1 Replace SS_HOST with SS_BASE_URL (Damian Mooyman)
  • 2017-04-11 0791b387b Update serialisation of JSON tree data (Damian Mooyman)
  • 2017-04-10 f2768c85b Enable namespaced-localisation keys in templates (Damian Mooyman)
  • 2017-04-06 d75a3cb0 Update site tree hierarchy to use a MarkingSet and template (Damian Mooyman)
  • 2017-04-03 e61257c27 Update embed/embed to 3.0 (Damian Mooyman)
  • 2017-04-03 9be22701f exists() no longer true for nullifyIfEmpty if empty string (Damian Mooyman)
  • 2017-03-30 4b7994036 Drop IE10 support (fixes #6321) (Ingo Schommer)
  • 2017-03-30 326aa37ea HTML5 date/time fields, remove member prefs (fixes #6626) (Ingo Schommer)
  • 2017-03-29 92a5e4a05 Refactor CMS-specific code out of LeftAndMain (Damian Mooyman)
  • 2017-03-29 136b67f59 Major refactor of Hierarchy into MarkedSet (Damian Mooyman)
  • 2017-03-28 98e77a48 Rename SiteTree::description() to SiteTree::classDescription() to prevent clash (Damian Mooyman)
  • 2017-03-23 874c6ccdd Add experimental getResource() to Module (Damian Mooyman)
  • 2017-03-22 1186f0783 Use mysql-safe table namespace separator (Damian Mooyman)
  • 2017-03-21 5ce98ace Upgrade to rely on silverstripe/versioned module (Damian Mooyman)
  • 2017-03-21 ac3a9c9e6 Split out SilverStripe\ORM\Versioned into new module (Damian Mooyman)
  • 2017-03-19 62f8aa440 Drop PHP 5.5 support, limit PHP 5.6 to 2018 (Damian Mooyman)
  • 2017-03-16 dae6d5902 Split SilverStripe\Assets into separate module (Damian Mooyman)
  • 2017-03-16 3a0099161 Remove Log class (Damian Mooyman)
  • 2017-03-14 4599b2b5 move CMSPreviewable to ORM (Damian Mooyman)
  • 2017-03-14 54ba08a30 Replace ManifestCache with ManifestCacheFactory (Damian Mooyman)
  • 2017-03-12 a07a9bffc Add FormRequestHandler::forTemplate() for backwards compatibility (Damian Mooyman)
  • 2017-03-10 9f953770f Move CMSPreviewable to framework module (Damian Mooyman)
  • 2017-03-09 ce1406091 Apply default logger to all caches (Damian Mooyman)
  • 2017-03-09 8f0f9fa11 Apply logging to config cache (Damian Mooyman)
  • 2017-03-02 0c41a97a8 Refactor Form request handling into FormRequestHandler (Damian Mooyman)
  • 2017-03-01 466c50b30 Switch from npm4 and shrinkwrap to npm6 and yarn (Christopher Joe)
  • 2017-02-28 50deb1776 remove UploadField, AssetField and associated files (Christopher Joe)
  • 2017-02-27 e74556b32 Protect Director::get_environment_type() from invoking (Damian Mooyman)
  • 2017-02-26 b3fc11e59 Move ssmedia plugin to asset-admin (Damian Mooyman)
  • 2017-02-26 c452d5f6c Rename CoreConfigCreator to CoreConfigFactory (Damian Mooyman)
  • 2017-02-24 1d49c4afe Remove non-asset-admin TinyMCE media dialog (Damian Mooyman)
  • 2017-02-23 d220ca3f6 Use symfony/cache (fixes #6252) (Ingo Schommer)
  • 2017-02-23 358bb8ba Remove insert-media tests (now covered by asset-admin, not cms) (Damian Mooyman)
  • 2017-02-22 8444a21cb Upgrade tests to use new Config API (Damian Mooyman)
  • 2017-02-22 3362e15a2 Upgrade code to use updated config (Damian Mooyman)
  • 2017-02-22 395878885 Remove Director.environment_type config and replace with static methods (Damian Mooyman)
  • 2017-02-22 a6e9a7111 Substitute core config system with new silverstripe/config module (Damian Mooyman)
  • 2017-02-22 72ddac2a5 Implement ModuleLoader for module registration by composer name (Damian Mooyman)
  • 2017-02-22 6bae8047 Use symfony/cache (Ingo Schommer)
  • 2017-02-19 2513a0f4c Added drag and drop libraries (Christopher Joe)
  • 2017-02-16 4885736b Upgrade CMS to use new Config API (Damian Mooyman)
  • 2017-02-14 014f0d23e Create SeparatedDateField (Damian Mooyman)
  • 2017-01-30 9d35ff8f9 Remove ViewableData::ThemeDir, update changelog to reflect suggested replacement (Robbie Averill)
  • 2017-01-26 029a8b958 Substitute Zend_Currency with NumberFormatter based solution (Damian Mooyman)
  • 2017-01-20 942c0257b Upgrade to behat 3 (Damian Mooyman)
  • 2017-01-18 8a07c56bd Replace i18n message localisation with symfony/translation (Damian Mooyman)
  • 2017-01-17 3033953cc Scaffolded redux form fields have the parent form name assigned as a property (Damian Mooyman)
  • 2017-01-13 7d67c5b9b Allow users to act-as another (Damian Mooyman)
  • 2017-01-13 ce38f1f1f Allow "removeComponentsByType" to remove multiple component"s" (Robbie Averill)
  • 2017-01-12 2c274c838 Shift Security page class config to separate option (Damian Mooyman)
  • 2017-01-10 9e563ebd3 Moved iShouldSeeAButton to behat-extension (Damian Mooyman)
  • 2017-01-05 fb06cc0 Page_Controller to PageController (PSR-2 compliance) (Robbie Averill)
  • 2016-12-29 0927e547 Allow controller discovery without underscore (PSR-2 compliance) (Robbie Averill)
  • 2016-12-20 9be5142fc Set::publish() / canPublish() no longer treats hasChanges() = false as a permission error (Damian Mooyman)
  • 2016-12-14 bb71a37cc added enlarge icon (Christopher Joe)
  • 2016-12-12 88b4ae65c Add css class to assist with bootstrapping entwine sections (Damian Mooyman)
  • 2016-12-12 178bd480e s required for asset search behaviour (Paul Clarke)
  • 2016-12-09 63ac2efa Update validation handling (#43) (Damian Mooyman)
  • 2016-12-09 bf58c5ae Update to use new form submission handling (#1691) (Damian Mooyman)
  • 2016-12-06 6b06fd9f2 Add buttonTooltop to PopoverField and fix critical positioning issue (Damian Mooyman)
  • 2016-11-28 97d0fc61d Include psr-2 checks in CI (Damian Mooyman)
  • 2016-11-28 f16d7e183 Deprecate unused / undesirable create_new_password implementation (Damian Mooyman)
  • 2016-11-23 799ebe5ba Expose QueryString library and lib/Format as external for formatting items (Christopher Joe)
  • 2016-11-23 6e589aac7 Updates to Form, ValidationResponse, ValidationException (Damian Mooyman)
  • 2016-11-22 875811fdf Create loading state for schema (Christopher Joe)
  • 2016-11-15 38070ab2 Update tests to reflect renamed services (Damian Mooyman)
  • 2016-11-13 cac326eeb Add getExtraDataObjects() and getExtraControllers() methods to SapphireTest (Damian Mooyman)
  • 2016-11-04 7cba50e3a Refactor UploadField, FileField and AssetField into traits Uploadable and FileUploadable (Damian Mooyman)
  • 2016-11-03 8e4ed776d Expose FieldHolder react component (Damian Mooyman)
  • 2016-10-28 1142757c2 Add 'validation' to form schema (Damian Mooyman)
  • 2016-10-28 1734e0d2a Shorten overly-verbose invalid extension error (#6231) (Damian Mooyman)
  • 2016-10-25 555104083 Update listview / treeview to use pjax instead of deferred loading (Damian Mooyman)
  • 2016-10-25 13d40f96 Rename _versions table to_Versions (#1655) (Damian Mooyman)
  • 2016-10-25 d54ae8bb Consolidate "Delete from draft" and "Archive" actions into a consistent behaviour (#1653) (Damian Mooyman)
  • 2016-10-21 8c87ea6b Update listview / treeview to use pjax instead of deferred loading (Damian Mooyman)
  • 2016-10-20 ea6851fd7 Rename _versions table to_Versions (Damian Mooyman)
  • 2016-10-19 840f27523 Created a generic FormFactory interface (#6178) (Damian Mooyman)
  • 2016-10-18 316ac8603 Writes to versioned dataobjects always writes to stage even when written on live (Damian Mooyman)
  • 2016-10-14 6e8304ff2 Namespace framework tests (Damian Mooyman)
  • 2016-10-13 055795d4d Support fixture paths relative to current directory (Damian Mooyman)
  • 2016-10-11 f60fe7d4a Versioned::publishRecursive() now uses a ChangeSet (Damian Mooyman)
  • 2016-10-11 f5f6fdce1 Duplication of many_many relationships now defaults to many_many only (Damian Mooyman)
  • 2016-10-06 cb24d199b Convert fieldSpec options to bitwise operators (#6161) (Damian Mooyman)
  • 2016-10-06 d1dbe912 Update for DataObjectSchema changes (Damian Mooyman)
  • 2016-10-06 11bbed4f7 Move many methods from DataObject to DataObjectSchema (Damian Mooyman)
  • 2016-10-05 380d6523c Cleaned up versioned status checks (Damian Mooyman)
  • 2016-10-05 1ce243cc Cleaned up versioned status checks (Damian Mooyman)
  • 2016-10-03 f0dd9af69 Support named join alias for many_many through list (Damian Mooyman)
  • 2016-09-30 27d35403e Force formschema to be reloaded on form submission (Damian Mooyman)
  • 2016-09-30 92e34b743 controller::join_links supports array values (Damian Mooyman)
  • 2016-09-28 2f4867fef added watch command to package.json (Christopher Joe)
  • 2016-09-26 e7303170c Implement many_many through (Damian Mooyman)
  • 2016-09-21 760caaab use new bootstrap button row template (Damian Mooyman)
  • 2016-09-21 5a59c4f4b Add bootstrap button row template (Damian Mooyman)
  • 2016-09-20 4f19113c Use new DBField::getSchemaValue() (Damian Mooyman)
  • 2016-09-19 ea50e3007 Move PreviewLink logic into File dataobject (Christopher Joe)
  • 2016-09-15 8f23fa99a Moved CMS-specific JavaScript to admin/thirdparty (Ingo Schommer)
  • 2016-09-15 7d67b24c2 Removed legacy Jasmine JS Unit tests (Ingo Schommer)
  • 2016-09-14 e8375111b Enable default value to be specified for dbstring types at the db level (Damian Mooyman)
  • 2016-09-13 aecf5260f Remove TextParser and BBCodeParser (Sam Minnee)
  • 2016-09-13 2316b0da9 Remove i18n::js_i18n option (Ingo Schommer)
  • 2016-09-13 ee10dbb68 Moved frontend assets into admin/ "module" (Ingo Schommer)
  • 2016-09-13 327a8a32 Move preview template to cms section (Damian Mooyman)
  • 2016-09-13 9b1c24cf4 Move preview panel to CMS module (Damian Mooyman)
  • 2016-09-13 190ed628b PreviewThumbnail now uses ScaleMaxWidth (Christopher Joe)
  • 2016-09-12 ab7e5944d Derive BASE_PATH from composer autoloader (Sam Minnee)
  • 2016-09-07 9cb9a05ec Removed duplicated thirdparty deps (Ingo Schommer)
  • 2016-09-07 0a380a94c Removed unused UMD builds of individual JS files (Ingo Schommer)
  • 2016-09-05 efb004b72 use injector for DataObject::newClassInstance() (Damian Mooyman)
  • 2016-09-05 fc353dc17 Allow has_many fixtures to be declared with array format as well as many_many (#5944) (Damian Mooyman)
  • 2016-09-01 5f7b13ee4 Removed unused images across CMS UI (Ingo Schommer)
  • 2016-08-31 b599095a Remove AssetAdmin (moved to asset-admin module) (Ingo Schommer)
  • 2016-08-31 5ddd8c331 Adapt File/Folder getCMSFields() to new AssetAdmin (Ingo Schommer)
  • 2016-08-29 710509949 behaviour of filter API to support injected search filter classes (Damian Mooyman)
  • 2016-08-23 8e89d08e7 Remove js/css requirements include from form fields. (Sam Minnee)
  • 2016-08-23 c9b6e9bac Update template lookup to late resolution for performance reasons (Damian Mooyman)
  • 2016-08-21 2e577ddb1 Use Webpack (Sam Minnee)
  • 2016-08-18 8dd644d25 Namespace all classes (Damian Mooyman)
  • 2016-08-12 a96ab15a issue with namespaced reports (Damian Mooyman)
  • 2016-08-11 90aff08d remove obsolete template (Damian Mooyman)
  • 2016-08-10 afdae4937 Add CMSMenu::remove_menu_class to remove items by class instead of code (Damian Mooyman)
  • 2016-08-09 cb1f4335a remove DataFormatter class and all subclasses (Damian Mooyman)
  • 2016-08-09 cf6f882e2 Ensure that i18n plural / singular names use shortname prior to namespaced translations (Damian Mooyman)
  • 2016-08-04 19b81155 Move NestedController from cms to framework (Damian Mooyman)
  • 2016-08-04 1c3ec1935 Move NestedController from cms to framework (Damian Mooyman)
  • 2016-08-04 6005a1c2b Upgrade for silverstripe CMS namespace changes (Damian Mooyman)
  • 2016-08-04 59539578 Update for SilverStripe\CMS namespace (Damian Mooyman)
  • 2016-08-02 4ca3d1dc9 Allow custom 'type' option for scripts (Damian Mooyman)
  • 2016-07-28 9188628ae Add $action parameter to Controller::Link (Damian Mooyman)
  • 2016-07-26 c556b0107 Update core templates for CompositeField / (Damian Mooyman)
  • 2016-07-25 5e8e8c87 Remove theme selector (#31) (Damian Mooyman)
  • 2016-07-25 93f4dd1 Support nested themes API (#129) (Damian Mooyman)
  • 2016-07-25 ff07a2e2 Convert CMS forms to bootstrap (Damian Mooyman)
  • 2016-07-25 a809e80d0 Convert CMS forms to bootstrap (Damian Mooyman)
  • 2016-07-24 c7387ff45 Upgrade to SilverStripe\CMS namespace (Damian Mooyman)
  • 2016-07-24 4d007cd1 remove obsolete CMSMain::buildbrokenlinks() (Damian Mooyman)
  • 2016-07-24 70179c8b Better behaviour for virtualised controller (Damian Mooyman)
  • 2016-07-24 886d65ad Remove obsolete Folder_UsusedAssetsField (Damian Mooyman)
  • 2016-07-24 b135c256 remove obsolete UpgradeSiteTreePermissionSchemaTask (Damian Mooyman)
  • 2016-07-19 20daf1f8e Abstract ThemeManifest into ThemeList (Damian Mooyman)
  • 2016-07-19 4b4aa4e91 Exclude templates in 'themes' directories from $default theme (#5820) (Damian Mooyman)
  • 2016-07-14 6e68f38ef Update react sections to use react-router instead of page.js (#5796) (Damian Mooyman)
  • 2016-07-13 b8b4e98ac Theme stacking (Hamish Friedlander)
  • 2016-07-12 26d46517a Remove custom DBHTMLText::exists() custom behaviour (Damian Mooyman)
  • 2016-07-07 859acf571 mute frontend debugging by default (#5777) (Damian Mooyman)
  • 2016-07-07 628455f7 Apply SilverStripe\Security namespace (#28) (Damian Mooyman)
  • 2016-07-07 39b6d129 Apply SilverStripe\Security namespace (#35) (Damian Mooyman)
  • 2016-07-06 5cb4ab4a8 Add PopoverField for extra-actions popup in react (Damian Mooyman)
  • 2016-07-06 9e1b12a89 Support composite react formfields (Damian Mooyman)
  • 2016-06-22 25e4cad1 Apply SilverStripe\Security namespace (Damian Mooyman)
  • 2016-06-22 af22a8316 Apply Framework\Security namespace (Damian Mooyman)
  • 2016-06-22 80e5b9149 Move dependency on model class from form schema API (Damian Mooyman)
  • 2016-06-17 b7ac5c564 / BUG Fix DBField summary methods (Damian Mooyman)
  • 2016-06-16 ab819611 Apply SilverStripe\ORM namespace (Damian Mooyman)
  • 2016-06-16 fbc90e10 Update for new SilverStripe\ORM namespace (Damian Mooyman)
  • 2016-06-16 e378332f Update for new SilverStripe\ORM namespace (Damian Mooyman)
  • 2016-06-16 83308689d Initialise React controllers via routes (#5436) (David Craig)
  • 2016-06-15 80d4af6b6 Apply Framework\ORM Namespace to model (Hamish Friedlander)
  • 2016-06-13 c50bc917 Cleanup inconsistent SiteTree::duplicate API (Damian Mooyman)
  • 2016-06-03 5c9044a00 Enforce default_cast for all field usages (Damian Mooyman)
  • 2016-05-25 5e8ae41d4 Refactor dataobject schema management into separate service (Damian Mooyman)
  • 2016-05-23 04e617d6 Allow extensions to influence canCreate, canEdit, canView, canDelete, and canAddChildren even for admins. (Damian Mooyman)
  • 2016-05-10 7f03b88e5 Add empty campaign layout (Damian Mooyman)
  • 2016-05-09 8b94dd83d Add CSRF to Campaign delete (Damian Mooyman)
  • 2016-05-09 3edbfd944 Implement breadcrumbs via controllable state (Damian Mooyman)
  • 2016-05-04 65eb0bde6 Look for templates of namespaced classes in subfolders. (Sam Minnee)
  • 2016-05-03 8ce3d90e1 Injector dependencies no longer inherit from parent classes automatically (Damian Mooyman)
  • 2016-05-03 8d2cc91 Include asset-admin module in installer (Damian Mooyman)
  • 2016-05-02 8b1146be9 Implement campaign item edit button (Damian Mooyman)
  • 2016-05-02 6948267c4 LeftAndMain::menu_title can be overridden (#5423) (Damian Mooyman)
  • 2016-05-02 0d4c71f39 Filtering on invalid relation is no longer a silent error (Damian Mooyman)
  • 2016-05-01 46f69b0c set menu title without editing transifex masters (Damian Mooyman)
  • 2016-04-27 72fcfbf4b Campaign preview for images (Damian Mooyman)
  • 2016-04-27 1aa54924 Cleanup SilverStripeNavigator and CMSPreview (Damian Mooyman)
  • 2016-04-27 4be5e7c96 Implement basic preview behaviour (Damian Mooyman)
  • 2016-04-25 daf538583 in behaviour to flysystem reporting for root folders (Damian Mooyman)
  • 2016-04-22 241cdfed1 Allow actions to declare they are exempt from validation themselves (Hamish Friedlander)
  • 2016-04-20 e463fcce6 redux-logger respects ss environment (Damian Mooyman)
  • 2016-04-19 19de22f42 Moved frontend assets into admin/client/ (Ingo Schommer)
  • 2016-04-19 e2afcd0ac Implement back end for saving forms via react (Damian Mooyman)
  • 2016-04-18 dbd17bd49 Remove routing from silverstripe-component (Damian Mooyman)
  • 2016-04-18 2e9003577 Campaign publish button (Damian Mooyman)
  • 2016-04-12 31247a67b Replace baked-in and modified Chosen 0.9.8 with npm'ed in Chosen 1.5.1 (Hamish Friedlander)
  • 2016-04-11 590089375 Implement campaign list view (Damian Mooyman)
  • 2016-04-11 2d16d69dd Use base data class for ChangeSetItem#ObjectClass, not just ClassName (Hamish Friedlander)
  • 2016-04-07 05973cee5 Add i18n pluralisation (Damian Mooyman)
  • 2016-04-05 db6251a9 Update to use new travis-artifacts (Damian Mooyman)
  • 2016-04-01 3c2b53157 Update Versioned methods (Damian Mooyman)
  • 2016-04-01 716baa6b Support renamed Versioned API (Damian Mooyman)
  • 2016-03-30 87ee4365e Implement ChangeSets for batch publishing (Damian Mooyman)
  • 2016-03-30 64b7a84bb SapphireTest::logInWithPermission now supports multiple permissions (Damian Mooyman)
  • 2016-03-30 29c5eff43 Add $context method to DataObject::can for consistency with canCreate() (Damian Mooyman)
  • 2016-03-30 501b2f180 CMSMenu::get_cms_classes() is now sorted (Damian Mooyman)
  • 2016-03-28 d22ad706 Support new DataObject::can() signature (Damian Mooyman)
  • 2016-03-27 b2e4e9622 Remove deprecated caching behaviour from ViewableData (closes #4063) (Loz Calver)
  • 2016-03-23 8abede133 Add SS_Database::withTransaction for nice enclosed transactions (Damian Mooyman)
  • 2016-03-22 094745ec0 Formally support custom ownership relations (Damian Mooyman)
  • 2016-03-21 2d56ea278 Move ss buttons plugin out of thirdparty (Damian Mooyman)
  • 2016-03-17 4cc7b080 Update to use new Versioned API (Damian Mooyman)
  • 2016-03-09 067d44ac Update link tracking for image shortcodes (Damian Mooyman)
  • 2016-03-08 8ae794ee9 TinyMCE Image shortcodes (Ingo Schommer)
  • 2016-03-07 14d74f7a Refactor for removal of CMSForm class (Damian Mooyman)
  • 2016-03-02 0848aca46 Massive refactor of Versioned (Damian Mooyman)
  • 2016-02-26 8366d22 Replace old assets/.htaccess with better default (Damian Mooyman)
  • 2016-02-25 b196d33bf Ownership API (Damian Mooyman)
  • 2016-02-25 c275c2105 Extensible::invokeWithExtension has same method signature as Extensible::extend (Damian Mooyman)
  • 2016-02-21 de6db9f5 Mark image tracking as owned (Damian Mooyman)
  • 2016-02-16 99394a84 Remove references to class aliases; Use correct classname (Damian Mooyman)
  • 2016-02-12 f20ad434c Update TinyMCE to 4.x (Damian Mooyman)
  • 2016-01-27 829135a85 remove Object::useCustomClass (Damian Mooyman)
  • 2016-01-26 1c907dd2 Support versioned File management (Damian Mooyman)
  • 2016-01-26 510c55673 File has Versioned extension (Damian Mooyman)
  • 2016-01-25 9662d938f remove obsolete class loaders from test listeners (Damian Mooyman)
  • 2016-01-25 17ee318d VirtualPage permissions now can be set independently of the mirrored page (Damian Mooyman)
  • 2016-01-21 e77389d0c Standardise SS_List::map() implementation (Damian Mooyman)
  • 2016-01-21 c9764707 Refactor out Page default classname hack (Damian Mooyman)
  • 2016-01-21 5138bf1b7 Refactor out Page default classname hack (Damian Mooyman)
  • 2016-01-14 8e1ae55ff Enable single javascript files to declare that they include other files (Damian Mooyman)
  • 2015-12-21 99de74d69 Add isDisabledValue to SelectField (Damian Mooyman)
  • 2015-12-09 037467bea Asset Access Control implementation (Damian Mooyman)
  • 2015-11-30 c13b5d989 Enable advanced configuration options for requirements combined files (Damian Mooyman)
  • 2015-11-26 c50dc064 Update ErrorPage to use FilesystemGeneratedAssetHandler (Damian Mooyman)
  • 2015-11-26 ce28259c5 Replace CacheGeneratedAssetHandler with FlysystemGeneratedAssetHandler (Damian Mooyman)
  • 2015-11-09 369f3dda Remove deprecated ListboxField::setMultiple() (Damian Mooyman)
  • 2015-11-09 0b897477 Remove deprecated setMultiple() (Damian Mooyman)
  • 2015-10-29 641c26299 Enable linear-only restriction for DataList::applyRelation (Damian Mooyman)
  • 2015-10-23 e17a49f8a Restore JS Minification (Damian Mooyman)
  • 2015-10-19 d1ea74e40 Implement AssetField to edit DBFile fields (Damian Mooyman)
  • 2015-10-14 2bd9d00d Remove filesystem sync (Damian Mooyman)
  • 2015-10-13 227e2ba1 Move ErrorPage to new generated files API (Damian Mooyman)
  • 2015-10-12 f9892c628 Generated files API (Damian Mooyman)
  • 2015-09-23 f26c220d8 Support trait loading (Damian Mooyman)
  • 2015-09-16 2b1e5ee07 Enable DataList::sort to support composite field names (similar to filter) (Damian Mooyman)
  • 2015-09-15 be239896d Refactor of File / Folder to use DBFile (Damian Mooyman)
  • 2015-09-14 051c69ba3 (minor): Freshening up SS_Log API documentation and removed $extras param which was not being used anyway. (Patrick Nelson)
  • 2015-09-10 10dece653 Consolidate DataObject db methods (Damian Mooyman)
  • 2015-09-04 ee639deed showqueries=1 now shows parameters (Damian Mooyman)
  • 2015-09-04 9872fbef4 Refactor CompositeDBField into an abstract class (Damian Mooyman)
  • 2015-09-03 ac27836d2 Implementation of RFC-1 Asset Abstraction (Damian Mooyman)
  • 2015-08-30 aeccb8b8e Move DBField subclasses into SilverStripe\Model\FieldType namespace (Sam Minnee)
  • 2015-07-31 3e7eecf97 Remove SQLQuery (Damian Mooyman)
  • 2015-07-23 1b8d29576 Shift to Monolog for error reporting and logging (Sam Minnee)
  • 2015-07-16 40cc567c3 Force resampling by default (Jonathon Menz)
  • 2015-07-16 d1af214ef Removed custom dev/tests/ execution (Ingo Schommer)
  • 2015-07-16 a16588aac Removed JSTestRunner (Ingo Schommer)
  • 2015-06-17 4aa84f3d make DataObject::validate public (Damian Mooyman)
  • 2015-06-17 55170a0b7 make DataObject::validate public (Damian Mooyman)
  • 2015-06-12 513f0191f default behaviour for Director::getAbsoluteUrl (Damian Mooyman)
  • 2015-06-08 3bc76e69 Formalise new DataObject::canCreate argument (Damian Mooyman)
  • 2015-06-08 e9d486382 Formalise new additional arguments to DataObject::canCreate, DataExtension::augmentSQL, and DataObject::extendedCan (Damian Mooyman)
  • 2015-05-19 922d02f53 Enable filters to perform 'IS NULL' or 'IS NOT NULL' checks (Damian Mooyman)
  • 2015-03-25 7f5608c59 Public visibility on DataQuery::selectField (Uncle Cheese)
  • 2015-02-13 bdb1a9575 Cleanup and refactor of select fields (Damian Mooyman)
  • 2015-02-10 dc8d4ffe Refactor usages of HTMLText -> HTMLFragment (Daniel Hensby)

Features and enhancements

  • 2017-10-30 0c178f934 Adjust tinymce footer, remove branding and restore path (Damian Mooyman)
  • 2017-10-26 f6b7cf888 disable current user from removing their admin permission (Christopher Joe)
  • 2017-10-24 324bdad48 Ensure DBVarchar scaffolds text field with TextField with appropriate max length (Damian Mooyman)
  • 2017-10-19 04b4596be Don't fail immediately on imagick install (Damian Mooyman)
  • 2017-10-16 78f39e6b hide tree view icon when searching (Christopher Joe)
  • 2017-10-12 7e97f04e4 Allow extensions to intercept incorrect deletes on unpublish (Damian Mooyman)
  • 2017-10-10 11b2c7453 Improve upgrade experience for beta3 -> beta4 upgrade (Damian Mooyman)
  • 2017-10-05 cdf6ae45a Ensure changePassword is called by onBeforeWrite for a consistent API (Robbie Averill)
  • 2017-10-03 43ec2f87e Implement accept attribute in FileField (closes #7279) (Loz Calver)
  • 2017-10-03 6b5241269 Make Member::changePassword extensible (Robbie Averill)
  • 2017-09-29 f4b141761 Use less expensive i18n defaults in Member::populateDefaults() (Damian Mooyman)
  • 2017-09-27 36397c787 add notice for MigrateFileTask if FileMigrationHelper doesn't exist (Christopher Joe)
  • 2017-09-27 90d0361a6 update set_themes to not update config (Christopher Joe)
  • 2017-09-26 28552155c Add actWithPermission to SapphireTest for shortcut to perform actions with specific permissions (Daniel Hensby)
  • 2017-09-21 fa57deeba Allow vendor modules with url rewriting (Damian Mooyman)
  • 2017-09-21 7e92b053f Add setter and getter for certain classes, so that LeftAndMain no longer updates config during init (Christopher Joe)
  • 2017-09-19 261302a12 Don't force all class names to lowercase (Damian Mooyman)
  • 2017-09-13 04b1bb816 RateLimiter for Security controller (Daniel Hensby)
  • 2017-09-05 c707fccf6 Allow GridFieldEditButton to have configurable HTML classes. Change edit icon. (Sacha Judd)
  • 2017-08-29 98c10b089 Allow <% include %> to fallback outside of the Includes folder (Damian Mooyman)
  • 2017-08-28 0b34066f0 incorrect scalar types in doc blocks, add chainable returns in setters (Robbie Averill)
  • 2017-08-23 2c34af72e Log user constants during CI for debugging improvements (Damian Mooyman)
  • 2017-08-14 0eebeedd0 Test php 7.2 (Sam Minnee)
  • 2017-08-10 9dc11eff4 Add a path option for the schema data, so a full tree is not required for this data (Christopher Joe)
  • 2017-08-03 8577ad128 Added SSL support for MySQLi Connector (fixes #7242) (John)
  • 2017-08-03 417caf29 Allow insert links with display link text (Saophalkun Ponlu)
  • 2017-08-03 06efd2ac1 Ensure flush destroys temp tinymce files (Damian Mooyman)
  • 2017-08-02 2f9bfae1f Added MySQL SSL PDO Support (John)
  • 2017-08-01 ae97c15e4 Soft-code CSS explicit height and compute against rows (Damian Mooyman)
  • 2017-07-26 74873096b getSummary() API for SearchContext (Aaron Carlino)
  • 2017-07-21 392cda15f Add updateRules extension point to Director::handleRequest (Robbie Averill)
  • 2017-07-20 78d4d0d5d add support for TreeMultiselectField in react (Christopher Joe)
  • 2017-07-16 ac851f3a Upgrade to Behat 3, remove old feature contexts, update Travis configuration (Robbie Averill)
  • 2017-07-16 12310d5d Change "only these people" to "only these groups" in permissions (Robbie Averill)
  • 2017-07-16 2dd5bb4d1 Add Behat CMS header tab context methods (Robbie Averill)
  • 2017-07-14 6fc1491f Add edit command and its url test for page insert (Saophalkun Ponlu)
  • 2017-07-13 1cf8a67f Use injector for creating SSViewer (Robbie Averill)
  • 2017-07-12 f367a0aa6 add web accessible colours to web view dev/build (Sacha Judd)
  • 2017-07-10 823e49526 Allow SSViewer and SSViewer_FromString to be injectable (Robbie Averill)
  • 2017-07-04 b347ab86 Add version provider configuration (Robbie Averill)
  • 2017-07-04 ee4d8b4d4 Add new SilverStripeVersionProvider to provider module versions (Robbie Averill)
  • 2017-07-04 bd5782adc Allow index type to be configured per DBField instance (Robbie Averill)
  • 2017-07-03 4c1dbd40 Change "only these people" to "only these groups" in permissions (Robbie Averill)
  • 2017-06-27 ce730319 Remove use of MODULE_DIR constants (Sam Minnee)
  • 2017-06-27 8bb53215 Remove use of MODULE_DIR constants (Sam Minnee)
  • 2017-06-23 c9c439061 Ensure polymorphic has_one fields are indexed (Robbie Averill)
  • 2017-06-23 ccc86306b Add TrustedProxyMiddleware (Sam Minnee)
  • 2017-06-23 c4d038f20 Add HTTPRequest::getScheme()/setScheme() (Sam Minnee)
  • 2017-06-23 4d89daac7 Register Injector::inst()->get(HTTPRequest) (Sam Minnee)
  • 2017-06-23 d3d426bdf restored Extension::__construct() (Franco Springveldt)
  • 2017-06-23 72a7655e9 Moved allowed-hosts checking to a middleware. (Sam Minnee)
  • 2017-06-23 db080c060 Move session activation to SessionMiddleware. (Sam Minnee)
  • 2017-06-23 254204a3a Replace AuthenticationRequestFilter with AuthenticationMiddleware (Sam Minnee)
  • 2017-06-23 e85562289 Replace FlushRequestFilter with FlushMiddleware (Sam Minnee)
  • 2017-06-22 26b9bf11e Allow “%$” prefix in Injector::get() (Sam Minnee)
  • 2017-06-15 a990c99d6 suffix subfolder in silverstripe-cache with php-version (#6810) (Lukas)
  • 2017-06-15 5d27dccd6 Add CSRF token to logout action (Loz Calver)
  • 2017-06-11 7178caf4a show the path which threw the error (Christopher Joe)
  • 2017-06-01 9a0e01d4a DB Driver defaults to PDO (Daniel Hensby)
  • 2017-05-31 0f90c5b63 Update style of CMSLogin form (Damian Mooyman)
  • 2017-05-31 844420df Translation strings updated (Christopher Joe)
  • 2017-05-24 e327bf3c7 add contribution notes about releasing to NPM (Christopher Joe)
  • 2017-05-18 c2841b6d6 Remove "Remove link" button from the editor's main toolbar (Saophalkun Ponlu)
  • 2017-05-18 3e556b596 Move index generation to DataObjectSchema and solidify index spec (Daniel Hensby)
  • 2017-05-16 9a31b19e RedirectorPage extensions can now modify fields (Damian Mooyman)
  • 2017-05-11 6869e450a added customisable emptyTitle and a showRootOption property in TreeDropdownField (Christopher Joe)
  • 2017-05-10 7fa47e234 API for minified files using injectable service (Aaron Carlino)
  • 2017-05-08 afd157526 GridField passes in context for canCreate (Aaron Carlino)
  • 2017-05-07 f9ea752ba Add AuthenticationHandler interface (Sam Minnee)
  • 2017-05-05 edcb220e4 add EmailLink form factory server-side (Christopher Joe)
  • 2017-05-04 f4179d60 Simplify test runs. (Sam Minnee)
  • 2017-05-04 1691e90fb Allow SapphireTest::objFromFixture() to accept either table or class (Sam Minnee)
  • 2017-05-04 2ee0d9980 switch FormFactories to use RequestHandler instead of Controller (Christopher Joe)
  • 2017-04-24 b6d4eb3e module-based JS translation keys (Aaron Carlino)
  • 2017-04-20 d51c4891e namespaced i18n keys (Uncle Cheese)
  • 2017-04-20 29805ee4 namespaced i18n keys (Uncle Cheese)
  • 2017-04-13 a58416b6 style travis tests (Ingo Schommer)
  • 2017-04-03 b8db4505 Refactor archive message to a separate method (Saophalkun Ponlu)
  • 2017-04-03 8b1c020b9 Downgrade MSSQL from commercially supported to community supported (Sam Minnee)
  • 2017-03-31 5b90141c Update archive warning message (Saophalkun Ponlu)
  • 2017-02-27 fc54fa160 Add class to clear underline styling for fieldholders (Christopher Joe)
  • 2017-02-02 0982f77ec /aggregate data filters (#6553) (Aaron Carlino)
  • 2017-02-02 3952769ea More helpful error when .env is missing. (Sam Minnee)
  • 2017-01-30 06b4758 Add .env support (Daniel Hensby)
  • 2017-01-30 8c8231c03 Director::host() to determine host name of site (Daniel Hensby)
  • 2017-01-30 873fd8c5b replace _ss_environment.php with .env and environment vars (Daniel Hensby)
  • 2017-01-16 87ac3e397 Display warning on always_populate_raw_post_data not being -1 in php 5 (#6507) (Damian Mooyman)
  • 2017-01-13 3ea5015f8 Move to SwiftMailer powered Emails (#6466) (Daniel Hensby)
  • 2017-01-11 b52a963ed Remove jquery-ui button() api from default HTML editor dialog (Damian Mooyman)
  • 2016-12-23 ed26b251c Better output type detection for debugging (Damian Mooyman)
  • 2016-12-21 cf5c055de Campaign admin publish button styles missing (Paul Clarke)
  • 2016-12-20 e893fc4c5 improve secondary action colours (Paul Clarke)
  • 2016-12-14 d8843c6fe Split out the fetch call easier mocking (Christopher Joe)
  • 2016-12-13 ddc9a9c6d up buttons within gridfield search (Will Rossiter)
  • 2016-12-12 7b90ee137 resize icon to sit inline and increase size of search icon and Upload icon (Paul Clarke)
  • 2016-12-08 085c8f5a4 2x increase in scanning of files for ConfigManifest (Jake Bentvelzen)
  • 2016-12-07 2a25a525c Move temporary JSON block into standard component (Damian Mooyman)
  • 2016-12-05 6ec780493 Add icon size for 14px icons and table padding for asset list (Paul Clarke)
  • 2016-11-30 cb6ec11f1 Implement import CSV icon and tidy up import forms (Will Rossiter)
  • 2016-11-29 0e92ecea0 Prevent test DBs persisting after testing (Damian Mooyman)
  • 2016-11-22 8ab382ed7 Insert media modal in react (Damian Mooyman)
  • 2016-11-21 35e313de1 height for modal in IE10 (Paul Clarke)
  • 2016-11-21 0d788ddf Code Coverage via (#1631) (Ingo Schommer)
  • 2016-11-01 5650254b5 es to allow code files in src/ folder. (Damian Mooyman)
  • 2016-11-01 213cf8841 Test webpack build as part of NPM test run. (Sam Minnee)
  • 2016-11-01 e9d2f2f73 Use composer autoloader to set the right include path. (Sam Minnee)
  • 2016-11-01 7a10c194b Move code files into src/ folder. (Sam Minnee)
  • 2016-10-31 741c515c Improved behaviour for flexbox on smaller screens (Damian Mooyman)
  • 2016-10-28 bf9939e3 Refactor test bootstrap to be more modular. (Sam Minnee)
  • 2016-10-26 c47a1d909 Simplified test runs. (Sam Minnee)
  • 2016-10-24 added212 Simplified travis run (Sam Minnee)
  • 2016-09-17 b19475d74 Ignore npm-shrinkwrap for greenskeeper-provided PRs. (Sam Minnee)
  • 2016-09-17 c2ebff5c1 Use sass-lint over scss-lint (Sam Minnee)
  • 2016-09-15 f700d8655 Run JS/CSS linting in Travis. (Sam Minnee)
  • 2016-09-14 cebcf7fb8 More flexible theme resolution for framework and cms. (Sam Minnee)
  • 2016-09-13 07396e443 Move Travis behat test to run locally. (Sam Minnee)
  • 2016-09-13 96126323d themedCSS() and themedJavascript() work with any file layout. (Sam Minnee)
  • 2016-09-12 9dd5ebee8 Don’t set up SilverStripe project for test run (Sam Minnee)
  • 2016-09-12 6b847d361 Allow project root to be treated as a module. (Sam Minnee)
  • 2016-09-08 3d827543 Allow pages to specify the controller they use (Loz Calver)
  • 2016-05-21 a9eebdc7e Allow namespaces in template include statements. (Sam Minnee)
  • 2016-04-11 21a106532 Add createEndpointFetcher to backend (Sam Minnee)
  • 2016-04-03 a17c5cb14 Expose silverstripe-backend for modules to access. (Sam Minnee)
  • 2016-03-02 ae3161969 styles for main nav (Paul Clarke)
  • 2016-02-04 bab1f230b Cross device "Remember Me" feature (Jean-Fabien Barrois)
  • 2015-08-28 53ffc1a0d Defining byID functions in SS_Filterable (Daniel Hensby)
  • 2015-08-27 52ca089d0 Ensure php7 builds pass. (Sam Minnee)
  • 2015-07-29 a1f7dcafa Add ‘calls’ section to Injector configs. (Sam Minnee)
  • 2015-07-27 ebc3900c4 Replace DebugView’s writeX() functions with renderX() functions. (Sam Minnee)
  • 2015-05-27 223466a8b Configurable file version prefix (Jonathon Menz)
  • 2015-05-01 9f91b4782 Update SS_ConfigStaticManifest to use Reflection (micmania1)
  • 2014-07-05 533d5dbd4 Admin url can now be customized (Thierry François)


  • 2017-11-07 8497b9e1e Disable directory index with missing slash (Damian Mooyman)
  • 2017-11-03 1929ec46b Prevent logOut() from clearing site stage during bootstrapping due to flushed session (Damian Mooyman)
  • 2017-11-02 6a73466b4 Fix basicauth (Damian Mooyman)
  • 2017-11-02 1b190de7 Fix regression to cancel draft changes (Christopher Joe)
  • 2017-11-02 a61ce077c Sessions must be destroyed on logout (Daniel Hensby)
  • 2017-11-02 27907304 Ensure we publish pages to update permissions during testing (Damian Mooyman)
  • 2017-11-01 df50c8da0 Use parse_str in place of guzzle library (Damian Mooyman)
  • 2017-11-01 897cba55c Move Member log out extension points to non-deprecated methods (Robbie Averill)
  • 2017-11-01 c331deda Fix ambiguous query for content report (Christopher Joe)
  • 2017-10-30 4fb53060 Safely check for is_site_url before parsing a shortcode (Damian Mooyman)
  • 2017-10-29 26dc7373 Add primary button class to 'Filter' button (Robbie Averill)
  • 2017-10-27 4d063289 Add warning state to revert action in CMS page history (Robbie Averill)
  • 2017-10-26 9d3277f3d Fix forceWWW and forceSSL not working in _config.php (Damian Mooyman)
  • 2017-10-26 68c3279fd Ensure readonly tree dropdown is safely encoded (Damian Mooyman)
  • 2017-10-25 8725672ea changelog anchors (Ingo Schommer)
  • 2017-10-25 da4989e8f Do not escape the readonly values since they get escaped when rendered (Robbie Averill)
  • 2017-10-25 d6c528b test paths (Damian Mooyman)
  • 2017-10-25 2f82d0846 Fix env loading in installer (Damian Mooyman)
  • 2017-10-24 d56c75607 ed changelog indentation (Ingo Schommer)
  • 2017-10-20 4caf34506 switch to using the Convert class for decoding (Christopher Joe)
  • 2017-10-19 689c198f revert to this button after archiving (Christopher Joe)
  • 2017-10-18 bb9501797 Use isolated scope when requiring files for module activation (Loz Calver)
  • 2017-10-18 dabdc905c Fix enable email subclasses to use their respective templates (Christopher Joe)
  • 2017-10-18 0b3363d0a Fix documentation for permissions (Christopher Joe)
  • 2017-10-17 77b26b36 Fix page icons in vendor modules (Damian Mooyman)
  • 2017-10-17 884fdd61b Ensure sake works when called from any directory (Damian Mooyman)
  • 2017-10-16 199f8377 standardise "cms-content-header" content with ModalAdmin layout (Christopher Joe)
  • 2017-10-16 b9cb1e69e Replace phpdotenv with thread-safe replacement (Damian Mooyman)
  • 2017-10-16 076d7d78c cache the cacheKey in TreeDropdownField, so it doesn't need to query for it multiple times in the same request (Christopher Joe)
  • 2017-10-12 7ff707df7 Fixed issue on windows where the BASE_URL constant would get set wrong if the site was in a sub-folder of the web root (UndefinedOffset)
  • 2017-10-12 a930d7ae Fix up markup and classes to work better with flexbox (Christopher Joe)
  • 2017-10-12 6fe1e2c5 align heading properly (Christopher Joe)
  • 2017-10-12 5ccbabd36 Fix sake path lookup to find vendor framework (Damian Mooyman)
  • 2017-10-10 c8f95182 icon urls (Damian Mooyman)
  • 2017-10-10 6a55dcfc1 references to resource paths / urls (Damian Mooyman)
  • 2017-10-09 9d873db9 paths in (Damian Mooyman)
  • 2017-10-09 fd630a99b Fix decimal scaffolding (Damian Mooyman)
  • 2017-10-09 f34f7cb66 surname behat test (Christopher Joe)
  • 2017-10-08 6bc716d7c ed incorrect statement on ID generation (Sam Minnée)
  • 2017-10-08 89db5870b typo in docs (Christopher Joe)
  • 2017-10-08 504e762c6 Fix missing property in requirements minificaction docs (Damian Mooyman)
  • 2017-10-06 bd874ca91 ed docs paths (fixes #7075) (Ingo Schommer)
  • 2017-10-06 578f3f208 behat test (Christopher Joe)
  • 2017-10-05 3bdc8c7e6 Trim whitespace off names in Injector (Robbie Averill)
  • 2017-10-05 e07658ef5 linting issues and fix doc (Christopher Joe)
  • 2017-10-05 a1a834192 refactor TreeMultiselectField to be clearable if nothing is selected (Christopher Joe)
  • 2017-10-04 ca60b94f Fix vendor bootstrap path (Damian Mooyman)
  • 2017-10-04 924e2a714 sake path relative to vendor (Ingo Schommer)
  • 2017-10-04 f6ce07dc8 behat bootstrap path (Ingo Schommer)
  • 2017-10-04 1b6d0144c Fix resource mapping for TinyMCE (Damian Mooyman)
  • 2017-10-03 2fc3f80f tinymce issue (Damian Mooyman)
  • 2017-10-03 ab4044e2 CI config (Damian Mooyman)
  • 2017-10-03 f4a77649a requirements tests (Damian Mooyman)
  • 2017-10-03 5ffe64f02 tinymce plugins (Damian Mooyman)
  • 2017-10-02 e1b98d154 tinymce operation for resource paths (Ingo Schommer)
  • 2017-10-02 7de2e07 main.php path in install.php (Ingo Schommer)
  • 2017-10-02 8e49b563a installer paths for vendorised module (Ingo Schommer)
  • 2017-10-02 e88f765 main.php path (Ingo Schommer)
  • 2017-10-02 85255891b test environment type (Damian Mooyman)
  • 2017-10-02 a2f0a79b test environment type (Damian Mooyman)
  • 2017-10-02 26f7f0482 typos in FilesystemCacheFactory (Christopher Joe)
  • 2017-09-29 e2750c03f Restore SS_USE_BASIC_AUTH env var (Damian Mooyman)
  • 2017-09-27 53b2fcd1e amend TinyMCE combined generator's unit test to be more lenient with encoding (Christopher Joe)
  • 2017-09-27 51ac297c5 es to ratelimiter and new features (Daniel Hensby)
  • 2017-09-27 c7cbbb29f links on paginated lists when there are GET vars (Andrew O'Neil)
  • 2017-09-27 4dbd72720 Config updates are now applied after middleware not before (Damian Mooyman)
  • 2017-09-26 33ae463e5 Class name in _t() call in installer and run text collector (Robbie Averill)
  • 2017-09-25 b8e5a2ce3 readonly PermissionCheckboxSetField (Mike Cochrane)
  • 2017-09-21 fe4688b93 gridfield button title alignment (Saophalkun Ponlu)
  • 2017-09-20 f1a12e15b Fix sub-template lookup for includes (Damian Mooyman)
  • 2017-09-20 265f91060 phpcs error (Christopher Joe)
  • 2017-09-19 f5b97b18 Update translation default from "only these people" to "only these groups" to match CMS (Robbie Averill)
  • 2017-09-19 09b3a24f3 Detect, warn, and fix invalid SS_BASE_URL (Damian Mooyman)
  • 2017-09-18 cda78e2d add space below report filter form (Saophalkun Ponlu)
  • 2017-09-15 68128b46 toolbar title layou (Saophalkun Ponlu)
  • 2017-09-15 df957681 toolbar title layout (Saophalkun Ponlu)
  • 2017-09-15 5351ba67 toolbar title layout (Saophalkun Ponlu)
  • 2017-09-13 919831365 HTTP Headers are case insensitive (Daniel Hensby)
  • 2017-09-13 f8ef97c16 Fix import modal (Damian Mooyman)
  • 2017-09-12 1892a0207 Fix gridfield print styles (Damian Mooyman)
  • 2017-09-12 0aac4ddb Default LoginForm generated from default_authenticator (Daniel Hensby)
  • 2017-09-12 e15373ba ed linting errors and tests (Christopher Joe)
  • 2017-09-12 6613826ed SSViewer::add_themes() to properly prepend (Andrew Aitken-Fincham)
  • 2017-09-12 2b2cdb4c Fix yarn build (Damian Mooyman)
  • 2017-09-12 905c4e04d Incorrect path for requirements file (Damian Mooyman)
  • 2017-09-12 12480633b grid field button styles (Saophalkun Ponlu)
  • 2017-09-11 4f3b4f76 Fine-tune button styles (Saophalkun Ponlu)
  • 2017-09-11 d18568c3 Ensure client config merging includes existing parent "form" attributes (Robbie Averill)
  • 2017-09-07 49fd3391 Prevent icons CSS being included twice (Damian Mooyman)
  • 2017-09-06 2dde7771 Add styles for url segment field (Sacha Judd)
  • 2017-09-06 dc240ce7f use correct namespaces for middleware injection (Andrew Aitken-Fincham)
  • 2017-09-05 25380eb45 permission check for admin role (Christopher Joe)
  • 2017-09-05 3669f30e Fix race condition with change detection / loading animation (Damian Mooyman)
  • 2017-09-05 2f7f4e73d toolbar button margin and spacing (Saophalkun Ponlu)
  • 2017-09-04 4b26ed6a Prevent treeview loading repeatedly on each page edit form (Damian Mooyman)
  • 2017-09-04 afda58c51 add schema to the "auto" parts request (Christopher Joe)
  • 2017-09-01 eaa0a2a4 Update unused button classes for url segment field (Sacha Judd)
  • 2017-08-31 acc58c2b6 incorrect $has_one documentation (Matt Peel)
  • 2017-08-31 806ffb934 Ensure installer.php works nicely with .env files (Damian Mooyman)
  • 2017-08-31 1c321019 icons in right click menu (Christopher Joe)
  • 2017-08-30 1273059b campaign form validation errors (Damian Mooyman)
  • 2017-08-28 e4b506cbe add combinedFiles to clear logic (Christopher Joe)
  • 2017-08-25 8c15e451c Removed unnecessary database_is_ready call. (Sam Minnee)
  • 2017-08-24 9350b4a4 Fix inconsistent breadcrumbs in CMS section (Damian Mooyman)
  • 2017-08-24 d0fd96d4 Remove entry points to tree in search mode (Saophalkun Ponlu)
  • 2017-08-24 5a9131a11 Do not try and access sessions when they are not ready (Robbie Averill)
  • 2017-08-24 c4ff9df1b Use correct bootstrap class or GridFieldDetailForm delete button (Robbie Averill)
  • 2017-08-24 6efb35fb Fix “Show unpublished versions” (#1930) (Damian Mooyman)
  • 2017-08-24 80cf096a6 Prioritise SS_BASE_URL over flakey SCRIPT_FILENAME check (Damian Mooyman)
  • 2017-08-23 d03edb20 Search in page edit should now redirect to (full) table view (Saophalkun Ponlu)
  • 2017-08-23 1b087221d Fix BASE_URL on CLI (Damian Mooyman)
  • 2017-08-22 47fced888 Capture errors after a reload token redirect to login url (Damian Mooyman)
  • 2017-08-21 fc2a60391 Don’t construct extension_instances on objects that never use them (Damian Mooyman)
  • 2017-08-21 c50cd34df Prevent repeated lookup of obj.dependencies by Injector (Sam Minnee)
  • 2017-08-21 249c7048d trim accept header parts (Christopher Joe)
  • 2017-08-16 ce5e15df6 Fix issue with multiple editors breaking plugins (Damian Mooyman)
  • 2017-08-15 02cd72074 Remove deprecated assert() usage. (Sam Minnee)
  • 2017-08-14 0926b0451 Fix latent bug in DataObject (Sam Minnee)
  • 2017-08-14 d469a2dc regressions from tinymce upgrade (#1923) (Damian Mooyman)
  • 2017-08-08 1a4a006d0 PDOConnector ssl_cipher bug fixes #7258 (John)
  • 2017-08-07 5d5fac745 Throw exception when "value" is used to define indexes. Update docs. (Robbie Averill)
  • 2017-08-07 c164fcfe5 reference to IE10 when it should be IE11 (Christopher Joe)
  • 2017-08-07 068156710 Fix flushing on live mode (#7241) (Damian Mooyman)
  • 2017-08-06 f7bebdd8f Fix install issue with IIS (Damian Mooyman)
  • 2017-08-03 b6a8e4588 Ensure mocked controller has request assigned (Damian Mooyman)
  • 2017-08-02 e64acef53 Fix invalid i18n yaml (Damian Mooyman)
  • 2017-08-02 841801145 linting issues (Damian Mooyman)
  • 2017-08-01 685320450 Fix ajax loading wait for behat tests (Damian Mooyman)
  • 2017-07-31 424b1c0 Include .env.example and .editorconfig in git export (Sam Minnee)
  • 2017-07-28 53a0206b check if parent context is SiteTree instance (Nic Horstmeier)
  • 2017-07-28 980d6b7ef ?showqueries=inline failed on PDO databases (fixes #7199) (Loz Calver)
  • 2017-07-28 a85bc86fd behat tree dropdown trigger (Damian Mooyman)
  • 2017-07-27 4e222fc18 add function for selecting a value in the new tree dropdown in behat using react (Christopher Joe)
  • 2017-07-27 3ef9ca69d DBComposite doesn't allow arbitrary property assignment (Aaron Carlino)
  • 2017-07-27 47f24ce05 up test linting (Damian Mooyman)
  • 2017-07-24 980bf83 recipe plugin version constraint (Damian Mooyman)
  • 2017-07-21 d49a5f5a Yaml syntax (Daniel Hensby)
  • 2017-07-21 5bf9ccc23 Deprecated yml syntax (Daniel Hensby)
  • 2017-07-21 2385b7385 fix config rules to match updated Except (Damian Mooyman)
  • 2017-07-20 db5f81d3 behat tests (Saophalkun Ponlu)
  • 2017-07-20 cc6b4422 ContentController still using global $project; (Aaron Carlino)
  • 2017-07-20 6fd6a3894 Fix unassigned nestedFrom (Damian Mooyman)
  • 2017-07-19 8aeec9208 FulltextSearchable DB engine not set correctly (Daniel Hensby)
  • 2017-07-18 fca3ba73 Pages search now defaults to list view (Saophalkun Ponlu)
  • 2017-07-18 ac388a559 Exclude thirdparty dir from code coverage (Robbie Averill)
  • 2017-07-18 a5ca4ecb5 Log in as someone else returns user back to login screen (Robbie Averill)
  • 2017-07-18 fb6e6162 Use better inheritance based logic for deciding which active tab to display in edit page (Robbie Averill)
  • 2017-07-17 e8c77463 Use injection for CMSMain in tests (Robbie Averill)
  • 2017-07-17 ba9ad5527 Base URL defaults to a slash in currentURL if not defined already (Robbie Averill)
  • 2017-07-17 da4e46e4d Use merge and set instead of update for config calls (Robbie Averill)
  • 2017-07-17 c3cda42b Use merge or set instead of update for config calls (Robbie Averill)
  • 2017-07-17 ea4181166 Ensure phpdbg calls are registered by SilverStripe core as a CLI call (Robbie Averill)
  • 2017-07-16 dd4d5740 Ensure tab states are reflected when switching on page edit screen (Robbie Averill)
  • 2017-07-16 85c79d4e Re-enable code coverage runs with phpdbg (Robbie Averill)
  • 2017-07-16 8b12e97d7 Enable code coverage builds with phpdbg and 7.1.7 (Robbie Averill)
  • 2017-07-15 1a38feff2 Version provider uses early bound config getter, move LeftAndMain config to admin module (Robbie Averill)
  • 2017-07-14 844462108 diff reference (Damian Mooyman)
  • 2017-07-13 b726d64d1 SearchEngine to use quoted table names (martimiz)
  • 2017-07-13 b16896f22 Ignore exceptions thrown when deleting test databases (Robbie Averill)
  • 2017-07-13 5fcd7d084 Fix registered shutdown function not handling responsibility for outputting redirection response (Damian Mooyman)
  • 2017-07-13 16b66440c Incorrect module delimiter (Aaron Carlino)
  • 2017-07-13 4898c0a4a Incorrect module delimited (Damian Mooyman)
  • 2017-07-13 3cf9910f Incorrect module delimited (Damian Mooyman)
  • 2017-07-06 85359ad59 Ensure that installer can create an initial admin account (Damian Mooyman)
  • 2017-07-05 55dc3724d Invalid composer.json (Damian Mooyman)
  • 2017-07-04 c836a2e2d Module resource regex does not allow ports (Aaron Carlino)
  • 2017-07-04 f14e6bae2 numeric field for null values (John Milmine)
  • 2017-07-04 4b2320583 unnamespaced i18n keys (Damian Mooyman)
  • 2017-07-03 fdbd6015 dependencies (Damian Mooyman)
  • 2017-07-03 8bb325f3 upgrade paths (Damian Mooyman)
  • 2017-07-03 63ba09276 Add namespaces in markdown docs (#7088) (Saophalkun Ponlu)
  • 2017-07-03 f65e3627d Implement or exclude all pending upgrader deltas (Damian Mooyman)
  • 2017-06-30 363394769 Fix broken installer assets and session crash (Damian Mooyman)
  • 2017-06-30 99f9d4a2 assertions (Damian Mooyman)
  • 2017-06-29 0200e2b62 Fix travis artifacts paths (Damian Mooyman)
  • 2017-06-29 061393a09 enable ?flush rather than just ?flush=1 (Christopher Joe)
  • 2017-06-29 522af3f2 Test updates to comply with (Sam Minnee)
  • 2017-06-29 2c8790ca7 DataObject::get_one() misses return null, not false (Sam Minnee)
  • 2017-06-28 b2f3b218a Fix incorrect $database autoinit (Damian Mooyman)
  • 2017-06-28 8078ee08f Fix folder urls getting mtime querystring appended (Damian Mooyman)
  • 2017-06-27 b8750d9 Delete Page_Controller from SS4 compat branch (Robbie Averill)
  • 2017-06-27 af1654ed Don’t click hidden button (Damian Mooyman)
  • 2017-06-27 ab0b3d8a namespaces in docs (Saophalkun Ponlu)
  • 2017-06-26 b34519e7 insert link modal to work with new injector API (#1860) (Chris Joe)
  • 2017-06-25 3c35d25a6 Allow DB::setConfig() in _config.php (Sam Minnee)
  • 2017-06-25 67887febc - session now uses request (Sam Minnee)
  • 2017-06-23 95a266c6b Add tests for middleware (Sam Minnee)
  • 2017-06-22 ad347af7 linter (Ingo Schommer)
  • 2017-06-22 fa568e333 ed linting errors (Ingo Schommer)
  • 2017-06-22 c2ad41ef Allow RedirectorPage to have non-redirected actions, move redirection to index (Robbie Averill)
  • 2017-06-22 8d23cfc2 Ensure LoginForm on ContentController can load the member authenticator correctly (Robbie Averill)
  • 2017-06-22 12c2edc1d DeprecationTest (Ingo Schommer)
  • 2017-06-22 ad54e7eb3 ImportButton not opening the modal (Will Rossiter)
  • 2017-06-22 fb09e0b65 merge error (Ingo Schommer)
  • 2017-06-22 e592bed3e ed merge error (Ingo Schommer)
  • 2017-06-21 8cebb275 behat issues (Damian Mooyman)
  • 2017-06-21 b05dbc91 module tests (Damian Mooyman)
  • 2017-06-21 288de2eb1 Add flag on form whether to notify user when there's unsaved changes (Saophalkun Ponlu)
  • 2017-06-21 c2c75aa9 and upgrade all tests (Damian Mooyman)
  • 2017-06-21 7a7e8003 Use double escapes backslashes in translation string (Robbie Averill)
  • 2017-06-15 54879402c Removed reserved / removed / invalid country codes (Damian Mooyman)
  • 2017-06-15 957d238ca Remove reference to removed method parseIndexSpec (Damian Mooyman)
  • 2017-06-15 fdbe38d4 SS4 Right click, add page fails (Antony Thorpe)
  • 2017-06-11 0dcfa5fa9 CMSSecurity doesn't have Authenticators assigned. (Damian Mooyman)
  • 2017-06-10 3fe837dad for CMS Authenticator. Should only apply to CMSSecurity (Simon Erkelens)
  • 2017-06-09 10196e4f composer requirements (Christopher Joe)
  • 2017-06-02 d12c986dd es printing from crashing (Christopher Joe)
  • 2017-06-02 e267d29b9 Consistent return values for first and last methods (Saophalkun Ponlu)
  • 2017-05-30 13ee3148d Bracket should implement TestOnly (Daniel Hensby)
  • 2017-05-30 3c7c6399 remove temp external entries (Christopher Joe)
  • 2017-05-29 acb74a857 $class variable from being clobbered (Nick)
  • 2017-05-29 db59e51c4 es a bug with split file names during CSV import (Colin Tucker)
  • 2017-05-25 9c63a8c8c Fix race conditions in DatetimeFieldTest (Damian Mooyman)
  • 2017-05-24 0cd40ca6e Fix minor accessors of legacy ->class property (Damian Mooyman)
  • 2017-05-22 09164e7e2 Better error checking for non-writable temp paths (Sam Minnee)
  • 2017-05-22 40d9bbfd6 Don’t assume posix_getpwuid is available. (Sam Minnee)
  • 2017-05-22 f7e7fa584 linting issues (Damian Mooyman)
  • 2017-05-19 c034ead6 beforeUpdateCMSFields added to ErrorPage and VirtualPage (Franco Springveldt)
  • 2017-05-19 a29f4f88 Remove legacy translation behaviour in template (Robbie Averill)
  • 2017-05-19 31578d477 Parent treedropdownfield for an orphaned page is broken (Mike Cochrane)
  • 2017-05-19 fc036208 Remove legacy sprintf style translations in favour of placeholders (Robbie Averill)
  • 2017-05-17 dddf88278 a typo in comment (Nick)
  • 2017-05-17 0534a5ec0 TreeDowndropField copying (Christopher Joe)
  • 2017-05-16 eebae1f7 Fix insert link behat command (Damian Mooyman)
  • 2017-05-16 7a7e8e5f9 Fix artifacts index.html download path (Damian Mooyman)
  • 2017-05-16 6c5e0f82 Ensure logs are saved to artifacts (Damian Mooyman)
  • 2017-05-16 0b24e02d Fix missing path to travis-upload-artifacts.php (Damian Mooyman)
  • 2017-05-16 287ad35f0 change API to hasEmptyDefault() to be inline with SingleSelectField (Christopher Joe)
  • 2017-05-15 1ec7c4e52 lint error (Saophalkun Ponlu)
  • 2017-05-15 3927e7e24 added cache key for TreeDropdownField cache (Christopher Joe)
  • 2017-05-12 6939841e4 update ss template FormActions to be closer to React's implementation (Christopher Joe)
  • 2017-05-12 e2b7ca2e for save and publish buttons shrinking (Christopher Joe)
  • 2017-05-12 de079154 Webpack dev config was overwriting plugins rather than concatenating (Aaron Carlino)
  • 2017-05-11 43a122cc3 for meta closing tags (Ralph Slooten)
  • 2017-05-09 4373bdb99 Prevent infinite loop (Mike Cochrane)
  • 2017-05-09 17ddfab87 Test form factories use the new interface (Christopher Joe)
  • 2017-05-09 f3b442e9 behat tests for insert link to work with react implementation (Christopher Joe)
  • 2017-05-05 11b8926c up - prefer-stable necessary to avoid armageddon (Sam Minnee)
  • 2017-05-05 6ddd7534 up - fix behat.paths.base reference (Sam Minnee)
  • 2017-05-04 e2271d1b up - make behat work (Sam Minnee)
  • 2017-05-04 c1b3d87b up - don't need to explicitly include testsession (Sam Minnee)
  • 2017-05-04 a05958b3e i18n test fixtures stricter for Symfony3 (Sam Minnee)
  • 2017-05-04 4332d2fa Drop php5.5, add php7.1, simplify build (Sam Minnee)
  • 2017-05-04 c58dc97d3 optional $id param because of how methodSchema passes a parameter (Christopher Joe)
  • 2017-05-04 1f8de20ce FormSchemaTest.php linting issues (Damian Mooyman)
  • 2017-05-03 0c52ea067 Fix incorrect text collection of CLASS following an Name::class constant (#6868) (Damian Mooyman)
  • 2017-05-02 8b9f41d4f Fix ApcuCache and MemCache namespace (Damian Mooyman)
  • 2017-04-30 8dd3f4ce1 template localisation namespaces (#6852) (Damian Mooyman)
  • 2017-04-29 391901df8 quote outside the if statement. (Simon Erkelens)
  • 2017-04-28 9147fa44 source file encoding (Damian Mooyman)
  • 2017-04-28 699d5d6a4 i18nTextCollector handling of special string characters (Damian Mooyman)
  • 2017-04-27 daed727ac ed form schema validation (Ingo Schommer)
  • 2017-04-27 a2ee6a76a ed formschematest (Ingo Schommer)
  • 2017-04-27 3a372a1f4 IntlLocales::validate when lang and region are the same e.g. de_DE (Robbie Averill)
  • 2017-04-27 c95c6c466 Regression from 3.x: allow $required_extensions to have arguments (Robbie Averill)
  • 2017-04-27 2ae8fde2d tests (Damian Mooyman)
  • 2017-04-27 cbe534c67 ed component capitalisation (Ingo Schommer)
  • 2017-04-26 1f74221c2 unit tests (Christopher Joe)
  • 2017-04-26 1ec2abe75 ed timezone and normalised ISO handling (Ingo Schommer)
  • 2017-04-24 4c772c80c Show detailed errors on CLI for live environments (Sam Minnee)
  • 2017-04-21 cf2b0417 coding conventions (Ingo Schommer)
  • 2017-04-21 4b19987a tweak visibility around the slideDown/slideUp animation (Christopher Joe)
  • 2017-04-21 3b69a471 Hidden listbox #1785 (Ishan Jayamanne)
  • 2017-04-20 19974fe1 PHPDoc for Report::add_excluded_reports method. (Garion Herman)
  • 2017-04-20 0d5e84d0b Add PHP extension requirements to composer. (Sam Minnee)
  • 2017-04-20 dba1f61f1 tests related to date time (Saophalkun Ponlu)
  • 2017-04-20 403f4db14 change titles to return schema values in schema (Christopher Joe)
  • 2017-04-19 9d7eef7cf datetime field validation for the refactor (Saophalkun Ponlu)
  • 2017-04-13 8318e20c2 close button placement (Christopher Joe)
  • 2017-04-12 8999f70ac ing broken search in SecurityAdmin Groups field (Sean Harvey)
  • 2017-04-11 03a2a907 whitespace in templates causing double arrows (Damian Mooyman)
  • 2017-04-11 9cad8ba0 ed linting (Ingo Schommer)
  • 2017-04-11 1ca51eb57 Ensure that mysite test bootstrap configuration is loaded after core and before the database connection (Robbie Averill)
  • 2017-04-05 f9f61cb Fix cow release config (Damian Mooyman)
  • 2017-04-05 8cbdfa456 invalid json file (Damian Mooyman)
  • 2017-04-05 e12a2709 syntax error in selector (Christopher Joe)
  • 2017-04-03 e3fbd1dca ed coding conventions (Ingo Schommer)
  • 2017-04-03 e9693467b ed tests (Ingo Schommer)
  • 2017-04-03 a70de91b3 DatetimeFieldTest (Ingo Schommer)
  • 2017-04-03 bb880a325 Clarify PHP 5.6 support for 4.x (Sam Minnee)
  • 2017-03-30 3b89d704 Fix test run, remove 5.5, add 7.1 (Sam Minnee)
  • 2017-03-30 227ba8dcc illegal_extensions in unit tests not being removed (Mike Cochrane)
  • 2017-03-29 9cdcb339e Fix test breakage in most recent change. (Sam Minnee)
  • 2017-03-29 b1b0c6af Ensure all CMS forms include full ID / VersionID in path (Damian Mooyman)
  • 2017-03-28 538a5838 Rename license file to match module standard. (Sam Minnee)
  • 2017-03-28 59a9ff84 Rename license file to match module standard. (Sam Minnee)
  • 2017-03-28 ae5b5a95 Rename license file to match module standard. (Sam Minnee)
  • 2017-03-28 0828b03dc Add separate license file to match module standard. (Sam Minnee)
  • 2017-03-28 6396310 Split licence into separate file to match standard. (Sam Minnee)
  • 2017-03-28 ede549a6e illegalExtensions are optional, requiredExtensions are mandatory with useful error messages. (Damian Mooyman)
  • 2017-03-28 bd14f6db9 Update config API reference in FulltextSearchable and use namespaced imports for class names (Robbie Averill)
  • 2017-03-28 4a8bd1a07 Remove campaign related classes from upgrade map - moved to campaign-admin (Robbie Averill)
  • 2017-03-28 59a5eb430 Don't mistake \ for _ in dev/build (Sam Minnee)
  • 2017-03-24 6b4a72dee ing deprecated PHPUnit APIs (Daniel Hensby)
  • 2017-03-20 e4c68bc2b and test pluralisation usages (Damian Mooyman)
  • 2017-03-16 53b98284f Remove undefined var from installer (Daniel Hensby)
  • 2017-03-16 66b1c72d4 dev CI builds (Damian Mooyman)
  • 2017-03-16 61e5b38 dev dependencies for root project (Damian Mooyman)
  • 2017-03-14 3ec5a5b03 ed upgrading path references (Ingo Schommer)
  • 2017-03-13 bd409bfd Fix PHPUNIT_COVERAGE_TEST by moving to php 5 build (Damian Mooyman)
  • 2017-03-10 d3177ef94 work-around for form property on formfields not working (Damian Mooyman)
  • 2017-03-09 cb955f08 non_virtual_fields being ignored (Mike Cochrane)
  • 2017-03-08 09d7493a4 webpack location for font files (Damian Mooyman)
  • 2017-03-07 9c9443602 Installer no longer causes recursion in yml config (Daniel Hensby)
  • 2017-03-03 263e747d0 for APCu cache otherwise you get 'Cache key must be string, "boolean" given' (Lee Bradley)
  • 2017-03-02 abe967f23 /pass arguments directly (not in array) (Andrew Aitken-Fincham)
  • 2017-03-02 b6d9b34ce Mark $instance as internal to prevent being saved to config (Damian Mooyman)
  • 2017-02-28 6ed98a3a9 Prevent obsolete class cache breaking autoload (Damian Mooyman)
  • 2017-02-28 dfe25c27 Fix allowedChildren() and link tracking (Damian Mooyman)
  • 2017-02-28 ac685e4 remove the wildcard After condition in config.yml (Christopher Joe)
  • 2017-02-28 2fafff08 history comparison fields will now show diff properly, rather than escaped html diff (Christopher Joe)
  • 2017-02-27 0c47bc3e viewer and editor groups to only show when the last option is selected (Christopher Joe)
  • 2017-02-27 badf7d3a7 Add quotes to constants in YAML to ensure syntax validity (Robbie Averill)
  • 2017-02-27 45a7fbd38 Confirm delete actions in React GridFields (e.g. Campaign admin) (Robbie Averill)
  • 2017-02-27 e64e8d151 Remove duplicated tab "active" state in Security admin (Robbie Averill)
  • 2017-02-27 cbc5aca26 add fieldgroup specific flexbox styles to the inner fields (Christopher Joe)
  • 2017-02-27 ff47bc03d Remove reference to $_SERVER within FakeController (Damian Mooyman)
  • 2017-02-27 695194546 Ensure test fixture uses test module manifest (Damian Mooyman)
  • 2017-02-26 b7123abf2 prevent unsaved changes alert when clicking a save button (Christopher Joe)
  • 2017-02-26 423b1d4ee Fix modeladmin scrollable height cropping pagination (Damian Mooyman)
  • 2017-02-26 c9e2c249 Allow pre-release versions of SS4. (Sam Minnee)
  • 2017-02-26 240c3638 Allow pre-release versions of SS4. (Sam Minnee)
  • 2017-02-26 6befcee3 issue with CI installing non-dev dependencies (Damian Mooyman)
  • 2017-02-26 3983b4d1b cache used in ModuleManifest (Damian Mooyman)
  • 2017-02-23 8b5fcd333 download file link works with the new TreeDropdown (Christopher Joe)
  • 2017-02-21 036119426 es for issues introduced in 5e19d905 (Lee Bradley)
  • 2017-02-17 f6f19908d for bug introduced in #5e19d905 (Lee Bradley)
  • 2017-02-15 a9f2e9e73 ed DateFieldSeparated docs (Ingo Schommer)
  • 2017-02-07 b8a0944bd /load fields if lazy ones exists (Andrew Aitken-Fincham)
  • 2017-02-04 e307f067e Replace deprecated %s placeholders in translations with named placeholders (Robbie Averill)
  • 2017-02-02 f63b741e4 Improve DebugView’s display of non-header information. (Sam Minnee)
  • 2017-01-30 d8fe6d02 Remap redirector and virtual page class names during build (Robbie Averill)
  • 2017-01-29 232b218df Ensure that Zend_ classes can still be autoloaded (Robbie Averill)
  • 2017-01-25 7b26b4a1f Ensure that tests run with flush=1 clean Flushables (Damian Mooyman)
  • 2017-01-25 732b1f0a Fix reference to Install_deleteinstallfiles (Damian Mooyman)
  • 2017-01-24 5d6c90361 Ensure root path of any local adapter is safely created and mapped from symlink (Damian Mooyman)
  • 2017-01-24 00de0989 Javascript .addAttr() doesn't exist (Mike Cochrane)
  • 2017-01-23 3c8a56f9 Fix missing default on _t(‘GridField.Filter’) (Damian Mooyman)
  • 2017-01-19 5e19d905f loading indicator position (fixes #6153) (Zac Pullar-Strecker)
  • 2017-01-18 b0512abf es load indicator position (fixes #1625) (Reid Hokai)
  • 2017-01-17 d192a4f86 Fix root folder getFilename() returning incorrect path (#6510) (Damian Mooyman)
  • 2017-01-16 7ad02787e Regression in CompositeField displaying fields in their holders (Robbie Averill)
  • 2017-01-16 09f967bf6 Prevent type-loss of graphql variables by using JSON.stringify (Damian Mooyman)
  • 2017-01-16 96bd4edce things not aligning well in the toolbar (Christopher Joe)
  • 2017-01-13 ccf349938 fix: calling full method name to pass attributes (Neil Gladwin)
  • 2017-01-13 c707a9120 shift graphql to use post data due to php-5.6.10+ deprecation message (Christopher Joe)
  • 2017-01-12 30d125f14 MySQLQuery::seek() failed to return a row (Loz Calver)
  • 2017-01-12 a4bc9f49d Regression in using template_main to render the Security area (Robbie Averill)
  • 2017-01-11 54c2afd01 regression issues in campaigns (Christopher Joe)
  • 2017-01-11 2d1d2aea7 Remap versioned ClassNames during build process (Robbie Averill)
  • 2017-01-11 773c848c Separate PageController fixture into its own file (PSR-2 compat) (Robbie Averill)
  • 2017-01-11 6fc50cae5 Refactor TestMailer to better be base class (Sam Minnee)
  • 2017-01-11 4e257435d Shift react breadcrumbs to use flexbox for placement (Christopher Joe)
  • 2017-01-10 62eb0e614 Rename template parser from .inc to .peg so PHP doesn't include it automatically (Robbie Averill)
  • 2017-01-10 ae2861d48 Fix frameworkpath (Damian Mooyman)
  • 2017-01-10 4ea614f04 linting issues (Damian Mooyman)
  • 2017-01-10 63cb343cf Fix modal animations (Damian Mooyman)
  • 2017-01-10 8badad90d Make sure image backends implement method getImageResource (Daniel Hensby)
  • 2017-01-10 b62f9b60a Fix broken member / group import (Damian Mooyman)
  • 2017-01-10 9959ef63 double-escaped ampersands in CMSMain_TreeView and CMSMain::LinkPageAdd (Colin Tucker)
  • 2017-01-09 87fbd5f78 for v4: Admin returns "Too many pages" for subpages below top level (#6464) (Lee Bradley)
  • 2017-01-09 cdd86aaf5 breadcrumbs search results text sometimes disappearing (Christopher Joe)
  • 2017-01-05 cf3a74ec Remove deprecation tests, bump deprecation version to 5.0 (Robbie Averill)
  • 2016-12-29 6fb49224b SSViewer should resolve templates with or without underscores (Robbie Averill)
  • 2016-12-29 d41ebbaaf Correct namespaes for test classes in upgrade.yml (Robbie Averill)
  • 2016-12-29 6f4162ed7 PHP 7.x should use random_bytes for entropy ahead of deprecated mcrypt lib (Robbie Averill)
  • 2016-12-29 7448622a1 Replace ini casting to int with explicit split and cast for PHP 7.1. Add tests. (Robbie Averill)
  • 2016-12-28 fc45e9e0 ing tests (Daniel Hensby)
  • 2016-12-23 947c1fe1 broken unit test (Christopher Joe)
  • 2016-12-23 8118448a9 PHP linting issues (Christopher Joe)
  • 2016-12-20 2d5aa7ce0 Campaign List toggle (Fixes #6067) (Will Rossiter)
  • 2016-12-20 7c76d2cb0 show formatting help not appearing (#6423) (Will Rossiter)
  • 2016-12-19 8ad030bab Make GridField filter button selector more specific (Robbie Averill)
  • 2016-12-19 fae005554 Fix missing TRAVIS_NODE_VERSION (#6419) (Damian Mooyman)
  • 2016-12-16 eb0a27406 Update links to for default template (Robbie Averill)
  • 2016-12-09 fcf1eedee getting fileSize shouldn't give a "NaN" (Christopher Joe)
  • 2016-12-04 fdb1bed0 Fix crash when installed with framework-only (Damian Mooyman)
  • 2016-11-13 00c9c2c77 Fix DataObject::dbObject assigning incorrect table to DBField instance (Damian Mooyman)
  • 2016-11-13 22cb3d0d7 various ORM test issues (Damian Mooyman)
  • 2016-11-10 804ff7c2 Fixing test errors (Daniel Hensby)
  • 2016-11-08 9dbb5c0a1 safari tabs active border (Paul Clarke)
  • 2016-11-07 aca9deed2 for safari scroll in campaign area (Paul Clarke)
  • 2016-11-07 962519c6 for safari height in main container – shows action bar (Paul Clarke)
  • 2016-11-04 f18ef75c3 Fixed crash when BASE_PATH is set by assuming the location of Constants.php (UndefinedOffset)
  • 2016-11-04 8bd5349e Fixed issue on windows where the CMS_DIR constant would be set containing a backslash causing a crash in the cms (UndefinedOffset)
  • 2016-11-04 c5fb7127 Page History 'Comparing versions' banner missing (Mike Cochrane)
  • 2016-11-03 cc451d9ca Fix crash when re-ordering pages (#6281) (Damian Mooyman)
  • 2016-11-03 eefecc21f Fix incorrect include paths in tests and railsyml (#6279) (Damian Mooyman)
  • 2016-11-02 4ee78fc29 Restore travis artifacts (#6277) (Damian Mooyman)
  • 2016-11-02 3449d5df0 Fix broken promise handling (Damian Mooyman)
  • 2016-11-02 0901de299 Fix php schema generation (Christopher Joe)
  • 2016-11-02 019e99dd4 Fix regressions from src folder creation (#6272) (Damian Mooyman)
  • 2016-11-01 51a9fdf Fix test listener path (Damian Mooyman)
  • 2016-11-01 6da36a9ed some issues with tests (Damian Mooyman)
  • 2016-11-01 c0c219e17 invalid files_path (Damian Mooyman)
  • 2016-11-01 38fdafb47 tinymce breaking in non-typical install location (Damian Mooyman)
  • 2016-10-31 81087ce15 restore CMS build as required in framework tests (Damian Mooyman)
  • 2016-10-30 4cc6cc315 position of back button on empty preview within campaigns (Paul Clarke)
  • 2016-10-30 17ef686f for History versions extending outside collapsed panel (Paul Clarke)
  • 2016-10-28 bb2cb3d48 webpack css config, removes duplicate css files that were generated (Christopher Joe)
  • 2016-10-28 7d18cda7 Test fixes needed for the new simplified test run structure. (Sam Minnee)
  • 2016-10-28 eef14c1a Fix behat tests. (Sam Minnee)
  • 2016-10-28 a5d3dccd3 for preview being under toolbar (Paul Clarke)
  • 2016-10-28 d7ed308e1 Fix minor html encoding issue in SecurityAdmin (#6240) (Damian Mooyman)
  • 2016-10-28 1df533298 abstract HTMLEditorConfig instantiates (#6244) (Michael Strong)
  • 2016-10-27 d0619c1f for double scroll in history area (Paul Clarke)
  • 2016-10-27 e386c6a15 Refactor bootstrap.php to allow for code sharing with cms bootstrap (Damian Mooyman)
  • 2016-10-27 c4d748cb Fix firefox compatibility (Damian Mooyman)
  • 2016-10-26 02bac8c4b Fix missing loading overlay (Damian Mooyman)
  • 2016-10-26 42096bb41 Prevent pagination wrapping (Damian Mooyman)
  • 2016-10-26 f7fd4ffae Fix incorrect change detection on checkbox fields (Damian Mooyman)
  • 2016-10-26 4bf4fca4 Prevent archived pages from having add to campaign action (Damian Mooyman)
  • 2016-10-26 040ae2e6a Fix clicking "No items found" from causing ajax error (Damian Mooyman)
  • 2016-10-26 513c7aebc HtmlEditorField.js indentation (Damian Mooyman)
  • 2016-10-26 015411307 Require php7 support. (Sam Minnee)
  • 2016-10-26 424008cf Fix installer for 4.0 (#1644) (Damian Mooyman)
  • 2016-10-26 c80417a94 Fix ViewableData::__isset() for getXXX() getters. (Sam Minnee)
  • 2016-10-26 7b44fc7bc Fix SSViewerTest in PHP7 (Sam Minnee)
  • 2016-10-26 e5550dd6 Fix search not respecting view mode (Damian Mooyman)
  • 2016-10-26 a0d31e86d helperPath in _register_database.php (David Alexander)
  • 2016-10-25 75b18509 Remove reference to Object class. (#1634) (Sam Minnée)
  • 2016-10-24 d946a3b2 Allow CMS_DIR at the root. (Sam Minnee)
  • 2016-10-24 e83f3962a Prevent intermittent "Element is not currently visible and so may not be interacted with" (Damian Mooyman)
  • 2016-10-17 84c0df3db double forward slash link in campaign admin (Christopher Joe)
  • 2016-10-13 0ebde90dd flexbox 'fill-height' overflowing container (Loz Calver)
  • 2016-10-12 5df58057 double nested alert message (Christopher Joe)
  • 2016-10-11 72fd3b949 linting issues (Damian Mooyman)
  • 2016-10-11 5a5d62fa2 profile layout (Christopher Joe)
  • 2016-10-11 20cee7358 pages background (Damian Mooyman)
  • 2016-10-11 7b36df286 split mode disappearing as an option (Christopher Joe)
  • 2016-10-11 26e0ff806 Fix installer for 4.0 (Damian Mooyman)
  • 2016-10-10 712849c7 page form layout (Christopher Joe)
  • 2016-10-09 7acb3b5fc selected view mode not reflected on button (Christopher Joe)
  • 2016-10-07 89150c48e preview in pages section (Christopher Joe)
  • 2016-10-06 21dc23868 ed classes that weren't matching icon (Christopher Joe)
  • 2016-10-02 ebbb0258d linting issue (Damian Mooyman)
  • 2016-09-30 963445e74 tab link on top panel changes even when "cancel to browse" was selected (Christopher Joe)
  • 2016-09-30 dd7d1d26a Prevent missing records crashing ChangeSetItem (Damian Mooyman)
  • 2016-09-29 30d161625 unmock qs module, Backend-test refactored to not time out on error (Christopher Joe)
  • 2016-09-27 fe0ca63c Remove referencies to Object::$class (Sam Minnee)
  • 2016-09-27 11888a00 Remove references to Object::$class (Sam Minnee)
  • 2016-09-26 ad79b5c88 ing bad folder caseing (Daniel Hensby)
  • 2016-09-26 ce91c3820 IX: Fix regression causing the admin to crash on windows due to FRAMEWORK_DIR being prefixed by a backslash (UndefinedOffset)
  • 2016-09-26 9cb33ea5b ed @covers namespaces (Ingo Schommer)
  • 2016-09-23 cbe0ac850 Fix invalid import form requirements (#6071) (Damian Mooyman)
  • 2016-09-23 ffe85db3 Fix incorrect search form (Damian Mooyman)
  • 2016-09-22 c52adad1f Graceful degradation if obsolete classnames in ChangeSetItem (fixes #6065) (Sam Minnee)
  • 2016-09-22 aa7a9565c Fix incorrect ssviewertest path (#6060) (Damian Mooyman)
  • 2016-09-22 4301fa8 Fix incorrect backslash escaping in htaccess template (#140) (Damian Mooyman)
  • 2016-09-22 65ff0a4d3 Fix incorrect backslash escaping in htaccess template (Damian Mooyman)
  • 2016-09-22 4b2c6b05 Break dist javascript and onto newlines. (Ingo Schommer)
  • 2016-09-22 9a9cd97bc Fix invalid file uploads not being validated (Damian Mooyman)
  • 2016-09-21 c24201b5f Break dist javascript and onto newlines. (Sam Minnee)
  • 2016-09-21 51ef36963 stringify api call body to work for IE10 (#6032) (Chris Joe)
  • 2016-09-20 4d52d655f for spacing of sitetree panel, reportAdmin, and toggle on Member details page (#5955) (Paul)
  • 2016-09-20 2e054af7b Throw more helpful error if tests are run badly. (Sam Minnee)
  • 2016-09-20 3ea23ce2b Make PR builds work. (Sam Minnee)
  • 2016-09-20 53f251e4 fix incorrect CMSTabSet reference (Damian Mooyman)
  • 2016-09-20 18939157 Fix pages level up link (Damian Mooyman)
  • 2016-09-19 ef88619d2 Fix error in campaign area (Damian Mooyman)
  • 2016-09-19 82e72d062 prevent form data / validation persisting in state when using form schema (Damian Mooyman)
  • 2016-09-17 b61c5a56d sass-lint styleguide fixes (Sam Minnee)
  • 2016-09-15 30174db45 i18n JS regression about locale selection (Ingo Schommer)
  • 2016-09-15 cd3ae42c ed jquery.js path (Ingo Schommer)
  • 2016-09-14 5415afe8b ed react-bootstrap tabs warnings (Ingo Schommer)
  • 2016-09-14 abaebbe1d Manually fix issue in jquery-ui 1.9 (Damian Mooyman)
  • 2016-09-12 61d7c3af2 Fix tests when running directly from framework. (Sam Minnee)
  • 2016-09-12 6b640f81f Don’t double-include composer autoloader (Sam Minnee)
  • 2016-09-12 93a0122c0 Don’t treat URLs as root relative when FRAMEWORK_DIR = “” (Sam Minnee)
  • 2016-09-10 701c700d4 ed UploadField JS dependencies (Ingo Schommer)
  • 2016-09-10 68c6137f2 GroupedDropdownField include namespace (Ingo Schommer)
  • 2016-09-09 5a786624a Remove unnecessary manual includes (Sam Minnee)
  • 2016-09-09 dbf78243 in wrong location (fixes #1607) (Loz Calver)
  • 2016-09-08 a12d52a1 Fix some namespace class errors (Damian Mooyman)
  • 2016-09-08 d4de776a4 fix core include (Damian Mooyman)
  • 2016-09-08 d2229ce8a Fix issue with Folder::validate() failing on allowed_extensions (Damian Mooyman)
  • 2016-09-08 eaac95724 case of required paths (Damian Mooyman)
  • 2016-09-08 77d167730 issue with core/Core.php includes (Damian Mooyman)
  • 2016-09-06 f7f1cf0e8 SingleSelectField readonly view (Ingo Schommer)
  • 2016-09-06 b53ce4c19 Button loading indicator (Ingo Schommer)
  • 2016-09-05 9c48b939 Ensure changes in class write to an instance of the new class, not the old one (Damian Mooyman)
  • 2016-09-04 cbdf3eb72 Show formatting help toggle link (Robbie Averill)
  • 2016-09-01 c9d964ff0 HTMLEditorField image reference (Ingo Schommer)
  • 2016-09-01 ecaed8c08 ed icon regression in <Breadcrumb> (Ingo Schommer)
  • 2016-08-30 fa5e6bbd6 ed breadcrumb icon spacing (Ingo Schommer)
  • 2016-08-29 a6f1fa3 use 1.0.x-dev for asset-admin composer constraint (Robbie Averill)
  • 2016-08-28 b509f9199 Modal response positioning (Christopher Joe)
  • 2016-08-26 1b527fca3 Webpack handles images & fonts. (Sam Minnee)
  • 2016-08-23 b77d21c25 pages add to campaign, improved FormActions error handling, Popover focus highlight and refactored AddToCampaignModal to FormBuilderModal (Christopher Joe)
  • 2016-08-23 c411c500 for pages admin add to campaign modal (Christopher Joe)
  • 2016-08-21 a6049ec38 Use chosen from npm package. (Sam Minnee)
  • 2016-08-21 beef8fa0 Switch gulp JavaScript generation to Webpack (Sam Minnee)
  • 2016-08-19 a49456df2 for batch actions not postponed under toolbar on open/close (Paul Clarke)
  • 2016-08-18 5c2e8d129 form attr merging order (Ingo Schommer)
  • 2016-08-17 a9bdf33ca SingleSelect styling, added add to campaign documentation (Christopher Joe)
  • 2016-08-12 b4435027 issues with templates (Damian Mooyman)
  • 2016-08-11 ed7fe6515 Fix usage of $this as closure argument (Damian Mooyman)
  • 2016-08-11 041d1212 regressions from namespacing (Damian Mooyman)
  • 2016-08-10 59efd280a issues with CMS permission codes (Damian Mooyman)
  • 2016-08-05 7026da20d Make template lookup use 'type' correctly (Damian Mooyman)
  • 2016-08-04 01a13dcba Fix incorrect use of baseClass as baseTable (Damian Mooyman)
  • 2016-08-02 7448fb7ba batch action permissions not applied to new nodes loaded (Christopher Joe)
  • 2016-08-01 ab60850a Fix incorrect route registration order (Damian Mooyman)
  • 2016-08-01 7c151321 Fix issue with old asset-admin repeating "level up" button (Damian Mooyman)
  • 2016-08-01 12adba3d3 Fix [buttons] appearing instead of actual buttons when uploading files (Damian Mooyman)
  • 2016-08-01 9d31bb05 Fix broken form actions on parent and nested gridfields (Damian Mooyman)
  • 2016-07-29 06ae50e4f Fix hash link navigation in CMS (Damian Mooyman)
  • 2016-07-28 c54b8b5a link formatting (Damian Mooyman)
  • 2016-07-28 d2142f25 psr-2 formatting (Damian Mooyman)
  • 2016-07-28 4d2fd04c6 Behat preview mode finder being too specific (#5846) (Hamish Friedlander)
  • 2016-07-28 d15b19d20 merge regressions in add-link fixes (Damian Mooyman)
  • 2016-07-28 a868ecdbf Correct include paths for legacy JS files (Damian Mooyman)
  • 2016-07-28 1f8c2f781 "Insert Link" dialog in HTMLEditorField. CSS still needs work. (Hamish Friedlander)
  • 2016-07-28 6e74b57c3 Fix issue with gulpfile.js not compiling client/src/legacy dir (Damian Mooyman)
  • 2016-07-26 d7fa0026 field casting (Damian Mooyman)
  • 2016-07-25 f9b487258 Remap obsolete ClassName values. (Sam Minnee)
  • 2016-07-21 7c2470380 Fix regressions in custom admin url from #3274 (Damian Mooyman)
  • 2016-07-18 761cbf0d Use new admin_url (Daniel Hensby)
  • 2016-07-18 0a7437db Allow changing admin URLs (Daniel Hensby)
  • 2016-07-18 b89fcfa18 Fix regression with uploadfield casting (Damian Mooyman)
  • 2016-07-15 0f950800 wrongly named themes after themestack API change (#1548) (Hamish Friedlander)
  • 2016-07-14 2d47fed7 ReportAdmin::Link() not returning correct home url (#38) (Damian Mooyman)
  • 2016-07-14 83c2af72c Fix some regressions from #5653 (#5806) (Damian Mooyman)
  • 2016-07-13 f8b1c27e Fix regressions from (Damian Mooyman)
  • 2016-07-13 fb6f8a0a0 Fix Security page showing double escaped HTML (Damian Mooyman)
  • 2016-07-13 e78bf010b Fix augmentWriteVersioned (Damian Mooyman)
  • 2016-07-13 7d82304bb Fix route invoking multiple handleStateChanges on single navigation actions (Damian Mooyman)
  • 2016-07-06 dfe375e87 MemberDatetime helper description, and shifted them to templates (#5766) (Chris Joe)
  • 2016-07-06 59d4b51d Fix missing tabs layout in pages view (Damian Mooyman)
  • 2016-07-04 1931ed497 unit test for xml content check (Christopher Joe)
  • 2016-07-04 4a22c2bd7 Revert incorrect class rename (#5765) (Damian Mooyman)
  • 2016-07-01 efef02502 Fix missing use statements (Damian Mooyman)
  • 2016-06-30 06623537c Don't hard-code folder into treedropdownfield search hint (Damian Mooyman)
  • 2016-06-30 abda4dc2 Restore SiteTree::canPublish method to resolve incorrect fallback to SiteTreeExtension (Damian Mooyman)
  • 2016-06-24 6d835a64a Saving null values to the _versions table. (Frank Mullenger)
  • 2016-06-22 e0c829f47 es issue 5188: X-Forwarded Proto (Ian Walls)
  • 2016-06-17 6a7c1056f Fix shortcode parsing in HTMLEditorField::getanchors() (Damian Mooyman)
  • 2016-06-17 009f2de17 Fix incorrect enum string parsing (Damian Mooyman)
  • 2016-06-03 a0213aa2b Fix HTTP url rewriting (Damian Mooyman)
  • 2016-05-27 5cace7c69 ed javascript/ docs references (#5599) (Ingo Schommer)
  • 2016-05-23 092c8986 Query string not built properly (Daniel Hensby)
  • 2016-05-23 88321f5d5 CleanupTestDatabasesTask permission failure response (Loz Calver)
  • 2016-05-23 ad213b35 Fix rollback page crash (Damian Mooyman)
  • 2016-05-23 0f646ba3 undefined index error (Damian Mooyman)
  • 2016-05-20 90397c94 fix missing install image (Damian Mooyman)
  • 2016-05-12 a61d0a2f0 Persistent Loading... indicator when no campaigns yet in admin (Hamish Friedlander)
  • 2016-05-12 73939958 preview in Asset Admin (Hamish Friedlander)
  • 2016-05-09 1263bf8a Not being able to save when viewing page settings (Hamish Friedlander)
  • 2016-05-09 2af63a84 add_i18n_javascript calls not being updated after JS move (Hamish Friedlander)
  • 2016-05-09 b2786c228 add_i18n_javascript calls not being updated after JS move (Hamish Friedlander)
  • 2016-05-06 0b295137c unguarded JS check in LeftAndMain.Preview.js (Ingo Schommer)
  • 2016-05-06 83d70c441 es font used for add page steps and alignment (Paul Clarke)
  • 2016-05-06 261ca9378 es campaign thumbnail left alignment issue (Paul Clarke)
  • 2016-05-05 b4cd617ee Renaming to HTMLEditorConfig. (Frank Mullenger)
  • 2016-05-05 9ba362065 loading icon bug on IE (Scott Hutchinson)
  • 2016-05-05 c251fab9a ed more SCSSLint errors, disabled some files (Ingo Schommer)
  • 2016-05-04 e04fb5b98 es missing actions on responsive gridfield, cleanup indentation (#5446) (Paul)
  • 2016-05-04 4b8e98b35 for scss linting issues in new scss (#5448) (Paul)
  • 2016-05-02 f88d708ee Fix GridFieldAddExistingAutocompleter and GridFieldExportButton (Damian Mooyman)
  • 2016-05-01 e7d5c92ec merge regressions (Damian Mooyman)
  • 2016-05-01 8d2f063f0 eslint errors (#5411) (Damian Mooyman)
  • 2016-04-29 baa3d4e7d trailing spaces on merge (Damian Mooyman)
  • 2016-04-26 cb723a684 ed docs wording (Ingo Schommer)
  • 2016-04-26 fc8d94d78 for toolbar-south width (#5391) (Paul)
  • 2016-04-26 43f2680af Fix missing return in ReadonlyField (Damian Mooyman)
  • 2016-04-26 778ed1257 campaign section cancel buttons (David Craig)
  • 2016-04-25 7e7946e50 ed case sensitive naming regressions (David Craig)
  • 2016-04-25 c66a45c8b ed GridField JS test warnings (Ingo Schommer)
  • 2016-04-22 9a4b93a05 Fix baseurl in IE missing leading / (Damian Mooyman)
  • 2016-04-22 2f7a7c3a5 GridFieldComponent not rendering all records (David Craig)
  • 2016-04-21 fa8075367 Fix routing tests (Damian Mooyman)
  • 2016-04-21 85fb0803 font-icon regression on tree view (David Craig)
  • 2016-04-21 d376944d4 regression with font-icon styles (David Craig)
  • 2016-04-21 8c63ae3d6 AssetAdmin icon reference (Ingo Schommer)
  • 2016-04-21 b2e8fd96e Fix form schema to use correct ID values (Damian Mooyman)
  • 2016-04-20 95e441528 for IE, added ability to adjust panel height based on the amount of toolbars (Paul Clarke)
  • 2016-04-20 8cf38720b Chosen.js selector for Behat feature (Ingo Schommer)
  • 2016-04-19 a7e5da822 for height (Paul Clarke)
  • 2016-04-19 0bd62735b Fix issue with Requirements mangling custom scripts (#5337) (Damian Mooyman)
  • 2016-04-19 ddfe660f0 variable references when debugging (David Craig)
  • 2016-04-19 6ccfbb7c5 ed breadcrumbs test (Ingo Schommer)
  • 2016-04-19 47ca88956 for Add campaign button spacing (Paul Clarke)
  • 2016-04-17 90e352ca7 "urlencoded" HTTP header notation (Ingo Schommer)
  • 2016-04-15 9a5db5f76 ChangeSet test mixing Object ID and ChangeSetItem ID up (Hamish Friedlander)
  • 2016-04-13 7e37abeb Fix chosen dropdown on settings being cropped (Damian Mooyman)
  • 2016-04-13 5f2edb4e9 ESLint issues, shrinkwrap, and missing image (Damian Mooyman)
  • 2016-04-12 f7237a993 <FormAction> external and prop definition (Ingo Schommer)
  • 2016-04-12 2983dd58f admin area after upgrade to Chosen 1.5 (Hamish Friedlander)
  • 2016-04-11 5d29d3011 ed silverstripe-backend GET use regression (Ingo Schommer)
  • 2016-04-11 d7eed8fe8 gulpfile.js ESLint syntax (Ingo Schommer)
  • 2016-04-11 cc897d0f8 for add page steps and 1px out in southbar (Paul Clarke)
  • 2016-04-10 ce8ac58dd React DOM warnings about <form> attrs (Ingo Schommer)
  • 2016-04-07 0aec89d0c for #5279 Addressing only a few PSR-2 items in one file, but primarily targeting Director::is_https() and invalid URL's. (Patrick Nelson)
  • 2016-04-05 7337f26d3 non-standard url encoding in CMS search form (Ingo Schommer)
  • 2016-04-05 5a86f4232 Fix error when using search bar (Damian Mooyman)
  • 2016-04-04 c4a97207 IE support by using babelify transforms (Ingo Schommer)
  • 2016-04-04 0fadd7a15 IE compat through babelify (Ingo Schommer)
  • 2016-04-03 640691f54 fix missing language on non-global configs (Damian Mooyman)
  • 2016-03-31 d8d005d1e move test file to correct folder and fix class_exists (Damian Mooyman)
  • 2016-03-31 e8a68c42c Prevent live manifest loading files from nested test directories (Damian Mooyman)
  • 2016-03-30 c69e55c49 Fix issue with SapphireTest::assertDOSEquals incorrectly passing on empty set (Damian Mooyman)
  • 2016-03-22 46b35ecb Changes to support php7 and new DBFields (Sam Minnee)
  • 2016-03-21 8ae289489 form schema ID getter (Ingo Schommer)
  • 2016-03-16 6b1444709 menu dropdown icon (scott1702)
  • 2016-03-15 d4ad1504a bottom toolbar height (David Craig)
  • 2016-03-13 7769f03cc Remove duplicate extension hook (Damian Mooyman)
  • 2016-03-09 e2a377e21 Fix CleanupTestDatabaseTask (Damian Mooyman)
  • 2016-03-09 3673a5e14 Inserting a 'Download a file' without selecting an image (Mike Cochrane)
  • 2016-03-09 0b81bbef2 attempt to access https iframe from http interface (Mike Cochrane)
  • 2016-03-09 a3ee9ece9 avoid javascript error when preview is https (Mike Cochrane)
  • 2016-03-09 70062ebc 'Settings' fields being overwritten by 'Content' fields (Mike Cochrane)
  • 2016-03-06 3d99ed24a Better filtering of versionable tables during SQL augmentation (Damian Mooyman)
  • 2016-03-06 627fbf905 ed merge regression (Ingo Schommer)
  • 2016-03-03 4b5bd2d74 cleaner can* methods for Member (Nicolaas)
  • 2016-03-02 8eede847c i18n.sprintf() parameters being off by one (Mike Cochrane)
  • 2016-03-01 3317d3427 Prevent fatal errors during test failure halt tests (Damian Mooyman)
  • 2016-02-26 40723aaa5 undeclared variable in UploadField.js (David Craig)
  • 2016-02-24 beba0f25 Fix behat tests for asset abstraction (Damian Mooyman)
  • 2016-02-23 0ee156489 Fix deprecated API usage in DataFormatter API and DataObjectTest (Damian Mooyman)
  • 2016-02-19 7580d35be ability to edit files immediately after upload (scott1702)
  • 2016-01-25 d031f53e incorrect version dependency (Damian Mooyman)
  • 2016-01-21 8872ed51 Fix broken travis yml (Damian Mooyman)
  • 2016-01-21 6cebffd89 Fix SSViewerTest not restoring old requirements (Damian Mooyman)
  • 2016-01-05 45dc510da ing typo (Peter Thaleikis)
  • 2015-12-22 b6627a2f7 Change Requirements::include_in_response() to not add empty (Jacob Buck)
  • 2015-12-15 31888735b Fix incorrect error page handling (Damian Mooyman)
  • 2015-12-02 ed76b3f5 Fix yml and behat (Damian Mooyman)
  • 2015-12-02 387eb227 Fix CI (Damian Mooyman)
  • 2015-12-02 d0ee35c5 composer dependencies (scott1702)
  • 2015-11-12 03169a429 typo (Nabil Kadimi)
  • 2015-10-22 fe3d23f0d Fix GeneratedAssetHandler crashing on expired resources (Damian Mooyman)
  • 2015-10-19 d7dcb41b Remove tab - invalid YAML (Loz Calver)
  • 2015-10-18 c8a0347b7 Monolog constant use (Ingo Schommer)
  • 2015-10-15 27a8afe78 Fix regressions in fulltextsearch (Damian Mooyman)
  • 2015-10-14 d884c859d Fix file link tracking for new asset abstraction (Damian Mooyman)
  • 2015-10-06 c13dfc2fa ing phpdoc blocks to referring to Objects to built-in types of PHP (Peter Thaleikis)
  • 2015-09-28 1f632a10c Replace direct reference to $_REQUEST['url'] with request object getter (Damian Mooyman)
  • 2015-09-28 8e3f549b Fix regressions in CMS from db field changes (Damian Mooyman)
  • 2015-09-09 60e75cbd travis php version back to 5.4 (Damian Mooyman)
  • 2015-09-09 143e4eae5 travis php version back to 5.4 (Damian Mooyman)
  • 2015-09-09 812b5ecb6 merge regressions (Damian Mooyman)
  • 2015-09-04 fa8702f0c Fix reference to missing Debug::loadErrorHandlers() (Damian Mooyman)
  • 2015-08-28 f5af0c85b Don’t use SplFixedArray in PHP 7. (Sam Minnee)
  • 2015-08-27 8518fc142 Clarify PHP7-incompatible call styles. (Sam Minnee)
  • 2015-08-27 083799ec0 Minimal data-model changes to support PHP7. (Sam Minnee)
  • 2015-08-27 12a83d70a Removed PHP4 syntax from Diff.php (Sam Minnee)
  • 2015-08-27 680b19a1d Correct PHP4-style constructors in SimpleTest. (Sam Minnee)
  • 2015-08-25 5fa3c8528 for #4417: Ensuring ->removeValidation() is defined on instances of Validator. Setup new API for enabling/disabling validation. Documentation and better type handling. (Patrick Nelson)
  • 2015-08-17 bf6a84bd ing behat regression (Daniel Hensby)
  • 2015-08-14 e13aebc3d for #4502 Prevents JSON.parse() from scrambling sorted results from server-side. (Patrick Nelson)
  • 2015-08-04 053c47499 datefield to work with other form markup (hex0id)
  • 2015-04-28 cadc02b63 for #4129: Ensure belongsToComponent() and hasManyComponent() methods return null instead of false, to be consistent with other relation component methods. (Patrick Nelson)
  • 2015-04-28 512b3db0 Fix SiteTree / SiteConfig permissions (Ingo Schommer)
  • 2015-03-10 622ad54c5 Fix yaml generation to conform to version 1.1, accepted by transifex (Damian Mooyman)
  • 2015-02-23 e04e992c es relating to Controller cleanup (Daniel Hensby)
  • 2015-02-12 83db2f2d3 ed "Removed DataObject::$allowed_actions #3880" on master (Aden Fraser)
  • 2015-02-11 0223b6164 ed " Image_Backend interface constructor needs updating (master) #3477 " on both the Image_Backend Model and Imagick_Backend filesystem class (Aden Fraser)
  • 2014-12-15 1f7e627a5 How to folder on forms (Cam Findlay)
  • 2014-12-10 6ff6c6f5 Removed multifile thirdparty library which isn't used any more in ss. (micmania1)
  • 2014-12-08 ddd83304c Feedback to name the fields section to "field types" to make it clearer what the section is about. (Cam Findlay)
  • 2014-12-08 1f181a65c use GFMD code blocks to fix code formatting consistency. (Cam Findlay)
  • 2014-12-04 00e029f57 check for suite existence in endCurrentTest (Will Morgan)
  • 2014-11-20 6ace5641 dependency on framework master branch (Damian Mooyman)
  • 2014-06-02 e732aee6e es #3182 Fixes lazy loading of fields when query was created in default stage (Craig Weber)