You are here

webform_purge.module in Webform Purge 7

Custom functionality for purging webform submissions.

File

webform_purge.module
View source
<?php

/**
 * @file
 * Custom functionality for purging webform submissions.
 */

/**
 * Implements hook_cron().
 */
function webform_purge_cron() {

  // Is the webform purge function enabled in system settings?
  $enabled = variable_get('webform_purge_enabled');
  if ($enabled == 1) {

    // Run once each day or on every cron run?
    $run_once = variable_get('webform_purge_run_once');
    if ($run_once == 1) {

      // Run only once so find out if we need to run it yet today.
      $cron_last = variable_get('cron_last');
      $run = date('ymd', $cron_last) != date('ymd') ? TRUE : FALSE;
    }
    else {
      $run = TRUE;
    }
    if ($run) {

      // Get the checked checkboxes.
      $checkboxes = variable_get('webform_purge_checkbox_state');
      $purge_all = variable_get('webform_purge_all_submissions', FALSE);

      // Construct timestamp for purging.
      $days_to_retain = variable_get('webform_purge_days_to_retain');
      $purge_timestamp = strtotime(date('Y-m-d H:i:s') . ' -' . $days_to_retain . ' day');

      // Get the records elegible for purging.
      $limit = variable_get('webform_purge_cron_limit', 100000);
      if ($purge_all == 1) {
        $query = db_query('SELECT * FROM {webform_submissions} WHERE submitted < :purge_timestamp' . ($limit ? ' LIMIT ' . check_plain($limit) : ''), array(
          ':purge_timestamp' => $purge_timestamp,
        ));
      }
      else {
        $query = db_query('SELECT * FROM {webform_submissions} WHERE submitted < :purge_timestamp AND nid IN (:nid)' . ($limit ? ' LIMIT ' . check_plain($limit) : ''), array(
          ':purge_timestamp' => $purge_timestamp,
          ':nid' => $checkboxes,
        ));
      }
      $rows = $query
        ->fetchAll();

      // If submissions found to purge, get on with it.
      if (count($rows) > 0) {
        $deleted = 0;
        foreach ($rows as $row) {
          $node = node_load($row->nid);
          $submission = webform_menu_submission_load($row->sid, $row->nid);
          webform_submission_delete($node, $submission);
          $deleted++;
        }
        watchdog('webform_purge', 'Purged %total webform submissions.', array(
          '%total' => $deleted,
        ));
      }
      else {
        watchdog('webform_purge', 'No eligible webform submissions found to purge.', array());
      }
    }
  }
}

/**
 * Implements hook_help().
 */
function webform_purge_help($path, $arg) {
  switch ($path) {
    case 'admin/help#webform_purge':
      $ret_val = '<h3>' . t('About') . '</h3>';
      $ret_val .= '<p>' . t('The Webform Purge module allows you to set up automated purging of Webform submissions on a daily rolling schedule. You select the number of days to retain and the module uses hook_cron to purge them during cron runs.') . '</p>';
      $ret_val .= '<h3>' . t('Configuration') . '</h3>';
      $ret_val .= '<p>' . t('Configure the settings in Administration » Configuration » Webform Purge:') . '</p>';
      $ret_val .= '<ul>';
      $ret_val .= '<li>' . t('Enable automated purging - This option enables the functionality of the module. If not checked, the purge function will not run.') . '</li>';
      $ret_val .= '<li>' . t('Run only once per day - This option is used to limit the purge to just one cron run per day. Conversely if unchecked, it will execute with every cron run.') . '</li>';
      $ret_val .= '<li>' . t('Days to retain - The number of days to retain submissions before they are purged.') . '</li>';
      $ret_val .= '</ul>';
      $ret_val .= '<h3>' . t('FAQ') . '</h3>';
      $ret_val .= '<p>' . t('If expected entries are not purged, check the following:') . '</p>';
      $ret_val .= '<ul>';
      $ret_val .= '<li>' . t('Is the Enable automated purging checkbox checked?') . '</li>';
      $ret_val .= '<li>' . t('Is the submission younger than the Days to retain?') . '</li>';
      $ret_val .= '</ul>';
      $ret_val .= '<h3>' . t('Troubleshooting') . '</h3>';
      $ret_val .= '<p>' . t('Q - If I want to incrementally purge starting with a very old date and progress to my target date, do I have to run this across multiple days?') . '</p>';
      $ret_val .= '<ul>';
      $ret_val .= '<li>' . t('No, you can uncheck the "Run only once per day" option and then set a "Days to retain" at an initial high value and run the cron job. Repeat this with lower values until you achieve your target number of days to retain.') . '</li>';
      $ret_val .= '</ul>';
      $ret_val .= '<p>' . t('Q - How can I tell how many entries were purged?') . '</p>';
      $ret_val .= '<ul>';
      $ret_val .= '<li>' . t('Check the "Recent log messages" under the Reports tab for an informational entry from the webform_purge module.') . '</li>';
      $ret_val .= '</ul>';
      $ret_val .= '<h3>' . t('Module Resources') . '</h3>';
      $ret_val .= '<p>' . t('For a full description of the module, visit the <a href="https://www.drupal.org/project/webform_purge" target="_blank">project page.</a>') . '</p>';
      $ret_val .= '<p>' . t('To submit  <a href="https://www.drupal.org/project/issues/webform_purge" target="_blank">bug reports and feature suggestions, or to track changes.</a>') . '</p>';
      break;
    default:
      $ret_val = '';
      break;
  }
  return $ret_val;
}

