Merge remote-tracking branch 'origin/4.0' into 4

This commit is contained in:
Damian Mooyman 2017-10-25 16:59:19 +13:00
commit 29af6dbafd
No known key found for this signature in database
GPG Key ID: 78B823A10DE27D1A
20 changed files with 3080 additions and 1424 deletions

View File

@ -953,3 +953,421 @@ excludedPaths:
- '*vendor*'
doctorTasks:
SilverStripe\Dev\Upgrade\UpgradeBootstrap: src/Dev/Upgrade/UpgradeBootstrap.php
warnings:
classes:
'Object':
message: 'Replaced with traits'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#object-replace'
'SS_Log':
message: 'Replaced with a PSR-3 logger'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#psr3-logging'
'Session':
message: 'Session is no longer statically accessible'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#session'
'SQLQuery':
message: 'Use SQLSelect instead'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#sqlquery'
'CompositeDBField':
message: 'Class has been replaced with an abstract DBComposite'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#compositedbfield'
'BuildTask':
message: 'Now needs a $segment property to run it'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#buildtask-segment'
'RestfulService':
message: 'Removed from core, please use Guzzle'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#restfulservice'
'Oembed':
message: 'Removed from core, please use third party lib'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#oembed'
'SS_Cache':
message: 'Using symfony/cache now'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#cache'
'LeftAndMain_TreeNode':
message: 'Renamed to CMSMain_TreeNode'
'HTMLEditorField_Toolbar':
message: 'replaced With SilverStripe\Admin\ModalController'
'HTMLEditorField_Embed':
message: 'replaced with SilverStripe\AssetAdmin\Model\EmbedResource'
'HTMLEditorField_File':
message: 'Removed'
'HTMLEditorField_Flash':
message: 'Removed'
'HTMLEditorField_Image':
message: 'Removed'
'DateField_View_JQuery':
message: 'replaced with native HTML5 support in DateField'
'MemberDatetimeOptionsetField':
message: 'Removed'
'NumericField_Readonly':
message: 'Use NumericField->setReadonly(true) instead'
'SilverStripe\ORM\ValidationException':
message: '$message second constructor parameter is removed. Constructor only accepts $result, which may be a string, and optional $code'
'SilverStripe\Forms\HeaderField':
message: 'Requires an explicit $name constructor argument (in addition to $title)'
'Folder_UnusedAssetsField':
message: 'Removed'
'Image_Cached':
message: 'Removed'
'CMSFileAddController':
message: 'Removed'
'CMSBatchAction_Delete':
message: 'Use SilverStripe\CMS\BatchActions\CMSBatchAction_Archive instead'
'EncryptAllPasswordsTask':
message: 'Removed'
methods:
'setFilename()':
message: 'Filenames should not be set directly any more'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#write-file-dataobject'
'SilverStripe\Assets\File::handle_shortcode()':
message: 'Has been removed'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#file-shortcode'
'database_fields()':
message: 'Does not have a second parameter any more'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#dataobject-db-database-fields'
'SilverStripe\Security\Authenticator::register()':
message: 'Custom authenticators work differently now'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#custom-authenticators'
'Object::useCustomClass()':
message: 'Use injector instead'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#custom-authenticators'
'SilverStripe\Control\Director::setUrlParams()':
message: 'Method removed'
'manyManyComponent()':
message: 'DataObject->manyManyComponent() moved to DataObjectSchema, access through getSchema()'
'belongsToComponent()':
message: 'DataObject->belongsToComponent() moved to DataObjectSchema, access through getSchema()'
'hasOneComponent()':
message: 'DataObject->hasOneComponent() moved to DataObjectSchema, access through getSchema()'
'hasManyComponent()':
message: 'DataObject->hasManyComponent() moved to DataObjectSchema, access through getSchema()'
'getRemoteJoinField()':
message: 'DataObject->getRemoteJoinField() moved to DataObjectSchema, access through getSchema()'
'has_own_table()':
message: 'DataObject::has_own_table() moved to DataObjectSchema->classHasTable(), access through getSchema()'
'database_fields()':
message: 'DataObject::database_fields() moved to DataObjectSchema->databaseFields(), access through getSchema()'
'database_fields()':
message: 'DataObject::database_fields() moved to DataObjectSchema->databaseFields(), access through getSchema()'
'manyManyExtraFieldsForComponent()':
message: 'DataObject::manyManyExtraFieldsForComponent() moved to DataObjectSchema, access through getSchema()'
'validateModelDefinitions()':
message: 'Removed DataObject->validateModelDefinitions()'
'hasOwnTableDatabaseField()':
message: 'DataObject->hasOwnTableDatabaseField() has been replaced with DataObjectSchema::fieldSpec(), access through getSchema()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#dataobject-has-own'
'has_own_table_database_field()':
message: 'DataObject::has_own_table_database_field() has been replaced with DataObjectSchema::fieldSpec(), access through getSchema()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#dataobject-has-own'
'hasDatabaseFields()':
message: 'DataObject->hasDatabaseFields() has been replaced with DataObjectSchema::fieldSpec(), access through getSchema()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#dataobject-has-own'
'is_composite_field()':
message: 'Removed DataObject::is_composite_field. Use DataObjectSchema::compositeField instead.'
'custom_database_fields()':
message: 'Removed DataObject::custom_database_fields. Use DataObjectSchema::databaseFields'
'SilverStripe\Dev\SapphireTest->setUpOnce()':
message: 'Renamed to setUpBeforeClass()'
'SilverStripe\Dev\SapphireTest->tearDownOnce()':
message: 'Renamed to tearDownAfterClass()'
'SilverStripe\Dev\SapphireTest::is_running_tests()':
message: '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()'
'SilverStripe\Dev\SapphireTest::using_temp_db()':
message: 'Moved to SilverStripe\ORM\Connect\TempDatabase->isUsed()'
'SilverStripe\Dev\SapphireTest::kill_temp_db()':
message: 'Moved to SilverStripe\ORM\Connect\TempDatabase->kill()'
'SilverStripe\Dev\SapphireTest::empty_temp_db()':
message: 'Moved to SilverStripe\ORM\Connect\TempDatabase->clearAllData()'
'SilverStripe\Dev\SapphireTest::create_temp_db()':
message: 'Moved to SilverStripe\ORM\Connect\TempDatabase->build()'
'SilverStripe\Dev\SapphireTest::delete_all_temp_dbs()':
message: 'Moved to SilverStripe\ORM\Connect\TempDatabase->deleteAll()'
'SilverStripe\Dev\SapphireTest::resetDBSchema()':
message: 'Moved to SilverStripe\ORM\Connect\TempDatabase->resetSchema()'
'populateTemplate()':
message: 'Email->populateTemplate() has been replaced with Email->setData()'
'SilverStripe\Control\Email\Email->setTemplate()':
message: 'Renamed to setHTMLTemplate()'
'SilverStripe\i18n\i18n::get_language_name()':
message: 'moved to SilverStripe\i18n\Data\Locales::localeName()'
'SilverStripe\i18n\i18n::get_locale_name()':
message: 'moved to SilverStripe\i18n\Data\Locales::languageName()'
'SilverStripe\i18n\i18n::get_language_code()':
message: 'Removed'
'SilverStripe\i18n\i18n::get_common_languages()':
message: 'moved to SilverStripe\i18n\Data\Locales::getLanguages()'
'SilverStripe\i18n\i18n::get_common_locales()':
message: 'Removed'
'SilverStripe\i18n\i18n::get_existing_translations()':
message: 'moved to SilverStripe\i18n\Data\Sources::getKnownLocales()'
'SilverStripe\i18n\i18n::get_owner_module()':
message: 'moved to SilverStripe\Core\Manifest\ClassManifest::getOwnerModule()'
'SilverStripe\i18n\i18n::get_owner_module()':
message: 'moved to SilverStripe\Core\Manifest\ClassManifest::getOwnerModule()'
'SilverStripe\i18n\i18n::validate_locale()':
message: 'moved to SilverStripe\i18n\Data\Locales::validate()'
'SilverStripe\i18n\i18n::get_lang_from_locale()':
message: 'moved to SilverStripe\i18n\Data\Locales::langFromLocale()'
'SilverStripe\i18n\i18n::get_locale_from_lang()':
message: 'moved to SilverStripe\i18n\Data\Locales::localeFromLang()'
'SilverStripe\i18n\i18n::get_tinymce_lang()':
message: 'moved to SilverStripe\Forms\HTMLEditor\TinyMCEConfig::get_tinymce_lang()'
'SilverStripe\ORM\Hierarchy->getChildrenAsUL()':
message: 'Replaced with renderChildren()'
'SilverStripe\Security\Permission::flush_permission_cache()':
message: 'Renamed to reset()'
'SilverStripe\View\SSViewer::set_source_file_comments()':
message: 'Removed'
'SilverStripe\View\SSViewer::get_source_file_comments()':
message: 'Removed'
'SilverStripe\View\SSViewer->getOption()':
message: 'Removed'
'SilverStripe\View\SSViewer->setOption()':
message: 'Removed'
'SilverStripe\Forms\DatetimeField->getConfig()':
message: 'Provides individual getters and setters now'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#datetimefield'
'SilverStripe\Forms\DatetimeField->setConfig()':
message: 'Provides individual getters and setters now'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#datetimefield'
'SilverStripe\Forms\DateField->getConfig()':
message: 'Provides individual getters and setters now'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#datefield'
'SilverStripe\Forms\DateField->setConfig()':
message: 'Provides individual getters and setters now'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#datefield'
'SilverStripe\Forms\TimeField->getConfig()':
message: 'Provides individual getters and setters now'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#timefield'
'SilverStripe\Forms\TimeField->setConfig()':
message: 'Provides individual getters and setters now'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#timefield'
'SilverStripe\Forms\Validator->validate()':
message: 'now returns a `ValidationResult` instance'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#form-validation'
'Requirements::delete_combined_files()':
message: 'Removed'
'SilverStripe\Security\PermissionCheckboxSetField::getAssignedPermissionCodes()':
message: 'Removed'
'dontEscape()':
message: 'FormField::dontEscape() has been removed. Escaping is now managed on a class by class basis.'
'SilverStripe\Forms\FormField::createTag()':
message: 'moved to SilverStripe\View\HTML->createTag()'
'SilverStripe\Forms\Form->transformTo()':
message: 'Removed'
'SilverStripe\Forms\Form->callfieldmethod()':
message: 'Removed'
'SilverStripe\Forms\Form::single_field_required()':
message: 'Removed'
'SilverStripe\Forms\Form::current_action()':
message: 'Removed'
'SilverStripe\Forms\Form::set_current_action()':
message: 'Removed'
'SilverStripe\Forms\Form->setupFormErrors()':
message: 'Renamed to restoreFormState()'
'SilverStripe\Forms\Form->resetValidation()':
message: 'Renamed to clearFormState()'
'SilverStripe\Forms\Form->transformTo()':
message: 'Removed'
'SilverStripe\Forms\Form->callfieldmethod()':
message: 'Removed'
'SilverStripe\Forms\Form->addErrorMessage()':
message: 'Removed. Use `sessionMessage()` or `sessionError()` to add a form level message, throw a `ValidationException` during submission, or add a custom validator.'
'SilverStripe\Forms\Form->messageForForm()':
message: 'Use setMessage() or sessionMessage() instead'
'SilverStripe\Forms\Form->buttonClicked()':
message: 'Moved to FormRequestHandler'
'SilverStripe\Forms\Form->checkAccessAction()':
message: 'Moved to FormRequestHandler'
'SilverStripe\Forms\Form->handleField()':
message: 'Moved to FormRequestHandler'
'SilverStripe\Forms\Form->httpSubmission()':
message: 'Moved to FormRequestHandler'
'SilverStripe\Forms\Form->Link()':
message: 'Moved to FormRequestHandler'
'requireField()':
message: 'Validator::requireField() has been removed, use RequiredFields instead'
'provideI18nEntities()':
message: 'Return type has changed (needs to be associative)'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#i18n'
'SilverStripe\View\Requirements_Backend::get_combined_files_enabled()':
message: 'Renamed to getCombinedFilesEnabledO()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::set_combined_files_enabled()':
message: 'Renamed to setCombinedFilesEnabledO()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::get_suffix_requirements()':
message: 'Renamed to getSuffixRequirements()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::set_suffix_requirements()':
message: 'Renamed to setSuffixRequirements()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::get_custom_scripts()':
message: 'Renamed to getCustomScripts()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::unblock_all()':
message: 'Renamed to unblockAll()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::include_in_response()':
message: 'Renamed to includeInResponse()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::combine_files()':
message: 'Renamed to getCombinedFiles()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::get_combine_files()':
message: 'Renamed to unblockAll()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::clear_combined_files()':
message: 'Renamed to clearCombinedFiles()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::process_combined_files()':
message: 'Renamed to processCombinedFiles()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::set_write_js_to_body()':
message: 'Renamed to setWriteJavascriptToBody()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend::set_force_js_to_bottom()':
message: 'Renamed to setForceJSToBottom()'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\Assets\Filesystem::sync()':
message: 'Removed'
'SilverStripe\Assets\Folder::syncChildren()':
message: 'Removed'
'SilverStripe\Assets\Folder::constructChild()':
message: 'Removed'
'SilverStripe\Assets\Folder::addUploadToFolder()':
message: 'Removed'
'SilverStripe\Assets\File::deletedatabaseOnly()':
message: 'Removed'
'SilverStripe\Assets\File::link_shortcode_handler()':
message: 'Removed'
'SilverStripe\Assets\File::getRelativePath()':
message: 'Removed'
'SilverStripe\Assets\File::getFullPath()':
message: 'Removed'
'SilverStripe\Assets\File::setParentID()':
message: 'Removed'
'SilverStripe\Assets\Image::regenerateFormattedImages()':
message: 'Removed'
'SilverStripe\Assets\Image::getGeneratedImages()':
message: 'Removed'
'SilverStripe\Assets\Image::deleteFormattedImages()':
message: 'Removed'
'SilverStripe\Assets\Image::handle_shortcode()':
message: 'moved to SilverStripe\Assets\Shortcodes\ImageShortcodeProvider::handle_shortcode()'
'SilverStripe\Assets\Image::deleteFormattedImages()':
message: 'Removed'
'SilverStripe\Assets\Image::SetRatioSize()':
message: 'Renamed to Fit()'
'SilverStripe\Assets\Image::SetWidth()':
message: 'Renamed to ScaleWidth()'
'SilverStripe\Assets\Image::SetHeight()':
message: 'Renamed to ScaleHeight'
'SilverStripe\Assets\Image::SetSize()':
message: 'Renamed to Pad()'
'SilverStripe\Assets\Image::PaddedImage()':
message: 'Renamed to Pad()'
'SilverStripe\Assets\Image::CroppedImage()':
message: 'Renamed to Fill()'
'SilverStripe\Assets\Image::AssetLibraryPreview()':
message: 'Renamed to PreviewThumbnail()'
'SilverStripe\Assets\Image::AssetLibraryThumbnail()':
message: 'Renamed to CMSThumbnail()'
'SilverStripe\Assets\Image::deleteFormattedImages()':
message: 'Removed'
'SilverStripe\AssetAdmin\Controller\AssetAdmin::deleteunusedthumbnails()':
message: 'Removed'
'SilverStripe\AssetAdmin\Controller\AssetAdmin::getUnusedThumbnails()':
message: 'Removed'
'SilverStripe\ORM\FieldType\DBMoney::getAllowedCurrencies()':
message: 'Apply validation to MoneyField instead'
'SilverStripe\ORM\Hierarchy\Hierarchy->doAllChildrenIncludingDeleted':
message: 'Use AllChildrenIncludingDeleted() instead'
'past_date()':
message: 'Removed SilverStripe\ORM\FieldType\DBDate->past_date()'
'prior_monday()':
message: 'Removed SilverStripe\ORM\FieldType\DBDate->prior_monday()'
'weekday()':
message: 'Removed SilverStripe\ORM\FieldType\DBDate->weekday()'
'next_day()':
message: 'Removed SilverStripe\ORM\FieldType\DBDate->next_day()'
'day_before()':
message: 'Removed SilverStripe\ORM\FieldType\DBDate->day_before()'
'days_between()':
message: 'Removed SilverStripe\ORM\FieldType\DBDate->days_between()'
props:
'class':
message: '$this->class access has been removed'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#object-replace'
'SilverStripe\Dev\SapphireTest->requiredExtensions':
message: 'Renamed to required_extensions'
'SilverStripe\Dev\SapphireTest->extraDataobjects':
message: 'Renamed to extra_dataobjects'
'SilverStripe\Dev\SapphireTest->extraControllers':
message: 'Renamed to extra_controllers'
'SilverStripe\View\Requirements_Backend->combine_files':
message: 'Renamed to combineFiles'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend->combine_js_with_min':
message: 'Renamed to $minifyCombinedFiles'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend->write_header_comments':
message: 'Renamed to writeHeaderComment'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
'SilverStripe\View\Requirements_Backend->write_js_to_body':
message: 'Renamed to writeJavascriptToBody'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#requirements'
functions:
'file_get_contents()':
message: 'Use new asset abstraction'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#asset-storage'
'file_put_contents()':
message: 'Use new asset abstraction'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#asset-storage'
constants:
'SS_TRUSTED_PROXY_HOST_HEADER':
message: 'See TrustedProxyMiddleware'
'SS_TRUSTED_PROXY_PROTOCOL_HEADER':
message: 'See TrustedProxyMiddleware'
'SS_TRUSTED_PROXY_IP_HEADER':
message: 'See TrustedProxyMiddleware'
'SS_TRUSTED_PROXY_HOST_HEADER':
message: 'See TrustedProxyMiddleware'
'MODULES_PATH':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'MODULES_DIR':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'FRAMEWORK_PATH':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'FRAMEWORK_DIR':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'CMS_PATH':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'CMS_DIR':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'FRAMEWORK_ADMIN_PATH':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'FRAMEWORK_ADMIN_DIR':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'FRAMEWORK_ADMIN_THIRDPARTY_DIR':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'THEMES_PATH':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'THEMES_DIR':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'THIRDPARTY_PATH':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'
'THIRDPARTY_DIR':
message: 'Path constants have been deprecated, use the Requirements and ModuleResourceLoader APIs'
url: 'https://docs.silverstripe.org/en/4/changelogs/4.0.0#module-paths'

View File

@ -122,6 +122,50 @@ automatically joined as required:
* `MyRecordSubclass_Live` table: Contains only live data for subclass columns
* `MyRecordSubclass_Versions` table: Contains only version history for subclass columns
Because `many_many` relationships create their own sets of records on their own tables, representing content changes to a DataObject, they can therefore be versioned. This is done using the ["through" setting](https://docs.silverstripe.org/en/4/developer_guides/model/relations/#many-many-through-relationship-joined-on-a-separate-dataobject) on a `many_many` definition. This setting allows you to specify a custom DataObject through which to map the `many_many` relation. As such, it is possible to version your `many_many` data by versioning a "through" dataobject. For example:
```php
use SilverStripe\ORM\DataObject;
class Product extends DataObject
{
private static $db = [
'Title' => 'Varchar(100)',
'Price' => 'Currency',
];
private static $many_many = [
'Categories' => [
'through' => 'ProductCategory',
'from' => 'Product',
'to' => 'Category',
],
];
}
```
```php
use SilverStripe\ORM\DataObject;
use SilverStripe\Versioned\Versioned;
class ProductCategory extends DataObject
{
private static $db = [
'SortOrder' => 'Int',
];
private static $has_one = [
'Product' => Product::class,
'Category'=> Category::class,
];
private static $extensions = [
Versioned::class,
];
}
```
## Usage
### Reading Versions
@ -216,7 +260,7 @@ Versioned::set_reading_mode($origMode); // reset current mode
### DataObject ownership
Typically when publishing versioned dataobjects, it is necessary to ensure that some linked components
Typically when publishing versioned DataObjects, it is necessary to ensure that some linked components
are published along with it. Unless this is done, site front-end content can appear incorrectly published.
For instance, a page which has a list of rotating banners will require that those banners are published
@ -318,6 +362,57 @@ The ownership relationship is tracked through an `[image]` [shortcode](/develope
which is automatically transformed into an `<img>` tag at render time. In addition to storing the image path,
the shortcode references the database identifier of the `Image` object.
### Changesets, a.k.a "Campaigns"
Changes to many DataObjects can grouped together using the `ChangeSet` [api:SilverStripe\Versioning\ChangeSet] object, better known by its frontend name, "Campaign" (provided the `campaign-admin` module is installed). By grouping a series of content changes together as one cohesive unit, content editors can bulk publish an entire body of content all at once, which affords them much more power and control over interdependent content types.
Records can be added to a changeset in the CMS by using the "Add to campaign" button
that is available on the edit forms of all pages and files. Programmatically, this is done by creating a `SilverStripe\Versioned\ChangeSet` object and invoking its `addObject(DataObject $record)` method.
<div class="info" markdown="1">
Any DataObject can exist in any number of changesets, and even added to a changeset in advance of being published. While a record need not have modifications to be part of a changeset, for practical purposes, changesets are only concerned with records that have modifications.
</div>
#### Implicit vs. Explicit inclusions
Items can be added to a changeset in two ways -- *implicitly* and *explicitly*.
An *implicit* inclusion occurs when a record is added to a changeset by virtue of another object declaring ownership of it via the `$owns` setting. Implicit inclusion of owned objects ensures that when a changeset is published, the action cascades through not only all of the items explicitly added to the changeset, but also all of the records that each of those items owns.
An *explicit* inclusion is much more direct, occurring only when a user has opted to include a record in a changeset either through the UI or programatically.
It is possible for an item to be included both implicitly and explicitly in a changeset. For instance, if a page owns a file, and the page gets added to a changeset, the file is implicitly added. That same file, however, can still be added to the changeset explicitly through the file editor. In this case, the file is considered to be *explicitly* added. If the file is later removed from the changeset, it is then considered *implicitly* added, due to its owner page still being in the changeset.
#### Changeset actions
Actions available on the frontend, i.e. those which are intended to be triggered by an end user, include:
* `$myChangeSet->addObject(DataObject $record)`: Add a record and all of its owned records to the changeset (`canEdit()` dependent)
* `$myChangeSet->removeObject(DataObject $record)`: Removes a record and all of its owned records from the changeset (`canEdit()` dependent)
* `$myChangeSet->publish()`: Publishes all items in the changeset that have modifications, along with all their owned records (`canPublish()` dependent). Closes the changeset on completion.
Actions available on the backend, i.e. those which should only be invoked programmatically include:
* `$myChangeSet->sync()`: Find all owned records with modifications for each item in the changeset, and include them implicitly.
* `$myChangeSet->validate()`: Ensure all owned records with modifications for each item in the changeset are included. This method should not need to be invoked if `sync()` is being used on each mutation to the changeset.
#### Changeset states
Changesets can exists in five different states:
* `open` No action has been taked on the changeset. Resolves to `publishing` or `reverting`.
* `published`: The changeset has published changes to all of its items and its now closed.
* `reverted`: The changeset has reverted changes to all of its items and its now closed. (Future API, not supported yet)
#### Change types
Each item in the changeset stores `VersionBefore` and `VersionAfter` fields. As such, they can compute the type of change they are adding to their parent changeset. Change types include:
* `created`: This changeset item is for a record that does not yet exist
* `modified`: This changeset item is for a record that differs from what is on the live stage
* `deleted`: This changeset item will no longer exist when the changeset is published
* `none`: This changeset item is exactly as it is on the live stage
### Custom SQL
We generally discourage writing `Versioned` queries from scratch, due to the complexities involved through joining

View File

@ -1,90 +1,98 @@
title: File management
summary: Learn how to work with File and Image records
# File Management
# File management
## Storage via database columns
## Asset admin
Asset storage is provided out of the box via a [Flysystem](http://flysystem.thephpleague.com/) backed store.
However, any class that implements the `AssetStore` interface could be substituted to provide storage backends
via other mechanisms.
Management of files within the CMS is provided via the [silverstripe/asset-admin](https://github.com/silverstripe/silverstripe-asset-admin)
module. This is a rich and user friendly interface supporting most basic file operations, as well as
control over the publishing and security of files.
Internally, files are stored as `[DBFile](api:SilverStripe\Assets\Storage\DBFile)` records on the rows of parent objects. These records are composite fields
which contain sufficient information useful to the configured asset backend in order to store, manage, and
publish files. By default this composite field behind this field stores the following details:
![asset admin](_images/asset-admin-demo.png)
## UploadField
| Field name | Description |
| ---------- | -----------
| `Hash` | The sha1 of the file content, useful for versioning (if supported by the backend) |
| `Filename` | The internal identifier for this file, which may contain a directory path (not including assets). Multiple versions of the same file will have the same filename. |
| `Variant` | The variant for this file. If a file has multiple derived versions (such as resized files or reformatted documents) then you can point to one of the variants here. |
If you have the [silverstripe/asset-admin](https://github.com/silverstripe/silverstripe-asset-admin)
module installed then this provides a powerful component [api:SilverStripe\AssetAdmin\Forms\UploadField].
![upload field](_images/upload-field.png)
Note that the `Hash` and `Filename` always point to the original file, if a `Variant` is specified. It is up to the
storage backend to determine how variants are managed.
You can add it to a page as below:
Note that the storage backend used will not be automatically synchronised with the database. Only files which
are loaded into the backend through the asset API will be available for use within a site.
## Compatibility with 3.x filename paths
If upgrading to 4.0 from earlier versions when using the default asset store, it's important to consider
how existing files will be migrated.
Because the filesystem now uses the sha1 of file contents in order to version multiple versions under the same
filename, the default storage paths in 4.0 will not be the same as in 3.
In order to retain existing file paths in line with framework version 3 you should set the
`\SilverStripe\Assets\Flysystem\FlysystemAssetStore.legacy_filenames` config to true.
Note that this will not allow you to utilise certain file versioning features in 4.0.
```yaml
\SilverStripe\Assets\Flysystem\FlysystemAssetStore:
legacy_filenames: true
```
## Loading content into `DBFile`
A file can be written to the backend from a file which exists on the local filesystem (but not necessarily
within the assets folder).
For example, to load a temporary file into a DataObject you could use the below:
```php
use SilverStripe\ORM\DataObject;
<?php
<?
class Banner extends DataObject
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\CMS\Model\SiteTree;
class Page extends SiteTree
{
private static $db = [
'Image' => 'DBFile'
private static $has_one = [
'Banner' => Image::class,
];
public function getCMSFields()
{
$fields = parent::getCMSFields();
$fields->addFieldToTab('Root.Main', UploadField::create('Banner', 'Page Banner'), 'Content');
return $fields;
}
}
// Image could be assigned in other parts of the code using the below
$banner = new Banner();
$banner->Image->setFromLocalFile($tempfile['path'], 'uploads/banner-file.jpg');
```
When uploading a file it's normally necessary to give the file a useful name and directory, otherwise the
asset storage backend will choose one for you.
UploadField options include:
Alternatively, content can be loaded using one of the below methods:
- setIsMultiUpload() - Set to allow many files per field, or one only.
- setAllowedExtensions() - Set list of extensionse this field can accept.
- setAllowedFileCategories() - Alternatively specify allowed extensions via category instead.
- setFolderName() - Name of folder to upload into
- getValidator() - Get instance of validator to specify custom validation rules
## File visibility
In order to ensure that assets are made public you should check the following:
- The "Who can view this file?" option is set to "Anyone" or "Inherit" in the asset-admin. This can be checked
via `File::canView()` or `File::$CanViewType` property.
- The file is published, or is owned by a published record. This can be checked via `File::isPublished()`
- The file exists on disk, and has not been removed. This can be checked by `File::exists()`
## File shortcodes
Shortcodes represent an embeded asset within a block of HTML text. For instance, this is the content
of a page with a shortcode image:
```html
<p>Welcome to SilverStripe! This is the default homepage.</p>
<p>[image src="/assets/e43fb87dc0/12824172.jpeg" id="27" width="400" height="400" class="leftAlone ss-htmleditorfield-file image" title="My Image"]</p>
```
File shortcodes have the following properties:
- canView() will not be checked for the file itself: Instead this will be inherited from the parent record
this is embedded within.
- The file is automatically "owned", meaning that publishing the page will also publish the embedded file.
Within the CMS shortcodes can be added via either the "Insert Media" modal, or the "Link to a file"
buttons provided via the [silverstripe/asset-admin](https://github.com/silverstripe/silverstripe-asset-admin)
module.
## Creating files in PHP
When working with files in PHP you can upload a file into a [api:SilverStripe\Assets\File] dataobject
using one of the below methods:
| Method | Description |
| -------------------------- | --------------------------------------- |
| `DBFile::setFromLocalFile` | Load a local file into the asset store |
| `DBFile::setFromStream` | Will store content from a stream |
| `DBFile::setFromString` | Will store content from a binary string |
| `File::setFromLocalFile` | Load a local file into the asset store |
| `File::setFromStream` | Will store content from a stream |
| `File::setFromString` | Will store content from a binary string |
The result of these methods will be an array of data (tuple) which contains the values of the above fields
(Filename, Hash, and Variant).
## Conflict resolution
### Upload conflict resolution
When storing files, it's possible to determine the mechanism the backend should use when it encounters
an existing file pattern. The conflict resolution to use can be passed into the third parameter of the
@ -97,69 +105,98 @@ above methods (after content and filename). The available constants are:
| `AssetStore::CONFLICT_RENAME` | The backend will choose a new name. |
| `AssetStore::CONFLICT_USE_EXISTING` | The existing file will be used |
If no conflict resolution scheme is chosen, or an unsupported one is requested, then the backend will choose one.
The default asset store supports each of these.
## Getting content from a `DBFile`
When placed into a template (e.g. `$MyFileField`) then `[DBFile](api:SilverStripe\Assets\Storage\DBFile)` will automatically generate the appropriate
template for the file mime type. For images, this will embed an image tag. For documents a download link will be presented.
## Accessing files via PHP
As with storage, there are also different ways of loading the content (or properties) of the file:
| Method | Description |
| ------------------------ | ---------------------------------------------------------- |
| `DBFile::getStream` | Will get an output stream of the file content |
| `DBFile::getString` | Gets the binary content |
| `DBFile::getURL` | Gets the url for this resource. May or may not be absolute |
| `DBFile::getAbsoluteURL` | Gets the absolute URL to this resource |
| `DBFile::getMimeType` | Get the mime type of this file |
| `DBFile::getMetaData` | Gets other metadata from the file as an array |
| `File::getStream` | Will get an output stream of the file content |
| `File::getString` | Gets the binary content |
| `File::getURL` | Gets the url for this resource. May or may not be absolute |
| `File::getAbsoluteURL` | Gets the absolute URL to this resource |
| `File::getMimeType` | Get the mime type of this file |
| `File::getMetaData` | Gets other metadata from the file as an array |
## Modifying files
In order to move or rename a file you can simply update the Name property, or assign the ParentID to a new
folder. Please note that these modifications are made simply on the draft stage, and will not be copied
to live until a publish is made (either on this object, or cascading from a parent).
When files are renamed using the ORM, all file variants are automatically renamed at the same time.
```php
$file = File::get()->filter('Name', 'oldname.jpg')->first();
if ($file) {
// The below will move 'oldname.jpg' and 'oldname__variant.jpg'
// to 'newname.jpg' and 'newname__variant.jpg' respectively
$file->Name = 'newname.jpg';
$file->write();
}
```
## File versioning
File versioning is extended with the [silverstripe/versioned](https://github.com/silverstripe/silverstripe-versioned/)
module, which provides not only a separate draft and live stages for any file, but also allows a complete file
history of modifications to be tracked.
To support this feature the [api:SilverStripe\Assets\AssetControlExtension] provides support for tracking
references to physical files, ensuring published assets are accessible, protecting non-published assets,
and archiving / deleting assets after the final reference has been deleted.
### Configuring file ownership
When working with files attached to other versioned dataobjects it is necessary to configure ownership
of these assets from the parent record. This ensures that whenever a Page (or other record type)
is published, all assets that are used by this record are published with it.
For example:
```php
<?php
use SilverStripe\Assets\Image;
use SilverStripe\CMS\Model\SiteTree;
class Page extends SiteTree
{
private static $has_one = [
'Banner' => Image::class,
];
private static $owns = ['Banner'];
}
```
### Avoid exclusive relationships
Due to the shared nature of assets, it is not recommended to assign any 1-to-many (or exclusive 1-to-1) relationship
between any objects and a File. E.g. a Page has_many File, or Page belongs_to File.
As with other db field types, `DBField` can also be subclassed or extended to add additional properties
(such as SEO related fields).
Instead it is recommended to use either a Page has_one File for many-to-1 (or 1-to-1) relationships, or
Page many_many File for many-to-many relationships.
## Storage via `File` DataObject
### Unpublishing assets
Other than files stored exclusively via DBFile, files can also exist as subclasses of the `File` DataObject.
Assets can be unpublished on a case by case basis via the asset admin section. Please note that
when unpublishing an asset, this will remove this asset from all live pages which currently link to
or embed those images.
Each record has the following database fields:
### Configuring file archiving
| Field name | Description |
| ---------- | ----------- |
| `ClassName` | The class name of the file (e.g. File, Image or Folder). |
| `Name` | The 'basename' of the file, or the folder name. For example 'my-image.jpg', or 'images' for a folder. |
| `Title` | The optional, human-readable title of the file for display only (doesn't apply to folders). |
| `File` | The `[DBFile](api:SilverStripe\Assets\Storage\DBFile)` field (see above) which stores the underlying asset content. |
| `ShowInSearch` | Whether the file should be shown in search results, defaults to '1'. See ["Tutorial 4 - Site Search"](/tutorials/site_search) for enabling search. |
| `ParentID` | The ID of the parent Folder that this File/Folder is in. A ParentID of '0' indicates that this is a top level record. |
| `OwnerID` | The ID of the Member that 'owns' the File/Folder (not related to filesystem permissions). |
By default files which do not exist on either the live or draft stage (but do have a version history)
are removed from the filesystem.
In order to permanantly keep a record of all past physical files you can set the `File.keep_archived_assets`
config option to true. This will ensure that historic files can always be restored, albeit at a cost to disk
storage.
## Management through the "Files" section of the CMS
If you have the CMS module installed, you can manage files, folders and images in the "Files" section of the CMS. Inside this section, you will see a list of files and folders like below:
![](../../_images/assets.png)
You can click on any file to edit it, or click on any folder to open it. To delete a file or a folder, simply click the red 'X' symbol next to it. If you click to open a folder, you can go back up one level by clicking the 'up' arrow above the folder name (highlighted below):
![](../../_images/assets_up.png)
Once you click to edit a file, you will see a form similar to the one below, in which you can edit the file's title, filename, owner, or even change which folder the file is located in:
![](../../_images/assets_editform.png)
You may also notice the 'Sync files' button (highlighted below). This button allows CMS users to 'synchronise' the database (remember, all files/folders are stored as database records) with the filesystem. This is particularly useful if someone has uploaded or removed files/folders via FTP, for example.
![](../../_images/assets_sync.png)
## Upload
Files can be managed through forms in one way:
* [FileField](api:SilverStripe\Forms\FileField): provides a simple HTML input with a type of "file".
_NOTE_: Modules are also available to handle Files.
```yaml
SilverStripe\Assets\File:
keep_archived_assets: true
```

View File

@ -18,13 +18,11 @@ For instance, in order to write an asset to a protected location you can use the
config option:
```php
$store = singleton(AssetStore::class);
$store->setFromString('My protected content', 'Documents/Mydocument.txt', null, null, [
'visibility' => AssetStore::VISIBILITY_PROTECTED
]);
```
## User access control
@ -40,7 +38,6 @@ control access to embedded assets at a template level.
```ss
<ul class="files">
<% loop $File %>
<% if $canView %>
@ -72,14 +69,14 @@ authorised users, the following should be considered:
public function init()
{
parent::init();
// Whitelist any protected files on this page for the current user
foreach($this->Files() as $file) {
// Whitelist the protected files on this page for the current user
$file = $this->File();
if($file->canView()) {
$file->grantFile();
}
}
}
}
```
* If a user does not have access to a file, you can still generate the URL but suppress the default
@ -87,18 +84,16 @@ authorised users, the following should be considered:
(or '0' in template as a workaround for all parameters being cast as string)
::php
```php
<% if not $canView %>
<!-- The user will be denied if they follow this url -->
<li><a href="$getURL(0)">Access to $Title is denied</a></li>
<% else %>
```
* Alternatively, if a user has already been granted access, you can explicitly revoke their access using
the `revokeFile` method.
```php
use SilverStripe\CMS\Controllers\ContentController;
@ -107,8 +102,9 @@ authorised users, the following should be considered:
public function init()
{
parent::init();
// Whitelist any protected files on this page for the current user
foreach($this->Files() as $file) {
// Whitelist the protected files on this page for the current user
$file = $this->File();
if($file->canView()) {
$file->grantFile();
} else {
@ -117,7 +113,6 @@ authorised users, the following should be considered:
}
}
}
}
```
## Controlling asset visibility
@ -133,19 +128,14 @@ public facing area.
E.g.
```php
$object->MyFile->setFromLocalFile($tmpFile['Path'], $filename, null, null, [
'visibility' => AssetStore::VISIBILITY_PROTECTED
]);
```
You can also adjust the visibility of any existing file to either public or protected.
```php
// This will make the file available only when a user calls `->grant()`
$object->SecretFile->protectFile();
@ -199,8 +189,6 @@ When the file `NewCompanyLogo.gif` is made public, the url will not change, but
will be moved to `assets/a870de278b/NewCompanyLogo.gif`, and will be served directly via
the web server, bypassing the need for additional PHP requests.
```php
$store = singleton(AssetStore::class);
$store->publish('NewCompanyLogo.gif', 'a870de278b475cb75f5d9f451439b2d378e13af1');
@ -208,7 +196,6 @@ the web server, bypassing the need for additional PHP requests.
After this the filesystem will now look like below:
```
assets/
.htaccess
@ -263,9 +250,9 @@ to put protected files into `/sites/mysite/protected` with the below `.env` sett
In addition to configuring file locations, it's also important to ensure that you have allowed the
appropriate file extensions for your instance. This can be done by setting the `File.allowed_extensions`
config.
```yaml
File:
```yaml
SilverStripe\Assets\File:
allowed_extensions:
- 7zip
- xzip
@ -286,10 +273,7 @@ When a protected file is served it will also be transmitted with all headers def
`SilverStripe\Filesystem\Flysystem\FlysystemAssetStore.file_response_headers` config.
You can customise this with the below config:
```yaml
SilverStripe\Filesystem\Flysystem\FlysystemAssetStore:
file_response_headers:
Pragma: 'no-cache'
@ -314,8 +298,6 @@ This can be applied to DataObjects on a case by case basis by setting the `keep_
config to true on that class. Note that this feature only works with dataobjects with
the `Versioned` extension.
```php
use SilverStripe\ORM\DataObject;
@ -326,16 +308,12 @@ the `Versioned` extension.
/** Versioned */
private static $extensions = ['Versioned'];
}
```
The extension can also be globally disabled by removing it at the root level:
```yaml
DataObject:
SilverStripe\ORM\DataObject:
AssetControl: null
```
@ -398,7 +376,6 @@ will need to make sure you manually configure these rules.
For instance, this will allow your nginx site to serve files directly, while ensuring
dynamic requests are processed via the Framework:
```
location ^~ /assets/ {
sendfile on;

View File

@ -0,0 +1,102 @@
title: File storage
summary: Describes the persistence layer of files
# File storage
This section describes how the asset store abstraction layer stores the physical files underlying the ORM,
and explains some of the considerations.
## Component Overview
The assets module is composed of these major storage classes:
* [api:SilverStripe\Assets\File]: This is the main DataObject that user code interacts with when working with files.
This class has the following subclasses:
- [api:SilverStripe\Assets\Folder]: Logical folder which holds a set of files. These can be nested.
- [api:SilverStripe\Assets\Image]: Specialisation of File representing an image which can be resized.
Note that this does not include non-resizable image files.
* [api:SilverStripe\Assets\Storage\DBFile]: This is the DB field used by the File dataobject internally for
storing references to physical files in the asset backend.
* [api:SilverStripe\Assets\Flysystem\FlysystemAssetStore]: The default backend, provided by
[Flysystem](https://flysystem.thephpleague.com/), which SilverStripe uses as an asset persistence layer.
* [api:SilverStripe\Assets\InterventionBackend]: Default image resizing mechanism, provided by
[intervention image](http://image.intervention.io/).
These interfaces are also provided to abstract certain behaviour:
* [api:SilverStripe\Assets\Storage\AssetContainer]: Abstract interface for a file reference. Implemented by both
File and DBFile. Declare API for reading to and writing an single file.
* [api:SilverStripe\Assets\Storage\AssetStore]: Abstract interface for the backend store for the asset system.
Implemented by FlysystemAssetStore. Declares API for reading and writing assets from and to the store.
## Storage via database columns
Asset storage is provided out of the box via a [Flysystem](http://flysystem.thephpleague.com/) backed store.
However, any class that implements the `AssetStore` interface could be substituted to provide storage backends
via other mechanisms.
Internally, files are stored as [DBFile](api:SilverStripe\Assets\Storage\DBFile) records on the rows of parent objects.
These records are composite fields which contain sufficient information useful to the configured asset backend in order
to store, manage, and publish files. By default this composite field behind this field stores the following details:
| Field name | Description |
| ---------- | -----------
| `Hash` | The sha1 of the file content, useful for versioning (if supported by the backend) |
| `Filename` | The internal identifier for this file, which may contain a directory path (not including assets). Multiple versions of the same file will have the same filename. |
| `Variant` | The variant for this file. If a file has multiple derived versions (such as resized files or reformatted documents) then you can point to one of the variants here. |
Note that the `Hash` and `Filename` always point to the original file, if a `Variant` is specified. It is up to the
storage backend to determine how variants are managed.
Note that the storage backend used will not be automatically synchronised with the database. Only files which
are loaded into the backend through the asset API will be available for use within a site.
## File paths and url mapping
The hash, name, and filename are combined in order to build the physical location on disk.
For instance, this is a typical disk content:
```
assets/
Uploads/
b63923d8d4/
BannerHeader.jpg
BannerHeader__FitWzYwLDYwXQ.jpg
```
This corresponds to a file with the following properties:
- Filename: Uploads/BannerHeader.jpg
- Hash: b63923d8d4089c9da16fbcbcdfef3e1b24806334 (trimmed to first 10 chars)
- Variant: FitWzYwLDYwXQ (corresponds to Fit[60,60])
The URL for this file will match the physical location on disk:
`http://www.mysite.com/assets/Uploads/b63923d8d4/BannerHeader__FitWzYwLDYwXQ.jpg`.
For more information on how protected files are stored see the [file security](/developer_guides/files/file_security)
section.
## Loading content into `DBFile`
A file can be written to the backend from a file which exists on the local filesystem (but not necessarily
within the assets folder).
For example, to load a temporary file into a DataObject you could use the below:
```php
use SilverStripe\ORM\DataObject;
class Banner extends DataObject
{
private static $db = [
'Image' => 'DBFile'
];
}
// Image could be assigned in other parts of the code using the below
$banner = new Banner();
$banner->Image->setFromLocalFile($tempfile['path'], 'uploads/banner-file.jpg');
```

View File

@ -1,7 +1,12 @@
title: File migration
summary: Manage migration of legacy files to the new database structure
# File migration
This section describes how to upgrade existing filesystems from earlier versions of SilverStripe.
## Running migration
Since the structure of `File` dataobjects has changed between 3.0 and 4.0, a new task `MigrateFileTask`
has been added to assist in migration of legacy files.
@ -55,3 +60,20 @@ SilverStripe\Assets\FileMigrationHelper:
Note that pre-existing security solutions for 3.x (such as
[secure assets module](https://github.com/silverstripe/silverstripe-secureassets))
are incompatible with core file security.
## Support existing paths
Because the filesystem now uses the sha1 of file contents in order to version multiple versions under the same
filename, the default storage paths in 4.0 will not be the same as in 3.
Although it is not recommended, it is possible to configure the backend to omit this SHA1 url segment,
meaning that file paths and urls will not be modified during the upgrade.
This is done by setting this config:
```yaml
SilverStripe\Assets\Flysystem\FlysystemAssetStore:
legacy_filenames: true
```
Note that this will not allow you to utilise certain file versioning features in 4.0.

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -2,6 +2,24 @@ title: Files
summary: Upload, manage and manipulate files and images.
introduction: Upload, manage and manipulate files and images.
# Files
## Introduction
File management and abstraction is provided by the [silverstripe/assets](https://github.com/silverstripe/silverstripe-assets).
This provides the basis for the storage of all non-static files and resources usable by a SilverStripe web application.
By default the [api:SilverStripe\Assets\File] has these characteristics:
- A default permission model based on folder hierarchy.
- Versioning of files, including the ability to draft modifications to files and subsequently publish them.
- Physical protection of both unpublished and secured files, allowing restricted access as needed.
- An abstract storage based on the [flysystem](https://flysystem.thephpleague.com/) library, which can be
substituted for any other backend.
- Can be embedded into any HTML field via shortcodes.
# Read more
[CHILDREN]
## API Documentation

View File

@ -452,7 +452,7 @@ the default ones.
class: FormTemplateHelper_Pre32
### Update code that uses SQLQuery
### <a name="sqlquery"></a>Update code that uses SQLQuery
SQLQuery has been changed. Previously this class was used for both selecting and deleting, but
deletion is now handled by the new SQLDelete class.

View File

@ -6,79 +6,137 @@ This version introduces many breaking changes, which in most projects can be man
of automatic upgrade processes as well as manual code review. This document reviews these changes and will
guide developers in preparing existing 3.x code for compatibility with 4.0
* [Highlights of Major Changes](#overview)
* [Upgrading Guide](#upgrading)
* [Standard Upgrade](#upgrading-primary)
* [API Specific Upgrades](#upgrading-specifics)
* [User code style upgrades](#usercode-style-upgrades)
* [API Changes](#api-changes)
* [General and Core API](#overview-general)
* [ORM API](#overview-orm)
* [Filesystem API](#overview-filesystem)
* [Template and Form API](#overview-template)
* [i18n](#overview-i18n)
* [Email and Mailer](#overview-mailer)
* [SapphireTest](#overview-testing)
* [Security](#overview-security)
## <a name="overview"></a>Highlights of major changes
## <a name="overview"></a>Overview
* Minimum version dependencies have increased; PHP 5.5 and Internet Explorer 11 (or other modern browser)
is required.
* All code earlier marked as deprecated for 4.0 has now been removed. See
[deprecation documentation](/contributing/release_process) for information on code deprecation.
* All code earlier marked as deprecated for 4.0 has now been removed (check our
[deprecation process](/contributing/release_process))
* 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.
Automatic upgrading tools have been developed to cope with the bulk of these changes (see
[upgrading notes](#upgrading)). Some classes have been rearranged so that each file contains only one class definition. It is recommended that user code follow the same convention.
For example, page types and their controllers should longer be collated in a single file.
* Object class has been removed.
[upgrading notes](#upgrading)).
* Object class has been replaced with traits ([details](object-replace)).
* 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.
are now a core feature ([details](#asset-storage))
* 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 4 as a base
* CMS CSS has been re-developed using Bootstrap v4 as a base
([blog post](https://www.silverstripe.org/blog/a-frameworks-framework-why-silverstripe-4-will-use-bootstrap/))
* Asset admin has been replaced with a purely ReactJS powered upgrade, and split out
module called [asset-admin](https://github.com/silverstripe/silverstripe-asset-admin/). You'll need to add this to your `composer.json` to retain file management capabilities for your CMS authors.
module called [asset-admin](https://github.com/silverstripe/silverstripe-asset-admin/).
* Versioning is now a much more powerful feature, with the addition of campaigns to allow batches of related
or inter-dependent objects to be published as a single act. Dependencies between versioned objects can be
or inter-dependent objects to be published as a single "changeset" ([details](#changeset)).
* 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](https://www.silverstripe.org/blog/campaigns-in-silverstripe-4/))
maintained during publishing ([details](#ownership))
This new system can be managed via the new "Campaigns" CMS section ([blog post](https://www.silverstripe.org/blog/campaigns-in-silverstripe-4/))
* Template variable casting (e.g. `<h1>$Title</h1>`) is enforced by default, which will ensure safe HTML encode
unless explicitly opted out.
unless explicitly opted out ([details](#template-casting))
* Themes are now configured to cascade, where you can specify a list of themes, and have the template engine
search programatically through a prioritised list when resolving template and CSS file paths.
* Removed module path constants (e.g. `FRAMWORK_PATH`) and support for hardcoded file paths (e.g. `mysite/css/styles.css`)
* i18n Updated to use symfony/translation over zend Framework 1. Zend_Translate has been removed.
* Replaced `Zend_Cache` and the `Cache` API with a PSR-16 implementation (symfony/cache)
* _ss_environment.php files have been removed in favour of `.env` and "real" environment variables.
* admin has been moved to a new module [silverstripe/admin](https://github.com/silverstripe/silverstripe-admin).
* Behat support updated to behat 3. See the
[behat extension](https://github.com/silverstripe/silverstripe-behat-extension) for more information.
* Removed module path constants (e.g. `FRAMEWORK_PATH`) and support for hardcoded file paths (e.g. `mysite/css/styles.css`) ([details](#module-paths))
* Replaced Zend_Translate with symfony/translation ([details](#i18n))
* Replaced `Zend_Cache` and the `Cache` API with a PSR-16 implementation (symfony/cache) ([details](#cache))
* `_ss_environment.php` files have been removed in favour of `.env` and "real" environment variables ([details](#env)).
* Behat support updated to v3 (
[details](https://github.com/silverstripe/silverstripe-behat-extension))
* The `GDBackend` and `ImagickBackend` classes have been replaced by a unified `InterventionBackend` which uses the
[intervention/image](https://github.com/intervention/image) library to power manipualations.
* Dependencies can managed via [recipe-plugin](https://github.com/silverstripe/recipe-plugin). See [recipe-core](https://github.com/silverstripe/recipe-core) and [recipe-cms](https://github.com/silverstripe/recipe-cms) as examples.
* Authentication has been upgraded to a modular approach using re-usable interfaces and easier to hook in to LoginHandlers.
* Authentication has been upgraded to a modular approach using re-usable interfaces and easier to hook in to LoginHandlers ([details](#custom-authenticators)).
* Core modules are installed in the `vendor/` folder by default (other modules can opt-in, see [guide](/developer_guides/extending/how_tos/publish_a_module))
* Renamed constant for temp folder from `TEMP_FOLDER` to `TEMP_PATH` for naming consistency with other path variables and constants
## <a name="upgrading"></a>Upgrading
## <a name="upgrading"></a>Upgrading Guide
The below sections describe how to go about updating an existing site to be prepared for upgrade to 4.0.
Most of these upgrading tasks will involve manual code review, although in some cases there are
some automated processes that users can run to
some automated processes that users can run.
### <a name="upgrading-primary"></a>Standard Upgrade
### <a name="deps"></a>Composer dependency update
This section describes the processes which every project upgrading to 4.0 should follow. This should be followed
as a standard first point of upgrade.
As a first step, you need to update your composer dependencies.
The easiest way is to start with a new `composer.json` file
and gradually move over settings from your old one.
This way you don't get dependency conflicts with potentially incompatible modules.
#### Upgrade project index.php and .htaccess rewrites
Backup your existing `composer.json` and overwrite it with the following content:
```json
{
"name": "myvendor/myproject",
"require": {
"silverstripe/recipe-cms": "^1"
},
"prefer-stable": true,
"minimum-stability": "dev"
}
```
This composer file uses the new [recipe](https://github.com/silverstripe/recipe-plugin) approach
which bundles all core dependencies in a meta package. If you want more granular control over what gets installed,
check the `composer.json` files in [recipe-core](https://github.com/silverstripe/recipe-core) and [recipe-cms](https://github.com/silverstripe/recipe-cms).
Since this is a pre-release, you need to allow composer to install unstable dependencies via `minimum-stability: dev`.
Now run a `composer update`. This will remove all existing modules from your local codebase
since we replaced your project's `composer.json`. Now you can move back your modules
one by one, checking for compatible versions on [packagist.org](http://packagist.org).
Note: If you have issues with a pre-existing composer install you can force a clean re-install with the
below commands:
```bash
rm -rf vendor/composer
rm composer.lock
composer update
```
For modules with stable releases, simply set your composer constraints to the new version
(with a [next significant release](https://getcomposer.org/doc/articles/versions.md#next-significant-release-operators) operator).
```diff
{
"require": {
- "myvendor/compatible-module": "~2.0",
+ "myvendor/compatible-module": "~3.0",
}
}
```
For modules with a compatible pre-release, use an explicit [stability constraints](https://getcomposer.org/doc/articles/versions.md#stability-constraints).
This can be changed to a [next significant release](https://getcomposer.org/doc/articles/versions.md#next-significant-release-operators) operator
once the module is stable.
```diff
{
"require": {
- "myvendor/prerelease-module": "~2.0",
+ "myvendor/prerelease-module": "~3.0@dev",
}
}
```
For modules that don't have a pre-release branch started,
you should raise an issue on the repository asking for 4.0 compatibility.
For now, you should attempt to continue the upgrade without the module
and temporarily disable its functionality.
### <a name="upgrader-tool"></a>Install the upgrader tool
A lot of upgrade work can be automated, and we've written an
[upgrader tool](https://github.com/silverstripe/silverstripe-upgrader/) for this purpose.
Install it via composer:
```
composer global require silverstripe/upgrader
```
### <a name="index-php-rewrites"></a>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 `index.php`.
@ -90,10 +148,18 @@ unless you PHP's built-in webserver through [silverstripe/serve](https://github.
The [upgrader tool](https://github.com/silverstripe/silverstripe-upgrader/) has a task runner which
automates this process for you.
Install the upgrader:
```
export PATH=$PATH:~/.composer/vendor/bin/
composer global require silverstripe/upgrader
cd ~/Project/Root
~/.composer/vendor/bin/upgrade-code doctor
```
Run the upgrader:
```
cd ~/my-project-root
upgrade-code doctor
```
This will ensure that your `.htaccess` and `index.php` are set to a reasonable default value
@ -101,21 +167,15 @@ for a clean installation. If you have applied customisations to your `.htaccess`
file (e.g. a custom `main.php`, HTTP header configuration, deny file access),
you'll need to manually reapply these to the copied default file.
#### Upgrade references to renamed and namespaced classes
### <a name="namespaced-classes"></a>Renamed and namespaced classes
Nearly all core PHP classes have been namespaced. For example, `DataObject` is now called `SilverStripe\ORM\DataObject`.
The below tasks describe how to upgrade an existing site to remain compatible with the newly upgraded classes.
##### Using the upgrader tool to automatically upgrade
This task should be run on every upgraded project.
We have developed an [upgrader tool](https://github.com/silverstripe/silverstripe-upgrader/) to (semi-)automatically
update your 3.x code to the new naming. Here's an example how to upgrade your `mysite` folder:
```
composer global require silverstripe/upgrader
cd ~/Project/Root
cd ~/my-project-root
~/.composer/vendor/bin/upgrade-code upgrade ./mysite --write
```
@ -129,316 +189,7 @@ For a full list of renamed classes, check the `.upgrade.yml` definitions in each
The rename won't affect class-based permission codes or database table names.
##### Upgrade references to literal or class 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](api:SilverStripe\ORM\DataObjectSchema) service is available to manage these mappings
(see [versioned documentation](/developer_guides/model/data_model_and_orm)).
For example, the below shows how you would update a query with a hard-coded table name:
```diff
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();
}
```
##### Replacing literal strings with fully qualified class name, or ::class constant
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.
```diff
<?php
+ 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.
```diff
-MyObject:
+My\Project\MyObject:
property: value
```
##### Update references to literal classes to use Injector
In many places, classes namespaced in SilverStripe 4.x will still have a non-namespaced service
name that can be accessed via Injector. You should upgrade direct object constructors with
the Injector API.
E.g.
```diff
- $field = new Varchar();
+ $field = Injector::inst()->create('Varchar');
```
#### Migrate your controllers to their own files
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()`.
#### Upgrade template locations and references
Templates are now much more strict about their locations. You can no longer put a template in an arbitrary
folder and have it be found. Case is now also checked on case-sensitive filesystems.
Either include the folder in the template name (`renderWith('MyEmail.ss')` => `renderWith('emails/MyEmail.ss')`),
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 `SilverStripe\Forms` namespace.
#### Upgrade <% include %>
When using `<% include %>` template tag you can continue to leave out the `Includes` folder,
but this now will also search templates in the base folder if no Include can be found.
`<% include Sidebar %>` will match `Includes/Sidebar.ss`, but will also match `Sidebar.ss`
if the former is not present.
Please refer to our [template syntax](/developer_guides/templates/syntax) for details.
#### Upgrade static config settings to `private static`
If you have some class configuration statics defined and they aren't private,
you may find that they don't register anymore. For example, this code, taken from
the `silverstripe/tagfield` module will no longer work in SilverStripe 4.0.
```php
public static $allowed_actions = [
'suggest'
];
```
Changing the visibility to `private` (as per `RequestHandler::$allowed_actions`
visibility) will make it 4.0 compatible.
```diff
-public static $allowed_actions = [
+private static $allowed_actions = [
'suggest'
];
```
#### Upgrade module paths in file references
You should no longer rely on modules being placed in a deterministic folder (e.g. `/framework`),
and use getters on the [Module](api:SilverStripe\Core\Manifest\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:
```ss
<!-- before -->
<img src="framework/images/image.png" />
<% require css("framework/css/styles.css") %>
<!-- after -->
<img src="$ModulePath(silverstripe/framework)/image.png" />
<% require css("silverstripe/framework: css/styles.css") %>
```
Usage in Requirements:
```php
// before
Requirements::css('framework/css/styles.css');
// after
Requirements::css('silverstripe/framework: css/styles.css');
```
Usage with custom logic:
```php
// before
$moduleFilePath = FRAMEWORK_DIR . '/MyFile.php';
$baseFilePath = BASE_PATH . '/composer.json';
$mysiteFilePath = 'mysite/css/styles.css';
$themesFilePath = SSViewer::get_theme_folder() . '/css/styles.css';
$themeFolderPath = THEMES_DIR . '/simple';
// after
use SilverStripe\Core\Manifest\ModuleLoader;
use SilverStripe\View\ThemeResourceLoader;
$moduleFilePath = ModuleLoader::getModule('silverstripe/framework')->getRelativeResourcePath('MyFile.php');
$baseFilePath = Director::baseFolder() . '/composer.json';
$mysiteFilePath = ModuleLoader::getModule('mysite')->getRelativeResourcePath('css/styles.css');
$themesFilePath = ThemeResourceLoader::inst()->findThemedResource('css/styles.css');
$themeFolderPath = ThemeResourceLoader::inst()->getPath('simple');
```
Usage for Page and ModelAdmin:
```php
class ListingPage extends \Page {
private static $icon = 'mycompany/silverstripe-mymodule: client/images/sitetree_icon.png';
}
```
```php
class MyCustomModelAdmin extends \SilverStripe\Admin\ModelAdmin {
private static $menu_icon = 'mycompany/silverstripe-mymodule: client/images/modeladmin_icon.png';
}
```
To ensure consistency, we've also deprecated support for path constants:
* `FRAMEWORK_DIR` and `FRAMEWORK_PATH`
* `FRAMEWORK_ADMIN_DIR` and `FRAMEWORK_ADMIN_PATH`
* `FRAMEWORK_ADMIN_THIRDPARTY_DIR` and `FRAMEWORK_ADMIN_THIRDPARTY_PATH`
* `THIRDPARTY_DIR` and `THIRDPARTY_PATH`
* `CMS_DIR` and `CMS_PATH`
* `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:
```diff
-framework/
-cms/
...
+vendor/silverstripe/framework
+vendor/silverstripe/cms
```
Since the `vendor/` folder isn't publicly accessible, modules need to declare
which files need to be exposed via the new [vendor-plugin](https://github.com/silverstripe/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, either ensure those archives can correctly extract symlinks,
or explicitly switch to the "copy" mode to avoid symlinks.
### <a name="upgrading-specifics"></a>API Specific Upgrades
The below sections deal with upgrades to specific parts of various API. Projects which rely on certain
API should be upgraded as appropriate using any of the relevant processes documented below.
#### Upgrade references of SS_Log to use PSR-3 logging
One of the great changes that comes with SilverStripe 4 is the introduction of
[PSR-3](http://www.php-fig.org/psr/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:
```diff
-SS_Log::log('My error message', SS_Log::ERR);
+use Psr\Log\LoggerInterface;
+Injector::inst()->get(LoggerInterface::class)->error('My error message');
```
##### How to customise the default PSR-3 logger
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`
```yml
---
Name: custom-dev-logging
After: dev-logging
Only:
environment: dev
---
# Replace default handler with null
SilverStripe\Core\Injector\Injector:
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:
```yml
---
Name: custom-errorpage
After:
- '#loggingformatters'
---
SilverStripe\Core\Injector\Injector:
Monolog\Formatter\FormatterInterface.friendly:
class: WebDesignGroup\ShopSite\Logging\ErrorPageFormatter
```
`WebDesignGroup\ShopSite\Logging\ErrorPageFormatter` should be a class that
implements the `Monolog\Formatter\FormatterInterface` interface.
#### Upgrade `mysite/_config.php`
The globals `$database` and `$databaseConfig` are deprecated. You should upgrade your
site _config.php files to use the `.env` configuration (below).
`conf/ConfigureFromEnv.php` is also no longer used, and references to this file should be deleted.
If you need to configure database details in PHP you should configure these details via `.env` file,
or alternatively (but less recommended) use the new `DB::setConfig()` api.
The global `$project` is deprecated in favour of the configuration setting
`SilverStripe\Core\Manifest\ModuleManifest.project`.
Changes to `mysite/_config.php`:
```diff
<?php
-global $project;
-$project = 'mysite';
-include 'conf/ConfigureFromEnv.php';
```
And also add to `mysite/_config/mysite.yml`:
```yml
SilverStripe\Core\Manifest\ModuleManifest:
project: mysite
```
#### Upgrade of `_ss_environment.php` to `.env` configuration
### <a name="env"></a>`_ss_environment.php` changed to`.env`
The php configuration `_ss_environment.php` file has been replaced in favour of a non-executable
`.env` file, which follows a syntax similar to an `.ini` file for key/value pair assignment. Like
@ -504,20 +255,321 @@ To access environment variables you can use the `SilverStripe\Core\Environment::
See [Environment Management docs](/getting-started/environment_management/) for full details.
#### Replace usages of Object class
### <a name="migrate-file"></a>Migrate File DataObject
Object has been superseded by a trio of traits which replace components of this legacy class:
Since the structure of `File` dataobjects has changed, a new task `MigrateFileTask`
has been added to assist in migration of legacy files (see [file migration documentation](/developer_guides/files/file_migration)).
- Injectable: Provides `MyClass::create()` and `MyClass::singleton()`
- Configurable: Provides `MyClass::config()`
- Extensible: Provides all methods related to extensions (E.g. add_extension()).
```
$ ./vendor/bin/sake dev/tasks/MigrateFileTask
```
All custom method and extension instances are constructed lazily.
Any `File` dataobject which is not in the `File.allowed_extensions` config will be deleted
from the database during migration. Any invalid file on the filesystem will not be deleted,
but will no longer be attached to a dataobject, and should be cleaned up manually.
To disable this, set the following config:
In particular specific Object class usages should be replaced as below:
```yaml
SilverStripe\Assets\FileMigrationHelper:
delete_invalid_files: false
```
### <a name="inspect-hints"></a>Get upgrade tips on your code
Upgrade subclasses
While there's some code we can automatically rewrite, other uses of changed SilverStripe APIs aren't that obvious.
You can use our heuristics to get some hints on where you need to review code manually.
Hints will generally point to more detail about a specific upgrade in this guide.
This task should be run *after* `upgrade-code upgrade`.
```
~/.composer/vendor/bin/upgrade-code inspect ./mysite
```
These hints only cover a part of the upgrade work,
but can serve as a good indicator for where to start.
### <a name="literal-table-names"></a>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](api:SilverStripe\ORM\DataObjectSchema) service is available to manage these mappings
(see [Versioned documentation](/developer_guides/model/data_model_and_orm)).
For example, the below shows how you would update a query with a hard-coded table name:
```diff
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();
}
```
### <a name="literal-class-names"></a>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.
```diff
<?php
+ 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.
```diff
-MyObject:
+My\Project\MyObject:
property: value
```
### <a name="controllers-own-files"></a>Move controllers to their own files
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()`.
### <a name="template-locations"></a>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('MyEmail.ss')` => `renderWith('emails/MyEmail.ss')`),
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 `SilverStripe\Forms` namespace.
When using `<% include %>` template tag you can continue to leave out the `Includes` folder,
but this now will also search templates in the base folder if no Include can be found.
`<% include Sidebar %>` will match `Includes/Sidebar.ss`, but will also match `Sidebar.ss`
if the former is not present.
Please refer to our [template syntax](/developer_guides/templates/syntax) for details.
### <a name="private-static"></a>Config settings should be set to `private static`
Class configuration defined as `static` properties need to be marked as `private` to take effect:
```diff
-public static $allowed_actions = [
+private static $allowed_actions = [
'suggest'
];
```
### <a name="module-paths"></a>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](api:SilverStripe\Core\Manifest\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:
```diff
-<img src="framework/images/image.png" />
+<img src="$ModulePath(silverstripe/framework)/image.png" />
-<% require css("framework/css/styles.css") %>
+<% require css("silverstripe/framework: css/styles.css") %>
```
Usage in Requirements:
```diff
-Requirements::css('framework/css/styles.css');
+Requirements::css('silverstripe/framework: css/styles.css');
```
Usage with custom logic:
```diff
+use SilverStripe\Core\Manifest\ModuleLoader;
+use SilverStripe\View\ThemeResourceLoader;
-$moduleFilePath = FRAMEWORK_DIR . '/MyFile.php';
+$moduleFilePath = ModuleLoader::getModule('silverstripe/framework')->getRelativeResourcePath('MyFile.php');
-$baseFilePath = BASE_PATH . '/composer.json';
+$baseFilePath = Director::baseFolder() . '/composer.json';
-$mysiteFilePath = 'mysite/css/styles.css';
+$mysiteFilePath = ModuleLoader::getModule('mysite')->getRelativeResourcePath('css/styles.css');
-$themesFilePath = SSViewer::get_theme_folder() . '/css/styles.css';
+$themesFilePath = ThemeResourceLoader::inst()->findThemedResource('css/styles.css');
-$themeFolderPath = THEMES_DIR . '/simple';
+$themeFolderPath = ThemeResourceLoader::inst()->getPath('simple');
```
Usage for Page and ModelAdmin:
```php
class ListingPage extends \Page {
private static $icon = 'mycompany/silverstripe-mymodule: client/images/sitetree_icon.png';
}
```
```php
class MyCustomModelAdmin extends \SilverStripe\Admin\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 `FRAMEWORK_DIR` and `FRAMEWORK_PATH`
* Deprecated `FRAMEWORK_ADMIN_DIR` and `FRAMEWORK_ADMIN_PATH`
* Deprecated `FRAMEWORK_ADMIN_THIRDPARTY_DIR` and `FRAMEWORK_ADMIN_THIRDPARTY_PATH`
* Deprecated `THIRDPARTY_DIR` and `THIRDPARTY_PATH`
* Deprecated `CMS_DIR` and `CMS_PATH`
* Deprecated `THEMES_DIR` and `THEMES_PATH`
* Deprecated `MODULES_PATH` and `MODULES_DIR`
### <a name="vendor-folder"></a>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:
```diff
-framework/
+vendor/silverstripe/framework/
-cms/
+vendor/silverstripe/cms/
...
```
Since the `vendor/` folder isn't publicly accessible, modules need to declare
which files need to be exposed via the new [vendor-plugin](https://github.com/silverstripe/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, either ensure those archives can correctly extract symlinks,
or explicitly switch to the "copy" mode to avoid symlinks.
### <a name="psr3-logging"></a>SS_Log replaced with PSR-3 logging
One of the great changes that comes with SilverStripe 4 is the introduction of
[PSR-3](http://www.php-fig.org/psr/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:
```diff
-SS_Log::log('My error message', SS_Log::ERR);
+use Psr\Log\LoggerInterface;
+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`
```yml
---
Name: custom-dev-logging
After: dev-logging
Only:
environment: dev
---
# Replace default handler with null
SilverStripe\Core\Injector\Injector:
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:
```yml
---
Name: custom-errorpage
After:
- '#loggingformatters'
---
SilverStripe\Core\Injector\Injector:
Monolog\Formatter\FormatterInterface.friendly:
class: WebDesignGroup\ShopSite\Logging\ErrorPageFormatter
```
`WebDesignGroup\ShopSite\Logging\ErrorPageFormatter` should be a class that
implements the `Monolog\Formatter\FormatterInterface` interface.
### <a name="config-php"></a>Upgrade `mysite/_config.php`
The globals `$database` and `$databaseConfig` are deprecated. You should upgrade your
site `_config.php` files to use the [.env configuration](#env)
`conf/ConfigureFromEnv.php` is no longer used, and references to this file should be deleted.
If you need to configure database details in PHP you should configure these details via `.env` file,
or alternatively (but less recommended) use the new `DB::setConfig()` api.
The global `$project` is deprecated in favour of the configuration setting
`SilverStripe\Core\Manifest\ModuleManifest.project`.
Changes to `mysite/_config.php`:
```diff
<?php
-global $project;
-$project = 'mysite';
-include 'conf/ConfigureFromEnv.php';
```
And also add to `mysite/_config/mysite.yml`:
```yml
SilverStripe\Core\Manifest\ModuleManifest:
project: mysite
```
### <a name="object-replace"></a>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
```diff
@ -536,7 +588,7 @@ Upgrade subclasses
```
References to $this->class
Upgrade references to $this->class
```diff
-$obj->class
@ -561,7 +613,7 @@ Upgrade create_from_string()
+$obj = Injector::inst()->create('Varchar(100)');
```
Extensions
Upgrade extension use
```diff
@ -578,20 +630,17 @@ Extensions
+$extensions = DataObject::get_extensions(File::class); // alternate
```
#### Upgrade references to Session object
### <a name="session"></a>Session object removes static methods
Session object is no longer statically accessible via `Session::inst()`. Instead, Session
is a member of the current request.
```diff
-public function httpSubmission($data, $form, $request)
-{
public function httpSubmission($data, $form, $request)
{
- Session::set('loggedIn', null);
-}
+public function httpSubmission($data, $form, $request)
+{
+ $request->getSession()->set('loggedIn', null);
+}
}
```
@ -599,16 +648,14 @@ In some places it may still be necessary to access the session object where no r
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.
#### Upgrade extensions to work as singletons
### <a name="extensions-singletons"></a>Extensions are now singletons
In SilverStripe 4.0 extensions are now all singletons, meaning that state stored as protected vars
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.
E.g.
```diff
class MyExtension extends Extension {
public function getContent() {
@ -626,11 +673,9 @@ class MyExtension extends Extension {
}
```
In addition when using extensions with distinct constructor arguments it's advisable to
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`.
E.g. This is the service definition for the various versioned extension variants
`private static $extensions`. Please review the default service definitions below:
```yaml
---
@ -651,7 +696,7 @@ SilverStripe\Core\Injector\Injector:
SilverStripe\Versioned\Versioned: '%$SilverStripe\Versioned\Versioned.stagedversioned'
```
Upgrade your extension references as below:
Upgrade your extension references:
```diff
class MyClass extends DataObject {
@ -662,20 +707,29 @@ class MyClass extends DataObject {
}
```
#### Compatibility with the new front-end building tools
If you are using Requirements from 3.x then your scripts should continue to work as they did before.
The new front-end tooling is intended only for those wishing to customise the CMS look and feel, or behaviour.
Those wishing to customise the CMS should read about how to
[customise the admin interface](/developer_guides/customising_the_admin_interface/).
#### Upgrade static references to asset paths
### <a name="static-asset-paths"></a>Static references to asset paths
All static files (images, javascript, stylesheets, fonts) used for the CMS and forms interfaces
in `framework` and `cms` have moved locations. These assets are now placed in a `client/` subfolder,
to account for a structural change where both javascript and styles are co-located in component-specific folders.
which are also sub-folders of the modules which now reside in `vendor`.
This will affect you if you have used `Requirements::block()` on files in the `framework/` or `cms/` folder.
In order to identify resources it is preferred to use the new module-root prefixed string form when
adding requirements.
Usage in Requirements:
```diff
-Requirements::css('framework/admin/css/styles.css');
+Requirements::css('silverstripe/admin: client/dist/styles/bundle.css');
```
The location of these resources is determined from the `name` field in the `composer.json`
for each module. `silverstripe/admin:` will be mapped to the folder `vendor/silverstripe/admin`
where this module is installed, based on the `vendor/silverstripe/admin/composer.json` name
matching the prefix in `Requirements::css()`.
Care should also be taken when referencing images in these folders from your own stylesheets (`url()`),
or via SilverStripe templates (`<img>` tags).
@ -683,21 +737,21 @@ or via SilverStripe templates (`<img>` tags).
failing silently, so check your `Requirements` are pointing to files that exist.
```
framework/javascript => silverstripe-admin/client/dist/
framework/javascript/lang => silverstripe-admin/client/lang/
framework/images => silverstripe-admin/client/dist/images/
framework/css => silverstripe-admin/client/dist/css/
framework/scss => silverstripe-admin/client/src/styles/
admin/javascript/ => silverstripe-admin/client/src/
admin/javascript/src/ => silverstripe-admin/client/src/legacy/ (mostly)
admin/javascript/lang/ => silverstripe-admin/client/lang/
admin/scss/ => silverstripe-admin/client/styles/legacy/
admin/css/ => silverstripe-admin/client/dist/css/
admin/css/screen.css => silverstripe-admin/client/dist/css/bundle.css
admin/images/ => silverstripe-admin/client/dist/images/
admin/images/sprites/src/ => silverstripe-admin/client/src/sprites/
admin/images/sprites/dist/ => silverstripe-admin/client/dist/sprites/
admin/font/ => silverstripe-admin/client/dist/font/
framework/javascript => silverstripe/admin:client/dist/
framework/javascript/lang => silverstripe/admin:client/lang/
framework/images => silverstripe/admin:client/dist/images/
framework/css => silverstripe/admin:client/dist/css/
framework/scss => silverstripe/admin:client/src/styles/
admin/javascript/ => silverstripe/admin:client/src/
admin/javascript/src/ => silverstripe/admin:client/src/legacy/ (mostly)
admin/javascript/lang/ => silverstripe/admin:client/lang/
admin/scss/ => silverstripe/admin:client/styles/legacy/
admin/css/ => silverstripe/admin:client/dist/css/
admin/css/screen.css => silverstripe/admin:client/dist/css/bundle.css
admin/images/ => silverstripe/admin:client/dist/images/
admin/images/sprites/src/ => silverstripe/admin:client/src/sprites/
admin/images/sprites/dist/ => silverstripe/admin:client/dist/sprites/
admin/font/ => silverstripe/admin:client/dist/font/
```
Most JavaScript files in `framework/javascript` have been removed,
@ -709,8 +763,8 @@ 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()`.
SilverStripe core is moving away from `Requirements::combine_files` in favour of Webpack as of
4.0. `Requirements::combine_files` is being considered for deprecation in future versions.
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
@ -724,7 +778,10 @@ One commonly linked thirdparty dependency is `jquery.js` bundled with SilverStri
framework/thirdparty/jquery/jquery.js => framework/admin/thirdparty/jquery/jquery.js
```
#### Explicit text casting is now enforced on all template variables
If you have customised the CMS UI (via JavaScript or CSS), please read our guide to
[customise the admin interface](/developer_guides/customising_the_admin_interface/).
### <a name="template-casting"></a>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
@ -737,61 +794,42 @@ explicitly cast for that field.
You can resolve this in your model by adding an explicit cast to HTML for those fields.
Before:
```php
```diff
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);
+ $title = Convert::raw2xml($this->Title);
return "<h1>{$title}</h1>";
}
}
```
After:
```php
class MyObject extends SilverStripe\View\ViewableData
{
private static $casting = [
'SomeHTML' => 'HTMLText'
];
public function getSomeHTML
{
$title = SilverStripe\Core\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`
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](/developer_guides/templates/casting)).
#### Upgrade code that uses SQLQuery
Where your code once used SQLQuery you should now use SQLSelect in all cases, as this has been removed (check the [3.2.0](3.2.0) upgrading notes).
#### Upgrade code that uses UploadField
### <a name="uploadfield"></a>Replace UploadField with injected service
This field has been superceded by a new class provided by the
[asset-admin](https://github.com/silverstripe/silverstripe-asset-admin) module, which provides a more
streamlined simpler mechanism for uploading File dataobjects.
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.
Usages of `UploadField` will need to be upgraded as below.
Before:
```php
```diff
use SilverStripe\Forms\FieldList;
use SilverStripe\AssetAdmin\Forms\UploadField;
-use SilverStripe\AssetAdmin\Forms\UploadField;
+use SilverStripe\Forms\FileHandleField;
use SilverStripe\ORM\DataObject;
class MyClass extends DataObject
@ -799,45 +837,27 @@ class MyClass extends DataObject
public function getCMSFields()
{
return new FieldList(
new UploadField('Files')
- new UploadField('Files')
+ Injector::inst()->create(FileHandleField::class, 'Files')
);
}
}
```
After:
```php
use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\FileHandleField;
class MyClass extends DataObject
{
public function getCMSFields()
{
return FieldList::create(
Injector::inst()->create(FileHandleField::class, 'Files')
);
}
}
```
#### Upgrade code that uses i18n
### <a name="i18n"></a>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
- `_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.
Note: If you attempt to use non-associative injection arguments with named placeholders, the result will
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.
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.
@ -899,8 +919,8 @@ en:
```
Usage of these pluralised strings is through the existing _t() method,
and require a `|` pipe-delimeter with a {count} argument.
Usage of these pluralised strings is through the existing `_t()` method,
and require a `|` pipe-delimeter with a `{count}` argument.
```php
@ -917,7 +937,7 @@ 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
### <a name="member-date-time-fields"></a>Removed Member.DateFormat and Member.TimeFormat database settings
We're using [native HTML5 date and time pickers](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date)
in `DateField` and `TimeField` now ([discussion](https://github.com/silverstripe/silverstripe-framework/issues/6626)),
@ -930,7 +950,7 @@ Consequently, we've also removed `MemberDatetimeOptionsetField`.
the [IntlDateFormatter defaults](http://php.net/manual/en/class.intldateformatter.php) for the selected locale.
#### New asset storage mechanism
### <a name="asset-storage"></a>New asset storage mechanism
File system has been abstracted into an abstract interface. By default, the out of the box filesystem
uses [Flysystem](http://flysystem.thephpleague.com/) with a local storage mechanism (under the assets directory).
@ -955,31 +975,7 @@ Depending on your server configuration, it may also be necessary to adjust your
permissions. Please see the [common installation problems](/getting_started/installation/common_problems)
guide for configuration instruction.
#### Migrating File DataObject from 3.x to 4.0
Since the structure of `File` dataobjects has changed between 3.0 and 4.0, a new task `MigrateFileTask`
has been added to assist in migration of legacy files.
You can run this task on the command line:
```
$ ./framework/sake dev/tasks/MigrateFileTask
```
For more information on this task please consult the [file migration documentation](/developer_guides/files/file_migration).
Note that any File dataobject which is not in the `File.allowed_extensions` config will be deleted
from the database during migration. Any invalid file on the filesystem will not be deleted,
but will no longer be attached to a dataobject anymore, and should be cleaned up manually.
To disable this, set the following config:
```yaml
SilverStripe\Assets\FileMigrationHelper:
delete_invalid_files: false
```
#### Upgrade code which acts on `Image`
### <a name="image-handling"></a>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
@ -1019,7 +1015,7 @@ class MyObject extends SilverStripe\ORM\DataObject
}
```
#### Upgrading code that writes to `File` dataobjects, or writes files to the 'assets' folder
### <a name="write-file-dataobject"></a>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.
@ -1066,7 +1062,7 @@ You can disable File versioning by adding the following to your `_config.php`
SilverStripe\Assets\File::remove_extension('Versioned');
```
#### Upgrading code performs custom image manipulations
### <a name="image-manipulations"></a>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,
@ -1134,52 +1130,32 @@ There are a few differences in this new API:
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.
#### Upgrading code that uses File or Image shortcode handler
### <a name="file-shortcode"></a>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 `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`
The shortcode handler for `File` has been moved to `SilverStripe\Assets\ShortcodesFileShortcodeProvider` and the Image handler has been moved to `SilverStripe\Assets\Shortcodes\ImageShortcodeProvider`
Before this change, to use the handle_shortcode method, you would do something like this:
```
<?php
Example of changed shortcode handling:
```diff
+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 File::handle_shortcode($arguments, $this->content, $parser, $shortcode);
+ return FileShortcodeProvider::handle_shortcode($arguments, $this->content, $parser, $shortcode);
}
}
```
In the new situation, this would look like this:
```
<?php
use SilverStripe\Assets\Shortcodes\FileShortcodeProvider;
class MyShortcodeUser extends Object
{
private $content;
public function Content($arguments, $parser, $shortcode)
{
return FileShortcodeProvider::handle_shortcode($arguments, $this->content, $parser, $shortcode);
}
}
```
#### Upgrading code that uses composite db fields.
### <a name="compositedbfield"></a>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.
@ -1189,7 +1165,7 @@ The below describes the minimum amount of effort required to implement a composi
```php
use SilverStripe\ORM\FieldType\DBComposite;
class MyAddressField extends DBComposite
class MyAddressField extends
{
private static $composite_db = [
'Street' => 'Varchar(200)',
@ -1205,7 +1181,7 @@ class MyAddressField extends DBComposite
}
```
#### Upgrading code that references `DataObject::database_fields` or `DataObject::db`
### <a name="dataobject-db-database-fields"></a>`DataObject::database_fields` or `DataObject::db`
These methods have been updated to include base fields (such as ID, ClassName, Created, and LastEdited), as
well as composite DB fields.
@ -1221,18 +1197,25 @@ when set to true (with a field name as the first parameter), will also include t
`Table.ClassName(args)` format.
#### Upgrade code that uses SQLQuery
### <a name="sqlquery"></a>Rewrite SQLQuery to more specific classes
SQLQuery is still implemented, but now extends the new SQLSelect class and has some methods
deprecated. Previously this class was used for both selecting and deleting, but these
have been superceded by the specialised SQLSelect and SQLDelete classes.
Instead of `SQLQuery`, you should now use `SQLSelect`, `SQLUpdate`, `SQLInsert`
or `SQLDelete` - check the [3.2.0](3.2.0#sqlquery) upgrading notes for details.
Take care for any code or functions which expect an object of type `SQLQuery`, as
these references should be replaced with `SQLSelect`. Legacy code which generates
`SQLQuery` can still communicate with new code that expects `SQLSelect` as it is a
subclass of `SQLSelect`, but the inverse is not true.
Example:
#### Upgrade BuildTask classes
```diff
-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']);
}
}
```
### <a name="buildtask-segment"></a>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
@ -1247,39 +1230,7 @@ class MyTask extends BuildTask
}
```
#### Upgrade implementations of augmentSQL
Since this method now takes a `SQLSelect` as a first parameter, existing code referencing the deprecated `SQLQuery`
type will raise a PHP error.
Before:
```php
function augmentSQL(SQLQuery &$query, DataQuery &$dataQuery = null)
{
$locale = Translatable::get_current_locale();
if(!preg_match('/("|\'|`)Locale("|\'|`)/', implode(' ', $query->getWhere()))) {
$qry = sprintf('"Locale" = \'%s\'', Convert::raw2sql($locale));
$query->addWhere($qry);
}
}
```
After:
```php
public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null)
{
$locale = Translatable::get_current_locale();
if (!preg_match('/("|\'|`)Locale("|\'|`)/', implode(' ', $query->getWhereParameterised($parameters)))) {
$query->addWhere([
'"Locale"' => $locale
]);
}
}
```
#### Moved ErrorPage into a new module
### <a name="errorpage"></a>Moved ErrorPage into a new module
ErrorPage has been moved to a separate [silverstripe/errorpage module](http://addons.silverstripe.org/add-ons/silverstripe/errorpage)
to allow for alternative approaches to managing error responses.
@ -1293,7 +1244,7 @@ By default, SilverStripe will display a plaintext "not found" message when the m
Check the [module upgrading guide](http://addons.silverstripe.org/add-ons/silverstripe/errorpage)
for more configuration API changes on the `ErrorPage` class.
#### Upgrading asset web.config, .htaccess, or other server configuration
### <a name="assets-server-config"></a>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:
@ -1314,27 +1265,13 @@ If upgrading from an existing installation, make sure to invoke `?flush=all` at
See our ["File Security" guide](/developer_guides/files/file_security) for more information.
#### `ListboxField` is now multiple-only
Previously, this field would operate as either a single select (default) or multi-select by setting
`setMultiple` to either true or false.
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.
Where previously you could specify a list of grouped values in the same way as `setSource`, this
method now only accepts either a non-associative array of values (not titles) or an `SS_List`
of items to disable.
#### Upgrading TinyMCE to 4.0
### <a name="tinymce"></a>TinyMCE v4
Please see the [tinymce upgrading guide](http://archive.tinymce.com/wiki.php/Tutorial:Migration_guide_from_3.x)
to assist with upgrades to customisations to tinymce 3.
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. These include:
buttons removed from the default cms configuration:
* Strikethrough
* Styles dropdown
@ -1346,7 +1283,7 @@ buttons removed from the default cms configuration. These include:
* Fullscreen
However, these function may be enabled on a case by case basis through modifification of the default
tinymce config, or by creating custom configurations.
tinymce config, or by creating custom configurations (check [TinyMCE documentation](https://www.tinymce.com/docs/configure/)).
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:
@ -1369,10 +1306,7 @@ $editor->setOption('charmap_append', [
]);
```
For more information on available options and plugins please refer to the
[TinyMCE documentation](https://www.tinymce.com/docs/configure/)
#### Upgrading DataObjects with the `Versioned` extension
### <a name="dataobject-versioned"></a>DataObjects 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.
@ -1420,7 +1354,7 @@ These methods are deprecated:
* `Versioned::publish` Replaced by `Versioned::copyVersionToStage`
* `Versioned::doPublish` Replaced by `Versioned::publishRecursive`
#### Implementation of ownership API
### <a name="ownership"></a>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 objects. This is done to ensure that the published state
@ -1465,14 +1399,14 @@ setting on the child object.
For more information, see the [DataObject ownership](https://docs.silverstripe.org/en/4/developer_guides/model/versioning/#dataobject-ownership) documentation and the [versioning](/developer_guides/model/versioning) documentation
#### ChangeSet batch publishing
### <a name="changeset"></a>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
### <a name="image-shortcode"></a>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`.
@ -1482,78 +1416,49 @@ of the `Image` record rather than its path on the filesystem. The shortcode will
when the field is rendered. Newly inserted images will automatically receive the shortcode and ownership tracking,
and existing `<img>` will continue to work.
#### Upgrading references to DBField and subclasses
### <a name="dbfield-rename"></a>Renamed DBField and subclasses
A major change in 4.0 is the introduction of namespaced DBField subclasses. Now as a standard, all DBField subclasses have a `DB` prefix, are namespaced, and have an associative alias which omits the DB prefix.
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 instanciating or otherwise referencing those classes directly (not through strings),
they'll likely get rewritten automatically through the
[upgrader tool](https://github.com/silverstripe/silverstripe-upgrader/).
This means that for the most part, code that worked in 3.0 won't need to be changed, although if you have any hard class literals which reference the old classes, they will need to be updated to point to the new namespaced classes.
Example:
An exception to this is any classes which once had the `SS_` prefix, which will now be instead prefixed with `DB`, and have an un-aliased prefix. For example `SS_Datetime` is now `DBDateTime`, and has the alias `DateTime` which may be used in config.
Before:
```php
```diff
use SilverStripe\ORM\DataObject;
+use SilverStripe\ORM\FieldType\DBVarchar;
class MyObject extends DataObject
{
private static $db = [
'Number' => 'Int',
'Time' => 'SS_Datetime'
- 'Time' => 'SS_Datetime'
+ 'Time' => 'Datetime'
];
/**
* @param Int $val
* @return Varchar
*/
public function TextNumber()
{
return new Varchar('TextNumber', 'Number is ' . $this->Number);
- return new Varchar('TextNumber', 'Number is ' . $this->Number);
+ return new DBVarchar('TextNumber', 'Number is ' . $this->Number);
}
}
```
After:
### <a name="restfulservice"></a>Removed RestfulService
```php
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\FieldType\DBVarchar;
The `RestfulService` API was a (poor) attempt at a built-in HTTP client.
We've removed it, and recommend using [Guzzle](http://docs.guzzlephp.org/en/latest/) instead.
class MyObject extends DataObject
{
private static $db = [
'Number' => 'Int',
'Time' => 'Datetime'
];
/**
* @param Int $val
* @return Varchar
*/
public function TextNumber()
{
return new DBVarchar('TextNumber', 'Number is ' . $this->Number);
}
}
```
Note that string references to `SS_Datetime` passed to injector, or used in config values, will still work, and will refer to the updated class names.
#### Upgrading from deprecated RestfulService
Install Guzzle to get an API consuming library.
`composer require guzzlehttp/guzzle` or add `guzzlehttp/guzzle: "^6.0"` to your composer.json.
For information on how to use Guzzle, please see the extensive [Guzzle documentation](http://docs.guzzlephp.org/en/latest/)
In case you want to keep using RestfulService, you can use `Firesphere/silverstripe-restfulservice`, but it is unmaintained and deprecated.
#### Upgrading from deprecated Oembed
### <a name="oembed"></a>Removed Oembed
Instead of Oembed, the framework now relies on [oscarotero/Embed](https://github.com/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 oscarotero.
If you have custom embedding-code relying on `Oembed`, please refer to the documentation provided by this package.
#### Admin URL can now be configured via custom Director routing rule
### <a name="admin-url"></a>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
@ -1561,9 +1466,12 @@ to update those with the appropriate function or config call. See
[CMS architecture](/developer_guides/customising_the_admin_interface/cms-architecture#the-admin-url) for language
specific functions.
#### Upgrading custom Authenticators
### <a name="custom-authenticators"></a>Custom Authenticators
The methods `register` and `unregister` on `Authenticator` are deprecated in favor of the `Config` system. This means that any custom Authenticator needs to be registered through the yml config. For further information on how to create a custom authentication method, [see the Authentication documentation](/developer_guides/Security/Authentication).
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](/developer_guides/Security/Authentication)
for details how to setup a custom handler.
```yml
SilverStripe\Security\Authenticator;
@ -1571,7 +1479,8 @@ SilverStripe\Security\Authenticator;
- 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:
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:
```yml
SilverStripe\Security\Authenticator:
@ -1579,15 +1488,15 @@ SilverStripe\Security\Authenticator:
```
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.
##### IdentityStore and RequestFilters
As of SilverStripe 4, every request is authenticated against an `IdentityStore`, by default 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 no `null`.
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).
#### Upgrading Config API usages
### <a name="config"></a>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
@ -1595,7 +1504,7 @@ bootstrap, and requires a developer to invoke `Config::modify()` to make mutable
This will immediately have a slight performance hit, so should be done sparingly, and avoided at all
if possible in performance intensive applications.
In addition, the `Config::inst()->update()` method is deprecated, and replaced with `Config::modify()->set()` and
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 yml blocks) falsey-values (including nulls)
@ -1605,7 +1514,7 @@ One removed feature is the `Config::FIRST_SET` option. Either use uninherited co
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`.
#### Upgrading Cache API
### <a name="cache"></a>Replace Zend_Cache with symfony/cache
We have replaced the unsupported `Zend_Cache` library with [symfony/cache](https://github.com/symfony/cache).
This also allowed us to remove SilverStripe's `Cache` API and use dependency injection with a standard
@ -1640,7 +1549,7 @@ and have a slightly different API (e.g. `set()` instead of `save()`).
+$cache->delete('myCacheKey');
```
With the necessary minimal config in _config/mycache.yml
With the necessary minimal config in `_config/mycache.yml`
```yml
---
@ -1653,12 +1562,10 @@ SilverStripe\Core\Injector\Injector:
namespace: 'mycache'
```
##### Configuration Changes
Caches are now configured through dependency injection services instead of PHP.
See our ["Caching" docs](/developer-guides/performance/caching) for more details.
Before (mysite/_config.php):
Before (`mysite/_config.php`):
```php
Cache::add_backend(
@ -1674,7 +1581,7 @@ Cache::add_backend(
Cache::pick_backend('primary_memcached', 'any', 10);
```
After (mysite/_config/config.yml):
After (`mysite/_config/config.yml`):
```yml
---
@ -1701,13 +1608,13 @@ 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.
#### Upgrading user-code to use namespaces
### Upgrading user-code to use namespaces
Upgrading code to use namespaces is quite a complex process, and as such we have provided
several development tools and processes to help make the upgrade user friendly and as
automated as possible.
##### Using the upgrader tool to automatically apply namespaces
### Using the upgrader tool to automatically apply namespaces
The [upgrader tool](https://github.com/silverstripe/silverstripe-upgrader/) provides a feature
to not only automatically namespace code, but will provide automatic upgrade of other code
@ -1740,7 +1647,7 @@ This task will not do the following, and must be done manually:
Please see the following steps for more information.
##### Using the upgrader tool to update references to namespaced user classes
### Using the upgrader tool to update references to namespaced user classes
Once a project has been namespaced all newly renamed classes will have a mapping included in the `mysite/.upgrade.yml`
file. If you have any user-code that references these, you may need to run the upgrader again (as you did did
@ -1752,7 +1659,7 @@ cd ~/Project/Root
~/.composer/vendor/bin/upgrade-code upgrade ./othercode --write
```
##### Updating custom dataobjects to use existing table names
### Updating custom dataobjects 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
@ -1768,7 +1675,7 @@ class GalleryPage extends Page
}
```
##### Class name remapping
### <a name="class-name-remapping"></a>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`
@ -1792,7 +1699,7 @@ SilverStripe\ORM\DatabaseAdmin:
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`
#### Using php code checker to automatically update to PSR-2
### <a name="psr2"></a>PSR-2 Coding Standard compliance
You can use the [php codesniffer](https://github.com/squizlabs/PHP_CodeSniffer) tool
to not only detect and lint PSR-2 coding errors, but also do some minimal automatic
@ -1810,7 +1717,7 @@ code style migration.
Repeat the final step and manually repair suggested changes, as necessary,
until you no longer have any linting issues.
#### Upgrade user-code to use PSR-4 autoloading
### <a name="psr4"></a>PSR-4 autoloading for project code
While not critical to an upgrade, SilverStripe 4.0 has adopted the [PS-4 autoloading](http://www.php-fig.org/psr/psr-4/)
standard for the core modules, so it's probably a good idea to be consistent.
@ -1846,9 +1753,7 @@ that it belongs to, e.g. `themes/mytheme/templates/MyVendor/Foobar/Model/MyModel
## <a name="api-changes"></a>API Changes
### <a name="overview-general"></a>General and Core API
#### <a name="overview-general-api"></a>General and Core API Additions / Changes
### <a name="overview-general"></a>General
* Minimum PHP version raised to 5.6 (with support for PHP 7.x)
* Dropped support for PHP safe mode (removed php 5.4).
@ -1866,7 +1771,7 @@ that it belongs to, e.g. `themes/mytheme/templates/MyVendor/Foobar/Model/MyModel
* 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.
* <a name="object-usecustomclass"></a>`Object::useCustomClass` has been removed. You should use the config API with Injector instead.
* `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.
@ -1887,111 +1792,92 @@ that it belongs to, e.g. `themes/mytheme/templates/MyVendor/Foobar/Model/MyModel
* 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)
* 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](https://github.com/silverstripe/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.
* 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.
* `Object` class has been removed.
* `parse_class_spec` moved to `ClassInfo`
* `create_from_spec` functionality removed, but now supportede by `Injector` natively.
* `Injectable`, `Extensible` and `Configurable` traits added to support other methods.
* Certain methods have been moved from `Controller` to `RequestHandler`:
* `Link`
* `redirect`
* `redirectBack`
* `RequestHandler` link and redirection behaviour has been enhanced slightly:
* `Link` now relies on the `url_segment` handler being provided for the class.
* 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.
* `getBackURL` and `getReturnReferer` have been added to safely inspect the current request
* `RequestHandler::getBackURL()` and `getReturnReferer()` have been added to safely inspect the current request
to see if there is a url to redirect back to.
* `LeftAndMain` class has had all tree manipulation code moved into CMS module class `CMSMain`.
This includes:
* `LeftAndMain_TreeNode` class -> renamed to `CMSMain_TreeNode`
* `SiteTreeAsUL` removed (override left in `CMSMain`)
* `getSiteTreeFor()` -> moved to `CMSMain`
* `getsubtree()` -> moved to `CMSMain`
* `updatetreenodes()` -> moved to `CMSMain`
* `savetreenodes()` -> moved to `CMSMain`
* `EditorToolbar()` method renamed to `Modals()` and now returns a `ModalController` handler
* Renamed `LeftAndMain_TreeNode` to `CMSMain_TreeNode`
* Removed `LeftAndMain::SiteTreeAsUL()` (override left in `CMSMain`)
* 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`
* Some `Director` API have been removed.
* $dev_servers
* $test_servers
* $urlParams and setUrlParams()
* `Director.alternate_host` removed. Use `Director.alternate_base_url` instead.
* `Director.alternate_protocol` removed. Use `Director.alternate_base_url` instead.
* Global enviromnent variables changed:
* 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](/getting-started/environment_management/) 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.
* `MODULES_PATH` removed
* `MODULES_DIR` removed
* `SS_HOST` removed. Use `SS_BASE_URL` instead.
* Removed `SS_HOST` environment constant. Use `SS_BASE_URL` instead.
* `Member::canLogIn()` now returns boolean. Use `Member::validateCanLogin()` to get a `ValidationResult`
* `Security` methods deprecated:
* `has_default_admin` use `DefaultAdminService::hasDefaultAdmin()` instead
* `check_default_admin` use `DefaultAdminService::isDefaultAdminCredentials()` instead
* `default_admin_username` use `DefaultAdminService::getDefaultAdminUsername()` instead
* `default_admin_password` use `DefaultAdminService::getDefaultAdminPassword()` instead
* `setDefaultAdmin` use `DefaultAdminService::setDefaultAdmin()` instead
* `clearDefaultAdmin` use `DefaultAdminService::clearDefaultAdmin()` instead
* `findAnAdministrator` use `DefaultAdminService::findOrCreateDefaultAdmin()` instead
* `Member` methods deprecated:
* `checkPassword`. Use Authenticator::checkPassword() instead
* `RequestFilter` has been deprecated in favour of
[HTTPMiddleware](/developer_guides/controllers/middlewares). Also the legacy RequestFilter
API has changed: $session and $dataModel variables removed from preRequest / postRequest.
* 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](/developer_guides/controllers/middlewares) 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.
#### <a name="overview-general-removed"></a>General and Core Removed API
* Removed `ConfigureFromEnv.php` as it's no longer necessary.
* `Session` object has had significant refactoring. This object no longer is accessed via
`Session::inst()`, but instead should be queried from the current request via `$request->getSession()`.
* 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.
Please see the upgrading section on Session object for more details.
* `Director.rules` config no longer support `redirect:<url>` directly via config.
* `Director::set_environment_type()` has been removed.
* 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();`.
* The environment can no longer be configured via YAML (`Director.environment_type`).
(e.g. `$type = Injector::inst()->get(Kernel::class)->getEnvironment()`)
* Removed `Director.environment_type` to configure the environment via YAML.
Use a [.env file](/getting_started/environment_management) to manage environment settings.
* Many global methods have been refactored into `Environment` or `Convert` class.
* `increase_xdebug_nesting_level_to` removed (functionality has been inlined into `AppKernel`)
* `set_increase_time_limit_max` moved to `Environment::setTimeLimitMax()`
* `get_increase_time_limit_max` moved to `Environment::getTimeLimitMax()`
* `set_increase_memory_limit_max` moved to `Environment::setMemoryLimitMax()`
* `get_increase_memory_limit_max` moved to `Environment::getMemoryLimitMax()`
* `increase_time_limit_to` moved to `Environment::increaseTimeLimitTo()`
* `increase_memory_limit_to` moved to `Environment::increaseMemoryLimitTo()`
* `translate_memstring` moved to `Convert::memstring2bytes`.
* `getTempFolder` moved to `TempFolder::getTempFolder()`
* `getTempParentFolder` removed.
* `getTempFolderUsername` removed.
* `CMSMain::buildbrokenlinks()` action is removed.
* `Injector::unregisterAllObjects()` has been removed. Use `unregisterObjects` to unregister
* 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.
* `SS_Log` class has been removed. Use `Injector::inst()->get(LoggerInterface::class)` 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 (`http://mydomain.com/dev/tests`), use the standard CLI
command instead (`vendor/bin/phpunit`).
* Removed `dev/jstests/` controller (no replacement)
* Removed `TestRunner` and `JSTestRunner` APIs
* 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
* Removed the `History.js` javascript library.
* `debugmethods` querystring argument has been removed from debugging.
* Moved `ErrorPage` into a new module: [silverstripe/errorpage](http://addons.silverstripe.org/add-ons/silverstripe/errorpage). See upgrading notes in that module.
* Removed `VirtualPage_Controller`. Virtual pages will now share whichever controller the “target” page uses
@ -2002,26 +1888,23 @@ that it belongs to, e.g. `themes/mytheme/templates/MyVendor/Foobar/Model/MyModel
* `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 `FunctionalTest::stat()`
* Removed `LeftAndMainMarkingFilter`
* Removed `Controller::getFormOwner`
* Removed `Controller::getFormOwner()`
* Removed `TeamCityListener`
* The Spyc YAML library has been removed from /thirdparty. Please load it yourself, or use the
Symfony YAML component thats automatically installed by composer.
* `RestfulService` has been removed. Use Guzzle instead. See Upgrading notes.
* Our self-maintained `Oembed` implementation has been removed, in favour of introducing
[oscarotero/Embed](https://github.com/oscarotero/Embed) as a dependency.
* Removed TextParser and BBCodeParser. These are available in an archived module,
* Removed the `Spyc` YAML library. Please load it yourself, or use the included Symfony YAML component.
* Removed `RestfulService`. Use Guzzle instead ([details](#restfulservice))
* Removed `Oembed` in favour of a
[oscarotero/Embed](https://github.com/oscarotero/Embed)
* Removed `TextParser` and `BBCodeParser`. These are available in an archived module,
[silverstripe-archive/bbcodeparser](https://github.com/silverstripe-archive/silverstripe-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.
* Config or module searching methods have been removed from `ClassManifest`. Use `ModuleLoader`
to get this information instead:
- `getModules`
- `getConfigDirs`
- `getConfigs`
* 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.
@ -2035,79 +1918,66 @@ that it belongs to, e.g. `themes/mytheme/templates/MyVendor/Foobar/Model/MyModel
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.
* Removed `Extension::$ownerBaseClass` property. You should use `$this->owner->baseClass()` instead.
The second argument of `Extension::setOwner()` has also been removed.
#### <a name="overview-general-deprecated"></a>General and Core Deprecated API
A very small number of methods were chosen for deprecation, and will be removed in 5.0 rather than 4.0
* `ClassInfo::baseDataClass` - Use `DataObject::getSchema()->baseDataClass()` instead.
* `ClassInfo::table_for_object_field` - Use `DataObject::getSchema()->tableForField()` instead
* `Config::inst()->update()` is deprecated. Use `Config::modify()->set()` or `Config::modify()->merge()`
* 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.
### <a name="overview-orm"></a>ORM API
### <a name="overview-orm"></a>ORM
#### <a name="overview-orm-api"></a>ORM API Additions / Changes
* Deprecate `SQLQuery` in favour `SQLSelect`
* `DataObject.many_many` 'through' relationships now support join dataobjects in place of
* Deprecated `SQLQuery` in favour `SQLSelect` ([details](#sqlquery))
* 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.
* `DataList::filter` by null now internally generates "IS NULL" or "IS NOT NULL" conditions
* Added `DataList::filter()` by null now internally generates "IS NULL" or "IS NOT NULL" conditions
appropriately on queries.
* `DataList::createDataObject` is now public.
* `DataObject` constructor now has an additional parameter, which must be included in subclasses.
* 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.
* `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.
* `DBHTMLText` no longer enables shortcodes by default. Two injector aliases have been created for this
class which can be used to select the correct behaviour:
* `HTMLText`: `DBHTMLText` with shortcodes enabled
* `HTMLFragment`: `DBHTMLText` without shortcodes enabled (as default)
* `CMSPreviewable` has been moved from the `SilverStripe\Admin` namespace to `SilverStripe\ORM`
* Changes to `DBString` formatting:
* `NoHTML` is renamed to `Plain`
* `LimitWordCountXML` is removed. Use `LimitWordCount` instead.
* `BigSummary` is removed. Use `Summary` instead.
* Most limit methods on `DBHTMLText` now 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).
* `FormField#createTag()` has been renamed to `FormField::create_tag()`
* `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)
* Removed `DataList::applyFilterContext` private method
* `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](/developer_guides/model/searchfilters) for more information.
* `Permission::flush_permission_cache()` renamed to `reset()` and added to `Resettable` interface.
* `Versioned` API has some breaking changes:
* Versioned constructor now only allows a single string to declare whether staging is enabled or not. The
* 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.
* `reading_stage` is now `set_stage` and throws an error if setting an invalid stage.
* `current_stage` is now `get_stage`
* `getVersionedStages` is gone.
* `get_live_stage` is removed. Use the `Versioned::LIVE` constant instead.
* `getDefaultStage` is removed. Use the `Versioned::DRAFT` constant instead.
* `$versionableExtensions` is now `private static` instead of `protected static`
* `hasStages` is addded to check if an object has a given stage.
* `stageTable` is added to get the table for a given class and stage.
* 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`
@ -2123,39 +1993,35 @@ A very small number of methods were chosen for deprecation, and will be removed
* 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.
* `SiteTree::getIsAddedToStage()` moved to `Versioned` and renamed to `isOnDraftOnly()`
* `SiteTre::getIsModifiedOnStage()` moved to `Versioned` and renamed to `isModifiedOnDraft()`
* `SiteTree::isPublished()` moved to `Versioned`.
* `SiteTree::getExistsOnLive()` removed in favour of `isPublished()`
* `isOnDraft()` added to `Versioned`.
* `isArchived()` added to `Versioned`.
* `isOnLiveOnly()` added to `Versioned`.
* `ChangeSet` and `ChangeSetItem` have been added for batch publishing of versioned dataobjects.
* `DataObject.table_name` config can now be used to customise the database table for any record.
* `DataObjectSchema` class added to assist with mapping between classes and tables.
* `DataObject.indexes` now uses `columns` instead of `value` to define index contents.
* `DBMoney` values are now treated as empty only if `Amount` field is null. If an `Amount` value
* 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
* `SapphireTest` temp DB methods have been removed and put into a new `TempDatabase` class.
* Moved `SapphireTest` temp DB methods into a new `TempDatabase` class.
This allows applications to create temp databases when not running tests.
This class now takes a connection name as a constructor class, and no longer
has static methods.
The following methods have been moved to this new class and renamed as non-static:
* `using_temp_db` -> `isUsed()`
* `kill_temp_db` -> `kill()`
* `empty_temp_db` _> `clearAllData()`
* `create_temp_db` -> `build()`
* `delete_all_temp_dbs` -> `deleteAll()`
* `resetDBSchema` -> `resetSchema()`
The below methods have been added or had their functionality updated to `DBDate`, `DBTime` and `DBDatetime`
* `getTimestamp()` added to get the respective date / time as unix timestamp (seconds since 1970-01-01)
* `Format()` method now use [CLDR format strings](http://userguide.icu-project.org/formatparse/datetime),
* 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](http://userguide.icu-project.org/formatparse/datetime),
rather than [PHP format string](http://php.net/manual/en/function.date.php).
E.g. `d/m/Y H:i:s` (php format) should be replaced with to `dd/MM/y HH:mm:ss` (CLDR format).
* getISOFormat() added which returns the standard date/time ISO 8601 pattern in CLDR format.
* `setValue` method is now a lot more restrictive, and expects dates and times to be passed in
* 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.
@ -2163,95 +2029,83 @@ The below methods have been added or had their functionality updated to `DBDate`
(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.
* `FormatFromSettings` will default to `Nice()` format if no member is logged in.
* `Nice`, `Long` and `Full` methods will now follow standard formatting rules for the
* 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.
* `Short` added to format concise date/time values, as a shorter version than `Nice`
* `getFormatter` method added, which returns a locale-specific date/time formatter.
`DBTime` specific changes:
* Added `DBTime::FormatFromSettings`
#### <a name="overview-orm-removed"></a>ORM Removed API
* Deprecated globals `$database` and `$databaseConfig`. Please use `DB::setConfig()` instead.
* `DataModel` removed
* `DataObject::can*` methods no longer accept a member ID. These must now be passed a Member object or left null
* `DataObject::db` removed and replaced with `DataObjectSchema::fieldSpec` and `DataObjectSchema::fieldSpecs`
* `DataObject::manyManyComponent` moved to `DataObjectSchema`
* `DataObject::belongsToComponent` moved to `DataObjectSchema`
* `DataObject::hasOneComponent` moved to `DataObjectSchema`
* `DataObject::hasManyComponent` moved to `DataObjectSchema`
* `DataObject::getRemoteJoinField` moved to `DataObjectSchema`
* `DataObject::database_fields` renamed and moved to `DataObjectSchema::databaseFields`
* `DataObject::has_own_table` renamed and moved to `DataObjectSchema::classHasTable`
* `DataObject::composite_fields` renamed and moved to `DataObjectSchema::compositeFields``
* `DataObject::manyManyExtraFieldsForComponent` moved to `DataObjectSchema`
* `DataObject::$destroyed` is now deprecated
* 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
* <a name="dataobject-has-own"></a>Removed `DataObject` methods `hasOwnTableDatabaseField`, `has_own_table_database_field` and
`hasDatabaseFields` are superceded by `DataObjectSchema::fieldSpec`.
Use `$schema->fieldSpec($class, $field, DataObjectSchema::DB_ONLY | DataObjectSchema::UNINHERITED )`.
Exclude `uninherited` option to search all tables in the class hierarchy.
* Removed `DataObject::is_composite_field`. Use `DataObjectSchema::compositeField` instead.
* Removed `DataObject::custom_database_fields`. Use `DataObjectSchema::databaseFields`
or `DataObjectSchema::fieldSpecs` instead.
* 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.
* Removed `DataList::applyFilterContext` private method
* `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 `DBString::LimitWordCountXML()` method. Use `LimitWordCount()` for XML safe version.
* Removed `SiteTree::getExistsOnLive()`. Use `isPublished()` instead.
* Removed `SiteTree::getIsDeletedFromStage()`. Use `isOnDraft()` instead (inverse case).
* `DataObject.many_many` no longer supports triangular resolution. Both the `many_many` and `belongs_many_many`
* 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.
* `DataObject::validateModelDefinitions()` has been removed. Validation and parsing of config is now handled
* Removed `DataObject::validateModelDefinitions()`. Validation and parsing of config is now handled
within `DataObjectSchema`.
* `CMSBatchAction_Delete` removed. Use `CMSBatchAction_Archive` instead.
* Removed several DBDate methods:
- `past_date`
- `prior_monday`
- `weekday`
- `next_day`
- `day_before`
- `days_between`
* `nice_format` has been removed from `DBDate` / `DBTime` / `DBDatetime` has been removed in favour of
locale-specific formatting for Nice()
* Removed several `DBTime` methods:
- `TwelveHour`
- `Nice24`
* Removed some `DBMoney` methods due to lack of support in php-intl.
- `NiceWithShortname`
- `NiceWithName`
- `getShortName`
- `getCurrencyName`
* Removed additional arguments from `DBMoney::getSymbol`. The result of this value is
now localised based on the currency code assigned to the `DBMoney` instance
* Removed `DBMoney::getAllowedCurrencies`. Apply validation to `MoneyField` instead.
* `Hierarchy` has lots of removed api:
- `parentStack()` removed. Use `getAncestors()` instead
- `doAllChildrenIncludingDeleted()` removed. Use `AllChildrenIncludingDeleted()` instead.
- `naturalNext` removed.
- `naturalPrev` removed.
- `markingFinished` removed.
* 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()`
### <a name="overview-filesystem"></a>Filesystem API
#### <a name="overview-filesystem-api"></a>Filesystem API Additions / Changes
### <a name="overview-filesystem"></a>Filesystem
* Image manipulations have been moved into a new `[ImageManipulation](api:SilverStripe\Assets\ImageManipulation)` trait.
* `CMSFileAddController` removed.
* 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
* `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.
* 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 [/developer_guides/files/file_security] for
more information.
* `File` is now versioned, and should be published before they can be used on the frontend.
@ -2259,7 +2113,8 @@ The below methods have been added or had their functionality updated to `DBDate`
below 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.
* `handle_shortcode` methods are removed from `File` and `Image` and moved to their own classes in `SilverStripe\Assets\Shortcodes` and are named `FileShortcodeProvider` and `ImageShortcodeProvider` respectively.
* `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
@ -2272,73 +2127,62 @@ The below methods have been added or had their functionality updated to `DBDate`
* `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`
#### <a name="overview-filesystem-removed"></a>Filesystem removed API
The following image manipulations have been removed:
The following image manipulations previously deprecated has been removed:
* `Image::SetRatioSize` superceded by `Fit`
* `Image::SetWidth` superceded by `ScaleWidth`
* `Image::SetHeight` superceded by `ScaleHeight`
* `Image::SetSize` superceded by `Pad`
* `Image::PaddedImage` superceded by `Pad`
* `Image::CroppedImage` superceded by `Fill`
* `Image::AssetLibraryPreview` superceded by `PreviewThumbnail`
* `Image::AssetLibraryThumbnail` superceded by `CMSThumbnail`
* 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.
* `File::deletedatabaseOnly`
* `File::link_shortcode_handler` renamed to `handle_shortcode`
* `File::setParentID`
* `File::getFullPath`
* `File::getRelativePath`
* `File::Content` database field is removed
* 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.php and now available to any File or DBFile which has the
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:
* `Image_Cached` class
* `Image::regenerateFormattedImages` method
* `Image::getGeneratedImages` method
* `Image::deleteFormattedImages` method
* `Image::handle_shortcode` moved to `SilverStripe\Assets\Shortcodes\ImageShortcodeProvider::handle_shortcode`
* `AssetAdmin::deleteunusedthumbnails` method
* `AssetAdmin::getUnusedThumbnails` method
* 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()`
Many `Folder` api have also been removed:
### <a name="overview-template"></a>Templates and Form
* `Folder_UnusedAssetsField` class
* `Folder::syncChildren` method
* `Folder::constructChild` method
* `Folder::addUploadToFolder` method
The following filesystem synchronisation methods and tasks are also removed
* `RegenerateCachedImagesTask` class
* `CleanImageManipulationCache` class
* `Filesystem::sync` method
* `AssetAdmin::doSync` method
### <a name="overview-template"></a>Template and Form API
#### <a name="overview-template-api"></a>Template and Form API Additions / Changes
* Upgrade of TinyMCE to version 4.
* Templates now use a standard template lookup system via `SSViewer::get_templates_by_class`
* 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
* `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')`
* `default_cast` is now enforced on all template variables. See upgrading notes below.
* FormField templates no longer look in the 'forms' folder for templates. As all form fields are
* `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.
* Theme selector 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
* `$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
@ -2347,112 +2191,103 @@ The following filesystem synchronisation methods and tasks are also removed
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
* 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.
* `HTMLValue` service name is now fully qualified `SilverStripe\View\Parsers\HTMLValue`.
* FormField::create_tag() has been moved to `HTML` class and renamed to createTag. Invoke with
`HTML::createTag()`.
value from the ORM. The second argument to `setValue()` has been added.
* `FormField::create_tag()` moved to `SilverStripe\View\HTML->createTag()`.
* 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 expectes
a non-associative array of values (not titles) or an `SS_List`.
The following methods and properties on `Requirements_Backend` have been renamed:
<a name="requirements"></a>The following methods and properties on `Requirements_Backend` have been renamed:
* `Requirements_Backund::$combine_files` made protected and renamed `$combinedFiles`
* `Requirements_Backend::$combine_js_with_min` made protected and renamed `$minifyCombinedFiles`
* `Requirements_Backend::$write_header_comments` made protected and renamed `$writeHeaderComment`
* `Requirements_Backend::$write_js_to_body` made protected and renamed to `$writeJavascriptToBody`
* `Requirements_Backend::$force_js_to_bottom` renamed to `$forceJSToBottom`
* `get_combined_files_enabled` renamed to `getCombinedFilesEnabled`
* `set_combined_files_enabled` renamed to `setCombinedFilesEnabled`
* `get_suffix_requirements` renamed to `getSuffixRequirements`
* `set_suffix_requirements` renamed to `setSuffixRequirements`
* `get_custom_scripts` renamed to `getCustomScripts`
* `unblock_all` renamed to `unblockAll`
* `include_in_response` renamed to `includeInResponse`
* `combine_files` renamed to `combineFiles`
* `get_combine_files` renamed to `getCombinedFiles`
* `clear_combined_files` renamed to `clearCombinedFiles`
* `process_combined_files` renamed to `processCombinedFiles`
* `set_write_js_to_body` renamed to `setWriteJavascriptToBody`
* `set_force_js_to_bottom` renamed to `setForceJSToBottom`
New methods on `Requirements` are added to access these:
* `get_minify_combined_js_files`
* `set_minify_combined_js_files`
* `get_force_js_to_bottom`
* `get_write_js_to_body`
Some methods on `Requirements` have had their method signatures changed:
* `includeInHTML` has had the first parameter $template removed as it was previously deprecated.
* 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
handle field-level and form-level messages. This has the following properties:
* `setMessage` to assign a message, type, and cast
* `getMessage` retrieves the message string
* `getMessageType` retrieves the message type (E.g. error, good, info)
* `getMessageCast` retrieves the cast type
* `getMessageCastingHelper` retrieves the DBField cast to use for the appropriate message cast
* `getSchemaMessage` encodes this message for form schema use in ReactJS.
<a name="form-validation"></a>Form validation has been refactored significantly. A new `FormMessage` trait has been created to
handle `FormField` and `Form` messages. This trait has a new`setMessage()` 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.
* `__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.
* `setupFormErrors` renamed to `restoreFormState`
* `resetValidation` renamed to `clearFormState`
* `loadMessagesFrom` method created to load a ValidationResult into a form.
* `setMessage`. third parameter is now $cast type
* `messageForForm` removed. Use `setMessage` or `sessionMessage` instead.
* `getSessionValidationResult` / `setSessionValidationResult` used to get / set session errors
* `getSessionData` / `setSessionData` used to get / set field values cached in the session
* `getAjaxErrorResponse` and `getRedirectReferer` created to simplify `getValidationErrorResponse`
* `addErrorMessage` removed. Users can either use `sessionMessage` or `sessionError` to add a
form level message, throw a ValidationException during submission, or add a custom validator.
* 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. Certain methods have been moved from `Form` to `FormRequestHandler`:
* `buttonClicked`
* `checkAccessAction`
* `handleField`
* `httpSubmission`
* `Link`
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:
* `validate` method now returns a `ValidationResult` instance.
* `requireField` method removed. Use `RequiredFields` subclass instead.
* Changed `validate()` to return a `ValidationResult` instance.
* Removed `requireField()`. Use `RequiredFields` subclass instead.
`ValidationResult` now has these methods:
* `serialize` / `unserialize` for saving within session state
* `messageList` renamed to `getMessages`
* `error` method replaced with `addMessage` / `addError` / `addFieldMessage` / `addFieldError`
* `valid` renamed to `isValid`
* 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:
* `$message` second constructor parameter is removed. Constructor only accepts `$result`,
* 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()`:
<a name="datetimefield"></a>New `DatetimeField` methods replace `getConfig()` / `setConfig()`:
* `getTimezone()` / `setTimezone()`
* `getDateTimeOrder()` / `setDateTimeOrder()`
* `getLocale()` / `setLocale()`
* `datavaluefield` config is removed as internal data value is now fixed to ISO 8601 format
* 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:
@ -2465,12 +2300,12 @@ The `DatetimeField` has changed behaviour:
* It no longer accepts `setValue()` as an array with 'date' and 'time' keys
* Added `getHTML5()` / `setHTML5()`
New `DateField` methods replace `getConfig()` / `setConfig()`:
<a name="datefield"></a>New `DateField` methods replace `getConfig()` / `setConfig()`:
* `getDateFormat()` / `setDateFormat()`
* `getMinDate()` / `setMinDate()`
* `getMaxDate()` / `setMaxDate()`
* `getLocale()` / `setLocale()`
* Added `getDateFormat()` / `setDateFormat()`
* Added `getMinDate()` / `setMinDate()`
* Added `getMaxDate()` / `setMaxDate()`
* Added `getLocale()` / `setLocale()`
The `DateField` has changed behavior:
@ -2481,65 +2316,49 @@ The `DateField` has changed behavior:
* 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()`
<a name="timefield"></a>New `TimeField` methods replace `getConfig()` / `setConfig()`
* `getTimeFormat()` / `setTimeFormat()`
* `getLocale()` / `setLocale()`
* `getClientConfig()` has been removed (in favour of `setHTML5()`)
* Added `getTimeFormat()` / `setTimeFormat()`
* Added `getLocale()` / `setLocale()`
#### <a name="overview-template-removed"></a>Template and Form Removed API
Further API changes:
* Removed `TabularStyle`
* Removed `NestedForm`
* Removed `FieldList` methods:
* `getTabPathRewrites`
* `setTabPathRewrites`
* `rewriteTabPath`
* Removed `Form` methods (see above for replacements):
* `transformTo`
* `callfieldmethod`
* `single_field_required`
* `current_action`
* `set_current_action`
* `setupFormErrors`
* `resetValidation`
* `messageForForm`
* `addErrorMessage`
* `testSubmission`
* `testAjaxSubmission`
* Removed `Validator::requireField()` method.
* Removed `ValidationResult` (see above for replacements):
* `messageList`
* `codeList`
* `message`
* `starredList`
* `error`
* `valid`
* 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 `ReportAdminForm.ss` template
* `FormField::dontEscape()` has been removed. Escaping is now managed on a class by class basis.
* Removed `PermissionCheckboxSetField::getAssignedPermissionCodes()` (never implemented)
* `Requirements::delete_combined_files()` and `Requirements::delete_combined_files()` methods have been removed
as they are obsolete.
* Removed `DatetimeField`, `DateField` and `TimeField` methods `getConfig` and `setConfig`. Individual
getters and setters for individual options are provided instead. See above for list of new methods.
* 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.
* `SSViewer` deprecated methods removed:
* `set_source_file_comments()`
* `get_source_file_comments()`
* `getOption`
* `setOption`
* 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`)
* The following HTMLEditorField_* classes have been removed:
* `HTMLEditorField_Toolbar` (replaced With `ModalController` in admin module)
* `HTMLEditorField_Embed` (replaced with `EmbedResource` in asset-admin module)
* `HTMLEditorField_File`
* `HTMLEditorField_Flash`
* `HTMLEditorField_Image`
* Moved `HTMLEditorField_Toolbar` to `SilverStripe\Admin\ModalController`
* Moved `HTMLEditorField_Embed` to`SilverStripe\AssetAdmin\EmbedResource`
* Removed `HTMLEditorField_File`
* Removed `HTMLEditorField_Flash`
* Removed `HTMLEditorField_Image`
### <a name="overview-i18n"></a>i18n API
#### <a name="overview-i18n-api"></a>i18n API Additions / Changes
### <a name="overview-i18n"></a>i18n
* Upgrade of i18n to symfony/translation
* Localisation based on language-only (without any specific locale) is now supported
@ -2549,52 +2368,48 @@ New `TimeField` methods replace `getConfig()` / `setConfig()`
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](http://guides.rubyonrails.org/i18n.html#pluralization).
* `i18n.all_locales` config moved to `SilverStripe\i18n\Data\Locales.locales`
* `i18n.common_languages` config moved to `SilverStripe\i18n\Data\Locales.languages`
* `i18n.likely_subtags` config moved to `SilverStripe\i18n\Data\Locales.likely_subtags`
* `i18n.tinymce_lang` config moved to `SilverStripe\Forms\HTMLEditor\TinyMCEConfig.tinymce_lang`
* `i18n::get_tinymce_lang()` moved to `SilverStripe\Forms\HTMLEditor\TinyMCEConfig::get_tinymce_lang()`
* `i18n::get_locale_from_lang()` moved to `SilverStripe\i18n\Data\Locales::localeFromLang()`
* `i18n::get_lange_from_locale()` moved to `SilverStripe\i18n\Data\Locales::langFromLocale()`
* `i18n::validate_locale()` moved to `SilverStripe\i18n\Data\Locales::validate()`
* `i18n::get_common_languages()` moved to `SilverStripe\i18n\Data\Locales::getLanguages()`
* `i18n::get_locale_name()` moved to `SilverStripe\i18n\Data\Locales::localeName()`
* `i18n::get_language_name()` moved to `SilverStripe\i18n\Data\Locales::languageName()`
* `i18n.module_priority` config moved to `SilverStripe\i18n\Data\Sources.module_priority`
* `i18n::get_owner_module()` moved to `SilverStripe\Core\Manifest\ClassManifest::getOwnerModule()`
* 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.
* `i18n::get_existing_translations()` moved to `SilverStripe\i18n\Data\Sources::getKnownLocales()`
* 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`
#### <a name="overview-i18n-removed"></a>i18n API Removed API
### <a name="overview-mailer"></a>Email
* `Zend_Translate` removed
* `i18n::_t()` Support for sprintf-style `%s` arguments deprecated
* `i18n::_t()` Using non-associative injection with named parameters is now an error
* `i18n::get_language_name()` removed.
* `i18n::get_language_code()` removed.
* `i18n::get_common_locales()` removed.
* `i18n.common_locales` config removed
#### <a name="overview-mailer"></a>Email Additions / Changes
* `Mailer` converted to an interface
* `SwfitMailer` added as new default mailer
* Changed `Mailer` to an interface
* `Email` re-written to be powered by [SwiftMailer](https://github.com/swiftmailer/swiftmailer)
* Default template body variable renamed from `$Body` to `$EmailContent`
* `$email->setTemplate()` renamed to `$email->setHTMLTemplate()`
* Added `$email->setPlainTemplate` for rendering plain versions of email
* `$email->populateTemplate()` has been replaced with `$email->setData()`
* Renamed `Email->setTemplate()` to `Email->setHTMLTemplate()`
* Added `Email->setPlainTemplate()` for rendering plain versions of email
* Renamed `Email->populateTemplate()` to `Email->setData()`
### <a name="overview-testing"></a>SapphireTest
* `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()`
* `setUpOnce` removed. Please use `setUpBeforeClass`
* `tearDownOnce` removed. Please use `tearDownAfterClass`
* `TestListener` class removed
* `SapphireTest::$requiredExtensions` renamed to `SapphireTest::$required_extensions` and made static
* `SapphireTest::$extraDataObjects` renamed to `SapphireTest::$extra_dataobjects` and made static
* `SapphireTest::$extraControllers` renamed to `SapphireTest::$extra_controllers` and made static
* 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)
### <a name="overview-security"></a>Security
@ -2602,5 +2417,5 @@ New `TimeField` methods replace `getConfig()` / `setConfig()`
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`
* `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.

View File

@ -0,0 +1,1111 @@
# 4.0.0-rc1
<!--- Changes below this line will be automatically regenerated -->
## Change Log
### Security
* 2017-05-09 [30986b4ea](https://github.com/silverstripe/silverstripe-framework/commit/30986b4ea3d6a111e182f1970267696b991ea660) Lock out users who dont exist in the DB (Daniel Hensby) - See [ss-2017-002](http://www.silverstripe.org/download/security-releases/ss-2017-002)
* 2016-05-03 [70480f5ee](https://github.com/silverstripe/silverstripe-framework/commit/70480f5ee433d9a67bcd54fa7f284d764fb73a47) HtmlEditorField_Toolbar#viewfile not whitelisting URLs (Damian Mooyman) - See [ss-2015-027](http://www.silverstripe.org/download/security-releases/ss-2015-027)
### API Changes
* 2017-10-05 [b996e2c22](https://github.com/silverstripe/silverstripe-framework/commit/b996e2c22c47eb8eecd1656e1dd69160b97fc68c) Extensions are now stateless (Damian Mooyman)
* 2017-09-27 [f686b5082](https://github.com/silverstripe/silverstripe-framework/commit/f686b50824a75eb17677987adfcc4366dc9f8f65) Rename assert dos to assert list (Werner M. Krauß)
* 2017-09-05 [496b9c8c](https://github.com/silverstripe/silverstripe-cms/commit/496b9c8c045af1625f9b3484b3db5a0607ae10d0) Implement insert-anchor modal (Damian Mooyman)
* 2017-09-04 [a9c479f2](https://github.com/silverstripe/silverstripe-cms/commit/a9c479f26a9d0d48b3d708873d9034c1d7496b48) Allow SiteTree::Link to be extended (Damian Mooyman)
* 2017-08-23 [595ba75a5](https://github.com/silverstripe/silverstripe-framework/commit/595ba75a50e2cb8eb0b5fc7088f398474f17785d) Make FormField::hasClass return a boolean instead of an int (Robbie Averill)
* 2017-08-14 [c14233f74](https://github.com/silverstripe/silverstripe-framework/commit/c14233f7435d87fe1641c179f647a8e5441afc5d) Enable config files to be loaded for behat tests (Damian Mooyman)
* 2017-08-08 [2c54e331](https://github.com/silverstripe/silverstripe-cms/commit/2c54e33106ae1dfa2eb4d873769c2f17edd406ff) Virtual pages now respect cascade_deletes on source page (Damian Mooyman)
* 2017-08-08 [323644c7b](https://github.com/silverstripe/silverstripe-framework/commit/323644c7bb963f9310704a7871419ade356c1683) Implement cascade_deletes (Damian Mooyman)
* 2017-07-31 [078a508d7](https://github.com/silverstripe/silverstripe-framework/commit/078a508d718f9a37dc6ac413be2db5ecd124a03b) Replace legacy tiny_mce_gzip compressor with asset generator (Damian Mooyman)
* 2017-07-26 [3364f5c5](https://github.com/silverstripe/silverstripe-cms/commit/3364f5c52bc7a5059412a946fbe193235196001b) Use setTitleField to use MenuTitle for selecting internal links (Damian Mooyman)
* 2017-07-16 [f4af1fab](https://github.com/silverstripe/silverstripe-reports/commit/f4af1fab7731c76c742d0823717b22db00268516) Remove Report::add_excluded_report() and make excluded_reports configurable (Robbie Averill)
* 2017-07-12 [2b266276c](https://github.com/silverstripe/silverstripe-framework/commit/2b266276c2146f4d8fd6e5fec69e28fc9848586e) Implement new module sorting pattern (Aaron Carlino)
* 2017-07-12 [a69600fa](https://github.com/silverstripe/silverstripe-cms/commit/a69600fa7b4fccf55ef1264cb62e97b559b87469) Update module sorting (Damian Mooyman)
* 2017-07-11 [ccda816f9](https://github.com/silverstripe/silverstripe-framework/commit/ccda816f909b3004c3a8e00dec02fa37e35d1667) added flatList argument for generating the json tree list with a context string property (Christopher Joe)
* 2017-07-11 [2d04b84](https://github.com/silverstripe/silverstripe-installer/commit/2d04b844b78d4b4fbbff054e58fbf1b06d965060) Convert installer to recipe (Damian Mooyman)
* 2017-06-27 [cf511562](https://github.com/silverstripe/silverstripe-reports/commit/cf5115624dee09861409370446ebb27f5a3ebee9) Remove REPORTS_DIR and its use. (Sam Minnee)
* 2017-06-27 [ef6db273](https://github.com/silverstripe/silverstripe-cms/commit/ef6db273a1e71d35185e1d505d9d85d2849e9ded) Remove CMS_PATH and CMS_DIR (Sam Minnee)
* 2017-06-27 [741166e36](https://github.com/silverstripe/silverstripe-framework/commit/741166e36963735884a847b24a3bbf05776f41e0) ModulePath template global now takes any composer package name. (Sam Minnee)
* 2017-06-25 [69fe16689](https://github.com/silverstripe/silverstripe-framework/commit/69fe166897686b50ef2536808fb3ba5712408174) Director::handleRequest() is no longer static - use a Director service (Sam Minnee)
* 2017-06-25 [d20ab50f9](https://github.com/silverstripe/silverstripe-framework/commit/d20ab50f9d480372a2b6489278f9876d1a85134c) Stronger Injector service unregistration (Damian Mooyman)
* 2017-06-25 [e92c63c54](https://github.com/silverstripe/silverstripe-framework/commit/e92c63c5457bf56fe320d83977e3475c1fc60908) Remove $sid argument of Session::start() (Sam Minnee)
* 2017-06-23 [10866c080](https://github.com/silverstripe/silverstripe-framework/commit/10866c0809623426e875c335ee9175e11935f98c) Replace Director::direct() with Director::handleRequest(). (Sam Minnee)
* 2017-06-22 [b30f410ea](https://github.com/silverstripe/silverstripe-framework/commit/b30f410ea02b2330eef871a2eb59ad022fdfa102) Deprecate RequestFilter. (Sam Minnee)
* 2017-06-22 [3873e4ba0](https://github.com/silverstripe/silverstripe-framework/commit/3873e4ba008cfc2af7e26ca86665affc289cd677) Refactor bootstrap, request handling (Damian Mooyman)
* 2017-06-15 [024371c37](https://github.com/silverstripe/silverstripe-framework/commit/024371c37e96326c0ae001d5940e1a1839191f6f) authentication ValidationResult handling to pass by-reference (Damian Mooyman)
* 2017-06-15 [62d095305](https://github.com/silverstripe/silverstripe-framework/commit/62d095305b965840a2991b5f19f16e9453dd0456) Update DefaultAdmin services (Damian Mooyman)
* 2017-06-12 [77ec2b90](https://github.com/silverstripe/silverstripe-cms/commit/77ec2b90c6e72039394cfd96f403f562b43cdbec) Removed ErrorPage (Jonathon Menz)
* 2017-06-10 [413b4936a](https://github.com/silverstripe/silverstripe-framework/commit/413b4936a1cfe6447832c08c26a4fceb9a3a36a6) Add extension hook to FormField::extraClass() (Damian Mooyman)
* 2017-06-09 [0559da7f](https://github.com/silverstripe/silverstripe-siteconfig/commit/0559da7f5c7064dc98d85d78273f83b910af0771) s for Authenticator refactor (Damian Mooyman)
* 2017-06-09 [03125b8c](https://github.com/silverstripe/silverstripe-reports/commit/03125b8c6cd0f2deb757d856807b050566adeb89) s for Authenticator refactor (Simon Erkelens)
* 2017-05-25 [f82f0844](https://github.com/silverstripe/silverstripe-cms/commit/f82f0844c1ffd8c7fd40520072983e9eaf82ae21) Add insert internal link modal (Damian Mooyman)
* 2017-05-25 [e7d87add9](https://github.com/silverstripe/silverstripe-framework/commit/e7d87add9f6cafb8fdfd49310a0106ce94356762) Remove legacy HTMLEditor classes (Damian Mooyman)
* 2017-05-22 [2e94a11](https://github.com/silverstripe/silverstripe-installer/commit/2e94a11c8b6863cca505ff08e3fb430cb1b9190a) Add pgsql + behat tests to installer (Damian Mooyman)
* 2017-05-19 [ad43a8292](https://github.com/silverstripe/silverstripe-framework/commit/ad43a8292339af4df5614e9c29fcd7e71bc9fc7a) Consistent use of inst() naming across framework (Robbie Averill)
* 2017-05-19 [963d9197d](https://github.com/silverstripe/silverstripe-framework/commit/963d9197d3e714e4f137ae538b86c4bd6288c0e2) Ensure that all DataQuery joins are aliased based on relationship name (Damian Mooyman)
* 2017-05-19 [100048da3](https://github.com/silverstripe/silverstripe-framework/commit/100048da33c7ea2561de008033deed99a59e7723) PSR-11 compliance (fixes #6594) (#6931) (Ingo Schommer)
* 2017-05-17 [fba8e2c24](https://github.com/silverstripe/silverstripe-framework/commit/fba8e2c245ba21febb983de8148242fdf27394c4) Remove Object class (Damian Mooyman)
* 2017-05-12 [906a4c444](https://github.com/silverstripe/silverstripe-framework/commit/906a4c444b43fddc243f905962a40f6fc25a2dac) Add streamable response object (Damian Mooyman)
* 2017-05-12 [23e1aa8c](https://github.com/silverstripe/silverstripe-cms/commit/23e1aa8c45f31ac191ed005bbf761229d923074f) Refactor inherited permissions (#1811) (Damian Mooyman)
* 2017-05-11 [0b70b008b](https://github.com/silverstripe/silverstripe-framework/commit/0b70b008b36b3d4c0c7cb42db86eea3ad675f7a9) Implement InheritedPermission calculator (#6877) (Damian Mooyman)
* 2017-05-11 [259f957ce](https://github.com/silverstripe/silverstripe-framework/commit/259f957ce89be071ddd7ba850c8c941fe51ef59b) Rename services to match FQN of interface / classes (Damian Mooyman)
* 2017-05-11 [49e559b0](https://github.com/silverstripe/silverstripe-cms/commit/49e559b08cebe4311e1af581c15a42eddc467242) Rename services to match FQN of interface / classes (Damian Mooyman)
* 2017-05-08 [484a4ec4](https://github.com/silverstripe/silverstripe-cms/commit/484a4ec4f6f59d34934233cca3c5ea5ff0d2beaf) Removed deprecated RootURLController:set_default_homepage_link (Ingo Schommer)
* 2017-05-08 [7c2f49d44](https://github.com/silverstripe/silverstripe-framework/commit/7c2f49d443833dd151c137f6f596210b37399ba8) Removed RootURLController:set_default_homepage_link() (Ingo Schommer)
* 2017-05-08 [cec983b62](https://github.com/silverstripe/silverstripe-framework/commit/cec983b628f3ee8780126a940351ca6268d2ff4b) Removed deprecated ModelAsController::find_old_page() (Ingo Schommer)
* 2017-05-08 [de41e145](https://github.com/silverstripe/silverstripe-cms/commit/de41e14518fee36be957afe146ea1acd63d8e9f1) Removed deprecated ModelAsController::find_old_page() (Ingo Schommer)
* 2017-05-08 [5784a7d2d](https://github.com/silverstripe/silverstripe-framework/commit/5784a7d2d7c4c5ec27765498660f9a71cbdb7f48) Removed deprecated Security::set_login_recording() (Ingo Schommer)
* 2017-05-08 [2a7c76e9e](https://github.com/silverstripe/silverstripe-framework/commit/2a7c76e9e99eb2ae315671191ba3575c827a0108) Removed deprecated DatabaseAdmin#clearAllData() (Ingo Schommer)
* 2017-05-08 [81e5c7ac4](https://github.com/silverstripe/silverstripe-framework/commit/81e5c7ac4017fe5813e9eebb5edb5cc38a41dfa1) Removed deprecated Session::set_config() (Ingo Schommer)
* 2017-05-08 [1d438d3fb](https://github.com/silverstripe/silverstripe-framework/commit/1d438d3fb5eb822081c7e428d57c271bf3aee180) Remove deprecated FormAction::createTag() (Ingo Schommer)
* 2017-05-08 [75b7e1906](https://github.com/silverstripe/silverstripe-framework/commit/75b7e19066c504708b721dca3cd39fe5ea45ac6b) Remove deprecated SS_HOST (Ingo Schommer)
* 2017-05-08 [0d9b38363](https://github.com/silverstripe/silverstripe-framework/commit/0d9b3836319b40160bab56774dfdb548934399ce) Removed legacy form fields (fixes #6099) (Ingo Schommer)
* 2017-05-02 [963568d7](https://github.com/silverstripe/silverstripe-siteconfig/commit/963568d7a2c39599280e0752af336ba0c394ac87) Refactor inheritable permissions (Damian Mooyman)
* 2017-04-28 [03750acbe](https://github.com/silverstripe/silverstripe-framework/commit/03750acbee6ee26b4f5cae762c22ea6dc3cf4492) Namespace i18n keys (Damian Mooyman)
* 2017-04-28 [b1c59d40](https://github.com/silverstripe/silverstripe-cms/commit/b1c59d40c6808fc3fd3a3ccfbec443577559973a) Namespace i18n keys (Damian Mooyman)
* 2017-04-27 [61388b153](https://github.com/silverstripe/silverstripe-framework/commit/61388b153f9fbad0d794d3280516d8fa9aa29e5a) Rewrite Date and Time fields to support HTML5 (Damian Mooyman)
* 2017-04-26 [de8abe116](https://github.com/silverstripe/silverstripe-framework/commit/de8abe11675941ee9c5bfa49f491155dd8f22293) rename (Ingo Schommer)
* 2017-04-23 [7af7e6719](https://github.com/silverstripe/silverstripe-framework/commit/7af7e6719e82385a1a60813141fd291df5a16667) Security.authenticators is now a map, not an array (Sam Minnee)
* 2017-04-21 [df100b87](https://github.com/silverstripe/silverstripe-cms/commit/df100b8798f5c9a270b15d9f8ba1bb084b053247) Upgrade to behat 3 (Damian Mooyman)
* 2017-04-21 [0a55ff9f8](https://github.com/silverstripe/silverstripe-framework/commit/0a55ff9f8c4367d4026ed477ebafb7e9c3c32f71) Remove SapphireTestReporter and CliTestReporter (Ingo Schommer)
* 2017-04-17 [64e802f79](https://github.com/silverstripe/silverstripe-framework/commit/64e802f7955df2738d6d7381d30843f0cd438332) Move createTag to HTML class (Damian Mooyman)
* 2017-04-13 [f54ff29](https://github.com/silverstripe/silverstripe-installer/commit/f54ff29a023e0d77678365e8447f3ddba0a99226) Remove BlockUntrustedIPs (Damian Mooyman)
* 2017-04-13 [2548bfba1](https://github.com/silverstripe/silverstripe-framework/commit/2548bfba1ea5904302c60523b8a8d6d51d4515ab) Replace SS_HOST with SS_BASE_URL (Damian Mooyman)
* 2017-04-11 [0791b387b](https://github.com/silverstripe/silverstripe-framework/commit/0791b387b81aa4a3e6a931fe10d60d0d7a795d80) Update serialisation of JSON tree data (Damian Mooyman)
* 2017-04-10 [f2768c85b](https://github.com/silverstripe/silverstripe-framework/commit/f2768c85b10edeaf195ffaa336a0ac2468feb471) Enable namespaced-localisation keys in templates (Damian Mooyman)
* 2017-04-06 [d75a3cb0](https://github.com/silverstripe/silverstripe-cms/commit/d75a3cb0e9db7b3f52bedec71043ebeefc969d1c) Update site tree hierarchy to use a MarkingSet and template (Damian Mooyman)
* 2017-04-03 [e61257c27](https://github.com/silverstripe/silverstripe-framework/commit/e61257c27b42a29bf45acaf8e5a15a13a1e9ed34) Update embed/embed to 3.0 (Damian Mooyman)
* 2017-04-03 [9be22701f](https://github.com/silverstripe/silverstripe-framework/commit/9be22701fd31123e4cb63102c04c6eb4b82b8792) exists() no longer true for nullifyIfEmpty if empty string (Damian Mooyman)
* 2017-03-30 [4b7994036](https://github.com/silverstripe/silverstripe-framework/commit/4b79940368bd765840d22a5dabddb62c40df7b6c) Drop IE10 support (fixes #6321) (Ingo Schommer)
* 2017-03-30 [326aa37ea](https://github.com/silverstripe/silverstripe-framework/commit/326aa37ea4f1e09319098105932467a10d6782e6) HTML5 date/time fields, remove member prefs (fixes #6626) (Ingo Schommer)
* 2017-03-29 [92a5e4a05](https://github.com/silverstripe/silverstripe-framework/commit/92a5e4a057176916a92158f38b5f98fbdb9e13cf) Refactor CMS-specific code out of LeftAndMain (Damian Mooyman)
* 2017-03-29 [136b67f59](https://github.com/silverstripe/silverstripe-framework/commit/136b67f5976737fb98837989f5ee7d662f27b089) Major refactor of Hierarchy into MarkedSet (Damian Mooyman)
* 2017-03-28 [98e77a48](https://github.com/silverstripe/silverstripe-cms/commit/98e77a48a920706b3b8d91bd9f2c6c3be85c6a9d) Rename SiteTree::description() to SiteTree::classDescription() to prevent clash (Damian Mooyman)
* 2017-03-23 [874c6ccdd](https://github.com/silverstripe/silverstripe-framework/commit/874c6ccdd4a4eb887c989e858a8bb3b34d02f384) Add experimental getResource() to Module (Damian Mooyman)
* 2017-03-22 [1186f0783](https://github.com/silverstripe/silverstripe-framework/commit/1186f0783041fc236f872e2b14e69f3746d7bd45) Use mysql-safe table namespace separator (Damian Mooyman)
* 2017-03-21 [5ce98ace](https://github.com/silverstripe/silverstripe-cms/commit/5ce98aced2058670e303a16db899428ed5777df4) Upgrade to rely on silverstripe/versioned module (Damian Mooyman)
* 2017-03-21 [ac3a9c9e6](https://github.com/silverstripe/silverstripe-framework/commit/ac3a9c9e6e4dd5dfd0f9d93696b17652cea5be59) Split out SilverStripe\ORM\Versioned into new module (Damian Mooyman)
* 2017-03-19 [62f8aa440](https://github.com/silverstripe/silverstripe-framework/commit/62f8aa4408189e407fd81e827c239eb0fd58c4ef) Drop PHP 5.5 support, limit PHP 5.6 to 2018 (Damian Mooyman)
* 2017-03-16 [dae6d5902](https://github.com/silverstripe/silverstripe-framework/commit/dae6d5902f7968222a1ad8b3f879fbf4ab2b2f7a) Split SilverStripe\Assets into separate module (Damian Mooyman)
* 2017-03-16 [3a0099161](https://github.com/silverstripe/silverstripe-framework/commit/3a0099161bbaa88d53d67d20384bccc7cfe26cab) Remove Log class (Damian Mooyman)
* 2017-03-14 [4599b2b5](https://github.com/silverstripe/silverstripe-reports/commit/4599b2b52cb910d07ef906260e65fe702a365a0f) move CMSPreviewable to ORM (Damian Mooyman)
* 2017-03-14 [54ba08a30](https://github.com/silverstripe/silverstripe-framework/commit/54ba08a306d23139e1e5a15f9bc54c4d7dc9f34a) Replace ManifestCache with ManifestCacheFactory (Damian Mooyman)
* 2017-03-12 [a07a9bffc](https://github.com/silverstripe/silverstripe-framework/commit/a07a9bffc43b3d0a5188dad149fa0c3c42667834) Add FormRequestHandler::forTemplate() for backwards compatibility (Damian Mooyman)
* 2017-03-10 [9f953770f](https://github.com/silverstripe/silverstripe-framework/commit/9f953770f5228c0387de5a0607e32448cc26a265) Move CMSPreviewable to framework module (Damian Mooyman)
* 2017-03-09 [ce1406091](https://github.com/silverstripe/silverstripe-framework/commit/ce14060913fee01d86d73ca8513d3a68d87c627c) Apply default logger to all caches (Damian Mooyman)
* 2017-03-09 [8f0f9fa11](https://github.com/silverstripe/silverstripe-framework/commit/8f0f9fa1190a36f91eb07ccde62065da566389ba) Apply logging to config cache (Damian Mooyman)
* 2017-03-02 [0c41a97a8](https://github.com/silverstripe/silverstripe-framework/commit/0c41a97a8b1ecde2341122b49ebc58b9e6e2a9e0) Refactor Form request handling into FormRequestHandler (Damian Mooyman)
* 2017-03-01 [466c50b30](https://github.com/silverstripe/silverstripe-framework/commit/466c50b30217a301a8fb69e9ac61efcbb8487ec2) Switch from npm4 and shrinkwrap to npm6 and yarn (Christopher Joe)
* 2017-02-28 [50deb1776](https://github.com/silverstripe/silverstripe-framework/commit/50deb17763098d938478c6422f1767da67a375a1) remove UploadField, AssetField and associated files (Christopher Joe)
* 2017-02-27 [e74556b32](https://github.com/silverstripe/silverstripe-framework/commit/e74556b32277b03c299efce62a75b37a4b0cbdd3) Protect Director::get_environment_type() from invoking (Damian Mooyman)
* 2017-02-26 [b3fc11e59](https://github.com/silverstripe/silverstripe-framework/commit/b3fc11e594bda2569f467630e42486a472cbc123) Move ssmedia plugin to asset-admin (Damian Mooyman)
* 2017-02-26 [c452d5f6c](https://github.com/silverstripe/silverstripe-framework/commit/c452d5f6cd87ba512869c12494b73d40b93a2c86) Rename CoreConfigCreator to CoreConfigFactory (Damian Mooyman)
* 2017-02-24 [1d49c4afe](https://github.com/silverstripe/silverstripe-framework/commit/1d49c4afe9f2e9a1957e3f3f1d183eaa1c0cb461) Remove non-asset-admin TinyMCE media dialog (Damian Mooyman)
* 2017-02-23 [d220ca3f6](https://github.com/silverstripe/silverstripe-framework/commit/d220ca3f67de0198269610fcc2045bd016ea6cf2) Use symfony/cache (fixes #6252) (Ingo Schommer)
* 2017-02-23 [358bb8ba](https://github.com/silverstripe/silverstripe-cms/commit/358bb8baecf2434e4d43831d5f47fe839cd9e1e0) Remove insert-media tests (now covered by asset-admin, not cms) (Damian Mooyman)
* 2017-02-22 [8444a21cb](https://github.com/silverstripe/silverstripe-framework/commit/8444a21cbfc440035f4b6805b9a07771ab9363b0) Upgrade tests to use new Config API (Damian Mooyman)
* 2017-02-22 [3362e15a2](https://github.com/silverstripe/silverstripe-framework/commit/3362e15a2978918c7d3f2b72b30844e2f5ee53eb) Upgrade code to use updated config (Damian Mooyman)
* 2017-02-22 [395878885](https://github.com/silverstripe/silverstripe-framework/commit/39587888582f1ab41b73d2cf00edd983327df6eb) Remove Director.environment_type config and replace with static methods (Damian Mooyman)
* 2017-02-22 [a6e9a7111](https://github.com/silverstripe/silverstripe-framework/commit/a6e9a7111bf7b6d5d79e90611d6443cbce2204f2) Substitute core config system with new silverstripe/config module (Damian Mooyman)
* 2017-02-22 [72ddac2a5](https://github.com/silverstripe/silverstripe-framework/commit/72ddac2a56f8cb89be4046c041077484a227783e) Implement ModuleLoader for module registration by composer name (Damian Mooyman)
* 2017-02-22 [6bae8047](https://github.com/silverstripe/silverstripe-cms/commit/6bae804744f4fb513ffc79c116ce6cee561ce6e7) Use symfony/cache (Ingo Schommer)
* 2017-02-19 [2513a0f4c](https://github.com/silverstripe/silverstripe-framework/commit/2513a0f4c3edcef63619fa03074b7328ed243b2e) Added drag and drop libraries (Christopher Joe)
* 2017-02-16 [4885736b](https://github.com/silverstripe/silverstripe-cms/commit/4885736b0eccf8f4b6843e8892ba7d389480e749) Upgrade CMS to use new Config API (Damian Mooyman)
* 2017-02-14 [014f0d23e](https://github.com/silverstripe/silverstripe-framework/commit/014f0d23edbb604ee285274711b2c49124acc3f7) Create SeparatedDateField (Damian Mooyman)
* 2017-01-30 [9d35ff8f9](https://github.com/silverstripe/silverstripe-framework/commit/9d35ff8f9559ae7087ce189880db749fe1569efa) Remove ViewableData::ThemeDir, update changelog to reflect suggested replacement (Robbie Averill)
* 2017-01-26 [029a8b958](https://github.com/silverstripe/silverstripe-framework/commit/029a8b9586888cff44f621b7e4299eddd0f6528d) Substitute Zend_Currency with NumberFormatter based solution (Damian Mooyman)
* 2017-01-20 [942c0257b](https://github.com/silverstripe/silverstripe-framework/commit/942c0257b765ebc46bb0b2c3069721ccb8915ff6) Upgrade to behat 3 (Damian Mooyman)
* 2017-01-18 [8a07c56bd](https://github.com/silverstripe/silverstripe-framework/commit/8a07c56bdf28a4d74ebd22c17b1e258f91a273b2) Replace i18n message localisation with symfony/translation (Damian Mooyman)
* 2017-01-17 [3033953cc](https://github.com/silverstripe/silverstripe-framework/commit/3033953cc93ea0f721084cbc1d4d77842963eafd) Scaffolded redux form fields have the parent form name assigned as a property (Damian Mooyman)
* 2017-01-13 [7d67c5b9b](https://github.com/silverstripe/silverstripe-framework/commit/7d67c5b9bd578b7e7b4ff17fe6d8df3bec621979) Allow users to act-as another (Damian Mooyman)
* 2017-01-13 [ce38f1f1f](https://github.com/silverstripe/silverstripe-framework/commit/ce38f1f1fd1722fb50285dd57aa9b528d2794105) Allow "removeComponentsByType" to remove multiple component"s" (Robbie Averill)
* 2017-01-12 [2c274c838](https://github.com/silverstripe/silverstripe-framework/commit/2c274c838ece66256a0fc94fc3d9680f212cfff9) Shift Security page class config to separate option (Damian Mooyman)
* 2017-01-10 [9e563ebd3](https://github.com/silverstripe/silverstripe-framework/commit/9e563ebd3a2cd7aab164184b0d28f25be2d9fbfe) Moved iShouldSeeAButton to behat-extension (Damian Mooyman)
* 2017-01-05 [fb06cc0](https://github.com/silverstripe/silverstripe-installer/commit/fb06cc0075d524cd42bfd7495b2f9aa458e91ef8) Page_Controller to PageController (PSR-2 compliance) (Robbie Averill)
* 2016-12-29 [0927e547](https://github.com/silverstripe/silverstripe-cms/commit/0927e54780d2f5b7d240ffd7f1f39522c19610a0) Allow controller discovery without underscore (PSR-2 compliance) (Robbie Averill)
* 2016-12-20 [9be5142fc](https://github.com/silverstripe/silverstripe-framework/commit/9be5142fc15b17395562a0c88b53eece0fbd2c4b) Set::publish() / canPublish() no longer treats hasChanges() = false as a permission error (Damian Mooyman)
* 2016-12-14 [bb71a37cc](https://github.com/silverstripe/silverstripe-framework/commit/bb71a37cc8274f05d5a9abeae39bf3793155df0d) added enlarge icon (Christopher Joe)
* 2016-12-12 [88b4ae65c](https://github.com/silverstripe/silverstripe-framework/commit/88b4ae65cc51041f866ee47c66a7764aa3e107f8) Add css class to assist with bootstrapping entwine sections (Damian Mooyman)
* 2016-12-12 [178bd480e](https://github.com/silverstripe/silverstripe-framework/commit/178bd480eb141f6dc0eb8d07097d85d0e80a8e07) s required for asset search behaviour (Paul Clarke)
* 2016-12-09 [63ac2efa](https://github.com/silverstripe/silverstripe-siteconfig/commit/63ac2efaa2e7e8caca178579f16d1526fe2a0746) Update validation handling (#43) (Damian Mooyman)
* 2016-12-09 [bf58c5ae](https://github.com/silverstripe/silverstripe-cms/commit/bf58c5aef4578657678857fe0f0f59f8c60f759e) Update to use new form submission handling (#1691) (Damian Mooyman)
* 2016-12-06 [6b06fd9f2](https://github.com/silverstripe/silverstripe-framework/commit/6b06fd9f2d9321ced73eee46964da42ea87b473e) Add buttonTooltop to PopoverField and fix critical positioning issue (Damian Mooyman)
* 2016-11-28 [97d0fc61d](https://github.com/silverstripe/silverstripe-framework/commit/97d0fc61d8a8d246ae2fa05ad769fdb741a3c8ea) Include psr-2 checks in CI (Damian Mooyman)
* 2016-11-28 [f16d7e183](https://github.com/silverstripe/silverstripe-framework/commit/f16d7e1838d834575738086326d1191db3a5cfd8) Deprecate unused / undesirable create_new_password implementation (Damian Mooyman)
* 2016-11-23 [799ebe5ba](https://github.com/silverstripe/silverstripe-framework/commit/799ebe5ba8f3b95139031c3a905598a331fedab6) Expose QueryString library and lib/Format as external for formatting items (Christopher Joe)
* 2016-11-23 [6e589aac7](https://github.com/silverstripe/silverstripe-framework/commit/6e589aac7598878d60490a390537c4a12c24f619) Updates to Form, ValidationResponse, ValidationException (Damian Mooyman)
* 2016-11-22 [875811fdf](https://github.com/silverstripe/silverstripe-framework/commit/875811fdfd9d3269d168f1767ccd55bbf24d5a13) Create loading state for schema (Christopher Joe)
* 2016-11-15 [38070ab2](https://github.com/silverstripe/silverstripe-cms/commit/38070ab2d3a8d768c60047e31d39d74e12c13242) Update tests to reflect renamed services (Damian Mooyman)
* 2016-11-13 [cac326eeb](https://github.com/silverstripe/silverstripe-framework/commit/cac326eebb8e3914813b7dcee3cdba4d09434e1b) Add getExtraDataObjects() and getExtraControllers() methods to SapphireTest (Damian Mooyman)
* 2016-11-04 [7cba50e3a](https://github.com/silverstripe/silverstripe-framework/commit/7cba50e3a544780badc4e1eda6ed3e2cf8b49417) Refactor UploadField, FileField and AssetField into traits Uploadable and FileUploadable (Damian Mooyman)
* 2016-11-03 [8e4ed776d](https://github.com/silverstripe/silverstripe-framework/commit/8e4ed776d893e9828326d31b8bfb1345888894ae) Expose FieldHolder react component (Damian Mooyman)
* 2016-10-28 [1142757c2](https://github.com/silverstripe/silverstripe-framework/commit/1142757c21df7d421057be9d185cc88ab97abe1b) Add 'validation' to form schema (Damian Mooyman)
* 2016-10-28 [1734e0d2a](https://github.com/silverstripe/silverstripe-framework/commit/1734e0d2a334c0d48d276f673df1cac1fc78edc0) Shorten overly-verbose invalid extension error (#6231) (Damian Mooyman)
* 2016-10-25 [555104083](https://github.com/silverstripe/silverstripe-framework/commit/555104083995678e16717dd7f3238cf55755c496) Update listview / treeview to use pjax instead of deferred loading (Damian Mooyman)
* 2016-10-25 [13d40f96](https://github.com/silverstripe/silverstripe-cms/commit/13d40f96f3d0f6459ff47a398c31a5d6a27725b4) Rename _versions table to _Versions (#1655) (Damian Mooyman)
* 2016-10-25 [d54ae8bb](https://github.com/silverstripe/silverstripe-cms/commit/d54ae8bb26b37f7424ba5767f5ee5b9175069e23) Consolidate "Delete from draft" and "Archive" actions into a consistent behaviour (#1653) (Damian Mooyman)
* 2016-10-21 [8c87ea6b](https://github.com/silverstripe/silverstripe-cms/commit/8c87ea6b79fc6298008cdfc956d0a1cd733d8d87) Update listview / treeview to use pjax instead of deferred loading (Damian Mooyman)
* 2016-10-20 [ea6851fd7](https://github.com/silverstripe/silverstripe-framework/commit/ea6851fd700aa8ba5407e54c361f150d1769f122) Rename _versions table to _Versions (Damian Mooyman)
* 2016-10-19 [840f27523](https://github.com/silverstripe/silverstripe-framework/commit/840f275235fff97132a3b541e83bcffe848ed407) Created a generic FormFactory interface (#6178) (Damian Mooyman)
* 2016-10-18 [316ac8603](https://github.com/silverstripe/silverstripe-framework/commit/316ac8603647a03e7d8705a83343430cc8b88141) Writes to versioned dataobjects always writes to stage even when written on live (Damian Mooyman)
* 2016-10-14 [6e8304ff2](https://github.com/silverstripe/silverstripe-framework/commit/6e8304ff2f4b2582b8535ef549b9f2ad9479925e) Namespace framework tests (Damian Mooyman)
* 2016-10-13 [055795d4d](https://github.com/silverstripe/silverstripe-framework/commit/055795d4d1e6da449af5eef3a9bebfacb284eb69) Support fixture paths relative to current directory (Damian Mooyman)
* 2016-10-11 [f60fe7d4a](https://github.com/silverstripe/silverstripe-framework/commit/f60fe7d4a9a698a009298c63915a4872bcfadfcf) Versioned::publishRecursive() now uses a ChangeSet (Damian Mooyman)
* 2016-10-11 [f5f6fdce1](https://github.com/silverstripe/silverstripe-framework/commit/f5f6fdce12abd6074de210b11b98a68fd929c62c) Duplication of many_many relationships now defaults to many_many only (Damian Mooyman)
* 2016-10-06 [cb24d199b](https://github.com/silverstripe/silverstripe-framework/commit/cb24d199b6e7c57204032452100fa79338e0219a) Convert fieldSpec options to bitwise operators (#6161) (Damian Mooyman)
* 2016-10-06 [d1dbe912](https://github.com/silverstripe/silverstripe-cms/commit/d1dbe912470295fb11a5f38ebcdeb4d4c4447bdc) Update for DataObjectSchema changes (Damian Mooyman)
* 2016-10-06 [11bbed4f7](https://github.com/silverstripe/silverstripe-framework/commit/11bbed4f76b2dab35ed0c1db50114eef4a29c4b7) Move many methods from DataObject to DataObjectSchema (Damian Mooyman)
* 2016-10-05 [380d6523c](https://github.com/silverstripe/silverstripe-framework/commit/380d6523c5db67041721077c58e06f54e46dfe0a) Cleaned up versioned status checks (Damian Mooyman)
* 2016-10-05 [1ce243cc](https://github.com/silverstripe/silverstripe-cms/commit/1ce243ccc1c724edce1140a43cdf61e1900df537) Cleaned up versioned status checks (Damian Mooyman)
* 2016-10-03 [f0dd9af69](https://github.com/silverstripe/silverstripe-framework/commit/f0dd9af699cd03e3e315ff6e8297efdc0a9cfd23) Support named join alias for many_many through list (Damian Mooyman)
* 2016-09-30 [27d35403e](https://github.com/silverstripe/silverstripe-framework/commit/27d35403e863d47745d32025ee7969b1b1d1171c) Force formschema to be reloaded on form submission (Damian Mooyman)
* 2016-09-30 [92e34b743](https://github.com/silverstripe/silverstripe-framework/commit/92e34b743432a47f3be6d460b0c48f044ed96882) controller::join_links supports array values (Damian Mooyman)
* 2016-09-28 [2f4867fef](https://github.com/silverstripe/silverstripe-framework/commit/2f4867fef85b273f60b8c0b794e4ecf10a59d0d5) added watch command to package.json (Christopher Joe)
* 2016-09-26 [e7303170c](https://github.com/silverstripe/silverstripe-framework/commit/e7303170c2ff62adc0fb5d09fdffaacf88c614dd) Implement many_many through (Damian Mooyman)
* 2016-09-21 [760caaab](https://github.com/silverstripe/silverstripe-cms/commit/760caaab444837a5bb58d49e9f8727f1b61a876c) use new bootstrap button row template (Damian Mooyman)
* 2016-09-21 [5a59c4f4b](https://github.com/silverstripe/silverstripe-framework/commit/5a59c4f4b40523592174d661f1be490d3cafdea9) Add bootstrap button row template (Damian Mooyman)
* 2016-09-20 [4f19113c](https://github.com/silverstripe/silverstripe-cms/commit/4f19113c5cce68ae6806c13d87c4f916bcc977ba) Use new DBField::getSchemaValue() (Damian Mooyman)
* 2016-09-19 [ea50e3007](https://github.com/silverstripe/silverstripe-framework/commit/ea50e300791bf8bf4e187ae048ef56b2ad78d994) Move PreviewLink logic into File dataobject (Christopher Joe)
* 2016-09-15 [8f23fa99a](https://github.com/silverstripe/silverstripe-framework/commit/8f23fa99a5cbb91e47a10c4d9008ef7364137b10) Moved CMS-specific JavaScript to admin/thirdparty (Ingo Schommer)
* 2016-09-15 [7d67b24c2](https://github.com/silverstripe/silverstripe-framework/commit/7d67b24c257c515ee758ca7df11aba81766d82fd) Removed legacy Jasmine JS Unit tests (Ingo Schommer)
* 2016-09-14 [e8375111b](https://github.com/silverstripe/silverstripe-framework/commit/e8375111b17dd2cf4b08b709f140786f69a9f924) Enable default value to be specified for dbstring types at the db level (Damian Mooyman)
* 2016-09-13 [aecf5260f](https://github.com/silverstripe/silverstripe-framework/commit/aecf5260fc41f4a3a1161e21a955d0cb3b2f075a) Remove TextParser and BBCodeParser (Sam Minnee)
* 2016-09-13 [2316b0da9](https://github.com/silverstripe/silverstripe-framework/commit/2316b0da9fd18423c0246b7ce4a156f11d2e96a3) Remove i18n::js_i18n option (Ingo Schommer)
* 2016-09-13 [ee10dbb68](https://github.com/silverstripe/silverstripe-framework/commit/ee10dbb680d7653b1f727e5e146b07df87e66b37) Moved frontend assets into admin/ "module" (Ingo Schommer)
* 2016-09-13 [327a8a32](https://github.com/silverstripe/silverstripe-cms/commit/327a8a320e882d7c96118036f837d29acd9e8ca8) Move preview template to cms section (Damian Mooyman)
* 2016-09-13 [9b1c24cf4](https://github.com/silverstripe/silverstripe-framework/commit/9b1c24cf4c74c8241f7b1e9fac1ded5fcdc3c3df) Move preview panel to CMS module (Damian Mooyman)
* 2016-09-13 [190ed628b](https://github.com/silverstripe/silverstripe-framework/commit/190ed628bc14f8da67b21e77ded01ab060a09574) PreviewThumbnail now uses ScaleMaxWidth (Christopher Joe)
* 2016-09-12 [ab7e5944d](https://github.com/silverstripe/silverstripe-framework/commit/ab7e5944d1f5e8cd2896fd132a6bfa87e8440a5f) Derive BASE_PATH from composer autoloader (Sam Minnee)
* 2016-09-07 [9cb9a05ec](https://github.com/silverstripe/silverstripe-framework/commit/9cb9a05ec0b0478e6228f9ea72e94dcafa036112) Removed duplicated thirdparty deps (Ingo Schommer)
* 2016-09-07 [0a380a94c](https://github.com/silverstripe/silverstripe-framework/commit/0a380a94cd6470f860300ba793f4e6c9d406004b) Removed unused UMD builds of individual JS files (Ingo Schommer)
* 2016-09-05 [efb004b72](https://github.com/silverstripe/silverstripe-framework/commit/efb004b72aab74c65871c3dbd268a8c453a353d7) use injector for DataObject::newClassInstance() (Damian Mooyman)
* 2016-09-05 [fc353dc17](https://github.com/silverstripe/silverstripe-framework/commit/fc353dc17a092aa6e8114cf78ad87a8342d4267d) Allow has_many fixtures to be declared with array format as well as many_many (#5944) (Damian Mooyman)
* 2016-09-01 [5f7b13ee4](https://github.com/silverstripe/silverstripe-framework/commit/5f7b13ee4971d0433278691d95fde0922a5e0c28) Removed unused images across CMS UI (Ingo Schommer)
* 2016-08-31 [b599095a](https://github.com/silverstripe/silverstripe-cms/commit/b599095a50cc97d3f181a44adee3771e1c82deb8) Remove AssetAdmin (moved to asset-admin module) (Ingo Schommer)
* 2016-08-31 [5ddd8c331](https://github.com/silverstripe/silverstripe-framework/commit/5ddd8c3318a4b449ee0619cc752be2b77f191159) Adapt File/Folder getCMSFields() to new AssetAdmin (Ingo Schommer)
* 2016-08-29 [710509949](https://github.com/silverstripe/silverstripe-framework/commit/710509949754c28975dabcaa00e5880dbd88a016) behaviour of filter API to support injected search filter classes (Damian Mooyman)
* 2016-08-23 [8e89d08e7](https://github.com/silverstripe/silverstripe-framework/commit/8e89d08e7b1889d93ca8e1763dff2146252b5ae0) Remove js/css requirements include from form fields. (Sam Minnee)
* 2016-08-23 [c9b6e9bac](https://github.com/silverstripe/silverstripe-framework/commit/c9b6e9bac0aaf78e3b2963c9e6ad38ad27fa46f1) Update template lookup to late resolution for performance reasons (Damian Mooyman)
* 2016-08-21 [2e577ddb1](https://github.com/silverstripe/silverstripe-framework/commit/2e577ddb1d68e52e990f0f89222fe03ad6deb7ca) Use Webpack (Sam Minnee)
* 2016-08-18 [8dd644d25](https://github.com/silverstripe/silverstripe-framework/commit/8dd644d25d4e01b6853922164440f8ac9c824f22) Namespace all classes (Damian Mooyman)
* 2016-08-12 [a96ab15a](https://github.com/silverstripe/silverstripe-reports/commit/a96ab15af33a3ac38a61fc7b261c290fac8e4f7a) issue with namespaced reports (Damian Mooyman)
* 2016-08-11 [90aff08d](https://github.com/silverstripe/silverstripe-cms/commit/90aff08df75386899665cc7d2f868da97dc68cb7) remove obsolete template (Damian Mooyman)
* 2016-08-10 [afdae4937](https://github.com/silverstripe/silverstripe-framework/commit/afdae4937ecfecb16442c228f3d04457e6b64f8d) Add CMSMenu::remove_menu_class to remove items by class instead of code (Damian Mooyman)
* 2016-08-09 [cb1f4335a](https://github.com/silverstripe/silverstripe-framework/commit/cb1f4335a09113feff1707dbe3fff777e3736779) remove DataFormatter class and all subclasses (Damian Mooyman)
* 2016-08-09 [cf6f882e2](https://github.com/silverstripe/silverstripe-framework/commit/cf6f882e2931d229ec621b5ed7d61b2de989a605) Ensure that i18n plural / singular names use shortname prior to namespaced translations (Damian Mooyman)
* 2016-08-04 [19b81155](https://github.com/silverstripe/silverstripe-cms/commit/19b811555cbdc9ebdbd6995d1215e3e055fcd730) Move NestedController from cms to framework (Damian Mooyman)
* 2016-08-04 [1c3ec1935](https://github.com/silverstripe/silverstripe-framework/commit/1c3ec1935377e9a1469d44ecb083622b996e5343) Move NestedController from cms to framework (Damian Mooyman)
* 2016-08-04 [6005a1c2b](https://github.com/silverstripe/silverstripe-framework/commit/6005a1c2b2abba919cc660dc2fd2a5fc0becbbd6) Upgrade for silverstripe CMS namespace changes (Damian Mooyman)
* 2016-08-04 [59539578](https://github.com/silverstripe/silverstripe-reports/commit/59539578816c2f77ca689c9a17f4f2415a9d51dc) Update for SilverStripe\CMS namespace (Damian Mooyman)
* 2016-08-02 [4ca3d1dc9](https://github.com/silverstripe/silverstripe-framework/commit/4ca3d1dc9487be2dadd1722823f75f7146bd7a60) Allow custom 'type' option for scripts (Damian Mooyman)
* 2016-07-28 [9188628ae](https://github.com/silverstripe/silverstripe-framework/commit/9188628ae335fb6ea3c377013ec3e64f24d2260d) Add $action parameter to Controller::Link (Damian Mooyman)
* 2016-07-26 [c556b0107](https://github.com/silverstripe/silverstripe-framework/commit/c556b010718c7bfdb5eba58913868bb9388a1b4c) Update core templates for CompositeField / SelectionGroup.ss (Damian Mooyman)
* 2016-07-25 [5e8e8c87](https://github.com/silverstripe/silverstripe-siteconfig/commit/5e8e8c87b2468b69fc2065bcfabaa73d11b977f6) Remove theme selector (#31) (Damian Mooyman)
* 2016-07-25 [93f4dd1](https://github.com/silverstripe/silverstripe-installer/commit/93f4dd17642fc8b55057b1179248109de1c4e318) Support nested themes API (#129) (Damian Mooyman)
* 2016-07-25 [ff07a2e2](https://github.com/silverstripe/silverstripe-cms/commit/ff07a2e2641eaa11c48425b16bddf484742c758f) Convert CMS forms to bootstrap (Damian Mooyman)
* 2016-07-25 [a809e80d0](https://github.com/silverstripe/silverstripe-framework/commit/a809e80d015786bd448652f859e3d6cff6e5bc09) Convert CMS forms to bootstrap (Damian Mooyman)
* 2016-07-24 [c7387ff45](https://github.com/silverstripe/silverstripe-framework/commit/c7387ff45f294b2a652dee11838eda60539ed025) Upgrade to SilverStripe\CMS namespace (Damian Mooyman)
* 2016-07-24 [4d007cd1](https://github.com/silverstripe/silverstripe-cms/commit/4d007cd13cf3b7d843c6e177b6252e861d99c6d2) remove obsolete CMSMain::buildbrokenlinks() (Damian Mooyman)
* 2016-07-24 [70179c8b](https://github.com/silverstripe/silverstripe-cms/commit/70179c8b873676cf2408afc1e5af9fb9e8e9e6c2) Better behaviour for virtualised controller (Damian Mooyman)
* 2016-07-24 [886d65ad](https://github.com/silverstripe/silverstripe-cms/commit/886d65ad37c33c14dfdd2922092fb524ad2e5f53) Remove obsolete Folder_UsusedAssetsField (Damian Mooyman)
* 2016-07-24 [b135c256](https://github.com/silverstripe/silverstripe-cms/commit/b135c2566c1807fddfedd3ce80af4fcaf10648ec) remove obsolete UpgradeSiteTreePermissionSchemaTask (Damian Mooyman)
* 2016-07-19 [20daf1f8e](https://github.com/silverstripe/silverstripe-framework/commit/20daf1f8e11746ef6dc4f925c75754c3b6063106) Abstract ThemeManifest into ThemeList (Damian Mooyman)
* 2016-07-19 [4b4aa4e91](https://github.com/silverstripe/silverstripe-framework/commit/4b4aa4e91c31b930e664527994840895fe176466) Exclude templates in 'themes' directories from $default theme (#5820) (Damian Mooyman)
* 2016-07-14 [6e68f38ef](https://github.com/silverstripe/silverstripe-framework/commit/6e68f38efb6443ebe04ac7036678deca627dedfb) Update react sections to use react-router instead of page.js (#5796) (Damian Mooyman)
* 2016-07-13 [b8b4e98ac](https://github.com/silverstripe/silverstripe-framework/commit/b8b4e98ac2a157992be0a5f679bf3902d0d16991) Theme stacking (Hamish Friedlander)
* 2016-07-12 [26d46517a](https://github.com/silverstripe/silverstripe-framework/commit/26d46517aca15ff02281ec5cbac9888d21084652) Remove custom DBHTMLText::exists() custom behaviour (Damian Mooyman)
* 2016-07-07 [859acf571](https://github.com/silverstripe/silverstripe-framework/commit/859acf571e0328a5d6e49264acae6a8ba2936d41) mute frontend debugging by default (#5777) (Damian Mooyman)
* 2016-07-07 [628455f7](https://github.com/silverstripe/silverstripe-siteconfig/commit/628455f723b12801f3b8e0d5dd4d7ac9e984ba3f) Apply SilverStripe\Security namespace (#28) (Damian Mooyman)
* 2016-07-07 [39b6d129](https://github.com/silverstripe/silverstripe-reports/commit/39b6d12969053ad97b04dc70d022643a94901cff) Apply SilverStripe\Security namespace (#35) (Damian Mooyman)
* 2016-07-06 [5cb4ab4a8](https://github.com/silverstripe/silverstripe-framework/commit/5cb4ab4a82993d5b16fa0316e008f547f38d8e98) Add PopoverField for extra-actions popup in react (Damian Mooyman)
* 2016-07-06 [9e1b12a89](https://github.com/silverstripe/silverstripe-framework/commit/9e1b12a8918b121c9f66d9491e5506aa3248ed0c) Support composite react formfields (Damian Mooyman)
* 2016-06-22 [25e4cad1](https://github.com/silverstripe/silverstripe-cms/commit/25e4cad1645f17f2a4c60511cec71de5f1281bee) Apply SilverStripe\Security namespace (Damian Mooyman)
* 2016-06-22 [af22a8316](https://github.com/silverstripe/silverstripe-framework/commit/af22a83166a088311805cf9dc301f8eaca5b46b7) Apply Framework\Security namespace (Damian Mooyman)
* 2016-06-22 [80e5b9149](https://github.com/silverstripe/silverstripe-framework/commit/80e5b9149e3b207b07cbb98f7d3454f4887067a7) Move dependency on model class from form schema API (Damian Mooyman)
* 2016-06-17 [b7ac5c564](https://github.com/silverstripe/silverstripe-framework/commit/b7ac5c564d212cd2616e8062919da77182fb73c6) / BUG Fix DBField summary methods (Damian Mooyman)
* 2016-06-16 [ab819611](https://github.com/silverstripe/silverstripe-reports/commit/ab81961115f2ec19d1e54608263e354b836d27a5) Apply SilverStripe\ORM namespace (Damian Mooyman)
* 2016-06-16 [fbc90e10](https://github.com/silverstripe/silverstripe-siteconfig/commit/fbc90e1070060c90164074e499d58c3083ad63a2) Update for new SilverStripe\ORM namespace (Damian Mooyman)
* 2016-06-16 [e378332f](https://github.com/silverstripe/silverstripe-cms/commit/e378332ff3c781cda167d5f39a680448cbe8cf96) Update for new SilverStripe\ORM namespace (Damian Mooyman)
* 2016-06-16 [83308689d](https://github.com/silverstripe/silverstripe-framework/commit/83308689d5cfb3ecd228cdea775573ebd0a9779e) Initialise React controllers via routes (#5436) (David Craig)
* 2016-06-15 [80d4af6b6](https://github.com/silverstripe/silverstripe-framework/commit/80d4af6b6e00b39fd5fefddfb87a52708baf714e) Apply Framework\ORM Namespace to model (Hamish Friedlander)
* 2016-06-13 [c50bc917](https://github.com/silverstripe/silverstripe-cms/commit/c50bc91772af2b400dbcd664f187730b25ba148b) Cleanup inconsistent SiteTree::duplicate API (Damian Mooyman)
* 2016-06-03 [5c9044a00](https://github.com/silverstripe/silverstripe-framework/commit/5c9044a007d3e0e49d5a57f8794c71717a5aa5d1) Enforce default_cast for all field usages (Damian Mooyman)
* 2016-05-25 [5e8ae41d4](https://github.com/silverstripe/silverstripe-framework/commit/5e8ae41d4772f750f8ce14103ed45a697a147f6d) Refactor dataobject schema management into separate service (Damian Mooyman)
* 2016-05-23 [04e617d6](https://github.com/silverstripe/silverstripe-cms/commit/04e617d65def656d66f0920c9ad13b27861160b7) Allow extensions to influence canCreate, canEdit, canView, canDelete, and canAddChildren even for admins. (Damian Mooyman)
* 2016-05-10 [7f03b88e5](https://github.com/silverstripe/silverstripe-framework/commit/7f03b88e5e1826da662bba1fbfc36221232215f5) Add empty campaign layout (Damian Mooyman)
* 2016-05-09 [8b94dd83d](https://github.com/silverstripe/silverstripe-framework/commit/8b94dd83dfb8a31f79cd001fc1672d76aa82ffab) Add CSRF to Campaign delete (Damian Mooyman)
* 2016-05-09 [3edbfd944](https://github.com/silverstripe/silverstripe-framework/commit/3edbfd944ebb6035c9ca681fa153dd1c3e017b05) Implement breadcrumbs via controllable state (Damian Mooyman)
* 2016-05-04 [65eb0bde6](https://github.com/silverstripe/silverstripe-framework/commit/65eb0bde6a25fbdd84a5c369eaa591df8ed9d523) Look for templates of namespaced classes in subfolders. (Sam Minnee)
* 2016-05-03 [8ce3d90e1](https://github.com/silverstripe/silverstripe-framework/commit/8ce3d90e18050519c2b94f0cf529e0864a372713) Injector dependencies no longer inherit from parent classes automatically (Damian Mooyman)
* 2016-05-03 [8d2cc91](https://github.com/silverstripe/silverstripe-installer/commit/8d2cc913e9d4ee1db68e8641da3c784c38fb55be) Include asset-admin module in installer (Damian Mooyman)
* 2016-05-02 [8b1146be9](https://github.com/silverstripe/silverstripe-framework/commit/8b1146be9adac324e1487ca7f0af159ab201c542) Implement campaign item edit button (Damian Mooyman)
* 2016-05-02 [6948267c4](https://github.com/silverstripe/silverstripe-framework/commit/6948267c41c486eb501049555df95903fb6573ec) LeftAndMain::menu_title can be overridden (#5423) (Damian Mooyman)
* 2016-05-02 [0d4c71f39](https://github.com/silverstripe/silverstripe-framework/commit/0d4c71f393a9d73981b9cf25287e3213ffddeb1a) Filtering on invalid relation is no longer a silent error (Damian Mooyman)
* 2016-05-01 [46f69b0c](https://github.com/silverstripe/silverstripe-cms/commit/46f69b0c0dd484d7c4ed007158b77cbcc2306cf6) set menu title without editing transifex masters (Damian Mooyman)
* 2016-04-27 [72fcfbf4b](https://github.com/silverstripe/silverstripe-framework/commit/72fcfbf4bc3344a3992a8e99ce9d0d506acac5bc) Campaign preview for images (Damian Mooyman)
* 2016-04-27 [1aa54924](https://github.com/silverstripe/silverstripe-cms/commit/1aa54924108a877e40fb3048eb87919b64028ac0) Cleanup SilverStripeNavigator and CMSPreview (Damian Mooyman)
* 2016-04-27 [4be5e7c96](https://github.com/silverstripe/silverstripe-framework/commit/4be5e7c961f7041dd5babb10d6d5550766f8c7be) Implement basic preview behaviour (Damian Mooyman)
* 2016-04-25 [daf538583](https://github.com/silverstripe/silverstripe-framework/commit/daf53858331179badd4ad6ab6e37e30dc56e2192) in behaviour to flysystem reporting for root folders (Damian Mooyman)
* 2016-04-22 [241cdfed1](https://github.com/silverstripe/silverstripe-framework/commit/241cdfed1bb7ef9a1cab70f309283a8110bcbd4e) Allow actions to declare they are exempt from validation themselves (Hamish Friedlander)
* 2016-04-20 [e463fcce6](https://github.com/silverstripe/silverstripe-framework/commit/e463fcce6eaa80719a4f14d59dca9ee56d1f3d12) redux-logger respects ss environment (Damian Mooyman)
* 2016-04-19 [19de22f42](https://github.com/silverstripe/silverstripe-framework/commit/19de22f42714874abcebfe7ece192546f4d8dd1a) Moved frontend assets into admin/client/ (Ingo Schommer)
* 2016-04-19 [e2afcd0ac](https://github.com/silverstripe/silverstripe-framework/commit/e2afcd0acb1c65810b5a90ca2a9921f902c6a8e0) Implement back end for saving forms via react (Damian Mooyman)
* 2016-04-18 [dbd17bd49](https://github.com/silverstripe/silverstripe-framework/commit/dbd17bd49a04a61d7b11d98f28f1b7307d25541c) Remove routing from silverstripe-component (Damian Mooyman)
* 2016-04-18 [2e9003577](https://github.com/silverstripe/silverstripe-framework/commit/2e900357713a54803d5ae5ed2649d99bf23b1514) Campaign publish button (Damian Mooyman)
* 2016-04-12 [31247a67b](https://github.com/silverstripe/silverstripe-framework/commit/31247a67bd8cfb34023421da46f59786d49811a0) Replace baked-in and modified Chosen 0.9.8 with npm'ed in Chosen 1.5.1 (Hamish Friedlander)
* 2016-04-11 [590089375](https://github.com/silverstripe/silverstripe-framework/commit/590089375327aa80c6c92007462b9bfa439ad207) Implement campaign list view (Damian Mooyman)
* 2016-04-11 [2d16d69dd](https://github.com/silverstripe/silverstripe-framework/commit/2d16d69ddb863b55de3a94fd83a49a3f666354af) Use base data class for ChangeSetItem#ObjectClass, not just ClassName (Hamish Friedlander)
* 2016-04-07 [05973cee5](https://github.com/silverstripe/silverstripe-framework/commit/05973cee55a9a80b30421c88a3c12baddb63a4f0) Add i18n pluralisation (Damian Mooyman)
* 2016-04-05 [db6251a9](https://github.com/silverstripe/silverstripe-cms/commit/db6251a9b74886ddb2f15bcb28b393c2c9ae0a73) Update to use new travis-artifacts (Damian Mooyman)
* 2016-04-01 [3c2b53157](https://github.com/silverstripe/silverstripe-framework/commit/3c2b53157e6f064ebac2269dc9950db2b36501ec) Update Versioned methods (Damian Mooyman)
* 2016-04-01 [716baa6b](https://github.com/silverstripe/silverstripe-cms/commit/716baa6b1fb55c25112066a6b1a3c10a6be38c0b) Support renamed Versioned API (Damian Mooyman)
* 2016-03-30 [87ee4365e](https://github.com/silverstripe/silverstripe-framework/commit/87ee4365e7f51089742d1ca24687e25c3b251fb8) Implement ChangeSets for batch publishing (Damian Mooyman)
* 2016-03-30 [64b7a84bb](https://github.com/silverstripe/silverstripe-framework/commit/64b7a84bb2be4de93a21a7263dc8529085a3eba3) SapphireTest::logInWithPermission now supports multiple permissions (Damian Mooyman)
* 2016-03-30 [29c5eff43](https://github.com/silverstripe/silverstripe-framework/commit/29c5eff433ff7a62bbf66c7dd3bd0e31b6a368ed) Add $context method to DataObject::can for consistency with canCreate() (Damian Mooyman)
* 2016-03-30 [501b2f180](https://github.com/silverstripe/silverstripe-framework/commit/501b2f180913cb6d3454fdebc868a929ccb89f28) CMSMenu::get_cms_classes() is now sorted (Damian Mooyman)
* 2016-03-28 [d22ad706](https://github.com/silverstripe/silverstripe-cms/commit/d22ad706a99504680ca1fdf8ef482e13a7441ab4) Support new DataObject::can() signature (Damian Mooyman)
* 2016-03-27 [b2e4e9622](https://github.com/silverstripe/silverstripe-framework/commit/b2e4e9622b2dd3a65b4ed7e994f38c8965dd58e9) Remove deprecated caching behaviour from ViewableData (closes #4063) (Loz Calver)
* 2016-03-23 [8abede133](https://github.com/silverstripe/silverstripe-framework/commit/8abede13395ca97d52e6a8d6cb82106da37127fb) Add SS_Database::withTransaction for nice enclosed transactions (Damian Mooyman)
* 2016-03-22 [094745ec0](https://github.com/silverstripe/silverstripe-framework/commit/094745ec0ffe24ffd9c5b36d0188ec90ad2bb8b5) Formally support custom ownership relations (Damian Mooyman)
* 2016-03-21 [2d56ea278](https://github.com/silverstripe/silverstripe-framework/commit/2d56ea278aaeebf49be80b4a40f718caf7cffba2) Move ss buttons plugin out of thirdparty (Damian Mooyman)
* 2016-03-17 [4cc7b080](https://github.com/silverstripe/silverstripe-cms/commit/4cc7b0806d12166c72f1e1bdf829d0c14e7beaf2) Update to use new Versioned API (Damian Mooyman)
* 2016-03-09 [067d44ac](https://github.com/silverstripe/silverstripe-cms/commit/067d44ac6ca2bf6353a8efdbc8e00266bd42fa9f) Update link tracking for image shortcodes (Damian Mooyman)
* 2016-03-08 [8ae794ee9](https://github.com/silverstripe/silverstripe-framework/commit/8ae794ee99b17bed83d969005be03a6621a4ccad) TinyMCE Image shortcodes (Ingo Schommer)
* 2016-03-07 [14d74f7a](https://github.com/silverstripe/silverstripe-siteconfig/commit/14d74f7ae369483edab421b679d39c3c2955e888) Refactor for removal of CMSForm class (Damian Mooyman)
* 2016-03-02 [0848aca46](https://github.com/silverstripe/silverstripe-framework/commit/0848aca4625954be8ffc4818be3e3df633f521fd) Massive refactor of Versioned (Damian Mooyman)
* 2016-02-26 [8366d22](https://github.com/silverstripe/silverstripe-installer/commit/8366d22a1930e0171179b084afce1baaac666e2b) Replace old assets/.htaccess with better default (Damian Mooyman)
* 2016-02-25 [c275c2105](https://github.com/silverstripe/silverstripe-framework/commit/c275c21057f8739e6d881625812a5d6fe39af663) Extensible::invokeWithExtension has same method signature as Extensible::extend (Damian Mooyman)
* 2016-02-25 [b196d33bf](https://github.com/silverstripe/silverstripe-framework/commit/b196d33bfa067e11c8a74771ef0aa6898548136a) Ownership API (Damian Mooyman)
* 2016-02-21 [de6db9f5](https://github.com/silverstripe/silverstripe-cms/commit/de6db9f5c6f32eb8b6efd72e78d7ff2fe212c772) Mark image tracking as owned (Damian Mooyman)
* 2016-02-16 [99394a84](https://github.com/silverstripe/silverstripe-cms/commit/99394a84d0ae1611754353423723a96601cfa2f0) Remove references to class aliases; Use correct classname (Damian Mooyman)
* 2016-02-12 [f20ad434c](https://github.com/silverstripe/silverstripe-framework/commit/f20ad434ce66d0102a4bd43c66df517ef385aa2b) Update TinyMCE to 4.x (Damian Mooyman)
* 2016-01-27 [829135a85](https://github.com/silverstripe/silverstripe-framework/commit/829135a85a0f97d5c4387ed2b66ee7cef7d7d7ad) remove Object::useCustomClass (Damian Mooyman)
* 2016-01-26 [1c907dd2](https://github.com/silverstripe/silverstripe-cms/commit/1c907dd227a41be8cd25ba0c751f6aa7a308ebfe) Support versioned File management (Damian Mooyman)
* 2016-01-26 [510c55673](https://github.com/silverstripe/silverstripe-framework/commit/510c55673972ea5aeaca40bc6ef9166fb2b339c3) File has Versioned extension (Damian Mooyman)
* 2016-01-25 [9662d938f](https://github.com/silverstripe/silverstripe-framework/commit/9662d938f385a24c00d8613fef9bd9340081fd44) remove obsolete class loaders from test listeners (Damian Mooyman)
* 2016-01-25 [17ee318d](https://github.com/silverstripe/silverstripe-cms/commit/17ee318d06edb37229634206a5f1dd4e032bcdd8) VirtualPage permissions now can be set independently of the mirrored page (Damian Mooyman)
* 2016-01-21 [e77389d0c](https://github.com/silverstripe/silverstripe-framework/commit/e77389d0c88225e68098fa8250a6b2ccdbf8a4ac) Standardise SS_List::map() implementation (Damian Mooyman)
* 2016-01-21 [c9764707](https://github.com/silverstripe/silverstripe-cms/commit/c97647078b065b962d2d1d5fd7ae85db40216e15) Refactor out Page default classname hack (Damian Mooyman)
* 2016-01-21 [5138bf1b7](https://github.com/silverstripe/silverstripe-framework/commit/5138bf1b7fe9a660574444d77ac5324b5687f40d) Refactor out Page default classname hack (Damian Mooyman)
* 2016-01-14 [8e1ae55ff](https://github.com/silverstripe/silverstripe-framework/commit/8e1ae55ff67647c495c4e1d528907d280d78ad37) Enable single javascript files to declare that they include other files (Damian Mooyman)
* 2015-12-21 [99de74d69](https://github.com/silverstripe/silverstripe-framework/commit/99de74d69e1bf39a43890487bee3e441b8b01105) Add isDisabledValue to SelectField (Damian Mooyman)
* 2015-12-09 [037467bea](https://github.com/silverstripe/silverstripe-framework/commit/037467beae90b92598500c27ecfe5d1fcbfea883) Asset Access Control implementation (Damian Mooyman)
* 2015-11-30 [c13b5d989](https://github.com/silverstripe/silverstripe-framework/commit/c13b5d989f4267e457fb08e0ff0ccdfdd77aa7fe) Enable advanced configuration options for requirements combined files (Damian Mooyman)
* 2015-11-26 [c50dc064](https://github.com/silverstripe/silverstripe-cms/commit/c50dc06401b7ea08bee4eef81b33586a2e2c1bbd) Update ErrorPage to use FilesystemGeneratedAssetHandler (Damian Mooyman)
* 2015-11-26 [ce28259c5](https://github.com/silverstripe/silverstripe-framework/commit/ce28259c5f21620db2a61f79fd6479be60a2d8c4) Replace CacheGeneratedAssetHandler with FlysystemGeneratedAssetHandler (Damian Mooyman)
* 2015-11-09 [369f3dda](https://github.com/silverstripe/silverstripe-cms/commit/369f3dda8d46d846c66bfc4e0c55fef7fcdf90d0) Remove deprecated ListboxField::setMultiple() (Damian Mooyman)
* 2015-11-09 [0b897477](https://github.com/silverstripe/silverstripe-siteconfig/commit/0b8974774781ab611e02a50318486472709263be) Remove deprecated setMultiple() (Damian Mooyman)
* 2015-10-29 [641c26299](https://github.com/silverstripe/silverstripe-framework/commit/641c26299ce9bce5c63f36277d8626aa3c1fe6e8) Enable linear-only restriction for DataList::applyRelation (Damian Mooyman)
* 2015-10-23 [e17a49f8a](https://github.com/silverstripe/silverstripe-framework/commit/e17a49f8a50ad1cf6539b41baedfde34277956c8) Restore JS Minification (Damian Mooyman)
* 2015-10-19 [d1ea74e40](https://github.com/silverstripe/silverstripe-framework/commit/d1ea74e40d7558e2ba8fef4c0fa5cecd0a98650b) Implement AssetField to edit DBFile fields (Damian Mooyman)
* 2015-10-14 [2bd9d00d](https://github.com/silverstripe/silverstripe-cms/commit/2bd9d00da0187558b7c76cd0bdc9d9664c140572) Remove filesystem sync (Damian Mooyman)
* 2015-10-13 [227e2ba1](https://github.com/silverstripe/silverstripe-cms/commit/227e2ba1628cc8969a5367e6aab3e20f253c7a82) Move ErrorPage to new generated files API (Damian Mooyman)
* 2015-10-12 [f9892c628](https://github.com/silverstripe/silverstripe-framework/commit/f9892c628c8709333969acb3c8ace4cb820b9987) Generated files API (Damian Mooyman)
* 2015-09-23 [f26c220d8](https://github.com/silverstripe/silverstripe-framework/commit/f26c220d865786725f85860d7848cbd8d137c6c0) Support trait loading (Damian Mooyman)
* 2015-09-16 [2b1e5ee07](https://github.com/silverstripe/silverstripe-framework/commit/2b1e5ee071e72494c02a1c04a508b54e401afe35) Enable DataList::sort to support composite field names (similar to filter) (Damian Mooyman)
* 2015-09-15 [be239896d](https://github.com/silverstripe/silverstripe-framework/commit/be239896d32a6d4437d53ce67e1ccf71847cc845) Refactor of File / Folder to use DBFile (Damian Mooyman)
* 2015-09-14 [051c69ba3](https://github.com/silverstripe/silverstripe-framework/commit/051c69ba3217d464a18270704364590ca752303c) (minor): Freshening up SS_Log API documentation and removed $extras param which was not being used anyway. (Patrick Nelson)
* 2015-09-10 [10dece653](https://github.com/silverstripe/silverstripe-framework/commit/10dece653f36d65a5649014464d40df85833c49f) Consolidate DataObject db methods (Damian Mooyman)
* 2015-09-04 [ee639deed](https://github.com/silverstripe/silverstripe-framework/commit/ee639deedbc3330ea419ee20a6bcd6a04e576bd2) showqueries=1 now shows parameters (Damian Mooyman)
* 2015-09-04 [9872fbef4](https://github.com/silverstripe/silverstripe-framework/commit/9872fbef4d3ae8f649451febb9d0e30ed6dcf843) Refactor CompositeDBField into an abstract class (Damian Mooyman)
* 2015-09-03 [ac27836d2](https://github.com/silverstripe/silverstripe-framework/commit/ac27836d2b3ebe286464744105e8628ec170f236) Implementation of RFC-1 Asset Abstraction (Damian Mooyman)
* 2015-08-30 [aeccb8b8e](https://github.com/silverstripe/silverstripe-framework/commit/aeccb8b8e05f1b26d5ee77075809d330fcedbb4a) Move DBField subclasses into SilverStripe\Model\FieldType namespace (Sam Minnee)
* 2015-07-31 [3e7eecf97](https://github.com/silverstripe/silverstripe-framework/commit/3e7eecf9784b21f7c0fcac14ed58172c575884e0) Remove SQLQuery (Damian Mooyman)
* 2015-07-23 [1b8d29576](https://github.com/silverstripe/silverstripe-framework/commit/1b8d2957673f50ec7c7e52bfb70980aa28519634) Shift to Monolog for error reporting and logging (Sam Minnee)
* 2015-07-16 [40cc567c3](https://github.com/silverstripe/silverstripe-framework/commit/40cc567c368cc8bc633c2486ca2c420bb1256924) Force resampling by default (Jonathon Menz)
* 2015-07-16 [d1af214ef](https://github.com/silverstripe/silverstripe-framework/commit/d1af214ef5efb817c14b85b639525104d94ef2d9) Removed custom dev/tests/ execution (Ingo Schommer)
* 2015-07-16 [a16588aac](https://github.com/silverstripe/silverstripe-framework/commit/a16588aac3b5b3ea0228d13f5c1f9cf437ac9582) Removed JSTestRunner (Ingo Schommer)
* 2015-06-17 [4aa84f3d](https://github.com/silverstripe/silverstripe-cms/commit/4aa84f3dd2856fb0caa597018a7f668f6e1265eb) make DataObject::validate public (Damian Mooyman)
* 2015-06-17 [55170a0b7](https://github.com/silverstripe/silverstripe-framework/commit/55170a0b746e09c59fc6a0d78f2461bfea5f835c) make DataObject::validate public (Damian Mooyman)
* 2015-06-12 [513f0191f](https://github.com/silverstripe/silverstripe-framework/commit/513f0191fba490275bb15e1a5d5f3c4b0c9cb5a5) default behaviour for Director::getAbsoluteUrl (Damian Mooyman)
* 2015-06-08 [3bc76e69](https://github.com/silverstripe/silverstripe-cms/commit/3bc76e69fb7e6da4803707c235431a80652da4f3) Formalise new DataObject::canCreate argument (Damian Mooyman)
* 2015-06-08 [e9d486382](https://github.com/silverstripe/silverstripe-framework/commit/e9d4863828882c12f0cb94d90affa43e6bef45bc) Formalise new additional arguments to DataObject::canCreate, DataExtension::augmentSQL, and DataObject::extendedCan (Damian Mooyman)
* 2015-05-19 [922d02f53](https://github.com/silverstripe/silverstripe-framework/commit/922d02f5356d5904debaf10003477cdd00306192) Enable filters to perform 'IS NULL' or 'IS NOT NULL' checks (Damian Mooyman)
* 2015-03-25 [7f5608c59](https://github.com/silverstripe/silverstripe-framework/commit/7f5608c599106a2b15509168cd575e1f62b133a5) Public visibility on DataQuery::selectField (Uncle Cheese)
* 2015-02-13 [bdb1a9575](https://github.com/silverstripe/silverstripe-framework/commit/bdb1a957583662fb0c463f61fee70cfefd26c988) Cleanup and refactor of select fields (Damian Mooyman)
* 2015-02-10 [dc8d4ffe](https://github.com/silverstripe/silverstripe-cms/commit/dc8d4ffe0bfa98043e23d24899f2fcf8c74cdd09) Refactor usages of HTMLText -&gt; HTMLFragment (Daniel Hensby)
### Features and Enhancements
* 2017-10-19 [04b4596be](https://github.com/silverstripe/silverstripe-framework/commit/04b4596bec408f04f1f8f2ba08872d0cf95b7d27) Don't fail immediately on imagick install (Damian Mooyman)
* 2017-10-16 [78f39e6b](https://github.com/silverstripe/silverstripe-cms/commit/78f39e6b1167e94cc39a123bece8cb02b4ca0ca8) hide tree view icon when searching (Christopher Joe)
* 2017-10-12 [7e97f04e4](https://github.com/silverstripe/silverstripe-framework/commit/7e97f04e47a1adf3848589269fbdba6c2b3737e1) Allow extensions to intercept incorrect deletes on unpublish (Damian Mooyman)
* 2017-10-10 [11b2c7453](https://github.com/silverstripe/silverstripe-framework/commit/11b2c74533f8c646085b1e1921b81525a3a6b194) Improve upgrade experience for beta3 -&gt; beta4 upgrade (Damian Mooyman)
* 2017-10-05 [cdf6ae45a](https://github.com/silverstripe/silverstripe-framework/commit/cdf6ae45a3a7d5bcd44c85d684a2aa2c4c75fb80) Ensure changePassword is called by onBeforeWrite for a consistent API (Robbie Averill)
* 2017-10-03 [43ec2f87e](https://github.com/silverstripe/silverstripe-framework/commit/43ec2f87eda5e8e2dbacc5679520da6eac3a8610) Implement accept attribute in FileField (closes #7279) (Loz Calver)
* 2017-10-03 [6b5241269](https://github.com/silverstripe/silverstripe-framework/commit/6b52412693eaf13d0ae60bb807180069d9cb7eec) Make Member::changePassword extensible (Robbie Averill)
* 2017-09-29 [f4b141761](https://github.com/silverstripe/silverstripe-framework/commit/f4b1417612426e1f7e26c3b31f2be5a403a2a1e3) Use less expensive i18n defaults in Member::populateDefaults() (Damian Mooyman)
* 2017-09-27 [36397c787](https://github.com/silverstripe/silverstripe-framework/commit/36397c787ccef002c7bba793e2e255112a8652c1) add notice for MigrateFileTask if FileMigrationHelper doesn't exist (Christopher Joe)
* 2017-09-27 [90d0361a6](https://github.com/silverstripe/silverstripe-framework/commit/90d0361a6ca3805370c21e9699bb602eb5c272e4) update set_themes to not update config (Christopher Joe)
* 2017-09-26 [28552155c](https://github.com/silverstripe/silverstripe-framework/commit/28552155c33f82d834d25cead433d4683fff0d42) Add actWithPermission to SapphireTest for shortcut to perform actions with specific permissions (Daniel Hensby)
* 2017-09-21 [fa57deeba](https://github.com/silverstripe/silverstripe-framework/commit/fa57deeba4099d74a8746909e3ba1767353c465b) Allow vendor modules with url rewriting (Damian Mooyman)
* 2017-09-21 [7e92b053f](https://github.com/silverstripe/silverstripe-framework/commit/7e92b053f4c01593539a18b3796c41ad0683ad46) Add setter and getter for certain classes, so that LeftAndMain no longer updates config during init (Christopher Joe)
* 2017-09-19 [261302a12](https://github.com/silverstripe/silverstripe-framework/commit/261302a12150b88068a70f829f7265f31e57f551) Don't force all class names to lowercase (Damian Mooyman)
* 2017-09-13 [04b1bb816](https://github.com/silverstripe/silverstripe-framework/commit/04b1bb816e8f3f6aa79e147179d53b0e9a8fff04) RateLimiter for Security controller (Daniel Hensby)
* 2017-09-05 [c707fccf6](https://github.com/silverstripe/silverstripe-framework/commit/c707fccf69cfb6683d7f905d0e440ffa35874e5a) Allow GridFieldEditButton to have configurable HTML classes. Change edit icon. (Sacha Judd)
* 2017-08-29 [98c10b089](https://github.com/silverstripe/silverstripe-framework/commit/98c10b089c0c3a9315f075dc44ab46bbe361369a) Allow &lt;% include %&gt; to fallback outside of the Includes folder (Damian Mooyman)
* 2017-08-28 [0b34066f0](https://github.com/silverstripe/silverstripe-framework/commit/0b34066f0cec8de2c1afdd717613ffab201d02a8) incorrect scalar types in doc blocks, add chainable returns in setters (Robbie Averill)
* 2017-08-23 [2c34af72e](https://github.com/silverstripe/silverstripe-framework/commit/2c34af72e18c7ba577591d389ca1eff2c4bc9eaf) Log user constants during CI for debugging improvements (Damian Mooyman)
* 2017-08-14 [0eebeedd0](https://github.com/silverstripe/silverstripe-framework/commit/0eebeedd0325609bd6785c4e1990109ea3052f23) Test php 7.2 (Sam Minnee)
* 2017-08-10 [9dc11eff4](https://github.com/silverstripe/silverstripe-framework/commit/9dc11eff4362f91c56ad63cf042cf4936f8ae7d3) Add a path option for the schema data, so a full tree is not required for this data (Christopher Joe)
* 2017-08-03 [8577ad128](https://github.com/silverstripe/silverstripe-framework/commit/8577ad128059f4c508f03df4e5566c09fe161be5) Added SSL support for MySQLi Connector (fixes #7242) (John)
* 2017-08-03 [417caf29](https://github.com/silverstripe/silverstripe-cms/commit/417caf29724c1bd6df286d4a0ef9bad71152bf2f) Allow insert links with display link text (Saophalkun Ponlu)
* 2017-08-03 [06efd2ac1](https://github.com/silverstripe/silverstripe-framework/commit/06efd2ac12d92bdfb08d23bcc317a83e9c369cd3) Ensure flush destroys temp tinymce files (Damian Mooyman)
* 2017-08-02 [2f9bfae1f](https://github.com/silverstripe/silverstripe-framework/commit/2f9bfae1f9f6bb2d33e3f979601e0abae243a7f6) Added MySQL SSL PDO Support (John)
* 2017-08-01 [ae97c15e4](https://github.com/silverstripe/silverstripe-framework/commit/ae97c15e4206f70bbdf6028365cb86373d8329ee) Soft-code CSS explicit height and compute against rows (Damian Mooyman)
* 2017-07-26 [74873096b](https://github.com/silverstripe/silverstripe-framework/commit/74873096bdd2cbc3ca1ed9a777987c595431dfb4) getSummary() API for SearchContext (Aaron Carlino)
* 2017-07-21 [392cda15f](https://github.com/silverstripe/silverstripe-framework/commit/392cda15f67dd6935a125483f66584051a3bd140) Add updateRules extension point to Director::handleRequest (Robbie Averill)
* 2017-07-20 [78d4d0d5d](https://github.com/silverstripe/silverstripe-framework/commit/78d4d0d5dd2811047833d5f3624fc1a3bf63c855) add support for TreeMultiselectField in react (Christopher Joe)
* 2017-07-16 [ac851f3a](https://github.com/silverstripe/silverstripe-siteconfig/commit/ac851f3afa1e46a35e355d04ce6cc91c05bd1589) Upgrade to Behat 3, remove old feature contexts, update Travis configuration (Robbie Averill)
* 2017-07-16 [12310d5d](https://github.com/silverstripe/silverstripe-siteconfig/commit/12310d5d2bc81605f4ec7ed2ea834fc84b799dfe) Change "only these people" to "only these groups" in permissions (Robbie Averill)
* 2017-07-16 [2dd5bb4d1](https://github.com/silverstripe/silverstripe-framework/commit/2dd5bb4d19a8f226e3179f89e7bb9514c630db84) Add Behat CMS header tab context methods (Robbie Averill)
* 2017-07-14 [6fc1491f](https://github.com/silverstripe/silverstripe-cms/commit/6fc1491f0b823ae43f86354d843ba3cd3a4cfbb1) Add edit command and its url test for page insert (Saophalkun Ponlu)
* 2017-07-13 [1cf8a67f](https://github.com/silverstripe/silverstripe-cms/commit/1cf8a67f21563c99044bccd78af6c7f02b1ebb81) Use injector for creating SSViewer (Robbie Averill)
* 2017-07-12 [f367a0aa6](https://github.com/silverstripe/silverstripe-framework/commit/f367a0aa62baef0969091cc766c41822ad305087) add web accessible colours to web view dev/build (Sacha Judd)
* 2017-07-10 [823e49526](https://github.com/silverstripe/silverstripe-framework/commit/823e49526fe43b554e1b05a098ddff498bb52210) Allow SSViewer and SSViewer_FromString to be injectable (Robbie Averill)
* 2017-07-04 [b347ab86](https://github.com/silverstripe/silverstripe-cms/commit/b347ab866d50a589a598fa4f27fef787a24d9879) Add version provider configuration (Robbie Averill)
* 2017-07-04 [ee4d8b4d4](https://github.com/silverstripe/silverstripe-framework/commit/ee4d8b4d4e22a25b86c90785c45cc480f8423861) Add new SilverStripeVersionProvider to provider module versions (Robbie Averill)
* 2017-07-04 [bd5782adc](https://github.com/silverstripe/silverstripe-framework/commit/bd5782adcaf46e4a7281b778504a38e4dc6badf3) Allow index type to be configured per DBField instance (Robbie Averill)
* 2017-07-03 [4c1dbd40](https://github.com/silverstripe/silverstripe-cms/commit/4c1dbd402b69093c069ffa12d8e01e4e5a816d83) Change "only these people" to "only these groups" in permissions (Robbie Averill)
* 2017-06-27 [ce730319](https://github.com/silverstripe/silverstripe-cms/commit/ce730319ecdf9f0c93c0ea4001d120fe238e9250) Remove use of MODULE_DIR constants (Sam Minnee)
* 2017-06-27 [8bb53215](https://github.com/silverstripe/silverstripe-siteconfig/commit/8bb5321546dfe289d29a970d0ba7d7ccd4527674) Remove use of MODULE_DIR constants (Sam Minnee)
* 2017-06-23 [c9c439061](https://github.com/silverstripe/silverstripe-framework/commit/c9c43906191511bce8ef6f4dc8b84600eebaebf2) Ensure polymorphic has_one fields are indexed (Robbie Averill)
* 2017-06-23 [ccc86306b](https://github.com/silverstripe/silverstripe-framework/commit/ccc86306b6a0d6eb9bbb8b41b209b8595393d591) Add TrustedProxyMiddleware (Sam Minnee)
* 2017-06-23 [c4d038f20](https://github.com/silverstripe/silverstripe-framework/commit/c4d038f20dfcba582c7ab35b596b106ae0938075) Add HTTPRequest::getScheme()/setScheme() (Sam Minnee)
* 2017-06-23 [4d89daac7](https://github.com/silverstripe/silverstripe-framework/commit/4d89daac786ac501a4c651d4bbe62d8eac701388) Register Injector::inst()-&gt;get(HTTPRequest) (Sam Minnee)
* 2017-06-23 [d3d426bdf](https://github.com/silverstripe/silverstripe-framework/commit/d3d426bdfc021b8bf1ae801674a1f9efa7ecfd57) restored Extension::__construct() (Franco Springveldt)
* 2017-06-23 [72a7655e9](https://github.com/silverstripe/silverstripe-framework/commit/72a7655e95f89aa63fe9ed7b3bce3d7fd32cd989) Moved allowed-hosts checking to a middleware. (Sam Minnee)
* 2017-06-23 [db080c060](https://github.com/silverstripe/silverstripe-framework/commit/db080c0603a14a4a134a83400d46cbf34d19bae5) Move session activation to SessionMiddleware. (Sam Minnee)
* 2017-06-23 [254204a3a](https://github.com/silverstripe/silverstripe-framework/commit/254204a3a66045e97ed076dc27910f85721177a9) Replace AuthenticationRequestFilter with AuthenticationMiddleware (Sam Minnee)
* 2017-06-23 [e85562289](https://github.com/silverstripe/silverstripe-framework/commit/e85562289045cdc7c5c0c619811444e4b1f4dcd9) Replace FlushRequestFilter with FlushMiddleware (Sam Minnee)
* 2017-06-22 [26b9bf11e](https://github.com/silverstripe/silverstripe-framework/commit/26b9bf11edcc2cb5a27a681ab52ad0f8299df81a) Allow “%$” prefix in Injector::get() (Sam Minnee)
* 2017-06-15 [a990c99d6](https://github.com/silverstripe/silverstripe-framework/commit/a990c99d6e6f477ab6e973ada13f9dff234682f5) suffix subfolder in silverstripe-cache with php-version (#6810) (Lukas)
* 2017-06-15 [5d27dccd6](https://github.com/silverstripe/silverstripe-framework/commit/5d27dccd6013d3d2ae8e26db74469c6b5f22ecdd) Add CSRF token to logout action (Loz Calver)
* 2017-06-11 [7178caf4a](https://github.com/silverstripe/silverstripe-framework/commit/7178caf4a947cf48f3785b2b1b6ec658a2ce146a) show the path which threw the error (Christopher Joe)
* 2017-06-01 [9a0e01d4a](https://github.com/silverstripe/silverstripe-framework/commit/9a0e01d4a083514c70992d8c7625c6cfedd6e54a) DB Driver defaults to PDO (Daniel Hensby)
* 2017-05-31 [0f90c5b63](https://github.com/silverstripe/silverstripe-framework/commit/0f90c5b63fdd5dedf0d5689c78208f44ddb4b4c1) Update style of CMSLogin form (Damian Mooyman)
* 2017-05-31 [844420df](https://github.com/silverstripe/silverstripe-cms/commit/844420df40c18fed97976da75265297e6386852a) Translation strings updated (Christopher Joe)
* 2017-05-24 [e327bf3c7](https://github.com/silverstripe/silverstripe-framework/commit/e327bf3c70a5f0510e579016ffce85f1efadaef1) add contribution notes about releasing to NPM (Christopher Joe)
* 2017-05-18 [c2841b6d6](https://github.com/silverstripe/silverstripe-framework/commit/c2841b6d64d2c756f4ad046bb1ef6eacf9d861ea) Remove "Remove link" button from the editor's main toolbar (Saophalkun Ponlu)
* 2017-05-18 [3e556b596](https://github.com/silverstripe/silverstripe-framework/commit/3e556b59660b1126a4079bd99e030415780997e2) Move index generation to DataObjectSchema and solidify index spec (Daniel Hensby)
* 2017-05-16 [9a31b19e](https://github.com/silverstripe/silverstripe-cms/commit/9a31b19ed28c4fc530dc4a231031313943a14799) RedirectorPage extensions can now modify fields (Damian Mooyman)
* 2017-05-11 [6869e450a](https://github.com/silverstripe/silverstripe-framework/commit/6869e450a0f98fdf44ec888308ee85262210ab60) added customisable emptyTitle and a showRootOption property in TreeDropdownField (Christopher Joe)
* 2017-05-10 [7fa47e234](https://github.com/silverstripe/silverstripe-framework/commit/7fa47e234f9082d770e4618a4e78ea2c5f74c80b) API for minified files using injectable service (Aaron Carlino)
* 2017-05-08 [afd157526](https://github.com/silverstripe/silverstripe-framework/commit/afd157526777b6f3a62644c800155c4286401e30) GridField passes in context for canCreate (Aaron Carlino)
* 2017-05-07 [f9ea752ba](https://github.com/silverstripe/silverstripe-framework/commit/f9ea752bae7344ea9df1eeef56e7e8259e65fbcb) Add AuthenticationHandler interface (Sam Minnee)
* 2017-05-05 [edcb220e4](https://github.com/silverstripe/silverstripe-framework/commit/edcb220e4afd99d294e105c2363fac3fbf0beb62) add EmailLink form factory server-side (Christopher Joe)
* 2017-05-04 [f4179d60](https://github.com/silverstripe/silverstripe-cms/commit/f4179d608de86f04cdc7d1d4211901d31ded3d52) Simplify test runs. (Sam Minnee)
* 2017-05-04 [1691e90fb](https://github.com/silverstripe/silverstripe-framework/commit/1691e90fbd4ef15fdf2514ba8da2e0500e0c7b29) Allow SapphireTest::objFromFixture() to accept either table or class (Sam Minnee)
* 2017-05-04 [2ee0d9980](https://github.com/silverstripe/silverstripe-framework/commit/2ee0d99806daca5e1fdcd033e5046a91785bfcac) switch FormFactories to use RequestHandler instead of Controller (Christopher Joe)
* 2017-04-24 [b6d4eb3e](https://github.com/silverstripe/silverstripe-cms/commit/b6d4eb3e77d3f7dd68067b1e46c93e391809290b) module-based JS translation keys (Aaron Carlino)
* 2017-04-20 [d51c4891e](https://github.com/silverstripe/silverstripe-framework/commit/d51c4891e2f585bf89c67071d9ad665c0c97151a) namespaced i18n keys (Uncle Cheese)
* 2017-04-20 [29805ee4](https://github.com/silverstripe/silverstripe-cms/commit/29805ee4462b5cc7620040864312d707e4a8d191) namespaced i18n keys (Uncle Cheese)
* 2017-04-13 [a58416b6](https://github.com/silverstripe/silverstripe-reports/commit/a58416b6f67b48651960368bbc513b92fed786f6) style travis tests (Ingo Schommer)
* 2017-04-03 [b8db4505](https://github.com/silverstripe/silverstripe-cms/commit/b8db45055ca8f08291d5d2ba4317a755339917a7) Refactor archive message to a separate method (Saophalkun Ponlu)
* 2017-04-03 [8b1c020b9](https://github.com/silverstripe/silverstripe-framework/commit/8b1c020b9f1890ba5818206baa7b51ee38ec1cb3) Downgrade MSSQL from commercially supported to community supported (Sam Minnee)
* 2017-03-31 [5b90141c](https://github.com/silverstripe/silverstripe-cms/commit/5b90141c03208873fc15e2a1e807ede52868ac41) Update archive warning message (Saophalkun Ponlu)
* 2017-02-27 [fc54fa160](https://github.com/silverstripe/silverstripe-framework/commit/fc54fa160064e50c6234dfbd17df13fee1c5984c) Add class to clear underline styling for fieldholders (Christopher Joe)
* 2017-02-02 [0982f77ec](https://github.com/silverstripe/silverstripe-framework/commit/0982f77ec70bfa69cd88767204fac55e677e4bc2) /aggregate data filters (#6553) (Aaron Carlino)
* 2017-02-02 [3952769ea](https://github.com/silverstripe/silverstripe-framework/commit/3952769ea390cdecf831c9c6fd653a7355a6d4af) More helpful error when .env is missing. (Sam Minnee)
* 2017-01-30 [06b4758](https://github.com/silverstripe/silverstripe-installer/commit/06b475896d69738541d3033690ed3768f8f42955) Add .env support (Daniel Hensby)
* 2017-01-30 [8c8231c03](https://github.com/silverstripe/silverstripe-framework/commit/8c8231c03e3fd1fea8d91da3c03676d59ed0847c) Director::host() to determine host name of site (Daniel Hensby)
* 2017-01-30 [873fd8c5b](https://github.com/silverstripe/silverstripe-framework/commit/873fd8c5bc03a848aae84f39b7d73af67b661798) replace _ss_environment.php with .env and environment vars (Daniel Hensby)
* 2017-01-16 [87ac3e397](https://github.com/silverstripe/silverstripe-framework/commit/87ac3e3971381945b2039c9e90934a6aa3dcb4a7) Display warning on always_populate_raw_post_data not being -1 in php 5 (#6507) (Damian Mooyman)
* 2017-01-13 [3ea5015f8](https://github.com/silverstripe/silverstripe-framework/commit/3ea5015f8bbed1a88b5ea9ba27c5fe33cf75ff36) Move to SwiftMailer powered Emails (#6466) (Daniel Hensby)
* 2017-01-11 [b52a963ed](https://github.com/silverstripe/silverstripe-framework/commit/b52a963ed7e6bea244ac08f83636db632f242c64) Remove jquery-ui button() api from default HTML editor dialog (Damian Mooyman)
* 2016-12-23 [ed26b251c](https://github.com/silverstripe/silverstripe-framework/commit/ed26b251c830bd7b096cd717bc1baeb6c2d4c590) Better output type detection for debugging (Damian Mooyman)
* 2016-12-21 [cf5c055de](https://github.com/silverstripe/silverstripe-framework/commit/cf5c055dede91a0da362aef8b3a9e5465af16de4) Campaign admin publish button styles missing (Paul Clarke)
* 2016-12-20 [e893fc4c5](https://github.com/silverstripe/silverstripe-framework/commit/e893fc4c5164b6cba9a1ea67b4651410b6cb01d1) improve secondary action colours (Paul Clarke)
* 2016-12-14 [d8843c6fe](https://github.com/silverstripe/silverstripe-framework/commit/d8843c6fe2bfd4a7116c327ba3be6d9926072227) Split out the fetch call easier mocking (Christopher Joe)
* 2016-12-13 [ddc9a9c6d](https://github.com/silverstripe/silverstripe-framework/commit/ddc9a9c6d6d48b9a689e3d3e0588aae07d344547) up buttons within gridfield search (Will Rossiter)
* 2016-12-12 [7b90ee137](https://github.com/silverstripe/silverstripe-framework/commit/7b90ee137dcd589c3c31d9683f4804f7f2607717) resize icon to sit inline and increase size of search icon and Upload icon (Paul Clarke)
* 2016-12-08 [085c8f5a4](https://github.com/silverstripe/silverstripe-framework/commit/085c8f5a43636cbb0c09d7a6cbeb218a8a7128e9) 2x increase in scanning of files for ConfigManifest (Jake Bentvelzen)
* 2016-12-07 [2a25a525c](https://github.com/silverstripe/silverstripe-framework/commit/2a25a525cb53a1f4158f87481a1658aa25e0c51f) Move temporary JSON block into standard component (Damian Mooyman)
* 2016-12-05 [6ec780493](https://github.com/silverstripe/silverstripe-framework/commit/6ec780493202c4a06165c9dafe0c2d7961de33a1) Add icon size for 14px icons and table padding for asset list (Paul Clarke)
* 2016-11-30 [cb6ec11f1](https://github.com/silverstripe/silverstripe-framework/commit/cb6ec11f1b179acadc0dd52d902aa52ca1284f2a) Implement import CSV icon and tidy up import forms (Will Rossiter)
* 2016-11-29 [0e92ecea0](https://github.com/silverstripe/silverstripe-framework/commit/0e92ecea0c1dc57ccde5b1b152934a880960375a) Prevent test DBs persisting after testing (Damian Mooyman)
* 2016-11-22 [8ab382ed7](https://github.com/silverstripe/silverstripe-framework/commit/8ab382ed78031a0da43417f3020e18c878bd92cb) Insert media modal in react (Damian Mooyman)
* 2016-11-21 [35e313de1](https://github.com/silverstripe/silverstripe-framework/commit/35e313de17acbf88a6b1c33c74f07136e25310cc) height for modal in IE10 (Paul Clarke)
* 2016-11-21 [0d788ddf](https://github.com/silverstripe/silverstripe-cms/commit/0d788ddfbc8be0e00d54b4316bf544104cb4cbdb) Code Coverage via CodeCov.io (#1631) (Ingo Schommer)
* 2016-11-01 [5650254b5](https://github.com/silverstripe/silverstripe-framework/commit/5650254b53a7ab25872657cdd6932ef5e63afdf3) es to allow code files in src/ folder. (Damian Mooyman)
* 2016-11-01 [213cf8841](https://github.com/silverstripe/silverstripe-framework/commit/213cf8841b5675c59a1578f36a3af9dd397d2eae) Test webpack build as part of NPM test run. (Sam Minnee)
* 2016-11-01 [e9d2f2f73](https://github.com/silverstripe/silverstripe-framework/commit/e9d2f2f733343bff29f5bab0fc94263d02119f0b) Use composer autoloader to set the right include path. (Sam Minnee)
* 2016-11-01 [7a10c194b](https://github.com/silverstripe/silverstripe-framework/commit/7a10c194bdd751f74669c07836befecc1fde400e) Move code files into src/ folder. (Sam Minnee)
* 2016-10-31 [741c515c](https://github.com/silverstripe/silverstripe-cms/commit/741c515cb2f5ed07d429cbcdcff32331aedb5d64) Improved behaviour for flexbox on smaller screens (Damian Mooyman)
* 2016-10-28 [bf9939e3](https://github.com/silverstripe/silverstripe-cms/commit/bf9939e32c1e624fdff4de8b0ca213531093a496) Refactor test bootstrap to be more modular. (Sam Minnee)
* 2016-10-26 [c47a1d909](https://github.com/silverstripe/silverstripe-framework/commit/c47a1d9091c4cba52109c7fa9d9a46ac57d4ea93) Simplified test runs. (Sam Minnee)
* 2016-10-24 [added212](https://github.com/silverstripe/silverstripe-cms/commit/added2129f7c91812442cc6ebfc01c72b9f68605) Simplified travis run (Sam Minnee)
* 2016-09-17 [b19475d74](https://github.com/silverstripe/silverstripe-framework/commit/b19475d748a8f3039605a5b63f8ef829688044a3) Ignore npm-shrinkwrap for greenskeeper-provided PRs. (Sam Minnee)
* 2016-09-17 [c2ebff5c1](https://github.com/silverstripe/silverstripe-framework/commit/c2ebff5c19ada06110f6422e9a74ffde8dacb182) Use sass-lint over scss-lint (Sam Minnee)
* 2016-09-15 [f700d8655](https://github.com/silverstripe/silverstripe-framework/commit/f700d86557375a0f7510344274337bb58b37e68f) Run JS/CSS linting in Travis. (Sam Minnee)
* 2016-09-14 [cebcf7fb8](https://github.com/silverstripe/silverstripe-framework/commit/cebcf7fb8c4bedb45cf8360978e95c11a831ff8b) More flexible theme resolution for framework and cms. (Sam Minnee)
* 2016-09-13 [07396e443](https://github.com/silverstripe/silverstripe-framework/commit/07396e4437064ace9cad66bedc5ea07eced78bf5) Move Travis behat test to run locally. (Sam Minnee)
* 2016-09-13 [96126323d](https://github.com/silverstripe/silverstripe-framework/commit/96126323d24349ade5900f68a3f3ea13e226ff77) themedCSS() and themedJavascript() work with any file layout. (Sam Minnee)
* 2016-09-12 [9dd5ebee8](https://github.com/silverstripe/silverstripe-framework/commit/9dd5ebee8cd04fd5b7544c7ca7cad0d065e7b8ed) Dont set up SilverStripe project for test run (Sam Minnee)
* 2016-09-12 [6b847d361](https://github.com/silverstripe/silverstripe-framework/commit/6b847d36144a5d10aa2eb1bf691a641efa82f73f) Allow project root to be treated as a module. (Sam Minnee)
* 2016-09-08 [3d827543](https://github.com/silverstripe/silverstripe-cms/commit/3d827543a8d7d419bba5ac79d398614f31b296a7) Allow pages to specify the controller they use (Loz Calver)
* 2016-05-21 [a9eebdc7e](https://github.com/silverstripe/silverstripe-framework/commit/a9eebdc7edc31023cb7272ed3fff2ca6f31de0b1) Allow namespaces in template include statements. (Sam Minnee)
* 2016-04-11 [21a106532](https://github.com/silverstripe/silverstripe-framework/commit/21a106532922fb9533c6be3c156015ba0149c2e3) Add createEndpointFetcher to backend (Sam Minnee)
* 2016-04-03 [a17c5cb14](https://github.com/silverstripe/silverstripe-framework/commit/a17c5cb148cbf08b59b846586fc6707cf6da5b1b) Expose silverstripe-backend for modules to access. (Sam Minnee)
* 2016-03-02 [ae3161969](https://github.com/silverstripe/silverstripe-framework/commit/ae3161969567215670574f0cca273a124586fa40) styles for main nav (Paul Clarke)
* 2016-02-04 [bab1f230b](https://github.com/silverstripe/silverstripe-framework/commit/bab1f230bfccf8f7fcc66bc38630eb4b2c1c2c4a) Cross device "Remember Me" feature (Jean-Fabien Barrois)
* 2015-08-28 [53ffc1a0d](https://github.com/silverstripe/silverstripe-framework/commit/53ffc1a0dbac52ad682a150d387b104c1dc0616f) Defining byID functions in SS_Filterable (Daniel Hensby)
* 2015-08-27 [52ca089d0](https://github.com/silverstripe/silverstripe-framework/commit/52ca089d0bb01a8a588ecaecbf841f92e9cec050) Ensure php7 builds pass. (Sam Minnee)
* 2015-07-29 [a1f7dcafa](https://github.com/silverstripe/silverstripe-framework/commit/a1f7dcafa23380ed9f357d3574dd6aea4bffd653) Add calls section to Injector configs. (Sam Minnee)
* 2015-07-27 [ebc3900c4](https://github.com/silverstripe/silverstripe-framework/commit/ebc3900c4af39ff3c46a0127b0cf681c829666a6) Replace DebugViews writeX() functions with renderX() functions. (Sam Minnee)
* 2015-05-27 [223466a8b](https://github.com/silverstripe/silverstripe-framework/commit/223466a8b8554046a0525de5b794c702cb56fdae) Configurable file version prefix (Jonathon Menz)
* 2015-05-01 [9f91b4782](https://github.com/silverstripe/silverstripe-framework/commit/9f91b4782513b703926a9ff90d6248bf4dc3059d) Update SS_ConfigStaticManifest to use Reflection (micmania1)
* 2014-07-05 [533d5dbd4](https://github.com/silverstripe/silverstripe-framework/commit/533d5dbd4b79c307d8b6289f8c6fb28ae743a9ca) Admin url can now be customized (Thierry François)
### Bugfixes
* 2017-10-25 [d6c528b](https://github.com/silverstripe/silverstripe-installer/commit/d6c528b8bc433914cadb60ce4435c011c861fa59) test paths (Damian Mooyman)
* 2017-10-25 [2f82d0846](https://github.com/silverstripe/silverstripe-framework/commit/2f82d084600cabc51bbadd9ae8c63b755087a8f7) Fix env loading in installer (Damian Mooyman)
* 2017-10-24 [d56c75607](https://github.com/silverstripe/silverstripe-framework/commit/d56c75607429229867a4d8d5b14ad13617661754) ed changelog indentation (Ingo Schommer)
* 2017-10-20 [4caf34506](https://github.com/silverstripe/silverstripe-framework/commit/4caf34506af4725a0e8ddcbdda68d6d72366051e) switch to using the Convert class for decoding (Christopher Joe)
* 2017-10-19 [689c198f](https://github.com/silverstripe/silverstripe-cms/commit/689c198fbecefe7fb73e035184314bb0fa21af06) revert to this button after archiving (Christopher Joe)
* 2017-10-18 [bb9501797](https://github.com/silverstripe/silverstripe-framework/commit/bb9501797f9f96bd7a5dc702ea6c5c084c6f4fde) Use isolated scope when requiring files for module activation (Loz Calver)
* 2017-10-18 [dabdc905c](https://github.com/silverstripe/silverstripe-framework/commit/dabdc905ce849583b7818751db461c81832d5496) Fix enable email subclasses to use their respective templates (Christopher Joe)
* 2017-10-18 [0b3363d0a](https://github.com/silverstripe/silverstripe-framework/commit/0b3363d0a05bf45dfe20003b7ba7d67d39558574) Fix documentation for permissions (Christopher Joe)
* 2017-10-17 [77b26b36](https://github.com/silverstripe/silverstripe-cms/commit/77b26b36fdfc28538f8050e877b8a46ec0b00478) Fix page icons in vendor modules (Damian Mooyman)
* 2017-10-17 [884fdd61b](https://github.com/silverstripe/silverstripe-framework/commit/884fdd61b18d9669c7b45c2465eef0260d8377ad) Ensure sake works when called from any directory (Damian Mooyman)
* 2017-10-16 [199f8377](https://github.com/silverstripe/silverstripe-cms/commit/199f83775ce10a3f7dd3cecb993766a11b729fa1) standardise "cms-content-header" content with ModalAdmin layout (Christopher Joe)
* 2017-10-16 [b9cb1e69e](https://github.com/silverstripe/silverstripe-framework/commit/b9cb1e69e6f20fa17522aec68a137d79f075ae5d) Replace phpdotenv with thread-safe replacement (Damian Mooyman)
* 2017-10-16 [076d7d78c](https://github.com/silverstripe/silverstripe-framework/commit/076d7d78c652be7fc041bc67873110f3a5411743) 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](https://github.com/silverstripe/silverstripe-framework/commit/7ff707df7388c5c8d62784d4cf87c98036958a53) 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](https://github.com/silverstripe/silverstripe-cms/commit/a930d7ae2e9d9a1f59eea74960700958f0ae896b) Fix up markup and classes to work better with flexbox (Christopher Joe)
* 2017-10-12 [6fe1e2c5](https://github.com/silverstripe/silverstripe-reports/commit/6fe1e2c5b2d5300a478eaec1e3c959e77300a600) align heading properly (Christopher Joe)
* 2017-10-12 [5ccbabd36](https://github.com/silverstripe/silverstripe-framework/commit/5ccbabd36ca9072b008f0ae444982de57ce6eb19) Fix sake path lookup to find vendor framework (Damian Mooyman)
* 2017-10-10 [c8f95182](https://github.com/silverstripe/silverstripe-cms/commit/c8f95182cbd46d2a8c0cf3fb4bf2ba95c9f97d25) icon urls (Damian Mooyman)
* 2017-10-10 [6a55dcfc1](https://github.com/silverstripe/silverstripe-framework/commit/6a55dcfc16eacf3210fa8d630953d588433275d5) references to resource paths / urls (Damian Mooyman)
* 2017-10-09 [9d873db9](https://github.com/silverstripe/silverstripe-cms/commit/9d873db976751c5ea3fc8172dbbbd3b842c359ca) paths in Install_successfullyinstalled.ss (Damian Mooyman)
* 2017-10-09 [fd630a99b](https://github.com/silverstripe/silverstripe-framework/commit/fd630a99b0226f9581268627c07a96ab36be98c5) Fix decimal scaffolding (Damian Mooyman)
* 2017-10-09 [f34f7cb66](https://github.com/silverstripe/silverstripe-framework/commit/f34f7cb6689c3fd991fe325242f45ec1c06fb551) surname behat test (Christopher Joe)
* 2017-10-08 [6bc716d7c](https://github.com/silverstripe/silverstripe-framework/commit/6bc716d7c98e723aa4c72da305c2be39d104b17c) ed incorrect statement on ID generation (Sam Minnée)
* 2017-10-08 [89db5870b](https://github.com/silverstripe/silverstripe-framework/commit/89db5870bc71d08966e9ecb43cd493512b21e0d8) typo in docs (Christopher Joe)
* 2017-10-08 [504e762c6](https://github.com/silverstripe/silverstripe-framework/commit/504e762c6eab9746990f1fb08020530f310a9ff4) Fix missing property in requirements minificaction docs (Damian Mooyman)
* 2017-10-06 [bd874ca91](https://github.com/silverstripe/silverstripe-framework/commit/bd874ca91f84b75594c3dab2232d43134f715659) ed docs paths (fixes #7075) (Ingo Schommer)
* 2017-10-06 [578f3f208](https://github.com/silverstripe/silverstripe-framework/commit/578f3f208c82fd9789990fe2a986d40ea474f49c) behat test (Christopher Joe)
* 2017-10-05 [3bdc8c7e6](https://github.com/silverstripe/silverstripe-framework/commit/3bdc8c7e65c6f6ecb9992042a83043f65658cb0d) Trim whitespace off names in Injector (Robbie Averill)
* 2017-10-05 [e07658ef5](https://github.com/silverstripe/silverstripe-framework/commit/e07658ef50d737f60c3234222d17fe1a9a46659c) linting issues and fix doc (Christopher Joe)
* 2017-10-05 [a1a834192](https://github.com/silverstripe/silverstripe-framework/commit/a1a834192940c01144c310bae2fc663d59fdb954) refactor TreeMultiselectField to be clearable if nothing is selected (Christopher Joe)
* 2017-10-04 [ca60b94f](https://github.com/silverstripe/silverstripe-reports/commit/ca60b94f2e982a7b42a74c15c6aa3431c8f2f153) Fix vendor bootstrap path (Damian Mooyman)
* 2017-10-04 [924e2a714](https://github.com/silverstripe/silverstripe-framework/commit/924e2a714f0e85ff28b2a2e00e1e7a14ff4fb1c7) sake path relative to vendor (Ingo Schommer)
* 2017-10-04 [f6ce07dc8](https://github.com/silverstripe/silverstripe-framework/commit/f6ce07dc889897516ff07d72e7cf4df1de38ddfe) behat bootstrap path (Ingo Schommer)
* 2017-10-04 [1b6d0144c](https://github.com/silverstripe/silverstripe-framework/commit/1b6d0144c5f330c8bf1cc9a180152c80af6f0f6b) Fix resource mapping for TinyMCE (Damian Mooyman)
* 2017-10-03 [2fc3f80f](https://github.com/silverstripe/silverstripe-cms/commit/2fc3f80f1f48b322acaeed0522ca6ee1a94f1d25) tinymce issue (Damian Mooyman)
* 2017-10-03 [ab4044e2](https://github.com/silverstripe/silverstripe-siteconfig/commit/ab4044e23e91db6c6108fb00ab1d271d9745262c) CI config (Damian Mooyman)
* 2017-10-03 [f4a77649a](https://github.com/silverstripe/silverstripe-framework/commit/f4a77649a4a77e506ad4b5de91f32a66bf96f803) requirements tests (Damian Mooyman)
* 2017-10-03 [5ffe64f02](https://github.com/silverstripe/silverstripe-framework/commit/5ffe64f024ba2f9b15517af6a01d433136e3648e) tinymce plugins (Damian Mooyman)
* 2017-10-02 [e1b98d154](https://github.com/silverstripe/silverstripe-framework/commit/e1b98d154e672aacf137798f906ec43d4861567f) tinymce operation for resource paths (Ingo Schommer)
* 2017-10-02 [7de2e07](https://github.com/silverstripe/silverstripe-installer/commit/7de2e07139352c7d332945e9b9db5fc65a8a507e) main.php path in install.php (Ingo Schommer)
* 2017-10-02 [8e49b563a](https://github.com/silverstripe/silverstripe-framework/commit/8e49b563a9184e1fdb9578bc05d3d9d5580bd577) installer paths for vendorised module (Ingo Schommer)
* 2017-10-02 [e88f765](https://github.com/silverstripe/silverstripe-installer/commit/e88f7654da811df43be6fa6bd2070619d774f717) main.php path (Ingo Schommer)
* 2017-10-02 [85255891b](https://github.com/silverstripe/silverstripe-framework/commit/85255891be79588407bc750527bea6c83a79c5be) test environment type (Damian Mooyman)
* 2017-10-02 [a2f0a79b](https://github.com/silverstripe/silverstripe-cms/commit/a2f0a79b21ab99e5b821f824e7290eb11d5d0e9c) test environment type (Damian Mooyman)
* 2017-10-02 [26f7f0482](https://github.com/silverstripe/silverstripe-framework/commit/26f7f0482cfb87086e7c984e9583026985c0128b) typos in FilesystemCacheFactory (Christopher Joe)
* 2017-09-29 [e2750c03f](https://github.com/silverstripe/silverstripe-framework/commit/e2750c03fc5569f33395f33637d278bfea2dbcd1) Restore SS_USE_BASIC_AUTH env var (Damian Mooyman)
* 2017-09-27 [53b2fcd1e](https://github.com/silverstripe/silverstripe-framework/commit/53b2fcd1ea7efa7b7b4e6fcd91a397075f40a21b) amend TinyMCE combined generator's unit test to be more lenient with encoding (Christopher Joe)
* 2017-09-27 [51ac297c5](https://github.com/silverstripe/silverstripe-framework/commit/51ac297c599ade6a964c395f5f631f4f15ba3e5a) es to ratelimiter and new features (Daniel Hensby)
* 2017-09-27 [c7cbbb29f](https://github.com/silverstripe/silverstripe-framework/commit/c7cbbb29f4a06bc4edf1cee0cad3c4953c11d2b4) links on paginated lists when there are GET vars (Andrew O'Neil)
* 2017-09-27 [4dbd72720](https://github.com/silverstripe/silverstripe-framework/commit/4dbd72720629f4cda578ae2efc077382992ef03d) Config updates are now applied after middleware not before (Damian Mooyman)
* 2017-09-26 [33ae463e5](https://github.com/silverstripe/silverstripe-framework/commit/33ae463e5b982214fbb1871c04cbaa0ed68440a6) Class name in _t() call in installer and run text collector (Robbie Averill)
* 2017-09-25 [b8e5a2ce3](https://github.com/silverstripe/silverstripe-framework/commit/b8e5a2ce322eb1f0c7d54111a69a8fdf01dbf9bf) readonly PermissionCheckboxSetField (Mike Cochrane)
* 2017-09-21 [fe4688b93](https://github.com/silverstripe/silverstripe-framework/commit/fe4688b9325d60c92a7e51c6f1344794bb672c5f) gridfield button title alignment (Saophalkun Ponlu)
* 2017-09-20 [f1a12e15b](https://github.com/silverstripe/silverstripe-framework/commit/f1a12e15be6546ebe9a7c3deec17d5bd9e1d65a4) Fix sub-template lookup for includes (Damian Mooyman)
* 2017-09-20 [265f91060](https://github.com/silverstripe/silverstripe-framework/commit/265f91060c2a8da61cb3e3a0de3f2d867809bcda) phpcs error (Christopher Joe)
* 2017-09-19 [f5b97b18](https://github.com/silverstripe/silverstripe-siteconfig/commit/f5b97b18bbdceca88d12d95d6587437f9d98ac8a) Update translation default from "only these people" to "only these groups" to match CMS (Robbie Averill)
* 2017-09-19 [09b3a24f3](https://github.com/silverstripe/silverstripe-framework/commit/09b3a24f30ec7da01a081f6c6aaa7080ddf0248b) Detect, warn, and fix invalid SS_BASE_URL (Damian Mooyman)
* 2017-09-18 [cda78e2d](https://github.com/silverstripe/silverstripe-reports/commit/cda78e2d887de13bb6143fba47a4d6a6153af7df) add space below report filter form (Saophalkun Ponlu)
* 2017-09-15 [68128b46](https://github.com/silverstripe/silverstripe-cms/commit/68128b46c3b5945fd1875f79caa2709fd65912c4) toolbar title layou (Saophalkun Ponlu)
* 2017-09-15 [df957681](https://github.com/silverstripe/silverstripe-siteconfig/commit/df9576814e48e9d492cc069a183a4381c3fb4c27) toolbar title layout (Saophalkun Ponlu)
* 2017-09-15 [5351ba67](https://github.com/silverstripe/silverstripe-reports/commit/5351ba670f64dc1f426420a9d4b7115b6dedd34d) toolbar title layout (Saophalkun Ponlu)
* 2017-09-13 [919831365](https://github.com/silverstripe/silverstripe-framework/commit/919831365846995e42b89de3fbb0920371f36bf0) HTTP Headers are case insensitive (Daniel Hensby)
* 2017-09-13 [f8ef97c16](https://github.com/silverstripe/silverstripe-framework/commit/f8ef97c1672e72508a7db946fac06c01a299e54a) Fix import modal (Damian Mooyman)
* 2017-09-12 [1892a0207](https://github.com/silverstripe/silverstripe-framework/commit/1892a02076b9c1a4deb823577cd6ff869921ad70) Fix gridfield print styles (Damian Mooyman)
* 2017-09-12 [0aac4ddb](https://github.com/silverstripe/silverstripe-cms/commit/0aac4ddb7ecf0f17eda8add235017c10c9f57255) Default LoginForm generated from default_authenticator (Daniel Hensby)
* 2017-09-12 [e15373ba](https://github.com/silverstripe/silverstripe-cms/commit/e15373ba0edbd5d0812b1c2485da57a478b6a635) ed linting errors and tests (Christopher Joe)
* 2017-09-12 [6613826ed](https://github.com/silverstripe/silverstripe-framework/commit/6613826ed8022c6feb112524b7835ea2bee73d74) SSViewer::add_themes() to properly prepend (Andrew Aitken-Fincham)
* 2017-09-12 [2b2cdb4c](https://github.com/silverstripe/silverstripe-cms/commit/2b2cdb4c4418bdc61668fbf2e28d933c93809657) Fix yarn build (Damian Mooyman)
* 2017-09-12 [905c4e04d](https://github.com/silverstripe/silverstripe-framework/commit/905c4e04d55c1dabca47154e4ee0ac15eb28e896) Incorrect path for requirements file (Damian Mooyman)
* 2017-09-12 [12480633b](https://github.com/silverstripe/silverstripe-framework/commit/12480633bfc3976940aba1c708f662a015fddde6) grid field button styles (Saophalkun Ponlu)
* 2017-09-11 [4f3b4f76](https://github.com/silverstripe/silverstripe-cms/commit/4f3b4f762616677cf5c5ca13d2d826c6b1cd769a) Fine-tune button styles (Saophalkun Ponlu)
* 2017-09-11 [d18568c3](https://github.com/silverstripe/silverstripe-cms/commit/d18568c3951051a8fbf4624cd0b758d268efa58c) Ensure client config merging includes existing parent "form" attributes (Robbie Averill)
* 2017-09-07 [49fd3391](https://github.com/silverstripe/silverstripe-cms/commit/49fd3391fec06dbac72a92329e2eae454119c64c) Prevent icons CSS being included twice (Damian Mooyman)
* 2017-09-06 [2dde7771](https://github.com/silverstripe/silverstripe-cms/commit/2dde77713206f6709a5ffa6a5b758a3c1abd7a5f) Add styles for url segment field (Sacha Judd)
* 2017-09-06 [dc240ce7f](https://github.com/silverstripe/silverstripe-framework/commit/dc240ce7f32a398400df541d22d46ebc0d1e1eaa) use correct namespaces for middleware injection (Andrew Aitken-Fincham)
* 2017-09-05 [25380eb45](https://github.com/silverstripe/silverstripe-framework/commit/25380eb45406b417482a03b047a5f337b3c61cbb) permission check for admin role (Christopher Joe)
* 2017-09-05 [3669f30e](https://github.com/silverstripe/silverstripe-cms/commit/3669f30e4eae880e6219d16994992f02707d1e50) Fix race condition with change detection / loading animation (Damian Mooyman)
* 2017-09-05 [2f7f4e73d](https://github.com/silverstripe/silverstripe-framework/commit/2f7f4e73d9490c4fb524a03ef78506ed20a68011) toolbar button margin and spacing (Saophalkun Ponlu)
* 2017-09-04 [4b26ed6a](https://github.com/silverstripe/silverstripe-cms/commit/4b26ed6a838b3c20b75916aa667d9a83a13afc16) Prevent treeview loading repeatedly on each page edit form (Damian Mooyman)
* 2017-09-04 [afda58c51](https://github.com/silverstripe/silverstripe-framework/commit/afda58c515d8caeb90086618b99a437e9d2356ea) add schema to the "auto" parts request (Christopher Joe)
* 2017-09-01 [eaa0a2a4](https://github.com/silverstripe/silverstripe-cms/commit/eaa0a2a4cba9bfe037800fd339d666a133225241) Update unused button classes for url segment field (Sacha Judd)
* 2017-08-31 [acc58c2b6](https://github.com/silverstripe/silverstripe-framework/commit/acc58c2b689f334bf754b23af80a27976f55b216) incorrect $has_one documentation (Matt Peel)
* 2017-08-31 [806ffb934](https://github.com/silverstripe/silverstripe-framework/commit/806ffb934e32644ddefc0dfb470d76218bd39334) Ensure installer.php works nicely with .env files (Damian Mooyman)
* 2017-08-31 [1c321019](https://github.com/silverstripe/silverstripe-cms/commit/1c321019c46538b73c1364388e1b76abd52e1ede) icons in right click menu (Christopher Joe)
* 2017-08-30 [1273059b](https://github.com/silverstripe/silverstripe-cms/commit/1273059b4cf90e444f6352ed32e661b6c58716a6) campaign form validation errors (Damian Mooyman)
* 2017-08-28 [e4b506cbe](https://github.com/silverstripe/silverstripe-framework/commit/e4b506cbe724d0c690b588a7b5846dbff50af967) add combinedFiles to clear logic (Christopher Joe)
* 2017-08-25 [8c15e451c](https://github.com/silverstripe/silverstripe-framework/commit/8c15e451c61a5bb721ccc5bcbd61077b82846039) Removed unnecessary database_is_ready call. (Sam Minnee)
* 2017-08-24 [9350b4a4](https://github.com/silverstripe/silverstripe-cms/commit/9350b4a425ac4ab714eec322972aa44e1131e919) Fix inconsistent breadcrumbs in CMS section (Damian Mooyman)
* 2017-08-24 [d0fd96d4](https://github.com/silverstripe/silverstripe-cms/commit/d0fd96d4e69b7f34e332256d2ff9752d4988f566) Remove entry points to tree in search mode (Saophalkun Ponlu)
* 2017-08-24 [5a9131a11](https://github.com/silverstripe/silverstripe-framework/commit/5a9131a1165ce59b99b62a67fedceca28d381df9) Do not try and access sessions when they are not ready (Robbie Averill)
* 2017-08-24 [c4ff9df1b](https://github.com/silverstripe/silverstripe-framework/commit/c4ff9df1b0b5b837a1f6e57997403ab14a9f2743) Use correct bootstrap class or GridFieldDetailForm delete button (Robbie Averill)
* 2017-08-24 [6efb35fb](https://github.com/silverstripe/silverstripe-cms/commit/6efb35fbcfbfa42ae6c151475165e1ec7809425c) Fix “Show unpublished versions” (#1930) (Damian Mooyman)
* 2017-08-24 [80cf096a6](https://github.com/silverstripe/silverstripe-framework/commit/80cf096a6eb07d620c86eedc76906da7fbd496df) Prioritise SS_BASE_URL over flakey SCRIPT_FILENAME check (Damian Mooyman)
* 2017-08-23 [d03edb20](https://github.com/silverstripe/silverstripe-cms/commit/d03edb208e4f386a6f59e9c1865e32e0231e9d9f) Search in page edit should now redirect to (full) table view (Saophalkun Ponlu)
* 2017-08-23 [1b087221d](https://github.com/silverstripe/silverstripe-framework/commit/1b087221d221523c76755e5a684f5b408c306ef7) Fix BASE_URL on CLI (Damian Mooyman)
* 2017-08-22 [47fced888](https://github.com/silverstripe/silverstripe-framework/commit/47fced88806935a65fb281951f14bc053b49bd97) Capture errors after a reload token redirect to login url (Damian Mooyman)
* 2017-08-21 [fc2a60391](https://github.com/silverstripe/silverstripe-framework/commit/fc2a6039154d6691468b31453f74cb2cf9bc5cc3) Dont construct extension_instances on objects that never use them (Damian Mooyman)
* 2017-08-21 [c50cd34df](https://github.com/silverstripe/silverstripe-framework/commit/c50cd34df67d81cf048515bf7f9e07f5cf77d3f4) Prevent repeated lookup of obj.dependencies by Injector (Sam Minnee)
* 2017-08-21 [249c7048d](https://github.com/silverstripe/silverstripe-framework/commit/249c7048d9d488fcc7082d2926fe1fe45435fd66) trim accept header parts (Christopher Joe)
* 2017-08-16 [ce5e15df6](https://github.com/silverstripe/silverstripe-framework/commit/ce5e15df6ea37ffc2c43476ecc2ddbb757343c68) Fix issue with multiple editors breaking plugins (Damian Mooyman)
* 2017-08-15 [02cd72074](https://github.com/silverstripe/silverstripe-framework/commit/02cd72074835a61ce9f81db217f8f73d6687e8dd) Remove deprecated assert() usage. (Sam Minnee)
* 2017-08-14 [0926b0451](https://github.com/silverstripe/silverstripe-framework/commit/0926b04512c3ab9fc667d66b60dd7e69847032df) Fix latent bug in DataObject (Sam Minnee)
* 2017-08-14 [d469a2dc](https://github.com/silverstripe/silverstripe-cms/commit/d469a2dc8832d821296bb40767958d8706488bd7) regressions from tinymce upgrade (#1923) (Damian Mooyman)
* 2017-08-08 [1a4a006d0](https://github.com/silverstripe/silverstripe-framework/commit/1a4a006d09e4397c3126fcf32c61692f90834b8a) PDOConnector ssl_cipher bug fixes #7258 (John)
* 2017-08-07 [5d5fac745](https://github.com/silverstripe/silverstripe-framework/commit/5d5fac7450bf6403ad25375ba60d8bc4cbd9938f) Throw exception when "value" is used to define indexes. Update docs. (Robbie Averill)
* 2017-08-07 [c164fcfe5](https://github.com/silverstripe/silverstripe-framework/commit/c164fcfe54dc7f170a617293a4502831ca101f09) reference to IE10 when it should be IE11 (Christopher Joe)
* 2017-08-07 [068156710](https://github.com/silverstripe/silverstripe-framework/commit/06815671023b0e86ff85dfa4513d62f5a37b69a3) Fix flushing on live mode (#7241) (Damian Mooyman)
* 2017-08-06 [f7bebdd8f](https://github.com/silverstripe/silverstripe-framework/commit/f7bebdd8f8ef17a5d3caca717f442cf4206a10cd) Fix install issue with IIS (Damian Mooyman)
* 2017-08-03 [b6a8e4588](https://github.com/silverstripe/silverstripe-framework/commit/b6a8e458882cd8f3d0a7a2e36ffbafc76ea04ffd) Ensure mocked controller has request assigned (Damian Mooyman)
* 2017-08-02 [e64acef53](https://github.com/silverstripe/silverstripe-framework/commit/e64acef53a68fae99978147cfbb2ea8ad33f37b1) Fix invalid i18n yaml (Damian Mooyman)
* 2017-08-02 [841801145](https://github.com/silverstripe/silverstripe-framework/commit/8418011456b12c1f2b5c39ba9f9b1a3ae637037e) linting issues (Damian Mooyman)
* 2017-08-01 [685320450](https://github.com/silverstripe/silverstripe-framework/commit/6853204504e869f525d24be32b66ab0d7e1e9883) Fix ajax loading wait for behat tests (Damian Mooyman)
* 2017-07-31 [424b1c0](https://github.com/silverstripe/silverstripe-installer/commit/424b1c04dd21bcf10d05378d08837dc54e24c251) Include .env.example and .editorconfig in git export (Sam Minnee)
* 2017-07-28 [53a0206b](https://github.com/silverstripe/silverstripe-cms/commit/53a0206b1d1216bde067435d0c58fb905a19fe51) check if parent context is SiteTree instance (Nic Horstmeier)
* 2017-07-28 [980d6b7ef](https://github.com/silverstripe/silverstripe-framework/commit/980d6b7ef77052bbf99158c072cfd36235c7aa8b) ?showqueries=inline failed on PDO databases (fixes #7199) (Loz Calver)
* 2017-07-28 [a85bc86fd](https://github.com/silverstripe/silverstripe-framework/commit/a85bc86fd320aaa3d3cfbcfb8546947d61dbcbc6) behat tree dropdown trigger (Damian Mooyman)
* 2017-07-27 [4e222fc18](https://github.com/silverstripe/silverstripe-framework/commit/4e222fc1896d864c000e547dc162f97614aaf34c) add function for selecting a value in the new tree dropdown in behat using react (Christopher Joe)
* 2017-07-27 [3ef9ca69d](https://github.com/silverstripe/silverstripe-framework/commit/3ef9ca69d1b4d284eabf94ff6044dea3fe7eb430) DBComposite doesn't allow arbitrary property assignment (Aaron Carlino)
* 2017-07-27 [47f24ce05](https://github.com/silverstripe/silverstripe-framework/commit/47f24ce05befd3b97686baafb0386bed22593be8) up test linting (Damian Mooyman)
* 2017-07-24 [980bf83](https://github.com/silverstripe/silverstripe-installer/commit/980bf834b7aee202becec2bbe0cdf854d723f9de) recipe plugin version constraint (Damian Mooyman)
* 2017-07-21 [d49a5f5a](https://github.com/silverstripe/silverstripe-cms/commit/d49a5f5af37819efc71d8eaf99174877ee82fbff) Yaml syntax (Daniel Hensby)
* 2017-07-21 [5bf9ccc23](https://github.com/silverstripe/silverstripe-framework/commit/5bf9ccc235cdce7155a6430ba074f1b425fc11b9) Deprecated yml syntax (Daniel Hensby)
* 2017-07-21 [2385b7385](https://github.com/silverstripe/silverstripe-framework/commit/2385b738550c8d9678c87cc09f2d40a4d8c078c4) fix config rules to match updated `Except` (Damian Mooyman)
* 2017-07-20 [db5f81d3](https://github.com/silverstripe/silverstripe-cms/commit/db5f81d39308fbb79acbd4189049360f60139596) behat tests (Saophalkun Ponlu)
* 2017-07-20 [cc6b4422](https://github.com/silverstripe/silverstripe-cms/commit/cc6b44223ec2e606ccc2fc19b60679c5e9862884) ContentController still using global $project; (Aaron Carlino)
* 2017-07-20 [6fd6a3894](https://github.com/silverstripe/silverstripe-framework/commit/6fd6a38949a7ac524defbc917e7ebcca86e10522) Fix unassigned nestedFrom (Damian Mooyman)
* 2017-07-19 [8aeec9208](https://github.com/silverstripe/silverstripe-framework/commit/8aeec92087d2815b71901652ff1b3c95ef12295f) FulltextSearchable DB engine not set correctly (Daniel Hensby)
* 2017-07-18 [fca3ba73](https://github.com/silverstripe/silverstripe-cms/commit/fca3ba73f52e2712b40538b015ebf250407edbd0) Pages search now defaults to list view (Saophalkun Ponlu)
* 2017-07-18 [ac388a559](https://github.com/silverstripe/silverstripe-framework/commit/ac388a5591bdf38adaa29aedad4e5845831cafd1) Exclude thirdparty dir from code coverage (Robbie Averill)
* 2017-07-18 [a5ca4ecb5](https://github.com/silverstripe/silverstripe-framework/commit/a5ca4ecb596cc5b0d7c706e849a864153854d60f) Log in as someone else returns user back to login screen (Robbie Averill)
* 2017-07-18 [fb6e6162](https://github.com/silverstripe/silverstripe-cms/commit/fb6e6162ca5f9991f536c14824e94339c0349a47) Use better inheritance based logic for deciding which active tab to display in edit page (Robbie Averill)
* 2017-07-17 [e8c77463](https://github.com/silverstripe/silverstripe-cms/commit/e8c77463c53e2329b1875c9c1cde9593538b047d) Use injection for CMSMain in tests (Robbie Averill)
* 2017-07-17 [ba9ad5527](https://github.com/silverstripe/silverstripe-framework/commit/ba9ad55274de9412f0a2112d1f57eda784615c2f) Base URL defaults to a slash in currentURL if not defined already (Robbie Averill)
* 2017-07-17 [da4e46e4d](https://github.com/silverstripe/silverstripe-framework/commit/da4e46e4de6142c463e7bf2c039b64f5ffe5e0da) Use merge and set instead of update for config calls (Robbie Averill)
* 2017-07-17 [c3cda42b](https://github.com/silverstripe/silverstripe-cms/commit/c3cda42b92729c448e81e0cb0f7fc9be00a6bc2a) Use merge or set instead of update for config calls (Robbie Averill)
* 2017-07-17 [ea4181166](https://github.com/silverstripe/silverstripe-framework/commit/ea4181166fa023e88c96c1311b972886a0636313) Ensure phpdbg calls are registered by SilverStripe core as a CLI call (Robbie Averill)
* 2017-07-16 [dd4d5740](https://github.com/silverstripe/silverstripe-cms/commit/dd4d5740b81ead5ece1042139799714ad831ff8f) Ensure tab states are reflected when switching on page edit screen (Robbie Averill)
* 2017-07-16 [85c79d4e](https://github.com/silverstripe/silverstripe-reports/commit/85c79d4e662706760bfa2c05e661d6194fcf420e) Re-enable code coverage runs with phpdbg (Robbie Averill)
* 2017-07-16 [8b12e97d7](https://github.com/silverstripe/silverstripe-framework/commit/8b12e97d7a6da351740ae4ec5db5b2372e255601) Enable code coverage builds with phpdbg and 7.1.7 (Robbie Averill)
* 2017-07-15 [1a38feff2](https://github.com/silverstripe/silverstripe-framework/commit/1a38feff2259c35f7a24af98d58bedaef8a59a80) Version provider uses early bound config getter, move LeftAndMain config to admin module (Robbie Averill)
* 2017-07-14 [844462108](https://github.com/silverstripe/silverstripe-framework/commit/844462108ec4398cf176b174f54986e842611dc3) diff reference (Damian Mooyman)
* 2017-07-13 [b726d64d1](https://github.com/silverstripe/silverstripe-framework/commit/b726d64d1d1516b4a22c173f924e08a1fb358f6d) SearchEngine to use quoted table names (martimiz)
* 2017-07-13 [b16896f22](https://github.com/silverstripe/silverstripe-framework/commit/b16896f22bc70457bf53d48ac71c30e40c2ad660) Ignore exceptions thrown when deleting test databases (Robbie Averill)
* 2017-07-13 [5fcd7d084](https://github.com/silverstripe/silverstripe-framework/commit/5fcd7d084fb6c4af92873af470ccf3032fbbf212) Fix registered shutdown function not handling responsibility for outputting redirection response (Damian Mooyman)
* 2017-07-13 [16b66440c](https://github.com/silverstripe/silverstripe-framework/commit/16b66440c22595ebd1db7e57af342b38ef2e84ef) Incorrect module delimiter (Aaron Carlino)
* 2017-07-13 [4898c0a4a](https://github.com/silverstripe/silverstripe-framework/commit/4898c0a4ad8402632748ebdbe388a3051501f316) Incorrect module delimited (Damian Mooyman)
* 2017-07-13 [3cf9910f](https://github.com/silverstripe/silverstripe-cms/commit/3cf9910fe4a4957c331e0c1ce86f48ea42c5d04c) Incorrect module delimited (Damian Mooyman)
* 2017-07-06 [85359ad59](https://github.com/silverstripe/silverstripe-framework/commit/85359ad59eedd6a5bc9a9b25aa702e4bc78d4817) Ensure that installer can create an initial admin account (Damian Mooyman)
* 2017-07-05 [55dc3724d](https://github.com/silverstripe/silverstripe-framework/commit/55dc3724dbfbf286dc2e04232afb71cbb87f6cb3) Invalid composer.json (Damian Mooyman)
* 2017-07-04 [c836a2e2d](https://github.com/silverstripe/silverstripe-framework/commit/c836a2e2d288d10e601a29003bcc30a9fb7a3d94) Module resource regex does not allow ports (Aaron Carlino)
* 2017-07-04 [f14e6bae2](https://github.com/silverstripe/silverstripe-framework/commit/f14e6bae2c353468f1e9f0dfb3e2af64b3061402) numeric field for null values (John Milmine)
* 2017-07-04 [4b2320583](https://github.com/silverstripe/silverstripe-framework/commit/4b23205838a8bb16d64a3e44a069731b235ca6ca) unnamespaced i18n keys (Damian Mooyman)
* 2017-07-03 [fdbd6015](https://github.com/silverstripe/silverstripe-reports/commit/fdbd6015d820a2c866051a3cbc5698eb94591ab8) dependencies (Damian Mooyman)
* 2017-07-03 [8bb325f3](https://github.com/silverstripe/silverstripe-cms/commit/8bb325f3cac0f14400d49811d94675c8bc640507) upgrade paths (Damian Mooyman)
* 2017-07-03 [63ba09276](https://github.com/silverstripe/silverstripe-framework/commit/63ba092765be08303ce6708bc5d20179de8038dc) Add namespaces in markdown docs (#7088) (Saophalkun Ponlu)
* 2017-07-03 [f65e3627d](https://github.com/silverstripe/silverstripe-framework/commit/f65e3627dcdab37073a4c136169f9840ae911654) Implement or exclude all pending upgrader deltas (Damian Mooyman)
* 2017-06-30 [363394769](https://github.com/silverstripe/silverstripe-framework/commit/3633947699e0a6130e21b94f001b01c8705982a4) Fix broken installer assets and session crash (Damian Mooyman)
* 2017-06-30 [99f9d4a2](https://github.com/silverstripe/silverstripe-cms/commit/99f9d4a2d3f9ef6f8eac477044c9eb21979263a7) assertions (Damian Mooyman)
* 2017-06-29 [0200e2b62](https://github.com/silverstripe/silverstripe-framework/commit/0200e2b62aee0366f513403477408fd7c9d43303) Fix travis artifacts paths (Damian Mooyman)
* 2017-06-29 [061393a09](https://github.com/silverstripe/silverstripe-framework/commit/061393a0980784d0b6e1e3eee9add906bd390f8f) enable ?flush rather than just ?flush=1 (Christopher Joe)
* 2017-06-29 [522af3f2](https://github.com/silverstripe/silverstripe-cms/commit/522af3f29db2cf6fa573aa4546ba66be4b97015e) Test updates to comply with https://github.com/silverstripe/silverstripe-framework/pull/7083 (Sam Minnee)
* 2017-06-29 [2c8790ca7](https://github.com/silverstripe/silverstripe-framework/commit/2c8790ca7d03461c682083cd651e6c2a2020b013) DataObject::get_one() misses return null, not false (Sam Minnee)
* 2017-06-28 [b2f3b218a](https://github.com/silverstripe/silverstripe-framework/commit/b2f3b218a330a343a2377d246db87d3a2f4fbb61) Fix incorrect $database autoinit (Damian Mooyman)
* 2017-06-28 [8078ee08f](https://github.com/silverstripe/silverstripe-framework/commit/8078ee08f2726677c52860ad154d1f3c1adf3208) Fix folder urls getting mtime querystring appended (Damian Mooyman)
* 2017-06-27 [b8750d9](https://github.com/silverstripe/silverstripe-installer/commit/b8750d9399112de32265463a808a0b27e226b2d1) Delete Page_Controller from SS4 compat branch (Robbie Averill)
* 2017-06-27 [af1654ed](https://github.com/silverstripe/silverstripe-cms/commit/af1654eda3dd9306a9828e5e5c7ac784a8ec47c6) Dont click hidden button (Damian Mooyman)
* 2017-06-27 [ab0b3d8a](https://github.com/silverstripe/silverstripe-reports/commit/ab0b3d8a2f2d500513e7dd2e1be796119a3d99df) namespaces in docs (Saophalkun Ponlu)
* 2017-06-26 [b34519e7](https://github.com/silverstripe/silverstripe-cms/commit/b34519e7e8bdc29195cdff7a40e2594a1663a9ed) insert link modal to work with new injector API (#1860) (Chris Joe)
* 2017-06-25 [3c35d25a6](https://github.com/silverstripe/silverstripe-framework/commit/3c35d25a646d187c40878e40fbf558922e4dd9ae) Allow DB::setConfig() in _config.php (Sam Minnee)
* 2017-06-25 [67887febc](https://github.com/silverstripe/silverstripe-framework/commit/67887febc55a05e4c3613b3428d295b3e2eff5af) - session now uses request (Sam Minnee)
* 2017-06-23 [95a266c6b](https://github.com/silverstripe/silverstripe-framework/commit/95a266c6b97c82588a3342eebfac61fc23932891) Add tests for middleware (Sam Minnee)
* 2017-06-22 [ad347af7](https://github.com/silverstripe/silverstripe-cms/commit/ad347af76f825ca9fd8af2973db6502025068a64) linter (Ingo Schommer)
* 2017-06-22 [fa568e333](https://github.com/silverstripe/silverstripe-framework/commit/fa568e333e31f075fda57e4bb6da01bf7a19141f) ed linting errors (Ingo Schommer)
* 2017-06-22 [c2ad41ef](https://github.com/silverstripe/silverstripe-cms/commit/c2ad41ef1b13da2b29ed6d3b26aa7a092bfecd9c) Allow RedirectorPage to have non-redirected actions, move redirection to index (Robbie Averill)
* 2017-06-22 [8d23cfc2](https://github.com/silverstripe/silverstripe-cms/commit/8d23cfc2aaa2b57fa8687062ce546095a3a5e2a3) Ensure LoginForm on ContentController can load the member authenticator correctly (Robbie Averill)
* 2017-06-22 [12c2edc1d](https://github.com/silverstripe/silverstripe-framework/commit/12c2edc1d573452451f46c660704dde2e335afc0) DeprecationTest (Ingo Schommer)
* 2017-06-22 [ad54e7eb3](https://github.com/silverstripe/silverstripe-framework/commit/ad54e7eb30be0632c00c81feaa33b61f79f0327d) ImportButton not opening the modal (Will Rossiter)
* 2017-06-22 [fb09e0b65](https://github.com/silverstripe/silverstripe-framework/commit/fb09e0b65fe983397fa57046816e3d210f4930d9) merge error (Ingo Schommer)
* 2017-06-22 [e592bed3e](https://github.com/silverstripe/silverstripe-framework/commit/e592bed3e5287b766f646a0b9db226d1731f3b96) ed merge error (Ingo Schommer)
* 2017-06-21 [8cebb275](https://github.com/silverstripe/silverstripe-cms/commit/8cebb2758d5e49e22ebf780ecfd73264ec1026ce) behat issues (Damian Mooyman)
* 2017-06-21 [b05dbc91](https://github.com/silverstripe/silverstripe-siteconfig/commit/b05dbc91f0b23da3166f3cb23c4c435e918325ff) module tests (Damian Mooyman)
* 2017-06-21 [288de2eb1](https://github.com/silverstripe/silverstripe-framework/commit/288de2eb14f38effdd90428eaf9903b8ada83b68) Add flag on form whether to notify user when there's unsaved changes (Saophalkun Ponlu)
* 2017-06-21 [c2c75aa9](https://github.com/silverstripe/silverstripe-cms/commit/c2c75aa9e3a897bc810d348f29459cff891de8bf) and upgrade all tests (Damian Mooyman)
* 2017-06-21 [7a7e8003](https://github.com/silverstripe/silverstripe-siteconfig/commit/7a7e80030f9ca32afd1e79aacc6eea732e00487c) Use double escapes backslashes in translation string (Robbie Averill)
* 2017-06-15 [54879402c](https://github.com/silverstripe/silverstripe-framework/commit/54879402ce74e609f8f129a38ded715a2635ff87) Removed reserved / removed / invalid country codes (Damian Mooyman)
* 2017-06-15 [957d238ca](https://github.com/silverstripe/silverstripe-framework/commit/957d238caa1a3ee63bc3645e8c3868cfd65b2b34) Remove reference to removed method parseIndexSpec (Damian Mooyman)
* 2017-06-15 [fdbe38d4](https://github.com/silverstripe/silverstripe-cms/commit/fdbe38d44483d3b990e447efaa3d3407433fe04b) SS4 Right click, add page fails (Antony Thorpe)
* 2017-06-11 [0dcfa5fa9](https://github.com/silverstripe/silverstripe-framework/commit/0dcfa5fa9df60f159380d4ddb5471171518c951c) CMSSecurity doesn't have Authenticators assigned. (Damian Mooyman)
* 2017-06-10 [3fe837dad](https://github.com/silverstripe/silverstripe-framework/commit/3fe837dad7d887f52096ba1adb26102f3a16754c) for CMS Authenticator. Should only apply to CMSSecurity (Simon Erkelens)
* 2017-06-09 [10196e4f](https://github.com/silverstripe/silverstripe-cms/commit/10196e4f75f99b01752a625d62c4ad2e674a77ff) composer requirements (Christopher Joe)
* 2017-06-02 [d12c986dd](https://github.com/silverstripe/silverstripe-framework/commit/d12c986dd544877bb566bcdf4920e4df466d37e0) es printing from crashing (Christopher Joe)
* 2017-06-02 [e267d29b9](https://github.com/silverstripe/silverstripe-framework/commit/e267d29b9ad1ecb192e6b6c54ca674ff4e651cef) Consistent return values for first and last methods (Saophalkun Ponlu)
* 2017-05-30 [13ee3148d](https://github.com/silverstripe/silverstripe-framework/commit/13ee3148d95f88190df6dfbefa0bc24eabd45388) Bracket should implement TestOnly (Daniel Hensby)
* 2017-05-30 [3c7c6399](https://github.com/silverstripe/silverstripe-cms/commit/3c7c639901d8854b3dfa3c972308b4d59d4708ed) remove temp external entries (Christopher Joe)
* 2017-05-29 [acb74a857](https://github.com/silverstripe/silverstripe-framework/commit/acb74a8577dc02a1e25ac9572d4d3a7157732480) $class variable from being clobbered (Nick)
* 2017-05-29 [db59e51c4](https://github.com/silverstripe/silverstripe-framework/commit/db59e51c4a3342ec3a8ffa3f0070e64da436d172) es a bug with split file names during CSV import (Colin Tucker)
* 2017-05-25 [9c63a8c8c](https://github.com/silverstripe/silverstripe-framework/commit/9c63a8c8ce2910b7690c3cfb0ed70f95d8a1d205) Fix race conditions in DatetimeFieldTest (Damian Mooyman)
* 2017-05-24 [0cd40ca6e](https://github.com/silverstripe/silverstripe-framework/commit/0cd40ca6e50cecf582eda952d3a7a0a3788a5397) Fix minor accessors of legacy -&gt;class property (Damian Mooyman)
* 2017-05-22 [09164e7e2](https://github.com/silverstripe/silverstripe-framework/commit/09164e7e2a32accd56ade5e1552fe839c55ebcb8) Better error checking for non-writable temp paths (Sam Minnee)
* 2017-05-22 [40d9bbfd6](https://github.com/silverstripe/silverstripe-framework/commit/40d9bbfd69dc5e6c83616d2dca3359a57a011f54) Dont assume posix_getpwuid is available. (Sam Minnee)
* 2017-05-22 [f7e7fa584](https://github.com/silverstripe/silverstripe-framework/commit/f7e7fa5847beb995c43364971b042348d5df0108) linting issues (Damian Mooyman)
* 2017-05-19 [c034ead6](https://github.com/silverstripe/silverstripe-cms/commit/c034ead6df933665247539e8a9d8b36492859fa9) beforeUpdateCMSFields added to ErrorPage and VirtualPage (Franco Springveldt)
* 2017-05-19 [a29f4f88](https://github.com/silverstripe/silverstripe-siteconfig/commit/a29f4f88df92cbfaf5f8814d5c6e22d74caa1ffe) Remove legacy translation behaviour in template (Robbie Averill)
* 2017-05-19 [31578d477](https://github.com/silverstripe/silverstripe-framework/commit/31578d4771eec4b5f4ecb5d8e1103bb9b21adcd9) Parent treedropdownfield for an orphaned page is broken (Mike Cochrane)
* 2017-05-19 [fc036208](https://github.com/silverstripe/silverstripe-cms/commit/fc0362087e42d66d7d4a138c9fd52be0be0d9f50) Remove legacy sprintf style translations in favour of placeholders (Robbie Averill)
* 2017-05-17 [dddf88278](https://github.com/silverstripe/silverstripe-framework/commit/dddf88278c48eaa2e67442d1087fbed76fd4d69b) a typo in comment (Nick)
* 2017-05-17 [0534a5ec0](https://github.com/silverstripe/silverstripe-framework/commit/0534a5ec0c79ff4ee3412eaf58d476614763179e) TreeDowndropField copying (Christopher Joe)
* 2017-05-16 [eebae1f7](https://github.com/silverstripe/silverstripe-cms/commit/eebae1f76684f2dbcea9ce2ca8dd9c9229d0789c) Fix insert link behat command (Damian Mooyman)
* 2017-05-16 [7a7e8e5f9](https://github.com/silverstripe/silverstripe-framework/commit/7a7e8e5f94f68dd6e25a8880ea6257670efc4f12) Fix artifacts index.html download path (Damian Mooyman)
* 2017-05-16 [6c5e0f82](https://github.com/silverstripe/silverstripe-cms/commit/6c5e0f829a9b5771585fc076265d324ea2e721c7) Ensure logs are saved to artifacts (Damian Mooyman)
* 2017-05-16 [0b24e02d](https://github.com/silverstripe/silverstripe-cms/commit/0b24e02db462fbca2cb68ac88dbdcb35b46d1116) Fix missing path to travis-upload-artifacts.php (Damian Mooyman)
* 2017-05-16 [287ad35f0](https://github.com/silverstripe/silverstripe-framework/commit/287ad35f0dca7e1b53219b58b39eb4221abb0e78) change API to hasEmptyDefault() to be inline with SingleSelectField (Christopher Joe)
* 2017-05-15 [1ec7c4e52](https://github.com/silverstripe/silverstripe-framework/commit/1ec7c4e523f1f40dbdb9f8e865daf4a40bbf8fb2) lint error (Saophalkun Ponlu)
* 2017-05-15 [3927e7e24](https://github.com/silverstripe/silverstripe-framework/commit/3927e7e24868f7feba42669613161f7a456e48be) added cache key for TreeDropdownField cache (Christopher Joe)
* 2017-05-12 [6939841e4](https://github.com/silverstripe/silverstripe-framework/commit/6939841e47666080785b8513e20c5569358ce6ef) update ss template FormActions to be closer to React's implementation (Christopher Joe)
* 2017-05-12 [e2b7ca2e](https://github.com/silverstripe/silverstripe-cms/commit/e2b7ca2e796a56a5ac541820a768c23eee51ddf6) for save and publish buttons shrinking (Christopher Joe)
* 2017-05-12 [de079154](https://github.com/silverstripe/silverstripe-cms/commit/de079154f4e82ca0eaf4ddc42272a6e92e35db9e) Webpack dev config was overwriting plugins rather than concatenating (Aaron Carlino)
* 2017-05-11 [43a122cc3](https://github.com/silverstripe/silverstripe-framework/commit/43a122cc36a5d12f31758afc05e679bf39e842b7) for meta closing tags (Ralph Slooten)
* 2017-05-09 [4373bdb99](https://github.com/silverstripe/silverstripe-framework/commit/4373bdb991c9b2f57084e8c867b5bf5037940d6b) Prevent infinite loop (Mike Cochrane)
* 2017-05-09 [17ddfab87](https://github.com/silverstripe/silverstripe-framework/commit/17ddfab87749b13e3bac249ed39442cea5a79beb) Test form factories use the new interface (Christopher Joe)
* 2017-05-09 [f3b442e9](https://github.com/silverstripe/silverstripe-cms/commit/f3b442e9b4e52da63bdd527cd44a10bdedf38268) behat tests for insert link to work with react implementation (Christopher Joe)
* 2017-05-05 [11b8926c](https://github.com/silverstripe/silverstripe-cms/commit/11b8926c1a5956959e8d44be9d1293429fb63858) up - prefer-stable necessary to avoid armageddon (Sam Minnee)
* 2017-05-05 [6ddd7534](https://github.com/silverstripe/silverstripe-cms/commit/6ddd753471184299648ce299667b744759633b0e) up - fix behat.paths.base reference (Sam Minnee)
* 2017-05-04 [e2271d1b](https://github.com/silverstripe/silverstripe-cms/commit/e2271d1b0a2d4771b15b52d0dbd239cb01acb7ac) up - make behat work (Sam Minnee)
* 2017-05-04 [c1b3d87b](https://github.com/silverstripe/silverstripe-cms/commit/c1b3d87b58dd15301c589b34db50fb06ffc3ea5c) up - don't need to explicitly include testsession (Sam Minnee)
* 2017-05-04 [a05958b3e](https://github.com/silverstripe/silverstripe-framework/commit/a05958b3ea7511553f94527a28e6b7ce9b64a668) i18n test fixtures stricter for Symfony3 (Sam Minnee)
* 2017-05-04 [4332d2fa](https://github.com/silverstripe/silverstripe-reports/commit/4332d2fa8e8914aa999950d7699cfbd4d245e5c3) Drop php5.5, add php7.1, simplify build (Sam Minnee)
* 2017-05-04 [c58dc97d3](https://github.com/silverstripe/silverstripe-framework/commit/c58dc97d3927c41ab4681d2d148830eabca5a65d) optional $id param because of how methodSchema passes a parameter (Christopher Joe)
* 2017-05-04 [1f8de20ce](https://github.com/silverstripe/silverstripe-framework/commit/1f8de20ce755e75b3cd54fe2663e6630f6470f37) FormSchemaTest.php linting issues (Damian Mooyman)
* 2017-05-03 [0c52ea067](https://github.com/silverstripe/silverstripe-framework/commit/0c52ea067c65aa1f0d5064e1fadd5b81ff9ee659) Fix incorrect text collection of __CLASS__ following an Name::class constant (#6868) (Damian Mooyman)
* 2017-05-02 [8b9f41d4f](https://github.com/silverstripe/silverstripe-framework/commit/8b9f41d4f444b281aa86402c00e8babd68a035a3) Fix ApcuCache and MemCache namespace (Damian Mooyman)
* 2017-04-30 [8dd3f4ce1](https://github.com/silverstripe/silverstripe-framework/commit/8dd3f4ce1de9f014c617e6a20b331bb81979aff9) template localisation namespaces (#6852) (Damian Mooyman)
* 2017-04-29 [391901df8](https://github.com/silverstripe/silverstripe-framework/commit/391901df87b94c2727f4f5a291a258d94193d38c) quote outside the if statement. (Simon Erkelens)
* 2017-04-28 [9147fa44](https://github.com/silverstripe/silverstripe-cms/commit/9147fa44ba7d64351fe5781aa3c1134af4eae3e1) source file encoding (Damian Mooyman)
* 2017-04-28 [699d5d6a4](https://github.com/silverstripe/silverstripe-framework/commit/699d5d6a42a8485f35567a9abb7f630e82210699) i18nTextCollector handling of special string characters (Damian Mooyman)
* 2017-04-27 [daed727ac](https://github.com/silverstripe/silverstripe-framework/commit/daed727accb205c5a8fc46026c03539707aa2d2c) ed form schema validation (Ingo Schommer)
* 2017-04-27 [a2ee6a76a](https://github.com/silverstripe/silverstripe-framework/commit/a2ee6a76a0dfed5bb738852c932d04a91545614c) ed formschematest (Ingo Schommer)
* 2017-04-27 [3a372a1f4](https://github.com/silverstripe/silverstripe-framework/commit/3a372a1f41a9a1612beb83bd628282aba550391b) IntlLocales::validate when lang and region are the same e.g. de_DE (Robbie Averill)
* 2017-04-27 [c95c6c466](https://github.com/silverstripe/silverstripe-framework/commit/c95c6c466f70e48f9c53e37ce4c7ef6ff9f4b502) Regression from 3.x: allow $required_extensions to have arguments (Robbie Averill)
* 2017-04-27 [2ae8fde2d](https://github.com/silverstripe/silverstripe-framework/commit/2ae8fde2d352882fd90c7ea1a5ac7aac3405aab8) tests (Damian Mooyman)
* 2017-04-27 [cbe534c67](https://github.com/silverstripe/silverstripe-framework/commit/cbe534c67523bb5e0bdb019e353a1efa6c35b345) ed component capitalisation (Ingo Schommer)
* 2017-04-26 [1f74221c2](https://github.com/silverstripe/silverstripe-framework/commit/1f74221c2d603bf4010d954e6746865b759979ce) unit tests (Christopher Joe)
* 2017-04-26 [1ec2abe75](https://github.com/silverstripe/silverstripe-framework/commit/1ec2abe75f9f3541fa8866361e20a3d939249358) ed timezone and normalised ISO handling (Ingo Schommer)
* 2017-04-24 [4c772c80c](https://github.com/silverstripe/silverstripe-framework/commit/4c772c80c3bff06e46bcafdece10e63a03b2e61c) Show detailed errors on CLI for live environments (Sam Minnee)
* 2017-04-21 [cf2b0417](https://github.com/silverstripe/silverstripe-cms/commit/cf2b0417cb3d6fb5ad7c3fd6913b85f4eb488947) coding conventions (Ingo Schommer)
* 2017-04-21 [4b19987a](https://github.com/silverstripe/silverstripe-cms/commit/4b19987ad211fb1dc2eeff807dd76c52a4c97784) tweak visibility around the slideDown/slideUp animation (Christopher Joe)
* 2017-04-21 [3b69a471](https://github.com/silverstripe/silverstripe-cms/commit/3b69a4715843d9836285d624187a9c8588ea9c5e) Hidden listbox #1785 (Ishan Jayamanne)
* 2017-04-20 [19974fe1](https://github.com/silverstripe/silverstripe-reports/commit/19974fe1f2a94272dd6a16f3397d0e4222bcecf9) PHPDoc for Report::add_excluded_reports method. (Garion Herman)
* 2017-04-20 [0d5e84d0b](https://github.com/silverstripe/silverstripe-framework/commit/0d5e84d0b8a58bf35496fa8dde4216b64569a358) Add PHP extension requirements to composer. (Sam Minnee)
* 2017-04-20 [dba1f61f1](https://github.com/silverstripe/silverstripe-framework/commit/dba1f61f133f22cba1ecd1fe07f4838a61a1486d) tests related to date time (Saophalkun Ponlu)
* 2017-04-20 [403f4db14](https://github.com/silverstripe/silverstripe-framework/commit/403f4db14d2892d0af7c791e4bd6c64c60952a3e) change titles to return schema values in schema (Christopher Joe)
* 2017-04-19 [9d7eef7cf](https://github.com/silverstripe/silverstripe-framework/commit/9d7eef7cf3de62c5b1c50ee74b54c3ac521c3a2b) datetime field validation for the refactor (Saophalkun Ponlu)
* 2017-04-13 [8318e20c2](https://github.com/silverstripe/silverstripe-framework/commit/8318e20c25cf17ed5c48d1e3b409dd3715431eb8) close button placement (Christopher Joe)
* 2017-04-12 [8999f70ac](https://github.com/silverstripe/silverstripe-framework/commit/8999f70acc0fa9853c94786da8c3b5c713f8a359) ing broken search in SecurityAdmin Groups field (Sean Harvey)
* 2017-04-11 [03a2a907](https://github.com/silverstripe/silverstripe-cms/commit/03a2a907cea7d857a210c1b974df8d4fe61c2153) whitespace in templates causing double arrows (Damian Mooyman)
* 2017-04-11 [9cad8ba0](https://github.com/silverstripe/silverstripe-cms/commit/9cad8ba01b4e8ebfca229ad53a4e2853f2eb5598) ed linting (Ingo Schommer)
* 2017-04-11 [1ca51eb57](https://github.com/silverstripe/silverstripe-framework/commit/1ca51eb57a933964e9640c02697a78c068a8c462) Ensure that mysite test boostrap configuration is loaded after core and before the database connection (Robbie Averill)
* 2017-04-05 [f9f61cb](https://github.com/silverstripe/silverstripe-installer/commit/f9f61cbce286b8685ccd6f81a7d2a3c4a4478b2d) Fix cow release config (Damian Mooyman)
* 2017-04-05 [8cbdfa456](https://github.com/silverstripe/silverstripe-framework/commit/8cbdfa4561036a63e8b93fa7ddbd485188b40c3c) invalid json file (Damian Mooyman)
* 2017-04-05 [e12a2709](https://github.com/silverstripe/silverstripe-cms/commit/e12a2709d0dc92f684f5056d20f9bc0981736cb4) syntax error in selector (Christopher Joe)
* 2017-04-03 [e3fbd1dca](https://github.com/silverstripe/silverstripe-framework/commit/e3fbd1dcac3ab911542f82772bd39ee2d76851ff) ed coding conventions (Ingo Schommer)
* 2017-04-03 [e9693467b](https://github.com/silverstripe/silverstripe-framework/commit/e9693467bf341b66bfd45fe3fb633ef108eecced) ed tests (Ingo Schommer)
* 2017-04-03 [a70de91b3](https://github.com/silverstripe/silverstripe-framework/commit/a70de91b330cc87305327b038dcd1760faffcb76) DatetimeFieldTest (Ingo Schommer)
* 2017-04-03 [bb880a325](https://github.com/silverstripe/silverstripe-framework/commit/bb880a32576451e6b0b35b47961cc521f22ea338) Clarify PHP 5.6 support for 4.x (Sam Minnee)
* 2017-03-30 [3b89d704](https://github.com/silverstripe/silverstripe-siteconfig/commit/3b89d704f201849f92e49baa0ed95d0408ea7660) Fix test run, remove 5.5, add 7.1 (Sam Minnee)
* 2017-03-30 [227ba8dcc](https://github.com/silverstripe/silverstripe-framework/commit/227ba8dcc44e71a30f607d3e9e63bfe467ab4e50) illegal_extensions in unit tests not being removed (Mike Cochrane)
* 2017-03-29 [9cdcb339e](https://github.com/silverstripe/silverstripe-framework/commit/9cdcb339e952b6567acd2d34c143ce9c67594f7f) Fix test breakage in most recent change. (Sam Minnee)
* 2017-03-29 [b1b0c6af](https://github.com/silverstripe/silverstripe-cms/commit/b1b0c6af6316aa02ef1111fb9cf29da319f70c8c) Ensure all CMS forms include full ID / VersionID in path (Damian Mooyman)
* 2017-03-28 [538a5838](https://github.com/silverstripe/silverstripe-siteconfig/commit/538a58381f259831143d5425a81baa9d105972ab) Rename license file to match module standard. (Sam Minnee)
* 2017-03-28 [59a9ff84](https://github.com/silverstripe/silverstripe-reports/commit/59a9ff845915e4b6335b79ef2a1f8645df96ed17) Rename license file to match module standard. (Sam Minnee)
* 2017-03-28 [ae5b5a95](https://github.com/silverstripe/silverstripe-cms/commit/ae5b5a95ce26065bc9b310fb958656d22f71ccd8) Rename license file to match module standard. (Sam Minnee)
* 2017-03-28 [0828b03dc](https://github.com/silverstripe/silverstripe-framework/commit/0828b03dc627985d6892578f57d02dc4be5e087d) Add separate license file to match module standard. (Sam Minnee)
* 2017-03-28 [6396310](https://github.com/silverstripe/silverstripe-installer/commit/639631013fa03f208cd80ffcaa5d3c74d27d5e48) Split licence into separate file to match standard. (Sam Minnee)
* 2017-03-28 [ede549a6e](https://github.com/silverstripe/silverstripe-framework/commit/ede549a6edf8a1d10ae54eb75020b521b400d0cc) illegalExtensions are optional, requiredExtensions are mandatory with useful error messages. (Damian Mooyman)
* 2017-03-28 [bd14f6db9](https://github.com/silverstripe/silverstripe-framework/commit/bd14f6db9e574a6f57440e45ad7f327291b1a743) Update config API reference in FulltextSearchable and use namespaced imports for class names (Robbie Averill)
* 2017-03-28 [4a8bd1a07](https://github.com/silverstripe/silverstripe-framework/commit/4a8bd1a07d1cd260b25efb9f6394b10d4bfcddcf) Remove campaign related classes from upgrade map - moved to campaign-admin (Robbie Averill)
* 2017-03-28 [59a5eb430](https://github.com/silverstripe/silverstripe-framework/commit/59a5eb430844132da3116ced5d89007e6980b2e4) Don't mistake \ for _ in dev/build (Sam Minnee)
* 2017-03-24 [6b4a72dee](https://github.com/silverstripe/silverstripe-framework/commit/6b4a72dee83deed73c39d9b9edc52fd1babd42fe) ing deprecated PHPUnit APIs (Daniel Hensby)
* 2017-03-20 [e4c68bc2b](https://github.com/silverstripe/silverstripe-framework/commit/e4c68bc2bfd3ef24a9f4320ec61a9e5888a95da2) and test pluralisation usages (Damian Mooyman)
* 2017-03-16 [53b98284f](https://github.com/silverstripe/silverstripe-framework/commit/53b98284fe5f9ee9b3b4e013eef66d21c170cce5) Remove undefined var from installer (Daniel Hensby)
* 2017-03-16 [66b1c72d4](https://github.com/silverstripe/silverstripe-framework/commit/66b1c72d4adf64ce0a18c6f31651c107033abb93) dev CI builds (Damian Mooyman)
* 2017-03-16 [61e5b38](https://github.com/silverstripe/silverstripe-installer/commit/61e5b3836e3cc29057201491a9c4c0d3e10759cf) dev dependencies for root project (Damian Mooyman)
* 2017-03-14 [3ec5a5b03](https://github.com/silverstripe/silverstripe-framework/commit/3ec5a5b0359622719c2993db83623b62d0f0e133) ed upgrading path references (Ingo Schommer)
* 2017-03-13 [bd409bfd](https://github.com/silverstripe/silverstripe-cms/commit/bd409bfd3092189c5133b059f04074891d8726c1) Fix PHPUNIT_COVERAGE_TEST by moving to php 5 build (Damian Mooyman)
* 2017-03-10 [d3177ef94](https://github.com/silverstripe/silverstripe-framework/commit/d3177ef94c8f01fb07bd71e706631fa9515545bf) work-around for form property on formfields not working (Damian Mooyman)
* 2017-03-09 [cb955f08](https://github.com/silverstripe/silverstripe-cms/commit/cb955f08f7230939c38c1980de8810fe10e205a6) non_virtual_fields being ignored (Mike Cochrane)
* 2017-03-08 [09d7493a4](https://github.com/silverstripe/silverstripe-framework/commit/09d7493a4fec79df75acad2b3ad2f121e15405c6) webpack location for font files (Damian Mooyman)
* 2017-03-07 [9c9443602](https://github.com/silverstripe/silverstripe-framework/commit/9c9443602df8847c3926eb6e0bcc66373e54b9f3) Installer no longer causes recursion in yml config (Daniel Hensby)
* 2017-03-03 [263e747d0](https://github.com/silverstripe/silverstripe-framework/commit/263e747d071a6f11814a9be9ede890cc83c792e0) for APCu cache otherwise you get 'Cache key must be string, "boolean" given' (Lee Bradley)
* 2017-03-02 [abe967f23](https://github.com/silverstripe/silverstripe-framework/commit/abe967f23560094068eccea4ecab84605627cd98) /pass arguments directly (not in array) (Andrew Aitken-Fincham)
* 2017-03-02 [b6d9b34ce](https://github.com/silverstripe/silverstripe-framework/commit/b6d9b34ce4c00798295a9fe219f388da8a0198c2) Mark $instance as internal to prevent being saved to config (Damian Mooyman)
* 2017-02-28 [6ed98a3a9](https://github.com/silverstripe/silverstripe-framework/commit/6ed98a3a949ac99f17931e154557d9f7ee462fa9) Prevent obsolete class cache breaking autoload (Damian Mooyman)
* 2017-02-28 [dfe25c27](https://github.com/silverstripe/silverstripe-cms/commit/dfe25c27f0f2758e3533f5d382f1ea69573fd71f) Fix allowedChildren() and link tracking (Damian Mooyman)
* 2017-02-28 [ac685e4](https://github.com/silverstripe/silverstripe-installer/commit/ac685e4d38d0e970fa8729e2438dcfd76f9e7996) remove the wildcard After condition in config.yml (Christopher Joe)
* 2017-02-28 [2fafff08](https://github.com/silverstripe/silverstripe-cms/commit/2fafff084f425a7d47197f2fed72064cc424ee2e) history comparison fields will now show diff properly, rather than escaped html diff (Christopher Joe)
* 2017-02-27 [0c47bc3e](https://github.com/silverstripe/silverstripe-cms/commit/0c47bc3e62cee59ea7b6c86baa8b0d1ae3e33ddf) viewer and editor groups to only show when the last option is selected (Christopher Joe)
* 2017-02-27 [badf7d3a7](https://github.com/silverstripe/silverstripe-framework/commit/badf7d3a73af24696b4e3bf77fca33c2fdce297b) Add quotes to constants in YAML to ensure syntax validity (Robbie Averill)
* 2017-02-27 [45a7fbd38](https://github.com/silverstripe/silverstripe-framework/commit/45a7fbd387b033609b1cab36af0f5b5c925fcd27) Confirm delete actions in React GridFields (e.g. Campaign admin) (Robbie Averill)
* 2017-02-27 [e64e8d151](https://github.com/silverstripe/silverstripe-framework/commit/e64e8d151f2f50b4b665959e9ec588e7ed96208f) Remove duplicated tab "active" state in Security admin (Robbie Averill)
* 2017-02-27 [cbc5aca26](https://github.com/silverstripe/silverstripe-framework/commit/cbc5aca26a8740b850e54d5d8aa6a97ce9454c09) add fieldgroup specific flexbox styles to the inner fields (Christopher Joe)
* 2017-02-27 [ff47bc03d](https://github.com/silverstripe/silverstripe-framework/commit/ff47bc03d74a6b3a483467ac47163add13f55c02) Remove reference to $_SERVER within FakeController (Damian Mooyman)
* 2017-02-27 [695194546](https://github.com/silverstripe/silverstripe-framework/commit/695194546db8a55d78d9ea3bb37a5d102e9670fe) Ensure test fixture uses test module manifest (Damian Mooyman)
* 2017-02-26 [b7123abf2](https://github.com/silverstripe/silverstripe-framework/commit/b7123abf22121767ee2015dbc6d0d0c2e4bc4f56) prevent unsaved changes alert when clicking a save button (Christopher Joe)
* 2017-02-26 [423b1d4ee](https://github.com/silverstripe/silverstripe-framework/commit/423b1d4eee0334747176b9c1c7778f35248fbbf8) Fix modeladmin scrollable height cropping pagination (Damian Mooyman)
* 2017-02-26 [c9e2c249](https://github.com/silverstripe/silverstripe-reports/commit/c9e2c249c2f4fd31ac2f47a7dfa9df6370ba17c3) Allow pre-release versions of SS4. (Sam Minnee)
* 2017-02-26 [240c3638](https://github.com/silverstripe/silverstripe-siteconfig/commit/240c3638b334d95f9e7ca4fc208ecdda6ebc9d46) Allow pre-release versions of SS4. (Sam Minnee)
* 2017-02-26 [6befcee3](https://github.com/silverstripe/silverstripe-cms/commit/6befcee3c5be1a327700910968ab3ac104bc73b0) issue with CI installing non-dev dependencies (Damian Mooyman)
* 2017-02-26 [3983b4d1b](https://github.com/silverstripe/silverstripe-framework/commit/3983b4d1b13d39f2ed43465f98568cd070df0e49) cache used in ModuleManifest (Damian Mooyman)
* 2017-02-23 [8b5fcd333](https://github.com/silverstripe/silverstripe-framework/commit/8b5fcd3336f30e981a82c8b93f8de07429205fca) download file link works with the new TreeDropdown (Christopher Joe)
* 2017-02-21 [036119426](https://github.com/silverstripe/silverstripe-framework/commit/0361194267a5f2228f03224136e30f6daf481eff) es for issues introduced in 5e19d905 (Lee Bradley)
* 2017-02-17 [f6f19908d](https://github.com/silverstripe/silverstripe-framework/commit/f6f19908dea76cae453769f9d3636d81a0cd1805) for bug introduced in #5e19d905 (Lee Bradley)
* 2017-02-15 [a9f2e9e73](https://github.com/silverstripe/silverstripe-framework/commit/a9f2e9e73d168935f99695d82486cd9ad3e27842) ed DateFieldSeparated docs (Ingo Schommer)
* 2017-02-07 [b8a0944bd](https://github.com/silverstripe/silverstripe-framework/commit/b8a0944bda00e572e0e62369cabf9f9ab9be15ea) /load fields if lazy ones exists (Andrew Aitken-Fincham)
* 2017-02-04 [e307f067e](https://github.com/silverstripe/silverstripe-framework/commit/e307f067edfa741e1387eabc40da308a8b08614a) Replace deprecated %s placeholders in translations with named placeholders (Robbie Averill)
* 2017-02-02 [f63b741e4](https://github.com/silverstripe/silverstripe-framework/commit/f63b741e465fe39a80f0215405fe9ee5f4108b63) Improve DebugViews display of non-header information. (Sam Minnee)
* 2017-01-30 [d8fe6d02](https://github.com/silverstripe/silverstripe-cms/commit/d8fe6d020ff8513dd4465cbd33f5478d8ed448e2) Remap redirector and virtual page class names during build (Robbie Averill)
* 2017-01-29 [232b218df](https://github.com/silverstripe/silverstripe-framework/commit/232b218dfbfa183c74e83491c360e6a8bd9677e6) Ensure that Zend_ classes can still be autoloaded (Robbie Averill)
* 2017-01-25 [7b26b4a1f](https://github.com/silverstripe/silverstripe-framework/commit/7b26b4a1f3e2c20df902893a87511fcbd1fd87be) Ensure that tests run with flush=1 clean Flushables (Damian Mooyman)
* 2017-01-25 [732b1f0a](https://github.com/silverstripe/silverstripe-cms/commit/732b1f0a5794506ca3f7993678aeb0082f2bb93f) Fix reference to Install_deleteinstallfiles (Damian Mooyman)
* 2017-01-24 [5d6c90361](https://github.com/silverstripe/silverstripe-framework/commit/5d6c90361c680f3d0e05bc1c06a31f0538465c18) Ensure root path of any local adapter is safely created and mapped from symlink (Damian Mooyman)
* 2017-01-24 [00de0989](https://github.com/silverstripe/silverstripe-cms/commit/00de0989f4fb8c2fbfa483baad067fbc59e89e64) Javascript .addAttr() doesn't exist (Mike Cochrane)
* 2017-01-23 [3c8a56f9](https://github.com/silverstripe/silverstripe-reports/commit/3c8a56f904d180e7a0b6ca7e9cd53d836c28dec0) Fix missing default on _t(GridField.Filter) (Damian Mooyman)
* 2017-01-19 [5e19d905f](https://github.com/silverstripe/silverstripe-framework/commit/5e19d905f8e946a10a634ce1ed6d26c6f1e5f4ff) loading indicator position (fixes #6153) (Zac Pullar-Strecker)
* 2017-01-18 [b0512abf](https://github.com/silverstripe/silverstripe-cms/commit/b0512abfb63508d126bd3a5f3d566c58369f5bae) es load indicator position (fixes #1625) (Reid Hokai)
* 2017-01-17 [d192a4f86](https://github.com/silverstripe/silverstripe-framework/commit/d192a4f86fd4bc8e23e8492cff99d229776f7e3b) Fix root folder getFilename() returning incorrect path (#6510) (Damian Mooyman)
* 2017-01-16 [7ad02787e](https://github.com/silverstripe/silverstripe-framework/commit/7ad02787e8cc65d54c8bd117ed099974ae658ca1) Regression in CompositeField displaying fields in their holders (Robbie Averill)
* 2017-01-16 [09f967bf6](https://github.com/silverstripe/silverstripe-framework/commit/09f967bf67e04910435aebea2b697b5d20d9c306) Prevent type-loss of graphql variables by using JSON.stringify (Damian Mooyman)
* 2017-01-16 [96bd4edce](https://github.com/silverstripe/silverstripe-framework/commit/96bd4edce5157dbcedc47415d22b58e1d6e0424d) things not aligning well in the toolbar (Christopher Joe)
* 2017-01-13 [ccf349938](https://github.com/silverstripe/silverstripe-framework/commit/ccf3499380eccefe91791abc45f36d9b2a5740f0) fix: calling full method name to pass attributes (Neil Gladwin)
* 2017-01-13 [c707a9120](https://github.com/silverstripe/silverstripe-framework/commit/c707a9120637caeb79e501fa9676f5d4ed07b8d5) shift graphql to use post data due to php-5.6.10+ deprecation message (Christopher Joe)
* 2017-01-12 [30d125f14](https://github.com/silverstripe/silverstripe-framework/commit/30d125f144910817aaffdca1b8a561d322ae9c28) MySQLQuery::seek() failed to return a row (Loz Calver)
* 2017-01-12 [a4bc9f49d](https://github.com/silverstripe/silverstripe-framework/commit/a4bc9f49d10daf302be336da826cabb798a3bac1) Regression in using template_main to render the Security area (Robbie Averill)
* 2017-01-11 [54c2afd01](https://github.com/silverstripe/silverstripe-framework/commit/54c2afd0191b8598a76fd0500e0b9a5e0d1d846e) regression issues in campaigns (Christopher Joe)
* 2017-01-11 [2d1d2aea7](https://github.com/silverstripe/silverstripe-framework/commit/2d1d2aea796ff73457a6cf3331f3f255e899a0aa) Remap versioned ClassNames during build process (Robbie Averill)
* 2017-01-11 [773c848c](https://github.com/silverstripe/silverstripe-cms/commit/773c848c0f81e88f7156d609483386cf8fb1b39b) Separate PageController fixture into its own file (PSR-2 compat) (Robbie Averill)
* 2017-01-11 [6fc50cae5](https://github.com/silverstripe/silverstripe-framework/commit/6fc50cae5c2794e576392eec8c0a3b34a80d9af3) Refactor TestMailer to better be base class (Sam Minnee)
* 2017-01-11 [4e257435d](https://github.com/silverstripe/silverstripe-framework/commit/4e257435df513d587a524b352faf52bb3092925f) Shift react breadcrumbs to use flexbox for placement (Christopher Joe)
* 2017-01-10 [62eb0e614](https://github.com/silverstripe/silverstripe-framework/commit/62eb0e61422de7e59c335eed4c789587e225f13c) Rename template parser from .inc to .peg so PHP doesn't include it automatically (Robbie Averill)
* 2017-01-10 [ae2861d48](https://github.com/silverstripe/silverstripe-framework/commit/ae2861d487a905ca687f8cca61df66141fcbf4b3) Fix frameworkpath (Damian Mooyman)
* 2017-01-10 [4ea614f04](https://github.com/silverstripe/silverstripe-framework/commit/4ea614f04cc80b0b01039303e674ba8b9dac16f9) linting issues (Damian Mooyman)
* 2017-01-10 [63cb343cf](https://github.com/silverstripe/silverstripe-framework/commit/63cb343cf5e47829685622b32b1ed58e4c0809cb) Fix modal animations (Damian Mooyman)
* 2017-01-10 [8badad90d](https://github.com/silverstripe/silverstripe-framework/commit/8badad90df2177453f5e872ee476308611c49515) Make sure image backends implement method getImageResource (Daniel Hensby)
* 2017-01-10 [b62f9b60a](https://github.com/silverstripe/silverstripe-framework/commit/b62f9b60a02ae8823226101f6659eedb4926366d) Fix broken member / group import (Damian Mooyman)
* 2017-01-10 [9959ef63](https://github.com/silverstripe/silverstripe-cms/commit/9959ef63f276ca9cc4ed93c76a355baa21f2ae93) double-escaped ampersands in CMSMain_TreeView and CMSMain::LinkPageAdd (Colin Tucker)
* 2017-01-09 [87fbd5f78](https://github.com/silverstripe/silverstripe-framework/commit/87fbd5f7816ce0924edf544bd3d165d21888c88f) for v4: Admin returns "Too many pages" for subpages below top level (#6464) (Lee Bradley)
* 2017-01-09 [cdd86aaf5](https://github.com/silverstripe/silverstripe-framework/commit/cdd86aaf53caeb4717f351b3f1caecb8c261cc45) breadcrumbs search results text sometimes disappearing (Christopher Joe)
* 2017-01-05 [cf3a74ec](https://github.com/silverstripe/silverstripe-cms/commit/cf3a74ec571717252596449c3c31e7d9a31d0521) Remove deprecation tests, bump deprecation version to 5.0 (Robbie Averill)
* 2016-12-29 [6fb49224b](https://github.com/silverstripe/silverstripe-framework/commit/6fb49224b979f33a5b74c79d83fd918e4dfa6e33) SSViewer should resolve templates with or without underscores (Robbie Averill)
* 2016-12-29 [d41ebbaaf](https://github.com/silverstripe/silverstripe-framework/commit/d41ebbaaff405c6b970e1b43bd00102c7462f9f9) Correct namespaes for test classes in upgrade.yml (Robbie Averill)
* 2016-12-29 [6f4162ed7](https://github.com/silverstripe/silverstripe-framework/commit/6f4162ed74f6e7e07242a1b378d9f1142a93097b) PHP 7.x should use random_bytes for entropy ahead of deprecated mcrypt lib (Robbie Averill)
* 2016-12-29 [7448622a1](https://github.com/silverstripe/silverstripe-framework/commit/7448622a1a19889a34864b2d6fcf91c46f957302) Replace ini casting to int with explicit split and cast for PHP 7.1. Add tests. (Robbie Averill)
* 2016-12-28 [fc45e9e0](https://github.com/silverstripe/silverstripe-cms/commit/fc45e9e0abcf72b5e1204663533825c1ef38e80e) ing tests (Daniel Hensby)
* 2016-12-23 [947c1fe1](https://github.com/silverstripe/silverstripe-cms/commit/947c1fe156d0c8646bd7bc9735020986cfd59767) broken unit test (Christopher Joe)
* 2016-12-23 [8118448a9](https://github.com/silverstripe/silverstripe-framework/commit/8118448a9c12578f3f940da4daae56f53f678112) PHP linting issues (Christopher Joe)
* 2016-12-20 [2d5aa7ce0](https://github.com/silverstripe/silverstripe-framework/commit/2d5aa7ce0e4b4344172901d6990ca75156f83ed2) Campaign List toggle (Fixes #6067) (Will Rossiter)
* 2016-12-20 [7c76d2cb0](https://github.com/silverstripe/silverstripe-framework/commit/7c76d2cb09bf4135f89cd284076ae1742b7d79d3) show formatting help not appearing (#6423) (Will Rossiter)
* 2016-12-19 [8ad030bab](https://github.com/silverstripe/silverstripe-framework/commit/8ad030baba0ce7c13bf09dfba31907bd7599cd98) Make GridField filter button selector more specific (Robbie Averill)
* 2016-12-19 [fae005554](https://github.com/silverstripe/silverstripe-framework/commit/fae0055544d524c8d3ca32f7f892c15205bd235a) Fix missing TRAVIS_NODE_VERSION (#6419) (Damian Mooyman)
* 2016-12-16 [eb0a27406](https://github.com/silverstripe/silverstripe-framework/commit/eb0a27406998cb8b5af988cf5f0ccd1fb84d8ba5) Update links to docs.ss for default template (Robbie Averill)
* 2016-12-09 [fcf1eedee](https://github.com/silverstripe/silverstripe-framework/commit/fcf1eedee475ae9dfca80cfeb7937692f3828806) getting fileSize shouldn't give a "NaN" (Christopher Joe)
* 2016-12-04 [fdb1bed0](https://github.com/silverstripe/silverstripe-siteconfig/commit/fdb1bed018e1eac792cb26aefb8f55a06200edff) Fix crash when installed with framework-only (Damian Mooyman)
* 2016-11-13 [00c9c2c77](https://github.com/silverstripe/silverstripe-framework/commit/00c9c2c775aa1041f2ba3756c2a8220e14cc942c) Fix DataObject::dbObject assigning incorrect table to DBField instance (Damian Mooyman)
* 2016-11-13 [22cb3d0d7](https://github.com/silverstripe/silverstripe-framework/commit/22cb3d0d74feae7f3470e469a8e0a54d79b2776e) various ORM test issues (Damian Mooyman)
* 2016-11-10 [804ff7c2](https://github.com/silverstripe/silverstripe-reports/commit/804ff7c247b69bf590a4f2e6c38acc5aa1e84e8f) Fixing test errors (Daniel Hensby)
* 2016-11-08 [9dbb5c0a1](https://github.com/silverstripe/silverstripe-framework/commit/9dbb5c0a1a2199fe1bcc0650db1eeecbe9bf97d8) safari tabs active border (Paul Clarke)
* 2016-11-07 [aca9deed2](https://github.com/silverstripe/silverstripe-framework/commit/aca9deed23295472445b5c9b5a94ac866408aebb) for safari scroll in campaign area (Paul Clarke)
* 2016-11-07 [962519c6](https://github.com/silverstripe/silverstripe-cms/commit/962519c6a715e71c9d08a7f9d5280232bba4adce) for safari height in main container shows action bar (Paul Clarke)
* 2016-11-04 [f18ef75c3](https://github.com/silverstripe/silverstripe-framework/commit/f18ef75c3dbc843ad13e2769663eedb7d0f2593f) Fixed crash when BASE_PATH is set by assuming the location of Constants.php (UndefinedOffset)
* 2016-11-04 [8bd5349e](https://github.com/silverstripe/silverstripe-cms/commit/8bd5349e4204540431471eda07be10b35105c3e2) 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](https://github.com/silverstripe/silverstripe-cms/commit/c5fb7127ac7a0d1705ea850661f2b51476317a35) Page History 'Comparing versions' banner missing (Mike Cochrane)
* 2016-11-03 [cc451d9ca](https://github.com/silverstripe/silverstripe-framework/commit/cc451d9ca43fc47e077ba45fdcb6c9f7cc223662) Fix crash when re-ordering pages (#6281) (Damian Mooyman)
* 2016-11-03 [eefecc21f](https://github.com/silverstripe/silverstripe-framework/commit/eefecc21fc79a383c9b354cc5cb46e114810d4ff) Fix incorrect include paths in tests and railsyml (#6279) (Damian Mooyman)
* 2016-11-02 [4ee78fc29](https://github.com/silverstripe/silverstripe-framework/commit/4ee78fc29d93793bbe3d16f7aeea602d7394809c) Restore travis artifacts (#6277) (Damian Mooyman)
* 2016-11-02 [3449d5df0](https://github.com/silverstripe/silverstripe-framework/commit/3449d5df0f4dcfce785e6ee070252eed652445e1) Fix broken promise handling (Damian Mooyman)
* 2016-11-02 [0901de299](https://github.com/silverstripe/silverstripe-framework/commit/0901de2995686a315a279969d85e1743763b708e) Fix php schema generation (Christopher Joe)
* 2016-11-02 [019e99dd4](https://github.com/silverstripe/silverstripe-framework/commit/019e99dd4dbcf957b457db8385b47d8a2a7562c5) Fix regressions from src folder creation (#6272) (Damian Mooyman)
* 2016-11-01 [51a9fdf](https://github.com/silverstripe/silverstripe-installer/commit/51a9fdf5d1e3e41974e31b9a40716912f8161edc) Fix test listener path (Damian Mooyman)
* 2016-11-01 [6da36a9ed](https://github.com/silverstripe/silverstripe-framework/commit/6da36a9ed102080a3b6957b86f7554492b5a6129) some issues with tests (Damian Mooyman)
* 2016-11-01 [c0c219e17](https://github.com/silverstripe/silverstripe-framework/commit/c0c219e178c13b2a6978656995014ead759403ca) invalid files_path (Damian Mooyman)
* 2016-11-01 [38fdafb47](https://github.com/silverstripe/silverstripe-framework/commit/38fdafb474e8204077849e83267ee3308b701afe) tinymce breaking in non-typical install location (Damian Mooyman)
* 2016-10-31 [81087ce15](https://github.com/silverstripe/silverstripe-framework/commit/81087ce15c6c6c94d482903820b63cdc1e7c397c) restore CMS build as required in framework tests (Damian Mooyman)
* 2016-10-30 [4cc6cc315](https://github.com/silverstripe/silverstripe-framework/commit/4cc6cc3151973ec77082df8864dc7178b17a7d47) position of back button on empty preview within campaigns (Paul Clarke)
* 2016-10-30 [17ef686f](https://github.com/silverstripe/silverstripe-cms/commit/17ef686f61bc6bc48941b4ba108c897180131fc8) for History versions extending outside collapsed panel (Paul Clarke)
* 2016-10-28 [bb2cb3d48](https://github.com/silverstripe/silverstripe-framework/commit/bb2cb3d487643a671efde3ed2b5d1f7e7cdc5dcc) webpack css config, removes duplicate css files that were generated (Christopher Joe)
* 2016-10-28 [7d18cda7](https://github.com/silverstripe/silverstripe-cms/commit/7d18cda7eed7d94f46f3a24e3066d589d6423b85) Test fixes needed for the new simplified test run structure. (Sam Minnee)
* 2016-10-28 [eef14c1a](https://github.com/silverstripe/silverstripe-cms/commit/eef14c1afc52af0db740e11342985fb9adaf4b96) Fix behat tests. (Sam Minnee)
* 2016-10-28 [a5d3dccd3](https://github.com/silverstripe/silverstripe-framework/commit/a5d3dccd37d7bb69ae6535112e04c5ecc35b59a2) for preview being under toolbar (Paul Clarke)
* 2016-10-28 [d7ed308e1](https://github.com/silverstripe/silverstripe-framework/commit/d7ed308e17192b9df0ed250ade63a19dcc97d7b7) Fix minor html encoding issue in SecurityAdmin (#6240) (Damian Mooyman)
* 2016-10-28 [1df533298](https://github.com/silverstripe/silverstripe-framework/commit/1df533298d17a48689f6280727a6d251046caa35) abstract HTMLEditorConfig instantiates (#6244) (Michael Strong)
* 2016-10-27 [d0619c1f](https://github.com/silverstripe/silverstripe-cms/commit/d0619c1f0f97253770b53d3e749855ab912c4f75) for double scroll in history area (Paul Clarke)
* 2016-10-27 [e386c6a15](https://github.com/silverstripe/silverstripe-framework/commit/e386c6a1534f1184bbf9480e67294eb910a1fa5c) Refactor bootstrap.php to allow for code sharing with cms bootstrap (Damian Mooyman)
* 2016-10-27 [c4d748cb](https://github.com/silverstripe/silverstripe-cms/commit/c4d748cb7d7cfdc89abeab59514c968b32f3e3c3) Fix firefox compatibility (Damian Mooyman)
* 2016-10-26 [02bac8c4b](https://github.com/silverstripe/silverstripe-framework/commit/02bac8c4bc591329e4a3b2451e8bc3f985423454) Fix missing loading overlay (Damian Mooyman)
* 2016-10-26 [42096bb41](https://github.com/silverstripe/silverstripe-framework/commit/42096bb41b6a634a03772c2f280ffbf84d11e1f4) Prevent pagination wrapping (Damian Mooyman)
* 2016-10-26 [f7fd4ffae](https://github.com/silverstripe/silverstripe-framework/commit/f7fd4ffae14eb1e8417e61f0920d78d08ecb5683) Fix incorrect change detection on checkbox fields (Damian Mooyman)
* 2016-10-26 [4bf4fca4](https://github.com/silverstripe/silverstripe-cms/commit/4bf4fca416b1aedbc41c7fac6f37e673473b2021) Prevent archived pages from having add to campaign action (Damian Mooyman)
* 2016-10-26 [040ae2e6a](https://github.com/silverstripe/silverstripe-framework/commit/040ae2e6a30f30c5277a9d572ee50ce7e5b53cbb) Fix clicking "No items found" from causing ajax error (Damian Mooyman)
* 2016-10-26 [513c7aebc](https://github.com/silverstripe/silverstripe-framework/commit/513c7aebc79b3406c21e6741bcb4408077a9f8ac) HtmlEditorField.js indentation (Damian Mooyman)
* 2016-10-26 [015411307](https://github.com/silverstripe/silverstripe-framework/commit/015411307d7e9a6479914cfb8832da558188c4af) Require php7 support. (Sam Minnee)
* 2016-10-26 [424008cf](https://github.com/silverstripe/silverstripe-cms/commit/424008cff47ab35b00f7b9850a5f381540b29836) Fix installer for 4.0 (#1644) (Damian Mooyman)
* 2016-10-26 [c80417a94](https://github.com/silverstripe/silverstripe-framework/commit/c80417a949c7f2821ab4ce1f76ccbc5b6649fcaf) Fix ViewableData::__isset() for getXXX() getters. (Sam Minnee)
* 2016-10-26 [7b44fc7bc](https://github.com/silverstripe/silverstripe-framework/commit/7b44fc7bce54fc6dca9161dda7d3def25a1be23e) Fix SSViewerTest in PHP7 (Sam Minnee)
* 2016-10-26 [e5550dd6](https://github.com/silverstripe/silverstripe-cms/commit/e5550dd68022641b3e50edfd18f7b91ae751ec9e) Fix search not respecting view mode (Damian Mooyman)
* 2016-10-26 [a0d31e86d](https://github.com/silverstripe/silverstripe-framework/commit/a0d31e86d6427bfa7acf3863c3cbcf1d98ba78f2) helperPath in _register_database.php (David Alexander)
* 2016-10-25 [75b18509](https://github.com/silverstripe/silverstripe-cms/commit/75b185092e86b80bf6751f6f769368c1f89f6c90) Remove reference to Object class. (#1634) (Sam Minnée)
* 2016-10-24 [d946a3b2](https://github.com/silverstripe/silverstripe-cms/commit/d946a3b240f99b856cc4a14eeecbaa3c5fd2f01e) Allow CMS_DIR at the root. (Sam Minnee)
* 2016-10-24 [e83f3962a](https://github.com/silverstripe/silverstripe-framework/commit/e83f3962a1c6d3f16cb66f70187f8297059a316f) Prevent intermittent "Element is not currently visible and so may not be interacted with" (Damian Mooyman)
* 2016-10-17 [84c0df3db](https://github.com/silverstripe/silverstripe-framework/commit/84c0df3db0578ea726314733c3b91ae0080f98d8) double forward slash link in campaign admin (Christopher Joe)
* 2016-10-13 [0ebde90dd](https://github.com/silverstripe/silverstripe-framework/commit/0ebde90dd040c77eea2adddc231f79a58bf631f5) flexbox 'fill-height' overflowing container (Loz Calver)
* 2016-10-12 [5df58057](https://github.com/silverstripe/silverstripe-cms/commit/5df580578a064d3955baf53681d7149563ff147c) double nested alert message (Christopher Joe)
* 2016-10-11 [72fd3b949](https://github.com/silverstripe/silverstripe-framework/commit/72fd3b949e447fccf3bc817b1ae655c1b134e671) linting issues (Damian Mooyman)
* 2016-10-11 [5a5d62fa2](https://github.com/silverstripe/silverstripe-framework/commit/5a5d62fa272823cb164a98fd85e2ef8905648e6e) profile layout (Christopher Joe)
* 2016-10-11 [20cee7358](https://github.com/silverstripe/silverstripe-framework/commit/20cee735832060e192cf7d0c328d0241a91fdb7f) pages background (Damian Mooyman)
* 2016-10-11 [7b36df286](https://github.com/silverstripe/silverstripe-framework/commit/7b36df286ec395f07fef45c490516c31e33fb9b0) split mode disappearing as an option (Christopher Joe)
* 2016-10-11 [26e0ff806](https://github.com/silverstripe/silverstripe-framework/commit/26e0ff806618fbf5ce387511284701c591d378bc) Fix installer for 4.0 (Damian Mooyman)
* 2016-10-10 [712849c7](https://github.com/silverstripe/silverstripe-cms/commit/712849c732d3e0998a35f492c73eaf8137630b20) page form layout (Christopher Joe)
* 2016-10-09 [7acb3b5fc](https://github.com/silverstripe/silverstripe-framework/commit/7acb3b5fc25b1e9e6a9e4c7d66ce4eb0bcd005d4) selected view mode not reflected on button (Christopher Joe)
* 2016-10-07 [89150c48e](https://github.com/silverstripe/silverstripe-framework/commit/89150c48e7d111278ac2286efb33bfb01e2d9cc3) preview in pages section (Christopher Joe)
* 2016-10-06 [21dc23868](https://github.com/silverstripe/silverstripe-framework/commit/21dc238685537b9ce05d7791587f90ce59f54ef4) ed classes that weren't matching icon (Christopher Joe)
* 2016-10-02 [ebbb0258d](https://github.com/silverstripe/silverstripe-framework/commit/ebbb0258ddf544d50132c87385823f9837d88b73) linting issue (Damian Mooyman)
* 2016-09-30 [963445e74](https://github.com/silverstripe/silverstripe-framework/commit/963445e74373e33d22a5864f36aa456c4d0e47b7) tab link on top panel changes even when "cancel to browse" was selected (Christopher Joe)
* 2016-09-30 [dd7d1d26a](https://github.com/silverstripe/silverstripe-framework/commit/dd7d1d26af073a39f91543995b0ab0b9c15d15d5) Prevent missing records crashing ChangeSetItem (Damian Mooyman)
* 2016-09-29 [30d161625](https://github.com/silverstripe/silverstripe-framework/commit/30d161625ffeb3c29310db4a62e1de55b6fef3b1) unmock qs module, Backend-test refactored to not time out on error (Christopher Joe)
* 2016-09-27 [fe0ca63c](https://github.com/silverstripe/silverstripe-reports/commit/fe0ca63c7a7bed3977ef89733f9da9ebff457409) Remove referencies to Object::$class (Sam Minnee)
* 2016-09-27 [11888a00](https://github.com/silverstripe/silverstripe-cms/commit/11888a006ad9a978dea0cf7083dcac1886263a24) Remove references to Object::$class (Sam Minnee)
* 2016-09-26 [ad79b5c88](https://github.com/silverstripe/silverstripe-framework/commit/ad79b5c88c6919b70d422b6dec6e91eab52db97c) ing bad folder caseing (Daniel Hensby)
* 2016-09-26 [ce91c3820](https://github.com/silverstripe/silverstripe-framework/commit/ce91c3820e090da11b9ca79157a437929cc78816) IX: Fix regression causing the admin to crash on windows due to FRAMEWORK_DIR being prefixed by a backslash (UndefinedOffset)
* 2016-09-26 [9cb33ea5b](https://github.com/silverstripe/silverstripe-framework/commit/9cb33ea5bfd7cdc7befe59eb21bc324961b6f93f) ed @covers namespaces (Ingo Schommer)
* 2016-09-23 [cbe0ac850](https://github.com/silverstripe/silverstripe-framework/commit/cbe0ac8507f94ea3e35680a97f44b58a296e168e) Fix invalid import form requirements (#6071) (Damian Mooyman)
* 2016-09-23 [ffe85db3](https://github.com/silverstripe/silverstripe-cms/commit/ffe85db33fbdacda117619c077b93118b6eabd35) Fix incorrect search form (Damian Mooyman)
* 2016-09-22 [c52adad1f](https://github.com/silverstripe/silverstripe-framework/commit/c52adad1fec6ad5fcb4a99623fbc73d033688517) Graceful degradation if obsolete classnames in ChangeSetItem (fixes #6065) (Sam Minnee)
* 2016-09-22 [aa7a9565c](https://github.com/silverstripe/silverstripe-framework/commit/aa7a9565ce237c75e538690fa8efa74d136b1d63) Fix incorrect ssviewertest path (#6060) (Damian Mooyman)
* 2016-09-22 [4301fa8](https://github.com/silverstripe/silverstripe-installer/commit/4301fa850d38cca76c0e0a73e85080b7a002bca7) Fix incorrect backslash escaping in htaccess template (#140) (Damian Mooyman)
* 2016-09-22 [65ff0a4d3](https://github.com/silverstripe/silverstripe-framework/commit/65ff0a4d38d2a276ff785d542785781288d8111b) Fix incorrect backslash escaping in htaccess template (Damian Mooyman)
* 2016-09-22 [4b2c6b05](https://github.com/silverstripe/silverstripe-cms/commit/4b2c6b05035de2b309ebd2fa4136aff7e2e7e85a) Break dist javascript and onto newlines. (Ingo Schommer)
* 2016-09-22 [9a9cd97bc](https://github.com/silverstripe/silverstripe-framework/commit/9a9cd97bc36a55b30798bfa7c9fecbe5ae6ccf89) Fix invalid file uploads not being validated (Damian Mooyman)
* 2016-09-21 [c24201b5f](https://github.com/silverstripe/silverstripe-framework/commit/c24201b5f391ef251921895dccdf069f32817477) Break dist javascript and onto newlines. (Sam Minnee)
* 2016-09-21 [51ef36963](https://github.com/silverstripe/silverstripe-framework/commit/51ef369630f9436e853c6d3896b4a183204f7ad4) stringify api call body to work for IE10 (#6032) (Chris Joe)
* 2016-09-20 [4d52d655f](https://github.com/silverstripe/silverstripe-framework/commit/4d52d655fdec88205b78b9ba233a6be7f2e20ed4) for spacing of sitetree panel, reportAdmin, and toggle on Member details page (#5955) (Paul)
* 2016-09-20 [2e054af7b](https://github.com/silverstripe/silverstripe-framework/commit/2e054af7b1cdd8c647d88cfb0c452b683257c068) Throw more helpful error if tests are run badly. (Sam Minnee)
* 2016-09-20 [3ea23ce2b](https://github.com/silverstripe/silverstripe-framework/commit/3ea23ce2b7ab877a279e8b03deb307ea5c39a69b) Make PR builds work. (Sam Minnee)
* 2016-09-20 [53f251e4](https://github.com/silverstripe/silverstripe-siteconfig/commit/53f251e42e44bfd154b2974a0b54e69f4ea1bbcc) fix incorrect CMSTabSet reference (Damian Mooyman)
* 2016-09-20 [18939157](https://github.com/silverstripe/silverstripe-cms/commit/18939157f0e595217556c9dfe86d68b6b1cd989b) Fix pages level up link (Damian Mooyman)
* 2016-09-19 [ef88619d2](https://github.com/silverstripe/silverstripe-framework/commit/ef88619d2fa31e832e7474bd6e0dc5cfcc45437d) Fix error in campaign area (Damian Mooyman)
* 2016-09-19 [82e72d062](https://github.com/silverstripe/silverstripe-framework/commit/82e72d062f99880c0b3dc74cf8c3384c430d4afd) prevent form data / validation persisting in state when using form schema (Damian Mooyman)
* 2016-09-17 [b61c5a56d](https://github.com/silverstripe/silverstripe-framework/commit/b61c5a56de334d8f60b9e2b0992431c311262fbc) sass-lint styleguide fixes (Sam Minnee)
* 2016-09-15 [30174db45](https://github.com/silverstripe/silverstripe-framework/commit/30174db4594d81ddb01bbcdb42769e1f266ca0be) i18n JS regression about locale selection (Ingo Schommer)
* 2016-09-15 [cd3ae42c](https://github.com/silverstripe/silverstripe-cms/commit/cd3ae42c1df97719590bc145383eda64c0c7fbf3) ed jquery.js path (Ingo Schommer)
* 2016-09-14 [5415afe8b](https://github.com/silverstripe/silverstripe-framework/commit/5415afe8bf0a1d5ade9a78be071e4e39692bc2a7) ed react-bootstrap tabs warnings (Ingo Schommer)
* 2016-09-14 [abaebbe1d](https://github.com/silverstripe/silverstripe-framework/commit/abaebbe1d791634f50edd9c15ef6f50a67cec2d5) Manually fix issue in jquery-ui 1.9 (Damian Mooyman)
* 2016-09-12 [61d7c3af2](https://github.com/silverstripe/silverstripe-framework/commit/61d7c3af28d7b657721bb39c7c9632169ec97497) Fix tests when running directly from framework. (Sam Minnee)
* 2016-09-12 [6b640f81f](https://github.com/silverstripe/silverstripe-framework/commit/6b640f81f2ed4ffdbac6036f5fb099a2c7f47e51) Dont double-include composer autoloader (Sam Minnee)
* 2016-09-12 [93a0122c0](https://github.com/silverstripe/silverstripe-framework/commit/93a0122c0f61b487cf0cc9d010913e3cdf655597) Dont treat URLs as root relative when FRAMEWORK_DIR = “” (Sam Minnee)
* 2016-09-10 [701c700d4](https://github.com/silverstripe/silverstripe-framework/commit/701c700d4c132dca835ed624d81fb2bd423957e4) ed UploadField JS dependencies (Ingo Schommer)
* 2016-09-10 [68c6137f2](https://github.com/silverstripe/silverstripe-framework/commit/68c6137f293efc5ab0f1562031913254dc8f58bd) GroupedDropdownField include namespace (Ingo Schommer)
* 2016-09-09 [5a786624a](https://github.com/silverstripe/silverstripe-framework/commit/5a786624aa13b9a275d6fdf48656d3bff71fe805) Remove unnecessary manual includes (Sam Minnee)
* 2016-09-09 [dbf78243](https://github.com/silverstripe/silverstripe-cms/commit/dbf782436797de4b6ef847fcd53d3807ff04a148) SiteTreeURLSegmentField.ss in wrong location (fixes #1607) (Loz Calver)
* 2016-09-08 [a12d52a1](https://github.com/silverstripe/silverstripe-cms/commit/a12d52a1611129b42da17b5838339643525592af) Fix some namespace class errors (Damian Mooyman)
* 2016-09-08 [d4de776a4](https://github.com/silverstripe/silverstripe-framework/commit/d4de776a45b5499887dd91f999bb6836b00d3540) fix core include (Damian Mooyman)
* 2016-09-08 [d2229ce8a](https://github.com/silverstripe/silverstripe-framework/commit/d2229ce8a6479e29bbdbba88b0e01db00a09fb89) Fix issue with Folder::validate() failing on allowed_extensions (Damian Mooyman)
* 2016-09-08 [eaac95724](https://github.com/silverstripe/silverstripe-framework/commit/eaac957248d2f9e40f093c49531901c803e955d8) case of required paths (Damian Mooyman)
* 2016-09-08 [77d167730](https://github.com/silverstripe/silverstripe-framework/commit/77d16773043797dbbb70e3f0845e0a1d82d1b6f0) issue with core/Core.php includes (Damian Mooyman)
* 2016-09-06 [f7f1cf0e8](https://github.com/silverstripe/silverstripe-framework/commit/f7f1cf0e878d037aaa15d983ff3b55dc6f85d512) SingleSelectField readonly view (Ingo Schommer)
* 2016-09-06 [b53ce4c19](https://github.com/silverstripe/silverstripe-framework/commit/b53ce4c19041fb8a11b3060b45fa4c3848628a9c) Button loading indicator (Ingo Schommer)
* 2016-09-05 [9c48b939](https://github.com/silverstripe/silverstripe-cms/commit/9c48b9398323450a3cae83b8ed33e32d7ef0925f) Ensure changes in class write to an instance of the new class, not the old one (Damian Mooyman)
* 2016-09-04 [cbdf3eb72](https://github.com/silverstripe/silverstripe-framework/commit/cbdf3eb7257b85ccc4102f5c665c1b4d3d300010) Show formatting help toggle link (Robbie Averill)
* 2016-09-01 [c9d964ff0](https://github.com/silverstripe/silverstripe-framework/commit/c9d964ff0d6e10e2c962df6eda60766fd8093d85) HTMLEditorField image reference (Ingo Schommer)
* 2016-09-01 [ecaed8c08](https://github.com/silverstripe/silverstripe-framework/commit/ecaed8c08d38ff23452024055aeae8b2be031748) ed icon regression in &lt;Breadcrumb&gt; (Ingo Schommer)
* 2016-08-30 [fa5e6bbd6](https://github.com/silverstripe/silverstripe-framework/commit/fa5e6bbd692ef22b406d69054e515c3b79d8fe37) ed breadcrumb icon spacing (Ingo Schommer)
* 2016-08-29 [a6f1fa3](https://github.com/silverstripe/silverstripe-installer/commit/a6f1fa3b9193fb97f100f9226407dcef5736be4b) use 1.0.x-dev for asset-admin composer contraint (Robbie Averill)
* 2016-08-28 [b509f9199](https://github.com/silverstripe/silverstripe-framework/commit/b509f9199df32c01d4dd681cdc0df61ada7d0fc2) Modal response positioning (Christopher Joe)
* 2016-08-26 [1b527fca3](https://github.com/silverstripe/silverstripe-framework/commit/1b527fca3f59e2aa577162eb8f4547fd57971fb3) Webpack handles images & fonts. (Sam Minnee)
* 2016-08-23 [b77d21c25](https://github.com/silverstripe/silverstripe-framework/commit/b77d21c25a7d70eeabfed03a40cd36818d075328) pages add to campaign, improved FormActions error handling, Popover focus highlight and refactored AddToCampaignModal to FormBuilderModal (Christopher Joe)
* 2016-08-23 [c411c500](https://github.com/silverstripe/silverstripe-cms/commit/c411c500a5325af1a5d07cb4e7d2106b4598f91d) for pages admin add to campaign modal (Christopher Joe)
* 2016-08-21 [a6049ec38](https://github.com/silverstripe/silverstripe-framework/commit/a6049ec383f313f448431d2e55173178927eead1) Use chosen from npm package. (Sam Minnee)
* 2016-08-21 [beef8fa0](https://github.com/silverstripe/silverstripe-cms/commit/beef8fa072db896c548c3e8f88857b4f1aef18b7) Switch gulp JavaScript generation to Webpack (Sam Minnee)
* 2016-08-19 [a49456df2](https://github.com/silverstripe/silverstripe-framework/commit/a49456df208ebd30fd1fbaca2fed24b790390e66) for batch actions not postponed under toolbar on open/close (Paul Clarke)
* 2016-08-18 [5c2e8d129](https://github.com/silverstripe/silverstripe-framework/commit/5c2e8d1299a7b23a1a2533b980c3599ca4ae2248) form attr merging order (Ingo Schommer)
* 2016-08-17 [a9bdf33ca](https://github.com/silverstripe/silverstripe-framework/commit/a9bdf33ca8df700097615ecfc3cec6b638153dd2) SingleSelect styling, added add to campaign documentation (Christopher Joe)
* 2016-08-12 [b4435027](https://github.com/silverstripe/silverstripe-siteconfig/commit/b443502777e223a445e9cf8e09d58c30d3e5fc55) issues with templates (Damian Mooyman)
* 2016-08-11 [ed7fe6515](https://github.com/silverstripe/silverstripe-framework/commit/ed7fe65156c13e612b6fb59506d2fa7b33a425ee) Fix usage of $this as closure argument (Damian Mooyman)
* 2016-08-11 [041d1212](https://github.com/silverstripe/silverstripe-cms/commit/041d12129adf30405706bbaeb3c4078e4a9b7450) regressions from namespacing (Damian Mooyman)
* 2016-08-10 [59efd280a](https://github.com/silverstripe/silverstripe-framework/commit/59efd280adafc04581899a4eb6e54ac5bbee9a49) issues with CMS permission codes (Damian Mooyman)
* 2016-08-05 [7026da20d](https://github.com/silverstripe/silverstripe-framework/commit/7026da20dbc8fca6b9cc14f41aa31e5535b68e3e) Make template lookup use 'type' correctly (Damian Mooyman)
* 2016-08-04 [01a13dcba](https://github.com/silverstripe/silverstripe-framework/commit/01a13dcba970f9f641fb7f239b7e99582701c76d) Fix incorrect use of baseClass as baseTable (Damian Mooyman)
* 2016-08-02 [7448fb7ba](https://github.com/silverstripe/silverstripe-framework/commit/7448fb7baebef7c7d6d8d1efb491c8b6f9b90b03) batch action permissions not applied to new nodes loaded (Christopher Joe)
* 2016-08-01 [ab60850a](https://github.com/silverstripe/silverstripe-cms/commit/ab60850a281c849e32b958d43bad2f64a9282ea0) Fix incorrect route registration order (Damian Mooyman)
* 2016-08-01 [7c151321](https://github.com/silverstripe/silverstripe-cms/commit/7c151321b4eb93a769a957c14b391c654b25c535) Fix issue with old asset-admin repeating "level up" button (Damian Mooyman)
* 2016-08-01 [12adba3d3](https://github.com/silverstripe/silverstripe-framework/commit/12adba3d3484248599bdaf420fe1bed64ef04db3) Fix `[buttons]` appearing instead of actual buttons when uploading files (Damian Mooyman)
* 2016-08-01 [9d31bb05](https://github.com/silverstripe/silverstripe-reports/commit/9d31bb0542d1d3913be7c3aa12f88d9498847e48) Fix broken form actions on parent and nested gridfields (Damian Mooyman)
* 2016-07-29 [06ae50e4f](https://github.com/silverstripe/silverstripe-framework/commit/06ae50e4f52082e6d1f58f233dd4984c1d474479) Fix hash link navigation in CMS (Damian Mooyman)
* 2016-07-28 [c54b8b5a](https://github.com/silverstripe/silverstripe-reports/commit/c54b8b5a6c7c12b872096cd0cd6653c9341afed5) link formatting (Damian Mooyman)
* 2016-07-28 [d2142f25](https://github.com/silverstripe/silverstripe-reports/commit/d2142f252e4f50a063747d12babf6cfa4e8e762b) psr-2 formatting (Damian Mooyman)
* 2016-07-28 [4d2fd04c6](https://github.com/silverstripe/silverstripe-framework/commit/4d2fd04c6451d051d5659184e8df58fc328c24d1) Behat preview mode finder being too specific (#5846) (Hamish Friedlander)
* 2016-07-28 [d15b19d20](https://github.com/silverstripe/silverstripe-framework/commit/d15b19d2083075a99662c9e57c08f1823395b336) merge regressions in add-link fixes (Damian Mooyman)
* 2016-07-28 [a868ecdbf](https://github.com/silverstripe/silverstripe-framework/commit/a868ecdbfa166ea4792125203a3a28b42321c81e) Correct include paths for legacy JS files (Damian Mooyman)
* 2016-07-28 [1f8c2f781](https://github.com/silverstripe/silverstripe-framework/commit/1f8c2f781bda8b2b16d453160eeb1247de426a2c) "Insert Link" dialog in HTMLEditorField. CSS still needs work. (Hamish Friedlander)
* 2016-07-28 [6e74b57c3](https://github.com/silverstripe/silverstripe-framework/commit/6e74b57c36816f3ba763ea0f8fb862306a362506) Fix issue with gulpfile.js not compiling client/src/legacy dir (Damian Mooyman)
* 2016-07-26 [d7fa0026](https://github.com/silverstripe/silverstripe-cms/commit/d7fa00267eb8b1c796fa5497b549ef951a6b0e69) field casting (Damian Mooyman)
* 2016-07-25 [f9b487258](https://github.com/silverstripe/silverstripe-framework/commit/f9b4872583aa3c9750f29d111ac073ab9ddf631d) Remap obsolete ClassName values. (Sam Minnee)
* 2016-07-21 [7c2470380](https://github.com/silverstripe/silverstripe-framework/commit/7c24703804f31d9ef1eab749a7bb5527f7d52624) Fix regressions in custom admin url from #3274 (Damian Mooyman)
* 2016-07-18 [761cbf0d](https://github.com/silverstripe/silverstripe-reports/commit/761cbf0dc2ce98e7db6ce7df3913330b8f79c380) Use new admin_url (Daniel Hensby)
* 2016-07-18 [0a7437db](https://github.com/silverstripe/silverstripe-cms/commit/0a7437db40bbca078a4c7518d8f907228bf03462) Allow changing admin URLs (Daniel Hensby)
* 2016-07-18 [b89fcfa18](https://github.com/silverstripe/silverstripe-framework/commit/b89fcfa1884140e3b972cd44516825974f6148c5) Fix regression with uploadfield casting (Damian Mooyman)
* 2016-07-15 [0f950800](https://github.com/silverstripe/silverstripe-cms/commit/0f950800ef7009806e241914becf16157879000d) wrongly named themes after themestack API change (#1548) (Hamish Friedlander)
* 2016-07-14 [2d47fed7](https://github.com/silverstripe/silverstripe-reports/commit/2d47fed75dc8771e1d7754d117440fed3e40b84a) ReportAdmin::Link() not returning correct home url (#38) (Damian Mooyman)
* 2016-07-14 [83c2af72c](https://github.com/silverstripe/silverstripe-framework/commit/83c2af72ca32b73c405876a2a7daec370ea99492) Fix some regressions from #5653 (#5806) (Damian Mooyman)
* 2016-07-13 [f8b1c27e](https://github.com/silverstripe/silverstripe-cms/commit/f8b1c27e3c7eb418fa091f465b04ce57390c42fc) Fix regressions from https://github.com/silverstripe/silverstripe-framework/pull/5653 (Damian Mooyman)
* 2016-07-13 [fb6f8a0a0](https://github.com/silverstripe/silverstripe-framework/commit/fb6f8a0a049154da82c5bf4a4330d519727f0713) Fix Security page showing double escaped HTML (Damian Mooyman)
* 2016-07-13 [e78bf010b](https://github.com/silverstripe/silverstripe-framework/commit/e78bf010b0c1135c242c0686da8e5b7aaff2b8fa) Fix augmentWriteVersioned (Damian Mooyman)
* 2016-07-13 [7d82304bb](https://github.com/silverstripe/silverstripe-framework/commit/7d82304bb09b5391bd9e95d1446b3bd938022f5e) Fix route invoking multiple handleStateChanges on single navigation actions (Damian Mooyman)
* 2016-07-06 [dfe375e87](https://github.com/silverstripe/silverstripe-framework/commit/dfe375e87e8bac103a4445ce7a146374750179e1) MemberDatetime helper description, and shifted them to templates (#5766) (Chris Joe)
* 2016-07-06 [59d4b51d](https://github.com/silverstripe/silverstripe-cms/commit/59d4b51d8ef873e0fbe23ef5ab5b2ca94996cd4c) Fix missing tabs layout in pages view (Damian Mooyman)
* 2016-07-04 [1931ed497](https://github.com/silverstripe/silverstripe-framework/commit/1931ed497f7e702f13d95a58ceab5216be1307c6) unit test for xml content check (Christopher Joe)
* 2016-07-04 [4a22c2bd7](https://github.com/silverstripe/silverstripe-framework/commit/4a22c2bd788d491e8a687dbe12296948bafcad9c) Revert incorrect class rename (#5765) (Damian Mooyman)
* 2016-07-01 [efef02502](https://github.com/silverstripe/silverstripe-framework/commit/efef0250277b83484536546763931c6646cb852d) Fix missing use statements (Damian Mooyman)
* 2016-06-30 [06623537c](https://github.com/silverstripe/silverstripe-framework/commit/06623537c48c9d317aa647bf4021c4d846375fb9) Don't hard-code folder into treedropdownfield search hint (Damian Mooyman)
* 2016-06-30 [abda4dc2](https://github.com/silverstripe/silverstripe-cms/commit/abda4dc2d854c6bb1f73e1f16c10f023ca8eb9df) Restore SiteTree::canPublish method to resolve incorrect fallback to SiteTreeExtension (Damian Mooyman)
* 2016-06-24 [6d835a64a](https://github.com/silverstripe/silverstripe-framework/commit/6d835a64adfcf0154bfa457c49e6f284d373108a) Saving null values to the _versions table. (Frank Mullenger)
* 2016-06-17 [6a7c1056f](https://github.com/silverstripe/silverstripe-framework/commit/6a7c1056fe54afa94641b4f1a0c3455c66d5f9e3) Fix shortcode parsing in HTMLEditorField::getanchors() (Damian Mooyman)
* 2016-06-17 [009f2de17](https://github.com/silverstripe/silverstripe-framework/commit/009f2de17ca1d435aba0f0945f3f76f575fb91d2) Fix incorrect enum string parsing (Damian Mooyman)
* 2016-06-03 [a0213aa2b](https://github.com/silverstripe/silverstripe-framework/commit/a0213aa2bfb500060d9e82a0b0ea5321065aedab) Fix HTTP url rewriting (Damian Mooyman)
* 2016-05-27 [5cace7c69](https://github.com/silverstripe/silverstripe-framework/commit/5cace7c693640cd10e6a05aaea64fbbc91f8623d) ed javascript/ docs references (#5599) (Ingo Schommer)
* 2016-05-23 [092c8986](https://github.com/silverstripe/silverstripe-cms/commit/092c8986cbfebc4a7394b62bb411fdb43dddf07c) Query string not built properly (Daniel Hensby)
* 2016-05-23 [88321f5d5](https://github.com/silverstripe/silverstripe-framework/commit/88321f5d56ff59091395ae7f7619b6bc8be0cdf9) CleanupTestDatabasesTask permission failure response (Loz Calver)
* 2016-05-23 [ad213b35](https://github.com/silverstripe/silverstripe-cms/commit/ad213b3576e7eccb38311011b2ae2e683f0faeac) Fix rollback page crash (Damian Mooyman)
* 2016-05-23 [0f646ba3](https://github.com/silverstripe/silverstripe-cms/commit/0f646ba375150bd334d05668517ccfdb06d687da) undefined index error (Damian Mooyman)
* 2016-05-20 [90397c94](https://github.com/silverstripe/silverstripe-cms/commit/90397c945d2eec1ea07ecfee7a4adab15279dac9) fix missing install image (Damian Mooyman)
* 2016-05-12 [a61d0a2f0](https://github.com/silverstripe/silverstripe-framework/commit/a61d0a2f0babedd4cc8bc639e5c4890eaf0d3351) Persistant Loading... indicator when no campaigns yet in admin (Hamish Friedlander)
* 2016-05-12 [73939958](https://github.com/silverstripe/silverstripe-cms/commit/7393995836de89509aa7643d64b322c289ff6b7a) preview in Asset Admin (Hamish Friedlander)
* 2016-05-09 [1263bf8a](https://github.com/silverstripe/silverstripe-cms/commit/1263bf8a04d4873037b9fee5fecf7d1a5b8c2f70) Not being able to save when viewing page settings (Hamish Friedlander)
* 2016-05-09 [2af63a84](https://github.com/silverstripe/silverstripe-cms/commit/2af63a84efd1b0a91985ea877fc65447c198ea02) add_i18n_javascript calls not being updated after JS move (Hamish Friedlander)
* 2016-05-09 [b2786c228](https://github.com/silverstripe/silverstripe-framework/commit/b2786c228b2384acab7ef99b6fce66e352895f15) add_i18n_javascript calls not being updated after JS move (Hamish Friedlander)
* 2016-05-06 [0b295137c](https://github.com/silverstripe/silverstripe-framework/commit/0b295137c21da6b0aea58678b07702bb2d03b7d4) unguarded JS check in LeftAndMain.Preview.js (Ingo Schommer)
* 2016-05-06 [83d70c441](https://github.com/silverstripe/silverstripe-framework/commit/83d70c4414f7f416c68317abac1d9fc19073907c) es font used for add page steps and alignment (Paul Clarke)
* 2016-05-06 [261ca9378](https://github.com/silverstripe/silverstripe-framework/commit/261ca9378e8e3465be5a5961b96aa3e5e6cf3cf4) es campaign thumbnail left alignment issue (Paul Clarke)
* 2016-05-05 [b4cd617ee](https://github.com/silverstripe/silverstripe-framework/commit/b4cd617ee339ab1ecdf927523724136fe68096d9) Renaming to HTMLEditorConfig. (Frank Mullenger)
* 2016-05-05 [9ba362065](https://github.com/silverstripe/silverstripe-framework/commit/9ba362065eb091c78f87a493b82e4fa970e3d94d) loading icon bug on IE (Scott Hutchinson)
* 2016-05-05 [c251fab9a](https://github.com/silverstripe/silverstripe-framework/commit/c251fab9af82b3779188c5ab67f39ba1a37f08ae) ed more SCSSLint errors, disabled some files (Ingo Schommer)
* 2016-05-04 [e04fb5b98](https://github.com/silverstripe/silverstripe-framework/commit/e04fb5b986ca0f55194a0930765c890fcd154078) es missing actions on responsive gridfield, cleanup indentation (#5446) (Paul)
* 2016-05-04 [4b8e98b35](https://github.com/silverstripe/silverstripe-framework/commit/4b8e98b351ad617fad0f5a8b6c1aa1d8919fca37) for scss linting issues in new scss (#5448) (Paul)
* 2016-05-02 [f88d708ee](https://github.com/silverstripe/silverstripe-framework/commit/f88d708ee997804e5a7b0490e8d5b80cf3736566) Fix GridFieldAddExistingAutocompleter and GridFieldExportButton (Damian Mooyman)
* 2016-05-01 [e7d5c92ec](https://github.com/silverstripe/silverstripe-framework/commit/e7d5c92ec1b05323694f8dde172d137eb897ef4c) merge regressions (Damian Mooyman)
* 2016-05-01 [8d2f063f0](https://github.com/silverstripe/silverstripe-framework/commit/8d2f063f0c40cbb1ec39c05fc653486efe7c867f) eslint errors (#5411) (Damian Mooyman)
* 2016-04-29 [baa3d4e7d](https://github.com/silverstripe/silverstripe-framework/commit/baa3d4e7d7ae12e63953801397ae1e1987e3afa4) trailing spaces on merge (Damian Mooyman)
* 2016-04-26 [cb723a684](https://github.com/silverstripe/silverstripe-framework/commit/cb723a684ab75b22142137e30e9b99f3c51dd95e) ed docs wording (Ingo Schommer)
* 2016-04-26 [fc8d94d78](https://github.com/silverstripe/silverstripe-framework/commit/fc8d94d789c8e849989be4ff69a30d20d7ef6824) for toolbar-south width (#5391) (Paul)
* 2016-04-26 [43f2680af](https://github.com/silverstripe/silverstripe-framework/commit/43f2680af8042b5577980b53faa86407107800b3) Fix missing return in ReadonlyField (Damian Mooyman)
* 2016-04-26 [778ed1257](https://github.com/silverstripe/silverstripe-framework/commit/778ed1257db81b5650fa885988e102a51a8f278e) campaign section cancel buttons (David Craig)
* 2016-04-25 [7e7946e50](https://github.com/silverstripe/silverstripe-framework/commit/7e7946e50a91f62ff6b6cd496da59b06ab1bda73) ed case sensitive naming regressions (David Craig)
* 2016-04-25 [c66a45c8b](https://github.com/silverstripe/silverstripe-framework/commit/c66a45c8b899b0390a3f0aa0a17acd934a191cfc) ed GridField JS test warnings (Ingo Schommer)
* 2016-04-22 [9a4b93a05](https://github.com/silverstripe/silverstripe-framework/commit/9a4b93a058ee06a66867d64264d9720a1f5cde85) Fix baseurl in IE missing leading / (Damian Mooyman)
* 2016-04-22 [2f7a7c3a5](https://github.com/silverstripe/silverstripe-framework/commit/2f7a7c3a5cf889d462669adaf6bbb5422bdb5a64) GridFieldComponent not rendering all records (David Craig)
* 2016-04-21 [fa8075367](https://github.com/silverstripe/silverstripe-framework/commit/fa8075367d79a6cc146c9a66dbe6682e346e435d) Fix routing tests (Damian Mooyman)
* 2016-04-21 [85fb0803](https://github.com/silverstripe/silverstripe-cms/commit/85fb080319c3b9a43c627f64f2d1c9a691cdf11c) font-icon regression on tree view (David Craig)
* 2016-04-21 [d376944d4](https://github.com/silverstripe/silverstripe-framework/commit/d376944d483338f1ac74cc970f081b4f081cc67e) regression with font-icon styles (David Craig)
* 2016-04-21 [8c63ae3d6](https://github.com/silverstripe/silverstripe-framework/commit/8c63ae3d68e65e75a8c63efa086858be0eaf9089) AssetAdmin icon reference (Ingo Schommer)
* 2016-04-21 [b2e8fd96e](https://github.com/silverstripe/silverstripe-framework/commit/b2e8fd96ec20b4b1709b89d920ad99d3093f8093) Fix form schema to use correct ID values (Damian Mooyman)
* 2016-04-20 [95e441528](https://github.com/silverstripe/silverstripe-framework/commit/95e4415288c9bd29674be9ae53435178c22c42da) for IE, added ability to adjust panel height based on the amount of toolbars (Paul Clarke)
* 2016-04-20 [8cf38720b](https://github.com/silverstripe/silverstripe-framework/commit/8cf38720b5de1133c676a12d3f878b8c2a74d418) Chosen.js selector for Behat feature (Ingo Schommer)
* 2016-04-19 [a7e5da822](https://github.com/silverstripe/silverstripe-framework/commit/a7e5da82286fefe4e914ea23f6a29a680675a5e1) for height (Paul Clarke)
* 2016-04-19 [0bd62735b](https://github.com/silverstripe/silverstripe-framework/commit/0bd62735bc6e20774aa4e8fd3dfd611240031c61) Fix issue with Requirements mangling custom scripts (#5337) (Damian Mooyman)
* 2016-04-19 [ddfe660f0](https://github.com/silverstripe/silverstripe-framework/commit/ddfe660f0a5ac8f4606b14fcd1b0d6ccd02da7ab) variable references when debugging (David Craig)
* 2016-04-19 [6ccfbb7c5](https://github.com/silverstripe/silverstripe-framework/commit/6ccfbb7c521df3d4f728327e2a843656aa68e795) ed breadcrumbs test (Ingo Schommer)
* 2016-04-19 [47ca88956](https://github.com/silverstripe/silverstripe-framework/commit/47ca889567556ebe706d65e07a5b98f8670ae435) for Add campaign button spacing (Paul Clarke)
* 2016-04-17 [90e352ca7](https://github.com/silverstripe/silverstripe-framework/commit/90e352ca7d2ebfc9958e184b0131952eac30652f) "urlencoded" HTTP header notation (Ingo Schommer)
* 2016-04-15 [9a5db5f76](https://github.com/silverstripe/silverstripe-framework/commit/9a5db5f760c835f8d6b7a5801f4b9b584b15543d) ChangeSet test mixing Object ID and ChangeSetItem ID up (Hamish Friedlander)
* 2016-04-13 [7e37abeb](https://github.com/silverstripe/silverstripe-cms/commit/7e37abeb217cd0e214ad1e291d6e965fc2b40cce) Fix chosen dropdown on settings being cropped (Damian Mooyman)
* 2016-04-13 [5f2edb4e9](https://github.com/silverstripe/silverstripe-framework/commit/5f2edb4e91117b7018c332116fe8d7d4d7dbaf6a) ESLint issues, shrinkwrap, and missing image (Damian Mooyman)
* 2016-04-12 [f7237a993](https://github.com/silverstripe/silverstripe-framework/commit/f7237a9936d873ffcf81f227649485911a738ecb) &lt;FormAction&gt; external and prop definition (Ingo Schommer)
* 2016-04-12 [2983dd58f](https://github.com/silverstripe/silverstripe-framework/commit/2983dd58ff9d152d641deffa519aa10b966d03b8) admin area after upgrade to Chosen 1.5 (Hamish Friedlander)
* 2016-04-11 [5d29d3011](https://github.com/silverstripe/silverstripe-framework/commit/5d29d30118025d67a80b929c4832c05d98f533d5) ed silverstripe-backend GET use regression (Ingo Schommer)
* 2016-04-11 [d7eed8fe8](https://github.com/silverstripe/silverstripe-framework/commit/d7eed8fe8d4eb7079656cc01cc4ddd71593524e1) gulpfile.js ESLint syntax (Ingo Schommer)
* 2016-04-11 [cc897d0f8](https://github.com/silverstripe/silverstripe-framework/commit/cc897d0f855ddffdc8bcb23cd18b6f16f409dfb2) for add page steps and 1px out in southbar (Paul Clarke)
* 2016-04-10 [ce8ac58dd](https://github.com/silverstripe/silverstripe-framework/commit/ce8ac58ddbe8b4ccaead8b22953ba2980960f295) React DOM warnings about &lt;form&gt; attrs (Ingo Schommer)
* 2016-04-07 [0aec89d0c](https://github.com/silverstripe/silverstripe-framework/commit/0aec89d0c8f0a6402122a3aec0f338cd84658dec) 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](https://github.com/silverstripe/silverstripe-framework/commit/7337f26d3ae877dbfee288f868da408a3720a8ae) non-standard url encoding in CMS search form (Ingo Schommer)
* 2016-04-05 [5a86f4232](https://github.com/silverstripe/silverstripe-framework/commit/5a86f4232e42232bcb5fa61e4383561a64133070) Fix error when using search bar (Damian Mooyman)
* 2016-04-04 [c4a97207](https://github.com/silverstripe/silverstripe-cms/commit/c4a97207308396190bb2c0719429f9c84d134d68) IE support by using babelify transforms (Ingo Schommer)
* 2016-04-04 [0fadd7a15](https://github.com/silverstripe/silverstripe-framework/commit/0fadd7a15a6b256322639b44ba687bafb506f1da) IE compat through babelify (Ingo Schommer)
* 2016-04-03 [640691f54](https://github.com/silverstripe/silverstripe-framework/commit/640691f544d21ca86b8c995892fbb3dda45f6bdf) fix missing language on non-global configs (Damian Mooyman)
* 2016-03-31 [d8d005d1e](https://github.com/silverstripe/silverstripe-framework/commit/d8d005d1e27d0105fade2c4758f2a695cb09a4e4) move test file to correct folder and fix class_exists (Damian Mooyman)
* 2016-03-31 [e8a68c42c](https://github.com/silverstripe/silverstripe-framework/commit/e8a68c42ce022f46c25688c3538e081c30d50a19) Prevent live manifest loading files from nested test directories (Damian Mooyman)
* 2016-03-30 [c69e55c49](https://github.com/silverstripe/silverstripe-framework/commit/c69e55c49c1a9310f1c6739444bd101b474ba3c6) Fix issue with SapphireTest::assertDOSEquals incorrectly passing on empty set (Damian Mooyman)
* 2016-03-22 [46b35ecb](https://github.com/silverstripe/silverstripe-cms/commit/46b35ecb0e4336991e374226983f3916834af1df) Changes to support php7 and new DBFields (Sam Minnee)
* 2016-03-21 [8ae289489](https://github.com/silverstripe/silverstripe-framework/commit/8ae289489001448f8866a2e5dd10959b7617f45d) form schema ID getter (Ingo Schommer)
* 2016-03-16 [6b1444709](https://github.com/silverstripe/silverstripe-framework/commit/6b1444709fe38ece828e30f43fd248e856c9a55d) menu dropdown icon (scott1702)
* 2016-03-15 [d4ad1504a](https://github.com/silverstripe/silverstripe-framework/commit/d4ad1504a979a478dc96944f7639cd706de6c215) bottom toolbar height (David Craig)
* 2016-03-13 [7769f03cc](https://github.com/silverstripe/silverstripe-framework/commit/7769f03ccc0300510daffdfe2bce7723f2193ee1) Remove duplicate extension hook (Damian Mooyman)
* 2016-03-09 [e2a377e21](https://github.com/silverstripe/silverstripe-framework/commit/e2a377e21ea7a91e3b289d41947ab4ce952dbe0c) Fix CleanupTestDatabaseTask (Damian Mooyman)
* 2016-03-09 [3673a5e14](https://github.com/silverstripe/silverstripe-framework/commit/3673a5e14116b60601a3fce1eae9eb5c786a4e08) Inserting a 'Download a file' without selecting an image (Mike Cochrane)
* 2016-03-09 [0b81bbef2](https://github.com/silverstripe/silverstripe-framework/commit/0b81bbef22a0145e1972973761248070f0bd1c66) attempt to access https iframe from http interface (Mike Cochrane)
* 2016-03-09 [a3ee9ece9](https://github.com/silverstripe/silverstripe-framework/commit/a3ee9ece90f17eda2f9d2021f8e47c74af8d3890) avoid javascript error when preview is https (Mike Cochrane)
* 2016-03-09 [70062ebc](https://github.com/silverstripe/silverstripe-cms/commit/70062ebc9cef301f2742ee08d2fade1bb7a41866) 'Settings' fields being overwritten by 'Content' fields (Mike Cochrane)
* 2016-03-06 [3d99ed24a](https://github.com/silverstripe/silverstripe-framework/commit/3d99ed24ac3bfcd7afaa7210b654b65c978a8817) Better filtering of versionable tables during SQL augmentation (Damian Mooyman)
* 2016-03-06 [627fbf905](https://github.com/silverstripe/silverstripe-framework/commit/627fbf9051845dd0be1f1711a1d68762e5eceab7) ed merge regression (Ingo Schommer)
* 2016-03-03 [4b5bd2d74](https://github.com/silverstripe/silverstripe-framework/commit/4b5bd2d744c4db7e49c65a21023024d22913b1f6) cleaner can* methods for Member (Nicolaas)
* 2016-03-02 [8eede847c](https://github.com/silverstripe/silverstripe-framework/commit/8eede847cdf3638bfcdd5cf8bf450237c13eddbd) i18n.sprintf() parameters being off by one (Mike Cochrane)
* 2016-03-01 [3317d3427](https://github.com/silverstripe/silverstripe-framework/commit/3317d342769e7f94d063a9cf29ce1f4350326243) Prevent fatal errors during test failure halt tests (Damian Mooyman)
* 2016-02-26 [40723aaa5](https://github.com/silverstripe/silverstripe-framework/commit/40723aaa58fcee4496b25ac82ebc55eaefa3fb4d) undeclared variable in UploadField.js (David Craig)
* 2016-02-24 [beba0f25](https://github.com/silverstripe/silverstripe-cms/commit/beba0f2551f368a04edc8a9dd4d7446e77778c20) Fix behat tests for asset abstraction (Damian Mooyman)
* 2016-02-23 [0ee156489](https://github.com/silverstripe/silverstripe-framework/commit/0ee1564896be9a1da97d61f5141d6cffe416a7e5) Fix deprecated API usage in DataFormatter API and DataObjectTest (Damian Mooyman)
* 2016-02-19 [7580d35be](https://github.com/silverstripe/silverstripe-framework/commit/7580d35be816ad73ca6d9434f7992301c000d0fa) ability to edit files immeditately after upload (scott1702)
* 2016-01-25 [d031f53e](https://github.com/silverstripe/silverstripe-reports/commit/d031f53e7314498c900c84923f94f66e4aa3303a) incorrect version dependency (Damian Mooyman)
* 2016-01-21 [8872ed51](https://github.com/silverstripe/silverstripe-siteconfig/commit/8872ed51931efcab859c9d6f148c8dc61aa4509f) Fix broken travis yml (Damian Mooyman)
* 2016-01-21 [6cebffd89](https://github.com/silverstripe/silverstripe-framework/commit/6cebffd89bce5e4ed15d4fbd2ceb7680ec74894a) Fix SSViewerTest not restoring old requirements (Damian Mooyman)
* 2016-01-05 [45dc510da](https://github.com/silverstripe/silverstripe-framework/commit/45dc510da7051c03c6ac71cdac688b7462142d1c) ing typo (Peter Thaleikis)
* 2015-12-22 [b6627a2f7](https://github.com/silverstripe/silverstripe-framework/commit/b6627a2f7c045c040ab51512af981dad08780418) Change Requirements::include_in_response() to not add empty (Jacob Buck)
* 2015-12-15 [31888735b](https://github.com/silverstripe/silverstripe-framework/commit/31888735bdd665dd33f0b08e5fdfc9d033072b66) Fix incorrect error page handling (Damian Mooyman)
* 2015-12-02 [ed76b3f5](https://github.com/silverstripe/silverstripe-siteconfig/commit/ed76b3f56c9cf4b81a51b144a843130f89bd6e1d) Fix yml and behat (Damian Mooyman)
* 2015-12-02 [387eb227](https://github.com/silverstripe/silverstripe-siteconfig/commit/387eb2277bd76e53aca9e43e249c90bf95923f91) Fix CI (Damian Mooyman)
* 2015-12-02 [d0ee35c5](https://github.com/silverstripe/silverstripe-cms/commit/d0ee35c540f7b980cb2ee6a8ea32c81821e45ef0) composer dependencies (scott1702)
* 2015-11-12 [03169a429](https://github.com/silverstripe/silverstripe-framework/commit/03169a429fe0a408078a39e1c1d8d3e0dae96aab) typo (Nabil Kadimi)
* 2015-10-22 [fe3d23f0d](https://github.com/silverstripe/silverstripe-framework/commit/fe3d23f0d4c381040f47d24c4dcc9b27768a06b8) Fix GeneratedAssetHandler crashing on expired resources (Damian Mooyman)
* 2015-10-19 [d7dcb41b](https://github.com/silverstripe/silverstripe-cms/commit/d7dcb41b271e6b5d5e74988a979a286185a0093e) Remove tab - invalid YAML (Loz Calver)
* 2015-10-18 [c8a0347b7](https://github.com/silverstripe/silverstripe-framework/commit/c8a0347b78af0e643b1fd3032d100f8e7ed55ee2) Monolog constant use (Ingo Schommer)
* 2015-10-15 [27a8afe78](https://github.com/silverstripe/silverstripe-framework/commit/27a8afe78bae34a4e0cbd6fb225840312dc8fa5f) Fix regressions in fulltextsearch (Damian Mooyman)
* 2015-10-14 [d884c859d](https://github.com/silverstripe/silverstripe-framework/commit/d884c859d189a0803974636fa6f699cbc474233a) Fix file link tracking for new asset abstraction (Damian Mooyman)
* 2015-10-06 [c13dfc2fa](https://github.com/silverstripe/silverstripe-framework/commit/c13dfc2fa0d84fab40d01f38441295d40d2d1df5) ing phpdoc blocks to refering to Objects to built-in types of PHP (Peter Thaleikis)
* 2015-09-28 [1f632a10c](https://github.com/silverstripe/silverstripe-framework/commit/1f632a10c9661d7f7eb27bd1fcf7e03081e8010e) Replace direct reference to $_REQUEST['url'] with request object getter (Damian Mooyman)
* 2015-09-28 [8e3f549b](https://github.com/silverstripe/silverstripe-cms/commit/8e3f549b19bd4930f2fa80a7fa6a528cdc5e4011) Fix regressions in CMS from db field changes (Damian Mooyman)
* 2015-09-09 [60e75cbd](https://github.com/silverstripe/silverstripe-cms/commit/60e75cbd990669dade21633a475ff845e089a1d6) travis php version back to 5.4 (Damian Mooyman)
* 2015-09-09 [143e4eae5](https://github.com/silverstripe/silverstripe-framework/commit/143e4eae5fe293735b82f22c09e8bc2b541d2a10) travis php version back to 5.4 (Damian Mooyman)
* 2015-09-09 [812b5ecb6](https://github.com/silverstripe/silverstripe-framework/commit/812b5ecb629c839cb582477fb95628be7db8caf2) merge regressions (Damian Mooyman)
* 2015-09-04 [fa8702f0c](https://github.com/silverstripe/silverstripe-framework/commit/fa8702f0c8b22581e1cbe48fc3741a146b546bc9) Fix reference to missing Debug::loadErrorHandlers() (Damian Mooyman)
* 2015-08-28 [f5af0c85b](https://github.com/silverstripe/silverstripe-framework/commit/f5af0c85bade63174d282162a6c99fb37461b433) Dont use SplFixedArray in PHP 7. (Sam Minnee)
* 2015-08-27 [8518fc142](https://github.com/silverstripe/silverstripe-framework/commit/8518fc142556c3992d0a485c4b3e90e2095f4c0c) Clarify PHP7-incompatible call styles. (Sam Minnee)
* 2015-08-27 [083799ec0](https://github.com/silverstripe/silverstripe-framework/commit/083799ec03899b8388352849cbdc42e4c74fbf4d) Minimal data-model changes to support PHP7. (Sam Minnee)
* 2015-08-27 [12a83d70a](https://github.com/silverstripe/silverstripe-framework/commit/12a83d70aef7a36c5b5b403b86d4864402275eaa) Removed PHP4 syntax from Diff.php (Sam Minnee)
* 2015-08-27 [680b19a1d](https://github.com/silverstripe/silverstripe-framework/commit/680b19a1da75aa940da4ce4283710eff337139c6) Correct PHP4-style constructors in SimpleTest. (Sam Minnee)
* 2015-08-25 [5fa3c8528](https://github.com/silverstripe/silverstripe-framework/commit/5fa3c852804d3c627d5d2f8db6fd4b73da698531) for #4417: Ensuring -&gt;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](https://github.com/silverstripe/silverstripe-cms/commit/bf6a84bd2fd0c16f040902dcd7902538a6c9bf50) ing behat regression (Daniel Hensby)
* 2015-08-14 [e13aebc3d](https://github.com/silverstripe/silverstripe-framework/commit/e13aebc3d701b30667d7df23edbff2ce2418a4f0) for #4502 Prevents JSON.parse() from scrambling sorted results from server-side. (Patrick Nelson)
* 2015-08-04 [053c47499](https://github.com/silverstripe/silverstripe-framework/commit/053c47499ee00c984f85ee83bcb389175b0b11ea) datefield to work with other form markup (hex0id)
* 2015-04-28 [cadc02b63](https://github.com/silverstripe/silverstripe-framework/commit/cadc02b63b1f8248a5518e202da6f948ffa5064e) 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](https://github.com/silverstripe/silverstripe-siteconfig/commit/512b3db0153306d8ff591eefd00418f619de58f7) Fix SiteTree / SiteConfig permissions (Ingo Schommer)
* 2015-03-10 [622ad54c5](https://github.com/silverstripe/silverstripe-framework/commit/622ad54c5b21dc4e12914181e74dacfb47b8e151) Fix yaml generation to conform to version 1.1, accepted by transifex (Damian Mooyman)
* 2015-02-23 [e04e992c](https://github.com/silverstripe/silverstripe-cms/commit/e04e992c73cfd329cec535e2ed4bccf82356b589) es relating to Controller cleanup (Daniel Hensby)
* 2015-02-12 [83db2f2d3](https://github.com/silverstripe/silverstripe-framework/commit/83db2f2d30067dd81eb3af233a2beec3971c6bc6) ed "Removed DataObject::$allowed_actions #3880" on master (Aden Fraser)
* 2015-02-11 [0223b6164](https://github.com/silverstripe/silverstripe-framework/commit/0223b6164cb661e71dd8d84485e7209d6685a340) 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](https://github.com/silverstripe/silverstripe-framework/commit/1f7e627a50a769a0ebc00dbf8c2b8adb686e5afe) How to folder on forms (Cam Findlay)
* 2014-12-10 [6ff6c6f5](https://github.com/silverstripe/silverstripe-cms/commit/6ff6c6f572e2981df136d2665dcfe0e8a241451c) Removed multifile thirdparty library which isn't used any more in ss. (micmania1)
* 2014-12-08 [ddd83304c](https://github.com/silverstripe/silverstripe-framework/commit/ddd83304ceef3ce46b511daafa3becbb1449b5a1) Feedback to name the fields section to "field types" to make it clearer what the section is about. (Cam Findlay)
* 2014-12-08 [1f181a65c](https://github.com/silverstripe/silverstripe-framework/commit/1f181a65c920f3f650889bb3df2be4f93f8a8d35) use GFMD code blocks to fix code formatting consistency. (Cam Findlay)
* 2014-12-04 [00e029f57](https://github.com/silverstripe/silverstripe-framework/commit/00e029f574f09e47f059d314d35392ecde3d9092) check for suite existence in endCurrentTest (Will Morgan)
* 2014-11-20 [6ace5641](https://github.com/silverstripe/silverstripe-cms/commit/6ace56418e82d4f6dcb82c84836860bc98e667c5) dependency on framework master branch (Damian Mooyman)
* 2014-06-02 [e732aee6e](https://github.com/silverstripe/silverstripe-framework/commit/e732aee6eb4132aba85ecb3e1e3e72543ea2003c) es #3182 Fixes lazy loading of fields when query was created in default stage (Craig Weber)

View File

@ -104,6 +104,15 @@ en:
OF: of
Page: Page
View: View
SilverStripe\Forms\GridField\GridFieldVersionedState:
ADDEDTODRAFTHELP: 'Item has not been published yet'
ADDEDTODRAFTSHORT: Draft
ARCHIVEDPAGEHELP: 'Item is removed from draft and live'
ARCHIVEDPAGESHORT: Archived
MODIFIEDONDRAFTHELP: 'Item has unpublished changes'
MODIFIEDONDRAFTSHORT: Modified
ONLIVEONLYSHORT: 'On live only'
ONLIVEONLYSHORTHELP: 'Item is published, but has been deleted from draft'
SilverStripe\Forms\MoneyField:
FIELDLABELAMOUNT: Amount
FIELDLABELCURRENCY: Currency

View File

@ -1,4 +1,6 @@
eo:
SilverStripe\Admin\LeftAndMain:
VersionUnknown: nekonata
SilverStripe\AssetAdmin\Forms\UploadField:
Dimensions: Dimensioj
EDIT: Redakti
@ -14,6 +16,11 @@ eo:
TEXT1: 'Jen via'
TEXT2: 'pasvorta reagorda ligilo'
TEXT3: por
SilverStripe\Control\RequestProcessor:
INVALID_REQUEST: 'Malvalida peto'
REQUEST_ABORTED: 'Ĉesigis peton'
SilverStripe\Core\Manifest\VersionProvider:
VERSIONUNKNOWN: Nekonata
SilverStripe\Forms\CheckboxField:
NOANSWER: Ne
YESANSWER: Jes
@ -97,6 +104,15 @@ eo:
OF: de
Page: Paĝo
View: Vido
SilverStripe\Forms\GridField\GridFieldVersionedState:
ADDEDTODRAFTHELP: 'Ero ankoraŭ estas ne publikigita'
ADDEDTODRAFTSHORT: Malneto
ARCHIVEDPAGEHELP: 'Ero estas forigita el malneta kaj publika'
ARCHIVEDPAGESHORT: Enarkivigita
MODIFIEDONDRAFTHELP: 'Ero enhavas nepublikigitajn ŝanĝojn'
MODIFIEDONDRAFTSHORT: Ŝanĝita
ONLIVEONLYSHORT: 'Nur ĉe publika'
ONLIVEONLYSHORTHELP: 'Ero estas publikigita, sed ĝi estas forigita el malneto'
SilverStripe\Forms\MoneyField:
FIELDLABELAMOUNT: Kvanto
FIELDLABELCURRENCY: Kurzo
@ -158,8 +174,13 @@ eo:
PASSWORDEXPIRED: '<p>Via pasvorto finiĝis. <a target="_top" href="{link}">Bonvolu elekti novan.</a></p>'
SilverStripe\Security\CMSSecurity:
INVALIDUSER: '<p>Nevalida uzanto. <a target="_top" href="{link}">Bonvolu aŭtentigi ĉi tie</a> por daŭrigi.</p>'
LOGIN_MESSAGE: '<p>Via seanco eltempiĝis pri neaktiveco</p>'
LOGIN_TITLE: 'Reiru al kie vi lasis, ensalutante denove'
SUCCESS: Sukseso
SUCCESSCONTENT: '<p>Ensaluto suksesis. Se vi ne aŭtomate alidirektiĝos, <a target="_top" href="{link}">alklaku ĉi tie</a></p>'
SUCCESS_TITLE: 'Ensaluto sukcesis'
SilverStripe\Security\DefaultAdminService:
DefaultAdminFirstname: 'Apriora administranto'
SilverStripe\Security\Group:
AddRole: 'Aldoni rolon por ĉi tiu grupo'
Code: 'Grupa Kodo'
@ -200,6 +221,7 @@ eo:
BUTTONCHANGEPASSWORD: 'Ŝanĝi pasvorton'
BUTTONLOGIN: Ensaluti
BUTTONLOGINOTHER: 'Ensaluti kiel alia homo'
BUTTONLOGOUT: Elsaluti
BUTTONLOSTPASSWORD: 'Mi perdis mian pasvorton'
CONFIRMNEWPASSWORD: 'Konfirmu novan pasvorton'
CONFIRMPASSWORD: 'Konfirmu pasvorton'
@ -236,6 +258,14 @@ eo:
db_LockedOutUntil: 'Elŝlosita ĝis'
db_Password: Pasvorto
db_PasswordExpiry: 'Pasvorta Limdato'
SilverStripe\Security\MemberAuthenticator\CMSMemberLoginForm:
AUTHENTICATORNAME: 'CMS-membra ensaluta formularo'
BUTTONFORGOTPASSWORD: 'Forgesis pasvorton'
BUTTONLOGIN: 'Permesu min ree ensaluti'
BUTTONLOGOUT: Elsaluti
SilverStripe\Security\MemberAuthenticator\MemberAuthenticator:
ERRORWRONGCRED: 'La donitaj detaloj ŝajnas malĝustaj. Bonvole reprovu.'
NoPassword: 'Mankas pasvorto por ĉi tiu membro.'
SilverStripe\Security\MemberPassword:
PLURALNAME: 'Membraj pasvortoj'
PLURALS:
@ -290,9 +320,11 @@ eo:
BUTTONSEND: 'Sendu al mi la ligilon reagordi pasvorton'
CHANGEPASSWORDBELOW: 'Vi povas ŝanĝi vian pasvorton malsupre.'
CHANGEPASSWORDHEADER: 'Ŝanĝi vian pasvorton'
CONFIRMLOGOUT: 'Bonvolu alklaki la suban butonon por konfirmi ke vi volas elsaluti'
ENTERNEWPASSWORD: 'Bonvolu enigi novan pasvorton.'
ERRORPASSWORDPERMISSION: 'Vi devas ensaluti por ŝanĝi vian pasvorton!'
LOGIN: Ensaluti
LOGOUT: Elsaluti
LOSTPASSWORDHEADER: 'Perdis pasvorton'
NOTEPAGESECURED: 'Tiu paĝo estas sekurigita. Enigu viajn akreditaĵojn sube kaj vi aliros pluen.'
NOTERESETLINKINVALID: '<p>La pasvorta reagorda ligilo estas malvalida aŭ finiĝis.</p><p>Vi povas peti novan <a href="{link1}">ĉi tie</a> aŭ ŝanĝi vian pasvorton post <a href="{link2}">vi ensalutis</a>.</p>'

View File

@ -104,6 +104,15 @@ it:
OF: di
Page: Pagina
View: Visualizza
SilverStripe\Forms\GridField\GridFieldVersionedState:
ADDEDTODRAFTHELP: 'L''elemento non è stato ancora pubblicato'
ADDEDTODRAFTSHORT: Bozza
ARCHIVEDPAGEHELP: 'Elemento rimosso da bozza e live'
ARCHIVEDPAGESHORT: Archiviato
MODIFIEDONDRAFTHELP: 'L''elemento ha modifiche nascoste'
MODIFIEDONDRAFTSHORT: Modificato
ONLIVEONLYSHORT: 'Solo su live'
ONLIVEONLYSHORTHELP: 'L''elemento è pubblicato, ma è stato eliminato dal sito bozza'
SilverStripe\Forms\MoneyField:
FIELDLABELAMOUNT: Importo
FIELDLABELCURRENCY: Valuta

View File

@ -158,7 +158,7 @@ class Module implements Serializable
{
$config = "{$this->path}/_config.php";
if (file_exists($config)) {
require_once $config;
requireFile($config);
}
}
@ -247,3 +247,15 @@ class Module implements Serializable
->exists();
}
}
/**
* Scope isolated require - prevents access to $this, and prevents module _config.php
* files potentially leaking variables. Required argument $file is commented out
* to avoid leaking that into _config.php
*
* @param string $file
*/
function requireFile()
{
require_once func_get_arg(0);
}

View File

@ -259,6 +259,8 @@ class InstallRequirements
$this->requireWriteable('index.php', array("File permissions", "Is the index.php file writeable?", null));
$this->requireWriteable('.env', ["File permissions", "Is the .env file writeable?", null], false, false);
if ($isApache) {
$this->checkApacheVersion(array(
"Webserver Configuration",
@ -826,7 +828,7 @@ class InstallRequirements
}
}
public function requireWriteable($filename, $testDetails, $absolute = false)
public function requireWriteable($filename, $testDetails, $absolute = false, $error = true)
{
$this->testing($testDetails);
@ -878,7 +880,11 @@ class InstallRequirements
$testDetails[2] .= "The webserver user needs to be able to write to this file:\n$filename";
}
if ($error) {
$this->error($testDetails);
} else {
$this->warning($testDetails);
}
}
}

View File

@ -2,13 +2,13 @@
namespace SilverStripe\Dev\Install;
use Dotenv\Dotenv;
use Exception;
use SilverStripe\Control\Cookie;
use SilverStripe\Control\HTTPApplication;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPRequestBuilder;
use SilverStripe\Core\CoreKernel;
use SilverStripe\Core\EnvironmentLoader;
use SilverStripe\Core\Kernel;
use SilverStripe\Core\Startup\ParameterConfirmationToken;
use SilverStripe\ORM\DatabaseAdmin;
@ -234,14 +234,9 @@ PHP;
$vars = [];
// Retain existing vars
// Note: vars with # or " in them are discarded
$env = new EnvironmentLoader();
if (file_exists($path)) {
$env = new Dotenv($this->getBaseDir());
foreach ($env->load() as $line) {
if (preg_match('/^(?<key>\w+)\s*=\s*("?)(?<value>[^"#]*)("?)$/', $line, $matches)) {
$vars[$matches['key']] = $matches['value'];
}
}
$vars = $env->loadFile($path) ?: [];
}
// Set base URL
@ -288,8 +283,7 @@ PHP;
$this->writeToFile('.env', implode("\n", $lines));
// Re-load env vars for installer access
$path = $this->getBaseDir();
(new Dotenv($path))->load();
$env->loadFile($path);
}
/**

View File

@ -254,7 +254,7 @@ class GridFieldAddExistingAutocompleter implements GridField_HTMLProvider, GridF
SSViewer::config()->update('source_file_comments', false);
$viewer = SSViewer::fromString($this->resultsFormat);
foreach ($results as $result) {
$title = html_entity_decode($viewer->process($result));
$title = Convert::html2raw($viewer->process($result));
$json[] = array(
'label' => $title,
'value' => $title,

View File

@ -66,8 +66,7 @@ class GridFieldDetailForm implements GridField_URLHandler
public function getURLHandlers($gridField)
{
return array(
'item/$ID' => 'handleItem',
'autocomplete' => 'handleAutocomplete',
'item/$ID' => 'handleItem'
);
}