aboutsummaryrefslogtreecommitdiff
path: root/node_truncate.module
diff options
context:
space:
mode:
Diffstat (limited to 'node_truncate.module')
-rw-r--r--node_truncate.module127
1 files changed, 127 insertions, 0 deletions
diff --git a/node_truncate.module b/node_truncate.module
new file mode 100644
index 0000000..b5fe7e4
--- /dev/null
+++ b/node_truncate.module
@@ -0,0 +1,127 @@
+<?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_nodetypes', 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();
+
+ foreach(array_filter($form_state['values']['node_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 .' : '. $node->title;
+ $context['message'] = $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);
+}