function WorkflowEditForm::form

Same name and namespace in other branches
  1. 8.9.x core/modules/workflows/src/Form/WorkflowEditForm.php \Drupal\workflows\Form\WorkflowEditForm::form()
  2. 10 core/modules/workflows/src/Form/WorkflowEditForm.php \Drupal\workflows\Form\WorkflowEditForm::form()
  3. 11.x core/modules/workflows/src/Form/WorkflowEditForm.php \Drupal\workflows\Form\WorkflowEditForm::form()

Overrides EntityForm::form

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;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.