diff --git a/core/lib/Drupal/Core/Block/BlockBase.php b/core/lib/Drupal/Core/Block/BlockBase.php index 03d76ac..bcc3954 100644 --- a/core/lib/Drupal/Core/Block/BlockBase.php +++ b/core/lib/Drupal/Core/Block/BlockBase.php @@ -10,6 +10,7 @@ use Drupal\Component\Utility\Unicode; use Drupal\Component\Utility\NestedArray; use Drupal\Core\Language\LanguageInterface; +use Drupal\Core\Plugin\PluginWithFormsInterface; use Drupal\Core\Session\AccountInterface; use Drupal\Component\Transliteration\TransliterationInterface; @@ -22,7 +23,7 @@ * * @ingroup block_api */ -abstract class BlockBase extends ContextAwarePluginBase implements BlockPluginInterface { +abstract class BlockBase extends ContextAwarePluginBase implements BlockPluginInterface, PluginWithFormsInterface { use ContextAwarePluginAssignmentTrait; @@ -271,4 +272,20 @@ public function setTransliteration(TransliterationInterface $transliteration) { $this->transliteration = $transliteration; } + /** + * {@inheritdoc} + */ + public function getFormClass($operation) { + if ($this->hasFormClass($operation)) { + return $this->getPluginDefinition()['forms'][$operation]; + } + } + + /** + * {@inheritdoc} + */ + public function hasFormClass($operation) { + return isset($this->getPluginDefinition()['forms'][$operation]); + } + } diff --git a/core/lib/Drupal/Core/Plugin/PluginFormFactory.php b/core/lib/Drupal/Core/Plugin/PluginFormFactory.php index addd0cc..6cbbc22 100644 --- a/core/lib/Drupal/Core/Plugin/PluginFormFactory.php +++ b/core/lib/Drupal/Core/Plugin/PluginFormFactory.php @@ -4,7 +4,6 @@ use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException; use Drupal\Component\Plugin\PluginAwareInterface; -use Drupal\Component\Plugin\PluginInspectionInterface; use Drupal\Core\DependencyInjection\ClassResolverInterface; /** @@ -32,10 +31,10 @@ public function __construct(ClassResolverInterface $class_resolver) { /** * {@inheritdoc} */ - public function createInstance(PluginInspectionInterface $plugin, $operation, $fallback_operation = NULL) { - if (!$this->hasForm($plugin, $operation)) { + public function createInstance(PluginWithFormsInterface $plugin, $operation, $fallback_operation = NULL) { + if (!$plugin->hasFormClass($operation)) { // Use the default form class if no form is specified for this operation. - if ($fallback_operation && $this->hasForm($plugin, $fallback_operation)) { + if ($fallback_operation && $plugin->hasFormClass($fallback_operation)) { $operation = $fallback_operation; } else { @@ -43,7 +42,7 @@ public function createInstance(PluginInspectionInterface $plugin, $operation, $f } } - $form_class = $this->getFormClass($plugin, $operation); + $form_class = $plugin->getFormClass($operation); // If the form specified is the plugin itself, use it directly. if (ltrim(get_class($plugin), '\\') === ltrim($form_class, '\\')) { @@ -65,27 +64,4 @@ public function createInstance(PluginInspectionInterface $plugin, $operation, $f return $form_object; } - /** - * {@inheritdoc} - */ - public function hasForm(PluginInspectionInterface $plugin, $operation) { - return isset($plugin->getPluginDefinition()['forms'][$operation]); - } - - /** - * Gets the plugin form class for a specific operation. - * - * @param \Drupal\Component\Plugin\PluginInspectionInterface $plugin - * The plugin the form is for. - * @param string $operation - * The name of the operation to use, e.g., 'add' or 'edit'. - * - * @return null|string - */ - protected function getFormClass(PluginInspectionInterface $plugin, $operation) { - if ($this->hasForm($plugin, $operation)) { - return $plugin->getPluginDefinition()['forms'][$operation]; - } - } - } diff --git a/core/lib/Drupal/Core/Plugin/PluginFormFactoryInterface.php b/core/lib/Drupal/Core/Plugin/PluginFormFactoryInterface.php index b2e6b09..d556269 100644 --- a/core/lib/Drupal/Core/Plugin/PluginFormFactoryInterface.php +++ b/core/lib/Drupal/Core/Plugin/PluginFormFactoryInterface.php @@ -18,7 +18,7 @@ /** * Creates a new form instance. * - * @param \Drupal\Component\Plugin\PluginInspectionInterface $plugin + * @param \Drupal\Core\Plugin\PluginWithFormsInterface $plugin * The plugin the form is for. * @param string $operation * The name of the operation to use, e.g., 'add' or 'edit'. @@ -30,19 +30,6 @@ * * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException */ - public function createInstance(PluginInspectionInterface $plugin, $operation, $fallback_operation = NULL); - - /** - * Determines if a given plugin has a form for the specified operation. - * - * @param \Drupal\Component\Plugin\PluginInspectionInterface $plugin - * The plugin the form is for. - * @param string $operation - * The name of the operation to use, e.g., 'add' or 'edit'. - * - * @return bool - * Returns TRUE if the plugin has a form for the operation. - */ - public function hasForm(PluginInspectionInterface $plugin, $operation); + public function createInstance(PluginWithFormsInterface $plugin, $operation, $fallback_operation = NULL); } diff --git a/core/lib/Drupal/Core/Plugin/PluginWithFormsInterface.php b/core/lib/Drupal/Core/Plugin/PluginWithFormsInterface.php new file mode 100644 index 0000000..b6beeab --- /dev/null +++ b/core/lib/Drupal/Core/Plugin/PluginWithFormsInterface.php @@ -0,0 +1,37 @@ +prophesize(PluginFormInterface::class); - $expected = $plugin_form->reveal(); - - $plugin = $this->prophesize(PluginInspectionInterface::class); - $plugin->getPluginDefinition()->willReturn([ - 'forms' => [ - 'standard_class' => get_class($expected), - ], - ]); - - $result = $this->manager->hasForm($plugin->reveal(), 'standard_class'); - $this->assertTrue($result); - } - - /** * @covers ::createInstance */ public function testCreateInstance() { @@ -68,12 +50,9 @@ public function testCreateInstance() { $this->classResolver->getInstanceFromDefinition(get_class($expected))->willReturn($expected); - $plugin = $this->prophesize(PluginInspectionInterface::class); - $plugin->getPluginDefinition()->willReturn([ - 'forms' => [ - 'standard_class' => get_class($expected), - ], - ]); + $plugin = $this->prophesize(PluginWithFormsInterface::class); + $plugin->hasFormClass('standard_class')->willReturn(TRUE); + $plugin->getFormClass('standard_class')->willReturn(get_class($expected)); $form_object = $this->manager->createInstance($plugin->reveal(), 'standard_class'); $this->assertSame($expected, $form_object); @@ -85,12 +64,9 @@ public function testCreateInstance() { public function testCreateInstanceUsingPlugin() { $this->classResolver->getInstanceFromDefinition(Argument::cetera())->shouldNotBeCalled(); - $plugin = $this->prophesize(PluginInspectionInterface::class)->willImplement(PluginFormInterface::class); - $plugin->getPluginDefinition()->willReturn([ - 'forms' => [ - 'configure' => get_class($plugin->reveal()), - ], - ]); + $plugin = $this->prophesize(PluginWithFormsInterface::class)->willImplement(PluginFormInterface::class); + $plugin->hasFormClass('configure')->willReturn(TRUE); + $plugin->getFormClass('configure')->willReturn(get_class($plugin->reveal())); $form_object = $this->manager->createInstance($plugin->reveal(), 'configure'); $this->assertSame($plugin->reveal(), $form_object); @@ -102,12 +78,9 @@ public function testCreateInstanceUsingPlugin() { public function testCreateInstanceUsingPluginWithSlashes() { $this->classResolver->getInstanceFromDefinition(Argument::cetera())->shouldNotBeCalled(); - $plugin = $this->prophesize(PluginInspectionInterface::class)->willImplement(PluginFormInterface::class); - $plugin->getPluginDefinition()->willReturn([ - 'forms' => [ - 'configure' => '\\' . get_class($plugin->reveal()), - ], - ]); + $plugin = $this->prophesize(PluginWithFormsInterface::class)->willImplement(PluginFormInterface::class); + $plugin->hasFormClass('configure')->willReturn(TRUE); + $plugin->getFormClass('configure')->willReturn('\\' . get_class($plugin->reveal())); $form_object = $this->manager->createInstance($plugin->reveal(), 'configure'); $this->assertSame($plugin->reveal(), $form_object); @@ -119,12 +92,10 @@ public function testCreateInstanceUsingPluginWithSlashes() { public function testCreateInstanceDefaultFallback() { $this->classResolver->getInstanceFromDefinition(Argument::cetera())->shouldNotBeCalled(); - $plugin = $this->prophesize(PluginInspectionInterface::class)->willImplement(PluginFormInterface::class); - $plugin->getPluginDefinition()->willReturn([ - 'forms' => [ - 'fallback' => get_class($plugin->reveal()), - ], - ]); + $plugin = $this->prophesize(PluginWithFormsInterface::class)->willImplement(PluginFormInterface::class); + $plugin->hasFormClass('missing')->willReturn(FALSE); + $plugin->hasFormClass('fallback')->willReturn(TRUE); + $plugin->getFormClass('fallback')->willReturn(get_class($plugin->reveal())); $form_object = $this->manager->createInstance($plugin->reveal(), 'missing', 'fallback'); $this->assertSame($plugin->reveal(), $form_object); @@ -140,12 +111,9 @@ public function testCreateInstancePluginAware() { $this->classResolver->getInstanceFromDefinition(get_class($expected))->willReturn($expected); - $plugin = $this->prophesize(PluginInspectionInterface::class); - $plugin->getPluginDefinition()->willReturn([ - 'forms' => [ - 'operation_aware' => get_class($expected), - ], - ]); + $plugin = $this->prophesize(PluginWithFormsInterface::class); + $plugin->hasFormClass('operation_aware')->willReturn(TRUE); + $plugin->getFormClass('operation_aware')->willReturn(get_class($expected)); $plugin_form->setPlugin($plugin->reveal())->shouldBeCalled(); @@ -159,9 +127,9 @@ public function testCreateInstancePluginAware() { public function testCreateInstanceDefinitionException() { $this->setExpectedException(InvalidPluginDefinitionException::class, 'The "the_plugin_id" plugin did not specify a "anything" form class'); - $plugin = $this->prophesize(PluginInspectionInterface::class); + $plugin = $this->prophesize(PluginWithFormsInterface::class); $plugin->getPluginId()->willReturn('the_plugin_id'); - $plugin->getPluginDefinition()->willReturn([]); + $plugin->hasFormClass('anything')->willReturn(FALSE); $form_object = $this->manager->createInstance($plugin->reveal(), 'anything'); $this->assertSame(NULL, $form_object); @@ -176,13 +144,10 @@ public function testCreateInstanceInvalidException() { $expected = new \stdClass(); $this->classResolver->getInstanceFromDefinition(get_class($expected))->willReturn($expected); - $plugin = $this->prophesize(PluginInspectionInterface::class); + $plugin = $this->prophesize(PluginWithFormsInterface::class); $plugin->getPluginId()->willReturn('the_plugin_id'); - $plugin->getPluginDefinition()->willReturn([ - 'forms' => [ - 'invalid' => get_class($expected), - ], - ]); + $plugin->hasFormClass('invalid')->willReturn(TRUE); + $plugin->getFormClass('invalid')->willReturn(get_class($expected)); $form_object = $this->manager->createInstance($plugin->reveal(), 'invalid'); $this->assertSame(NULL, $form_object);