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);
}
|