aboutsummaryrefslogtreecommitdiff
path: root/node_truncate.module
blob: a6fc829baaee4929940cf81ccc86a39edf604577 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
// $Id$

/**
 * @file
 * Node Truncate module.
 *
 * Use this module to delete all posts from a given content type.
 */

/**
 * Implementation of hook_menu();
 */
function node_truncate_menu() {
  $items['admin/content/node_truncate'] = array(
    'title'            => 'Node Truncate',
    'description'      => 'Mass deletion page.',
    'page callback'    => 'node_truncate_page',
    'access arguments' => array('administer nodes'),
    'type'             => MENU_NORMAL_ITEM,
  );
  return $items;
}

/**
 * Menu callback.
 */
function node_truncate_page() {
  $output  = t('Choose a content type to truncate.');
  $output .= drupal_get_form('node_truncate_form');
  return $output;
}

/**
 * Mass deletion form.
 */
function node_truncate_form(&$form_state) {
  $node_types = node_get_types();
  $node_codes = array();

  foreach ($node_types as $item) {
    $node_codes[$item->type] = $item->name;
  }

  $form['node_types'] = array(
    '#type'          => 'checkboxes',
    '#title'         => t('Node types'),
    '#options'       => $node_codes,
    '#default_value' => variable_get('node_truncate_node_types', array()),
    '#description'   => t('Select nodetypes which should be truncated.'),
  );

  $form['submit'] = array(
    '#type'  => 'submit',
    '#value' => t('Submit'),
  );

  return $form;  
}

/**
 * Implementation of hook_validate();
 */
function node_truncate_form_validate($form, $form_state) {
  if (!isset($form_state['values']['node_types'])) {
    form_set_error('mass_delete', t('Please choose at least one node type.'));
  }
}

/**
 * Handle post-validation form-submission.
 */
function node_truncate_form_submit($form, &$form_state) {
  $operations = array();
  $types      = array_filter($form_state['values']['node_types']);
  variable_set('node_truncate_node_types', $types);

  foreach ($types as $type) {
    $operations[] = array('node_truncate', array($type));
  }

  $batch = array(
    'title'      => t('Deleting old data.'),
    'operations' => $operations,
    'finished'   => 'node_truncate_callback',
  );

  batch_set($batch);
  batch_process($redirect);
}

/**
 * Mass deletion of content.
 */
function node_truncate($type, &$context) {
  $type = 'WHERE type = "' . $type . '"';
  if (empty($context['sandbox'])) {
    $context['sandbox']['progress']     = 0;
    $context['sandbox']['current_node'] = 0;
    $context['sandbox']['max']          = db_result(db_query('SELECT COUNT(DISTINCT nid) FROM {node} ' . $type));
  }
  $limit = 5;
  $result = db_query_range('SELECT nid FROM {node} ' . $type, $context['sandbox']['current_node'], 0, $limit);
  while ($row = db_fetch_array($result)) {
    $node = node_delete($row['nid'], NULL, TRUE);
    $context['sandbox']['progress']++;
    $context['sandbox']['current_node'] = $node->nid;
    $context['results'][]               = $node->nid .' : '. check_plain($node->title);
    $context['message']                 = check_plain($node->title);
  }
  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
  }
}

/**
 * Callback for node_truncate();
 */
function node_truncate_callback($success, $results, $operations) {
  if ($success) {
    if ($results > 0) {
      $message = format_plural(count($results), t('One old post processed.'), t('@count old posts processed.'));
    }
  }
  else {
    $message = t('Finished with an error.');
  }
  drupal_set_message($message);
}