diff --git a/core/modules/field_layout/src/FieldLayoutBuilder.php b/core/modules/field_layout/src/FieldLayoutBuilder.php index 8ef5d048fc72f48a6ae563bb54bb72c79341f39d..fdbefd5e8d38c797a4b663daa3e950df829c54cd 100644 --- a/core/modules/field_layout/src/FieldLayoutBuilder.php +++ b/core/modules/field_layout/src/FieldLayoutBuilder.php @@ -67,12 +67,15 @@ public function buildView(array &$build, EntityDisplayWithLayoutInterface $displ $regions = array_fill_keys($layout_definition->getRegionNames(), []); foreach ($fields as $name => $field) { - // Move the field from the top-level of $build into a region-specific - // section. + // If the region is controlled by the layout, move the field from the + // top-level of $build into a region-specific section. Custom regions + // could be set by other code at run-time; these should be ignored. // @todo Ideally the array structure would remain unchanged, see // https://www.drupal.org/node/2846393. - $regions[$field['region']][$name] = $build[$name]; - unset($build[$name]); + if (isset($regions[$field['region']])) { + $regions[$field['region']][$name] = $build[$name]; + unset($build[$name]); + } } // Ensure this will not conflict with any existing array elements by // prefixing with an underscore. @@ -103,7 +106,7 @@ public function buildForm(array &$build, EntityDisplayWithLayoutInterface $displ // avoids breaking hook_form_alter() implementations by not actually // moving the field in the form structure. If a #group is already set, // do not overwrite it. - if (!isset($build[$name]['#group'])) { + if (isset($regions[$field['region']]) && !isset($build[$name]['#group'])) { $build[$name]['#group'] = $field['region']; } } diff --git a/core/modules/field_layout/tests/src/Unit/FieldLayoutBuilderTest.php b/core/modules/field_layout/tests/src/Unit/FieldLayoutBuilderTest.php index 8e6bf956c4bfde3c00b4ee0f36ebb79ff3099cfb..44332987cdcc9c8f17ef448d59ff1ad3b705288e 100644 --- a/core/modules/field_layout/tests/src/Unit/FieldLayoutBuilderTest.php +++ b/core/modules/field_layout/tests/src/Unit/FieldLayoutBuilderTest.php @@ -93,6 +93,9 @@ public function testBuildView() { 'test1' => [ '#markup' => 'Test1', ], + 'test2' => [ + '#markup' => 'Test2', + ], 'non_configurable_field' => [ '#markup' => 'Non-configurable', ], @@ -111,6 +114,9 @@ public function testBuildView() { 'test1' => [ 'region' => 'right', ], + 'test2' => [ + 'region' => 'unknown_region', + ], 'non_configurable_field' => [ 'region' => 'left', ], @@ -120,6 +126,9 @@ public function testBuildView() { ]); $expected = [ + 'test2' => [ + '#markup' => 'Test2', + ], 'non_configurable_field' => [ '#markup' => 'Non-configurable', ], @@ -169,6 +178,9 @@ public function testBuildForm() { '#markup' => 'Test2', '#group' => 'existing_group', ], + 'test3' => [ + '#markup' => 'Test3', + ], 'field_layout' => [ '#markup' => 'Field created through the UI happens to be named "Layout"', ], @@ -190,6 +202,9 @@ public function testBuildForm() { 'test2' => [ 'region' => 'left', ], + 'test3' => [ + 'region' => 'unknown_region', + ], 'field_layout' => [ 'region' => 'right', ], @@ -207,6 +222,9 @@ public function testBuildForm() { '#markup' => 'Test2', '#group' => 'existing_group', ], + 'test3' => [ + '#markup' => 'Test3', + ], 'field_layout' => [ '#markup' => 'Field created through the UI happens to be named "Layout"', '#group' => 'right',