You are here

workflow_cleanup.module in Workflow 7

Same filename and directory in other branches
  1. 7.2 workflow_cleanup/workflow_cleanup.module

Cleans up Workflow cruft that may build up over time.

File

workflow_cleanup/workflow_cleanup.module
View source
<?php

/**
 * @file
 * Cleans up Workflow cruft that may build up over time.
 */

/**
 * Implements hook_menu().
 */
function workflow_cleanup_menu() {
  $items = array();
  $items['admin/config/workflow/workflow/cleanup'] = array(
    'title' => 'Workflow Clean Up',
    'access arguments' => array(
      'administer workflow',
    ),
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'workflow_cleanup_form',
    ),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
 * Implements hook_theme().
 */
function workflow_cleanup_theme() {
  return array(
    'workflow_cleanup_form' => array(
      'render element' => 'form',
    ),
  );
}

/**
 * Implements hook_workflow_operations().
 * Might as well eat our own cooking.
 */
function workflow_cleanup_workflow_operations($op, $workflow = NULL, $state = NULL) {
  switch ($op) {
    case 'top_actions':
      $alt = t('Clean up workflow cruft');
      $actions = array(
        'workflow-cleanup' => array(
          'title' => t('Clean up'),
          'href' => 'admin/config/workflow/workflow/cleanup',
          'attributes' => array(
            'alt' => $alt,
            'title' => $alt,
          ),
        ),
      );
      return $actions;
  }
}

/**
 * The main cleanup page.
 */
function workflow_cleanup_form($form, $form_state) {
  $bc = array(
    l(t('Home'), '<front>'),
  );
  $bc[] = l(t('Configuration'), 'admin/config');
  $bc[] = l(t('Workflow'), 'admin/config/workflow');
  $bc[] = l(t('Workflow'), 'admin/config/workflow/workflow');
  drupal_set_breadcrumb($bc);
  $form = array();

  // Get all of the states, indexed by sid.
  $states = $orphans = $inactive = array();
  foreach ($states = WorkflowState::getStates() as $state) {

    // Does the associated workflow exist?
    if (!$state
      ->getWorkflow()) {
      $orphans[$state->sid] = $state
        ->getName();
    }
    else {

      // Is the state still active?
      if (!$state
        ->isActive()) {
        $inactive[$state->sid] = $state
          ->getName();
      }
    }
  }

  // Deal with no orphan states.
  if (!$orphans) {
    $orphans[0] = t('None');
  }

  // Deal with no inactive states.
  if (!$inactive) {
    $inactive[0] = $states[0] = t('None');
  }
  $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]
        ->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 .= '<h3>' . $form['no_workflow']['#title'] . '</h3>';
  $output .= '<div class="description">' . $form['no_workflow']['#description'] . '</div>';
  $output .= theme('table', array(
    'header' => $header,
    'rows' => $rows,
    '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 .= '<h3>' . $form['inactive']['#title'] . '</h3>';
  $output .= '<div class="description">' . $form['inactive']['#description'] . '</div>';
  $output .= theme('table', array(
    'header' => $header,
    'rows' => $rows,
    '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) {
    foreach ($form_state['values'][$section] as $sid => $data) {

      // FAPI returns either a 0 or the sid.
      if ($data['check']) {

        // 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' => $states[$sid]->state,
            '@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' => $states[$sid]
              ->getName(),
            '@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' => $states[$sid]
            ->getName(),
        )));
      }
    }
  }
}

Functions

Namesort descending Description
theme_workflow_cleanup_form Theme the main form.
workflow_cleanup_form The main cleanup page.
workflow_cleanup_form_submit Submission handler for main cleanup form.
workflow_cleanup_menu Implements hook_menu().
workflow_cleanup_theme Implements hook_theme().
workflow_cleanup_workflow_operations Implements hook_workflow_operations(). Might as well eat our own cooking.