SilverStripe ChangeLog


2.2.2 (In development)

New Features
  - Translations
      - Added Translations for LOLCAT
      - Added Translations for Esperanto
      - Added Translations for Sinhalese
      - Added Translations for Finnish
      - Added Translations for Danish
      - Ability to translate newsletter
      
Developer Tools
  - Added more unit tests
  - Added Makefile so that you can execute 'make test' in sapphire
  - Added SS_DEFAULT_ADMIN_USERNAME/PASSWORD defines to conf/ConfigureFromEnv.php
  - Added missing ChangePasswordEmail.ss 
  - main.php: Moved _ss_environment.php include to very top
  - ArrayLib
      - Added in_array_recursive() for recursively checking an array with nested arrays
  - Controller
      - Improved allowed_actions support for subclassed controllers, such as CMSMain extends LeftAndMain
      - Allow use of on controller extensions
  - DataObject
     - Added hasDatabaseField()
  - DataObjectSet
      - Implemented equal values
  - Date
      - Added TimeDiffIn()
  - Email
      - Changed email encoding from iso-8859-15 to utf-8, in compliance with other parts of SilverStripe and IMC recommendations
  - ErrorPage
      - Added all the types of error pages (ErrorPage.400,401,403 - 417,500 - 505)
  - File
      - Updated AssetAdmin to use TreeTitle() in place of Title for tree generation
      - Updated TreeTitle() to allow use of alternateTreeTitle() in decorator
      - Updated File to allow the insertion of extra columns by decorator 
  - FileUploadField
      - Added ability to customise which folder a file is uploaded to
  - Folder
      - Moved folder admin form to Folder::getCMSFields() to let you more easily manipulate the form with a decorator
  - Form
      - Added added setFields()/setActions()
  - Group
      - Added canEdit(), which can be used to filter the SecurityAdmin group list
  - HTMLEditorField
      - Added paste plain text and paste from word buttons
      - Added 'anchor' option to link inserter 
  - Image
      - adding "delete" class to DeleteImageForm()
  - Member
      - Added $notify_password_change - now sends an email to the member
      - Added BaseHref() to Member_ChangePasswordEmail so that the email shows the domain name of the current subsite
      - Added Member->SetPassword, a field that lets you have a write-only password field
      - Used Member->SetPassword to create a password column on the MemberTableField for SecurityAdmin
      - Send 'changed password' emails when a user is first created as well as edited
      - Added $searchable_fields in preparation for a more generic search implementation, currently limited to Member.php and MemberTableField.php
  - RSSFeed
      - Make RSS feed work with objects that don't support AbsoluteLink, such as the forum
  - Security
      - Added support for password and old_password encryption mechanisms if you're using MySQL 
  - SiteTree
      - Made breadcrumbs delimiter configurable
      - Added simple to-do list facility
      - Don't let people create a page name that is the same as a class name
      - Moved CMS page-disabled logic into SiteTree::CMSTreeClasses(), so that it can be more easily customised for specific sites
  - Versioned
      - Added database indexes for AuthorID and PublisherID 
  - ViewableData
      - Added $SecurityID for templates
      - Added escapeTypeForField() to determine if the record-field needs escaping (currently only 'xml' supported)
      - Added title attributes to the SilverStripeNavigator messages
      - Added $casting for BaseHref()

