X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fworkflows%2Fsrc%2FForm%2FWorkflowTransitionAddForm.php;fp=web%2Fcore%2Fmodules%2Fworkflows%2Fsrc%2FForm%2FWorkflowTransitionAddForm.php;h=84522929892a0278ac89bdd53ea5cb49d441a55b;hp=fe3a40636d659eed594d8245c2a1a8137e247972;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/web/core/modules/workflows/src/Form/WorkflowTransitionAddForm.php b/web/core/modules/workflows/src/Form/WorkflowTransitionAddForm.php index fe3a40636..845229298 100644 --- a/web/core/modules/workflows/src/Form/WorkflowTransitionAddForm.php +++ b/web/core/modules/workflows/src/Form/WorkflowTransitionAddForm.php @@ -5,13 +5,43 @@ 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\workflows\State; +use Drupal\workflows\TransitionInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Class WorkflowTransitionAddForm. */ class WorkflowTransitionAddForm extends EntityForm { + /** + * 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} */ @@ -27,6 +57,8 @@ class WorkflowTransitionAddForm extends EntityForm { /* @var \Drupal\workflows\WorkflowInterface $workflow */ $workflow = $this->getEntity(); + $workflow_type = $workflow->getTypePlugin(); + $form['label'] = [ '#type' => 'textfield', '#title' => $this->t('Label'), @@ -45,7 +77,7 @@ class WorkflowTransitionAddForm 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'), @@ -57,15 +89,19 @@ class WorkflowTransitionAddForm extends EntityForm { '#type' => 'radios', '#title' => $this->t('To'), '#required' => TRUE, - '#default_value' => [], '#options' => $states, ]; // Add additional form fields from the workflow type plugin. - $form['type_settings'] = [ - $workflow->get('type') => $workflow->getTypePlugin()->buildTransitionConfigurationForm($form_state, $workflow), - '#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); + $form['type_settings'] += $this->pluginFormFactory + ->createInstance($workflow_type, TransitionInterface::PLUGIN_FORM_KEY) + ->buildConfigurationForm($form['type_settings'], $subform_state); + } return $form; } @@ -82,7 +118,7 @@ class WorkflowTransitionAddForm extends EntityForm { public function exists($transition_id) { /** @var \Drupal\workflows\WorkflowInterface $original_workflow */ $original_workflow = \Drupal::entityTypeManager()->getStorage('workflow')->loadUnchanged($this->getEntity()->id()); - return $original_workflow->hasTransition($transition_id); + return $original_workflow->getTypePlugin()->hasTransition($transition_id); } /** @@ -104,30 +140,33 @@ class WorkflowTransitionAddForm extends EntityForm { } /** @var \Drupal\workflows\WorkflowInterface $entity */ $values = $form_state->getValues(); - $entity->addTransition($values['id'], $values['label'], array_filter($values['from']), $values['to']); - 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()->addTransition($values['id'], $values['label'], array_filter($values['from']), $values['to']); } - /** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { /** @var \Drupal\workflows\WorkflowInterface $workflow */ $workflow = $this->getEntity(); + $workflow_type = $workflow->getTypePlugin(); + $values = $form_state->getValues(); foreach (array_filter($values['from']) as $from_state_id) { - if ($workflow->hasTransitionFromStateToState($from_state_id, $values['to'])) { + if ($workflow->getTypePlugin()->hasTransitionFromStateToState($from_state_id, $values['to'])) { $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); + $this->pluginFormFactory + ->createInstance($workflow_type, TransitionInterface::PLUGIN_FORM_KEY) + ->validateConfigurationForm($form['type_settings'], $subform_state); + } } /** @@ -136,6 +175,17 @@ class WorkflowTransitionAddForm 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($form_state->getValue('id')); + + 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('Created %label transition.', [ '%label' => $form_state->getValue('label'),