Loading core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php +4 −3 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Render\Element; use Drupal\Core\Render\RendererInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; Loading Loading @@ -283,10 +284,10 @@ protected function stripAdminAndAnchorTagsFromResults(array $results) { } $stripped_results = []; foreach ($results as $id => $row) { $entity = $row['#row']->_entity; foreach (Element::children($results) as $id) { $entity = $results[$id]['#row']->_entity; $stripped_results[$entity->bundle()][$id] = ViewsRenderPipelineMarkup::create( Xss::filter($this->renderer->renderPlain($row), $allowed_tags) Xss::filter($this->renderer->renderPlain($results[$id]), $allowed_tags) ); } Loading core/modules/views/tests/modules/views_test_config/views_test_config.module +15 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,9 @@ * Contains the "views_test_config" module main functionality. */ use Drupal\views\Plugin\views\cache\CachePluginBase; use Drupal\views\ViewExecutable; /** * Implements hook_ENTITY_TYPE_load(). */ Loading @@ -17,3 +20,15 @@ function views_test_config_view_load(array $views) { $display['display_options']['fields']['id_broken'] = NULL; } } /** * Implements hook_views_post_render(). */ function views_test_config_views_post_render(ViewExecutable $view, &$output, CachePluginBase $cache) { if (\Drupal::state()->get('views_test_config.views_post_render_cache_tag')) { \Drupal::state()->set('views_test_config.views_post_render_called', TRUE); // Set a cache key on output to ensure ViewsSelection::stripAdminAndAnchorTagsFromResults // correctly handles elements that aren't result rows. $output['#cache']['tags'][] = 'foo'; } } core/modules/views/tests/src/Kernel/Entity/ViewSelectionEntityReferenceTest.php 0 → 100644 +67 −0 Original line number Diff line number Diff line <?php declare(strict_types = 1); namespace Drupal\Tests\views\Kernel\Entity; use Drupal\entity_test\Entity\EntityTest; use Drupal\KernelTests\Core\Entity\EntityKernelTestBase; use Drupal\views\Tests\ViewTestData; /** * Tests the ViewSelection EntityReferenceSelection plugin. * * @group views */ class ViewSelectionEntityReferenceTest extends EntityKernelTestBase { /** * Views used by this test. * * @var array */ public static $testViews = ['test_display_entity_reference']; /** * {@inheritdoc} */ protected static $modules = ['views', 'views_test_config']; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); ViewTestData::createTestViews(static::class, ['views_test_config']); } /** * Tests the ViewSelection plugin. */ public function testSelectionPlugin(): void { for ($i = 1; $i <= 5; $i++) { $entity = EntityTest::create([ 'name' => 'Test entity ' . $i, ]); $entity->save(); } $selection_options = [ 'target_type' => 'entity_test', 'handler' => 'views', 'view' => [ 'view_name' => 'test_display_entity_reference', 'display_name' => 'entity_reference_1', ], ]; $handler = $this->container->get('plugin.manager.entity_reference_selection')->getInstance($selection_options); $state = \Drupal::state(); $this->assertNull($state->get('views_test_config.views_post_render_called')); $state->set('views_test_config.views_post_render_cache_tag', TRUE); $result = $handler->getReferenceableEntities(); $this->assertCount(5, $result['entity_test']); $this->assertTrue($state->get('views_test_config.views_post_render_called')); } } Loading
core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php +4 −3 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Render\Element; use Drupal\Core\Render\RendererInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; Loading Loading @@ -283,10 +284,10 @@ protected function stripAdminAndAnchorTagsFromResults(array $results) { } $stripped_results = []; foreach ($results as $id => $row) { $entity = $row['#row']->_entity; foreach (Element::children($results) as $id) { $entity = $results[$id]['#row']->_entity; $stripped_results[$entity->bundle()][$id] = ViewsRenderPipelineMarkup::create( Xss::filter($this->renderer->renderPlain($row), $allowed_tags) Xss::filter($this->renderer->renderPlain($results[$id]), $allowed_tags) ); } Loading
core/modules/views/tests/modules/views_test_config/views_test_config.module +15 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,9 @@ * Contains the "views_test_config" module main functionality. */ use Drupal\views\Plugin\views\cache\CachePluginBase; use Drupal\views\ViewExecutable; /** * Implements hook_ENTITY_TYPE_load(). */ Loading @@ -17,3 +20,15 @@ function views_test_config_view_load(array $views) { $display['display_options']['fields']['id_broken'] = NULL; } } /** * Implements hook_views_post_render(). */ function views_test_config_views_post_render(ViewExecutable $view, &$output, CachePluginBase $cache) { if (\Drupal::state()->get('views_test_config.views_post_render_cache_tag')) { \Drupal::state()->set('views_test_config.views_post_render_called', TRUE); // Set a cache key on output to ensure ViewsSelection::stripAdminAndAnchorTagsFromResults // correctly handles elements that aren't result rows. $output['#cache']['tags'][] = 'foo'; } }
core/modules/views/tests/src/Kernel/Entity/ViewSelectionEntityReferenceTest.php 0 → 100644 +67 −0 Original line number Diff line number Diff line <?php declare(strict_types = 1); namespace Drupal\Tests\views\Kernel\Entity; use Drupal\entity_test\Entity\EntityTest; use Drupal\KernelTests\Core\Entity\EntityKernelTestBase; use Drupal\views\Tests\ViewTestData; /** * Tests the ViewSelection EntityReferenceSelection plugin. * * @group views */ class ViewSelectionEntityReferenceTest extends EntityKernelTestBase { /** * Views used by this test. * * @var array */ public static $testViews = ['test_display_entity_reference']; /** * {@inheritdoc} */ protected static $modules = ['views', 'views_test_config']; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); ViewTestData::createTestViews(static::class, ['views_test_config']); } /** * Tests the ViewSelection plugin. */ public function testSelectionPlugin(): void { for ($i = 1; $i <= 5; $i++) { $entity = EntityTest::create([ 'name' => 'Test entity ' . $i, ]); $entity->save(); } $selection_options = [ 'target_type' => 'entity_test', 'handler' => 'views', 'view' => [ 'view_name' => 'test_display_entity_reference', 'display_name' => 'entity_reference_1', ], ]; $handler = $this->container->get('plugin.manager.entity_reference_selection')->getInstance($selection_options); $state = \Drupal::state(); $this->assertNull($state->get('views_test_config.views_post_render_called')); $state->set('views_test_config.views_post_render_cache_tag', TRUE); $result = $handler->getReferenceableEntities(); $this->assertCount(5, $result['entity_test']); $this->assertTrue($state->get('views_test_config.views_post_render_called')); } }