diff --git a/src/Definition/PatternDefinition.php b/src/Definition/PatternDefinition.php index 2057ed2ab4f7dacd0c79cbbb44e460c5286eb8b8..3e2fb8a568e9a2eec51116bd7508d8da98d112eb 100644 --- a/src/Definition/PatternDefinition.php +++ b/src/Definition/PatternDefinition.php @@ -304,7 +304,7 @@ class PatternDefinition extends PluginDefinition implements DerivablePluginDefin * @param string $name * Field name. * - * @return PatternDefinitionField|null + * @return \Drupal\ui_patterns\Definition\PatternDefinitionVariant|null * Definition field. */ public function getVariant($name) { @@ -442,7 +442,18 @@ class PatternDefinition extends PluginDefinition implements DerivablePluginDefin * Whereas definition uses the "use:" property. */ public function hasUse() { - return !empty($this->definition['use']); + $pattern_has_use = !empty($this->definition['use']); + + if (!$pattern_has_use) { + $pattern_variants = $this->getVariants(); + foreach ($pattern_variants as $pattern_variant) { + if ($pattern_variant->hasUse()) { + $pattern_has_use = TRUE; + break; + } + } + } + return $pattern_has_use; } /** diff --git a/src/Definition/PatternDefinitionVariant.php b/src/Definition/PatternDefinitionVariant.php index b17cabda607bf07dd8da872e8fb824264471ba63..fceec594b3e8dc2a4006ea7aef51fcb52e5acae0 100644 --- a/src/Definition/PatternDefinitionVariant.php +++ b/src/Definition/PatternDefinitionVariant.php @@ -20,6 +20,7 @@ class PatternDefinitionVariant implements \ArrayAccess { 'name' => NULL, 'label' => NULL, 'description' => NULL, + 'use' => NULL, ]; /** @@ -31,8 +32,7 @@ class PatternDefinitionVariant implements \ArrayAccess { $this->definition['label'] = $value; } else { - $this->definition['name'] = !isset($value['name']) ? $name : $value['name']; - $this->definition['label'] = $value['label']; + $this->definition['name'] = $value['name'] ?? $name; $this->definition = $value + $this->definition; } } @@ -90,4 +90,36 @@ class PatternDefinitionVariant implements \ArrayAccess { return $this; } + /** + * Getter. + * + * @return bool + * Whereas definition uses the "use:" property. + */ + public function hasUse() { + return !empty($this->definition['use']); + } + + /** + * Getter. + * + * @return string + * Property value. + */ + public function getUse() { + return $this->definition['use']; + } + + /** + * Setter. + * + * @param string $use + * Property value. + * + * @return $this + */ + public function setUse($use) { + $this->definition['use'] = $use; + return $this; + } } diff --git a/src/Element/Pattern.php b/src/Element/Pattern.php index e04ea99a5300db72dd7b95d604406236a2b6c358..eab10d1e5716d4c8b47eca34f49d3914fa4a68b4 100644 --- a/src/Element/Pattern.php +++ b/src/Element/Pattern.php @@ -135,6 +135,13 @@ class Pattern extends RenderElement { $element['#use'] = $definition->getUse(); } + if (isset($element['#variant'])) { + $variant_definition = $definition->getVariant($element['#variant']); + if ($variant_definition && $variant_definition->hasUse()) { + $element['#use'] = $variant_definition->getUse(); + } + } + return $element; } diff --git a/tests/src/Unit/Definition/PatternDefinitionTest.php b/tests/src/Unit/Definition/PatternDefinitionTest.php index 6d56c560f1761d3a1868a9d115c0103a01768049..d6e76dae28e8e0274c9ff7a44f637455671fddcf 100644 --- a/tests/src/Unit/Definition/PatternDefinitionTest.php +++ b/tests/src/Unit/Definition/PatternDefinitionTest.php @@ -35,7 +35,7 @@ class PatternDefinitionTest extends AbstractUiPatternsTest { */ public function testGettersSetters($getter, $name, $value) { $pattern_definition = new PatternDefinition([$name => $value]); - $this->assertEquals(call_user_func([$pattern_definition, $getter]), $value); + $this->assertEquals($value, call_user_func([$pattern_definition, $getter])); } /** @@ -157,4 +157,88 @@ class PatternDefinitionTest extends AbstractUiPatternsTest { return Yaml::decode(file_get_contents($this->getFixturePath() . '/definition/variants_processing.yml')); } + /** + * Test hasUse method. + * + * @dataProvider hasUseProvider + * + * @covers ::hasUse + */ + public function testHasUse(array $pattern, bool $expected): void { + $patternDefinition = new PatternDefinition($pattern); + $this->assertEquals($expected, $patternDefinition->hasUse()); + } + + /** + * Provider. + * + * @return array + * Data. + */ + public function hasUseProvider(): array { + return [ + 'pattern_without_use' => [ + [ + 'id' => 'test', + ], + FALSE, + ], + 'pattern_with_use' => [ + [ + 'id' => 'test', + 'use' => 'my use', + ], + TRUE, + ], + 'pattern_with_use_with_variant' => [ + [ + 'id' => 'test', + 'use' => 'my use', + 'variants' => [ + 'default' => [ + 'label' => 'Default', + ], + ], + ], + TRUE, + ], + 'pattern_with_variant' => [ + [ + 'id' => 'test', + 'variants' => [ + 'default' => [ + 'label' => 'Default', + ], + ], + ], + FALSE, + ], + 'pattern_with_variant_with_use' => [ + [ + 'id' => 'test', + 'variants' => [ + 'default' => [ + 'label' => 'Default', + 'use' => 'my use', + ], + ], + ], + TRUE, + ], + 'pattern_with_use_with_variant_with_use' => [ + [ + 'id' => 'test', + 'use' => 'my use', + 'variants' => [ + 'default' => [ + 'label' => 'Default', + 'use' => 'my use', + ], + ], + ], + TRUE, + ], + ]; + } + } diff --git a/tests/src/Unit/Definition/PatternDefinitionVariantTest.php b/tests/src/Unit/Definition/PatternDefinitionVariantTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9d90e3521bc12c9fbe7562812630191d10efd9c6 --- /dev/null +++ b/tests/src/Unit/Definition/PatternDefinitionVariantTest.php @@ -0,0 +1,105 @@ +<?php + +declare(strict_types = 1); + +namespace Drupal\Tests\ui_patterns\Unit\Definition; + +use Drupal\Tests\ui_patterns\Unit\AbstractUiPatternsTest; +use Drupal\ui_patterns\Definition\PatternDefinitionVariant; + +/** + * @coversDefaultClass \Drupal\ui_patterns\Definition\PatternDefinitionVariant + * + * @group ui_patterns + */ +class PatternDefinitionVariantTest extends AbstractUiPatternsTest { + + /** + * Test constructor with either scalar or array. + * + * @covers ::__construct + * @covers ::hasUse + * @covers ::setDescription + * @covers ::setUse + */ + public function testConstructor(): void { + // Scalar value. + $patternDefinitionVariant = new PatternDefinitionVariant('test', 'my label'); + $this->assertEquals('test', $patternDefinitionVariant->getName()); + $this->assertEquals('my label', $patternDefinitionVariant->getLabel()); + $this->assertEquals(NULL, $patternDefinitionVariant->getDescription()); + $this->assertEquals(NULL, $patternDefinitionVariant->getUse()); + $this->assertFalse($patternDefinitionVariant->hasUse()); + + // Array without name. + $patternDefinitionVariant = new PatternDefinitionVariant('test', [ + 'label' => 'my label', + ]); + $this->assertEquals('test', $patternDefinitionVariant->getName()); + $this->assertEquals('my label', $patternDefinitionVariant->getLabel()); + $this->assertEquals(NULL, $patternDefinitionVariant->getDescription()); + $this->assertEquals(NULL, $patternDefinitionVariant->getUse()); + $this->assertFalse($patternDefinitionVariant->hasUse()); + + // Array with name. + $patternDefinitionVariant = new PatternDefinitionVariant('test', [ + 'name' => 'my name', + 'label' => 'my label', + ]); + $this->assertEquals('my name', $patternDefinitionVariant->getName()); + $this->assertEquals('my label', $patternDefinitionVariant->getLabel()); + $this->assertEquals(NULL, $patternDefinitionVariant->getDescription()); + $this->assertEquals(NULL, $patternDefinitionVariant->getUse()); + $this->assertFalse($patternDefinitionVariant->hasUse()); + + // Other attributes. + $patternDefinitionVariant = new PatternDefinitionVariant('test', [ + 'name' => 'my name', + 'label' => 'my label', + 'description' => 'my description', + 'use' => 'template.twig', + ]); + $this->assertEquals('my name', $patternDefinitionVariant->getName()); + $this->assertEquals('my label', $patternDefinitionVariant->getLabel()); + $this->assertEquals('my description', $patternDefinitionVariant->getDescription()); + $this->assertEquals('template.twig', $patternDefinitionVariant->getUse()); + $this->assertTrue($patternDefinitionVariant->hasUse()); + + // Setters. + $patternDefinitionVariant->setDescription('new description'); + $this->assertEquals('new description', $patternDefinitionVariant->getDescription()); + $patternDefinitionVariant->setUse('new use'); + $this->assertEquals('new use', $patternDefinitionVariant->getUse()); + } + + /** + * Test getters. + * + * @dataProvider definitionGettersProvider + * + * @covers ::getName + * @covers ::getLabel + * @covers ::getDescription + * @covers ::getUse + */ + public function testGetters($getter, $name, $value): void { + $patternDefinitionVariant = new PatternDefinitionVariant('test', [$name => $value]); + $this->assertEquals($value, call_user_func([$patternDefinitionVariant, $getter])); + } + + /** + * Provider. + * + * @return array + * Data. + */ + public function definitionGettersProvider(): array { + return [ + ['getName', 'name', 'Variant name'], + ['getLabel', 'label', 'Variant label'], + ['getDescription', 'description', 'Variant description.'], + ['getUse', 'use', 'template.twig'], + ]; + } + +} diff --git a/tests/src/fixtures/definition/variants_processing.yml b/tests/src/fixtures/definition/variants_processing.yml index d70600f25df29fa5feb3e29e0e9129774884004e..6fd30d8f3b53346ff07a00e2882a1b278fd79193 100644 --- a/tests/src/fixtures/definition/variants_processing.yml +++ b/tests/src/fixtures/definition/variants_processing.yml @@ -6,10 +6,12 @@ name: variant1 label: variant1 description: ~ + use: variant2: name: variant2 label: variant2 description: ~ + use: - actual: variant1: Variant 1 variant2: Variant 2 @@ -18,10 +20,12 @@ name: variant1 label: Variant 1 description: ~ + use: variant2: name: variant2 label: Variant 2 description: ~ + use: - actual: variant1: label: variant1 @@ -30,11 +34,14 @@ name: variant1 label: variant1 description: ~ + use: - actual: - name: variant1 label: Variant 1 + use: "@atoms/button/button.twig" expected: variant1: name: variant1 label: Variant 1 description: ~ + use: "@atoms/button/button.twig"