/**
 * Implements hook_permission().
 */
function webform_purge_permission() {
  return array(
    'administer webform purges' => array(
      'title' => t('Administer webform purges'),
      'description' => t('Perform administrative tasks on webform purge functionality'),
    ),
  );
}

/**
 * Implements hook_menu().
 */
function webform_purge_menu() {
  $items = array();

  // Admin configuration group.
  $items['admin/config/webform_purge'] = array(
    'title' => 'Webform Purges',
    'description' => 'Administer Webform Purges',
    'access arguments' => array(
      'administer webform purges',
    ),
  );

  // Admin configuration - Settings.
  $items['admin/config/webform_purge/manage'] = array(
    'title' => 'Webform Purge settings',
    'description' => 'Manage webform purge settings and configurations',
    'access arguments' => array(
      'administer webform purges',
    ),
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'webform_purge_admin_settings_form',
    ),
  );
  return $items;
}

/**
 * Form callback for admin page.
 */
function webform_purge_admin_settings_form($form, &$form_state) {

  // Add css to form.
  $form['#attached']['css'] = array(
    drupal_get_path('module', 'webform_purge') . '/webform_purge.css',
  );

  // Admin configuration group.
  $form['overview'] = array(
    '#markup' => t('This interface allows administrators to manage the automated purging of webform submissions'),
    '#prefix' => '<p>',
    '#suffix' => '</p>',
  );
  $form['webform_purge_enabled'] = array(
    '#title' => t('Enable automated purging'),
    '#description' => t('When enabled, web form submissions will be purged after the specified number of days.'),
    '#type' => 'checkbox',
    '#default_value' => variable_get('webform_purge_enabled'),
  );
  $form['webform_purge_run_once'] = array(
    '#title' => t('Run only once per day'),
    '#description' => t('This will limit processing to the first cron run of each day to improve performance.'),
    '#type' => 'checkbox',
    '#default_value' => variable_get('webform_purge_run_once'),
  );
  $form['webform_purge_all_submissions'] = array(
    '#title' => t('Purge all submissions'),
    '#description' => t('When enabled, all web form submissions will be purged. When disabled, only selected forms below will be purged.'),
    '#type' => 'checkbox',
    '#default_value' => variable_get('webform_purge_all_submissions', FALSE),
  );
  $form['webform_purge_days_to_retain'] = array(
    '#title' => t('Days to retain'),
    '#description' => t('Number of days to retain form submission before deletion.'),
    '#type' => 'textfield',
    '#default_value' => variable_get('webform_purge_days_to_retain'),
    '#required' => TRUE,
    '#element_validate' => array(
      'element_validate_integer_positive',
    ),
  );
  $form['webform_purge_cron_limit'] = array(
    '#type' => 'select',
    '#title' => t('Maximum number of purged submissions'),
    '#default_value' => variable_get('webform_purge_cron_limit', 100000),
    '#options' => drupal_map_assoc(array(
      10,
      100,
      1000,
      10000,
      100000,
    )),
    '#description' => t('Maximum number of submissions to purge per cron run.'),
  );

  // Check if user has permission to view webforms results.
  if (user_access('access all webform results')) {

    // Get the checked checkboxes.
    $checkboxes = variable_get('webform_purge_checkbox_state');

    // Build the form and provide shortcuts to the Weform results pages.
    $header = array(
      t('Webform'),
      t('Status'),
      t('Submissions'),
      t('Oldest Date'),
    );
    $rows = array();

    // Get active webforms.
    $query = db_select('webform', 'w');
    $query
      ->join('node', 'n', 'w.nid = n.nid');
    $query
      ->fields('n', array(
      'nid',
      'title',
    ))
      ->fields('w', array(
      'status',
    ))
      ->orderBy('n.title', 'ASC')
      ->addTag('node_access');
    $webforms = $query
      ->execute();
    foreach ($webforms as $webform) {

      // Get the number of submissions for this webform.
      $query = db_query('SELECT nid FROM {webform_submissions} WHERE nid = :nid', array(
        ':nid' => $webform->nid,
      ));
      $rowcount = number_format($query
        ->rowCount());

      // Get the oldest date for this webform.
      $query = db_query('SELECT MIN(submitted) as oldest_date FROM {webform_submissions} WHERE nid = :nid', array(
        ':nid' => $webform->nid,
      ));
      $submissions = $query
        ->fetch();
      $oldest_date = $submissions->oldest_date == NULL ? "-" : date('Y-m-d', $submissions->oldest_date);

      // Construct the table row.
      $row = array();
      $row[] = array(
        'data' => l($webform->title, '/node/' . $webform->nid . '/webform-results', array(
          'attributes' => array(
            'title' => t('View webform submissions'),
          ),
        )),
      );
      $row[] = array(
        'data' => $webform->status ? t('Active') : t('Inactive'),
      );
      $row[] = array(
        'data' => $rowcount,
      );
      $row[] = array(
        'data' => $oldest_date,
      );
      $rows[$webform->nid] = $row;
    }
    $form['form_list'] = array(
      '#type' => 'tableselect',
      '#header' => $header,
      '#options' => $rows,
      '#default_value' => $checkboxes,
    );
  }
  else {

    // Inform user that detailed webform results are not available due to permissions.
    $form['permission_error'] = array(
      '#markup' => t('Webform results summary cannot be shown without "Access all webform results" permission.'),
      '#prefix' => '<p>',
      '#suffix' => '</p>',
    );
  }
  $form['actions']['#type'] = 'actions';
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
  return $form;
}

/**
 * Submits webform purge admin form settings
 */
function webform_purge_admin_settings_form_submit($form, &$form_state) {
  variable_set('webform_purge_enabled', $form_state['values']['webform_purge_enabled']);
  variable_set('webform_purge_run_once', $form_state['values']['webform_purge_run_once']);
  variable_set('webform_purge_days_to_retain', $form_state['values']['webform_purge_days_to_retain']);
  variable_set('webform_purge_all_submissions', $form_state['values']['webform_purge_all_submissions']);
  variable_set('webform_purge_cron_limit', $form_state['values']['webform_purge_cron_limit']);
  $webforms_to_be_purged = array_diff($form_state['values']['form_list'], [
    0,
  ]);
  variable_set('webform_purge_checkbox_state', $webforms_to_be_purged);
  drupal_set_message(t('The configuration options have been saved.'));
}

Functions

Namesort descending Description
webform_purge_admin_settings_form Form callback for admin page.
webform_purge_admin_settings_form_submit Submits webform purge admin form settings
webform_purge_cron Implements hook_cron().
webform_purge_help Implements hook_help().
webform_purge_menu Implements hook_menu().
webform_purge_permission Implements hook_permission().