.../src/Controller/FileWidgetAjaxController.php | 8 +- core/modules/system/src/Tests/Common/UrlTest.php | 9 +- .../views/src/Controller/ViewAjaxController.php | 3 +- .../views/src/Tests/Handler/AreaEntityTest.php | 2 +- core/modules/views/src/Tests/Handler/AreaTest.php | 4 +- .../views/src/Tests/Handler/FieldGroupRowsTest.php | 24 ++- .../views/src/Tests/Handler/FieldUnitTest.php | 189 ++++++++++++++++----- .../views/src/Tests/Handler/FieldWebTest.php | 139 +++++++++++---- core/modules/views/src/Tests/Plugin/CacheTest.php | 9 +- .../views_ui/src/Controller/ViewsUIController.php | 2 +- core/modules/views_ui/src/ViewEditForm.php | 4 +- 11 files changed, 295 insertions(+), 98 deletions(-) diff --git a/core/modules/file/src/Controller/FileWidgetAjaxController.php b/core/modules/file/src/Controller/FileWidgetAjaxController.php index 90176f8..7439c02 100644 --- a/core/modules/file/src/Controller/FileWidgetAjaxController.php +++ b/core/modules/file/src/Controller/FileWidgetAjaxController.php @@ -39,7 +39,7 @@ public function upload(Request $request) { drupal_set_message(t('An unrecoverable error occurred. The uploaded file likely exceeded the maximum file size (@size) that this server supports.', array('@size' => format_size(file_upload_max_size()))), 'error'); $response = new AjaxResponse(); $status_messages = array('#type' => 'status_messages'); - return $response->addCommand(new ReplaceCommand(NULL, $this->renderer->renderRoot($status_messages))); + return $response->addCommand(new ReplaceCommand(NULL, $status_messages)); } try { @@ -54,7 +54,7 @@ public function upload(Request $request) { drupal_set_message(t('An unrecoverable error occurred. Use of this form has expired. Try reloading the page and submitting again.'), 'error'); $response = new AjaxResponse(); $status_messages = array('#type' => 'status_messages'); - return $response->addCommand(new ReplaceCommand(NULL, $this->renderer->renderRoot($status_messages))); + return $response->addCommand(new ReplaceCommand(NULL, $status_messages)); } // Get the current element and count the number of files. @@ -78,14 +78,12 @@ public function upload(Request $request) { $status_messages = array('#type' => 'status_messages'); $form['#prefix'] .= $this->renderer->renderRoot($status_messages); - $output = $this->renderer->renderRoot($form); $response = new AjaxResponse(); - $response->setAttachments($form['#attached']); foreach ($commands as $command) { $response->addCommand($command, TRUE); } - return $response->addCommand(new ReplaceCommand(NULL, $output)); + return $response->addCommand(new ReplaceCommand(NULL, $form)); } /** diff --git a/core/modules/system/src/Tests/Common/UrlTest.php b/core/modules/system/src/Tests/Common/UrlTest.php index c8e553b..cf34843 100644 --- a/core/modules/system/src/Tests/Common/UrlTest.php +++ b/core/modules/system/src/Tests/Common/UrlTest.php @@ -11,6 +11,7 @@ use Drupal\Core\Cache\Cache; use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Language\Language; +use Drupal\Core\Render\RenderContext; use Drupal\Core\Url; use Drupal\simpletest\WebTestBase; @@ -169,9 +170,11 @@ function testLinkRenderArrayText() { $l = \Drupal::l('foo', Url::fromUri('https://www.drupal.org')); // Test a renderable array passed to _l(). - $renderable_text = array('#markup' => 'foo'); - $l_renderable_text = \Drupal::l($renderable_text, Url::fromUri('https://www.drupal.org')); - $this->assertEqual($l_renderable_text, $l); + $renderer->executeInRenderContext(new RenderContext(), function() use ($renderer, $l) { + $renderable_text = array('#markup' => 'foo'); + $l_renderable_text = \Drupal::l($renderable_text, Url::fromUri('https://www.drupal.org')); + $this->assertEqual($l_renderable_text, $l); + }); // Test a themed link with plain text 'text'. $type_link_plain_array = array( diff --git a/core/modules/views/src/Controller/ViewAjaxController.php b/core/modules/views/src/Controller/ViewAjaxController.php index 6b7e1d5..83a203b 100644 --- a/core/modules/views/src/Controller/ViewAjaxController.php +++ b/core/modules/views/src/Controller/ViewAjaxController.php @@ -175,8 +175,7 @@ public function ajaxView(Request $request) { $view->dom_id = $dom_id; if ($preview = $view->preview($display_id, $args)) { - $response->addCommand(new ReplaceCommand(".js-view-dom-id-$dom_id", $this->renderer->render($preview))); - $response->setAttachments($preview['#attached']); + $response->addCommand(new ReplaceCommand(".js-view-dom-id-$dom_id", $preview)); } return $response; } diff --git a/core/modules/views/src/Tests/Handler/AreaEntityTest.php b/core/modules/views/src/Tests/Handler/AreaEntityTest.php index f429770..4bc9af7 100644 --- a/core/modules/views/src/Tests/Handler/AreaEntityTest.php +++ b/core/modules/views/src/Tests/Handler/AreaEntityTest.php @@ -126,7 +126,7 @@ public function doTestRender($entities) { $renderer = $this->container->get('renderer'); $view = Views::getView('test_entity_area'); $preview = $view->preview('default', [$entities[1]->id()]); - $this->setRawContent(\Drupal::service('renderer')->render($preview)); + $this->setRawContent(\Drupal::service('renderer')->renderRoot($preview)); $view_class = 'js-view-dom-id-' . $view->dom_id; $header_xpath = '//div[@class = "' . $view_class . '"]/div[1]'; $footer_xpath = '//div[@class = "' . $view_class . '"]/div[3]'; diff --git a/core/modules/views/src/Tests/Handler/AreaTest.php b/core/modules/views/src/Tests/Handler/AreaTest.php index 49984a4..bdc1e48 100644 --- a/core/modules/views/src/Tests/Handler/AreaTest.php +++ b/core/modules/views/src/Tests/Handler/AreaTest.php @@ -127,7 +127,7 @@ public function testAreaAccess() { $this->assertEqual(0, count($handlers)); $output = $view->preview(); - $output = \Drupal::service('renderer')->render($output); + $output = \Drupal::service('renderer')->renderRoot($output); // The area output should not be present since access was denied. $this->assertFalse(strpos($output, 'a custom string') !== FALSE); $view->destroy(); @@ -149,7 +149,7 @@ public function testAreaAccess() { $handlers = $view->display_handler->getHandlers('empty'); $output = $view->preview(); - $output = \Drupal::service('renderer')->render($output); + $output = \Drupal::service('renderer')->renderRoot($output); $this->assertTrue(strpos($output, 'a custom string') !== FALSE); $this->assertEqual(1, count($handlers)); } diff --git a/core/modules/views/src/Tests/Handler/FieldGroupRowsTest.php b/core/modules/views/src/Tests/Handler/FieldGroupRowsTest.php index 2aa0e9c..96976db 100644 --- a/core/modules/views/src/Tests/Handler/FieldGroupRowsTest.php +++ b/core/modules/views/src/Tests/Handler/FieldGroupRowsTest.php @@ -8,6 +8,7 @@ namespace Drupal\views\Tests\Handler; use Drupal\Core\Field\FieldStorageDefinitionInterface; +use Drupal\Core\Render\RenderContext; use Drupal\views\Views; /** @@ -67,6 +68,9 @@ protected function setUp() { * Testing the "Grouped rows" functionality. */ public function testGroupRows() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $edit = array( 'title' => $this->randomMachineName(), $this->fieldName => array('a', 'b', 'c'), @@ -77,7 +81,10 @@ public function testGroupRows() { // Test grouped rows. $this->executeView($view); - $this->assertEqual($view->field[$this->fieldName]->advancedRender($view->result[0]), 'a, b, c'); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field[$this->fieldName]->advancedRender($view->result[0]); + }); + $this->assertEqual($output, 'a, b, c'); // Change the group_rows checkbox to false. $view = Views::getView('test_group_rows'); @@ -88,11 +95,20 @@ public function testGroupRows() { $view->render(); $view->row_index = 0; - $this->assertEqual($view->field[$this->fieldName]->advancedRender($view->result[0]), 'a'); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field[$this->fieldName]->advancedRender($view->result[0]); + }); + $this->assertEqual($output, 'a'); $view->row_index = 1; - $this->assertEqual($view->field[$this->fieldName]->advancedRender($view->result[1]), 'b'); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field[$this->fieldName]->advancedRender($view->result[1]); + }); + $this->assertEqual($output, 'b'); $view->row_index = 2; - $this->assertEqual($view->field[$this->fieldName]->advancedRender($view->result[2]), 'c'); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field[$this->fieldName]->advancedRender($view->result[2]); + }); + $this->assertEqual($output, 'c'); } } diff --git a/core/modules/views/src/Tests/Handler/FieldUnitTest.php b/core/modules/views/src/Tests/Handler/FieldUnitTest.php index f76e1ce..5a5d73f 100644 --- a/core/modules/views/src/Tests/Handler/FieldUnitTest.php +++ b/core/modules/views/src/Tests/Handler/FieldUnitTest.php @@ -7,6 +7,7 @@ namespace Drupal\views\Tests\Handler; +use Drupal\Core\Render\RenderContext; use Drupal\views\Tests\ViewUnitTestBase; use Drupal\views\Plugin\views\field\FieldPluginBase; use Drupal\views\Views; @@ -52,12 +53,18 @@ protected function viewsData() { * Tests that the render function is called. */ public function testRender() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $view = Views::getView('test_field_tokens'); $this->executeView($view); $random_text = $this->randomMachineName(); $view->field['job']->setTestValue($random_text); - $this->assertEqual($view->field['job']->theme($view->result[0]), $random_text, 'Make sure the render method rendered the manual set value.'); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['job']->theme($view->result[0]); + }); + $this->assertEqual($output, $random_text, 'Make sure the render method rendered the manual set value.'); } /** @@ -141,6 +148,9 @@ protected function assertNotSubString($haystack, $needle, $message = '', $group * Tests general rewriting of the output. */ public function testRewrite() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $view = Views::getView('test_view'); $view->initHandlers(); $this->executeView($view); @@ -149,11 +159,15 @@ public function testRewrite() { // Don't check the rewrite checkbox, so the text shouldn't appear. $id_field->options['alter']['text'] = $random_text = $this->randomMachineName(); - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertNotSubString($output, $random_text); $id_field->options['alter']['alter_text'] = TRUE; - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($output, $random_text); } @@ -161,6 +175,9 @@ public function testRewrite() { * Tests the field tokens, row level and field level. */ public function testFieldTokens() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $view = Views::getView('test_field_tokens'); $this->executeView($view); $name_field_0 = $view->field['name']; @@ -182,19 +199,25 @@ public function testFieldTokens() { $expected_output_1 = "$row->views_test_data_name $row->views_test_data_name"; $expected_output_2 = "$row->views_test_data_name $row->views_test_data_name $row->views_test_data_name"; - $output = $name_field_0->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field_0, $row) { + return $name_field_0->advancedRender($row); + }); $this->assertEqual($output, $expected_output_0, format_string('Test token replacement: "!token" gave "!output"', [ '!token' => $name_field_0->options['alter']['text'], '!output' => $output, ])); - $output = $name_field_1->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field_1, $row) { + return $name_field_1->advancedRender($row); + }); $this->assertEqual($output, $expected_output_1, format_string('Test token replacement: "!token" gave "!output"', [ '!token' => $name_field_1->options['alter']['text'], '!output' => $output, ])); - $output = $name_field_2->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field_2, $row) { + return $name_field_2->advancedRender($row); + }); $this->assertEqual($output, $expected_output_2, format_string('Test token replacement: "!token" gave "!output"', [ '!token' => $name_field_2->options['alter']['text'], '!output' => $output, @@ -207,7 +230,9 @@ public function testFieldTokens() { $random_text = $this->randomMachineName(); $job_field->setTestValue($random_text); - $output = $job_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($job_field, $row) { + return $job_field->advancedRender($row); + }); $this->assertSubString($output, $random_text, format_string('Make sure the self token (!token => !value) appears in the output (!output)', [ '!value' => $random_text, '!output' => $output, @@ -219,7 +244,9 @@ public function testFieldTokens() { $job_field->options['alter']['text'] = $old_token; $random_text = $this->randomMachineName(); $job_field->setTestValue($random_text); - $output = $job_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($job_field, $row) { + return $job_field->advancedRender($row); + }); $this->assertSubString($output, $old_token, format_string('Make sure the old token style (!token => !value) is not changed in the output (!output)', [ '!value' => $random_text, '!output' => $output, @@ -268,6 +295,9 @@ function testEmpty() { * This tests alters the result to get easier and less coupled results. */ function _testHideIfEmpty() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $view = Views::getView('test_view'); $view->initDisplay(); $this->executeView($view); @@ -284,22 +314,30 @@ function _testHideIfEmpty() { // Test a valid string. $view->result[0]->{$column_map_reversed['name']} = $random_name; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $random_name, 'By default, a string should not be treated as empty.'); // Test an empty string. $view->result[0]->{$column_map_reversed['name']} = ""; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "", 'By default, "" should not be treated as empty.'); // Test zero as an integer. $view->result[0]->{$column_map_reversed['name']} = 0; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, '0', 'By default, 0 should not be treated as empty.'); // Test zero as a string. $view->result[0]->{$column_map_reversed['name']} = "0"; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "0", 'By default, "0" should not be treated as empty.'); // Test when results are not rewritten and non-zero empty values are hidden. @@ -309,22 +347,30 @@ function _testHideIfEmpty() { // Test a valid string. $view->result[0]->{$column_map_reversed['name']} = $random_name; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $random_name, 'If hide_empty is checked, a string should not be treated as empty.'); // Test an empty string. $view->result[0]->{$column_map_reversed['name']} = ""; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "", 'If hide_empty is checked, "" should be treated as empty.'); // Test zero as an integer. $view->result[0]->{$column_map_reversed['name']} = 0; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, '0', 'If hide_empty is checked, but not empty_zero, 0 should not be treated as empty.'); // Test zero as a string. $view->result[0]->{$column_map_reversed['name']} = "0"; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "0", 'If hide_empty is checked, but not empty_zero, "0" should not be treated as empty.'); // Test when results are not rewritten and all empty values are hidden. @@ -334,12 +380,16 @@ function _testHideIfEmpty() { // Test zero as an integer. $view->result[0]->{$column_map_reversed['name']} = 0; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "", 'If hide_empty and empty_zero are checked, 0 should be treated as empty.'); // Test zero as a string. $view->result[0]->{$column_map_reversed['name']} = "0"; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "", 'If hide_empty and empty_zero are checked, "0" should be treated as empty.'); // Test when results are rewritten to a valid string and non-zero empty @@ -352,22 +402,30 @@ function _testHideIfEmpty() { // Test a valid string. $view->result[0]->{$column_map_reversed['name']} = $random_value; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, it should not be treated as empty.'); // Test an empty string. $view->result[0]->{$column_map_reversed['name']} = ""; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, "" should not be treated as empty.'); // Test zero as an integer. $view->result[0]->{$column_map_reversed['name']} = 0; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, 0 should not be treated as empty.'); // Test zero as a string. $view->result[0]->{$column_map_reversed['name']} = "0"; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $random_name, 'If the rewritten string is not empty, "0" should not be treated as empty.'); // Test when results are rewritten to an empty string and non-zero empty results are hidden. @@ -379,22 +437,30 @@ function _testHideIfEmpty() { // Test a valid string. $view->result[0]->{$column_map_reversed['name']} = $random_name; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $random_name, 'If the rewritten string is empty, it should not be treated as empty.'); // Test an empty string. $view->result[0]->{$column_map_reversed['name']} = ""; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "", 'If the rewritten string is empty, "" should be treated as empty.'); // Test zero as an integer. $view->result[0]->{$column_map_reversed['name']} = 0; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, '0', 'If the rewritten string is empty, 0 should not be treated as empty.'); // Test zero as a string. $view->result[0]->{$column_map_reversed['name']} = "0"; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "0", 'If the rewritten string is empty, "0" should not be treated as empty.'); // Test when results are rewritten to zero as a string and non-zero empty @@ -407,22 +473,30 @@ function _testHideIfEmpty() { // Test a valid string. $view->result[0]->{$column_map_reversed['name']} = $random_name; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, the string rewritten as 0 should not be treated as empty.'); // Test an empty string. $view->result[0]->{$column_map_reversed['name']} = ""; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, "" rewritten as 0 should not be treated as empty.'); // Test zero as an integer. $view->result[0]->{$column_map_reversed['name']} = 0; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, 0 should not be treated as empty.'); // Test zero as a string. $view->result[0]->{$column_map_reversed['name']} = "0"; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "0", 'If the rewritten string is zero and empty_zero is not checked, "0" should not be treated as empty.'); // Test when results are rewritten to a valid string and non-zero empty @@ -435,22 +509,30 @@ function _testHideIfEmpty() { // Test a valid string. $view->result[0]->{$column_map_reversed['name']} = $random_name; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $random_value, 'If the original and rewritten strings are valid, it should not be treated as empty.'); // Test an empty string. $view->result[0]->{$column_map_reversed['name']} = ""; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "", 'If either the original or rewritten string is invalid, "" should be treated as empty.'); // Test zero as an integer. $view->result[0]->{$column_map_reversed['name']} = 0; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $random_value, 'If the original and rewritten strings are valid, 0 should not be treated as empty.'); // Test zero as a string. $view->result[0]->{$column_map_reversed['name']} = "0"; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $random_value, 'If the original and rewritten strings are valid, "0" should not be treated as empty.'); // Test when results are rewritten to zero as a string and all empty @@ -463,22 +545,30 @@ function _testHideIfEmpty() { // Test a valid string. $view->result[0]->{$column_map_reversed['name']} = $random_name; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "", 'If the rewritten string is zero, it should be treated as empty.'); // Test an empty string. $view->result[0]->{$column_map_reversed['name']} = ""; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "", 'If the rewritten string is zero, "" should be treated as empty.'); // Test zero as an integer. $view->result[0]->{$column_map_reversed['name']} = 0; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "", 'If the rewritten string is zero, 0 should not be treated as empty.'); // Test zero as a string. $view->result[0]->{$column_map_reversed['name']} = "0"; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "", 'If the rewritten string is zero, "0" should not be treated as empty.'); } @@ -486,6 +576,9 @@ function _testHideIfEmpty() { * Tests the usage of the empty text. */ function _testEmptyText() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $view = Views::getView('test_view'); $view->initDisplay(); $this->executeView($view); @@ -495,27 +588,37 @@ function _testEmptyText() { $empty_text = $view->field['name']->options['empty'] = $this->randomMachineName(); $view->result[0]->{$column_map_reversed['name']} = ""; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $empty_text, 'If a field is empty, the empty text should be used for the output.'); $view->result[0]->{$column_map_reversed['name']} = "0"; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, "0", 'If a field is 0 and empty_zero is not checked, the empty text should not be used for the output.'); $view->result[0]->{$column_map_reversed['name']} = "0"; $view->field['name']->options['empty_zero'] = TRUE; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $empty_text, 'If a field is 0 and empty_zero is checked, the empty text should be used for the output.'); $view->result[0]->{$column_map_reversed['name']} = ""; $view->field['name']->options['alter']['alter_text'] = TRUE; $alter_text = $view->field['name']->options['alter']['text'] = $this->randomMachineName(); $view->field['name']->options['hide_alter_empty'] = FALSE; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $alter_text, 'If a field is empty, some rewrite text exists, but hide_alter_empty is not checked, render the rewrite text.'); $view->field['name']->options['hide_alter_empty'] = TRUE; - $render = $view->field['name']->advancedRender($view->result[0]); + $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) { + return $view->field['name']->advancedRender($view->result[0]); + }); $this->assertIdentical($render, $empty_text, 'If a field is empty, some rewrite text exists, and hide_alter_empty is checked, use the empty text.'); } diff --git a/core/modules/views/src/Tests/Handler/FieldWebTest.php b/core/modules/views/src/Tests/Handler/FieldWebTest.php index 45a1617..39e1eb2 100644 --- a/core/modules/views/src/Tests/Handler/FieldWebTest.php +++ b/core/modules/views/src/Tests/Handler/FieldWebTest.php @@ -10,6 +10,7 @@ use Drupal\Component\Utility\Html; use Drupal\Component\Utility\Unicode; use Drupal\Component\Utility\UrlHelper; +use Drupal\Core\Render\RenderContext; use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait; use Drupal\views\Views; @@ -197,6 +198,9 @@ protected function xpathContent($content, $xpath, array $arguments = array()) { * Tests rewriting the output to a link. */ public function testAlterUrl() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $view = Views::getView('test_view'); $view->setDisplay(); $view->initHandlers(); @@ -211,13 +215,17 @@ public function testAlterUrl() { // Tests that the suffix/prefix appears on the output. $id_field->options['alter']['prefix'] = $prefix = $this->randomMachineName(); $id_field->options['alter']['suffix'] = $suffix = $this->randomMachineName(); - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($output, $prefix); $this->assertSubString($output, $suffix); unset($id_field->options['alter']['prefix']); unset($id_field->options['alter']['suffix']); - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($output, $path, 'Make sure that the path is part of the output'); // Some generic test code adapted from the UrlTest class, which tests @@ -228,44 +236,60 @@ public function testAlterUrl() { $expected_result = \Drupal::url('entity.node.canonical', ['node' => '123'], ['absolute' => $absolute]); $alter['absolute'] = $absolute; - $result = $id_field->theme($row); + $result = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($result, $expected_result); $expected_result = \Drupal::url('entity.node.canonical', ['node' => '123'], ['fragment' => 'foo', 'absolute' => $absolute]); $alter['path'] = 'node/123#foo'; - $result = $id_field->theme($row); + $result = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($result, $expected_result); $expected_result = \Drupal::url('entity.node.canonical', ['node' => '123'], ['query' => ['foo' => NULL], 'absolute' => $absolute]); $alter['path'] = 'node/123?foo'; - $result = $id_field->theme($row); + $result = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($result, $expected_result); $expected_result = \Drupal::url('entity.node.canonical', ['node' => '123'], ['query' => ['foo' => 'bar', 'bar' => 'baz'], 'absolute' => $absolute]); $alter['path'] = 'node/123?foo=bar&bar=baz'; - $result = $id_field->theme($row); + $result = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString(Html::decodeEntities($result), Html::decodeEntities($expected_result)); // @todo The route-based URL generator strips out NULL attributes. // $expected_result = \Drupal::url('entity.node.canonical', ['node' => '123'], ['query' => ['foo' => NULL], 'fragment' => 'bar', 'absolute' => $absolute]); $expected_result = \Drupal::urlGenerator()->generateFromPath('node/123', array('query' => array('foo' => NULL), 'fragment' => 'bar', 'absolute' => $absolute)); $alter['path'] = 'node/123?foo#bar'; - $result = $id_field->theme($row); + $result = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString(Html::decodeEntities($result), Html::decodeEntities($expected_result)); $expected_result = \Drupal::url('', [], ['absolute' => $absolute]); $alter['path'] = ''; - $result = $id_field->theme($row); + $result = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($result, $expected_result); } // Tests the replace spaces with dashes feature. $id_field->options['alter']['replace_spaces'] = TRUE; $id_field->options['alter']['path'] = $path = $this->randomMachineName() . ' ' . $this->randomMachineName(); - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($output, str_replace(' ', '-', $path)); $id_field->options['alter']['replace_spaces'] = FALSE; - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); // The url has a space in it, so to check we have to decode the url output. $this->assertSubString(urldecode($output), $path); @@ -273,44 +297,60 @@ public function testAlterUrl() { // Switch on the external flag should output an external url as well. $id_field->options['alter']['external'] = TRUE; $id_field->options['alter']['path'] = $path = 'www.drupal.org'; - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($output, 'http://www.drupal.org'); // Setup a not external url, which shouldn't lead to an external url. $id_field->options['alter']['external'] = FALSE; $id_field->options['alter']['path'] = $path = 'www.drupal.org'; - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertNotSubString($output, 'http://www.drupal.org'); // Tests the transforming of the case setting. $id_field->options['alter']['path'] = $path = $this->randomMachineName(); $id_field->options['alter']['path_case'] = 'none'; - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($output, $path); // Switch to uppercase and lowercase. $id_field->options['alter']['path_case'] = 'upper'; - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($output, strtoupper($path)); $id_field->options['alter']['path_case'] = 'lower'; - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($output, strtolower($path)); // Switch to ucfirst and ucwords. $id_field->options['alter']['path_case'] = 'ucfirst'; $id_field->options['alter']['path'] = 'drupal has a great community'; - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($output, UrlHelper::encodePath('Drupal has a great community')); $id_field->options['alter']['path_case'] = 'ucwords'; - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $this->assertSubString($output, UrlHelper::encodePath('Drupal Has A Great Community')); unset($id_field->options['alter']['path_case']); // Tests the linkclass setting and see whether it actually exists in the // output. $id_field->options['alter']['link_class'] = $class = $this->randomMachineName(); - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $elements = $this->xpathContent($output, '//a[contains(@class, :class)]', array(':class' => $class)); $this->assertTrue($elements); // @fixme link_class, alt, rel cannot be unset, which should be fixed. @@ -318,21 +358,27 @@ public function testAlterUrl() { // Tests the alt setting. $id_field->options['alter']['alt'] = $rel = $this->randomMachineName(); - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $elements = $this->xpathContent($output, '//a[contains(@title, :alt)]', array(':alt' => $rel)); $this->assertTrue($elements); $id_field->options['alter']['alt'] = ''; // Tests the rel setting. $id_field->options['alter']['rel'] = $rel = $this->randomMachineName(); - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $elements = $this->xpathContent($output, '//a[contains(@rel, :rel)]', array(':rel' => $rel)); $this->assertTrue($elements); $id_field->options['alter']['rel'] = ''; // Tests the target setting. $id_field->options['alter']['target'] = $target = $this->randomMachineName(); - $output = $id_field->theme($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($id_field, $row) { + return $id_field->theme($row); + }); $elements = $this->xpathContent($output, '//a[contains(@target, :target)]', array(':target' => $target)); $this->assertTrue($elements); unset($id_field->options['alter']['target']); @@ -453,6 +499,9 @@ public function testFieldClasses() { * Tests trimming/read-more/ellipses. */ public function testTextRendering() { + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = \Drupal::service('renderer'); + $view = Views::getView('test_field_output'); $view->initHandlers(); $name_field = $view->field['name']; @@ -465,18 +514,24 @@ public function testTextRendering() { $row = $view->result[0]; $name_field->options['alter']['strip_tags'] = TRUE; - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertSubString($output, $random_text, 'Find text without html if stripping of views field output is enabled.'); $this->assertNotSubString($output, $html_text, 'Find no text with the html if stripping of views field output is enabled.'); // Tests preserving of html tags. $name_field->options['alter']['preserve_tags'] = '
'; - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertSubString($output, $random_text, 'Find text without html if stripping of views field output is enabled but a div is allowed.'); $this->assertSubString($output, $html_text, 'Find text with the html if stripping of views field output is enabled but a div is allowed.'); $name_field->options['alter']['strip_tags'] = FALSE; - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertSubString($output, $random_text, 'Find text without html if stripping of views field output is disabled.'); $this->assertSubString($output, $html_text, 'Find text with the html if stripping of views field output is disabled.'); @@ -485,13 +540,17 @@ public function testTextRendering() { $views_test_data_name = $row->views_test_data_name; $row->views_test_data_name = ' ' . $views_test_data_name . ' '; $name_field->options['alter']['trim_whitespace'] = TRUE; - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertSubString($output, $views_test_data_name, 'Make sure the trimmed text can be found if trimming is enabled.'); $this->assertNotSubString($output, $row->views_test_data_name, 'Make sure the untrimmed text can be found if trimming is enabled.'); $name_field->options['alter']['trim_whitespace'] = FALSE; - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertSubString($output, $views_test_data_name, 'Make sure the trimmed text can be found if trimming is disabled.'); $this->assertSubString($output, $row->views_test_data_name, 'Make sure the untrimmed text can be found if trimming is disabled.'); @@ -504,12 +563,16 @@ public function testTextRendering() { $name_field->options['alter']['max_length'] = 5; $trimmed_name = Unicode::substr($row->views_test_data_name, 0, 5); - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertSubString($output, $trimmed_name, format_string('Make sure the trimmed output (!trimmed) appears in the rendered output (!output).', array('!trimmed' => $trimmed_name, '!output' => $output))); $this->assertNotSubString($output, $row->views_test_data_name, format_string("Make sure the untrimmed value (!untrimmed) shouldn't appear in the rendered output (!output).", array('!untrimmed' => $row->views_test_data_name, '!output' => $output))); $name_field->options['alter']['max_length'] = 9; - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertSubString($output, $trimmed_name, format_string('Make sure the untrimmed (!untrimmed) output appears in the rendered output (!output).', array('!trimmed' => $trimmed_name, '!output' => $output))); // Take word_boundary into account for the tests. @@ -549,7 +612,9 @@ public function testTextRendering() { foreach ($tuples as $tuple) { $row->views_test_data_name = $tuple['value']; - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); if ($tuple['trimmed']) { $this->assertNotSubString($output, $tuple['value'], format_string('The untrimmed value (!untrimmed) should not appear in the trimmed output (!output).', array('!untrimmed' => $tuple['value'], '!output' => $output))); @@ -566,22 +631,30 @@ public function testTextRendering() { $name_field->options['alter']['more_link_text'] = $more_text = $this->randomMachineName(); $name_field->options['alter']['more_link_path'] = $more_path = $this->randomMachineName(); - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertSubString($output, $more_text, 'Make sure a read more text is displayed if the output got trimmed'); $this->assertTrue($this->xpathContent($output, '//a[contains(@href, :path)]', array(':path' => $more_path)), 'Make sure the read more link points to the right destination.'); $name_field->options['alter']['more_link'] = FALSE; - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertNotSubString($output, $more_text, 'Make sure no read more text appears.'); $this->assertFalse($this->xpathContent($output, '//a[contains(@href, :path)]', array(':path' => $more_path)), 'Make sure no read more link appears.'); // Check for the ellipses. $row->views_test_data_name = $this->randomMachineName(8); $name_field->options['alter']['max_length'] = 5; - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertSubString($output, '…', 'An ellipsis should appear if the output is trimmed'); $name_field->options['alter']['max_length'] = 10; - $output = $name_field->advancedRender($row); + $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($name_field, $row) { + return $name_field->advancedRender($row); + }); $this->assertNotSubString($output, '…', 'No ellipsis should appear if the output is not trimmed'); } diff --git a/core/modules/views/src/Tests/Plugin/CacheTest.php b/core/modules/views/src/Tests/Plugin/CacheTest.php index bae30f5..08e1565 100644 --- a/core/modules/views/src/Tests/Plugin/CacheTest.php +++ b/core/modules/views/src/Tests/Plugin/CacheTest.php @@ -7,6 +7,7 @@ namespace Drupal\views\Tests\Plugin; +use Drupal\Core\Render\RenderContext; use Drupal\node\Entity\Node; use Drupal\views\Tests\ViewUnitTestBase; use Drupal\views\Views; @@ -282,14 +283,18 @@ function testHeaderStorage() { $output = $view->buildRenderable(); /** @var \Drupal\Core\Render\RendererInterface $renderer */ $renderer = \Drupal::service('renderer'); - $renderer->render($output); + $renderer->executeInRenderContext(new RenderContext(), function () use (&$output, $renderer) { + return $renderer->render($output);; + }); unset($view->pre_render_called); $view->destroy(); $view->setDisplay(); $output = $view->buildRenderable(); - $renderer->render($output); + $renderer->executeInRenderContext(new RenderContext(), function () use (&$output, $renderer) { + return $renderer->render($output);; + }); $this->assertTrue(in_array('views_test_data/test', $output['#attached']['library']), 'Make sure libraries are added for cached views.'); $this->assertEqual(['foo' => 'bar'], $output['#attached']['drupalSettings'], 'Make sure drupalSettings are added for cached views.'); diff --git a/core/modules/views_ui/src/Controller/ViewsUIController.php b/core/modules/views_ui/src/Controller/ViewsUIController.php index f03328a..474f7bc 100644 --- a/core/modules/views_ui/src/Controller/ViewsUIController.php +++ b/core/modules/views_ui/src/Controller/ViewsUIController.php @@ -157,7 +157,7 @@ public function ajaxOperation(ViewEntityInterface $view, $op, Request $request) if ($request->request->get('js')) { $list = $this->entityManager()->getListBuilder('view')->render(); $response = new AjaxResponse(); - $response->addCommand(new ReplaceCommand('#views-entity-list', drupal_render($list))); + $response->addCommand(new ReplaceCommand('#views-entity-list', $list)); return $response; } diff --git a/core/modules/views_ui/src/ViewEditForm.php b/core/modules/views_ui/src/ViewEditForm.php index fe33da1..6cfaf5d 100644 --- a/core/modules/views_ui/src/ViewEditForm.php +++ b/core/modules/views_ui/src/ViewEditForm.php @@ -685,12 +685,12 @@ public function rebuildCurrentTab(ViewUI $view, AjaxResponse $response, $display // Regenerate the main display area. $build = $this->getDisplayTab($view); static::addMicroweights($build); - $response->addCommand(new HtmlCommand('#views-tab-' . $display_id, drupal_render($build))); + $response->addCommand(new HtmlCommand('#views-tab-' . $display_id, $build)); // Regenerate the top area so changes to display names and order will appear. $build = $this->renderDisplayTop($view); static::addMicroweights($build); - $response->addCommand(new ReplaceCommand('#views-display-top', drupal_render($build))); + $response->addCommand(new ReplaceCommand('#views-display-top', $build)); } /**