diff --git a/core/modules/views/templates/views-view-grid.html.twig b/core/modules/views/templates/views-view-grid.html.twig index f2b155218e5a601cebba4a86deaa0d5fb73d60b6..b1aab93c5cbf7fb6dbe649e3ef017c7335b266b5 100644 --- a/core/modules/views/templates/views-view-grid.html.twig +++ b/core/modules/views/templates/views-view-grid.html.twig @@ -59,7 +59,7 @@ {% for column in row.content %} - {{ column.content }} + {{- column.content -}} {% endfor %} @@ -69,7 +69,7 @@ {% for row in column.content %} - {{ row.content }} + {{- row.content -}} {% endfor %} diff --git a/core/modules/views/templates/views-view-list.html.twig b/core/modules/views/templates/views-view-list.html.twig index 8de787cd4bd9b65c005ddafe04fb3272b9fc4b87..558b31a28d70a71dbed2ce0f15ec379338577bc1 100644 --- a/core/modules/views/templates/views-view-list.html.twig +++ b/core/modules/views/templates/views-view-list.html.twig @@ -28,7 +28,9 @@ <{{ list.type }}{{ list.attributes }}> {% for row in rows %} - {{ row.content }} + + {{- row.content -}} + {% endfor %} diff --git a/core/modules/views/templates/views-view-unformatted.html.twig b/core/modules/views/templates/views-view-unformatted.html.twig index 7ee1f81e5bc834d31b29f2a0141dbc3e486129f6..b67b5f7d7ce956ba82f025c2cc9416b5c8e43b30 100644 --- a/core/modules/views/templates/views-view-unformatted.html.twig +++ b/core/modules/views/templates/views-view-unformatted.html.twig @@ -27,6 +27,6 @@ ] %} - {{ row.content }} + {{- row.content -}} {% endfor %} diff --git a/core/modules/views/tests/modules/views_test_data/views_test_data.views_execution.inc b/core/modules/views/tests/modules/views_test_data/views_test_data.views_execution.inc index dd69f4c95fbcd30b4842c469a85f8e99697d4056..8eaa704a188bbb52deecab2c74c26b14267cbcf7 100644 --- a/core/modules/views/tests/modules/views_test_data/views_test_data.views_execution.inc +++ b/core/modules/views/tests/modules/views_test_data/views_test_data.views_execution.inc @@ -74,6 +74,11 @@ function views_test_data_placeholders() { */ function views_test_data_views_post_render(ViewExecutable $view, &$output, CachePluginBase $cache) { \Drupal::state()->set('views_hook_test_views_post_render', TRUE); + if ($view->storage->id() === 'test_page_display' && $view->current_display === 'empty_row') { + for ($i = 0; $i < 5; $i++) { + $output['#rows'][0]['#rows'][] = []; + } + } } /** diff --git a/core/modules/views/tests/src/Kernel/Plugin/DisplayPageTest.php b/core/modules/views/tests/src/Kernel/Plugin/DisplayPageTest.php index e420ea77c3d1e4d6259bbec564e48094e13e9a33..3904cdb490cdc3c555d3339e29310b94a6902c54 100644 --- a/core/modules/views/tests/src/Kernel/Plugin/DisplayPageTest.php +++ b/core/modules/views/tests/src/Kernel/Plugin/DisplayPageTest.php @@ -30,7 +30,7 @@ class DisplayPageTest extends ViewsKernelTestBase { * * @var array */ - public static $modules = ['system', 'user', 'field']; + public static $modules = ['system', 'user', 'field', 'views_test_data']; /** * The router dumper to get all routes. @@ -220,4 +220,40 @@ public function testReadMore() { $this->assertTrue($view->getDisplay()->getOption('use_more_always'), 'Always display the more link by default.'); } + /** + * Tests the templates with empty rows. + */ + public function testEmptyRow() { + $view = Views::getView('test_page_display'); + $view->initDisplay(); + $view->newDisplay('page', 'Page', 'empty_row'); + $view->save(); + + $styles = [ + 'default' => '//div[@class="views-row"]', + 'grid' => '//div[contains(@class, "views-col")]', + 'html_list' => '//div[@class="item-list"]//li', + ]; + + $themes = ['bartik', 'classy', 'seven', 'stable', 'stark']; + + foreach ($themes as $theme) { + \Drupal::service('theme_handler')->install([$theme]); + \Drupal::theme()->setActiveTheme(\Drupal::service('theme.initialization')->initTheme($theme)); + foreach ($styles as $type => $xpath) { + $view = Views::getView('test_page_display'); + $view->storage->invalidateCaches(); + $view->initDisplay(); + $view->setDisplay('empty_row'); + $view->displayHandlers->get('empty_row')->default_display->options['style']['type'] = $type; + $view->initStyle(); + $this->executeView($view); + $output = $view->preview(); + $output = \Drupal::service('renderer')->renderRoot($output); + $this->setRawContent($output); + $this->assertCount(5, $this->xpath("{$xpath}[not(text()) and not(node())]"), "Empty rows in theme '$theme', type '$type'."); + } + } + } + } diff --git a/core/themes/classy/templates/views/views-view-grid.html.twig b/core/themes/classy/templates/views/views-view-grid.html.twig index 2fe3028c9304b1a1c00a183c9b68e47a498aee2f..8a3a20bbfbcb33eeee42a8d220e12435574df08f 100644 --- a/core/themes/classy/templates/views/views-view-grid.html.twig +++ b/core/themes/classy/templates/views/views-view-grid.html.twig @@ -57,7 +57,7 @@ {% for column in row.content %} - {{ column.content }} + {{- column.content -}} {% endfor %} @@ -67,7 +67,7 @@ {% for row in column.content %} - {{ row.content }} + {{- row.content -}} {% endfor %} diff --git a/core/themes/classy/templates/views/views-view-list.html.twig b/core/themes/classy/templates/views/views-view-list.html.twig index 44d4766d44b20d97b3480a289f01320855412a34..50cc74ba13fb0a8f922c2471cdce7c98246c9c01 100644 --- a/core/themes/classy/templates/views/views-view-list.html.twig +++ b/core/themes/classy/templates/views/views-view-list.html.twig @@ -26,7 +26,9 @@ <{{ list.type }}{{ list.attributes }}> {% for row in rows %} - {{ row.content }} + + {{- row.content -}} + {% endfor %} diff --git a/core/themes/classy/templates/views/views-view-unformatted.html.twig b/core/themes/classy/templates/views/views-view-unformatted.html.twig index bece528c7a69ab9344b460cc66bb25bd2717e793..534ac9a95520d850af5b49adbc8c53124ffa11a5 100644 --- a/core/themes/classy/templates/views/views-view-unformatted.html.twig +++ b/core/themes/classy/templates/views/views-view-unformatted.html.twig @@ -25,6 +25,6 @@ ] %} - {{ row.content }} + {{- row.content -}} {% endfor %} diff --git a/core/themes/stable/templates/views/views-view-grid.html.twig b/core/themes/stable/templates/views/views-view-grid.html.twig index 2fe3028c9304b1a1c00a183c9b68e47a498aee2f..8a3a20bbfbcb33eeee42a8d220e12435574df08f 100644 --- a/core/themes/stable/templates/views/views-view-grid.html.twig +++ b/core/themes/stable/templates/views/views-view-grid.html.twig @@ -57,7 +57,7 @@ {% for column in row.content %} - {{ column.content }} + {{- column.content -}} {% endfor %} @@ -67,7 +67,7 @@ {% for row in column.content %} - {{ row.content }} + {{- row.content -}} {% endfor %} diff --git a/core/themes/stable/templates/views/views-view-list.html.twig b/core/themes/stable/templates/views/views-view-list.html.twig index 44d4766d44b20d97b3480a289f01320855412a34..50cc74ba13fb0a8f922c2471cdce7c98246c9c01 100644 --- a/core/themes/stable/templates/views/views-view-list.html.twig +++ b/core/themes/stable/templates/views/views-view-list.html.twig @@ -26,7 +26,9 @@ <{{ list.type }}{{ list.attributes }}> {% for row in rows %} - {{ row.content }} + + {{- row.content -}} + {% endfor %} diff --git a/core/themes/stable/templates/views/views-view-unformatted.html.twig b/core/themes/stable/templates/views/views-view-unformatted.html.twig index bece528c7a69ab9344b460cc66bb25bd2717e793..534ac9a95520d850af5b49adbc8c53124ffa11a5 100644 --- a/core/themes/stable/templates/views/views-view-unformatted.html.twig +++ b/core/themes/stable/templates/views/views-view-unformatted.html.twig @@ -25,6 +25,6 @@ ] %} - {{ row.content }} + {{- row.content -}} {% endfor %}