View source
<?php
namespace Drupal\workflow_cleanup\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\workflow\Entity\WorkflowConfigTransition;
use Drupal\workflow\Entity\WorkflowState;
class WorkflowCleanupSettingsForm extends FormBase {
public function getFormId() {
return 'workflow_cleanup_settings';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form = [];
$orphans = $inactive = [];
$states = WorkflowState::loadMultiple();
foreach ($states as $state) {
if (!$state
->getWorkflow()) {
$orphans[$state
->id()] = $state;
}
else {
if (!$state
->isActive()) {
$inactive[$state
->id()] = $state;
}
}
}
$form['#workflow_states'] = $orphans + $inactive;
$form['no_workflow'] = [
'#type' => 'details',
'#title' => $this
->t('Orphaned States'),
'#open' => TRUE,
'#description' => $this
->t('These states no longer belong to an existing workflow.'),
'#tree' => TRUE,
];
foreach ($orphans as $sid => $state) {
$form['no_workflow'][$sid]['check'] = [
'#type' => 'checkbox',
'#title' => $state
->label(),
'#return_value' => $sid,
];
}
$form['inactive'] = [
'#type' => 'details',
'#title' => $this
->t('Inactive (Deleted) States'),
'#open' => TRUE,
'#description' => $this
->t('These states belong to a workflow, but have been marked inactive (deleted).'),
'#tree' => TRUE,
];
foreach ($inactive as $sid => $state) {
$form['inactive'][$sid]['check'] = [
'#type' => 'checkbox',
'#title' => $state
->label() . ' (' . $state
->getWorkflow()
->label() . ')',
'#return_value' => $sid,
];
}
$form['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Delete selected states'),
];
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$states = $form['#workflow_states'];
$values = $form_state
->getValues();
foreach ([
'no_workflow',
'inactive',
] as $section) {
if (!isset($values[$section])) {
continue;
}
foreach ($values[$section] as $sid => $data) {
if (!$data['check']) {
continue;
}
$state = $states[$sid];
$state_name = $state
->label();
$count = 0;
foreach (WorkflowConfigTransition::loadMultiple() as $config_transition) {
if ($config_transition
->getFromSid() == $sid || $config_transition
->getToSid() == $sid) {
$config_transition
->delete();
$count++;
}
}
if ($count) {
$this
->messenger()
->addStatus($this
->t('@count transitions for the "@state" state have been deleted.', [
'@state' => $state_name,
'@count' => $count,
]));
}
$count = 0;
if ($count) {
$this
->messenger()
->addStatus($this
->t('@count history records for the "@state" state have been deleted.', [
'@state' => $state_name,
'@count' => $count,
]));
}
$state
->delete();
$this
->messenger()
->addStatus($this
->t('The "@state" state has been deleted.', [
'@state' => $state_name,
]));
}
}
}
}