From 962d2db57e0a3b13751d08c7586c3dcbecd069e9 Mon Sep 17 00:00:00 2001 From: Alex Pott Date: Thu, 7 Nov 2019 10:20:44 +0000 Subject: [PATCH] Issue #2917006 by tedbow, amateescu, Wim Leers, sam-elayyoub, Pascal-, jnimchuk, catch, alexpott, kruser, neclimdul, chris5156, Rick Hood: Views referencing missing roles fail views_post_update_revision_metadata_fields() (cherry picked from commit a90dae47a0819f7b6339fd99c5410fad382002eb) --- .../user/src/Plugin/views/filter/Roles.php | 8 ++++-- .../Kernel/Views/HandlerFilterRolesTest.php | 25 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/core/modules/user/src/Plugin/views/filter/Roles.php b/core/modules/user/src/Plugin/views/filter/Roles.php index 83dfbb33704..68cbe3ebaf7 100644 --- a/core/modules/user/src/Plugin/views/filter/Roles.php +++ b/core/modules/user/src/Plugin/views/filter/Roles.php @@ -88,8 +88,12 @@ class Roles extends ManyToOne { } foreach ((array) $this->value as $role_id) { - $role = $this->roleStorage->load($role_id); - $dependencies[$role->getConfigDependencyKey()][] = $role->getConfigDependencyName(); + if ($role = $this->roleStorage->load($role_id)) { + $dependencies[$role->getConfigDependencyKey()][] = $role->getConfigDependencyName(); + } + else { + trigger_error("The {$role_id} role does not exist. You should review and fix the configuration of the {$this->view->id()} view.", E_USER_WARNING); + } } return $dependencies; } diff --git a/core/modules/user/tests/src/Kernel/Views/HandlerFilterRolesTest.php b/core/modules/user/tests/src/Kernel/Views/HandlerFilterRolesTest.php index ec5a06bf1cb..878300b79d5 100644 --- a/core/modules/user/tests/src/Kernel/Views/HandlerFilterRolesTest.php +++ b/core/modules/user/tests/src/Kernel/Views/HandlerFilterRolesTest.php @@ -5,6 +5,7 @@ namespace Drupal\Tests\user\Kernel\Views; use Drupal\user\Entity\Role; use Drupal\views\Entity\View; use Drupal\views\Views; +use PHPUnit\Framework\Error\Warning; /** * Tests the roles filter handler. @@ -95,4 +96,28 @@ class HandlerFilterRolesTest extends UserKernelTestBase { $this->assertEqual($expected, $view->getDependencies()); } + /** + * Tests that a warning is triggered if the filter references a missing role. + */ + public function testMissingRole() { + $role = Role::create(['id' => 'test_user_role']); + $role->save(); + /** @var \Drupal\views\Entity\View $view */ + $view = View::load('test_user_name'); + $display = &$view->getDisplay('default'); + $display['display_options']['filters']['roles_target_id'] = [ + 'id' => 'roles_target_id', + 'table' => 'user__roles', + 'field' => 'roles_target_id', + 'value' => ['test_user_role' => 'test_user_role'], + 'plugin_id' => 'user_roles', + ]; + // Ensure no warning is triggered before the role is deleted. + $view->calculateDependencies(); + $role->delete(); + $this->expectException(Warning::class); + $this->expectExceptionMessage('The test_user_role role does not exist. You should review and fix the configuration of the test_user_name view.'); + $view->calculateDependencies(); + } + }