# 3.0.0 (unreleased) # ## Overview ## * New template engine * New CMS interface design * "Page Content" and "Page Settings" are split into two interfaces * Image/Link insertion moved into a modal dialog instead of a sidebar * "Add pages" dropdown moved to a more descriptive modal dialog * Allow usage of "sapphire" framework without the "cms" module * CMS JavaScript moved to [jQuery.entwine](https://github.com/hafriedlander/jquery.entwine) * CMS stylesheets are generated by SCSS to provide more flexible and robust styling ## Upgrading ## ### GridField: Replacement for TableListField and ComplexTableField ### We have a new component for managing lists of objects: The `[GridField](/topics/grid-field)`. It's a substantial rewrite of the features previously captured by `TableListField`, `ComplexTableField`, `HasManyComplexTableField` and `ManyManyComplexTableField`. The legacy fields remain operational for now, although a switch to `GridField` is strongly encouraged, for stability, interface and performance reasons. The `HasManyComplexTableField` and `ManyManyComplexTableField` are no longer maintained, for those you do have to make the switch. Upgrade example: Record listing :::php // before $field = new TableListField('Companies', 'Company'); $field->setPageSize(20); // after $field = new GridField('Companies', null, DataList::create('Company')); $field->getConfig()->getComponentByType('GridFieldPaginator')->setItemsPerPage(20); Upgrade example: Record listing with view/edit interface :::php // before $field = new ComplexTableField($myController, 'Companies', 'Company'); // after $field = new GridField('Companies', null, DataList::create('Company'), GridFieldConfig_RecordEditor::create()); Upgrade example: Relationship editing :::php // before $field = new HasManyComplexTableField($myController, 'MyRelation', 'MyRelationObject'); // after $field = new GridField('MyRelation', null, $myRecord->MyRelation(), GridFieldConfig_RelationEditor::create()); More information is available in the [GridField documentation](/topics/grid-field). ### New template engine ### The template engine has been completely rewritten, and although it is generally backward compatible, there are new features and some features have been deprecated. See the [template upgrading guide](/reference/templates-upgrading-guide) and the [template reference](/reference/templates) for more information. #### Removed view-specific accessors from ViewableData #### Several methods in ViewableData that were originally added to expose values to the template language were moved, in order to stop polluting the namespace. These were sometimes called by project-specific PHP code too, and that code will need re-working. See the [template upgrading guide](/reference/templates-upgrading-guide) for a list of methods and their replacements. ### New user interface for CMS ### Most aspects of the interface have been redesigned, which necessitated a substantial redevelopment of the underlying logic and presentation. If you have customized the admin interface in any way, please review the detailed changelog for this release. Many interface components have changed completely, unfortunately there is no clear upgrade path for every interface detail. As a starting point, have a look at the new templates in `cms/templates` and `sapphire/admin/templates`, as well as the new [jQuery.entwine](https://github.com/hafriedlander/jquery.entwine) based JavaScript logic. Have a look at the new ["Extending the CMS" guide](../howto/extending-the-cms), ["CSS" guide](../topics/css), ["JavaScript" guide](../topics/javascript) and ["CMS Architecture" guide](/reference/cms-architecture) to get you started. ### New tree library ### The page tree moved from a bespoke tree library to [JSTree](http://jstree.com), which required changes to markup of the tree and its JavaScript architecture. This includes changes to `TreeDropdownField` and `TreeMultiSelectField`. ### Settings-related fields move from `SiteTree->getCMSFields()` to new `SiteTree->getSettingsFields()` ### The fields and tabs are now split into two separate forms, which required a structural change to the underlying class logic. In case you have added or removed fields in the "Behaviour" or "Access" tab, please move these customizations to a new `getSettingsFields()` method. In case of SiteTree extension through `updateCMSFields()` and a decorator/extension, please use the new `updateSettingsFields()` instead. ### New `SiteTree::$description` field to describe purpose of a page type ### Please use this static property to describe the purpose of your page types, which will help users understand the new "Add page" dialog. For example, a `TeamPage` type could be described as "Lists all team members, linking to their profiles". Note: This property is optional (defaults to an empty string), but its usage is highly encouraged. ### New ModelAdmin interface, removed sub-controllers ModelAdmin has been substanially rewritten to natively support the `[api:GridField]` API for more flexible data presentation (replacing `[api:ComplexTableField]`), and the `[api:DataList]` API for more expressive querying. If you have overwritten any methods in the class, customized templates, or implemented your own `$collection_controller_class`/`$record_controller_class` controllers, please refer to the new [ModelAdmin documentation](/reference/modeladmin) on details for how to achieve the same goals in the new class. ### Stylesheet preprocessing via SCSS and the "compass" module ### CSS files in the `cms` and `sapphire/admin` modules are now generated through the ["compass" SilverStripe module](http://silverstripe.org/compass-module), which uses the ["Compass" framework](http://compass-style.org/) and the ["SCSS" language](http://sass-lang.com/). This allows us to build more flexible and expressive stylesheets as a foundation for any extensions to the CMS interface. The "compass" module is only required if core stylesheets are modified, not when simply using the CMS or developing other CMS functionality. If you want to extend the CMS stylesheets for your own projects without SCSS, please create a new CSS file and link it into the CMS via `[api:LeftAndMain::require_css()]`. ### Built-in Javascript validation removed ### Built-in client-side form validation using behaviour.js has been removed, and is no longer supported. Server-side validation remains. Developers are encouraged to use custom Javascript validation on their forms if requiring client-side validation. These classes/files have been removed: Validator.js CustomRequiredFields.php These functions are now deprecated and will throw a notice if used: Validator::set_javascript_validation_handler() Validator::get_javascript_validator_handler() Validator::setJavascriptValidationHandler() These functions have been removed: Validator::javascript() (abstract function) Validator::includeJavascriptValidation() FormField::jsValidation() AjaxUniqueTextField::jsValidation() ConfirmedPasswordField::jsValidation() CreditCardField::jsValidation() CurrencyField::jsValidation() CustomRequiredFields::javascript() DateField::jsValidation() DatetimeField::jsValidation() EmailField::jsValidation() FieldGroup::jsValidation() FormField::jsValidation() NumericField::jsValidation() PhoneNumberField::jsValidation() RequiredFields::javascript() TableField::jsValidation() TimeField::jsValidation() ### FormField consistently adds classes to HTML elements ### The [api:FormField] API has been refactored to use SilverStripe templates for constructing the field HTML, as well as new accessors for HTML attributes. This change makes the HTML a bit more predictable, but it also means that you need to check any code (CSS, JavaScript, etc) relying on the old inconsistencies. Particularly, CSS class names applied through [api:FormField->addExtraClass()] and the "type" class are now consistently added to the container `