From 9d78eb7fe6f63eb1b630a032b2fba03eaa07b569 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Fri, 24 Oct 2014 13:43:39 +1300 Subject: [PATCH 01/84] BUG Fix BasicAuth not resetting failed login counts on authentication --- security/Member.php | 15 ++++++++++++--- security/MemberAuthenticator.php | 2 ++ tests/security/BasicAuthTest.php | 33 +++++++++++++++++++++++++++----- tests/security/BasicAuthTest.yml | 28 +++++++++++++++------------ 4 files changed, 58 insertions(+), 20 deletions(-) diff --git a/security/Member.php b/security/Member.php index 19f9c4292..8e7262f1d 100644 --- a/security/Member.php +++ b/security/Member.php @@ -463,9 +463,7 @@ class Member extends DataObject implements TemplateGlobalProvider { } // Clear the incorrect log-in count - if(self::config()->lock_out_after_incorrect_logins) { - $this->FailedLoginCount = 0; - } + $this->registerSuccessfulLogin(); // Don't set column if its not built yet (the login might be precursor to a /dev/build...) if(array_key_exists('LockedOutUntil', DB::fieldList('Member'))) { @@ -1560,6 +1558,17 @@ class Member extends DataObject implements TemplateGlobalProvider { } } } + + /** + * Tell this member that a successful login has been made + */ + public function registerSuccessfulLogin() { + if(self::config()->lock_out_after_incorrect_logins) { + // Forgive all past login failures + $this->FailedLoginCount = 0; + $this->write(); + } + } /** * Get the HtmlEditorConfig for this user to be used in the CMS. diff --git a/security/MemberAuthenticator.php b/security/MemberAuthenticator.php index cf96e5e25..4fa72b8cd 100644 --- a/security/MemberAuthenticator.php +++ b/security/MemberAuthenticator.php @@ -73,6 +73,8 @@ class MemberAuthenticator extends Authenticator { if(!$success) { if($member) $member->registerFailedLogin(); if($form) $form->sessionMessage($result->message(), 'bad'); + } else { + if($member) $member->registerSuccessfulLogin(); } return $member; diff --git a/tests/security/BasicAuthTest.php b/tests/security/BasicAuthTest.php index 686db0b50..8be7ce73e 100644 --- a/tests/security/BasicAuthTest.php +++ b/tests/security/BasicAuthTest.php @@ -14,15 +14,14 @@ class BasicAuthTest extends FunctionalTest { parent::setUp(); // Fixtures assume Email is the field used to identify the log in identity - self::$original_unique_identifier_field = Member::config()->unique_identifier_field; + Config::nest(); Member::config()->unique_identifier_field = 'Email'; + Member::config()->lock_out_after_incorrect_logins = 10; } public function tearDown() { + Config::unnest(); parent::tearDown(); - - BasicAuth::protect_entire_site(false); - Member::config()->unique_identifier_field = self::$original_unique_identifier_field; } public function testBasicAuthEnabledWithoutLogin() { @@ -104,7 +103,31 @@ class BasicAuthTest extends FunctionalTest { $_SERVER['PHP_AUTH_USER'] = $origUser; $_SERVER['PHP_AUTH_PW'] = $origPw; } - + + public function testBasicAuthFailureIncreasesFailedLoginCount() { + // Prior to login + $check = Member::get()->filter('Email', 'failedlogin@test.com')->first(); + $this->assertEquals(0, $check->FailedLoginCount); + + // First failed attempt + $_SERVER['PHP_AUTH_USER'] = 'failedlogin@test.com'; + $_SERVER['PHP_AUTH_PW'] = 'test'; + $response = Director::test('BasicAuthTest_ControllerSecuredWithoutPermission'); + $check = Member::get()->filter('Email', 'failedlogin@test.com')->first(); + $this->assertEquals(1, $check->FailedLoginCount); + + // Second failed attempt + $_SERVER['PHP_AUTH_PW'] = 'testwrong'; + $response = Director::test('BasicAuthTest_ControllerSecuredWithoutPermission'); + $check = Member::get()->filter('Email', 'failedlogin@test.com')->first(); + $this->assertEquals(2, $check->FailedLoginCount); + + // successful basic auth should reset failed login count + $_SERVER['PHP_AUTH_PW'] = 'Password'; + $response = Director::test('BasicAuthTest_ControllerSecuredWithoutPermission'); + $check = Member::get()->filter('Email', 'failedlogin@test.com')->first(); + $this->assertEquals(0, $check->FailedLoginCount); + } } class BasicAuthTest_ControllerSecuredWithPermission extends Controller implements TestOnly { diff --git a/tests/security/BasicAuthTest.yml b/tests/security/BasicAuthTest.yml index 4ab8b9441..fe8bd02d4 100644 --- a/tests/security/BasicAuthTest.yml +++ b/tests/security/BasicAuthTest.yml @@ -1,15 +1,19 @@ Group: - mygroup: - Code: mygroup + mygroup: + Code: mygroup Member: - user-in-mygroup: - Email: user-in-mygroup@test.com - Password: test - Groups: =>Group.mygroup - user-without-groups: - Email: user-without-groups@test.com - Password: test + user-in-mygroup: + Email: user-in-mygroup@test.com + Password: test + Groups: =>Group.mygroup + user-without-groups: + Email: user-without-groups@test.com + Password: test + failed-login: + Email: failedlogin@test.com + Password: Password + FailedLoginCount: 0 Permission: - mycode: - Code: MYCODE - Group: =>Group.mygroup \ No newline at end of file + mycode: + Code: MYCODE + Group: =>Group.mygroup From e4ddb4b975fcdeef1e1eeb9d3b4288f10b3fd651 Mon Sep 17 00:00:00 2001 From: Loz Calver Date: Thu, 16 Oct 2014 12:24:10 +0100 Subject: [PATCH 02/84] FIX: Ensure query string in X-Backurl is encoded (fixes #3563) --- admin/javascript/LeftAndMain.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index d60161054..62e3aa9ce 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -515,7 +515,18 @@ jQuery.noConflict(); // Set 'fake' referer - we call pushState() before making the AJAX request, so we have to // set our own referer here if (typeof state.data.__forceReferer !== 'undefined') { - headers['X-Backurl'] = state.data.__forceReferer; + // Ensure query string is properly encoded if present + var url = state.data.__forceReferer; + + try { + // Prevent double-encoding by attempting to decode + url = decodeURI(url); + } catch(e) { + // URL not encoded, or was encoded incorrectly, so do nothing + } finally { + // Set our referer header to the encoded URL + headers['X-Backurl'] = encodeURI(url); + } } contentEls.addClass('loading'); From 8d2727eab614ee477f69682c2d373c927baa832d Mon Sep 17 00:00:00 2001 From: Sean Harvey Date: Wed, 19 Nov 2014 09:56:40 +1300 Subject: [PATCH 03/84] Adding appropriate nginx fastcgi buffer config required for admin --- docs/en/installation/nginx.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/en/installation/nginx.md b/docs/en/installation/nginx.md index 4164f720d..ff0b9c6cd 100644 --- a/docs/en/installation/nginx.md +++ b/docs/en/installation/nginx.md @@ -81,11 +81,14 @@ But enough of the disclaimer, on to the actual configuration — typically in `n } location ~ \.php$ { - fastcgi_keep_conn on; - fastcgi_pass 127.0.0.1:9000; - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - include fastcgi_params; + fastcgi_keep_conn on; + fastcgi_pass 127.0.0.1:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_buffer_size 32k; + fastcgi_busy_buffers_size 64k; + fastcgi_buffers 4 32k; } } From e4db619f8d5344d5c1294de32a12c980ac53efda Mon Sep 17 00:00:00 2001 From: Jonathon Menz Date: Sat, 15 Nov 2014 23:45:50 +1030 Subject: [PATCH 04/84] MINOR: Fix broken 'Insert From CMS' layout Some updates to UploadField styles broke the layout of this form a bit --- admin/css/screen.css | 2 +- admin/scss/_style.scss | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/admin/css/screen.css b/admin/css/screen.css index d6df67684..916b81774 100644 --- a/admin/css/screen.css +++ b/admin/css/screen.css @@ -677,7 +677,7 @@ body.cms-dialog { overflow: auto; background: url("../images/textures/bg_cms_mai .htmleditorfield-mediaform .ss-gridfield table.ss-gridfield-table tr td { padding: 4px; } .htmleditorfield-mediaform .htmleditorfield-from-web .ss-uploadfield .middleColumn, .htmleditorfield-mediaform .htmleditorfield-from-cms .ss-uploadfield .middleColumn { width: auto; background: none; border: none; margin-top: 13px; } .htmleditorfield-mediaform .htmleditorfield-from-cms .ss-uploadfield h4 { float: left; margin-top: 4px; margin-bottom: 0; } -.htmleditorfield-mediaform .htmleditorfield-from-cms .ss-uploadfield .middleColumn { margin-top: 16px; margin-left: 184px; } +.htmleditorfield-mediaform .htmleditorfield-from-cms .ss-uploadfield .middleColumn { margin-top: 16px; margin-left: 184px; min-width: 0; clear: none; } .htmleditorfield-mediaform .htmleditorfield-from-cms .ss-uploadfield .field.treedropdown { border-bottom: 0; padding: 0; } .htmleditorfield-mediaform .ss-assetuploadfield .ss-uploadfield-editandorganize .ss-uploadfield-files .ss-uploadfield-item-info { background-color: #9e9e9e; background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzllOWU5ZSIvPjxzdG9wIG9mZnNldD0iOCUiIHN0b3AtY29sb3I9IiM5ZDlkOWQiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzg3ODc4NyIvPjxzdG9wIG9mZnNldD0iNTQlIiBzdG9wLWNvbG9yPSIjODY4Njg2Ii8+PHN0b3Agb2Zmc2V0PSI5NiUiIHN0b3AtY29sb3I9IiM2YjZiNmIiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2YzZjNmMiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA='); background-size: 100%; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #9e9e9e), color-stop(8%, #9d9d9d), color-stop(50%, #878787), color-stop(54%, #868686), color-stop(96%, #6b6b6b), color-stop(100%, #6c6c6c)); background-image: -moz-linear-gradient(top, #9e9e9e 0%, #9d9d9d 8%, #878787 50%, #868686 54%, #6b6b6b 96%, #6c6c6c 100%); background-image: -webkit-linear-gradient(top, #9e9e9e 0%, #9d9d9d 8%, #878787 50%, #868686 54%, #6b6b6b 96%, #6c6c6c 100%); background-image: linear-gradient(to bottom, #9e9e9e 0%, #9d9d9d 8%, #878787 50%, #868686 54%, #6b6b6b 96%, #6c6c6c 100%); } diff --git a/admin/scss/_style.scss b/admin/scss/_style.scss index 9da06abfc..ed7f7e27e 100644 --- a/admin/scss/_style.scss +++ b/admin/scss/_style.scss @@ -1559,6 +1559,8 @@ body.cms-dialog { .middleColumn { margin-top: $grid-y*2; // same as left-floated h4 margin-left: $grid-x*23; // make room for headline + min-width: 0; // fit within available space + clear: none; // headline and dropdown on same line } .field.treedropdown { border-bottom: 0; // don't show border, dropdown and gridfield visually belong together From ff65f5e00f3558cd5c074a98bbd7b57a500eccba Mon Sep 17 00:00:00 2001 From: Phill Price Date: Wed, 19 Nov 2014 21:29:54 +0000 Subject: [PATCH 05/84] Update csv-import.md Translated the German to English to match up other areas in document --- docs/en/howto/csv-import.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/howto/csv-import.md b/docs/en/howto/csv-import.md index 7ecd8c687..0a77b877c 100644 --- a/docs/en/howto/csv-import.md +++ b/docs/en/howto/csv-import.md @@ -115,7 +115,7 @@ We're going to use our knowledge from the previous example to import a more soph Sample CSV Content - "SpielerNummer","Name","Geburtsdatum","Gruppe" + "Number","Name","Birthday","Team" 11,"John Doe",1982-05-12,"FC Bayern" 12,"Jane Johnson", 1982-05-12,"FC Bayern" 13,"Jimmy Dole",,"Schalke 04" @@ -168,11 +168,11 @@ Sample implementation of a custom loader. Assumes a CSV-file in a certain format public $columnMap = array( 'Number' => 'PlayerNumber', 'Name' => '->importFirstAndLastName', - 'Geburtsdatum' => 'Birthday', - 'Gruppe' => 'Team.Title', + 'Birthday' => 'Birthday', + 'Team' => 'Team.Title', ); public $duplicateChecks = array( - 'SpielerNummer' => 'PlayerNumber' + 'Number' => 'PlayerNumber' ); public $relationCallbacks = array( 'Team.Title' => array( From 31b5a9dc8641b6cf54ef772e5670a2c678dd1108 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Fri, 21 Nov 2014 17:40:39 +1300 Subject: [PATCH 06/84] API Allow CMS re-authentication to be completely disabled if necessary --- security/CMSSecurity.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/security/CMSSecurity.php b/security/CMSSecurity.php index 8f5ea616b..d0dd00d02 100644 --- a/security/CMSSecurity.php +++ b/security/CMSSecurity.php @@ -14,6 +14,14 @@ class CMSSecurity extends Security { 'success' ); + /** + * Enable in-cms reauthentication + * + * @var boolean + * @config + */ + private static $reauth_enabled = true; + public function init() { parent::init(); @@ -140,6 +148,9 @@ PHP * @return bool */ public static function enabled() { + // Disable shortcut + if(!static::config()->reauth_enabled) return false; + // Count all cms-supported methods $authenticators = Authenticator::get_authenticators(); foreach($authenticators as $authenticator) { From ff67b5ba849e55f2bfa70e1665038e856e7ebd42 Mon Sep 17 00:00:00 2001 From: Phill Price Date: Sat, 22 Nov 2014 21:01:08 +0000 Subject: [PATCH 07/84] Update DropdownField.php Update to DropdownField::create, and in one instance set the Empty Title on the instantiation, rather than afterwards. --- forms/DropdownField.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forms/DropdownField.php b/forms/DropdownField.php index b49872877..6edfcae19 100644 --- a/forms/DropdownField.php +++ b/forms/DropdownField.php @@ -13,8 +13,8 @@ * * public function getCMSFields() { * $fields = parent::getCMSFields(); - * $field = DropdownField::create('GalleryID', 'Gallery', Gallery::get()->map('ID', 'Title')); - * $field->setEmptyString('(Select one)'); + * $field = DropdownField::create('GalleryID', 'Gallery', Gallery::get()->map('ID', 'Title')) + * ->setEmptyString('(Select one)'); * $fields->addFieldToTab('Root.Content', $field, 'Content'); * * @@ -33,7 +33,7 @@ * * Example instantiation: * - * new DropdownField( + * DropdownField::create( * 'Country', * 'Country', * array( @@ -59,7 +59,7 @@ * * Field construction: * - * new DropdownField( + * DropdownField::create( * 'Country', * 'Country', * singleton('MyObject')->dbObject('Country')->enumValues() From 90a7761394b6475a84565e35491ca1af9b34b739 Mon Sep 17 00:00:00 2001 From: Gabriele Brosulo Date: Mon, 24 Nov 2014 10:50:38 +0100 Subject: [PATCH 08/84] Update datamodel.md Syntax error --- docs/en/topics/datamodel.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/topics/datamodel.md b/docs/en/topics/datamodel.md index 5ddc5eaa4..603a08e94 100755 --- a/docs/en/topics/datamodel.md +++ b/docs/en/topics/datamodel.md @@ -289,7 +289,7 @@ start with S, who has logged in since 1/1/2011. :::php $members = Member::get()->filter(array( - 'FirstName:StartsWith:not' => 'S' + 'FirstName:StartsWith:not' => 'S', 'LastVisited:GreaterThan' => '2011-01-01' )); From a622fce07338e2eae90764477bb96e420e3a3d8a Mon Sep 17 00:00:00 2001 From: Ben Dubuisson Date: Wed, 26 Nov 2014 11:43:49 +1300 Subject: [PATCH 09/84] Update 5-dataobject-relationship-management.md typos --- docs/en/tutorials/5-dataobject-relationship-management.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/tutorials/5-dataobject-relationship-management.md b/docs/en/tutorials/5-dataobject-relationship-management.md index feea33d67..312a0dc32 100644 --- a/docs/en/tutorials/5-dataobject-relationship-management.md +++ b/docs/en/tutorials/5-dataobject-relationship-management.md @@ -98,7 +98,7 @@ The restriction is enforced through the `$allowed_children` directive. } You might have noticed that we don't specify the relationship -to a project. That's because its already inherited from the parent implementation, +to a project. That's because it's already inherited from the parent implementation, as part of the normal page hierarchy in the CMS. Now that we have created our `ProjectsHolder` and `Project` page types, we'll add some content. @@ -113,7 +113,7 @@ and collect those within a `ProjectsHolder`. But what about creating `Student` records? Since students are related to a single project, we will -allow editing them right the on the CMS interface in the `Project` page type. +allow editing them right on the CMS interface in the `Project` page type. We do this through a powerful field called `[GridField](/reference/grid-field)`. All customization to fields for a page type are managed through a method called `getCMSFields()`, so let's add it there: From 01989aac4e42cc6547c72576b276e017c3d2a8f5 Mon Sep 17 00:00:00 2001 From: Jonathon Menz Date: Tue, 25 Nov 2014 10:27:42 +1030 Subject: [PATCH 10/84] FIX: Manifest flushing Fixes silverstripe/silverstripe-framework#2325 Fixes silverstripe/silverstripe-framework#3093 Static manifest was not being flushed during a dev/build on some environments (without ?flush in URL) and template manifest was never being flushed during a dev/build. --- core/Core.php | 13 +++++++------ core/manifest/TemplateManifest.php | 9 +++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/core/Core.php b/core/Core.php index 13f15a0b4..df2c7f802 100644 --- a/core/Core.php +++ b/core/Core.php @@ -95,9 +95,9 @@ Injector::set_inst($injector); // Regenerate the manifest if ?flush is set, or if the database is being built. // The coupling is a hack, but it removes an annoying bug where new classes // referenced in _config.php files can be referenced during the build process. -$flush = (isset($_GET['flush']) || isset($_REQUEST['url']) && ( - $_REQUEST['url'] == 'dev/build' || $_REQUEST['url'] == BASE_URL . '/dev/build' -)); +$requestURL = isset($_REQUEST['url']) ? trim($_REQUEST['url'], '/') : false; +$flush = (isset($_GET['flush']) || $requestURL == 'dev/build' || $requestURL == BASE_URL . '/dev/build'); + global $manifest; $manifest = new SS_ClassManifest(BASE_PATH, false, $flush); @@ -111,16 +111,17 @@ if(file_exists(BASE_PATH . '/vendor/autoload.php')) { require_once BASE_PATH . '/vendor/autoload.php'; } -// Now that the class manifest is up, load the configuration +// Now that the class manifest is up, load the static configuration $configManifest = new SS_ConfigStaticManifest(BASE_PATH, false, $flush); Config::inst()->pushConfigStaticManifest($configManifest); -// Now that the class manifest is up, load the configuration +// And then the yaml configuration $configManifest = new SS_ConfigManifest(BASE_PATH, false, $flush); Config::inst()->pushConfigYamlManifest($configManifest); +// Load template manifest SS_TemplateLoader::instance()->pushManifest(new SS_TemplateManifest( - BASE_PATH, project(), false, isset($_GET['flush']) + BASE_PATH, project(), false, $flush )); // If in live mode, ensure deprecation, strict and notices are not reported diff --git a/core/manifest/TemplateManifest.php b/core/manifest/TemplateManifest.php index 5e9f4a10c..7a7649482 100644 --- a/core/manifest/TemplateManifest.php +++ b/core/manifest/TemplateManifest.php @@ -16,7 +16,6 @@ class SS_TemplateManifest { protected $cacheKey; protected $project; protected $inited; - protected $forceRegen; protected $templates = array(); /** @@ -39,8 +38,10 @@ class SS_TemplateManifest { $this->cache = new $cacheClass('templatemanifest'.($includeTests ? '_tests' : '')); $this->cacheKey = $this->getCacheKey($includeTests); - - $this->forceRegen = $forceRegen; + + if ($forceRegen) { + $this->regenerate(); + } } /** @@ -208,7 +209,7 @@ class SS_TemplateManifest { } protected function init() { - if (!$this->forceRegen && $data = $this->cache->load($this->cacheKey)) { + if ($data = $this->cache->load($this->cacheKey)) { $this->templates = $data; $this->inited = true; } else { From efd978074c06c04c2b1b7b55c4ab26da2141ab6c Mon Sep 17 00:00:00 2001 From: Ben Dubuisson Date: Wed, 26 Nov 2014 14:37:33 +1300 Subject: [PATCH 11/84] Update 5-dataobject-relationship-management.md Some more typos, sorry didn't pick them all up at the same time! --- docs/en/tutorials/5-dataobject-relationship-management.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/tutorials/5-dataobject-relationship-management.md b/docs/en/tutorials/5-dataobject-relationship-management.md index 312a0dc32..61ddb7abc 100644 --- a/docs/en/tutorials/5-dataobject-relationship-management.md +++ b/docs/en/tutorials/5-dataobject-relationship-management.md @@ -148,10 +148,10 @@ All customization to fields for a page type are managed through a method called } This creates a tabular field, which lists related student records, one row at a time. -Its empty by default, but you can add new students as required, +It's empty by default, but you can add new students as required, or relate them to the project by typing in the box above the table. -In our case, want to manage those records, edit their details, and add new ones. +In our case, we want to manage those records, edit their details, and add new ones. To accomplish this, we have added a specific `[api:GridFieldConfig]`. While we could've built the config from scratch, there's several preconfigured instances. The `GridFieldConfig_RecordEditor` default configures @@ -184,7 +184,7 @@ Once you have added all the students, and selected their projects, it should loo Now we have a fairly good picture of how students relate to their projects. But students generally have somebody looking them over the shoulder. In our case, that's the "mentor". Each project can have many of them, -and each mentor can be have one or more projects. They're busy guys! +and each mentor can have one or more projects. They're busy guys! This is called a *many-many* relationship. The first step is to create the `Mentor` object and set the relation with the `Project` page type. @@ -270,7 +270,7 @@ which lists all projects, and condenses their student and mentor relationships into a single line. You'll notice that there's no difference between accessing a "has-many" and "many-many" relationship -in the template loops: To the template, its just +in the template loops: to the template, it's just a named list of object. ![tutorial:tutorial5_projects_table.jpg](_images/tutorial5_projects_table.jpg) From 514098c01a29093fe0127d964e6b7e84f7c18a7d Mon Sep 17 00:00:00 2001 From: Ben Dubuisson Date: Wed, 26 Nov 2014 16:32:57 +1300 Subject: [PATCH 12/84] Update member.md small typo --- docs/en/reference/member.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/reference/member.md b/docs/en/reference/member.md index 7a5d818b3..6693a7ff6 100644 --- a/docs/en/reference/member.md +++ b/docs/en/reference/member.md @@ -41,7 +41,7 @@ This is the least desirable way of extending the `[api:Member]` class. It's bett (see below). -You can defined subclasses of `[api:Member]` to add extra fields or functionality to the built-in membership system. +You can define subclasses of `[api:Member]` to add extra fields or functionality to the built-in membership system. :::php class MyMember extends Member { @@ -128,4 +128,4 @@ things, you should add appropriate `[api:Permission::checkMember()]` calls to th ## API Documentation -`[api:Member]` \ No newline at end of file +`[api:Member]` From 9a7686c8b9c79c42922fb74801829471234c9314 Mon Sep 17 00:00:00 2001 From: Antony Thorpe Date: Thu, 27 Nov 2014 08:06:00 +1300 Subject: [PATCH 13/84] Update docs/en/reference/index.md GridField line included twice --- docs/en/reference/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/en/reference/index.md b/docs/en/reference/index.md index f9fa9d162..b2763c29f 100644 --- a/docs/en/reference/index.md +++ b/docs/en/reference/index.md @@ -5,7 +5,6 @@ Reference articles complement our auto-generated [API docs](http://api.silverstr * [BBCode](bbcode): Extensible shortcode syntax * [CMS Architecture](cms-architecture): A quick run down to get you started with creating your own data management interface * [ComplexTableField](complextablefield): Manage records and their relations inside the CMS -* [GridField](grid-field): The GridField is a flexible form field for creating tables of data. * [Database Structure](database-structure): Conventions and best practices for database tables and fields * [DataExtension](dataextension): A "mixin" system allowing to extend core classes * [DataObject](dataobject): Base class for database records From e30a354076c6ad2f218ef72fe4bfa74a1dccbaef Mon Sep 17 00:00:00 2001 From: Ben Dubuisson Date: Thu, 27 Nov 2014 09:25:43 +1300 Subject: [PATCH 14/84] Update access-control.md small typo --- docs/en/topics/access-control.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/topics/access-control.md b/docs/en/topics/access-control.md index 15f93b74d..e6c5a2918 100644 --- a/docs/en/topics/access-control.md +++ b/docs/en/topics/access-control.md @@ -8,7 +8,7 @@ site you have to figure this stuff out, and it's not entirely obvious. There are a number of ways to restrict access in SilverStripe. In the security tab in the CMS you can create groups that have access to certain parts. The options can be found on the [permissions](/reference/permission) documentation. -Once you have groups, you can set access for each page for a particular groups. This can be: +Once you have groups, you can set access for each page for a particular group. This can be: * anyone; * any person who is logged in; * a specific group. From 7384d011e93aa22ab283782de12b33b0d77b4ef7 Mon Sep 17 00:00:00 2001 From: micmania1 Date: Mon, 24 Nov 2014 22:45:21 +0000 Subject: [PATCH 15/84] FIX DataDifferencer was trying to compare fields, even if the fields didn't exist causing an error. --- model/DataDifferencer.php | 45 +++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/model/DataDifferencer.php b/model/DataDifferencer.php index 314847d65..36c0b4643 100644 --- a/model/DataDifferencer.php +++ b/model/DataDifferencer.php @@ -77,28 +77,33 @@ class DataDifferencer extends ViewableData { $diffed = clone $this->toRecord; $fields = array_keys($this->toRecord->toMap()); } - - $hasOnes = $this->fromRecord->has_one(); - + + $hasOnes = array_merge($this->fromRecord->has_one(), $this->toRecord->has_one()); + // Loop through properties foreach($fields as $field) { if(in_array($field, $this->ignoredFields)) continue; if(in_array($field, array_keys($hasOnes))) continue; - + if(!$this->fromRecord) { $diffed->setField($field, "" . $this->toRecord->$field . ""); - } else if($this->fromRecord->$field != $this->toRecord->$field) { + } else if($this->fromRecord->$field != $this->toRecord->$field) { $diffed->setField($field, Diff::compareHTML($this->fromRecord->$field, $this->toRecord->$field)); } } - + // Loop through has_one foreach($hasOnes as $relName => $relSpec) { if(in_array($relName, $this->ignoredFields)) continue; - + + // Create the actual column name $relField = "{$relName}ID"; - $relObjTo = $this->toRecord->$relName(); - + $toTitle = ''; + if($this->toRecord->hasMethod($relName)) { + $relObjTo = $this->toRecord->$relName(); + $toTitle = $relObjTo->hasMethod('Title') || $relObjTo->hasField('Title') ? $relObjTo->Title : ''; + } + if(!$this->fromRecord) { if($relObjTo) { if($relObjTo instanceof Image) { @@ -107,28 +112,32 @@ class DataDifferencer extends ViewableData { // not playing nice with mocked images $diffed->setField($relName, "" . $relObjTo->getTag() . ""); } else { - $diffed->setField($relField, "" . $relObjTo->Title() . ""); + $diffed->setField($relField, "" . $toTitle . ""); } } } else if($this->fromRecord->$relField != $this->toRecord->$relField) { - $relObjFrom = $this->fromRecord->$relName(); - if($relObjFrom instanceof Image) { + $fromTitle = ''; + if($this->fromRecord->hasMethod($relName)) { + $relObjFrom = $this->fromRecord->$relName(); + $fromTitle = $relObjFrom->hasMethod('Title') || $relObjFrom->hasField('Title') ? $relObjFrom->Title : ''; + } + if(isset($relObjFrom) && $relObjFrom instanceof Image) { // TODO Use CMSThumbnail (see above) $diffed->setField( - // Using relation name instead of database column name, because of FileField etc. - $relName, + // Using relation name instead of database column name, because of FileField etc. + $relName, Diff::compareHTML($relObjFrom->getTag(), $relObjTo->getTag()) ); } else { + // Set the field. $diffed->setField( - $relField, - Diff::compareHTML($relObjFrom->getTitle(), $relObjTo->getTitle()) + $relField, + Diff::compareHTML($fromTitle, $toTitle) ); } - } } - + return $diffed; } From 1cd54e6bdca552a3d63b3eeb97dc5d2622bd50b2 Mon Sep 17 00:00:00 2001 From: JorisDebonnet Date: Sat, 29 Nov 2014 22:30:11 +0100 Subject: [PATCH 16/84] Update Member.Email from 256 to 254 length Fixes #3074 --- security/Member.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security/Member.php b/security/Member.php index 19f9c4292..6f7057642 100644 --- a/security/Member.php +++ b/security/Member.php @@ -30,7 +30,7 @@ class Member extends DataObject implements TemplateGlobalProvider { private static $db = array( 'FirstName' => 'Varchar', 'Surname' => 'Varchar', - 'Email' => 'Varchar(256)', // See RFC 5321, Section 4.5.3.1.3. + 'Email' => 'Varchar(254)', // See RFC 5321, Section 4.5.3.1.3. (256 minus the < and > character) 'TempIDHash' => 'Varchar(160)', // Temporary id used for cms re-authentication 'TempIDExpired' => 'SS_Datetime', // Expiry of temp login 'Password' => 'Varchar(160)', From 54f837159aabdfad551bb1098aa029c929a0c37f Mon Sep 17 00:00:00 2001 From: Daniel Hensby Date: Tue, 2 Dec 2014 15:13:55 +0000 Subject: [PATCH 17/84] Adding .editorconfig file --- .editorconfig | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..8b8edb1d7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# For more information about the properties used in +# this file, please see the EditorConfig documentation: +# http://editorconfig.org/ + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_size = 2 +indent_style = space From 1f4f5e68ba9ae237bab837d2717532dddb0119d4 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 2 Sep 2014 09:14:08 +1200 Subject: [PATCH 18/84] BUG Fix versioned Versioned is not writing Version to _version tables for subclasses of Version dataobjects which have their own DB fields - Fix disjoint of ID / RecordID (which should be the same) - Fix calculation of new record version - Fix use of empty vs !isset to check for existing version Conflicts: model/Versioned.php tests/model/VersionedTest.php Cherry picked from commit c140459ac624738630ac8bec6a665fa3040e2e54 --- model/Versioned.php | 27 ++++----- tests/model/VersionedTest.php | 105 +++++++++++++++++++++++++++++++++- 2 files changed, 115 insertions(+), 17 deletions(-) diff --git a/model/Versioned.php b/model/Versioned.php index 8db06e8d0..6dbfe57e1 100644 --- a/model/Versioned.php +++ b/model/Versioned.php @@ -553,11 +553,9 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { unset($manipulation[$table]); continue; } - $id = $manipulation[$table]['id'] ? $manipulation[$table]['id'] : $manipulation[$table]['fields']['ID'];; - if(!$id) user_error("Couldn't find ID in " . var_export($manipulation[$table], true), E_USER_ERROR); + $rid = $manipulation[$table]['id'] ? $manipulation[$table]['id'] : $manipulation[$table]['fields']['ID'];; + if(!$rid) user_error("Couldn't find ID in " . var_export($manipulation[$table], true), E_USER_ERROR); - $rid = isset($manipulation[$table]['RecordID']) ? $manipulation[$table]['RecordID'] : $id; - $newManipulation = array( "command" => "insert", "fields" => isset($manipulation[$table]['fields']) ? $manipulation[$table]['fields'] : null @@ -569,9 +567,9 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { // If we haven't got a version #, then we're creating a new version. // Otherwise, we're just copying a version to another table - if(!isset($manipulation[$table]['fields']['Version'])) { + if(empty($manipulation[$table]['fields']['Version'])) { // Add any extra, unchanged fields to the version record. - $data = DB::query("SELECT * FROM \"$table\" WHERE \"ID\" = $id")->record(); + $data = DB::query("SELECT * FROM \"$table\" WHERE \"ID\" = $rid")->record(); if($data) foreach($data as $k => $v) { if (!isset($newManipulation['fields'][$k])) { $newManipulation['fields'][$k] = "'" . Convert::raw2sql($v) . "'"; @@ -583,15 +581,15 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { unset($newManipulation['fields']['ID']); // Create a new version # - if (isset($version_table[$table])) $nextVersion = $version_table[$table]; - else unset($nextVersion); - - if($rid && !isset($nextVersion)) { + $nextVersion = 0; + if($rid) { $nextVersion = DB::query("SELECT MAX(\"Version\") + 1 FROM \"{$baseDataClass}_versions\"" . " WHERE \"RecordID\" = $rid")->value(); } + $nextVersion = $nextVersion ?: 1; - $newManipulation['fields']['Version'] = $nextVersion ? $nextVersion : 1; + // Add the version number to this data + $newManipulation['fields']['Version'] = $nextVersion; if($isRootClass) { $userID = (Member::currentUser()) ? Member::currentUser()->ID : 0; @@ -601,10 +599,7 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { $manipulation["{$table}_versions"] = $newManipulation; - - // Add the version number to this data - $manipulation[$table]['fields']['Version'] = $newManipulation['fields']['Version']; - $version_table[$table] = $nextVersion; + $manipulation[$table]['fields']['Version'] = $nextVersion; } // Putting a Version of -1 is a signal to leave the version table alone, despite their being no version @@ -627,7 +622,7 @@ class Versioned extends DataExtension implements TemplateGlobalProvider { ) { // If the record has already been inserted in the (table), get rid of it. if($manipulation[$table]['command']=='insert') { - DB::query("DELETE FROM \"{$table}\" WHERE \"ID\"='$id'"); + DB::query("DELETE FROM \"{$table}\" WHERE \"ID\"='$rid'"); } $newTable = $table . '_' . Versioned::current_stage(); diff --git a/tests/model/VersionedTest.php b/tests/model/VersionedTest.php index f2a1f9183..864e59463 100644 --- a/tests/model/VersionedTest.php +++ b/tests/model/VersionedTest.php @@ -11,6 +11,7 @@ class VersionedTest extends SapphireTest { protected $extraDataObjects = array( 'VersionedTest_DataObject', 'VersionedTest_Subclass', + 'VersionedTest_AnotherSubclass', 'VersionedTest_RelatedWithoutVersion', 'VersionedTest_SingleStage' ); @@ -18,7 +19,7 @@ class VersionedTest extends SapphireTest { protected $requiredExtensions = array( "VersionedTest_DataObject" => array('Versioned') ); - + public function testDeletingOrphanedVersions() { $obj = new VersionedTest_Subclass(); $obj->ExtraField = 'Foo'; // ensure that child version table gets written @@ -586,6 +587,98 @@ class VersionedTest extends SapphireTest { $this->assertEquals('Stage.Live', Versioned::get_reading_mode()); } + /** + * Ensures that the latest version of a record is the expected value + * + * @param type $record + * @param type $version + */ + protected function assertRecordHasLatestVersion($record, $version) { + foreach(ClassInfo::ancestry(get_class($record), true) as $table) { + $versionForClass = DB::query( + sprintf("SELECT MAX(\"Version\") FROM \"{$table}_versions\" WHERE \"RecordID\" = %d", + $record->ID) + )->value(); + $this->assertEquals($version, $versionForClass, "That the table $table has the latest version $version"); + } + } + + /** + * Tests that multi-table dataobjects are correctly versioned + */ + public function testWriteToStage() { + // Test subclass with versioned extension directly added + $record = VersionedTest_Subclass::create(); + $record->Title = "Test A"; + $record->ExtraField = "Test A"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 1); + $record->publish("Stage", "Live"); + $this->assertRecordHasLatestVersion($record, 1); + $record->Title = "Test A2"; + $record->ExtraField = "Test A2"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 2); + + // Test subclass without changes to base class + $record = VersionedTest_Subclass::create(); + $record->ExtraField = "Test B"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 1); + $record->publish("Stage", "Live"); + $this->assertRecordHasLatestVersion($record, 1); + $record->ExtraField = "Test B2"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 2); + + // Test subclass without changes to sub class + $record = VersionedTest_Subclass::create(); + $record->Title = "Test C"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 1); + $record->publish("Stage", "Live"); + $this->assertRecordHasLatestVersion($record, 1); + $record->Title = "Test C2"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 2); + + // Test subclass with versioned extension only added to the base clases + $record = VersionedTest_AnotherSubclass::create(); + $record->Title = "Test A"; + $record->AnotherField = "Test A"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 1); + $record->publish("Stage", "Live"); + $this->assertRecordHasLatestVersion($record, 1); + $record->Title = "Test A2"; + $record->AnotherField = "Test A2"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 2); + + + // Test subclass without changes to base class + $record = VersionedTest_AnotherSubclass::create(); + $record->AnotherField = "Test B"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 1); + $record->publish("Stage", "Live"); + $this->assertRecordHasLatestVersion($record, 1); + $record->AnotherField = "Test B2"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 2); + + // Test subclass without changes to sub class + $record = VersionedTest_AnotherSubclass::create(); + $record->Title = "Test C"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 1); + $record->publish("Stage", "Live"); + $this->assertRecordHasLatestVersion($record, 1); + $record->Title = "Test C2"; + $record->writeToStage("Stage"); + $this->assertRecordHasLatestVersion($record, 2); + } + } @@ -644,6 +737,16 @@ class VersionedTest_Subclass extends VersionedTest_DataObject implements TestOnl ); } +/** + * @package framework + * @subpackage tests + */ +class VersionedTest_AnotherSubclass extends VersionedTest_DataObject implements TestOnly { + private static $db = array( + "AnotherField" => "Varchar" + ); +} + /** * @package framework * @subpackage tests From 836ea04d90f92c4d3756bd7d1998dafeebbec5be Mon Sep 17 00:00:00 2001 From: Will Rossiter Date: Thu, 4 Dec 2014 12:14:18 +1300 Subject: [PATCH 19/84] Add note about semvar to contributing.md --- CONTRIBUTING.md | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 485fb7c59..63275e317 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,9 +4,24 @@ Any open source product is only as good as the community behind it. You can part See our [high level overview](http://silverstripe.org/contributing-to-silverstripe) on silverstripe.org on how you can help out. -Or, for more detailed guidance, read one of the following pages: +## Contributing to the correct version - * [Sharing your opinion and raising issues](http://doc.silverstripe.org/framework/en/trunk/misc/contributing/issues) - * [Providing code, whether it's creating a feature or fixing a bug](http://doc.silverstripe.org/framework/en/trunk/misc/contributing/code) - * [Writing and translating documentation](http://doc.silverstripe.org/framework/en/trunk/misc/contributing/documentation) - * [Translating user-interface elements](http://doc.silverstripe.org/framework/en/trunk/misc/contributing/translation) \ No newline at end of file +SilverStripe core and module releases (since the 3.1.8 release) follow the [Semantic Versioning](http://semver.org) +(SemVar) specification for releases. Using this specification declares to the entire development community the severity +and intention of each release. It gives developers the ability to safely declare their dependencies and understand the +scope involved in each upgrade. + +Each release is labeled in the format `$MAJOR`.`$MINOR`.`$PATCH`. For example, 3.1.8 or 3.2.0. + +* `$MAJOR` version is incremented if any backwards incompatible changes are introduced to the public API. +* `$MINOR` version is incremented if new, backwards compatible **functionality** is introduced to the public API or + improvements are introduced within the private code. +* `$PATCH` version is incremented if only backwards compatible **bug fixes** are introduced. A bug fix is defined as + an internal change that fixes incorrect behavior. + +Git Branches are setup for each `$MINOR` version (i.e 3.1, 3.2). Each `$PATCH` release is a git tag off the `$MINOR` +branch. For example, 3.1.8 will be a git tag of 3.1.8. + +When contributing code, be aware of the scope of your changes. If your change is backwards incompatible, raise your +change against the `master` branch. The master branch contains the next `$MAJOR` release. If the change is backwards +compatible raise it against the correct `$MINOR` branch. From 22ecab555c05e96a91b08bda6256c07496cdac9a Mon Sep 17 00:00:00 2001 From: Cam Findlay Date: Fri, 21 Nov 2014 12:05:21 +1300 Subject: [PATCH 20/84] DOCS Repositioned house rules and added core commiter list. --- docs/en/misc/contributing/core-commiters.md | 34 +++++++++++++++++++++ docs/en/misc/contributing/index.md | 4 +++ 2 files changed, 38 insertions(+) create mode 100644 docs/en/misc/contributing/core-commiters.md diff --git a/docs/en/misc/contributing/core-commiters.md b/docs/en/misc/contributing/core-commiters.md new file mode 100644 index 000000000..f8dadbe96 --- /dev/null +++ b/docs/en/misc/contributing/core-commiters.md @@ -0,0 +1,34 @@ +# Core Commiters +The core commiters team is reviewed approximately annually, new members are added based on quality contributions to SilverStipe code and outstanding community participation. + +## Core committer team +* [Damian Mooyman](https://github.com/tractorcow/) +* [Daniel Hensby](https://github.com/dhensby) +* [Hamish Friedlander](https://github.com/hafriedlander) +* [Ingo Schommer](https://github.com/chillu) +* [Loz Calver](https://github.com/kinglozzer) +* [Mateusz Uzdowski](https://github.com/mateusz/) +* [Sam Minnée](https://github.com/sminnee) +* [Sean Harvey](https://github.com/halkyon/) +* [Stig Lindqvist](https://github.com/stojg) +* [Will Morgan](https://github.com/willmorgan) +* [Will Rossiter](https://github.com/wilr/) + +## House rules for the core commiter team + +The "core commiters" consist of everybody with write permissions to our codebase. +With great power comes great responsibility, so we have agreed on certain expectations: + + * Be friendly, encouraging and constructive towards other community members + * Frequently review pull requests and new issues (in particular, respond quickly to @mentions) + * Treat issues according to our [issue guidelines](/misc/contributing/issues) + * Don't commit directly to core, raise pull requests instead (except trivial fixes) + * Only merge code you have tested and fully understand. If in doubt, ask for a second opinion. + * Ensure contributions have appropriate [test coverage](/topics/testing), are documented, and pass our [coding conventions](/misc/coding-conventions) + * Keep the codebase "releasable" at all times (check our [release process](/misc/release-process)) + * API changes and non-trivial features should not be merged into release branches. + * API changes on master should not be merged until they have the buy-in of at least two core committers (or better, through the [core mailinglist](https://groups.google.com/forum/#!forum/silverstripe-dev)) + * Be inclusive. Ensure a wide range of SilverStripe developers can obtain an understanding of your code and docs, and you're not the only one who can maintain it. + * Avoid `git push --force`, and be careful with your git remotes (no accidental pushes) + * Use your own forks to create feature branches + diff --git a/docs/en/misc/contributing/index.md b/docs/en/misc/contributing/index.md index 2d9d90412..57fd975af 100644 --- a/docs/en/misc/contributing/index.md +++ b/docs/en/misc/contributing/index.md @@ -14,3 +14,7 @@ Or, for more detailed guidance, read one of the following pages: * [Writing and translating **documentation**](documentation) * [**Translating** user-interface elements](translation) +## House rules for everybody contributing to SilverStripe + * Ask questions on the [forum](http://silverstripe.org/forum), and stick to more high-level discussions on the [core mailinglist](https://groups.google.com/forum/#!forum/silverstripe-dev) + * Make sure you know how to [raise good bug reports](/misc/contributing/issues) + * Everybody can contribute to SilverStripe! If you do, ensure you can [submit solid pull requests](/misc/contributing/code) From 8e27f3c3dc42a8be7b4505fe3c3074f680373ae4 Mon Sep 17 00:00:00 2001 From: Devlin Date: Thu, 4 Dec 2014 15:41:10 +0100 Subject: [PATCH 21/84] MINOR Closing tag in Controller.ss --- templates/Controller.ss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/Controller.ss b/templates/Controller.ss index 579194e12..e58be65b6 100644 --- a/templates/Controller.ss +++ b/templates/Controller.ss @@ -38,7 +38,7 @@
  • doc.silverstripe.org Searchable developer documentation, how-tos, tutorials, and reference.

  • api.silverstripe.org API documentation for PHP classes, methods and properties.

  • -
      +
    <% end_if %> From af47a6332296c7a66627171bcf6d780038e5bad0 Mon Sep 17 00:00:00 2001 From: JorisDebonnet Date: Thu, 4 Dec 2014 21:57:31 +0100 Subject: [PATCH 22/84] File.php: support for MS Office template / macro files Fixes #3692 --- filesystem/File.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/filesystem/File.php b/filesystem/File.php index 286bfae06..822790d5c 100644 --- a/filesystem/File.php +++ b/filesystem/File.php @@ -120,17 +120,17 @@ class File extends DataObject { * Otherwise, the files will be able to be uploaded but they won't be able to be served by the * webserver. * - * - If you are running Apahce you will need to change assets/.htaccess + * - If you are running Apache you will need to change assets/.htaccess * - If you are running IIS you will need to change assets/web.config * * Instructions for the change you need to make are included in a comment in the config file. */ private static $allowed_extensions = array( - '','ace','arc','arj','asf','au','avi','bmp','bz2','cab','cda','css','csv','dmg','doc','docx', + '','ace','arc','arj','asf','au','avi','bmp','bz2','cab','cda','css','csv','dmg','doc','docx','dotx','dotm', 'flv','gif','gpx','gz','hqx','htm','html','ico','jar','jpeg','jpg','js','kml', 'm4a','m4v', 'mid','midi','mkv','mov','mp3','mp4','mpa','mpeg','mpg','ogg','ogv','pages','pcx','pdf','pkg', - 'png','pps','ppt','pptx','ra','ram','rm','rtf','sit','sitx','swf','tar','tgz','tif','tiff', - 'txt','wav','webm','wma','wmv','xhtml','xls','xlsx','xml','zip','zipx', + 'png','pps','ppt','pptx','potx','potm','ra','ram','rm','rtf','sit','sitx','swf','tar','tgz','tif','tiff', + 'txt','wav','webm','wma','wmv','xhtml','xls','xlsx','xltx','xltm','xml','zip','zipx', ); /** From fbebf96d66d71f32766f84ef73a75d8e69910d8c Mon Sep 17 00:00:00 2001 From: Corey Sewell Date: Fri, 28 Nov 2014 08:34:55 +1300 Subject: [PATCH 23/84] Add detection for PHP running in CGI mode and add HTTP_AUTHORIZATION rewrite rule Detect and parse HTTP_AUTHORIZATION for basic authentication running PHP in CGI mode Add comments about using CGI mode with Apache and Basic Auth in /docs/en/topics/environment-management.md Added notes to docs/en/changelogs/3.1.9.md --- dev/install/install.php5 | 3 ++ docs/en/changelogs/3.1.9.md | 14 ++++++ docs/en/topics/environment-management.md | 2 +- security/BasicAuth.php | 58 ++++++++++++++---------- 4 files changed, 51 insertions(+), 26 deletions(-) create mode 100644 docs/en/changelogs/3.1.9.md diff --git a/dev/install/install.php5 b/dev/install/install.php5 index 2785867f7..d57431947 100755 --- a/dev/install/install.php5 +++ b/dev/install/install.php5 @@ -1494,6 +1494,8 @@ HTML; if($base != '.') $baseClause = "RewriteBase '$base'\n"; else $baseClause = ""; + if(strpos(strtolower(php_sapi_name()), "cgi") !== false) $cgiClause = "RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]\n"; + else $cgiClause = ""; $modulePath = FRAMEWORK_NAME; $rewrite = <<When using CGI/FastCGI with Apache, you will have to add the `RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]` rewrite rule to your `.htaccess` file| | `SS_SEND_ALL_EMAILS_TO`| If you set this define, all emails will be redirected to this address.| | `SS_SEND_ALL_EMAILS_FROM`| If you set this define, all emails will be send from this address.| | `SS_ERROR_LOG` | | diff --git a/security/BasicAuth.php b/security/BasicAuth.php index 4ad895ea1..43fa47691 100644 --- a/security/BasicAuth.php +++ b/security/BasicAuth.php @@ -1,13 +1,13 @@ basicAuthEnabled}. - * + * * @package framework * @subpackage security */ @@ -17,15 +17,15 @@ class BasicAuth { * @var Boolean Flag set by {@link self::protect_entire_site()} */ private static $entire_site_protected = false; - + /** * @config * @var String|array Holds a {@link Permission} code that is required - * when calling {@link protect_site_if_necessary()}. Set this value through + * when calling {@link protect_site_if_necessary()}. Set this value through * {@link protect_entire_site()}. */ private static $entire_site_protected_code = 'ADMIN'; - + /** * @config * @var String Message that shows in the authentication box. @@ -35,31 +35,39 @@ class BasicAuth { /** * Require basic authentication. Will request a username and password if none is given. - * + * * Used by {@link Controller::init()}. - * + * * @throws SS_HTTPResponse_Exception - * + * * @param string $realm * @param string|array $permissionCode Optional * @param boolean $tryUsingSessionLogin If true, then the method with authenticate against the * session log-in if those credentials are disabled. - * @return Member $member + * @return Member $member */ public static function requireLogin($realm, $permissionCode = null, $tryUsingSessionLogin = true) { $isRunningTests = (class_exists('SapphireTest', false) && SapphireTest::is_running_test()); if(!Security::database_is_ready() || (Director::is_cli() && !$isRunningTests)) return true; - + + $matches = array(); + if (isset($_SERVER['HTTP_AUTHORIZATION']) && + preg_match('/Basic\s+(.*)$/i', $_SERVER['HTTP_AUTHORIZATION'], $matches)) { + list($name, $password) = explode(':', base64_decode($matches[1])); + $_SERVER['PHP_AUTH_USER'] = strip_tags($name); + $_SERVER['PHP_AUTH_PW'] = strip_tags($password); + } + $member = null; if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { $member = MemberAuthenticator::authenticate(array( - 'Email' => $_SERVER['PHP_AUTH_USER'], + 'Email' => $_SERVER['PHP_AUTH_USER'], 'Password' => $_SERVER['PHP_AUTH_PW'], ), null); } - + if(!$member && $tryUsingSessionLogin) $member = Member::currentUser(); - + // If we've failed the authentication mechanism, then show the login form if(!$member) { $response = new SS_HTTPResponse(null, 401); @@ -70,13 +78,13 @@ class BasicAuth { } else { $response->setBody(_t('BasicAuth.ENTERINFO', "Please enter a username and password.")); } - + // Exception is caught by RequestHandler->handleRequest() and will halt further execution $e = new SS_HTTPResponse_Exception(null, 401); $e->setResponse($response); throw $e; } - + if($permissionCode && !Permission::checkMember($member->ID, $permissionCode)) { $response = new SS_HTTPResponse(null, 401); $response->addHeader('WWW-Authenticate', "Basic realm=\"$realm\""); @@ -84,28 +92,28 @@ class BasicAuth { if(isset($_SERVER['PHP_AUTH_USER'])) { $response->setBody(_t('BasicAuth.ERRORNOTADMIN', "That user is not an administrator.")); } - + // Exception is caught by RequestHandler->handleRequest() and will halt further execution $e = new SS_HTTPResponse_Exception(null, 401); $e->setResponse($response); throw $e; } - + return $member; } - + /** * Enable protection of the entire site with basic authentication. - * + * * This log-in uses the Member database for authentication, but doesn't interfere with the * regular log-in form. This can be useful for test sites, where you want to hide the site * away from prying eyes, but still be able to test the regular log-in features of the site. - * + * * If you are including conf/ConfigureFromEnv.php in your _config.php file, you can also enable * this feature by adding this line to your _ss_environment.php: - * + * * define('SS_USE_BASIC_AUTH', true); - * + * * @param boolean $protect Set this to false to disable protection. * @param String $code {@link Permission} code that is required from the user. * Defaults to "ADMIN". Set to NULL to just require a valid login, regardless @@ -116,11 +124,11 @@ class BasicAuth { Config::inst()->update('BasicAuth', 'entire_site_protected_code', $code); Config::inst()->update('BasicAuth', 'entire_site_protected_message', $message); } - + /** * Call {@link BasicAuth::requireLogin()} if {@link BasicAuth::protect_entire_site()} has been called. * This is a helper function used by {@link Controller::init()}. - * + * * If you want to enabled protection (rather than enforcing it), * please use {@link protect_entire_site()}. */ From 6bdd30c19debeafd7d3564299daef1f96d602a32 Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Tue, 9 Dec 2014 10:38:21 +1300 Subject: [PATCH 24/84] BUG Fix gridfield storing duplicate data in session --- forms/gridfield/GridField.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forms/gridfield/GridField.php b/forms/gridfield/GridField.php index f244c813f..2f4f3a3af 100644 --- a/forms/gridfield/GridField.php +++ b/forms/gridfield/GridField.php @@ -840,7 +840,7 @@ class GridField_FormAction extends FormAction { 'args' => $this->args, ); - $id = preg_replace('/[^\w]+/', '_', uniqid('', true)); + $id = md5(serialize($state)); Session::set($id, $state); $actionData['StateID'] = $id; From fba688018f577751f8023ff912d7438b044ddf45 Mon Sep 17 00:00:00 2001 From: Gordon Anderson Date: Wed, 10 Dec 2014 14:36:45 +0700 Subject: [PATCH 25/84] ENHANCEMENT: Additional extension points for Tiny MCE editing, for when images are regenerated and manipulating the HTML prior to a save --- forms/HtmlEditorField.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/forms/HtmlEditorField.php b/forms/HtmlEditorField.php index c5c32d8c2..246603e83 100644 --- a/forms/HtmlEditorField.php +++ b/forms/HtmlEditorField.php @@ -140,8 +140,15 @@ class HtmlEditorField extends TextareaField { // Add default empty title & alt attributes. if(!$img->getAttribute('alt')) $img->setAttribute('alt', ''); if(!$img->getAttribute('title')) $img->setAttribute('title', ''); + + // Use this extension point to manipulate images inserted using TinyMCE, e.g. add a CSS class, change default title + // $image is the image, $img is the DOM model + $this->extend('processImage', $image, $img); } + // optionally manipulate the HTML after a TinyMCE edit and prior to a save + $this->extend('processHTML', $htmlValue); + // Store into record $record->{$this->name} = $htmlValue->getContent(); } From b5c361a66c3904fef6de0811ce59945280c04549 Mon Sep 17 00:00:00 2001 From: Will Morgan Date: Thu, 11 Dec 2014 15:21:38 +0000 Subject: [PATCH 26/84] FIX: GD - check file exists before getimagesize Use is_readable to check the file exists and is readable --- filesystem/GD.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/filesystem/GD.php b/filesystem/GD.php index a923d86f7..fe4ffe5ce 100644 --- a/filesystem/GD.php +++ b/filesystem/GD.php @@ -38,7 +38,7 @@ class GDBackend extends Object implements Image_Backend { // If we're working with image resampling, things could take a while. Bump up the time-limit increase_time_limit_to(300); - if($filename) { + if($filename && is_readable($filename)) { // We use getimagesize instead of extension checking, because sometimes extensions are wrong. list($width, $height, $type, $attr) = getimagesize($filename); switch($type) { From e9d88dd8ee0cb817024b8176c6f2b85e28f9e166 Mon Sep 17 00:00:00 2001 From: Will Rossiter Date: Sat, 5 Jul 2014 17:59:28 +1200 Subject: [PATCH 27/84] Restructure of the docs markdown source files into more logical taxonomy. Rebased on 3.1 --- .../00_Server_Requirements.md} | 0 .../01_Installation/01_Linux_Unix.md | 24 ++ .../01_Installation/02_Mac_OSX.md} | 0 .../01_Installation/03_Windows.md} | 0 .../Windows_IIS6.md} | 0 .../Windows_IIS7.md} | 0 .../Windows_Platform_Installer.md} | 0 .../01_Installation/05_Common_Problems.md} | 0 .../How_To/Configure_Lighttpd.md} | 0 .../How_To/Configure_Nginx.md} | 0 .../01_Installation/index.md} | 6 +- .../02_Composer.md} | 4 - .../03_Environment_Management.md} | 0 .../04_Directory_Structure.md} | 5 +- .../05_Coding_Conventions.md} | 0 .../index.md | 0 .../01_Building_A_Basic_Site.md} | 6 +- .../02_Extending_A_Basic_Site.md} | 0 .../3-forms.md => 01_Tutorials/03_Forms.md} | 0 .../04_Site_Search.md} | 0 .../05_Dataobject-Relationship_Management.md} | 0 docs/en/{tutorials => 01_Tutorials}/index.md | 0 .../00_Model/01_Page_Types.md} | 0 .../00_Model/02_SiteTree.md} | 0 .../00_Model/03_DataObject.md} | 0 .../00_Model/04_Data_Types_and_Casting.md} | 0 .../00_Model/05_Data_Model_and_ORM.md} | 0 .../00_Model/06_Database_Structure.md} | 0 .../00_Model/07_SQL_Query.md} | 0 .../00_Model/08_Versioning.md} | 0 .../How_To/Dynamic_Default_Fields.md} | 0 .../How_To/Grouping_DataObject_Sets.md} | 0 .../00_Page_Type_Templates.md} | 0 .../01_Templates_and_Views/01_Templates.md} | 0 .../01_Templates_and_Views/02_CSS.md} | 0 .../01_Templates_and_Views/03_Javascript.md} | 0 .../04_Requirements.md} | 0 .../05_Templates_Formal_Syntax.md} | 0 .../01_Templates_and_Views/06_Themes.md} | 0 .../07_Theme_Development.md} | 0 .../How_To/01_Navigation_Menu.md} | 0 .../How_To/02_Pagination.md} | 0 .../02_Controllers/01_Controllers.md} | 0 .../02_Controllers/02_Routing.md | 2 + .../03_Forms/00_Forms.md} | 0 .../03_Forms/01_Form_Field_Types.md} | 0 .../03_Forms/02_DateField.md} | 0 .../03_Forms/03_UploadField.md} | 0 .../03_Forms/04_GridField.md} | 0 .../03_Forms/How_To/Gridfield_Rowaction.md} | 0 .../03_Forms/How_To/Simple_Contact_Form.md} | 0 .../04_Configuration/00_Configuration.md} | 0 .../04_Configuration/01_SiteConfig.md} | 0 .../05_Extending/00_DataExtension.md} | 0 .../05_Extending/01_Modules.md} | 0 .../05_Extending/02_Module_Development.md} | 0 .../05_Extending/03_Rich_Text_Editing.md} | 0 .../05_Extending/04_Shortcodes.md} | 0 .../05_Extending/05_Injector.md} | 0 .../06_Testing/00_Why_Should_I_Test.md} | 0 .../06_Testing/01_PHPUnit_Configuration.md} | 0 .../06_Testing/02_Creating_a_Unit_Test.md} | 0 .../03_Creating_a_Functional_Test.md} | 0 .../06_Testing/04_Fixtures.md} | 0 .../05_Testing_Guide_Troubleshooting.md} | 0 .../06_Testing/06_Glossary.md} | 0 .../06_Testing/How_To/Testing_Email.md} | 0 .../06_Testing}/index.md | 0 .../07_Debugging/00_Debugging.md} | 0 .../07_Debugging/01_Error_Handling.md} | 0 .../07_Debugging/02_URL_Variable_Tools.md} | 0 .../08_Performance/00_Partial_Caching.md} | 0 .../08_Performance/01_Caching.md} | 0 .../08_Performance/02_Cache_Control.md} | 0 .../09_Security/00_Security.md} | 0 .../09_Security/01_Access_Control.md} | 0 .../09_Security/02_Member.md} | 0 .../09_Security/03_Permission.md} | 0 .../09_Security/How_To/Track_Member_Logins.md | 52 ++++ .../10_Email}/email.md | 0 .../00_CSV_Import.md} | 0 .../01_RestfulService.md} | 0 .../11_Migration_Integration/02_RSSFeed.md} | 0 .../12_Search/00_Search.md} | 0 .../12_Search/01_Searchcontext.md} | 0 .../13_i18n}/i18n.md | 0 .../14_Files/00_Files.md} | 0 .../14_Files/01_Image.md} | 0 .../15_Customising_the_CMS/00_Typography.md} | 0 .../15_Customising_the_CMS/01_ModelAdmin.md} | 0 .../15_Customising_the_CMS/03_CMS_Layout.md} | 0 .../15_Customising_the_CMS/04_Preview.md} | 0 .../05_CMS_Architecture.md} | 0 .../How_To/CMS_Alternating_Button.md} | 0 .../How_To/CMS_Formfield_Help_Text.md} | 0 .../How_To/Customise_CMS_Menu.md} | 0 .../How_To/Customise_CMS_Pages_List.md} | 0 .../How_To/Customise_CMS_Tree.md} | 0 .../How_To/Extend_CMS_Interface.md} | 0 .../00_Execution_Pipeline.md} | 0 .../16_Execution_Pipeline/01_Director.md} | 0 .../17_CLI/Command_Line.md} | 0 docs/en/02_Developer_Guides/index.md | 8 + .../00_Upgrading.md} | 0 .../01_Templates_Upgrading_Guide.md} | 0 .../en/{changelogs => 04_Changelogs}/2.0.1.md | 0 .../en/{changelogs => 04_Changelogs}/2.0.2.md | 0 .../en/{changelogs => 04_Changelogs}/2.1.0.md | 0 .../en/{changelogs => 04_Changelogs}/2.1.1.md | 0 .../en/{changelogs => 04_Changelogs}/2.2.0.md | 0 .../en/{changelogs => 04_Changelogs}/2.2.1.md | 0 .../en/{changelogs => 04_Changelogs}/2.2.2.md | 0 .../en/{changelogs => 04_Changelogs}/2.2.3.md | 0 .../en/{changelogs => 04_Changelogs}/2.2.4.md | 0 .../en/{changelogs => 04_Changelogs}/2.3.0.md | 0 .../en/{changelogs => 04_Changelogs}/2.3.1.md | 0 .../{changelogs => 04_Changelogs}/2.3.10.md | 0 .../{changelogs => 04_Changelogs}/2.3.11.md | 0 .../{changelogs => 04_Changelogs}/2.3.12.md | 0 .../{changelogs => 04_Changelogs}/2.3.13.md | 0 .../en/{changelogs => 04_Changelogs}/2.3.2.md | 0 .../en/{changelogs => 04_Changelogs}/2.3.3.md | 0 .../en/{changelogs => 04_Changelogs}/2.3.4.md | 0 .../en/{changelogs => 04_Changelogs}/2.3.5.md | 0 .../en/{changelogs => 04_Changelogs}/2.3.6.md | 0 .../en/{changelogs => 04_Changelogs}/2.3.7.md | 0 .../en/{changelogs => 04_Changelogs}/2.3.8.md | 0 .../en/{changelogs => 04_Changelogs}/2.3.9.md | 0 .../en/{changelogs => 04_Changelogs}/2.4.0.md | 0 .../en/{changelogs => 04_Changelogs}/2.4.1.md | 0 .../{changelogs => 04_Changelogs}/2.4.10.md | 0 .../en/{changelogs => 04_Changelogs}/2.4.2.md | 0 .../en/{changelogs => 04_Changelogs}/2.4.3.md | 0 .../en/{changelogs => 04_Changelogs}/2.4.4.md | 0 .../en/{changelogs => 04_Changelogs}/2.4.5.md | 0 .../en/{changelogs => 04_Changelogs}/2.4.6.md | 0 .../en/{changelogs => 04_Changelogs}/2.4.7.md | 0 .../en/{changelogs => 04_Changelogs}/2.4.8.md | 0 .../en/{changelogs => 04_Changelogs}/3.0.0.md | 0 .../en/{changelogs => 04_Changelogs}/3.0.1.md | 0 .../en/{changelogs => 04_Changelogs}/3.0.2.md | 0 .../en/{changelogs => 04_Changelogs}/3.0.3.md | 0 .../en/{changelogs => 04_Changelogs}/3.0.4.md | 0 .../en/{changelogs => 04_Changelogs}/3.0.5.md | 0 .../en/{changelogs => 04_Changelogs}/3.0.6.md | 0 .../en/{changelogs => 04_Changelogs}/3.0.7.md | 0 .../en/{changelogs => 04_Changelogs}/3.0.8.md | 0 docs/en/04_Changelogs/3.0.9.md | 35 +++ .../en/{changelogs => 04_Changelogs}/3.1.0.md | 0 .../en/{changelogs => 04_Changelogs}/3.1.1.md | 0 .../en/{changelogs => 04_Changelogs}/3.1.2.md | 0 .../en/{changelogs => 04_Changelogs}/3.1.6.md | 0 .../_images/cms22screenie.jpg | Bin .../_images/tab-paths-after.png | Bin .../_images/tab-paths-before.png | Bin .../_images/tab-paths-customtab.png | Bin .../alpha/2.4.0-alpha1.md | 0 .../alpha/3.0.0-alpha1.md | 0 .../alpha/3.0.0-alpha2.md | 0 .../beta/2.4.0-beta1.md | 0 .../beta/2.4.0-beta2.md | 0 .../beta/3.0.0-beta1.md | 0 .../beta/3.0.0-beta2.md | 0 .../beta/3.0.0-beta3.md | 0 .../beta/3.1.0-beta1.md | 0 .../beta/3.1.0-beta2.md | 0 .../beta/3.1.0-beta3.md | 0 .../en/{changelogs => 04_Changelogs}/index.md | 0 .../pr/3.0.0-pr1.md | 0 .../rc/2.3.11-rc1.md | 0 .../rc/2.3.8-rc1.md | 0 .../rc/2.4.0-rc1.md | 0 .../rc/2.4.0-rc2.md | 0 .../rc/2.4.0-rc3.md | 0 .../rc/2.4.1-rc1.md | 0 .../rc/2.4.1-rc2.md | 0 .../rc/2.4.2-rc1.md | 0 .../rc/2.4.2-rc2.md | 0 .../rc/2.4.3-rc1.md | 0 .../rc/2.4.3-rc2.md | 0 .../rc/2.4.4-rc1.md | 0 .../rc/2.4.4-rc2.md | 0 .../rc/2.4.5-rc1.md | 0 .../rc/2.4.8-rc1.md | 0 .../rc/3.0.0-rc1.md | 0 .../rc/3.0.0-rc2.md | 0 .../rc/3.0.0-rc3.md | 0 .../rc/3.0.1-rc1.md | 0 .../rc/3.0.1-rc2.md | 0 .../rc/3.0.1-rc3.md | 0 .../rc/3.0.2-rc1.md | 0 .../rc/3.0.2-rc2.md | 0 .../rc/3.0.3-rc1.md | 0 .../rc/3.0.3-rc2.md | 0 .../rc/3.0.6-rc1.md | 0 .../rc/3.0.6-rc2.md | 0 .../rc/3.0.7-rc1.md | 0 .../rc/3.1.0-rc1.md | 0 .../rc/3.1.0-rc2.md | 0 .../rc/3.1.0-rc3.md | 0 .../rc/3.1.2-rc1.md | 0 .../00_Issues_and_Bugs.md} | 0 .../code.md => 05_Contributing/01_Code.md} | 0 .../02_Release_Process.md} | 0 .../03_Documentation.md} | 0 .../04_Translation.md} | 0 .../05_Translation_Process.md} | 0 .../contributing => 05_Contributing}/index.md | 0 docs/en/{topics => }/_images/assets.png | Bin .../{topics => }/_images/assets_editform.png | Bin docs/en/{topics => }/_images/assets_sync.png | Bin docs/en/{topics => }/_images/assets_up.png | Bin docs/en/{topics => }/_images/basicfiles.gif | Bin .../{topics => }/_images/basicfiles.gif.png | Bin .../_images/basicfilestructure.gif | Bin .../_images/basicfilestructure.gif.png | Bin .../_images/cms-architecture.png | Bin docs/en/{tutorials => }/_images/comments.jpg | Bin .../_images/controllers-and-dataobjects.png | Bin .../_images/iis7-iusr-permissions.jpg | Bin docs/en/{tutorials => }/_images/layout.css | 0 .../_images/modeladmin_edit.png | Bin .../_images/modeladmin_results.png | Bin .../_images/modeladmin_search.png | Bin .../{topics => }/_images/modules_folder.jpg | Bin docs/en/{tutorials => }/_images/navigator.jpg | Bin .../{tutorials => }/_images/news-comments.jpg | Bin .../_images/pagetype-inheritance.png | Bin docs/en/{tutorials => }/_images/rss.jpg | Bin .../{tutorials => }/_images/search-file.gif | Bin .../{tutorials => }/_images/search-file.jpg | Bin .../{tutorials => }/_images/searchresults.jpg | Bin ...ook-front-cover-design-june2009preview.jpg | Bin .../en/{reference => }/_images/sitereport.png | Bin .../_images/treeicons/home-file.gif | Bin .../_images/treeicons/news-file.gif | Bin .../_images/treeicons/search-file.gif | Bin .../_images/tutorial1_2nd_level-cut.jpg | Bin .../_images/tutorial1_addpage.jpg | Bin .../_images/tutorial1_cms-basic.jpg | Bin .../_images/tutorial1_cms-numbered-3.jpg | Bin .../_images/tutorial1_cms-numbered-5.jpg | Bin .../_images/tutorial1_cms-numbered.jpg | Bin .../_images/tutorial1_home-small.jpg | Bin .../_images/tutorial1_home-template.jpg | Bin .../_images/tutorial1_homepage-type.jpg | Bin .../tutorial1_menu-two-level-small.jpg | Bin .../_images/tutorial1_menu-two-level.jpg | Bin .../_images/tutorial1_menu.jpg | Bin .../tutorial1_subtemplates-diagram.jpg | Bin .../{tutorials => }/_images/tutorial1_url.jpg | Bin .../_images/tutorial2_articleholder.jpg | Bin .../_images/tutorial2_create-staff.jpg | Bin .../_images/tutorial2_data-collation.jpg | Bin .../_images/tutorial2_einstein.jpg | Bin .../_images/tutorial2_homepage-news.jpg | Bin .../_images/tutorial2_icons2.jpg | Bin .../_images/tutorial2_news-cms.jpg | Bin .../_images/tutorial2_news.jpg | Bin .../_images/tutorial2_newslist.jpg | Bin .../tutorial2_pagetype-inheritance.jpg | Bin .../_images/tutorial2_photo.jpg | Bin .../_images/tutorial2_rss-feed.jpg | Bin .../_images/tutorial2_staff-section.jpg | Bin .../_images/tutorial3_pollform.jpg | Bin .../_images/tutorial3_pollresults.jpg | Bin .../_images/tutorial3_validation.jpg | Bin .../_images/tutorial4_search.jpg | Bin .../_images/tutorial4_searchbox.jpg | Bin .../tutorial5-completecode-blackcandy.zip | Bin .../_images/tutorial5-completecode.zip | Bin .../_images/tutorial5_addNew.jpg | Bin .../_images/tutorial5_mentor.jpg | Bin .../_images/tutorial5_mentor_creation.jpg | Bin .../_images/tutorial5_mentor_students.jpg | Bin .../_images/tutorial5_module_creation.jpg | Bin .../_images/tutorial5_module_selection.jpg | Bin .../_images/tutorial5_project.jpg | Bin .../_images/tutorial5_project_creation.jpg | Bin .../_images/tutorial5_projects_table.jpg | Bin .../_images/tutorial5_student_tab.jpg | Bin .../_images/tutorial5_students.jpg | Bin .../_images/webpi-2-a-silverstripe-choice.jpg | Bin .../_images/webpi-2-b-dependencies.jpg | Bin .../webpi-2-c-downloading-and-installaing.jpg | Bin .../webpi-2-d-installer-questions-step1.jpg | Bin .../webpi-2-e-installer-questions-step2.jpg | Bin .../_images/webpi-2-f-success-message.jpg | Bin .../webpi-2-g-silverstripe-homepage.jpg | Bin .../webpi-2-h-cms-interface-working.jpg | Bin docs/en/{topics => }/_images/widget_demo.gif | Bin .../{topics => }/_images/widget_demo.gif.png | Bin docs/en/changelogs/3.0.10.md | 26 -- docs/en/changelogs/3.0.11.md | 19 -- docs/en/changelogs/3.0.9.md | 12 - docs/en/changelogs/3.1.3.md | 29 -- docs/en/changelogs/3.1.4.md | 46 --- docs/en/changelogs/3.1.5.md | 67 ---- docs/en/changelogs/rc/3.0.10-rc1.md | 25 -- docs/en/changelogs/rc/3.0.11-rc1.md | 19 -- docs/en/changelogs/rc/3.0.9-rc1.md | 12 - docs/en/changelogs/rc/3.1.3-rc1.md | 29 -- docs/en/changelogs/rc/3.1.3-rc2.md | 12 - docs/en/changelogs/rc/3.1.4-rc1.md | 44 --- docs/en/changelogs/rc/3.1.5-rc1.md | 67 ---- docs/en/howto/index.md | 22 -- docs/en/installation/from-source.md | 6 - docs/en/installation/windows-manual-iis.md | 31 -- docs/en/misc/index.md | 9 - docs/en/misc/ss-markdown.md | 115 ------- docs/en/reference/bbcode.md | 36 --- docs/en/reference/complextablefield.md | 135 -------- docs/en/reference/index.md | 36 --- docs/en/reference/tablefield.md | 81 ----- docs/en/reference/tablelistfield.md | 292 ------------------ docs/en/topics/index.md | 34 -- docs/en/topics/widgets.md | 3 - docs/en/tutorials/_resources/tutorials.zip | Bin 447811 -> 0 bytes 318 files changed, 131 insertions(+), 1218 deletions(-) rename docs/en/{installation/server-requirements.md => 00_Getting_Started/00_Server_Requirements.md} (100%) create mode 100644 docs/en/00_Getting_Started/01_Installation/01_Linux_Unix.md rename docs/en/{installation/mac-osx.md => 00_Getting_Started/01_Installation/02_Mac_OSX.md} (100%) rename docs/en/{installation/windows-wamp.md => 00_Getting_Started/01_Installation/03_Windows.md} (100%) rename docs/en/{installation/windows-manual-iis-6.md => 00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_IIS6.md} (100%) rename docs/en/{installation/windows-manual-iis-7.md => 00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_IIS7.md} (100%) rename docs/en/{installation/windows-pi.md => 00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_Platform_Installer.md} (100%) rename docs/en/{installation/common-problems.md => 00_Getting_Started/01_Installation/05_Common_Problems.md} (100%) rename docs/en/{installation/lighttpd.md => 00_Getting_Started/01_Installation/How_To/Configure_Lighttpd.md} (100%) rename docs/en/{installation/nginx.md => 00_Getting_Started/01_Installation/How_To/Configure_Nginx.md} (100%) rename docs/en/{installation/webserver.md => 00_Getting_Started/01_Installation/index.md} (93%) rename docs/en/{installation/composer.md => 00_Getting_Started/02_Composer.md} (99%) rename docs/en/{topics/environment-management.md => 00_Getting_Started/03_Environment_Management.md} (100%) rename docs/en/{topics/directory-structure.md => 00_Getting_Started/04_Directory_Structure.md} (91%) rename docs/en/{misc/coding-conventions.md => 00_Getting_Started/05_Coding_Conventions.md} (100%) rename docs/en/{installation => 00_Getting_Started}/index.md (100%) rename docs/en/{tutorials/1-building-a-basic-site.md => 01_Tutorials/01_Building_A_Basic_Site.md} (99%) rename docs/en/{tutorials/2-extending-a-basic-site.md => 01_Tutorials/02_Extending_A_Basic_Site.md} (100%) rename docs/en/{tutorials/3-forms.md => 01_Tutorials/03_Forms.md} (100%) rename docs/en/{tutorials/4-site-search.md => 01_Tutorials/04_Site_Search.md} (100%) rename docs/en/{tutorials/5-dataobject-relationship-management.md => 01_Tutorials/05_Dataobject-Relationship_Management.md} (100%) rename docs/en/{tutorials => 01_Tutorials}/index.md (100%) rename docs/en/{topics/page-types.md => 02_Developer_Guides/00_Model/01_Page_Types.md} (100%) rename docs/en/{reference/sitetree.md => 02_Developer_Guides/00_Model/02_SiteTree.md} (100%) rename docs/en/{reference/dataobject.md => 02_Developer_Guides/00_Model/03_DataObject.md} (100%) rename docs/en/{topics/data-types.md => 02_Developer_Guides/00_Model/04_Data_Types_and_Casting.md} (100%) rename docs/en/{topics/datamodel.md => 02_Developer_Guides/00_Model/05_Data_Model_and_ORM.md} (100%) rename docs/en/{reference/database-structure.md => 02_Developer_Guides/00_Model/06_Database_Structure.md} (100%) rename docs/en/{reference/sqlquery.md => 02_Developer_Guides/00_Model/07_SQL_Query.md} (100%) rename docs/en/{topics/versioning.md => 02_Developer_Guides/00_Model/08_Versioning.md} (100%) rename docs/en/{howto/dynamic-default-fields.md => 02_Developer_Guides/00_Model/How_To/Dynamic_Default_Fields.md} (100%) rename docs/en/{howto/grouping-dataobjectsets.md => 02_Developer_Guides/00_Model/How_To/Grouping_DataObject_Sets.md} (100%) rename docs/en/{topics/page-type-templates.md => 02_Developer_Guides/01_Templates_and_Views/00_Page_Type_Templates.md} (100%) rename docs/en/{reference/templates.md => 02_Developer_Guides/01_Templates_and_Views/01_Templates.md} (100%) rename docs/en/{topics/css.md => 02_Developer_Guides/01_Templates_and_Views/02_CSS.md} (100%) rename docs/en/{topics/javascript.md => 02_Developer_Guides/01_Templates_and_Views/03_Javascript.md} (100%) rename docs/en/{reference/requirements.md => 02_Developer_Guides/01_Templates_and_Views/04_Requirements.md} (100%) rename docs/en/{reference/templates-formal-syntax.md => 02_Developer_Guides/01_Templates_and_Views/05_Templates_Formal_Syntax.md} (100%) rename docs/en/{topics/themes.md => 02_Developer_Guides/01_Templates_and_Views/06_Themes.md} (100%) rename docs/en/{topics/theme-development.md => 02_Developer_Guides/01_Templates_and_Views/07_Theme_Development.md} (100%) rename docs/en/{howto/navigation-menu.md => 02_Developer_Guides/01_Templates_and_Views/How_To/01_Navigation_Menu.md} (100%) rename docs/en/{howto/pagination.md => 02_Developer_Guides/01_Templates_and_Views/How_To/02_Pagination.md} (100%) rename docs/en/{topics/controller.md => 02_Developer_Guides/02_Controllers/01_Controllers.md} (100%) create mode 100644 docs/en/02_Developer_Guides/02_Controllers/02_Routing.md rename docs/en/{topics/forms.md => 02_Developer_Guides/03_Forms/00_Forms.md} (100%) rename docs/en/{reference/form-field-types.md => 02_Developer_Guides/03_Forms/01_Form_Field_Types.md} (100%) rename docs/en/{reference/datefield.md => 02_Developer_Guides/03_Forms/02_DateField.md} (100%) rename docs/en/{reference/uploadfield.md => 02_Developer_Guides/03_Forms/03_UploadField.md} (100%) rename docs/en/{reference/grid-field.md => 02_Developer_Guides/03_Forms/04_GridField.md} (100%) rename docs/en/{howto/gridfield-rowaction.md => 02_Developer_Guides/03_Forms/How_To/Gridfield_Rowaction.md} (100%) rename docs/en/{howto/simple-contact-form.md => 02_Developer_Guides/03_Forms/How_To/Simple_Contact_Form.md} (100%) rename docs/en/{topics/configuration.md => 02_Developer_Guides/04_Configuration/00_Configuration.md} (100%) rename docs/en/{reference/siteconfig.md => 02_Developer_Guides/04_Configuration/01_SiteConfig.md} (100%) rename docs/en/{reference/dataextension.md => 02_Developer_Guides/05_Extending/00_DataExtension.md} (100%) rename docs/en/{topics/modules.md => 02_Developer_Guides/05_Extending/01_Modules.md} (100%) rename docs/en/{topics/module-development.md => 02_Developer_Guides/05_Extending/02_Module_Development.md} (100%) rename docs/en/{topics/rich-text-editing.md => 02_Developer_Guides/05_Extending/03_Rich_Text_Editing.md} (100%) rename docs/en/{reference/shortcodes.md => 02_Developer_Guides/05_Extending/04_Shortcodes.md} (100%) rename docs/en/{reference/injector.md => 02_Developer_Guides/05_Extending/05_Injector.md} (100%) rename docs/en/{topics/testing/why-should-i-test.md => 02_Developer_Guides/06_Testing/00_Why_Should_I_Test.md} (100%) rename docs/en/{howto/phpunit-configuration.md => 02_Developer_Guides/06_Testing/01_PHPUnit_Configuration.md} (100%) rename docs/en/{topics/testing/creating-a-silverstripe-test.md => 02_Developer_Guides/06_Testing/02_Creating_a_Unit_Test.md} (100%) rename docs/en/{topics/testing/creating-a-functional-test.md => 02_Developer_Guides/06_Testing/03_Creating_a_Functional_Test.md} (100%) rename docs/en/{topics/testing/fixtures.md => 02_Developer_Guides/06_Testing/04_Fixtures.md} (100%) rename docs/en/{topics/testing/testing-guide-troubleshooting.md => 02_Developer_Guides/06_Testing/05_Testing_Guide_Troubleshooting.md} (100%) rename docs/en/{topics/testing/glossary.md => 02_Developer_Guides/06_Testing/06_Glossary.md} (100%) rename docs/en/{topics/testing/testing-email.md => 02_Developer_Guides/06_Testing/How_To/Testing_Email.md} (100%) rename docs/en/{topics/testing => 02_Developer_Guides/06_Testing}/index.md (100%) rename docs/en/{topics/debugging.md => 02_Developer_Guides/07_Debugging/00_Debugging.md} (100%) rename docs/en/{topics/error-handling.md => 02_Developer_Guides/07_Debugging/01_Error_Handling.md} (100%) rename docs/en/{reference/urlvariabletools.md => 02_Developer_Guides/07_Debugging/02_URL_Variable_Tools.md} (100%) rename docs/en/{reference/partial-caching.md => 02_Developer_Guides/08_Performance/00_Partial_Caching.md} (100%) rename docs/en/{topics/caching.md => 02_Developer_Guides/08_Performance/01_Caching.md} (100%) rename docs/en/{howto/cache-control.md => 02_Developer_Guides/08_Performance/02_Cache_Control.md} (100%) rename docs/en/{topics/security.md => 02_Developer_Guides/09_Security/00_Security.md} (100%) rename docs/en/{topics/access-control.md => 02_Developer_Guides/09_Security/01_Access_Control.md} (100%) rename docs/en/{reference/member.md => 02_Developer_Guides/09_Security/02_Member.md} (100%) rename docs/en/{reference/permission.md => 02_Developer_Guides/09_Security/03_Permission.md} (100%) create mode 100644 docs/en/02_Developer_Guides/09_Security/How_To/Track_Member_Logins.md rename docs/en/{topics => 02_Developer_Guides/10_Email}/email.md (100%) rename docs/en/{howto/csv-import.md => 02_Developer_Guides/11_Migration_Integration/00_CSV_Import.md} (100%) rename docs/en/{reference/restfulservice.md => 02_Developer_Guides/11_Migration_Integration/01_RestfulService.md} (100%) rename docs/en/{reference/rssfeed.md => 02_Developer_Guides/11_Migration_Integration/02_RSSFeed.md} (100%) rename docs/en/{topics/search.md => 02_Developer_Guides/12_Search/00_Search.md} (100%) rename docs/en/{reference/searchcontext.md => 02_Developer_Guides/12_Search/01_Searchcontext.md} (100%) rename docs/en/{topics => 02_Developer_Guides/13_i18n}/i18n.md (100%) rename docs/en/{topics/files.md => 02_Developer_Guides/14_Files/00_Files.md} (100%) rename docs/en/{reference/image.md => 02_Developer_Guides/14_Files/01_Image.md} (100%) rename docs/en/{reference/typography.md => 02_Developer_Guides/15_Customising_the_CMS/00_Typography.md} (100%) rename docs/en/{reference/modeladmin.md => 02_Developer_Guides/15_Customising_the_CMS/01_ModelAdmin.md} (100%) rename docs/en/{reference/layout.md => 02_Developer_Guides/15_Customising_the_CMS/03_CMS_Layout.md} (100%) rename docs/en/{reference/preview.md => 02_Developer_Guides/15_Customising_the_CMS/04_Preview.md} (100%) rename docs/en/{reference/cms-architecture.md => 02_Developer_Guides/15_Customising_the_CMS/05_CMS_Architecture.md} (100%) rename docs/en/{howto/cms-alternating-button.md => 02_Developer_Guides/15_Customising_the_CMS/How_To/CMS_Alternating_Button.md} (100%) rename docs/en/{howto/cms-formfield-help-text.md => 02_Developer_Guides/15_Customising_the_CMS/How_To/CMS_Formfield_Help_Text.md} (100%) rename docs/en/{howto/customize-cms-menu.md => 02_Developer_Guides/15_Customising_the_CMS/How_To/Customise_CMS_Menu.md} (100%) rename docs/en/{howto/customize-cms-pages-list.md => 02_Developer_Guides/15_Customising_the_CMS/How_To/Customise_CMS_Pages_List.md} (100%) rename docs/en/{howto/customize-cms-tree.md => 02_Developer_Guides/15_Customising_the_CMS/How_To/Customise_CMS_Tree.md} (100%) rename docs/en/{howto/extend-cms-interface.md => 02_Developer_Guides/15_Customising_the_CMS/How_To/Extend_CMS_Interface.md} (100%) rename docs/en/{reference/execution-pipeline.md => 02_Developer_Guides/16_Execution_Pipeline/00_Execution_Pipeline.md} (100%) rename docs/en/{reference/director.md => 02_Developer_Guides/16_Execution_Pipeline/01_Director.md} (100%) rename docs/en/{topics/commandline.md => 02_Developer_Guides/17_CLI/Command_Line.md} (100%) create mode 100644 docs/en/02_Developer_Guides/index.md rename docs/en/{installation/upgrading.md => 03_Upgrading/00_Upgrading.md} (100%) rename docs/en/{reference/templates-upgrading-guide.md => 03_Upgrading/01_Templates_Upgrading_Guide.md} (100%) rename docs/en/{changelogs => 04_Changelogs}/2.0.1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.0.2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.1.0.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.1.1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.2.0.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.2.1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.2.2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.2.3.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.2.4.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.0.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.10.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.11.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.12.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.13.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.3.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.4.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.5.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.6.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.7.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.8.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.3.9.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.4.0.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.4.1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.4.10.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.4.2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.4.3.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.4.4.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.4.5.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.4.6.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.4.7.md (100%) rename docs/en/{changelogs => 04_Changelogs}/2.4.8.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.0.0.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.0.1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.0.2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.0.3.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.0.4.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.0.5.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.0.6.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.0.7.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.0.8.md (100%) create mode 100644 docs/en/04_Changelogs/3.0.9.md rename docs/en/{changelogs => 04_Changelogs}/3.1.0.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.1.1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.1.2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/3.1.6.md (100%) rename docs/en/{changelogs => 04_Changelogs}/_images/cms22screenie.jpg (100%) rename docs/en/{changelogs => 04_Changelogs}/_images/tab-paths-after.png (100%) rename docs/en/{changelogs => 04_Changelogs}/_images/tab-paths-before.png (100%) rename docs/en/{changelogs => 04_Changelogs}/_images/tab-paths-customtab.png (100%) rename docs/en/{changelogs => 04_Changelogs}/alpha/2.4.0-alpha1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/alpha/3.0.0-alpha1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/alpha/3.0.0-alpha2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/beta/2.4.0-beta1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/beta/2.4.0-beta2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/beta/3.0.0-beta1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/beta/3.0.0-beta2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/beta/3.0.0-beta3.md (100%) rename docs/en/{changelogs => 04_Changelogs}/beta/3.1.0-beta1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/beta/3.1.0-beta2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/beta/3.1.0-beta3.md (100%) rename docs/en/{changelogs => 04_Changelogs}/index.md (100%) rename docs/en/{changelogs => 04_Changelogs}/pr/3.0.0-pr1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.3.11-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.3.8-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.0-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.0-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.0-rc3.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.1-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.1-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.2-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.2-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.3-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.3-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.4-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.4-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.5-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/2.4.8-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.0-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.0-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.0-rc3.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.1-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.1-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.1-rc3.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.2-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.2-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.3-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.3-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.6-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.6-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.0.7-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.1.0-rc1.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.1.0-rc2.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.1.0-rc3.md (100%) rename docs/en/{changelogs => 04_Changelogs}/rc/3.1.2-rc1.md (100%) rename docs/en/{misc/contributing/issues.md => 05_Contributing/00_Issues_and_Bugs.md} (100%) rename docs/en/{misc/contributing/code.md => 05_Contributing/01_Code.md} (100%) rename docs/en/{misc/release-process.md => 05_Contributing/02_Release_Process.md} (100%) rename docs/en/{misc/contributing/documentation.md => 05_Contributing/03_Documentation.md} (100%) rename docs/en/{misc/contributing/translation.md => 05_Contributing/04_Translation.md} (100%) rename docs/en/{misc/translation-process.md => 05_Contributing/05_Translation_Process.md} (100%) rename docs/en/{misc/contributing => 05_Contributing}/index.md (100%) rename docs/en/{topics => }/_images/assets.png (100%) rename docs/en/{topics => }/_images/assets_editform.png (100%) rename docs/en/{topics => }/_images/assets_sync.png (100%) rename docs/en/{topics => }/_images/assets_up.png (100%) rename docs/en/{topics => }/_images/basicfiles.gif (100%) rename docs/en/{topics => }/_images/basicfiles.gif.png (100%) rename docs/en/{topics => }/_images/basicfilestructure.gif (100%) rename docs/en/{topics => }/_images/basicfilestructure.gif.png (100%) rename docs/en/{reference => }/_images/cms-architecture.png (100%) rename docs/en/{tutorials => }/_images/comments.jpg (100%) rename docs/en/{topics => }/_images/controllers-and-dataobjects.png (100%) rename docs/en/{installation => }/_images/iis7-iusr-permissions.jpg (100%) rename docs/en/{tutorials => }/_images/layout.css (100%) rename docs/en/{reference => }/_images/modeladmin_edit.png (100%) rename docs/en/{reference => }/_images/modeladmin_results.png (100%) rename docs/en/{reference => }/_images/modeladmin_search.png (100%) rename docs/en/{topics => }/_images/modules_folder.jpg (100%) rename docs/en/{tutorials => }/_images/navigator.jpg (100%) rename docs/en/{tutorials => }/_images/news-comments.jpg (100%) rename docs/en/{topics => }/_images/pagetype-inheritance.png (100%) rename docs/en/{tutorials => }/_images/rss.jpg (100%) rename docs/en/{tutorials => }/_images/search-file.gif (100%) rename docs/en/{tutorials => }/_images/search-file.jpg (100%) rename docs/en/{tutorials => }/_images/searchresults.jpg (100%) rename docs/en/{tutorials => }/_images/silverstripe-cms-book-front-cover-design-june2009preview.jpg (100%) rename docs/en/{reference => }/_images/sitereport.png (100%) rename docs/en/{tutorials => }/_images/treeicons/home-file.gif (100%) rename docs/en/{tutorials => }/_images/treeicons/news-file.gif (100%) rename docs/en/{tutorials => }/_images/treeicons/search-file.gif (100%) rename docs/en/{tutorials => }/_images/tutorial1_2nd_level-cut.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_addpage.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_cms-basic.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_cms-numbered-3.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_cms-numbered-5.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_cms-numbered.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_home-small.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_home-template.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_homepage-type.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_menu-two-level-small.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_menu-two-level.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_menu.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_subtemplates-diagram.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial1_url.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_articleholder.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_create-staff.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_data-collation.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_einstein.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_homepage-news.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_icons2.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_news-cms.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_news.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_newslist.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_pagetype-inheritance.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_photo.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_rss-feed.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial2_staff-section.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial3_pollform.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial3_pollresults.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial3_validation.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial4_search.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial4_searchbox.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5-completecode-blackcandy.zip (100%) rename docs/en/{tutorials => }/_images/tutorial5-completecode.zip (100%) rename docs/en/{tutorials => }/_images/tutorial5_addNew.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5_mentor.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5_mentor_creation.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5_mentor_students.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5_module_creation.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5_module_selection.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5_project.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5_project_creation.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5_projects_table.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5_student_tab.jpg (100%) rename docs/en/{tutorials => }/_images/tutorial5_students.jpg (100%) rename docs/en/{installation => }/_images/webpi-2-a-silverstripe-choice.jpg (100%) rename docs/en/{installation => }/_images/webpi-2-b-dependencies.jpg (100%) rename docs/en/{installation => }/_images/webpi-2-c-downloading-and-installaing.jpg (100%) rename docs/en/{installation => }/_images/webpi-2-d-installer-questions-step1.jpg (100%) rename docs/en/{installation => }/_images/webpi-2-e-installer-questions-step2.jpg (100%) rename docs/en/{installation => }/_images/webpi-2-f-success-message.jpg (100%) rename docs/en/{installation => }/_images/webpi-2-g-silverstripe-homepage.jpg (100%) rename docs/en/{installation => }/_images/webpi-2-h-cms-interface-working.jpg (100%) rename docs/en/{topics => }/_images/widget_demo.gif (100%) rename docs/en/{topics => }/_images/widget_demo.gif.png (100%) delete mode 100644 docs/en/changelogs/3.0.10.md delete mode 100644 docs/en/changelogs/3.0.11.md delete mode 100644 docs/en/changelogs/3.0.9.md delete mode 100644 docs/en/changelogs/3.1.3.md delete mode 100644 docs/en/changelogs/3.1.4.md delete mode 100644 docs/en/changelogs/3.1.5.md delete mode 100644 docs/en/changelogs/rc/3.0.10-rc1.md delete mode 100644 docs/en/changelogs/rc/3.0.11-rc1.md delete mode 100644 docs/en/changelogs/rc/3.0.9-rc1.md delete mode 100644 docs/en/changelogs/rc/3.1.3-rc1.md delete mode 100644 docs/en/changelogs/rc/3.1.3-rc2.md delete mode 100644 docs/en/changelogs/rc/3.1.4-rc1.md delete mode 100644 docs/en/changelogs/rc/3.1.5-rc1.md delete mode 100644 docs/en/howto/index.md delete mode 100644 docs/en/installation/from-source.md delete mode 100644 docs/en/installation/windows-manual-iis.md delete mode 100644 docs/en/misc/index.md delete mode 100644 docs/en/misc/ss-markdown.md delete mode 100644 docs/en/reference/bbcode.md delete mode 100644 docs/en/reference/complextablefield.md delete mode 100644 docs/en/reference/index.md delete mode 100644 docs/en/reference/tablefield.md delete mode 100644 docs/en/reference/tablelistfield.md delete mode 100644 docs/en/topics/index.md delete mode 100644 docs/en/topics/widgets.md delete mode 100644 docs/en/tutorials/_resources/tutorials.zip diff --git a/docs/en/installation/server-requirements.md b/docs/en/00_Getting_Started/00_Server_Requirements.md similarity index 100% rename from docs/en/installation/server-requirements.md rename to docs/en/00_Getting_Started/00_Server_Requirements.md diff --git a/docs/en/00_Getting_Started/01_Installation/01_Linux_Unix.md b/docs/en/00_Getting_Started/01_Installation/01_Linux_Unix.md new file mode 100644 index 000000000..60f84dbc7 --- /dev/null +++ b/docs/en/00_Getting_Started/01_Installation/01_Linux_Unix.md @@ -0,0 +1,24 @@ +# Installation on Linux, Unix and *nix like Operating Systems + +SilverStripe should be able to be installed on any Linux, Unix or *nix like OS as long as the correct server software is installed and configured (referred to a *nix in this document from herein). It is common that web hosting that you may use for your production SilverStripe application will be *nix based, here you may also want to use *nix locally to ensure how you develop locally mimics closely your production environment. + +Is important to ensure you check the [Server Requirements](/Getting_Started/Installation/Server_Requirements) list before acquiring and installing SilverStripe on your *nix server (locally or otherwise). + +At a high level you will need a: +* Web server e.g. Apache, Nginx +* Database e.g. MariaDB, Postgres, MySQL +* PHP + +##*nix installation guides on the web +There are a number of good step by step guides covering server setups and installing of SilverStripe on the various flavours of *nix systems. + +Note: Many of the following guides simply download SilverStripe as a zipped file. We recommend the use of [Composer](/Getting_Started/Composer/) once you get to the point of installing SilverStripe (though the choice is up to you). Always ensure you get the latest version if you are starting a new project. + +###Known (but not exhaustive) list +* [How To Install Silverstripe on Your VPS](https://www.digitalocean.com/community/tutorials/how-to-install-silverstripe-on-your-vps) +* [Running SilverStripe On Nginx (LEMP) On Debian Wheezy/Ubuntu 13.04](http://www.howtoforge.com/running-silverstripe-on-nginx-lemp-on-debian-wheezy-ubuntu-13.04) +* [Setting up nginx, PHP-FPM, and SilverStripe on Fedora 19](http://halkyon.net/blog/setting-up-nginx-php-fpm-and-silverstripe-installation-on-fedora-19/) +* [How to install SilverStripe CMS on a Linux Virtual Server](http://www.rosehosting.com/blog/how-to-install-silverstripe-cms-on-a-linux-virtual-server/) + + +_If you find further good *nix related installation articles please email these to community+docs@silverstripe.org._ \ No newline at end of file diff --git a/docs/en/installation/mac-osx.md b/docs/en/00_Getting_Started/01_Installation/02_Mac_OSX.md similarity index 100% rename from docs/en/installation/mac-osx.md rename to docs/en/00_Getting_Started/01_Installation/02_Mac_OSX.md diff --git a/docs/en/installation/windows-wamp.md b/docs/en/00_Getting_Started/01_Installation/03_Windows.md similarity index 100% rename from docs/en/installation/windows-wamp.md rename to docs/en/00_Getting_Started/01_Installation/03_Windows.md diff --git a/docs/en/installation/windows-manual-iis-6.md b/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_IIS6.md similarity index 100% rename from docs/en/installation/windows-manual-iis-6.md rename to docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_IIS6.md diff --git a/docs/en/installation/windows-manual-iis-7.md b/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_IIS7.md similarity index 100% rename from docs/en/installation/windows-manual-iis-7.md rename to docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_IIS7.md diff --git a/docs/en/installation/windows-pi.md b/docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_Platform_Installer.md similarity index 100% rename from docs/en/installation/windows-pi.md rename to docs/en/00_Getting_Started/01_Installation/04_Other_installation_Options/Windows_Platform_Installer.md diff --git a/docs/en/installation/common-problems.md b/docs/en/00_Getting_Started/01_Installation/05_Common_Problems.md similarity index 100% rename from docs/en/installation/common-problems.md rename to docs/en/00_Getting_Started/01_Installation/05_Common_Problems.md diff --git a/docs/en/installation/lighttpd.md b/docs/en/00_Getting_Started/01_Installation/How_To/Configure_Lighttpd.md similarity index 100% rename from docs/en/installation/lighttpd.md rename to docs/en/00_Getting_Started/01_Installation/How_To/Configure_Lighttpd.md diff --git a/docs/en/installation/nginx.md b/docs/en/00_Getting_Started/01_Installation/How_To/Configure_Nginx.md similarity index 100% rename from docs/en/installation/nginx.md rename to docs/en/00_Getting_Started/01_Installation/How_To/Configure_Nginx.md diff --git a/docs/en/installation/webserver.md b/docs/en/00_Getting_Started/01_Installation/index.md similarity index 93% rename from docs/en/installation/webserver.md rename to docs/en/00_Getting_Started/01_Installation/index.md index 1a476b4a5..50caac601 100644 --- a/docs/en/installation/webserver.md +++ b/docs/en/00_Getting_Started/01_Installation/index.md @@ -1,6 +1,8 @@ -# Generic Webserver Installation +# Installation -These instructions show you how to install SilverStripe on any web server. +These instructions show you how to install SilverStripe on any web server. + +The best way to install from the source code is to use [Composer](composer). For additional information about installing SilverStripe on specific operation systems, refer to: diff --git a/docs/en/installation/composer.md b/docs/en/00_Getting_Started/02_Composer.md similarity index 99% rename from docs/en/installation/composer.md rename to docs/en/00_Getting_Started/02_Composer.md index 30c8f59ae..0c02d0889 100644 --- a/docs/en/installation/composer.md +++ b/docs/en/00_Getting_Started/02_Composer.md @@ -1,9 +1,5 @@ # Installing and Upgrading with Composer -
    -![](../_images/composer.png) -
    - Composer is a package management tool for PHP that lets you install and upgrade SilverStripe and its modules. Although installing Composer is one extra step, it will give you much more flexibility than just downloading the file from silverstripe.org. This is our recommended way of downloading SilverStripe and managing your code. For more information about Composer, visit [its website](http://getcomposer.org/). diff --git a/docs/en/topics/environment-management.md b/docs/en/00_Getting_Started/03_Environment_Management.md similarity index 100% rename from docs/en/topics/environment-management.md rename to docs/en/00_Getting_Started/03_Environment_Management.md diff --git a/docs/en/topics/directory-structure.md b/docs/en/00_Getting_Started/04_Directory_Structure.md similarity index 91% rename from docs/en/topics/directory-structure.md rename to docs/en/00_Getting_Started/04_Directory_Structure.md index 32d8869f7..2b3a524fa 100644 --- a/docs/en/topics/directory-structure.md +++ b/docs/en/00_Getting_Started/04_Directory_Structure.md @@ -72,9 +72,10 @@ Example Forum Documentation: | `forum/docs/_manifest_exclude` | Empty file to signify that SilverStripe does not need to load classes from this folder | | `forum/docs/en/` | English documentation | | `forum/docs/en/index.md` | Documentation homepage. Should provide an introduction and links to remaining docs | - | `forum/docs/en/installing.md` | | + | `forum/docs/en/Getting_Started.md` | Documentation page. Naming convention is Uppercase and underscores. | | `forum/docs/en/_images/` | Folder to store any images or media | - | `forum/docs/en/sometopic/` | You can organize documentation into nested folders | + | `forum/docs/en/Some_Topic/` | You can organise documentation into nested folders. Naming convention is Uppercase and underscores. | +|`forum/docs/en/04_Some_Topic/00_Getting_Started.md`|Structure is created by use of numbered prefixes. This applies to nested folders and documentations pages, index.md should not have a prefix.| ## PHP Include Paths diff --git a/docs/en/misc/coding-conventions.md b/docs/en/00_Getting_Started/05_Coding_Conventions.md similarity index 100% rename from docs/en/misc/coding-conventions.md rename to docs/en/00_Getting_Started/05_Coding_Conventions.md diff --git a/docs/en/installation/index.md b/docs/en/00_Getting_Started/index.md similarity index 100% rename from docs/en/installation/index.md rename to docs/en/00_Getting_Started/index.md diff --git a/docs/en/tutorials/1-building-a-basic-site.md b/docs/en/01_Tutorials/01_Building_A_Basic_Site.md similarity index 99% rename from docs/en/tutorials/1-building-a-basic-site.md rename to docs/en/01_Tutorials/01_Building_A_Basic_Site.md index a450697ec..6e582e9b8 100644 --- a/docs/en/tutorials/1-building-a-basic-site.md +++ b/docs/en/01_Tutorials/01_Building_A_Basic_Site.md @@ -227,7 +227,7 @@ Adding a second level menu is very similar to adding the first level menu. Open <% loop $Menu(2) %>
  • - + $MenuTitle.XML
  • @@ -250,7 +250,7 @@ like this: <% loop $Menu(2) %>
  • - + $MenuTitle.XML
  • @@ -302,7 +302,7 @@ The following example runs an if statement and a loop on *Children*, checking to <% loop $Children %>
  • - + $MenuTitle.XML
  • diff --git a/docs/en/tutorials/2-extending-a-basic-site.md b/docs/en/01_Tutorials/02_Extending_A_Basic_Site.md similarity index 100% rename from docs/en/tutorials/2-extending-a-basic-site.md rename to docs/en/01_Tutorials/02_Extending_A_Basic_Site.md diff --git a/docs/en/tutorials/3-forms.md b/docs/en/01_Tutorials/03_Forms.md similarity index 100% rename from docs/en/tutorials/3-forms.md rename to docs/en/01_Tutorials/03_Forms.md diff --git a/docs/en/tutorials/4-site-search.md b/docs/en/01_Tutorials/04_Site_Search.md similarity index 100% rename from docs/en/tutorials/4-site-search.md rename to docs/en/01_Tutorials/04_Site_Search.md diff --git a/docs/en/tutorials/5-dataobject-relationship-management.md b/docs/en/01_Tutorials/05_Dataobject-Relationship_Management.md similarity index 100% rename from docs/en/tutorials/5-dataobject-relationship-management.md rename to docs/en/01_Tutorials/05_Dataobject-Relationship_Management.md diff --git a/docs/en/tutorials/index.md b/docs/en/01_Tutorials/index.md similarity index 100% rename from docs/en/tutorials/index.md rename to docs/en/01_Tutorials/index.md diff --git a/docs/en/topics/page-types.md b/docs/en/02_Developer_Guides/00_Model/01_Page_Types.md similarity index 100% rename from docs/en/topics/page-types.md rename to docs/en/02_Developer_Guides/00_Model/01_Page_Types.md diff --git a/docs/en/reference/sitetree.md b/docs/en/02_Developer_Guides/00_Model/02_SiteTree.md similarity index 100% rename from docs/en/reference/sitetree.md rename to docs/en/02_Developer_Guides/00_Model/02_SiteTree.md diff --git a/docs/en/reference/dataobject.md b/docs/en/02_Developer_Guides/00_Model/03_DataObject.md similarity index 100% rename from docs/en/reference/dataobject.md rename to docs/en/02_Developer_Guides/00_Model/03_DataObject.md diff --git a/docs/en/topics/data-types.md b/docs/en/02_Developer_Guides/00_Model/04_Data_Types_and_Casting.md similarity index 100% rename from docs/en/topics/data-types.md rename to docs/en/02_Developer_Guides/00_Model/04_Data_Types_and_Casting.md diff --git a/docs/en/topics/datamodel.md b/docs/en/02_Developer_Guides/00_Model/05_Data_Model_and_ORM.md similarity index 100% rename from docs/en/topics/datamodel.md rename to docs/en/02_Developer_Guides/00_Model/05_Data_Model_and_ORM.md diff --git a/docs/en/reference/database-structure.md b/docs/en/02_Developer_Guides/00_Model/06_Database_Structure.md similarity index 100% rename from docs/en/reference/database-structure.md rename to docs/en/02_Developer_Guides/00_Model/06_Database_Structure.md diff --git a/docs/en/reference/sqlquery.md b/docs/en/02_Developer_Guides/00_Model/07_SQL_Query.md similarity index 100% rename from docs/en/reference/sqlquery.md rename to docs/en/02_Developer_Guides/00_Model/07_SQL_Query.md diff --git a/docs/en/topics/versioning.md b/docs/en/02_Developer_Guides/00_Model/08_Versioning.md similarity index 100% rename from docs/en/topics/versioning.md rename to docs/en/02_Developer_Guides/00_Model/08_Versioning.md diff --git a/docs/en/howto/dynamic-default-fields.md b/docs/en/02_Developer_Guides/00_Model/How_To/Dynamic_Default_Fields.md similarity index 100% rename from docs/en/howto/dynamic-default-fields.md rename to docs/en/02_Developer_Guides/00_Model/How_To/Dynamic_Default_Fields.md diff --git a/docs/en/howto/grouping-dataobjectsets.md b/docs/en/02_Developer_Guides/00_Model/How_To/Grouping_DataObject_Sets.md similarity index 100% rename from docs/en/howto/grouping-dataobjectsets.md rename to docs/en/02_Developer_Guides/00_Model/How_To/Grouping_DataObject_Sets.md diff --git a/docs/en/topics/page-type-templates.md b/docs/en/02_Developer_Guides/01_Templates_and_Views/00_Page_Type_Templates.md similarity index 100% rename from docs/en/topics/page-type-templates.md rename to docs/en/02_Developer_Guides/01_Templates_and_Views/00_Page_Type_Templates.md diff --git a/docs/en/reference/templates.md b/docs/en/02_Developer_Guides/01_Templates_and_Views/01_Templates.md similarity index 100% rename from docs/en/reference/templates.md rename to docs/en/02_Developer_Guides/01_Templates_and_Views/01_Templates.md diff --git a/docs/en/topics/css.md b/docs/en/02_Developer_Guides/01_Templates_and_Views/02_CSS.md similarity index 100% rename from docs/en/topics/css.md rename to docs/en/02_Developer_Guides/01_Templates_and_Views/02_CSS.md diff --git a/docs/en/topics/javascript.md b/docs/en/02_Developer_Guides/01_Templates_and_Views/03_Javascript.md similarity index 100% rename from docs/en/topics/javascript.md rename to docs/en/02_Developer_Guides/01_Templates_and_Views/03_Javascript.md diff --git a/docs/en/reference/requirements.md b/docs/en/02_Developer_Guides/01_Templates_and_Views/04_Requirements.md similarity index 100% rename from docs/en/reference/requirements.md rename to docs/en/02_Developer_Guides/01_Templates_and_Views/04_Requirements.md diff --git a/docs/en/reference/templates-formal-syntax.md b/docs/en/02_Developer_Guides/01_Templates_and_Views/05_Templates_Formal_Syntax.md similarity index 100% rename from docs/en/reference/templates-formal-syntax.md rename to docs/en/02_Developer_Guides/01_Templates_and_Views/05_Templates_Formal_Syntax.md diff --git a/docs/en/topics/themes.md b/docs/en/02_Developer_Guides/01_Templates_and_Views/06_Themes.md similarity index 100% rename from docs/en/topics/themes.md rename to docs/en/02_Developer_Guides/01_Templates_and_Views/06_Themes.md diff --git a/docs/en/topics/theme-development.md b/docs/en/02_Developer_Guides/01_Templates_and_Views/07_Theme_Development.md similarity index 100% rename from docs/en/topics/theme-development.md rename to docs/en/02_Developer_Guides/01_Templates_and_Views/07_Theme_Development.md diff --git a/docs/en/howto/navigation-menu.md b/docs/en/02_Developer_Guides/01_Templates_and_Views/How_To/01_Navigation_Menu.md similarity index 100% rename from docs/en/howto/navigation-menu.md rename to docs/en/02_Developer_Guides/01_Templates_and_Views/How_To/01_Navigation_Menu.md diff --git a/docs/en/howto/pagination.md b/docs/en/02_Developer_Guides/01_Templates_and_Views/How_To/02_Pagination.md similarity index 100% rename from docs/en/howto/pagination.md rename to docs/en/02_Developer_Guides/01_Templates_and_Views/How_To/02_Pagination.md diff --git a/docs/en/topics/controller.md b/docs/en/02_Developer_Guides/02_Controllers/01_Controllers.md similarity index 100% rename from docs/en/topics/controller.md rename to docs/en/02_Developer_Guides/02_Controllers/01_Controllers.md diff --git a/docs/en/02_Developer_Guides/02_Controllers/02_Routing.md b/docs/en/02_Developer_Guides/02_Controllers/02_Routing.md new file mode 100644 index 000000000..4c09086d1 --- /dev/null +++ b/docs/en/02_Developer_Guides/02_Controllers/02_Routing.md @@ -0,0 +1,2 @@ +#Routing +This is a stub to be fleshed out about routing given it is a popular topic and currently hard to find. \ No newline at end of file diff --git a/docs/en/topics/forms.md b/docs/en/02_Developer_Guides/03_Forms/00_Forms.md similarity index 100% rename from docs/en/topics/forms.md rename to docs/en/02_Developer_Guides/03_Forms/00_Forms.md diff --git a/docs/en/reference/form-field-types.md b/docs/en/02_Developer_Guides/03_Forms/01_Form_Field_Types.md similarity index 100% rename from docs/en/reference/form-field-types.md rename to docs/en/02_Developer_Guides/03_Forms/01_Form_Field_Types.md diff --git a/docs/en/reference/datefield.md b/docs/en/02_Developer_Guides/03_Forms/02_DateField.md similarity index 100% rename from docs/en/reference/datefield.md rename to docs/en/02_Developer_Guides/03_Forms/02_DateField.md diff --git a/docs/en/reference/uploadfield.md b/docs/en/02_Developer_Guides/03_Forms/03_UploadField.md similarity index 100% rename from docs/en/reference/uploadfield.md rename to docs/en/02_Developer_Guides/03_Forms/03_UploadField.md diff --git a/docs/en/reference/grid-field.md b/docs/en/02_Developer_Guides/03_Forms/04_GridField.md similarity index 100% rename from docs/en/reference/grid-field.md rename to docs/en/02_Developer_Guides/03_Forms/04_GridField.md diff --git a/docs/en/howto/gridfield-rowaction.md b/docs/en/02_Developer_Guides/03_Forms/How_To/Gridfield_Rowaction.md similarity index 100% rename from docs/en/howto/gridfield-rowaction.md rename to docs/en/02_Developer_Guides/03_Forms/How_To/Gridfield_Rowaction.md diff --git a/docs/en/howto/simple-contact-form.md b/docs/en/02_Developer_Guides/03_Forms/How_To/Simple_Contact_Form.md similarity index 100% rename from docs/en/howto/simple-contact-form.md rename to docs/en/02_Developer_Guides/03_Forms/How_To/Simple_Contact_Form.md diff --git a/docs/en/topics/configuration.md b/docs/en/02_Developer_Guides/04_Configuration/00_Configuration.md similarity index 100% rename from docs/en/topics/configuration.md rename to docs/en/02_Developer_Guides/04_Configuration/00_Configuration.md diff --git a/docs/en/reference/siteconfig.md b/docs/en/02_Developer_Guides/04_Configuration/01_SiteConfig.md similarity index 100% rename from docs/en/reference/siteconfig.md rename to docs/en/02_Developer_Guides/04_Configuration/01_SiteConfig.md diff --git a/docs/en/reference/dataextension.md b/docs/en/02_Developer_Guides/05_Extending/00_DataExtension.md similarity index 100% rename from docs/en/reference/dataextension.md rename to docs/en/02_Developer_Guides/05_Extending/00_DataExtension.md diff --git a/docs/en/topics/modules.md b/docs/en/02_Developer_Guides/05_Extending/01_Modules.md similarity index 100% rename from docs/en/topics/modules.md rename to docs/en/02_Developer_Guides/05_Extending/01_Modules.md diff --git a/docs/en/topics/module-development.md b/docs/en/02_Developer_Guides/05_Extending/02_Module_Development.md similarity index 100% rename from docs/en/topics/module-development.md rename to docs/en/02_Developer_Guides/05_Extending/02_Module_Development.md diff --git a/docs/en/topics/rich-text-editing.md b/docs/en/02_Developer_Guides/05_Extending/03_Rich_Text_Editing.md similarity index 100% rename from docs/en/topics/rich-text-editing.md rename to docs/en/02_Developer_Guides/05_Extending/03_Rich_Text_Editing.md diff --git a/docs/en/reference/shortcodes.md b/docs/en/02_Developer_Guides/05_Extending/04_Shortcodes.md similarity index 100% rename from docs/en/reference/shortcodes.md rename to docs/en/02_Developer_Guides/05_Extending/04_Shortcodes.md diff --git a/docs/en/reference/injector.md b/docs/en/02_Developer_Guides/05_Extending/05_Injector.md similarity index 100% rename from docs/en/reference/injector.md rename to docs/en/02_Developer_Guides/05_Extending/05_Injector.md diff --git a/docs/en/topics/testing/why-should-i-test.md b/docs/en/02_Developer_Guides/06_Testing/00_Why_Should_I_Test.md similarity index 100% rename from docs/en/topics/testing/why-should-i-test.md rename to docs/en/02_Developer_Guides/06_Testing/00_Why_Should_I_Test.md diff --git a/docs/en/howto/phpunit-configuration.md b/docs/en/02_Developer_Guides/06_Testing/01_PHPUnit_Configuration.md similarity index 100% rename from docs/en/howto/phpunit-configuration.md rename to docs/en/02_Developer_Guides/06_Testing/01_PHPUnit_Configuration.md diff --git a/docs/en/topics/testing/creating-a-silverstripe-test.md b/docs/en/02_Developer_Guides/06_Testing/02_Creating_a_Unit_Test.md similarity index 100% rename from docs/en/topics/testing/creating-a-silverstripe-test.md rename to docs/en/02_Developer_Guides/06_Testing/02_Creating_a_Unit_Test.md diff --git a/docs/en/topics/testing/creating-a-functional-test.md b/docs/en/02_Developer_Guides/06_Testing/03_Creating_a_Functional_Test.md similarity index 100% rename from docs/en/topics/testing/creating-a-functional-test.md rename to docs/en/02_Developer_Guides/06_Testing/03_Creating_a_Functional_Test.md diff --git a/docs/en/topics/testing/fixtures.md b/docs/en/02_Developer_Guides/06_Testing/04_Fixtures.md similarity index 100% rename from docs/en/topics/testing/fixtures.md rename to docs/en/02_Developer_Guides/06_Testing/04_Fixtures.md diff --git a/docs/en/topics/testing/testing-guide-troubleshooting.md b/docs/en/02_Developer_Guides/06_Testing/05_Testing_Guide_Troubleshooting.md similarity index 100% rename from docs/en/topics/testing/testing-guide-troubleshooting.md rename to docs/en/02_Developer_Guides/06_Testing/05_Testing_Guide_Troubleshooting.md diff --git a/docs/en/topics/testing/glossary.md b/docs/en/02_Developer_Guides/06_Testing/06_Glossary.md similarity index 100% rename from docs/en/topics/testing/glossary.md rename to docs/en/02_Developer_Guides/06_Testing/06_Glossary.md diff --git a/docs/en/topics/testing/testing-email.md b/docs/en/02_Developer_Guides/06_Testing/How_To/Testing_Email.md similarity index 100% rename from docs/en/topics/testing/testing-email.md rename to docs/en/02_Developer_Guides/06_Testing/How_To/Testing_Email.md diff --git a/docs/en/topics/testing/index.md b/docs/en/02_Developer_Guides/06_Testing/index.md similarity index 100% rename from docs/en/topics/testing/index.md rename to docs/en/02_Developer_Guides/06_Testing/index.md diff --git a/docs/en/topics/debugging.md b/docs/en/02_Developer_Guides/07_Debugging/00_Debugging.md similarity index 100% rename from docs/en/topics/debugging.md rename to docs/en/02_Developer_Guides/07_Debugging/00_Debugging.md diff --git a/docs/en/topics/error-handling.md b/docs/en/02_Developer_Guides/07_Debugging/01_Error_Handling.md similarity index 100% rename from docs/en/topics/error-handling.md rename to docs/en/02_Developer_Guides/07_Debugging/01_Error_Handling.md diff --git a/docs/en/reference/urlvariabletools.md b/docs/en/02_Developer_Guides/07_Debugging/02_URL_Variable_Tools.md similarity index 100% rename from docs/en/reference/urlvariabletools.md rename to docs/en/02_Developer_Guides/07_Debugging/02_URL_Variable_Tools.md diff --git a/docs/en/reference/partial-caching.md b/docs/en/02_Developer_Guides/08_Performance/00_Partial_Caching.md similarity index 100% rename from docs/en/reference/partial-caching.md rename to docs/en/02_Developer_Guides/08_Performance/00_Partial_Caching.md diff --git a/docs/en/topics/caching.md b/docs/en/02_Developer_Guides/08_Performance/01_Caching.md similarity index 100% rename from docs/en/topics/caching.md rename to docs/en/02_Developer_Guides/08_Performance/01_Caching.md diff --git a/docs/en/howto/cache-control.md b/docs/en/02_Developer_Guides/08_Performance/02_Cache_Control.md similarity index 100% rename from docs/en/howto/cache-control.md rename to docs/en/02_Developer_Guides/08_Performance/02_Cache_Control.md diff --git a/docs/en/topics/security.md b/docs/en/02_Developer_Guides/09_Security/00_Security.md similarity index 100% rename from docs/en/topics/security.md rename to docs/en/02_Developer_Guides/09_Security/00_Security.md diff --git a/docs/en/topics/access-control.md b/docs/en/02_Developer_Guides/09_Security/01_Access_Control.md similarity index 100% rename from docs/en/topics/access-control.md rename to docs/en/02_Developer_Guides/09_Security/01_Access_Control.md diff --git a/docs/en/reference/member.md b/docs/en/02_Developer_Guides/09_Security/02_Member.md similarity index 100% rename from docs/en/reference/member.md rename to docs/en/02_Developer_Guides/09_Security/02_Member.md diff --git a/docs/en/reference/permission.md b/docs/en/02_Developer_Guides/09_Security/03_Permission.md similarity index 100% rename from docs/en/reference/permission.md rename to docs/en/02_Developer_Guides/09_Security/03_Permission.md diff --git a/docs/en/02_Developer_Guides/09_Security/How_To/Track_Member_Logins.md b/docs/en/02_Developer_Guides/09_Security/How_To/Track_Member_Logins.md new file mode 100644 index 000000000..cf2eaa688 --- /dev/null +++ b/docs/en/02_Developer_Guides/09_Security/How_To/Track_Member_Logins.md @@ -0,0 +1,52 @@ +# Howto: Track Member Logins + +Sometimes its good to know how active your users are, +and when they last visited the site (and logged on). +A simple `LastVisited` property on the `Member` record +with some hooks into the login process can achieve this. +In addition, a `NumVisit` property will tell us how +often the member has visited. Or more specifically, +how often he has started a browser session, either through +explicitly logging in or by invoking the "remember me" functionality. + + :::php + 'Datetime', + 'NumVisit' => 'Int', + ); + + public function memberLoggedIn() { + $this->logVisit(); + } + + public function memberAutoLoggedIn() { + $this->logVisit(); + } + + public function updateCMSFields(FieldList $fields) { + $fields->addFieldsToTab('Root.Main', array( + ReadonlyField::create('LastVisited', 'Last visited'), + ReadonlyField::create('NumVisits', 'Number of visits') + )); + } + + protected function logVisit() { + if(!Security::database_is_ready()) return; + + DB::query(sprintf( + 'UPDATE "Member" SET "LastVisited" = %s, "NumVisit" = "NumVisit" + 1 WHERE "ID" = %d', + DB::getConn()->now(), + $this->owner->ID + )); + } + } + +Now you just need to apply this extension through your config: + + :::yml + Member: + extensions: + - MyMemberExtension + diff --git a/docs/en/topics/email.md b/docs/en/02_Developer_Guides/10_Email/email.md similarity index 100% rename from docs/en/topics/email.md rename to docs/en/02_Developer_Guides/10_Email/email.md diff --git a/docs/en/howto/csv-import.md b/docs/en/02_Developer_Guides/11_Migration_Integration/00_CSV_Import.md similarity index 100% rename from docs/en/howto/csv-import.md rename to docs/en/02_Developer_Guides/11_Migration_Integration/00_CSV_Import.md diff --git a/docs/en/reference/restfulservice.md b/docs/en/02_Developer_Guides/11_Migration_Integration/01_RestfulService.md similarity index 100% rename from docs/en/reference/restfulservice.md rename to docs/en/02_Developer_Guides/11_Migration_Integration/01_RestfulService.md diff --git a/docs/en/reference/rssfeed.md b/docs/en/02_Developer_Guides/11_Migration_Integration/02_RSSFeed.md similarity index 100% rename from docs/en/reference/rssfeed.md rename to docs/en/02_Developer_Guides/11_Migration_Integration/02_RSSFeed.md diff --git a/docs/en/topics/search.md b/docs/en/02_Developer_Guides/12_Search/00_Search.md similarity index 100% rename from docs/en/topics/search.md rename to docs/en/02_Developer_Guides/12_Search/00_Search.md diff --git a/docs/en/reference/searchcontext.md b/docs/en/02_Developer_Guides/12_Search/01_Searchcontext.md similarity index 100% rename from docs/en/reference/searchcontext.md rename to docs/en/02_Developer_Guides/12_Search/01_Searchcontext.md diff --git a/docs/en/topics/i18n.md b/docs/en/02_Developer_Guides/13_i18n/i18n.md similarity index 100% rename from docs/en/topics/i18n.md rename to docs/en/02_Developer_Guides/13_i18n/i18n.md diff --git a/docs/en/topics/files.md b/docs/en/02_Developer_Guides/14_Files/00_Files.md similarity index 100% rename from docs/en/topics/files.md rename to docs/en/02_Developer_Guides/14_Files/00_Files.md diff --git a/docs/en/reference/image.md b/docs/en/02_Developer_Guides/14_Files/01_Image.md similarity index 100% rename from docs/en/reference/image.md rename to docs/en/02_Developer_Guides/14_Files/01_Image.md diff --git a/docs/en/reference/typography.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/00_Typography.md similarity index 100% rename from docs/en/reference/typography.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/00_Typography.md diff --git a/docs/en/reference/modeladmin.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/01_ModelAdmin.md similarity index 100% rename from docs/en/reference/modeladmin.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/01_ModelAdmin.md diff --git a/docs/en/reference/layout.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/03_CMS_Layout.md similarity index 100% rename from docs/en/reference/layout.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/03_CMS_Layout.md diff --git a/docs/en/reference/preview.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/04_Preview.md similarity index 100% rename from docs/en/reference/preview.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/04_Preview.md diff --git a/docs/en/reference/cms-architecture.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/05_CMS_Architecture.md similarity index 100% rename from docs/en/reference/cms-architecture.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/05_CMS_Architecture.md diff --git a/docs/en/howto/cms-alternating-button.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/CMS_Alternating_Button.md similarity index 100% rename from docs/en/howto/cms-alternating-button.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/CMS_Alternating_Button.md diff --git a/docs/en/howto/cms-formfield-help-text.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/CMS_Formfield_Help_Text.md similarity index 100% rename from docs/en/howto/cms-formfield-help-text.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/CMS_Formfield_Help_Text.md diff --git a/docs/en/howto/customize-cms-menu.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/Customise_CMS_Menu.md similarity index 100% rename from docs/en/howto/customize-cms-menu.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/Customise_CMS_Menu.md diff --git a/docs/en/howto/customize-cms-pages-list.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/Customise_CMS_Pages_List.md similarity index 100% rename from docs/en/howto/customize-cms-pages-list.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/Customise_CMS_Pages_List.md diff --git a/docs/en/howto/customize-cms-tree.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/Customise_CMS_Tree.md similarity index 100% rename from docs/en/howto/customize-cms-tree.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/Customise_CMS_Tree.md diff --git a/docs/en/howto/extend-cms-interface.md b/docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/Extend_CMS_Interface.md similarity index 100% rename from docs/en/howto/extend-cms-interface.md rename to docs/en/02_Developer_Guides/15_Customising_the_CMS/How_To/Extend_CMS_Interface.md diff --git a/docs/en/reference/execution-pipeline.md b/docs/en/02_Developer_Guides/16_Execution_Pipeline/00_Execution_Pipeline.md similarity index 100% rename from docs/en/reference/execution-pipeline.md rename to docs/en/02_Developer_Guides/16_Execution_Pipeline/00_Execution_Pipeline.md diff --git a/docs/en/reference/director.md b/docs/en/02_Developer_Guides/16_Execution_Pipeline/01_Director.md similarity index 100% rename from docs/en/reference/director.md rename to docs/en/02_Developer_Guides/16_Execution_Pipeline/01_Director.md diff --git a/docs/en/topics/commandline.md b/docs/en/02_Developer_Guides/17_CLI/Command_Line.md similarity index 100% rename from docs/en/topics/commandline.md rename to docs/en/02_Developer_Guides/17_CLI/Command_Line.md diff --git a/docs/en/02_Developer_Guides/index.md b/docs/en/02_Developer_Guides/index.md new file mode 100644 index 000000000..5f3de77bc --- /dev/null +++ b/docs/en/02_Developer_Guides/index.md @@ -0,0 +1,8 @@ +#Developer Guides +A collection of more advanced functionality and features contained within the SilverStripe Framework. This covers common use cases, provides code examples and explanations of how you might use parts of the Framework and CMS to suit your projects. + +This is by no means a completely exhaustive list of Classes and Methods but rather more of a descriptive book style format with examples. + +Each key section will also contain a "How To" section into which we accept community contributed code examples and more specific use cases. + +TODO - A table of contents including any missing stub pages. \ No newline at end of file diff --git a/docs/en/installation/upgrading.md b/docs/en/03_Upgrading/00_Upgrading.md similarity index 100% rename from docs/en/installation/upgrading.md rename to docs/en/03_Upgrading/00_Upgrading.md diff --git a/docs/en/reference/templates-upgrading-guide.md b/docs/en/03_Upgrading/01_Templates_Upgrading_Guide.md similarity index 100% rename from docs/en/reference/templates-upgrading-guide.md rename to docs/en/03_Upgrading/01_Templates_Upgrading_Guide.md diff --git a/docs/en/changelogs/2.0.1.md b/docs/en/04_Changelogs/2.0.1.md similarity index 100% rename from docs/en/changelogs/2.0.1.md rename to docs/en/04_Changelogs/2.0.1.md diff --git a/docs/en/changelogs/2.0.2.md b/docs/en/04_Changelogs/2.0.2.md similarity index 100% rename from docs/en/changelogs/2.0.2.md rename to docs/en/04_Changelogs/2.0.2.md diff --git a/docs/en/changelogs/2.1.0.md b/docs/en/04_Changelogs/2.1.0.md similarity index 100% rename from docs/en/changelogs/2.1.0.md rename to docs/en/04_Changelogs/2.1.0.md diff --git a/docs/en/changelogs/2.1.1.md b/docs/en/04_Changelogs/2.1.1.md similarity index 100% rename from docs/en/changelogs/2.1.1.md rename to docs/en/04_Changelogs/2.1.1.md diff --git a/docs/en/changelogs/2.2.0.md b/docs/en/04_Changelogs/2.2.0.md similarity index 100% rename from docs/en/changelogs/2.2.0.md rename to docs/en/04_Changelogs/2.2.0.md diff --git a/docs/en/changelogs/2.2.1.md b/docs/en/04_Changelogs/2.2.1.md similarity index 100% rename from docs/en/changelogs/2.2.1.md rename to docs/en/04_Changelogs/2.2.1.md diff --git a/docs/en/changelogs/2.2.2.md b/docs/en/04_Changelogs/2.2.2.md similarity index 100% rename from docs/en/changelogs/2.2.2.md rename to docs/en/04_Changelogs/2.2.2.md diff --git a/docs/en/changelogs/2.2.3.md b/docs/en/04_Changelogs/2.2.3.md similarity index 100% rename from docs/en/changelogs/2.2.3.md rename to docs/en/04_Changelogs/2.2.3.md diff --git a/docs/en/changelogs/2.2.4.md b/docs/en/04_Changelogs/2.2.4.md similarity index 100% rename from docs/en/changelogs/2.2.4.md rename to docs/en/04_Changelogs/2.2.4.md diff --git a/docs/en/changelogs/2.3.0.md b/docs/en/04_Changelogs/2.3.0.md similarity index 100% rename from docs/en/changelogs/2.3.0.md rename to docs/en/04_Changelogs/2.3.0.md diff --git a/docs/en/changelogs/2.3.1.md b/docs/en/04_Changelogs/2.3.1.md similarity index 100% rename from docs/en/changelogs/2.3.1.md rename to docs/en/04_Changelogs/2.3.1.md diff --git a/docs/en/changelogs/2.3.10.md b/docs/en/04_Changelogs/2.3.10.md similarity index 100% rename from docs/en/changelogs/2.3.10.md rename to docs/en/04_Changelogs/2.3.10.md diff --git a/docs/en/changelogs/2.3.11.md b/docs/en/04_Changelogs/2.3.11.md similarity index 100% rename from docs/en/changelogs/2.3.11.md rename to docs/en/04_Changelogs/2.3.11.md diff --git a/docs/en/changelogs/2.3.12.md b/docs/en/04_Changelogs/2.3.12.md similarity index 100% rename from docs/en/changelogs/2.3.12.md rename to docs/en/04_Changelogs/2.3.12.md diff --git a/docs/en/changelogs/2.3.13.md b/docs/en/04_Changelogs/2.3.13.md similarity index 100% rename from docs/en/changelogs/2.3.13.md rename to docs/en/04_Changelogs/2.3.13.md diff --git a/docs/en/changelogs/2.3.2.md b/docs/en/04_Changelogs/2.3.2.md similarity index 100% rename from docs/en/changelogs/2.3.2.md rename to docs/en/04_Changelogs/2.3.2.md diff --git a/docs/en/changelogs/2.3.3.md b/docs/en/04_Changelogs/2.3.3.md similarity index 100% rename from docs/en/changelogs/2.3.3.md rename to docs/en/04_Changelogs/2.3.3.md diff --git a/docs/en/changelogs/2.3.4.md b/docs/en/04_Changelogs/2.3.4.md similarity index 100% rename from docs/en/changelogs/2.3.4.md rename to docs/en/04_Changelogs/2.3.4.md diff --git a/docs/en/changelogs/2.3.5.md b/docs/en/04_Changelogs/2.3.5.md similarity index 100% rename from docs/en/changelogs/2.3.5.md rename to docs/en/04_Changelogs/2.3.5.md diff --git a/docs/en/changelogs/2.3.6.md b/docs/en/04_Changelogs/2.3.6.md similarity index 100% rename from docs/en/changelogs/2.3.6.md rename to docs/en/04_Changelogs/2.3.6.md diff --git a/docs/en/changelogs/2.3.7.md b/docs/en/04_Changelogs/2.3.7.md similarity index 100% rename from docs/en/changelogs/2.3.7.md rename to docs/en/04_Changelogs/2.3.7.md diff --git a/docs/en/changelogs/2.3.8.md b/docs/en/04_Changelogs/2.3.8.md similarity index 100% rename from docs/en/changelogs/2.3.8.md rename to docs/en/04_Changelogs/2.3.8.md diff --git a/docs/en/changelogs/2.3.9.md b/docs/en/04_Changelogs/2.3.9.md similarity index 100% rename from docs/en/changelogs/2.3.9.md rename to docs/en/04_Changelogs/2.3.9.md diff --git a/docs/en/changelogs/2.4.0.md b/docs/en/04_Changelogs/2.4.0.md similarity index 100% rename from docs/en/changelogs/2.4.0.md rename to docs/en/04_Changelogs/2.4.0.md diff --git a/docs/en/changelogs/2.4.1.md b/docs/en/04_Changelogs/2.4.1.md similarity index 100% rename from docs/en/changelogs/2.4.1.md rename to docs/en/04_Changelogs/2.4.1.md diff --git a/docs/en/changelogs/2.4.10.md b/docs/en/04_Changelogs/2.4.10.md similarity index 100% rename from docs/en/changelogs/2.4.10.md rename to docs/en/04_Changelogs/2.4.10.md diff --git a/docs/en/changelogs/2.4.2.md b/docs/en/04_Changelogs/2.4.2.md similarity index 100% rename from docs/en/changelogs/2.4.2.md rename to docs/en/04_Changelogs/2.4.2.md diff --git a/docs/en/changelogs/2.4.3.md b/docs/en/04_Changelogs/2.4.3.md similarity index 100% rename from docs/en/changelogs/2.4.3.md rename to docs/en/04_Changelogs/2.4.3.md diff --git a/docs/en/changelogs/2.4.4.md b/docs/en/04_Changelogs/2.4.4.md similarity index 100% rename from docs/en/changelogs/2.4.4.md rename to docs/en/04_Changelogs/2.4.4.md diff --git a/docs/en/changelogs/2.4.5.md b/docs/en/04_Changelogs/2.4.5.md similarity index 100% rename from docs/en/changelogs/2.4.5.md rename to docs/en/04_Changelogs/2.4.5.md diff --git a/docs/en/changelogs/2.4.6.md b/docs/en/04_Changelogs/2.4.6.md similarity index 100% rename from docs/en/changelogs/2.4.6.md rename to docs/en/04_Changelogs/2.4.6.md diff --git a/docs/en/changelogs/2.4.7.md b/docs/en/04_Changelogs/2.4.7.md similarity index 100% rename from docs/en/changelogs/2.4.7.md rename to docs/en/04_Changelogs/2.4.7.md diff --git a/docs/en/changelogs/2.4.8.md b/docs/en/04_Changelogs/2.4.8.md similarity index 100% rename from docs/en/changelogs/2.4.8.md rename to docs/en/04_Changelogs/2.4.8.md diff --git a/docs/en/changelogs/3.0.0.md b/docs/en/04_Changelogs/3.0.0.md similarity index 100% rename from docs/en/changelogs/3.0.0.md rename to docs/en/04_Changelogs/3.0.0.md diff --git a/docs/en/changelogs/3.0.1.md b/docs/en/04_Changelogs/3.0.1.md similarity index 100% rename from docs/en/changelogs/3.0.1.md rename to docs/en/04_Changelogs/3.0.1.md diff --git a/docs/en/changelogs/3.0.2.md b/docs/en/04_Changelogs/3.0.2.md similarity index 100% rename from docs/en/changelogs/3.0.2.md rename to docs/en/04_Changelogs/3.0.2.md diff --git a/docs/en/changelogs/3.0.3.md b/docs/en/04_Changelogs/3.0.3.md similarity index 100% rename from docs/en/changelogs/3.0.3.md rename to docs/en/04_Changelogs/3.0.3.md diff --git a/docs/en/changelogs/3.0.4.md b/docs/en/04_Changelogs/3.0.4.md similarity index 100% rename from docs/en/changelogs/3.0.4.md rename to docs/en/04_Changelogs/3.0.4.md diff --git a/docs/en/changelogs/3.0.5.md b/docs/en/04_Changelogs/3.0.5.md similarity index 100% rename from docs/en/changelogs/3.0.5.md rename to docs/en/04_Changelogs/3.0.5.md diff --git a/docs/en/changelogs/3.0.6.md b/docs/en/04_Changelogs/3.0.6.md similarity index 100% rename from docs/en/changelogs/3.0.6.md rename to docs/en/04_Changelogs/3.0.6.md diff --git a/docs/en/changelogs/3.0.7.md b/docs/en/04_Changelogs/3.0.7.md similarity index 100% rename from docs/en/changelogs/3.0.7.md rename to docs/en/04_Changelogs/3.0.7.md diff --git a/docs/en/changelogs/3.0.8.md b/docs/en/04_Changelogs/3.0.8.md similarity index 100% rename from docs/en/changelogs/3.0.8.md rename to docs/en/04_Changelogs/3.0.8.md diff --git a/docs/en/04_Changelogs/3.0.9.md b/docs/en/04_Changelogs/3.0.9.md new file mode 100644 index 000000000..089cde8f8 --- /dev/null +++ b/docs/en/04_Changelogs/3.0.9.md @@ -0,0 +1,35 @@ +# 3.0.9 + +## Overview + +### Default current Versioned "stage" to "Live" rather than "Stage" + +Previously only the controllers responsible for page and CMS display +(`LeftAndMain` and `ContentController`) explicitly set a stage through +`Versioned::choose_site_stage()`. Unless this method is called, +the default stage will be "Stage", showing draft content. +Any direct subclasses of `Controller` interacting with "versioned" objects +are vulnerable to exposing unpublished content, unless `choose_site_stage()` +is called explicitly in their own logic. + +In order to provide more secure default behaviour, we have changed +`choose_site_stage()` to be called on all requests, defaulting to the "Live" stage. +If your logic relies on querying draft content, use `Versioned::reading_stage('Stage')`. + +Important: The `choose_site_stage()` call only deals with setting the default stage, +and doesn't check if the user is authenticated to view it. As with any other controller logic, +please use `DataObject->canView()` to determine permissions. + + :::php + class MyController extends Controller { + private static $allowed_actions = array('showpage'); + public function showpage($request) { + $page = Page::get()->byID($request->param('ID')); + if(!$page->canView()) return $this->httpError(401); + // continue with authenticated logic... + } + } + +### API Changes + + * 2013-08-03 [0e7231f](https://github.com/silverstripe/sapphire/commit/0e7231f) Disable discontinued Google Spellcheck in TinyMCE (Ingo Schommer) \ No newline at end of file diff --git a/docs/en/changelogs/3.1.0.md b/docs/en/04_Changelogs/3.1.0.md similarity index 100% rename from docs/en/changelogs/3.1.0.md rename to docs/en/04_Changelogs/3.1.0.md diff --git a/docs/en/changelogs/3.1.1.md b/docs/en/04_Changelogs/3.1.1.md similarity index 100% rename from docs/en/changelogs/3.1.1.md rename to docs/en/04_Changelogs/3.1.1.md diff --git a/docs/en/changelogs/3.1.2.md b/docs/en/04_Changelogs/3.1.2.md similarity index 100% rename from docs/en/changelogs/3.1.2.md rename to docs/en/04_Changelogs/3.1.2.md diff --git a/docs/en/changelogs/3.1.6.md b/docs/en/04_Changelogs/3.1.6.md similarity index 100% rename from docs/en/changelogs/3.1.6.md rename to docs/en/04_Changelogs/3.1.6.md diff --git a/docs/en/changelogs/_images/cms22screenie.jpg b/docs/en/04_Changelogs/_images/cms22screenie.jpg similarity index 100% rename from docs/en/changelogs/_images/cms22screenie.jpg rename to docs/en/04_Changelogs/_images/cms22screenie.jpg diff --git a/docs/en/changelogs/_images/tab-paths-after.png b/docs/en/04_Changelogs/_images/tab-paths-after.png similarity index 100% rename from docs/en/changelogs/_images/tab-paths-after.png rename to docs/en/04_Changelogs/_images/tab-paths-after.png diff --git a/docs/en/changelogs/_images/tab-paths-before.png b/docs/en/04_Changelogs/_images/tab-paths-before.png similarity index 100% rename from docs/en/changelogs/_images/tab-paths-before.png rename to docs/en/04_Changelogs/_images/tab-paths-before.png diff --git a/docs/en/changelogs/_images/tab-paths-customtab.png b/docs/en/04_Changelogs/_images/tab-paths-customtab.png similarity index 100% rename from docs/en/changelogs/_images/tab-paths-customtab.png rename to docs/en/04_Changelogs/_images/tab-paths-customtab.png diff --git a/docs/en/changelogs/alpha/2.4.0-alpha1.md b/docs/en/04_Changelogs/alpha/2.4.0-alpha1.md similarity index 100% rename from docs/en/changelogs/alpha/2.4.0-alpha1.md rename to docs/en/04_Changelogs/alpha/2.4.0-alpha1.md diff --git a/docs/en/changelogs/alpha/3.0.0-alpha1.md b/docs/en/04_Changelogs/alpha/3.0.0-alpha1.md similarity index 100% rename from docs/en/changelogs/alpha/3.0.0-alpha1.md rename to docs/en/04_Changelogs/alpha/3.0.0-alpha1.md diff --git a/docs/en/changelogs/alpha/3.0.0-alpha2.md b/docs/en/04_Changelogs/alpha/3.0.0-alpha2.md similarity index 100% rename from docs/en/changelogs/alpha/3.0.0-alpha2.md rename to docs/en/04_Changelogs/alpha/3.0.0-alpha2.md diff --git a/docs/en/changelogs/beta/2.4.0-beta1.md b/docs/en/04_Changelogs/beta/2.4.0-beta1.md similarity index 100% rename from docs/en/changelogs/beta/2.4.0-beta1.md rename to docs/en/04_Changelogs/beta/2.4.0-beta1.md diff --git a/docs/en/changelogs/beta/2.4.0-beta2.md b/docs/en/04_Changelogs/beta/2.4.0-beta2.md similarity index 100% rename from docs/en/changelogs/beta/2.4.0-beta2.md rename to docs/en/04_Changelogs/beta/2.4.0-beta2.md diff --git a/docs/en/changelogs/beta/3.0.0-beta1.md b/docs/en/04_Changelogs/beta/3.0.0-beta1.md similarity index 100% rename from docs/en/changelogs/beta/3.0.0-beta1.md rename to docs/en/04_Changelogs/beta/3.0.0-beta1.md diff --git a/docs/en/changelogs/beta/3.0.0-beta2.md b/docs/en/04_Changelogs/beta/3.0.0-beta2.md similarity index 100% rename from docs/en/changelogs/beta/3.0.0-beta2.md rename to docs/en/04_Changelogs/beta/3.0.0-beta2.md diff --git a/docs/en/changelogs/beta/3.0.0-beta3.md b/docs/en/04_Changelogs/beta/3.0.0-beta3.md similarity index 100% rename from docs/en/changelogs/beta/3.0.0-beta3.md rename to docs/en/04_Changelogs/beta/3.0.0-beta3.md diff --git a/docs/en/changelogs/beta/3.1.0-beta1.md b/docs/en/04_Changelogs/beta/3.1.0-beta1.md similarity index 100% rename from docs/en/changelogs/beta/3.1.0-beta1.md rename to docs/en/04_Changelogs/beta/3.1.0-beta1.md diff --git a/docs/en/changelogs/beta/3.1.0-beta2.md b/docs/en/04_Changelogs/beta/3.1.0-beta2.md similarity index 100% rename from docs/en/changelogs/beta/3.1.0-beta2.md rename to docs/en/04_Changelogs/beta/3.1.0-beta2.md diff --git a/docs/en/changelogs/beta/3.1.0-beta3.md b/docs/en/04_Changelogs/beta/3.1.0-beta3.md similarity index 100% rename from docs/en/changelogs/beta/3.1.0-beta3.md rename to docs/en/04_Changelogs/beta/3.1.0-beta3.md diff --git a/docs/en/changelogs/index.md b/docs/en/04_Changelogs/index.md similarity index 100% rename from docs/en/changelogs/index.md rename to docs/en/04_Changelogs/index.md diff --git a/docs/en/changelogs/pr/3.0.0-pr1.md b/docs/en/04_Changelogs/pr/3.0.0-pr1.md similarity index 100% rename from docs/en/changelogs/pr/3.0.0-pr1.md rename to docs/en/04_Changelogs/pr/3.0.0-pr1.md diff --git a/docs/en/changelogs/rc/2.3.11-rc1.md b/docs/en/04_Changelogs/rc/2.3.11-rc1.md similarity index 100% rename from docs/en/changelogs/rc/2.3.11-rc1.md rename to docs/en/04_Changelogs/rc/2.3.11-rc1.md diff --git a/docs/en/changelogs/rc/2.3.8-rc1.md b/docs/en/04_Changelogs/rc/2.3.8-rc1.md similarity index 100% rename from docs/en/changelogs/rc/2.3.8-rc1.md rename to docs/en/04_Changelogs/rc/2.3.8-rc1.md diff --git a/docs/en/changelogs/rc/2.4.0-rc1.md b/docs/en/04_Changelogs/rc/2.4.0-rc1.md similarity index 100% rename from docs/en/changelogs/rc/2.4.0-rc1.md rename to docs/en/04_Changelogs/rc/2.4.0-rc1.md diff --git a/docs/en/changelogs/rc/2.4.0-rc2.md b/docs/en/04_Changelogs/rc/2.4.0-rc2.md similarity index 100% rename from docs/en/changelogs/rc/2.4.0-rc2.md rename to docs/en/04_Changelogs/rc/2.4.0-rc2.md diff --git a/docs/en/changelogs/rc/2.4.0-rc3.md b/docs/en/04_Changelogs/rc/2.4.0-rc3.md similarity index 100% rename from docs/en/changelogs/rc/2.4.0-rc3.md rename to docs/en/04_Changelogs/rc/2.4.0-rc3.md diff --git a/docs/en/changelogs/rc/2.4.1-rc1.md b/docs/en/04_Changelogs/rc/2.4.1-rc1.md similarity index 100% rename from docs/en/changelogs/rc/2.4.1-rc1.md rename to docs/en/04_Changelogs/rc/2.4.1-rc1.md diff --git a/docs/en/changelogs/rc/2.4.1-rc2.md b/docs/en/04_Changelogs/rc/2.4.1-rc2.md similarity index 100% rename from docs/en/changelogs/rc/2.4.1-rc2.md rename to docs/en/04_Changelogs/rc/2.4.1-rc2.md diff --git a/docs/en/changelogs/rc/2.4.2-rc1.md b/docs/en/04_Changelogs/rc/2.4.2-rc1.md similarity index 100% rename from docs/en/changelogs/rc/2.4.2-rc1.md rename to docs/en/04_Changelogs/rc/2.4.2-rc1.md diff --git a/docs/en/changelogs/rc/2.4.2-rc2.md b/docs/en/04_Changelogs/rc/2.4.2-rc2.md similarity index 100% rename from docs/en/changelogs/rc/2.4.2-rc2.md rename to docs/en/04_Changelogs/rc/2.4.2-rc2.md diff --git a/docs/en/changelogs/rc/2.4.3-rc1.md b/docs/en/04_Changelogs/rc/2.4.3-rc1.md similarity index 100% rename from docs/en/changelogs/rc/2.4.3-rc1.md rename to docs/en/04_Changelogs/rc/2.4.3-rc1.md diff --git a/docs/en/changelogs/rc/2.4.3-rc2.md b/docs/en/04_Changelogs/rc/2.4.3-rc2.md similarity index 100% rename from docs/en/changelogs/rc/2.4.3-rc2.md rename to docs/en/04_Changelogs/rc/2.4.3-rc2.md diff --git a/docs/en/changelogs/rc/2.4.4-rc1.md b/docs/en/04_Changelogs/rc/2.4.4-rc1.md similarity index 100% rename from docs/en/changelogs/rc/2.4.4-rc1.md rename to docs/en/04_Changelogs/rc/2.4.4-rc1.md diff --git a/docs/en/changelogs/rc/2.4.4-rc2.md b/docs/en/04_Changelogs/rc/2.4.4-rc2.md similarity index 100% rename from docs/en/changelogs/rc/2.4.4-rc2.md rename to docs/en/04_Changelogs/rc/2.4.4-rc2.md diff --git a/docs/en/changelogs/rc/2.4.5-rc1.md b/docs/en/04_Changelogs/rc/2.4.5-rc1.md similarity index 100% rename from docs/en/changelogs/rc/2.4.5-rc1.md rename to docs/en/04_Changelogs/rc/2.4.5-rc1.md diff --git a/docs/en/changelogs/rc/2.4.8-rc1.md b/docs/en/04_Changelogs/rc/2.4.8-rc1.md similarity index 100% rename from docs/en/changelogs/rc/2.4.8-rc1.md rename to docs/en/04_Changelogs/rc/2.4.8-rc1.md diff --git a/docs/en/changelogs/rc/3.0.0-rc1.md b/docs/en/04_Changelogs/rc/3.0.0-rc1.md similarity index 100% rename from docs/en/changelogs/rc/3.0.0-rc1.md rename to docs/en/04_Changelogs/rc/3.0.0-rc1.md diff --git a/docs/en/changelogs/rc/3.0.0-rc2.md b/docs/en/04_Changelogs/rc/3.0.0-rc2.md similarity index 100% rename from docs/en/changelogs/rc/3.0.0-rc2.md rename to docs/en/04_Changelogs/rc/3.0.0-rc2.md diff --git a/docs/en/changelogs/rc/3.0.0-rc3.md b/docs/en/04_Changelogs/rc/3.0.0-rc3.md similarity index 100% rename from docs/en/changelogs/rc/3.0.0-rc3.md rename to docs/en/04_Changelogs/rc/3.0.0-rc3.md diff --git a/docs/en/changelogs/rc/3.0.1-rc1.md b/docs/en/04_Changelogs/rc/3.0.1-rc1.md similarity index 100% rename from docs/en/changelogs/rc/3.0.1-rc1.md rename to docs/en/04_Changelogs/rc/3.0.1-rc1.md diff --git a/docs/en/changelogs/rc/3.0.1-rc2.md b/docs/en/04_Changelogs/rc/3.0.1-rc2.md similarity index 100% rename from docs/en/changelogs/rc/3.0.1-rc2.md rename to docs/en/04_Changelogs/rc/3.0.1-rc2.md diff --git a/docs/en/changelogs/rc/3.0.1-rc3.md b/docs/en/04_Changelogs/rc/3.0.1-rc3.md similarity index 100% rename from docs/en/changelogs/rc/3.0.1-rc3.md rename to docs/en/04_Changelogs/rc/3.0.1-rc3.md diff --git a/docs/en/changelogs/rc/3.0.2-rc1.md b/docs/en/04_Changelogs/rc/3.0.2-rc1.md similarity index 100% rename from docs/en/changelogs/rc/3.0.2-rc1.md rename to docs/en/04_Changelogs/rc/3.0.2-rc1.md diff --git a/docs/en/changelogs/rc/3.0.2-rc2.md b/docs/en/04_Changelogs/rc/3.0.2-rc2.md similarity index 100% rename from docs/en/changelogs/rc/3.0.2-rc2.md rename to docs/en/04_Changelogs/rc/3.0.2-rc2.md diff --git a/docs/en/changelogs/rc/3.0.3-rc1.md b/docs/en/04_Changelogs/rc/3.0.3-rc1.md similarity index 100% rename from docs/en/changelogs/rc/3.0.3-rc1.md rename to docs/en/04_Changelogs/rc/3.0.3-rc1.md diff --git a/docs/en/changelogs/rc/3.0.3-rc2.md b/docs/en/04_Changelogs/rc/3.0.3-rc2.md similarity index 100% rename from docs/en/changelogs/rc/3.0.3-rc2.md rename to docs/en/04_Changelogs/rc/3.0.3-rc2.md diff --git a/docs/en/changelogs/rc/3.0.6-rc1.md b/docs/en/04_Changelogs/rc/3.0.6-rc1.md similarity index 100% rename from docs/en/changelogs/rc/3.0.6-rc1.md rename to docs/en/04_Changelogs/rc/3.0.6-rc1.md diff --git a/docs/en/changelogs/rc/3.0.6-rc2.md b/docs/en/04_Changelogs/rc/3.0.6-rc2.md similarity index 100% rename from docs/en/changelogs/rc/3.0.6-rc2.md rename to docs/en/04_Changelogs/rc/3.0.6-rc2.md diff --git a/docs/en/changelogs/rc/3.0.7-rc1.md b/docs/en/04_Changelogs/rc/3.0.7-rc1.md similarity index 100% rename from docs/en/changelogs/rc/3.0.7-rc1.md rename to docs/en/04_Changelogs/rc/3.0.7-rc1.md diff --git a/docs/en/changelogs/rc/3.1.0-rc1.md b/docs/en/04_Changelogs/rc/3.1.0-rc1.md similarity index 100% rename from docs/en/changelogs/rc/3.1.0-rc1.md rename to docs/en/04_Changelogs/rc/3.1.0-rc1.md diff --git a/docs/en/changelogs/rc/3.1.0-rc2.md b/docs/en/04_Changelogs/rc/3.1.0-rc2.md similarity index 100% rename from docs/en/changelogs/rc/3.1.0-rc2.md rename to docs/en/04_Changelogs/rc/3.1.0-rc2.md diff --git a/docs/en/changelogs/rc/3.1.0-rc3.md b/docs/en/04_Changelogs/rc/3.1.0-rc3.md similarity index 100% rename from docs/en/changelogs/rc/3.1.0-rc3.md rename to docs/en/04_Changelogs/rc/3.1.0-rc3.md diff --git a/docs/en/changelogs/rc/3.1.2-rc1.md b/docs/en/04_Changelogs/rc/3.1.2-rc1.md similarity index 100% rename from docs/en/changelogs/rc/3.1.2-rc1.md rename to docs/en/04_Changelogs/rc/3.1.2-rc1.md diff --git a/docs/en/misc/contributing/issues.md b/docs/en/05_Contributing/00_Issues_and_Bugs.md similarity index 100% rename from docs/en/misc/contributing/issues.md rename to docs/en/05_Contributing/00_Issues_and_Bugs.md diff --git a/docs/en/misc/contributing/code.md b/docs/en/05_Contributing/01_Code.md similarity index 100% rename from docs/en/misc/contributing/code.md rename to docs/en/05_Contributing/01_Code.md diff --git a/docs/en/misc/release-process.md b/docs/en/05_Contributing/02_Release_Process.md similarity index 100% rename from docs/en/misc/release-process.md rename to docs/en/05_Contributing/02_Release_Process.md diff --git a/docs/en/misc/contributing/documentation.md b/docs/en/05_Contributing/03_Documentation.md similarity index 100% rename from docs/en/misc/contributing/documentation.md rename to docs/en/05_Contributing/03_Documentation.md diff --git a/docs/en/misc/contributing/translation.md b/docs/en/05_Contributing/04_Translation.md similarity index 100% rename from docs/en/misc/contributing/translation.md rename to docs/en/05_Contributing/04_Translation.md diff --git a/docs/en/misc/translation-process.md b/docs/en/05_Contributing/05_Translation_Process.md similarity index 100% rename from docs/en/misc/translation-process.md rename to docs/en/05_Contributing/05_Translation_Process.md diff --git a/docs/en/misc/contributing/index.md b/docs/en/05_Contributing/index.md similarity index 100% rename from docs/en/misc/contributing/index.md rename to docs/en/05_Contributing/index.md diff --git a/docs/en/topics/_images/assets.png b/docs/en/_images/assets.png similarity index 100% rename from docs/en/topics/_images/assets.png rename to docs/en/_images/assets.png diff --git a/docs/en/topics/_images/assets_editform.png b/docs/en/_images/assets_editform.png similarity index 100% rename from docs/en/topics/_images/assets_editform.png rename to docs/en/_images/assets_editform.png diff --git a/docs/en/topics/_images/assets_sync.png b/docs/en/_images/assets_sync.png similarity index 100% rename from docs/en/topics/_images/assets_sync.png rename to docs/en/_images/assets_sync.png diff --git a/docs/en/topics/_images/assets_up.png b/docs/en/_images/assets_up.png similarity index 100% rename from docs/en/topics/_images/assets_up.png rename to docs/en/_images/assets_up.png diff --git a/docs/en/topics/_images/basicfiles.gif b/docs/en/_images/basicfiles.gif similarity index 100% rename from docs/en/topics/_images/basicfiles.gif rename to docs/en/_images/basicfiles.gif diff --git a/docs/en/topics/_images/basicfiles.gif.png b/docs/en/_images/basicfiles.gif.png similarity index 100% rename from docs/en/topics/_images/basicfiles.gif.png rename to docs/en/_images/basicfiles.gif.png diff --git a/docs/en/topics/_images/basicfilestructure.gif b/docs/en/_images/basicfilestructure.gif similarity index 100% rename from docs/en/topics/_images/basicfilestructure.gif rename to docs/en/_images/basicfilestructure.gif diff --git a/docs/en/topics/_images/basicfilestructure.gif.png b/docs/en/_images/basicfilestructure.gif.png similarity index 100% rename from docs/en/topics/_images/basicfilestructure.gif.png rename to docs/en/_images/basicfilestructure.gif.png diff --git a/docs/en/reference/_images/cms-architecture.png b/docs/en/_images/cms-architecture.png similarity index 100% rename from docs/en/reference/_images/cms-architecture.png rename to docs/en/_images/cms-architecture.png diff --git a/docs/en/tutorials/_images/comments.jpg b/docs/en/_images/comments.jpg similarity index 100% rename from docs/en/tutorials/_images/comments.jpg rename to docs/en/_images/comments.jpg diff --git a/docs/en/topics/_images/controllers-and-dataobjects.png b/docs/en/_images/controllers-and-dataobjects.png similarity index 100% rename from docs/en/topics/_images/controllers-and-dataobjects.png rename to docs/en/_images/controllers-and-dataobjects.png diff --git a/docs/en/installation/_images/iis7-iusr-permissions.jpg b/docs/en/_images/iis7-iusr-permissions.jpg similarity index 100% rename from docs/en/installation/_images/iis7-iusr-permissions.jpg rename to docs/en/_images/iis7-iusr-permissions.jpg diff --git a/docs/en/tutorials/_images/layout.css b/docs/en/_images/layout.css similarity index 100% rename from docs/en/tutorials/_images/layout.css rename to docs/en/_images/layout.css diff --git a/docs/en/reference/_images/modeladmin_edit.png b/docs/en/_images/modeladmin_edit.png similarity index 100% rename from docs/en/reference/_images/modeladmin_edit.png rename to docs/en/_images/modeladmin_edit.png diff --git a/docs/en/reference/_images/modeladmin_results.png b/docs/en/_images/modeladmin_results.png similarity index 100% rename from docs/en/reference/_images/modeladmin_results.png rename to docs/en/_images/modeladmin_results.png diff --git a/docs/en/reference/_images/modeladmin_search.png b/docs/en/_images/modeladmin_search.png similarity index 100% rename from docs/en/reference/_images/modeladmin_search.png rename to docs/en/_images/modeladmin_search.png diff --git a/docs/en/topics/_images/modules_folder.jpg b/docs/en/_images/modules_folder.jpg similarity index 100% rename from docs/en/topics/_images/modules_folder.jpg rename to docs/en/_images/modules_folder.jpg diff --git a/docs/en/tutorials/_images/navigator.jpg b/docs/en/_images/navigator.jpg similarity index 100% rename from docs/en/tutorials/_images/navigator.jpg rename to docs/en/_images/navigator.jpg diff --git a/docs/en/tutorials/_images/news-comments.jpg b/docs/en/_images/news-comments.jpg similarity index 100% rename from docs/en/tutorials/_images/news-comments.jpg rename to docs/en/_images/news-comments.jpg diff --git a/docs/en/topics/_images/pagetype-inheritance.png b/docs/en/_images/pagetype-inheritance.png similarity index 100% rename from docs/en/topics/_images/pagetype-inheritance.png rename to docs/en/_images/pagetype-inheritance.png diff --git a/docs/en/tutorials/_images/rss.jpg b/docs/en/_images/rss.jpg similarity index 100% rename from docs/en/tutorials/_images/rss.jpg rename to docs/en/_images/rss.jpg diff --git a/docs/en/tutorials/_images/search-file.gif b/docs/en/_images/search-file.gif similarity index 100% rename from docs/en/tutorials/_images/search-file.gif rename to docs/en/_images/search-file.gif diff --git a/docs/en/tutorials/_images/search-file.jpg b/docs/en/_images/search-file.jpg similarity index 100% rename from docs/en/tutorials/_images/search-file.jpg rename to docs/en/_images/search-file.jpg diff --git a/docs/en/tutorials/_images/searchresults.jpg b/docs/en/_images/searchresults.jpg similarity index 100% rename from docs/en/tutorials/_images/searchresults.jpg rename to docs/en/_images/searchresults.jpg diff --git a/docs/en/tutorials/_images/silverstripe-cms-book-front-cover-design-june2009preview.jpg b/docs/en/_images/silverstripe-cms-book-front-cover-design-june2009preview.jpg similarity index 100% rename from docs/en/tutorials/_images/silverstripe-cms-book-front-cover-design-june2009preview.jpg rename to docs/en/_images/silverstripe-cms-book-front-cover-design-june2009preview.jpg diff --git a/docs/en/reference/_images/sitereport.png b/docs/en/_images/sitereport.png similarity index 100% rename from docs/en/reference/_images/sitereport.png rename to docs/en/_images/sitereport.png diff --git a/docs/en/tutorials/_images/treeicons/home-file.gif b/docs/en/_images/treeicons/home-file.gif similarity index 100% rename from docs/en/tutorials/_images/treeicons/home-file.gif rename to docs/en/_images/treeicons/home-file.gif diff --git a/docs/en/tutorials/_images/treeicons/news-file.gif b/docs/en/_images/treeicons/news-file.gif similarity index 100% rename from docs/en/tutorials/_images/treeicons/news-file.gif rename to docs/en/_images/treeicons/news-file.gif diff --git a/docs/en/tutorials/_images/treeicons/search-file.gif b/docs/en/_images/treeicons/search-file.gif similarity index 100% rename from docs/en/tutorials/_images/treeicons/search-file.gif rename to docs/en/_images/treeicons/search-file.gif diff --git a/docs/en/tutorials/_images/tutorial1_2nd_level-cut.jpg b/docs/en/_images/tutorial1_2nd_level-cut.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_2nd_level-cut.jpg rename to docs/en/_images/tutorial1_2nd_level-cut.jpg diff --git a/docs/en/tutorials/_images/tutorial1_addpage.jpg b/docs/en/_images/tutorial1_addpage.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_addpage.jpg rename to docs/en/_images/tutorial1_addpage.jpg diff --git a/docs/en/tutorials/_images/tutorial1_cms-basic.jpg b/docs/en/_images/tutorial1_cms-basic.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_cms-basic.jpg rename to docs/en/_images/tutorial1_cms-basic.jpg diff --git a/docs/en/tutorials/_images/tutorial1_cms-numbered-3.jpg b/docs/en/_images/tutorial1_cms-numbered-3.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_cms-numbered-3.jpg rename to docs/en/_images/tutorial1_cms-numbered-3.jpg diff --git a/docs/en/tutorials/_images/tutorial1_cms-numbered-5.jpg b/docs/en/_images/tutorial1_cms-numbered-5.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_cms-numbered-5.jpg rename to docs/en/_images/tutorial1_cms-numbered-5.jpg diff --git a/docs/en/tutorials/_images/tutorial1_cms-numbered.jpg b/docs/en/_images/tutorial1_cms-numbered.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_cms-numbered.jpg rename to docs/en/_images/tutorial1_cms-numbered.jpg diff --git a/docs/en/tutorials/_images/tutorial1_home-small.jpg b/docs/en/_images/tutorial1_home-small.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_home-small.jpg rename to docs/en/_images/tutorial1_home-small.jpg diff --git a/docs/en/tutorials/_images/tutorial1_home-template.jpg b/docs/en/_images/tutorial1_home-template.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_home-template.jpg rename to docs/en/_images/tutorial1_home-template.jpg diff --git a/docs/en/tutorials/_images/tutorial1_homepage-type.jpg b/docs/en/_images/tutorial1_homepage-type.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_homepage-type.jpg rename to docs/en/_images/tutorial1_homepage-type.jpg diff --git a/docs/en/tutorials/_images/tutorial1_menu-two-level-small.jpg b/docs/en/_images/tutorial1_menu-two-level-small.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_menu-two-level-small.jpg rename to docs/en/_images/tutorial1_menu-two-level-small.jpg diff --git a/docs/en/tutorials/_images/tutorial1_menu-two-level.jpg b/docs/en/_images/tutorial1_menu-two-level.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_menu-two-level.jpg rename to docs/en/_images/tutorial1_menu-two-level.jpg diff --git a/docs/en/tutorials/_images/tutorial1_menu.jpg b/docs/en/_images/tutorial1_menu.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_menu.jpg rename to docs/en/_images/tutorial1_menu.jpg diff --git a/docs/en/tutorials/_images/tutorial1_subtemplates-diagram.jpg b/docs/en/_images/tutorial1_subtemplates-diagram.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_subtemplates-diagram.jpg rename to docs/en/_images/tutorial1_subtemplates-diagram.jpg diff --git a/docs/en/tutorials/_images/tutorial1_url.jpg b/docs/en/_images/tutorial1_url.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial1_url.jpg rename to docs/en/_images/tutorial1_url.jpg diff --git a/docs/en/tutorials/_images/tutorial2_articleholder.jpg b/docs/en/_images/tutorial2_articleholder.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_articleholder.jpg rename to docs/en/_images/tutorial2_articleholder.jpg diff --git a/docs/en/tutorials/_images/tutorial2_create-staff.jpg b/docs/en/_images/tutorial2_create-staff.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_create-staff.jpg rename to docs/en/_images/tutorial2_create-staff.jpg diff --git a/docs/en/tutorials/_images/tutorial2_data-collation.jpg b/docs/en/_images/tutorial2_data-collation.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_data-collation.jpg rename to docs/en/_images/tutorial2_data-collation.jpg diff --git a/docs/en/tutorials/_images/tutorial2_einstein.jpg b/docs/en/_images/tutorial2_einstein.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_einstein.jpg rename to docs/en/_images/tutorial2_einstein.jpg diff --git a/docs/en/tutorials/_images/tutorial2_homepage-news.jpg b/docs/en/_images/tutorial2_homepage-news.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_homepage-news.jpg rename to docs/en/_images/tutorial2_homepage-news.jpg diff --git a/docs/en/tutorials/_images/tutorial2_icons2.jpg b/docs/en/_images/tutorial2_icons2.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_icons2.jpg rename to docs/en/_images/tutorial2_icons2.jpg diff --git a/docs/en/tutorials/_images/tutorial2_news-cms.jpg b/docs/en/_images/tutorial2_news-cms.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_news-cms.jpg rename to docs/en/_images/tutorial2_news-cms.jpg diff --git a/docs/en/tutorials/_images/tutorial2_news.jpg b/docs/en/_images/tutorial2_news.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_news.jpg rename to docs/en/_images/tutorial2_news.jpg diff --git a/docs/en/tutorials/_images/tutorial2_newslist.jpg b/docs/en/_images/tutorial2_newslist.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_newslist.jpg rename to docs/en/_images/tutorial2_newslist.jpg diff --git a/docs/en/tutorials/_images/tutorial2_pagetype-inheritance.jpg b/docs/en/_images/tutorial2_pagetype-inheritance.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_pagetype-inheritance.jpg rename to docs/en/_images/tutorial2_pagetype-inheritance.jpg diff --git a/docs/en/tutorials/_images/tutorial2_photo.jpg b/docs/en/_images/tutorial2_photo.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_photo.jpg rename to docs/en/_images/tutorial2_photo.jpg diff --git a/docs/en/tutorials/_images/tutorial2_rss-feed.jpg b/docs/en/_images/tutorial2_rss-feed.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_rss-feed.jpg rename to docs/en/_images/tutorial2_rss-feed.jpg diff --git a/docs/en/tutorials/_images/tutorial2_staff-section.jpg b/docs/en/_images/tutorial2_staff-section.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial2_staff-section.jpg rename to docs/en/_images/tutorial2_staff-section.jpg diff --git a/docs/en/tutorials/_images/tutorial3_pollform.jpg b/docs/en/_images/tutorial3_pollform.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial3_pollform.jpg rename to docs/en/_images/tutorial3_pollform.jpg diff --git a/docs/en/tutorials/_images/tutorial3_pollresults.jpg b/docs/en/_images/tutorial3_pollresults.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial3_pollresults.jpg rename to docs/en/_images/tutorial3_pollresults.jpg diff --git a/docs/en/tutorials/_images/tutorial3_validation.jpg b/docs/en/_images/tutorial3_validation.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial3_validation.jpg rename to docs/en/_images/tutorial3_validation.jpg diff --git a/docs/en/tutorials/_images/tutorial4_search.jpg b/docs/en/_images/tutorial4_search.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial4_search.jpg rename to docs/en/_images/tutorial4_search.jpg diff --git a/docs/en/tutorials/_images/tutorial4_searchbox.jpg b/docs/en/_images/tutorial4_searchbox.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial4_searchbox.jpg rename to docs/en/_images/tutorial4_searchbox.jpg diff --git a/docs/en/tutorials/_images/tutorial5-completecode-blackcandy.zip b/docs/en/_images/tutorial5-completecode-blackcandy.zip similarity index 100% rename from docs/en/tutorials/_images/tutorial5-completecode-blackcandy.zip rename to docs/en/_images/tutorial5-completecode-blackcandy.zip diff --git a/docs/en/tutorials/_images/tutorial5-completecode.zip b/docs/en/_images/tutorial5-completecode.zip similarity index 100% rename from docs/en/tutorials/_images/tutorial5-completecode.zip rename to docs/en/_images/tutorial5-completecode.zip diff --git a/docs/en/tutorials/_images/tutorial5_addNew.jpg b/docs/en/_images/tutorial5_addNew.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_addNew.jpg rename to docs/en/_images/tutorial5_addNew.jpg diff --git a/docs/en/tutorials/_images/tutorial5_mentor.jpg b/docs/en/_images/tutorial5_mentor.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_mentor.jpg rename to docs/en/_images/tutorial5_mentor.jpg diff --git a/docs/en/tutorials/_images/tutorial5_mentor_creation.jpg b/docs/en/_images/tutorial5_mentor_creation.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_mentor_creation.jpg rename to docs/en/_images/tutorial5_mentor_creation.jpg diff --git a/docs/en/tutorials/_images/tutorial5_mentor_students.jpg b/docs/en/_images/tutorial5_mentor_students.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_mentor_students.jpg rename to docs/en/_images/tutorial5_mentor_students.jpg diff --git a/docs/en/tutorials/_images/tutorial5_module_creation.jpg b/docs/en/_images/tutorial5_module_creation.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_module_creation.jpg rename to docs/en/_images/tutorial5_module_creation.jpg diff --git a/docs/en/tutorials/_images/tutorial5_module_selection.jpg b/docs/en/_images/tutorial5_module_selection.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_module_selection.jpg rename to docs/en/_images/tutorial5_module_selection.jpg diff --git a/docs/en/tutorials/_images/tutorial5_project.jpg b/docs/en/_images/tutorial5_project.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_project.jpg rename to docs/en/_images/tutorial5_project.jpg diff --git a/docs/en/tutorials/_images/tutorial5_project_creation.jpg b/docs/en/_images/tutorial5_project_creation.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_project_creation.jpg rename to docs/en/_images/tutorial5_project_creation.jpg diff --git a/docs/en/tutorials/_images/tutorial5_projects_table.jpg b/docs/en/_images/tutorial5_projects_table.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_projects_table.jpg rename to docs/en/_images/tutorial5_projects_table.jpg diff --git a/docs/en/tutorials/_images/tutorial5_student_tab.jpg b/docs/en/_images/tutorial5_student_tab.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_student_tab.jpg rename to docs/en/_images/tutorial5_student_tab.jpg diff --git a/docs/en/tutorials/_images/tutorial5_students.jpg b/docs/en/_images/tutorial5_students.jpg similarity index 100% rename from docs/en/tutorials/_images/tutorial5_students.jpg rename to docs/en/_images/tutorial5_students.jpg diff --git a/docs/en/installation/_images/webpi-2-a-silverstripe-choice.jpg b/docs/en/_images/webpi-2-a-silverstripe-choice.jpg similarity index 100% rename from docs/en/installation/_images/webpi-2-a-silverstripe-choice.jpg rename to docs/en/_images/webpi-2-a-silverstripe-choice.jpg diff --git a/docs/en/installation/_images/webpi-2-b-dependencies.jpg b/docs/en/_images/webpi-2-b-dependencies.jpg similarity index 100% rename from docs/en/installation/_images/webpi-2-b-dependencies.jpg rename to docs/en/_images/webpi-2-b-dependencies.jpg diff --git a/docs/en/installation/_images/webpi-2-c-downloading-and-installaing.jpg b/docs/en/_images/webpi-2-c-downloading-and-installaing.jpg similarity index 100% rename from docs/en/installation/_images/webpi-2-c-downloading-and-installaing.jpg rename to docs/en/_images/webpi-2-c-downloading-and-installaing.jpg diff --git a/docs/en/installation/_images/webpi-2-d-installer-questions-step1.jpg b/docs/en/_images/webpi-2-d-installer-questions-step1.jpg similarity index 100% rename from docs/en/installation/_images/webpi-2-d-installer-questions-step1.jpg rename to docs/en/_images/webpi-2-d-installer-questions-step1.jpg diff --git a/docs/en/installation/_images/webpi-2-e-installer-questions-step2.jpg b/docs/en/_images/webpi-2-e-installer-questions-step2.jpg similarity index 100% rename from docs/en/installation/_images/webpi-2-e-installer-questions-step2.jpg rename to docs/en/_images/webpi-2-e-installer-questions-step2.jpg diff --git a/docs/en/installation/_images/webpi-2-f-success-message.jpg b/docs/en/_images/webpi-2-f-success-message.jpg similarity index 100% rename from docs/en/installation/_images/webpi-2-f-success-message.jpg rename to docs/en/_images/webpi-2-f-success-message.jpg diff --git a/docs/en/installation/_images/webpi-2-g-silverstripe-homepage.jpg b/docs/en/_images/webpi-2-g-silverstripe-homepage.jpg similarity index 100% rename from docs/en/installation/_images/webpi-2-g-silverstripe-homepage.jpg rename to docs/en/_images/webpi-2-g-silverstripe-homepage.jpg diff --git a/docs/en/installation/_images/webpi-2-h-cms-interface-working.jpg b/docs/en/_images/webpi-2-h-cms-interface-working.jpg similarity index 100% rename from docs/en/installation/_images/webpi-2-h-cms-interface-working.jpg rename to docs/en/_images/webpi-2-h-cms-interface-working.jpg diff --git a/docs/en/topics/_images/widget_demo.gif b/docs/en/_images/widget_demo.gif similarity index 100% rename from docs/en/topics/_images/widget_demo.gif rename to docs/en/_images/widget_demo.gif diff --git a/docs/en/topics/_images/widget_demo.gif.png b/docs/en/_images/widget_demo.gif.png similarity index 100% rename from docs/en/topics/_images/widget_demo.gif.png rename to docs/en/_images/widget_demo.gif.png diff --git a/docs/en/changelogs/3.0.10.md b/docs/en/changelogs/3.0.10.md deleted file mode 100644 index 8e06089aa..000000000 --- a/docs/en/changelogs/3.0.10.md +++ /dev/null @@ -1,26 +0,0 @@ -# 3.0.10 - -## Upgrading - - * If relying on partial caching of content between logged in users, be aware that the cache is now automatically - segmented based on both the current member ID, and the versioned reading mode. If this is not an appropriate - method (such as if the same content is served to logged in users within partial caching) then it is necessary - to adjust the config value of `SSViewer.global_key` to something more or less sensitive. - -## Security - - * [BUG Fix issue with versioned dataobjects being cached between stages](https://github.com/silverstripe/silverstripe-framework/commit/4415a75d9304a3930b9c28763fc092299640c685) - See [announcement SS-2014-007](http://www.silverstripe.org/ss-2014-007-confidentiality-breach-can-occur-between-draft-and-live-modes/) - * [BUG Fix encoding of JS redirection script](https://github.com/silverstripe/silverstripe-framework/commit/f8e3bbe3ae3f29f22d85abb73cea033659511168) - See [announcement SS-2014-006](http://www.silverstripe.org/ss-2014-006-xss-in-returnurl-redirection/) - * [Amends solution to SS-2014-006](https://github.com/silverstripe/silverstripe-framework/commit/5b0a96979484fad12e11ce69aef98feda57b321f) - * [FIX Prevent SQLi when no URL filters are applied](https://github.com/silverstripe/silverstripe-cms/commit/114df8a3a5e4800ef7586c5d9c8d79798fd2a11d) - See [announcement SS-2014-004](http://www.silverstripe.org/ss-2014-004-sql-injection-in-sitetree-with-custom-urlsegmentfilter-rules/) - * [FIX Do now allow arbitary class creation in CMS](https://github.com/silverstripe/silverstripe-cms/commit/bf9b22fd4331a6f78cec12a75262f570b025ec2d) - See [announcement SS-2014-005](http://www.silverstripe.org/ss-2014-005-arbitrary-class-creation-in-cms-backend/) - -## General - - * [Rewrote usages of error suppression operator](https://github.com/silverstripe/silverstripe-framework/commit/6d5d3d8cb7e69e0b37471b1e34077211b0f631fe) - -## Changelog - - * [framework](https://github.com/silverstripe/silverstripe-framework/releases/tag/3.0.10) - * [cms](https://github.com/silverstripe/silverstripe-cms/releases/tag/3.0.10) - * [installer](https://github.com/silverstripe/silverstripe-installer/releases/tag/3.0.10) diff --git a/docs/en/changelogs/3.0.11.md b/docs/en/changelogs/3.0.11.md deleted file mode 100644 index 71191bd7e..000000000 --- a/docs/en/changelogs/3.0.11.md +++ /dev/null @@ -1,19 +0,0 @@ -# 3.0.11 - -Minor security release - -## Security - - * 2014-04-16 [9d74bc4](https://github.com/silverstripe/sapphire/commit/9d74bc4) Potential DoS exploit in TinyMCE - See [announcement SS-2014-009](http://www.silverstripe.org/ss-2014-009-potential-dos-exploit-in-tinymce/) - * 2014-05-05 [9bfeffd](https://github.com/silverstripe/silverstripe-framework/commit/9bfeffd) Injection / Filesystem vulnerability in generatesecuretoken - See [announcement SS-2014-010](http://www.silverstripe.org/ss-2014-010-injection-filesystem-vulnerability-in-generatesecuretoken/) - * 2014-05-07 [0099a18](https://github.com/silverstripe/silverstripe-framework/commit/0099a18) Folder filename injection - See [announcement SS-2014-011](http://www.silverstripe.org/ss-2014-011-folder-filename-injection/) - -### Bugfixes - - * 2013-06-20 [f2c4a62](https://github.com/silverstripe/sapphire/commit/f2c4a62) ConfirmedPasswordField used to expose existing hash (Hamish Friedlander) - -## Changelog - - * [framework](https://github.com/silverstripe/silverstripe-framework/releases/tag/3.0.11) - * [cms](https://github.com/silverstripe/silverstripe-cms/releases/tag/3.0.11) - * [installer](https://github.com/silverstripe/silverstripe-installer/releases/tag/3.0.11) diff --git a/docs/en/changelogs/3.0.9.md b/docs/en/changelogs/3.0.9.md deleted file mode 100644 index d734f9f61..000000000 --- a/docs/en/changelogs/3.0.9.md +++ /dev/null @@ -1,12 +0,0 @@ -# 3.0.9 - -## Overview - - * Security: Require ADMIN for ?flush=1&isDev=1 ([SS-2014-001](http://www.silverstripe.org/ss-2014-001-require-admin-for-flush1-and-isdev1)) - * Security: XSS in third party library (SWFUpload) ([SS-2014-002](http://www.silverstripe.org/ss-2014-002-xss-in-third-party-library-swfupload/)) - -## Changelog - - * [framework](https://github.com/silverstripe/silverstripe-framework/releases/tag/3.0.9) - * [cms](https://github.com/silverstripe/silverstripe-framework/releases/tag/3.0.9) - * [installer](https://github.com/silverstripe/silverstripe-framework/releases/tag/3.0.9) \ No newline at end of file diff --git a/docs/en/changelogs/3.1.3.md b/docs/en/changelogs/3.1.3.md deleted file mode 100644 index d43eb42fb..000000000 --- a/docs/en/changelogs/3.1.3.md +++ /dev/null @@ -1,29 +0,0 @@ -# 3.1.3 - -## Overview - - * Security: Require ADMIN for ?flush=1&isDev=1 ([SS-2014-001](http://www.silverstripe.org/ss-2014-001-require-admin-for-flush1-and-isdev1)) - * Security: XSS in third party library (SWFUpload) ([SS-2014-002](http://www.silverstripe.org/ss-2014-002-xss-in-third-party-library-swfupload/)) - * Security: SiteTree.ExtraMeta allows JavaScript for malicious CMS authors ([SS-2014-003](http://www.silverstripe.org/ss-2014-003-extrameta-allows-javascript-for-malicious-cms-authors-/)) - * Better loading performance when using multiple `UploadField` instances - * Option for `force_js_to_bottom` on `Requirements` class (ignoring inline `