diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 9b89250..20fc1f2 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1146,6 +1146,12 @@ function template_preprocess_container(&$variables) {
$variables['children'] = $element['#children'];
$variables['attributes'] = $element['#attributes'];
+
+ // Display any error messages.
+ $variables['errors'] = NULL;
+ if (!empty($element['#errors']) && empty($element['#error_no_message'])) {
+ $variables['errors'] = $element['#errors'];
+ }
}
/**
diff --git a/core/modules/system/src/Tests/Common/RenderElementTypesTest.php b/core/modules/system/src/Tests/Common/RenderElementTypesTest.php
index e60bb52..4e7226d 100644
--- a/core/modules/system/src/Tests/Common/RenderElementTypesTest.php
+++ b/core/modules/system/src/Tests/Common/RenderElementTypesTest.php
@@ -56,7 +56,7 @@ function testContainer() {
$this->assertElements(array(
'#type' => 'container',
'#markup' => 'foo',
- ), "
foo
\n", "#type 'container' with no HTML attributes");
+ ), "\nfoo\n
\n", "#type 'container' with no HTML attributes");
// Container with a class.
$this->assertElements(array(
@@ -65,7 +65,7 @@ function testContainer() {
'#attributes' => array(
'class' => array('bar'),
),
- ), 'foo
' . "\n", "#type 'container' with a class HTML attribute");
+ ), '' . "\n" . 'foo' . "\n" . '
' . "\n", "#type 'container' with a class HTML attribute");
// Container with children.
$this->assertElements(array(
@@ -73,7 +73,7 @@ function testContainer() {
'child' => array(
'#markup' => 'foo',
),
- ), "foo
\n", "#type 'container' with child elements");
+ ), "\nfoo\n
\n", "#type 'container' with child elements");
}
/**
diff --git a/core/modules/system/src/Tests/Form/ElementTest.php b/core/modules/system/src/Tests/Form/ElementTest.php
index 684e13a..0ff443f 100644
--- a/core/modules/system/src/Tests/Form/ElementTest.php
+++ b/core/modules/system/src/Tests/Form/ElementTest.php
@@ -162,11 +162,18 @@ public function testFormAutocomplete() {
}
/**
- * Tests form element error messages.
+ * Tests form details element error messages.
*/
- public function testFormElementErrors() {
+ public function testFormDetailsErrors() {
$this->drupalPostForm('form_test/details-form', [], 'Submit');
$this->assertText('I am an error on the details element.');
}
+ /**
+ * Tests form container element error messages.
+ */
+ public function testFormElementErrors() {
+ $this->drupalPostForm('form_test/container-form', [], 'Submit');
+ $this->assertText('I am an error on the container element.');
+ }
}
diff --git a/core/modules/system/templates/container.html.twig b/core/modules/system/templates/container.html.twig
index 6cb299b..02fe98c 100644
--- a/core/modules/system/templates/container.html.twig
+++ b/core/modules/system/templates/container.html.twig
@@ -12,6 +12,7 @@
*
* Available variables:
* - attributes: HTML attributes for the containing element.
+ * - errors: (optional) Any errors for this container element, may not be set.
* - children: The rendered child elements of the container.
* - has_parent: A flag to indicate that the container has one or more parent
containers.
@@ -27,4 +28,11 @@
has_parent ? 'form-wrapper',
]
%}
-{{ children }}
+
+{% if errors %}
+
+ {{ errors }}
+
+{% endif %}
+{{ children }}
+
diff --git a/core/modules/system/tests/modules/form_test/form_test.routing.yml b/core/modules/system/tests/modules/form_test/form_test.routing.yml
index 42a6ba4..327d7fd 100644
--- a/core/modules/system/tests/modules/form_test/form_test.routing.yml
+++ b/core/modules/system/tests/modules/form_test/form_test.routing.yml
@@ -409,6 +409,14 @@ form_test.details_form:
requirements:
_access: 'TRUE'
+form_test.container_form:
+ path: '/form_test/container-form'
+ defaults:
+ _form: '\Drupal\form_test\Form\FormTestContainerForm'
+ _title: 'Form contaner form test'
+ requirements:
+ _access: 'TRUE'
+
form_test.description_display:
path: '/form_test/form-descriptions'
defaults:
diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestDetailsForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestDetailsForm.php
index 5949679..55fcbfd 100644
--- a/core/modules/system/tests/modules/form_test/src/Form/FormTestDetailsForm.php
+++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestDetailsForm.php
@@ -6,7 +6,7 @@
use Drupal\Core\Form\FormStateInterface;
/**
- * Builds a simple form to test the #group property on #type 'container'.
+ * Builds a simple form to test the #group property on #type 'details'.
*/
class FormTestDetailsForm extends FormBase {
diff --git a/core/themes/classy/templates/form/container.html.twig b/core/themes/classy/templates/form/container.html.twig
index 0da6c38..caafe73 100644
--- a/core/themes/classy/templates/form/container.html.twig
+++ b/core/themes/classy/templates/form/container.html.twig
@@ -12,6 +12,7 @@
*
* Available variables:
* - attributes: HTML attributes for the containing element.
+ * - errors: (optional) Any errors for this container element, may not be set.
* - children: The rendered child elements of the container.
* - has_parent: A flag to indicate that the container has one or more parent
containers.
@@ -25,4 +26,11 @@
has_parent ? 'form-wrapper',
]
%}
-{{ children }}
+
+{% if errors %}
+
+ {{ errors }}
+
+{% endif %}
+{{ children }}
+