getWorkflow()) { $orphans[$state->sid] = $state->getName(); } else { // Is the state still active? if (!$state->isActive()) { $inactive[$state->sid] = $state->getName(); } } } $form['#workflow_states'] = $states; $form['no_workflow'] = array( '#type' => 'container', '#title' => t('Orphaned States'), '#description' => t('These states no longer belong to an existing workflow.'), '#tree' => TRUE, ); foreach ($orphans as $sid => $name) { $form['no_workflow'][$sid]['check'] = array( '#type' => 'checkbox', '#return_value' => $sid, ); $form['no_workflow'][$sid]['name'] = array( '#type' => 'markup', '#markup' => check_plain($name), ); } $form['inactive'] = array( '#type' => 'container', '#title' => t('Inactive (Deleted) States'), '#description' => t('These states belong to a workflow, but have been marked inactive (deleted).'), '#tree' => TRUE, ); foreach ($inactive as $sid => $name) { $form['inactive'][$sid]['check'] = array( '#type' => 'checkbox', '#return_value' => $sid, ); $form['inactive'][$sid]['name'] = array( '#type' => 'markup', '#markup' => check_plain($name), ); $form['inactive'][$sid]['wf'] = array( '#type' => 'markup', '#markup' => (!empty($sid)) ? check_plain($states[$sid]->getWorkflow()->getName()) : '', ); } $form['submit'] = array('#type' => 'submit', '#value' => t('Delete selected states')); return $form; } /** * Theme the main form. */ function theme_workflow_cleanup_form($variables) { $form = $variables['form']; $output = ''; $header = array(t('Select'), t('State')); $rows = array(); foreach (element_children($form['no_workflow']) as $sid) { $rows[] = array( drupal_render($form['no_workflow'][$sid]['check']), drupal_render($form['no_workflow'][$sid]['name']), ); } $output .= '

' . $form['no_workflow']['#title'] . '

'; $output .= '
' . $form['no_workflow']['#description'] . '
'; $output .= theme('table', array( 'header' => $header, 'rows' => $rows, 'empty' => 'All states are fine', 'attributes' => array('style' => 'width: auto;'), )); $header[] = t('Workflow'); $rows = array(); foreach (element_children($form['inactive']) as $sid) { $rows[] = array( drupal_render($form['inactive'][$sid]['check']), drupal_render($form['inactive'][$sid]['name']), drupal_render($form['inactive'][$sid]['wf']), ); } $output .= '

' . $form['inactive']['#title'] . '

'; $output .= '
' . $form['inactive']['#description'] . '
'; $output .= theme( 'table', array( 'header' => $header, 'rows' => $rows, 'empty' => 'All states are fine', 'attributes' => array('style' => 'width: auto;'), ) ); $output .= drupal_render_children($form); return $output; } /** * Submission handler for main cleanup form. */ function workflow_cleanup_form_submit($form, $form_state) { $states = $form['#workflow_states']; foreach (array('no_workflow', 'inactive') as $section) { if (!isset($form_state['values'][$section])) { continue; } foreach ($form_state['values'][$section] as $sid => $data) { // FAPI returns either a 0 or the sid. if ($data['check']) { $state = $states[$sid]; $state_name = $state->getName(); // Delete any transitions this state is involved in. $trans_del = db_delete('workflow_transitions')->condition('target_sid', $sid)->execute(); $trans_del += db_delete('workflow_transitions')->condition('sid', $sid)->execute(); if ($trans_del) { drupal_set_message(t('@count transitions for the "@state" state have been deleted.', array('@state' => $state_name, '@count' => $trans_del))); } // Remove history records too. $hist_del = db_delete('workflow_node_history')->condition('sid', $sid)->execute(); if ($hist_del) { drupal_set_message(t('@count history records for the "@state" state have been deleted.', array('@state' => $state_name, '@count' => $hist_del))); } // Go ahead and delete the state. db_delete('workflow_states')->condition('sid', $sid)->execute(); drupal_set_message(t('The "@state" state has been deleted.', array('@state' => $state_name))); } } } }