From 11c6e5be7ee346d995c805d4f83781c30c214ebf Mon Sep 17 00:00:00 2001 From: Michael Stenta Date: Fri, 4 Aug 2023 10:18:14 -0400 Subject: [PATCH] Refactor QuickFormInstanceManager to return config entities. --- .../src/Controller/QuickFormController.php | 2 +- modules/core/quick/src/Form/QuickForm.php | 12 ++++----- .../Plugin/Derivative/QuickFormMenuLink.php | 2 +- .../quick/src/QuickFormInstanceManager.php | 25 ++++++++++++++++--- .../src/QuickFormInstanceManagerInterface.php | 6 ++--- .../quick/src/Routing/QuickFormRoutes.php | 2 +- .../quick/tests/src/Kernel/QuickFormTest.php | 4 +-- 7 files changed, 35 insertions(+), 18 deletions(-) diff --git a/modules/core/quick/src/Controller/QuickFormController.php b/modules/core/quick/src/Controller/QuickFormController.php index 2138c501d..4fe9f3cf5 100644 --- a/modules/core/quick/src/Controller/QuickFormController.php +++ b/modules/core/quick/src/Controller/QuickFormController.php @@ -48,7 +48,7 @@ class QuickFormController extends ControllerBase { * Returns a render array. */ public function index(): array { - /** @var \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface[] $quick_forms */ + /** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface[] $quick_forms */ $quick_forms = $this->quickFormInstanceManager->getInstances(); $items = []; foreach ($quick_forms as $id => $quick_form) { diff --git a/modules/core/quick/src/Form/QuickForm.php b/modules/core/quick/src/Form/QuickForm.php index 87df1273f..00c3ea150 100644 --- a/modules/core/quick/src/Form/QuickForm.php +++ b/modules/core/quick/src/Form/QuickForm.php @@ -63,7 +63,7 @@ class QuickForm extends FormBase implements BaseFormIdInterface { $form_id = $this->getBaseFormId(); $id = $this->getRouteMatch()->getParameter('id'); if (!is_null($id)) { - $form_id .= '_' . $this->quickFormInstanceManager->createInstance($id)->getFormId(); + $form_id .= '_' . $this->quickFormInstanceManager->createInstance($id)->getPlugin()->getFormId(); } return $form_id; } @@ -93,7 +93,7 @@ class QuickForm extends FormBase implements BaseFormIdInterface { * The access result. */ public function access(AccountInterface $account, string $id) { - return $this->quickFormInstanceManager->createInstance($id)->access($account); + return $this->quickFormInstanceManager->createInstance($id)->getPlugin()->access($account); } /** @@ -105,9 +105,7 @@ class QuickForm extends FormBase implements BaseFormIdInterface { $this->quickFormId = $id; // Load the quick form. - /** @var \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface $quick_form */ - $quick_form = $this->quickFormInstanceManager->createInstance($id); - $form = $quick_form->buildForm($form, $form_state); + $form = $this->quickFormInstanceManager->createInstance($id)->getPlugin()->buildForm($form, $form_state); // Add a submit button, if one wasn't provided. if (empty($form['actions']['submit'])) { @@ -128,14 +126,14 @@ class QuickForm extends FormBase implements BaseFormIdInterface { * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { - $this->quickFormInstanceManager->createInstance($this->quickFormId)->validateForm($form, $form_state); + $this->quickFormInstanceManager->createInstance($this->quickFormId)->getPlugin()->validateForm($form, $form_state); } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { - $this->quickFormInstanceManager->createInstance($this->quickFormId)->submitForm($form, $form_state); + $this->quickFormInstanceManager->createInstance($this->quickFormId)->getPlugin()->submitForm($form, $form_state); } } diff --git a/modules/core/quick/src/Plugin/Derivative/QuickFormMenuLink.php b/modules/core/quick/src/Plugin/Derivative/QuickFormMenuLink.php index a60c106b1..7bfae6c65 100644 --- a/modules/core/quick/src/Plugin/Derivative/QuickFormMenuLink.php +++ b/modules/core/quick/src/Plugin/Derivative/QuickFormMenuLink.php @@ -45,7 +45,7 @@ class QuickFormMenuLink extends DeriverBase implements ContainerDeriverInterface $links = []; // Load quick forms. - /** @var \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface[] $quick_forms */ + /** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface[] $quick_forms */ $quick_forms = $this->quickFormInstanceManager->getInstances(); // Add a top level menu parent. diff --git a/modules/core/quick/src/QuickFormInstanceManager.php b/modules/core/quick/src/QuickFormInstanceManager.php index 4fbf3b80d..5b456e737 100644 --- a/modules/core/quick/src/QuickFormInstanceManager.php +++ b/modules/core/quick/src/QuickFormInstanceManager.php @@ -3,6 +3,7 @@ namespace Drupal\farm_quick; use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\farm_quick\Entity\QuickFormInstance; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -56,8 +57,17 @@ class QuickFormInstanceManager implements QuickFormInstanceManagerInterface { // Iterate through quick form plugin definitions. foreach ($this->quickFormPluginManager->getDefinitions() as $plugin) { - // Instantiate a quick form for the plugin. - $instances[$plugin['id']] = $this->quickFormPluginManager->createInstance($plugin['id']); + // Load quick form instance configuration entities for this plugin. + $entities = $this->entityTypeManager->getStorage('quick_form')->loadByProperties(['plugin' => $plugin['id']]); + if (!empty($entities)) { + $instances += $entities; + } + + // If there are no config entities, create a new (unsaved) config entity + // with default values from the plugin. + else { + $instances[$plugin['id']] = QuickFormInstance::create(['id' => $plugin['id'], 'plugin' => $plugin['id']]); + } } return $instances; @@ -67,7 +77,16 @@ class QuickFormInstanceManager implements QuickFormInstanceManagerInterface { * {@inheritdoc} */ public function createInstance($id) { - return $this->quickFormPluginManager->createInstance($id); + + // First attempt to load a quick form instance config entity. + $entity = $this->entityTypeManager->getStorage('quick_form')->load($id); + if (!empty($entity)) { + return $entity; + } + + // Otherwise, create a new (unsaved) config entity with default values from + // the plugin. + return QuickFormInstance::create(['id' => $id, 'plugin' => $id]); } } diff --git a/modules/core/quick/src/QuickFormInstanceManagerInterface.php b/modules/core/quick/src/QuickFormInstanceManagerInterface.php index c8c43ade9..0ad5d38a5 100644 --- a/modules/core/quick/src/QuickFormInstanceManagerInterface.php +++ b/modules/core/quick/src/QuickFormInstanceManagerInterface.php @@ -10,10 +10,10 @@ interface QuickFormInstanceManagerInterface { /** * Get all quick form instances. * - * @return array + * @return \Drupal\farm_quick\Entity\QuickFormInstanceInterface[] * An array of quick form instances. */ - public function getInstances(): array; + public function getInstances(); /** * Create an instance of a quick form. @@ -21,7 +21,7 @@ interface QuickFormInstanceManagerInterface { * @param string $id * The quick form ID. * - * @return \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface|null + * @return \Drupal\farm_quick\Entity\QuickFormInstanceInterface|null * Returns an instantiated quick form object. */ public function createInstance($id); diff --git a/modules/core/quick/src/Routing/QuickFormRoutes.php b/modules/core/quick/src/Routing/QuickFormRoutes.php index 2135058f8..90f9d9c33 100644 --- a/modules/core/quick/src/Routing/QuickFormRoutes.php +++ b/modules/core/quick/src/Routing/QuickFormRoutes.php @@ -48,7 +48,7 @@ class QuickFormRoutes implements ContainerInjectionInterface { */ public function routes(): RouteCollection { $route_collection = new RouteCollection(); - /** @var \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface[] $quick_forms */ + /** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface[] $quick_forms */ $quick_forms = $this->quickFormInstanceManager->getInstances(); foreach ($quick_forms as $id => $quick_form) { $route = new Route( diff --git a/modules/core/quick/tests/src/Kernel/QuickFormTest.php b/modules/core/quick/tests/src/Kernel/QuickFormTest.php index ae03f0867..d0e44b052 100644 --- a/modules/core/quick/tests/src/Kernel/QuickFormTest.php +++ b/modules/core/quick/tests/src/Kernel/QuickFormTest.php @@ -62,7 +62,7 @@ class QuickFormTest extends KernelTestBase { public function testQuickFormDiscovery() { // Load quick forms. - /** @var \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface[] $quick_forms */ + /** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface[] $quick_forms */ $quick_forms = $this->quickFormInstanceManager->getInstances(); // Confirm that one quick form was discovered. @@ -72,7 +72,7 @@ class QuickFormTest extends KernelTestBase { $this->assertEquals('Test quick form', $quick_forms['test']->getLabel()); $this->assertEquals('Test quick form description.', $quick_forms['test']->getDescription()); $this->assertEquals('Test quick form help text.', $quick_forms['test']->getHelpText()); - $this->assertEquals(['create test log'], $quick_forms['test']->getPermissions()); + $this->assertEquals(['create test log'], $quick_forms['test']->getPlugin()->getPermissions()); } /**