From f225ff21360dfcb419874aa4a9123920fdb96057 Mon Sep 17 00:00:00 2001 From: catch Date: Mon, 24 Oct 2022 15:10:39 +0100 Subject: [PATCH] Issue #3314469 by alecsmrekar, plach: ContextDefinition::isSatisfiedBy does not take into account cardinality (cherry picked from commit 6dcb9151317ac82c30699011575803cbb90437ea) --- .../Drupal/Core/Plugin/Context/ContextDefinition.php | 11 ++++++++++- .../KernelTests/Core/Plugin/ContextDefinitionTest.php | 11 +++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/lib/Drupal/Core/Plugin/Context/ContextDefinition.php b/core/lib/Drupal/Core/Plugin/Context/ContextDefinition.php index 895650c89ca..c2e5d53331f 100644 --- a/core/lib/Drupal/Core/Plugin/Context/ContextDefinition.php +++ b/core/lib/Drupal/Core/Plugin/Context/ContextDefinition.php @@ -4,6 +4,7 @@ namespace Drupal\Core\Plugin\Context; use Drupal\Core\DependencyInjection\DependencySerializationTrait; use Drupal\Core\TypedData\TypedDataTrait; +use Symfony\Component\Validator\ConstraintViolationList; /** * Defines a class for context definitions. @@ -307,7 +308,15 @@ class ContextDefinition implements ContextDefinitionInterface { $validator = $this->getTypedDataManager()->getValidator(); foreach ($values as $value) { $constraints = array_values($this->getConstraintObjects()); - $violations = $validator->validate($value, $constraints); + if ($definition->isMultiple()) { + $violations = new ConstraintViolationList(); + foreach ($value as $item) { + $violations->addAll($validator->validate($item, $constraints)); + } + } + else { + $violations = $validator->validate($value, $constraints); + } foreach ($violations as $delta => $violation) { // Remove any violation that does not correspond to the constraints. if (!in_array($violation->getConstraint(), $constraints)) { diff --git a/core/tests/Drupal/KernelTests/Core/Plugin/ContextDefinitionTest.php b/core/tests/Drupal/KernelTests/Core/Plugin/ContextDefinitionTest.php index bb9fd968ca2..e332be68df6 100644 --- a/core/tests/Drupal/KernelTests/Core/Plugin/ContextDefinitionTest.php +++ b/core/tests/Drupal/KernelTests/Core/Plugin/ContextDefinitionTest.php @@ -2,6 +2,7 @@ namespace Drupal\KernelTests\Core\Plugin; +use Drupal\Core\Plugin\Context\Context; use Drupal\Core\Plugin\Context\ContextDefinition; use Drupal\Core\Plugin\Context\EntityContext; use Drupal\Core\Plugin\Context\EntityContextDefinition; @@ -33,6 +34,16 @@ class ContextDefinitionTest extends KernelTestBase { $requirement = new ContextDefinition('any'); $context = EntityContext::fromEntity($value); $this->assertTrue($requirement->isSatisfiedBy($context)); + + // Test with multiple values. + $definition = EntityContextDefinition::create('entity_test'); + $definition->setMultiple(); + $entities = [ + EntityTest::create([]), + EntityTest::create([]), + ]; + $context = new Context($definition, $entities); + $this->assertTrue($definition->isSatisfiedBy($context)); } /**