You are here

public function WorkflowEditForm::form in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/workflows/src/Form/WorkflowEditForm.php \Drupal\workflows\Form\WorkflowEditForm::form()
  2. 9 core/modules/workflows/src/Form/WorkflowEditForm.php \Drupal\workflows\Form\WorkflowEditForm::form()

Gets the actual form array to be built.

Overrides EntityForm::form

See also

\Drupal\Core\Entity\EntityForm::processForm()

\Drupal\Core\Entity\EntityForm::afterBuild()

File

core/modules/workflows/src/Form/WorkflowEditForm.php, line 52

Class

WorkflowEditForm
The form for editing workflows.

Namespace

Drupal\workflows\Form

Code

public function form(array $form, FormStateInterface $form_state) {
  $form = parent::form($form, $form_state);

  /** @var \Drupal\workflows\WorkflowInterface $workflow */
  $workflow = $this->entity;
  $workflow_type = $workflow
    ->getTypePlugin();
  $form['#title'] = $this
    ->t('Edit %label workflow', [
    '%label' => $workflow
      ->label(),
  ]);
  $form['label'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Label'),
    '#maxlength' => 255,
    '#default_value' => $workflow
      ->label(),
    '#required' => TRUE,
  ];
  $form['id'] = [
    '#type' => 'machine_name',
    '#default_value' => $workflow
      ->id(),
    '#machine_name' => [
      'exists' => [
        Workflow::class,
        'load',
      ],
    ],
    '#disabled' => TRUE,
  ];
  $header = [
    'state' => $this
      ->t('State'),
    'weight' => $this
      ->t('Weight'),
    'operations' => $this
      ->t('Operations'),
  ];
  $form['states_container'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('States'),
    '#open' => TRUE,
  ];
  $form['states_container']['states'] = [
    '#type' => 'table',
    '#header' => $header,
    '#title' => $this
      ->t('States'),
    '#empty' => $this
      ->t('There are no states yet.'),
    '#tabledrag' => [
      [
        'action' => 'order',
        'relationship' => 'sibling',
        'group' => 'state-weight',
      ],
    ],
  ];
  $states = $workflow
    ->getTypePlugin()
    ->getStates();

  // Warn the user if there are no states.
  if (empty($states)) {
    $this
      ->messenger()
      ->addWarning($this
      ->t('This workflow has no states and will be disabled until there is at least one, <a href=":add-state">add a new state.</a>', [
      ':add-state' => $workflow
        ->toUrl('add-state-form')
        ->toString(),
    ]));
  }
  $state_weight_delta = round(count($states) / 2);
  foreach ($states as $state) {
    $links = [
      'edit' => [
        'title' => $this
          ->t('Edit'),
        'url' => Url::fromRoute('entity.workflow.edit_state_form', [
          'workflow' => $workflow
            ->id(),
          'workflow_state' => $state
            ->id(),
        ]),
      ],
    ];
    if ($this->entity
      ->access('delete-state:' . $state
      ->id())) {
      $links['delete'] = [
        'title' => $this
          ->t('Delete'),
        'url' => Url::fromRoute('entity.workflow.delete_state_form', [
          'workflow' => $workflow
            ->id(),
          'workflow_state' => $state
            ->id(),
        ]),
      ];
    }
    $form['states_container']['states'][$state
      ->id()] = [
      '#attributes' => [
        'class' => [
          'draggable',
        ],
      ],
      'state' => [
        '#markup' => $state
          ->label(),
      ],
      '#weight' => $state
        ->weight(),
      'weight' => [
        '#type' => 'weight',
        '#title' => $this
          ->t('Weight for @title', [
          '@title' => $state
            ->label(),
        ]),
        '#title_display' => 'invisible',
        '#default_value' => $state
          ->weight(),
        '#attributes' => [
          'class' => [
            'state-weight',
          ],
        ],
        '#delta' => $state_weight_delta,
      ],
      'operations' => [
        '#type' => 'operations',
        '#links' => $links,
      ],
    ];
  }
  $form['states_container']['state_add'] = [
    '#markup' => $workflow
      ->toLink($this
      ->t('Add a new state'), 'add-state-form')
      ->toString(),
  ];
  $header = [
    'label' => $this
      ->t('Label'),
    'weight' => $this
      ->t('Weight'),
    'from' => $this
      ->t('From'),
    'to' => $this
      ->t('To'),
    'operations' => $this
      ->t('Operations'),
  ];
  $form['transitions_container'] = [
    '#type' => 'details',
    '#title' => $this
      ->t('Transitions'),
    '#open' => TRUE,
  ];
  $form['transitions_container']['transitions'] = [
    '#type' => 'table',
    '#header' => $header,
    '#title' => $this
      ->t('Transitions'),
    '#empty' => $this
      ->t('There are no transitions yet.'),
    '#tabledrag' => [
      [
        'action' => 'order',
        'relationship' => 'sibling',
        'group' => 'transition-weight',
      ],
    ],
  ];
  $transitions = $workflow
    ->getTypePlugin()
    ->getTransitions();
  $transition_weight_delta = round(count($transitions) / 2);
  foreach ($transitions as $transition) {
    $links['edit'] = [
      'title' => $this
        ->t('Edit'),
      'url' => Url::fromRoute('entity.workflow.edit_transition_form', [
        'workflow' => $workflow
          ->id(),
        'workflow_transition' => $transition
          ->id(),
      ]),
    ];
    $links['delete'] = [
      'title' => $this
        ->t('Delete'),
      'url' => Url::fromRoute('entity.workflow.delete_transition_form', [
        'workflow' => $workflow
          ->id(),
        'workflow_transition' => $transition
          ->id(),
      ]),
    ];
    $form['transitions_container']['transitions'][$transition
      ->id()] = [
      '#attributes' => [
        'class' => [
          'draggable',
        ],
      ],
      'label' => [
        '#markup' => $transition
          ->label(),
      ],
      '#weight' => $transition
        ->weight(),
      'weight' => [
        '#type' => 'weight',
        '#title' => $this
          ->t('Weight for @title', [
          '@title' => $transition
            ->label(),
        ]),
        '#title_display' => 'invisible',
        '#default_value' => $transition
          ->weight(),
        '#attributes' => [
          'class' => [
            'transition-weight',
          ],
        ],
        '#delta' => $transition_weight_delta,
      ],
      'from' => [
        '#theme' => 'item_list',
        '#items' => array_map([
          State::class,
          'labelCallback',
        ], $transition
          ->from()),
        '#context' => [
          'list_style' => 'comma-list',
        ],
      ],
      'to' => [
        '#markup' => $transition
          ->to()
          ->label(),
      ],
      'operations' => [
        '#type' => 'operations',
        '#links' => $links,
      ],
    ];
  }
  $form['transitions_container']['transition_add'] = [
    '#markup' => $workflow
      ->toLink($this
      ->t('Add a new transition'), 'add-transition-form')
      ->toString(),
  ];
  if ($workflow_type
    ->hasFormClass(WorkflowTypeInterface::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, WorkflowTypeInterface::PLUGIN_FORM_KEY)
      ->buildConfigurationForm($form['type_settings'], $subform_state);
  }
  return $form;
}