diff --git a/admin/_config.php b/admin/_config.php
index d3397bec0..2e760267d 100644
--- a/admin/_config.php
+++ b/admin/_config.php
@@ -3,7 +3,6 @@
HtmlEditorConfig::get('cms')->setOptions(array(
'friendly_name' => 'Default CMS',
'priority' => '50',
- 'mode' => 'none', // initialized through LeftAndMain.EditFor.js logic
'body_class' => 'typography',
'document_base_url' => isset($_SERVER['HTTP_HOST']) ? Director::absoluteBaseURL() : null,
diff --git a/control/HTTPResponse.php b/control/HTTPResponse.php
index 5489a8949..9e7c12190 100644
--- a/control/HTTPResponse.php
+++ b/control/HTTPResponse.php
@@ -234,12 +234,14 @@ class SS_HTTPResponse {
}
if(in_array($this->statusCode, self::$redirect_codes) && headers_sent($file, $line)) {
- $url = $this->headers['Location'];
+ $url = (string)$this->headers['Location'];
+ $urlATT = Convert::raw2htmlatt($url);
+ $urlJS = Convert::raw2js($url);
echo
- "
Redirecting to "
- . "$url... (output started on $file, line $line)
-
- ";
+ "Redirecting to "
+ . "$urlATT... (output started on $file, line $line)
+
+ ";
} else {
$line = $file = null;
if(!headers_sent($file, $line)) {
diff --git a/core/manifest/TemplateLoader.php b/core/manifest/TemplateLoader.php
index f1e8e6a66..4fd30f25b 100644
--- a/core/manifest/TemplateLoader.php
+++ b/core/manifest/TemplateLoader.php
@@ -64,27 +64,26 @@ class SS_TemplateLoader {
public function findTemplates($templates, $theme = null) {
$result = array();
$project = project();
-
+
foreach ((array) $templates as $template) {
$found = false;
-
+
if (strpos($template, '/')) {
list($type, $template) = explode('/', $template, 2);
} else {
$type = null;
}
-
+
if ($found = $this->getManifest()->getCandidateTemplate($template, $theme)) {
if ($type && isset($found[$type])) {
- $found = array(
- 'main' => $found[$type]
- );
+ $found = array(
+ 'main' => $found[$type]
+ );
}
-
$result = array_merge($found, $result);
}
}
-
+
return $result;
}
diff --git a/core/manifest/TemplateManifest.php b/core/manifest/TemplateManifest.php
index 47de70d56..371cb0371 100644
--- a/core/manifest/TemplateManifest.php
+++ b/core/manifest/TemplateManifest.php
@@ -110,17 +110,23 @@ class SS_TemplateManifest {
* @return array
*/
public function getCandidateTemplate($name, $theme = null) {
+ $found = array();
$candidates = $this->getTemplate($name);
-
- if ($this->project && isset($candidates[$this->project])) {
- $found = $candidates[$this->project];
- } else if ($theme && isset($candidates['themes'][$theme])) {
+
+ // theme overrides modules
+ if ($theme && isset($candidates['themes'][$theme])) {
$found = array_merge($candidates, $candidates['themes'][$theme]);
- } else {
- $found = $candidates;
}
- if(isset($found['themes'])) unset($found['themes']);
-
+ // project overrides theme
+ if ($this->project && isset($candidates[$this->project])) {
+ $found = array_merge($found, $candidates[$this->project]);
+ }
+
+ $found = ($found) ? $found : $candidates;
+
+ if (isset($found['themes'])) unset($found['themes']);
+ if (isset($found[$this->project])) unset($found[$this->project]);
+
return $found;
}
diff --git a/css/UploadField.css b/css/UploadField.css
index 8d5ffcdd3..d4df94d49 100644
--- a/css/UploadField.css
+++ b/css/UploadField.css
@@ -53,3 +53,4 @@ Used in side panels and action tabs
.ss-upload .clear { clear: both; }
.ss-upload .ss-uploadfield-fromcomputer input { /* since we can't really style the file input, we use this hack to make it as big as the button and hide it */ position: absolute; top: 0; right: 0; margin: 0; opacity: 0; filter: alpha(opacity=0); transform: translate(-300px, 0) scale(4); font-size: 23px; direction: ltr; cursor: pointer; height: 30px; line-height: 30px; }
+.ss-upload .loader { height: 94px; background: transparent url(../admin/images/spinner.gif) no-repeat 50% 50%; }
diff --git a/docs/en/changelogs/3.0.10.md b/docs/en/changelogs/3.0.10.md
new file mode 100644
index 000000000..427b54498
--- /dev/null
+++ b/docs/en/changelogs/3.0.10.md
@@ -0,0 +1,12 @@
+# 3.0.10
+
+## Overview
+
+ * Security: Partially cached content from stage or other reading modes is no longer emitted to live
+
+## 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.
\ No newline at end of file
diff --git a/docs/en/howto/gridfield-rowaction.md b/docs/en/howto/gridfield-rowaction.md
index ba7e450a9..32e05b25e 100644
--- a/docs/en/howto/gridfield-rowaction.md
+++ b/docs/en/howto/gridfield-rowaction.md
@@ -83,10 +83,17 @@ a new instance of the class to the [api:GridFieldConfig] object. The `GridField`
manipulating the `GridFieldConfig` instance if required.
:::php
+ // option 1: creating a new GridField with the CustomAction
$config = GridFieldConfig::create();
$config->addComponent(new GridFieldCustomAction());
$gridField = new GridField('Teams', 'Teams', $this->Teams(), $config);
+
+ // option 2: adding the CustomAction to an exisitng GridField
+ $gridField->getConfig()->addComponent(new GridFieldCustomAction());
+
+For documentation on adding a Component to a `GridField` created by `ModelAdmin`
+please view the [ModelAdmin Reference](/reference/modeladmin#gridfield-customization) section `GridField Customization`
Now let's go back and dive through the `GridFieldCustomAction` class in more
detail.
diff --git a/docs/en/reference/form-field-types.md b/docs/en/reference/form-field-types.md
index 3d45812fc..5aeef002f 100644
--- a/docs/en/reference/form-field-types.md
+++ b/docs/en/reference/form-field-types.md
@@ -28,7 +28,7 @@ This is a highlevel overview of available `[api:FormField]` subclasses. An autom
* `[api:DatetimeField]`: Combined date- and time field.
* `[api:EmailField]`: Text input field with validation for correct email format according to RFC 2822.
* `[api:GroupedDropdownField]`: Grouped dropdown, using