X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fworkflows%2Fsrc%2FForm%2FWorkflowTransitionEditForm.php;h=1406025a72f7ef5ddab9ad169372d0fd249ba437;hp=5bbabae6f7af3b75eda191aab7594e7b33ddc515;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/web/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php b/web/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php index 5bbabae6f..1406025a7 100644 --- a/web/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php +++ b/web/core/modules/workflows/src/Form/WorkflowTransitionEditForm.php @@ -5,8 +5,12 @@ namespace Drupal\workflows\Form; use Drupal\Core\Entity\EntityForm; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Form\FormStateInterface; +use Drupal\Core\Form\SubformState; +use Drupal\Core\Plugin\PluginFormFactoryInterface; use Drupal\Core\Url; use Drupal\workflows\State; +use Drupal\workflows\TransitionInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Class WorkflowTransitionEditForm. @@ -20,6 +24,32 @@ class WorkflowTransitionEditForm extends EntityForm { */ protected $transitionId; + /** + * The plugin form factory. + * + * @var \Drupal\Core\Plugin\PluginFormFactoryInterface + */ + protected $pluginFormFactory; + + /** + * Creates an instance of WorkflowStateEditForm. + * + * @param \Drupal\Core\Plugin\PluginFormFactoryInterface $pluginFormFactory + * The plugin form factory. + */ + public function __construct(PluginFormFactoryInterface $pluginFormFactory) { + $this->pluginFormFactory = $pluginFormFactory; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('plugin_form.factory') + ); + } + /** * {@inheritdoc} */ @@ -43,7 +73,9 @@ class WorkflowTransitionEditForm extends EntityForm { /* @var \Drupal\workflows\WorkflowInterface $workflow */ $workflow = $this->getEntity(); - $transition = $workflow->getTransition($this->transitionId); + $workflow_type = $workflow->getTypePlugin(); + $transition = $workflow->getTypePlugin()->getTransition($this->transitionId); + $form['label'] = [ '#type' => 'textfield', '#title' => $this->t('Label'), @@ -60,7 +92,7 @@ class WorkflowTransitionEditForm extends EntityForm { // @todo https://www.drupal.org/node/2830584 Add some ajax to ensure that // only valid transitions are selectable. - $states = array_map([State::class, 'labelCallback'], $workflow->getStates()); + $states = array_map([State::class, 'labelCallback'], $workflow->getTypePlugin()->getStates()); $form['from'] = [ '#type' => 'checkboxes', '#title' => $this->t('From'), @@ -78,10 +110,16 @@ class WorkflowTransitionEditForm extends EntityForm { ]; // Add additional form fields from the workflow type plugin. - $form['type_settings'] = [ - $workflow->get('type') => $workflow->getTypePlugin()->buildTransitionConfigurationForm($form_state, $workflow, $transition), - '#tree' => TRUE, - ]; + if ($workflow_type->hasFormClass(TransitionInterface::PLUGIN_FORM_KEY)) { + $form['type_settings'] = [ + '#tree' => TRUE, + ]; + $subform_state = SubformState::createForSubform($form['type_settings'], $form, $form_state); + $subform_state->set('transition', $transition); + $form['type_settings'] += $this->pluginFormFactory + ->createInstance($workflow_type, TransitionInterface::PLUGIN_FORM_KEY) + ->buildConfigurationForm($form['type_settings'], $subform_state); + } return $form; } @@ -92,18 +130,29 @@ class WorkflowTransitionEditForm extends EntityForm { public function validateForm(array &$form, FormStateInterface $form_state) { /** @var \Drupal\workflows\WorkflowInterface $workflow */ $workflow = $this->getEntity(); + $workflow_type = $workflow->getTypePlugin(); + $transition = $workflow_type->getTransition($this->transitionId); + $values = $form_state->getValues(); foreach (array_filter($values['from']) as $from_state_id) { - if ($workflow->hasTransitionFromStateToState($from_state_id, $values['to'])) { - $transition = $workflow->getTransitionFromStateToState($from_state_id, $values['to']); - if ($transition->id() !== $values['id']) { + if ($workflow_type->hasTransitionFromStateToState($from_state_id, $values['to'])) { + $existing_transition = $workflow_type->getTransitionFromStateToState($from_state_id, $values['to']); + if ($existing_transition->id() !== $values['id']) { $form_state->setErrorByName('from][' . $from_state_id, $this->t('The transition from %from to %to already exists.', [ - '%from' => $workflow->getState($from_state_id)->label(), - '%to' => $workflow->getState($values['to'])->label(), + '%from' => $workflow->getTypePlugin()->getState($from_state_id)->label(), + '%to' => $workflow->getTypePlugin()->getState($values['to'])->label(), ])); } } } + + if ($workflow_type->hasFormClass(TransitionInterface::PLUGIN_FORM_KEY)) { + $subform_state = SubformState::createForSubform($form['type_settings'], $form, $form_state); + $subform_state->set('transition', $transition); + $this->pluginFormFactory + ->createInstance($workflow_type, TransitionInterface::PLUGIN_FORM_KEY) + ->validateConfigurationForm($form['type_settings'], $subform_state); + } } /** @@ -126,13 +175,8 @@ class WorkflowTransitionEditForm extends EntityForm { /** @var \Drupal\workflows\WorkflowInterface $entity */ $values = $form_state->getValues(); $form_state->set('created_transition', FALSE); - $entity->setTransitionLabel($values['id'], $values['label']); - $entity->setTransitionFromStates($values['id'], array_filter($values['from'])); - if (isset($values['type_settings'])) { - $configuration = $entity->getTypePlugin()->getConfiguration(); - $configuration['transitions'][$values['id']] = $values['type_settings'][$entity->getTypePlugin()->getPluginId()]; - $entity->set('type_settings', $configuration); - } + $entity->getTypePlugin()->setTransitionLabel($values['id'], $values['label']); + $entity->getTypePlugin()->setTransitionFromStates($values['id'], array_filter($values['from'])); } /** @@ -141,9 +185,20 @@ class WorkflowTransitionEditForm extends EntityForm { public function save(array $form, FormStateInterface $form_state) { /** @var \Drupal\workflows\WorkflowInterface $workflow */ $workflow = $this->entity; + $workflow_type = $workflow->getTypePlugin(); + $transition = $workflow_type->getTransition($this->transitionId); + + if ($workflow_type->hasFormClass(TransitionInterface::PLUGIN_FORM_KEY)) { + $subform_state = SubformState::createForSubform($form['type_settings'], $form, $form_state); + $subform_state->set('transition', $transition); + $this->pluginFormFactory + ->createInstance($workflow_type, TransitionInterface::PLUGIN_FORM_KEY) + ->submitConfigurationForm($form['type_settings'], $subform_state); + } + $workflow->save(); drupal_set_message($this->t('Saved %label transition.', [ - '%label' => $workflow->getTransition($this->transitionId)->label(), + '%label' => $workflow->getTypePlugin()->getTransition($this->transitionId)->label(), ])); $form_state->setRedirectUrl($workflow->toUrl('edit-form')); }