diff --git a/core/modules/views/src/Plugin/views/style/StylePluginBase.php b/core/modules/views/src/Plugin/views/style/StylePluginBase.php index 719ee58e49412cd9a0d9cf51679666f826e63d7e..148e053c360995214d45fef3643b7a8d08af0d4d 100644 --- a/core/modules/views/src/Plugin/views/style/StylePluginBase.php +++ b/core/modules/views/src/Plugin/views/style/StylePluginBase.php @@ -482,9 +482,17 @@ public function render() { * grouping. * * @param $sets - * Array containing the grouping sets to render. + * An array keyed by group content containing the grouping sets to render. + * Each set contains the following associative array: + * - group: The group content. + * - level: The hierarchical level of the grouping. + * - rows: The result rows to be rendered in this group.. * @param $level - * Integer indicating the hierarchical level of the grouping. + * (deprecated) This is no longer used and will be removed in Drupal 9. The + * 'level' key in $sets is used to indicate the hierarchical level of the + * grouping. + * + * @todo Remove the $level parameter in https://www.drupal.org/node/2633890. * * @return string * Rendered output of given grouping sets. @@ -493,16 +501,16 @@ public function renderGroupingSets($sets, $level = 0) { $output = array(); $theme_functions = $this->view->buildThemeFunctions($this->groupingTheme); foreach ($sets as $set) { + $level = isset($set['level']) ? $set['level'] : 0; + $row = reset($set['rows']); // Render as a grouping set. if (is_array($row) && isset($row['group'])) { - $output[] = array( + $single_output = array( '#theme' => $theme_functions, '#view' => $this->view, '#grouping' => $this->options['grouping'][$level], - '#grouping_level' => $level, '#rows' => $set['rows'], - '#title' => $set['group'], ); } // Render as a record set. @@ -515,10 +523,11 @@ public function renderGroupingSets($sets, $level = 0) { } $single_output = $this->renderRowGroup($set['rows']); - $single_output['#grouping_level'] = $level; - $single_output['#title'] = $set['group']; - $output[] = $single_output; } + + $single_output['#grouping_level'] = $level; + $single_output['#title'] = $set['group']; + $output[] = $single_output; } unset($this->view->row_index); return $output; @@ -546,9 +555,11 @@ public function renderGroupingSets($sets, $level = 0) { * array( * 'grouping_field_1:grouping_1' => array( * 'group' => 'grouping_field_1:content_1', + * 'level' => 0, * 'rows' => array( * 'grouping_field_2:grouping_a' => array( * 'group' => 'grouping_field_2:content_a', + * 'level' => 1, * 'rows' => array( * $row_index_1 => $row_1, * $row_index_2 => $row_2, @@ -580,7 +591,7 @@ public function renderGrouping($records, $groupings = array(), $group_rendered = // hierarchically positioned set where the current row belongs to. // While iterating, parent groups, that do not exist yet, are added. $set = &$sets; - foreach ($groupings as $info) { + foreach ($groupings as $level => $info) { $field = $info['field']; $rendered = isset($info['rendered']) ? $info['rendered'] : $group_rendered; $rendered_strip = isset($info['rendered_strip']) ? $info['rendered_strip'] : FALSE; @@ -613,6 +624,7 @@ public function renderGrouping($records, $groupings = array(), $group_rendered = // Create the group if it does not exist yet. if (empty($set[$grouping])) { $set[$grouping]['group'] = $group_content; + $set[$grouping]['level'] = $level; $set[$grouping]['rows'] = array(); } diff --git a/core/modules/views/src/Tests/Plugin/StyleTest.php b/core/modules/views/src/Tests/Plugin/StyleTest.php index 68ce82eb10342d22f015e73013e660e308f0412e..c44eda6fa9a74206ab3e56bb041193738faac5d9 100644 --- a/core/modules/views/src/Tests/Plugin/StyleTest.php +++ b/core/modules/views/src/Tests/Plugin/StyleTest.php @@ -149,8 +149,10 @@ function _testGrouping($stripped = FALSE) { $expected = array(); $expected['Job: Singer'] = array(); $expected['Job: Singer']['group'] = 'Job: Singer'; + $expected['Job: Singer']['level'] = 0; $expected['Job: Singer']['rows']['Age: 25'] = array(); $expected['Job: Singer']['rows']['Age: 25']['group'] = 'Age: 25'; + $expected['Job: Singer']['rows']['Age: 25']['level'] = 1; $expected['Job: Singer']['rows']['Age: 25']['rows'][0] = new ResultRow(['index' => 0]); $expected['Job: Singer']['rows']['Age: 25']['rows'][0]->views_test_data_name = 'John'; $expected['Job: Singer']['rows']['Age: 25']['rows'][0]->views_test_data_job = 'Singer'; @@ -158,6 +160,7 @@ function _testGrouping($stripped = FALSE) { $expected['Job: Singer']['rows']['Age: 25']['rows'][0]->views_test_data_id = '1'; $expected['Job: Singer']['rows']['Age: 27'] = array(); $expected['Job: Singer']['rows']['Age: 27']['group'] = 'Age: 27'; + $expected['Job: Singer']['rows']['Age: 27']['level'] = 1; $expected['Job: Singer']['rows']['Age: 27']['rows'][1] = new ResultRow(['index' => 1]); $expected['Job: Singer']['rows']['Age: 27']['rows'][1]->views_test_data_name = 'George'; $expected['Job: Singer']['rows']['Age: 27']['rows'][1]->views_test_data_job = 'Singer'; @@ -165,8 +168,10 @@ function _testGrouping($stripped = FALSE) { $expected['Job: Singer']['rows']['Age: 27']['rows'][1]->views_test_data_id = '2'; $expected['Job: Drummer'] = array(); $expected['Job: Drummer']['group'] = 'Job: Drummer'; + $expected['Job: Drummer']['level'] = 0; $expected['Job: Drummer']['rows']['Age: 28'] = array(); $expected['Job: Drummer']['rows']['Age: 28']['group'] = 'Age: 28'; + $expected['Job: Drummer']['rows']['Age: 28']['level'] = 1; $expected['Job: Drummer']['rows']['Age: 28']['rows'][2] = new ResultRow(['index' => 2]); $expected['Job: Drummer']['rows']['Age: 28']['rows'][2]->views_test_data_name = 'Ringo'; $expected['Job: Drummer']['rows']['Age: 28']['rows'][2]->views_test_data_job = 'Drummer';