Bug Fixes
  - Sapphire
      - Better handling of memory limit
      - Fix locale files on Windows
      - More solid ID-detection in Member::php()
      - ComplexTableField: 
          - added $popupClass to avoid duplication, getting basedataclass for existing children in DetailForm() (in case we're dealing with different subclasses)
          - fixed getParentIdName() call in DetailForm() - paramter-order was wrong
          - better checking in saveComplexTableField() to avoid PHP-notice 
      - Fix title and description in RSS feeds
      - Fix interface translations in CMS footer
      - DataObject: 
          - fix for quering database for child elements when it hasnt been serialized
          - Remove HAVING clause from methods where it doesn't make sense to have them
          - Fix caching in DataObject::get_one()
          - Take orderby clause into account when caching in DataObject::get_one()
          - Removes having clause as it can't be used
      - Fixed DataObjectSet::insertFirst() - it now uses a numeric key rather than null
      - TestRunner: Ensured that the autoloader pulls in the test class
      - Database::createDatabase() shouldn't need any arguments. Fixed this in the core class and MySQLDatabase
      - Debug: Fix stack trace on objects that don't extend the Object class
      - SapphireTest.php: Fix YAML many_many/has_many relationships
      - HasManyComplexTableField: set $template and $itemClass to public (according to parent implementation) and fixed formatting
      - Email: Fix attachments that could not be emailed from mac or windows systems
      - Use lighter version of browscap.ini
      - Added ArrayLib::is_associative()
      - Allowing object-parameters in DataObjectSet and ArrayData, added ArrayData::object_to_array()
      - Allow insertion of <img> tags that refer to external domains and add alt= to any images that don't have alt tags 
      - Show the saved value of EditableEmailField.SendCopy
      - ManifestBuilder: Fix building manifest before database is created
      - HTMLText.Summary: Don't close img and br tags
      - Don't fail in i18n::include_by_class if the module isn't translatable
      - Database: When removing a value from an enum, set affected rows back to the default
      - Fix DataObjectSet constructor breaking with associative arrays
      - Make ContentNegotiator send XHTML to the W3C validator
      - Image: Fix attaching an existing folder to an ImageField
      - TableField: 
          - when no source items found, the table should still show and it should works as adding new records
          - renamed $wantDefaultAddRow to $showAddRow 
      - Form: removed Form::dropDatalessFields()
      - Refactored Member::session_regenerate_id to make it easier to disable in some circumstances.
      - Deprecated use of DBField 'Text' for saving HTML-Content (added check in HTMLEditorField->saveInto()) 
      - Make Security::get_encryption_algorithms() a dynamic function again.
      - Fix sorting in complextablefield
      - Added sapphire/conf/ConfigureFromEnv.php for making use of _ss_environment.php
      - SelectionGroup: Fix for bug that initialises with preloaded selected items with right hide/show
      - Fixed fatal error due to browscap.ini capitalisation error  
      - Allow many-many complex table fields to be used on the reverse side of the join (belongs many many)
      - Fix incorrect text boxes on many-many complex table fields and relational complex table fields being set on an ajax request 
      - BasicAuth: Fixed illegal reference to this 
      - Image: locking down URLs: image/iframe, image/flush, image/transferlegacycontent
      - RelationComplexTableField: fixed "object not found" error in ie6
      - ImageField: compressed layout to fit in CTF-popup (removed "click here to remove" label), removed iframe-borders for IE 
      - RelationComplexTableField: added check if sitetree exists otherwise IE broken with all genericDataAdmin panel
      - ComplexTableField: updating form in ctf-popup after saving (including validation-errors and fields that have may changed on the serverside, e.g. ImageField?)
      - fix PageView's recording of referrers.
      - File: fix upload folder
      - Fixed seamonkey browser recognition in browscap.ini
      - ComplexTableField: fix sql error on comments section
      - fixed i18n::get_owner_module() calls on classes with _s
      - Fixed ManifestBuilder execution in restrictive openbasedir environments 
      - Removed clone behaviour from Form::Fields() 
      - Object: Added object caching methods 
      - Make DataObject::write() call the recursive write on components, even when the dataobject itself hasn't changed
      - fix ComplexTableField caching
      - ManifestBuilder regex
      - Debug: Supress disabled errors on live site 
      - Allowed subclasses in ComponentSet::add/remove
      - added extra security on Controller ( checkAccessAction() )
      - Member: Used Object::create() to create email instances sent by the system.
      - Object, Versioned, Hierarchy: Allow selection of folder when inserting files / images 
      - AjaxUniqueTextField: fixed sql-injection
      - TableField: Removed use of deprecated TableField::setExtraClass()
      - Group: Removed warning in group admin
      - DataObject: fixed caching in getManyManyComponents
      - DataObject: Fixed MySQL 4.1 support for situations where we are sorting by a group aggregation function and fixed notice level error
      - Fixed bug with BasicAuth enabled on an old database, it was preventing you from visiting db/build
      - DataObject: Fixed 4.1-sort-by-group-aggregate query rewriter for sort functions containing columns, eg, ORDER BY if(A,B,C), X 
      - Director: Small fix for session bugs on Lightspeed server
      - DataObjectSets: cannot be iterated over multiple times concurrently 
      - fix to Installer: falsely claims modrewrite fails (mamp) 
      - Widget: fixed widget editor
      - ComplexTableField: Fixed double-escaping of CTF popup page-navigation links
      - ComponentSet: fixing bug with in-memory child objects not having their parent ID field updated via the ->add() method 
      - ComplexTableField: BUGFIX properly setting $childID in form for newly created items to avoid duplicates after subsequent saving (the form reloaded without the ID connection)
      - TableListField: fixed csv export in MemberTableField by checking for valid database columns when building SELECT statement
      - ComplexTableField: fix popup breaking after saving 
  - CMS
      - cmsmain_left: You can't reorganise pages without creating pages
      - MemberTableField: Patch for more i18n strings
      - Fix i18n errors
      - UserDefinedForm: Fixed notice level error 
      - Bug in PageComments class (Security)
      - Fix autocompletion in Security Admin
      - Fixed the $hide_ancestor static on SiteTree? subclasses
      - Fixed bug: Page class wasn't shown in add-page dropdown
      - More memory-efficient version of admin/publishall
      - tinymce.template: Added paste plain text and paste from word buttons to the HtmlEditorField in the CMS 
      - SideReport: fixed bug in todo list report
      - Fixed 404 on spacer.gif 
      - Fixed context menus in CMS 
      - CMSMain: Added 'duplicate page and children' context-item in addition to 'duplicate just this page' 
      - GenericDataAdmin: Recover ExportForm for genericDataAdmin Which is needed for CRM CreateCommunication
      - Added default SubscribeForm.ss
      - Added SubscribeSubmission template to get subscribeforms to work
      - SubscribeForm: Fix newsletter subscription form
      - AssetAdmin: Disabled unused files list, as it uses way too much memory
      - CMSMain->getNewItem now calls $this->extend('augmentNewSiteTreeItem', $newItem);
      - Changed call to ViewableData::castingHelperPair to fix sort not being set by getNewItem
      - Used Member->SetPassword? to create a password column on the MemberTableField? for SecurityAdmin?
	   - Send 'changed password' emails when a user is first created as well as edited 
      - Updated core to allow for subsites restriction of filesystem: Folder::getCMSFields() is now responsible for generating the folder form.
      - Folder::syncChildren() now exclusively uses DB::query() calls instead of DataObject::get(). 
      - CMSMain: Fixed CMS bottom-navigation after publish, when using the subsites module (or other alternateAbsoluteLink implementors)
      - SideReport: Fixed newlines in to-do report
  - Javascript
      - Improved the Behaviour.addLoader() method to play more nicely with tools
      - tree.js: Fix bug when duplicating pages with reorganise enabled 
      - tiny_mce_improvements.js: Improvement to link-insertion logic when selecting text that doesn't have a link
      - tiny_mce_improvements.js: Fixed default-setting for link anchor


2.2.1 (21 Dec 2007)

New Features
  - Translations
      - Added Italian translation
      - Added Russian translation
      - Added Slovak translation
      - Added Turkish translation
      - Added Bulgarian translation
      - Added Czech translation
      - Added Hungarian translation
      - Added Portuguese (Brazil) translation
      - Added Swedish translation
      - Added Chinese (Taiwan) translation
      - Added support for sapphire to Portuguese (Portugal) translation
Developer Tools
  - Added augmentDefaultRecords(), so DataObjectDecorators can extend requireDefaultRecords
Bug fixes
   - Sapphire
      - Hardcoded array of encryption algorithims in Security::get_encryption_algorithms(), as a bug in MySQL causes corruption in dumps with enums with commas
      - Fixed bug with google sitemap on translated sites
      - Removed title from SecurityID fields, as some forms show labels on HiddenFields
      - Fixed Object::uninherited() for PHP 5.1.2
      - Added empty array to member so that roles can add their own has_one relations
   - CMS
      - Added SecurityAdmin_rightbottom.ss
   - Javascript
      - Upgraded TinyMCE to 2.1.3

2.2.0 (28 Nov 2007)

New Features
   - New look for CMS
   - Support for authentification by OpenID (auth_openid module included with installer)
   - Google Sitemaps support
   - Internationalisation support
       - German translation
       - Dutch translation
       - Chinese (simplified) translation
       - Spanish translation
       - French translation
       - Croatian translation
       - Polish translation
       - Portuguese (Portugal) translation
   - Support for multilingual content
   - Added a Statistics area showing the following reports
	    - Page views
       - User activity
       - Trends
       - Operating Systems
       - Browsers
   - Added an image editor, allowing a user to rotate, crop and resize an image from within the CMS
   - Added profile popup in CMS
   - Added a 'Sent Status Report' tab to Newsletters with the following reports
       - Sending to the following recipients failed
       - Sending to the following recipients bounced
       - The newsletter has never been sent to following subscribers
       - Sending to the following recipients was successful
       - Sending to the following recipients did not occur because they are blackListed
   - Add 'Send to only people not previously sent to' option for sending newsletters
   - Added SWFUpload library as default method of uploading files
   - Added photo upload in from the Site Content section
   - Added the ability to search the Site Content tree
   - Added the ability to publish selected pages
   - Added a list of unused assets in the Files & Images section, and the ability to delete unused thumbnails 
   - Usability improvements
       - Move action buttons to bottom right of screen
       - Moved insert image/flash/link to pane on right
       - Removed right frame headers as the buttons have been moved and they only contain redundant information
       - Use a javascript dialog box for confirming unsaved changes instead of the slow loading model one
       - Reworked the tabs in the Newsletter section to be less confusing
       - Cancel button added to Send Newsletter window
       - External logo link opens in a new window
       - Left sections in Site Content 'Site Tree', 'History' and 'Reports' now use expandable sections rather than tabs
       - Relabeled 'Site Tree' to 'Site Content & Structure', 'History' to 'Page Version History' and 'Reports' to 'Site Reports' in left sections of Site Content
       - Relabeled 'Files & Images' left frame to 'Folders' 
       - Added tooltips to site content tree, showing the page type
       - In the 'Page Version History', use a checkbox lable 'Compare mode (click 2 below)' instead of a dropdown
       - Renamed 'Save draft' button to 'Save'
       - The 'Save' button text changes to 'Saving...', and the 'Publish' button text changes to 'Publishing...' when they are clicked
       - Added save indicator to all 'Save' buttons, the 'Save & Publish' button and the 'Unpublish' button while they are being submitted
       - Added a go button to the 'Site Reports' dropdown
       - Relabeled 'Name' field to 'Folder Name' in Files & Images section
       - Renamed the 'Save' button to 'Save folder name' in Files & Images section
       - Relabeled 'Send newsletters from' field to 'From email address' in Newsletter section
       - Removed the 'Move Files' button from Files & Images section, implemented multi-file drag & drop moving
       - Add 'Newsletter Settings' tab to Newsletter type edit form for consistency with other forms
       - Make the status message shown after sending a newsletter always include the # of emails sent
       - Added delete confirmation for items in Newsletter left tree
       - Added delete confirmation for items in Security left tree
       - Make 'Add new draft' the default action for 'Create...' in the Newsletter section
       - Replace the 'reorganise' button with 'Allowing drag & drog reordering' checkbox
       - Delete and Unpublish buttons turn red on hover
       - Added the ability to align images 'left on their own'
       

Developer Tools
  - New classes
      - Authenticator, allowing multiple authentification methods
      - ConfirmPasswordField
      - DropdownTimeField
      - i18n, for internationalisation
      - LanguageDropdownField
      - LoginForm, base class for login forms for each authentification method
      - MemberAuthenticator, providing username/password authentification
      - MemberLoginForm, refactored from old LoginForm form
      - PopupDateTimeField
      - ToggleField
      - OpenIDAuthenticatedRole, which is an extension to Member that adds OpenID authentification columns
      - OpenIDAuthenticator, providing OpenID authentification
      - OpenIDLoginForm, providing OpenID sign in
      - PageView, which saves the details of each page view for statistics
      - Statistics, which provides static methods for statistics
      - Translatable, for multilingual content
  - New third party libraries
      - PHP OpenID (http://openidenabled.com/php-openid/)
      - Browscap (http://garetjax.info/projects/browscap/)
      - Plotr (http://www.solutoire.com/plotr/)
      - SWFUpload (http://profandesign.se/swfupload/)
  - Improved classes
      - CalendarDateField
          - Refactored part of Field() into HTMLField() so it can be used in PopupDateTimeField
      - ComplexTableField
          - Improved pagination in popup
          - Better transformation of save-button (replaced indicator with "saving..." label) 
      - CompositeField
          - Added SmallFieldHolder() to properly render fields in a FieldGroup
          - Added insertBeforeRecursive()
          - Allow empty children
          - Added Field()
          - Added linebreaks for HTML
      - ConfirmedFormAction
          - Respect $extraClass
      - ContentController
          - Save statistics on page views
          - Added LangAttributes(), for use in XML header
          - Draft/Archived content can only be viewed by users with permission to access the CMS
      - Core
         - Added _t() for internationalisation
         - Check if TEMP_FOLDER is already defined before defining it, allowing the user to set the temporary folder themself
      - DataObject
         - Added merge()
      - Director
          - Added extend_site(), which allows modules to register a function that will be run on every page load
          - redirectBack() now redirects to the base URL if neither the referrer nor the _REDIRECT_BACK_URL is set
          - Added support for translatable URLs
          - Added is_cli()
          - Added set_status_code() and get_status_code()
      - Email
          - Define 'EMAIL_BOUNCEHANDLER_KEY' in sapphire/_config.php and require its value to be sent as 'Key' $_GET var in pings to /Email_BounceHandler to prevent fake email bounce pings
          - Display an error on duplicate bounce logs instead of a blank screen
          - If the contents of the X-SilverStripeMessageID header is sent to /Email_BounceHandler in the 'SilverStripeMessageID' _GET variable, then it will be logged in the Newsletter_SentRecipient table so that the bounce report will show up on the 'Sent Status Report' tab of the Newsletter
          - Bounced newsletter recipient emails and blacklisted by default
      - FieldSet
          - Added insertBeforeRecursive()
      - FileSystem
          - Added $file_create_mask and $folder_create_mask, which are used whenever creating new files/folders in sapphire
      - Form
          - All Forms now have a hidden SecurityID field to prevent CSRF attacks
          - Added disableSecurityToken() to disable the SecurityID field
          - Added securityTokenEnabled()
          - Changed <p class="Actions"> to <div class="Actions">
          - Renamed PureName() to Name()
      - GD
          - Added rotate()
          - Added rotatePixelByPixel(), allowing rotation where the imagerotate function is unavailable
          - Added crop()
          - Added getWidth()
          - Added getHeight()
      - Hierachy
          - Versioned now automatically add suffixes, so Hierachy no longer needs to
      - HTTP
          - Added register_modification_timestamp()
          - Added register_etag()
      - ImageField
          - Improved layout
      - Int
          - Added support for default value
      - ManifestBuilder
          - Refactored getClassManifest() for clearer ignore rules
          - Ignore i18n language files
          - Ignore folders that have a '_manifest_exclude' file
      - Member
          - Automatically login user if the 'remember login' cookie is set
          - Added createNewPassword(), which generates a random password, optionally using a word list
          - Added support for password encryption
          - Added Locale field to store user preferred language
          - Added the ability for Member decorators to augment MemberFormFields()
      - MemberLoginForm (refactored from old LoginForm)
          - Save the email address in the session to reuse when the login fails
      - ModelAsController
          - Added support for translatable URLs
      - Object
          - Added require_developer_login(), which allows you to check if the user has permission to use URL debugging tools
          - ?debugmethods=1 now requires developer login
      - PageComment
          - Added the ability to have BBCode in comments (disabled by default)
      - PasswordField
          - Always show five stars in performReadonlyTransformation(), so it is impossible to use the information of the password length for brute-force attacks
      - Permission
         - Added declare_permissions()
         - Added get_declared_permissions_list()
         - Added traverse_declared_permissions()
         - Added Permission_Group class, used to group permissions together for showing on an interface
         - Added $admin_implies_all, if this is false then the 'ADMIN' permission doesn't imply all permissions
         - Refactored Permission::checkMember(), should be faster now because the non-strict checking is now only executed if the user doesn't has the permission
         - Added deny(), giving the ability to define 'deny permissions'
      - RecipientImportField
          - Added default 'GenericEmail.ss' template
      - RestfulService
          - Added caching
      - RSSFeed
          - Added support for conditional GETs
      - Security
          - Added support for password encryption
          - Added set_word_list() and get_word_list(), to set the location of the word list used in Member::generateNewPassword()
      - Session
          - Added save(), which copies the current controllers session to $_SESSION
      - SiteTree
          - Changed references to 'stage site' to 'draft site' in TreeTitle()
          - Use Translatable interface by default
          - Add content language in MetaTags()
          - Add delete class to unpublish and rollback buttons
      - SSViewer
          - Added support for internationalisation in templates, using <% _t() %>
          - Added $Iteration in templates, which keeps track of the number of iterations in a control block
      - TableListField
          - Prevent onclick event in td.markingcheckbox from showing the popup
      - TabSet
          - Remove tabset div to reduce wasted space on tabs
          - Added insertBeforeRecursive()
      - ToggleCompositeField
          - Refactored from TogglePanel
          - Added icons and used 'cursor: pointer' to make it obvious that it is clickable
      - Versioned
          - Added the ability to versionise suffixed tables that have names that are not DataObject descendants
          - Added canBeVersioned()
          - Added extendWithSuffix()
          - Added hasVersionField()

Bug Fixes
  - Sapphire
      - E_NOTICE fixes
      - Fixed incorrect deprecated message in Convert::raw2xml()
      - Don't show and error message and quit the script when @ is used to suppress the error
      - Changed width of HTMLEditorFields to prevent horizontal scrollbars in IE7
      - Added checks in DataObjectSet::First() and DataObjectSet::Last() to prevent errors on an empty $items array
      - Fixed incorrect treatment of Member::logout() as a static method in Security::logout()
      - Ensure Priority is set in SiteTree::onBeforeWrite(), otherwise an invalid SQL statement will be generated when the page is published
      - Only highlight broken links in HTMLEditorFields once, to prevent execution timeouts when there are lots of identical broken links
      - Fixed bug "Fatal error: Access to undeclared static property: Controller::$db in ../sapphire/core/Object.php(282) : eval()'d code on line 1"
      - Fixed DataObjectDecorators not supporting indexes and defaults
      - Fixed ReportField generating invalid HTML
      - In Member::setBlacklistedEmail() call this->write() so that the BlacklistedEmail field state will be saved to the Member database table
      - Fix Email_BlackList::isBlocked() to check the BlockedEmail field instead of non-existant Email field so that it will actaully return true when an email is blocked
      - Fix layout problems with search box in IE by only generating a label tag if TItle is set in FormField::FieldHolder()
      - Fixed Permission::check() not p[assing $strict to Permission::checkMember()
      - Fixed HTTP::gmt_date()
      - Fix validation of Member extensions
      - Removed DriversLicense references from LoginForm (project specific clutter)
      - Added check for existence of #sitetree in RelationComplexTableField.js
      - Fixed VirtualPage creation
      - Fixed lighttpd flushing bug
      - Fixed CustomRequiredFields
      - Fix bugs with ComplexTableField when it is used outside of the CMS
      - Fixed error saving when value is undefined in HasOneComplexTableField and HasManyComplexTableField
      - Fixed saving error in FileIFrameField
      - Added a security fix for Security::check_default_admin()
      - Fixed caching in DataObject::getManyManyComponents() to take into account different SQL parameters
      - Geop::ip2country() now throws an E_USER_NOTICE instead of an error when it cannot run geoiplookup
      - Added if() check around a foreach loop that was causing errors when there were no entries in an RSS feed
      - Fix inheritance in ManyManyComplexTableField
      - Fixed FormField::setRightTitle() not showing because of a typo
      - Create assets folder if doesn't eixts on ErrorPage publish
      - Fixed submission of ImageField when no file was selected
      - Catch errors in ContentController::deleteinstallfiles()
      - Fix generation of group codes on creation of a Group
      - Fix title on LabelledLiteralField
      - Fix ImageField deleting the Image instead of unlinking it from the page
      - Set TimeField value to null when a bad value is passed
      - Don't return a span when the Title doesn't exist in DropdownField
      - Fix bug where NumericField couldn't have 0 as a default value
      - Call Page_Controller->init() when rendering Security/changepassword etc to respect any Requirements called in there
      - Fixed an error when a CheckboxSetField is submitted with no checkboxes ticked
      - Fixed exporting of TableListField to use commas for CSV files
      - ?previewwrite no longer works on live sites
      - Fixed incorrect CSS in TableListField.css
      - Fixed incorrect namespacing in TableListField::BaseLink()
      - If a CreditCardField is completely blank, then it's not invalid. Required-fields should be used to check for values.
  - CMS
      - E_NOTICE fixes
      - New pages are created in the database straight away, which solves a number of issues
      - Fixed Email link not working in page history
      - Unsaved changes detection now works in Security section member tables
      - Fix typo in LeftAndMain::addTreeNodeJS() by renaming 'select' parameter to 'selected' because 'selected' is what is used in the method body
      - Delete image thumbnails after deleting an image
      - Use 'html>body' instead of just 'html>' so that #sitetree correctly gets assigned width:auto on Mozilla browsers (prevents Folders being selected from 500px away on file drag and drop)
      - Display a useful error message if getCMSFields() returns null
      - When 'Duplicate this page' is clicked, first silently (without confirmation) save the page, then duplicate it so the new page is identical to the other page
      - Fix errors when importing recipients to newsletter mailing list
      - Fixed blocking during resize in IE6
      - Don't show a 'No template selected' error when sending a test Newsletter if no template has been selected since templates for Emails are optional
      - Fixed bug 'for newly created newsletter drafts, content of newsletter sent is not what is shown on screen'
      - Don't save new Newsletter drafts as soon as they are created to prevent TinyMCE Javascript errors in IE
      - Add if((typeof tinyMCE != 'undefined')) statement around call to tinyMCE.init() to prevent "Error: 'tinyMCE' is undefined" error in IE7 on Newsletter Recipient import
      - Don't allow a deleted draft to be edited in the Newsletter section
      - Fix a bug where newsletter drafts will be added, but not show up in the left tree (because of a Javascript error), if no selection has been made
      - If there are no newsletter types, and 'Add new draft' is chosen, create a newsletter type to prevent errors
      - Fix changed icon only showing after Save button is clicked twice
      - Fixed VirtualPage creation
      - Fix 'Sort subpages' not working correctly
      - Use classes instead of the align tag to align images


2.1.1 (2 Nov 2007)

Bug Fixes
  - CMS
      - BBCode help link now works inside CMS
      - Fixed invalid 'cursor: normal' CSS in cms_left.css
      - Ensure ComplexTableField CSS is loaded in CMS
      - Fixed blank comments showing in Comment Admin
      - Ensure behaviour is applied correctly to new fields in a UserDefinedForm
      - Fixed fatal error in Newsletter Admin on some servers
  - Sapphire
      - Fix infinite redirects when upgrading from 2.0.2
      - Use the hostname, not the ip address, in dev/test mode tests
      - Changed the include of the BBCodeParser so it works on more systems
      - Fixed saving of HasOneComplexTableField and HasManyComplexTableField when value is undefined
      - Removed extra comma in TableListField.js
      - Fixed redirection of login when login fails
      - Fixed bug where removing a comment via ajax removed all comments from display
      - Fix $_SESSION not saving correctly on some servers


2.1.0 (2 Oct 2007)

New Features
  - Comment administration section, and comment moderation
  - Allow CMS users to limit view/edit access to a page
  - Show an rss link for page comments on each page

Developer Tools
  - Theme support
  - Widget support
  - Better extension API
  - Unit testing framework
  - More API documentation
  - Added support for __ss_environment.php files
  - New classes
      - BankAccountField
      - BBCodeParser
      - HasManyComplexTableField
      - HasOneComplexTableField
      - ManyManyComplexTableField
      - NewsletterType
      - RestfulService (from mashups module)
   - Improved classes
      - ComplexTableField
          - Validation in popup
      - ContentController
          - Added project()
      - Controller
          - Added redirectedTo()
      - Convert
          - Added raw2htmlatt()
          - Added raw2mailto()
      - DatabaseAdmin
          - Drastically improved database build performance
      - DataObject
          - Added ID,ID,ID syntax for populating many-many joins
      - DataObjectDecorator
          - Allow member CMS fields to be added
      - DataObjectSet
          - Added getRange()
      - Date
          - Added past_date()
      - Director
          - Added set_dev_servers()
          - Added set_test_servers()
          - Added redirected_to()
          - Refactored CMS page-URL accessing to use ->AbsoluteLink(), which can be overridden by defining alternateAbsoluteLink()
      - Debug
          - Optionally hide backtrace-headers in message() and show() (applied in 'showqueries')
      - Email
          - MimeType-fallback (from /etc/mime.types)
          - Improved validation in is_valid_address()
      - FieldSet
          - Added insertAfter()
      - Form
        - Automatic filesystem backup of POST-data
      - FormField
          - Support for right-aligned titles
          - Custom CSS-classes by addExtraClass() and removeExtraClass()
      - Group
          - Added Description field
      - HtmlEditorField
          - Allow classes other than 'typography' to be set
      - Image
          - Added PaddedImage()
      - ImageField
          - Added readonly transformation
      - PageCommentInterface
          - Added anchors to page comments, and made rss feed link to them
      - Permission
          - Added $strict flag to check()
          - Allow passing of an array of permission codes to get_members_by_permission()
          - Added get_groups_by_permission()
      - PhoneNumberField
          - Improved validation
      - Security
         - Added basicauthlogin()
      - SecurityAdmin
          - Added EDIT_PERMISSIONS permission code
      - TableField
          - Validation and RequiredFields
      - TableListField
          - Added sorting, highlighting, formatting
          - Improved styling
      - TreeDropdownField
          - Improved styling
      - Varchar
          - Added RTF()
      - ViewableData
          - Added '<% if HasPerm(PERM_CODE() %>' for templates
  - Javascript
      - Implemented showIndicator() and hideIndicator()
      - Improved statusMessage() to clear manually instead of fixed interval
      - Added hideStatusMessage()

Bug Fixes
  - CMS
      - Fix specific newsletter bug
      - Don't show classes user doesn't have permissions to change to in class dropdown
      - Fix reading of Live pages in CMSMain
      - Fix double page reading after changing the class
      - Fix insert flash
      - Fix version regex for release candidates
      - Fix delete in Files and Images section
      - Fixed saving root folder causes error
      - Fixed "non-numeric ID" error that occurs when visiting newsletter section for a newsletter that doesn't exist (caused by session sometimes)
      - Fixed CMS sort subpages bug
  - Sapphire
      - Improved spam detection
      - Support for running SilverStripe in safe mode and under open_basedir restrictions
      - PHP notice fixes
      - Use normal authentification rather than basicauth for db/build
      - Fix CSS of profiler pop-up
      - Changed DropdownField $emptyString syntax from '0' to ''
      - Fixed IE6 DOM-parsing bug caused by FormResponse::load_form()
      - Triggering previewwrite for 'delete' and 'replace' SQL-actions
      - Changed record-insertion in DataObject
      - Boolean accepts database-default
      - Fixed Permission::get_members_by_permission()
      - Added memory_limit to publishall()
      - Fix many-many component set relation setting
      - The Link for a RedirectorPage points to its target
      - Add SQL_ prefix in place it was missing in Email
      - Added a check to make sure record exists before calling hasMethod on it in CheckboxSetField
      - Fixed bug in DataObject::addStaticVars()
      - Check for string 'true' as well as boolean in SiteTree::MetaTags()
      - Fix AllNewsletters value not being passed to OptionSetField in SubscribeForm
      - Improved the encapsulation of ErrorPage publication
      - Fix redirect back after failing login
      - Fixed renaming of .tar.gz and .tar.bz2 files
      - Fixed validation of DateField, EmailField and NumericField
      - Fix livesite bug for visibility handling difference between PHP5.2.0 and PHP5.1.6
      - Changed colouring of db/build to be more appropriate for the actual meaning of the messages
      - Fixed redirection from /home/ to /./ in IE6
      - Use the homepage as a model for the security base-page, so that things like the current subsite are factored in
      - Sorted permission codes in Permission::get_codes
      - Changes to support gallery module
      - Added missing has_many in DataObjectDecorator
      - Replace empty strings in SQL queries with NULL
  - JSParty
      - TinyMCE has been updated to 2.1.1.1

Installer
  - New installer look based on BlackCandy
  - Use the new theme system
  - Add first and last name fields
  - Added ability to set servers that will be in dev mode
  - When the posix module isn't present, throw a warning instead of dying
  - Warn if PHP version is less that 5.2.0 in support of GoPHP5 (http://www.gophp5.org)
  - Added favicon to installer and default template
  - Optional reporting of version information to SilverStripe
  - Installer now runs with short tags disabled
  - open_basedir and safe mode fixes


2.0.2 (14 Jul 2007)

New Features
  - BlackCandy is the new default theme
  - Added pagination for page comments
  - Updated date field in CMS-edited forms to use CalendarDateField
  - Added 'open in new window' checkbox to link inserter
  - Added dimension fields when inserting images

Developer Tools
  - Much more API Documentation
  - Modules must now have _config.php files in order to be loaded
  - New Classes
      - PermissionProvider
  - Improved Classes
      - CalendarDateField
          - Added a calendar icon
      - CheckboxSetField
          - Prepared for use editing a many-many join in the CMS, popualted with a SQLMap object
      - ClassInfo
          - Added implementorsOf()
      - ContentNegotiator
          - Added set_encoding() to choose a character set other than utf-8
      - DatabaseAdmin
          - Removed populate() as it was a security risk, the initial content is now loaded via requireDefaultRecords()
      - DataObject
          - Added add_extension() for adding decorators in _config.php
      - DataObjectDecorator
          - Added extraDBFields() for modifying the decorated data objects, adding extra database fields
      - Email
          - Added send_all_emails_to()
          - Added cc_all_emails_to()
          - Added bcc_all_emails_to()
          - Replaced sentLiveErrorsTo() with send_errors_to(), for more flexibility
      - Form
          - Added current_action()
          - Added single_field_required()
      - FormField
          - Added Required(), so that you can put asterisks into a form template if you wish
      - GenericDataAdmin
         - Updated to use new permission model
      - LeftAndMain
         - Added second argument to setApplicationName() so that the name in the top corner and the name shown elsewhere can be 2 different strings
      - Permission
          - Added get_codes()
      - Profiler
          - Added trace argument to show()
          - Added profiling scaffolds
          - Added ?profile_trace=1 url variable tool to show a trace on the profiler
          - Sorted the output of profiler
          - Improvements to profiling information
      - TableField
          - Added option to aid putting TableFields inside the ComplexTableField popup
      - TreeDropdownField
          - Added setTreeBaseID(), for showing a sub-tree in your field
  - Javascript
      - Added event.setStyle to prototype_improvements.js
      - Add class text field to image properties dialog in TinyMCE
      - Added ?debug_behaviour=1 URL option for debugging behaviour calls with Firebug

Bug Fixes
  - CMS
      - Forms in newsletter & security section were incorrectly submitting when enter was pressed
      - Fixed search in MemberTableField
      - Don't show popup when validation fails in Security section
      - Fixed bug where scrollbars aren't shown in the CMS
      - Let CMSMain be used to manage objects without Sort
      - The help button now redirects to http://userhelp.silverstripe.com
      - Version displayed in CMS now works correctly
      - Fixed CMS action button support when text size increases
      - Added message when report is empty
      - fixed (overrides) to CSS to avoid larger font-size due to em values
      - Fixed tree scrolling and resizing issues
      - Fixed sizing issues with CMS right content area
      - Fixed bug with image insertion
      - Fixed bug where new pages weren't being highlighted in the CMS
      - Fixed bug where the last page in the site tree wasn't being highlighted in the CMS
      - Fixed reordering of groups in security section
      - Improvements to image inserter
  - Sapphire
      - Reduced warnings when E_NOTICE is enabled
      - Fixed validation of date fields in a user defined form
      - Fixed multiple security groups being created when logging in with default admin
      - Fixed permissions for administrating page comments
      - Fixed ContentController::PageComments() method to die if spammers are POSTing form data when comments are disabled
      - Fixed permission checking on PHP 5.0.5
      - Fixed 'cannot access protected property' error in Security section on PHP 5.0.5
      - Fixed javascript validation of forms
      - Fixed error when asp_tags = On
      - Fixed bug where you have a non-required field with numeric validation
      - Added a limit of 20 steps in Breadcrumbs generation
      - Changed SiteTree.Title length from 100 to 255
      - Fixed random password generator in Member::createNewPassword()
      - Fixed BatchProcess to not display an error if no objects could be processed
      - Fixed a bug where a user is redirected incorrectly after logging in
      - Changed temp-folder selection to not leave temp files lying around, and put silverstripe temp files into a silverstripe-cache folder
      - Made guid of PageComments in rss feed unique
      - Removed duplicate XML class
      - Fixed bugs caused by missing html elements
      - Fixed code to remove need for short_open_tag
      - Fixed FileSize generation for sizes of just over 1 meg
      - only show $messageBlock in FormField::FieldHolder() if $Message is existing
      - fixed rightTitle and id in FormField::FieldHolder()
      - Fixed ?isDev=1 mode
      - Set default of sendWarnings on Debug::send_errors_to
      - Fixed formatting of error emails sent from ajax requests
      - Removed debug plumbing from the results of Debug::backtrace()
      - Simplified return data of htmlEmail, an inconsequential internal optimisation
      - Create assets folder if it doesn't exist when uploading a file
      - Fixed bug in SiteTree::NestedTitle()
      - Don't append /home to the home page URL
      - Small fix for windows installations
      - Fixed efficiency problems in Versioned::get_latest_version
      - Fixed File::sync(), to let it recurse into new directories in a single execution
      - Fixed bug with getting form action that was breaking form submission and complextablefield pop-up
      - Fixed SQLMap iteration
      - Simplified EmailField validation error message
      - Fixed some bugs in the debug emailer
      - Reduced amount of ajax-refetching that the TreeSelectorFields do
      - Fix macron support in reports
      - Improved debug message (remove big blocks of redundant data)
      - Allow for the disabling of default buttons. Apply this to CMSMain and GenericDataAdmin in the administration, so that we don't default to clicking the *DELETE* button.
      - Added default value to first arg of permissionFailure(); it's not actually used!
      - Improved handling of EditableFormFields on new UserDefinedForms
      - Improved search results message shown on first load
      - Made calendar control register a date change when the calendar is used
      - Set some good defaults in DataObjectSet::TotalPages() if they have not been set
      - Changes to support forum
      - Require authenficiation to do a db/build on live sites
      - Close directories before trying to remove them
      - Fixed a bug where CheckboxSetField wouldn't save if there was a method the same as the field name
      - Fix multiple "broken" in class attribute of HTML Content
      - Fixed bug with TreeDropdownField when you clicked the expand link 3 or more times, it wouldn't close
      - Fixed bug when editing properties of new text fields
      - Fixed duplicate of UserDefinedForm objects
  - JSParty
      - Fixed a bug where you couldn't always edit the bottom of an WYSIWYG editor field
      - Ensure that WYSIWYG context menu always appears on the screen
      - Javascript performance improvements
      - Fix weird bug in behaviour to do with class.applyToChildren
      - Improved console.log alternative
  
Installer
  - Added option of installing either the default template, or the tutorial template
  - mod_rewrite check now works with http authentification
  - Workaround for 'URL file-access is disabled in the server configuration' using curl for mod_rewrite test
  - Better error message if the installer can't detect the web server
  - Added an alternative .htaccess configuration
  - Less file permissions required by the installer
  - Made deleting the installer files more prominent, it now deletes all the installations files, not just php.
  - MySQL password is now a hidden field.


2.0.1 (17 Apr 2007)

New Features
  - Improved layout of UserDefinedForm submissions in CMS
  - Don't show name field on root folder in Assets section

Developer Tools
  - Mime types fallback for servers don't have /etc/mime.types
  - mb_string module is now an optional dependency
  - Added strong_create method to Object, as useCustomClass was not working correctly

Bug Fixes
  - Sapphire
      - Text->FirstParagraph() now only shows the first paragraph
      - Fixed HTMLText->Summary()
      - Fixed layout issues on IE7 for TreeDropdownField
      - Don't show Akismet errors to user
      - Removed overloaded MemberTableField->sourceItems() that was causing problems
      - Fixed UserDefinedForm submission emails
      - Fixed UserDefinedForm permissions
      - If a file extension doesn't have a maximum upload size associated with it, then allow uploads of any size
      - Fixed a bug with the TreeMultiselectField that prevented it from displaying the checkboxes
      - Made Scheduled tasks concrete so they can be instantiated
      - TableField fixes
      - Fixed security vunerability in search
      - GD::color_web2gd() was using incorrect substr
      - Fixed last link css
      - Fixed duplicate checkbox fields in UserDefinedForm
      - Fixed css in UserDefinedForm
  - CMS
      - Fixed sizing of tabs in CMS
      - Fixed popup for single asset in Files & Images section
      - Fixed link to CMS on default homepage
      - Fixed permissions table in Security section
      - Fixed el no properties error in IE
      - Pressing the flash button a second time now hides the dropdown

Installer
  - Fixed MySQL version check
  - Merge with existing .htaccess file
  - Test that mod_rewrite is working
  - Added option to delete installer files after successful install
  - Fixed PHP4 parse error so installer loads and shows correct error message
  - Apache test passes if apache is used but apache php functions are not available
  - SilverStripe needs at least PHP version 5.0.4

2.0.0 (3 Feb 2007)
  - Initial release