Skip to content
queue.module 9.6 KiB
Newer Older
Dries Buytaert's avatar
Dries Buytaert committed
<?php
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
/**
 * Implementation of hook_help().
 */
Dries Buytaert's avatar
 
Dries Buytaert committed
function queue_help($section) {
  switch ($section) {
Dries Buytaert's avatar
 
Dries Buytaert committed
    case 'admin/modules#description':
      return t("Enables content to be moderated by the community.");
    case 'admin/settings/queue':
      return t("The queue provides a way for your users to vote on submitted content. This is called <strong>moderation</strong>. Users can moderate a post up (give it a point), or down (subtract a point). The settings below give you control over how many points are required for the status of a post to be automatically changed. See individual items for details.");
Dries Buytaert's avatar
 
Dries Buytaert committed
  }
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  $post_and_expire = drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100));
  $dump = drupal_map_assoc(array(-1, -2, -3, -4, -5, -6, -7, -8, -8, -10, -11, -12, -13, -14, -15, -20, -25, -30));
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  $output .= form_select(t('Post threshold'), 'queue_threshold_post', variable_get('queue_threshold_post', 4), $post_and_expire, t('When a post gets this number of moderation points, it is <strong>promoted to the front page</strong> automatically.'));
  $output .= form_select(t('Dump threshold'), 'queue_threshold_dump', variable_get('queue_threshold_dump', -2), $dump, t('When a post drops below this number of points, its status is changed to <strong>unpublished</strong>.'));
  $output .= form_select(t('Expiration threshold'), 'queue_threshold_expire', variable_get('queue_threshold_expire', 8), $post_and_expire, t('When a post gets this number of points, its status is changed to <strong>unpublished</strong>.'));
  $output .= form_item(t('Show comments'), form_checkbox(t('Enabled'), 'queue_show_comments', 1, variable_get('queue_show_comments', 1)), t('Tick the box to show comments below the moderation form.'));
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  return $output;
Dries Buytaert's avatar
 
Dries Buytaert committed
}

Dries Buytaert's avatar
 
Dries Buytaert committed
/**
 * Implementation of hook_perm().
 */
Dries Buytaert's avatar
 
Dries Buytaert committed
function queue_perm() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  return array('access submission queue');
Dries Buytaert's avatar
 
Dries Buytaert committed
}

Dries Buytaert's avatar
 
Dries Buytaert committed
/**
Dries Buytaert's avatar
 
Dries Buytaert committed
 * Implementation of hook_menu().
Dries Buytaert's avatar
 
Dries Buytaert committed
 */
Dries Buytaert's avatar
 
Dries Buytaert committed
function queue_menu($type) {
  $items = array();
  $items[] = array('path' => 'queue', 'title' => t('submission queue'),
    'callback' => 'queue_page',
    'access' => user_access('access submission queue'),
    'weight' => 1);
  return $items;
Dries Buytaert's avatar
 
Dries Buytaert committed
}

Dries Buytaert's avatar
 
Dries Buytaert committed
function queue_count() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  $result = db_query('SELECT COUNT(nid) FROM {node} WHERE moderate = 1');
Dries Buytaert's avatar
Dries Buytaert committed
  return ($result) ? db_result($result, 0) : 0;
}

Dries Buytaert's avatar
 
Dries Buytaert committed
function queue_score($id) {
Dries Buytaert's avatar
 
Dries Buytaert committed
  $result = db_query('SELECT score FROM {node} WHERE nid = %d', $id);
Dries Buytaert's avatar
Dries Buytaert committed
  return ($result) ? db_result($result, 0) : 0;
}

Dries Buytaert's avatar
 
Dries Buytaert committed
function queue_vote($node, $vote) {
Dries Buytaert's avatar
 
Dries Buytaert committed
  global $user;
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  if (!field_get($node->users, $user->uid)) {
    // Update submission's score- and votes-field:
Dries Buytaert's avatar
 
Dries Buytaert committed
    db_query("UPDATE {node} SET score = score $vote, votes = votes + 1, users = '". field_set($node->users, $user->uid, $vote) ."' WHERE nid = %d", $node->nid);
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
    // Reload the updated node from the database:
Dries Buytaert's avatar
 
Dries Buytaert committed
    $node = node_load(array('nid' => $node->nid));
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
    $terms = module_invoke('taxonomy', 'node_get_terms', $node->nid, 'tid');
    foreach ($terms as $term) {
      $node->taxonomy[] = $term->tid;
    }

Dries Buytaert's avatar
 
Dries Buytaert committed
    if (variable_get('queue_threshold_post', 4) <= $node->score) {
      $node->moderate = 0;
      $node->promote = 1;
      node_save($node);
      watchdog('special', t('moderation: approved "%node-title"', array('%node-title' => $node->title)));
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
Dries Buytaert's avatar
 
Dries Buytaert committed
    else if (variable_get('queue_threshold_dump', -2) >= $node->score) {
Dries Buytaert's avatar
 
Dries Buytaert committed
      if ($node->revisions) {
        node_revision_rollback($node, end(node_revision_list($node)));
        watchdog('special', t('moderation: declined "%node-title" (rollback)', array('%node-title' => $node->title)));
Dries Buytaert's avatar
Dries Buytaert committed
      }
Dries Buytaert's avatar
 
Dries Buytaert committed
      else {
        $node->moderate = 0;
        $node->status = 0;
        node_save($node);
        watchdog('special', t('moderation: declined "%node-title"', array('%node-title' => $node->title)));
Dries Buytaert's avatar
 
Dries Buytaert committed
      }
    }
Dries Buytaert's avatar
 
Dries Buytaert committed
    else if (variable_get('queue_threshold_expire', 8) <= $node->votes) {
Dries Buytaert's avatar
 
Dries Buytaert committed
      if ($node->revisions) {
        node_revision_rollback($node, end(node_revision_list($node)));
        watchdog('special', t('moderation: expired "%node-title" (rollback)', array('%node-title' => $node->title)));
Dries Buytaert's avatar
Dries Buytaert committed
      }
Dries Buytaert's avatar
 
Dries Buytaert committed
      else {
        $node->moderate = 0;
        $node->status = 0;
        node_save($node);
        watchdog('special', t('moderation: expired "%node-title"', array('%node-title' => $node->title)));
Dries Buytaert's avatar
Dries Buytaert committed
      }
    }
  }
}

Dries Buytaert's avatar
 
Dries Buytaert committed
/**
 * Display a page listing the nodes in the submission queue.
 */
Dries Buytaert's avatar
 
Dries Buytaert committed
function queue_overview() {
Dries Buytaert's avatar
 
Dries Buytaert committed
  global $user;
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  $header = array(array('data' => t('subject')), array('data' => t('author')), array('data' => t('type')), array('data' => t('score')));
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  $sresult = pager_query('SELECT n.*, u.name, u.uid FROM {node} n INNER JOIN {users} u ON n.uid = u.uid WHERE n.moderate = 1', 10, 0);
Dries Buytaert's avatar
 
Dries Buytaert committed

  while ($node = db_fetch_object($sresult)) {
Dries Buytaert's avatar
 
Dries Buytaert committed
    if ($user->uid == $node->uid || field_get($node->users, $user->uid)) {
Dries Buytaert's avatar
 
Dries Buytaert committed
      $rows[] = array(array('data' => l($node->title, 'queue/'. $node->nid), 'class' => 'title'), array('data' => format_name($node), 'class' => 'name'), array('data' => module_invoke($node->type, 'node_name', $node), 'class' => 'type'), array('data' => queue_score($node->nid), 'class' => 'score'));
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
    else {
Dries Buytaert's avatar
 
Dries Buytaert committed
      $rows[] = array(array('data' => l($node->title, 'queue/'. $node->nid), 'class' => 'title'), array('data' => format_name($node), 'class' => 'name'), array('data' => module_invoke($node->type, 'node_name', $node), 'class' => 'type'), array('data' => l(t('vote'), 'queue/', $node->nid), 'class' => 'score'));
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
Dries Buytaert's avatar
 
Dries Buytaert committed
  }
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  if ($pager = theme('pager', NULL, 10, 0, tablesort_pager())) {
   $rows[] = array(array('data' => $pager, 'colspan' => 4));
Dries Buytaert's avatar
Dries Buytaert committed
  }
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  $output  = '<div id="queue">';
  $output .= theme('table', $header, $rows);
  $output .= '</div>';
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  drupal_set_title(t('Submission queue'));
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  print theme('page', $output);
Dries Buytaert's avatar
Dries Buytaert committed
}

Dries Buytaert's avatar
 
Dries Buytaert committed
/**
 * Display a queued node along with voting options for it.
 */
Dries Buytaert's avatar
 
Dries Buytaert committed
function queue_view($nid) {
Dries Buytaert's avatar
 
Dries Buytaert committed
  global $user;

Dries Buytaert's avatar
 
Dries Buytaert committed
  $op = $_POST['op'];
  $edit = $_POST['edit'];
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  // An associative array with the possible voting options.
  $votes = array('+ 0' => t('neutral (+0)'), '+ 1' => t('post it (+1)'), '- 1' => t('dump it (-1)'));
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  // Load the node from the database.
  $node = node_load(array('nid' => $nid, 'moderate' => 1));
Dries Buytaert's avatar
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
  if ($node) {
    if ($user->uid != $node->uid && !field_get($node->users, $user->uid)) {
Dries Buytaert's avatar
 
Dries Buytaert committed
      if ($op == t('Vote') && $votes[$edit['vote']]) {
        // If it is a valid vote, record it.
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
        queue_vote($node, $edit['vote']);
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
        $output = t('Your vote has been recorded.');
Dries Buytaert's avatar
 
Dries Buytaert committed
      }
      else {
Dries Buytaert's avatar
 
Dries Buytaert committed
        // Display some explanation or voting guidelines:
        $output .= '<p>'. t('When new content is submitted, it goes into the submission queue.  Registered users with the appropriate permission can access this queue and vote whether they think the content should be approved or not.  When enough people vote to approve the content, it is displayed on the front page.  On the other hand, if enough people vote to drop it, the content will disappear.') .'</p>';
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
        // Display a voting form:
        $output .= form_select(t('Your vote'), 'vote', '', $votes);
        $output .= form_hidden('id', $node->nid);
        $output .= form_submit(t('Vote'));
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
        $output = form($output);
      }
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
    $output .= node_view($node);
Dries Buytaert's avatar
 
Dries Buytaert committed
    $output = theme('box', t('Moderate'), $output);
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
    if ($node->comment && variable_get('queue_show_comments', 1)) {
      $output .= module_invoke('comment', 'render', $node);
Dries Buytaert's avatar
 
Dries Buytaert committed
    }
Dries Buytaert's avatar
 
Dries Buytaert committed
    print theme('page', $output);
Dries Buytaert's avatar
 
Dries Buytaert committed
  else {
    drupal_not_found();
Dries Buytaert's avatar
Dries Buytaert committed
}

Dries Buytaert's avatar
 
Dries Buytaert committed
/**
 * Menu callback; displays the queue management page.
 */
function queue_page($nid = 0) {
  if ($nid) {
    queue_view($nid);
Dries Buytaert's avatar
Dries Buytaert committed
  }
Dries Buytaert's avatar
 
Dries Buytaert committed
  else {
Dries Buytaert's avatar
 
Dries Buytaert committed
    queue_overview();
Dries Buytaert's avatar
 
Dries Buytaert committed
  }
Dries Buytaert's avatar
Dries Buytaert committed
}
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
/**
 * Implementation of hook_block().
 */
function queue_block($op = 'list', $delta = 0) {
Dries Buytaert's avatar
 
Dries Buytaert committed
  global $user;

Dries Buytaert's avatar
 
Dries Buytaert committed
  if ($op == 'list') {
    $blocks[0]['info'] = t('Moderation results');
Dries Buytaert's avatar
 
Dries Buytaert committed
    if (user_access('access submission queue') && (arg(0) == 'queue') || arg(0) == 'node') {
Dries Buytaert's avatar
 
Dries Buytaert committed
        if (arg(0) == 'queue') {
Dries Buytaert's avatar
 
Dries Buytaert committed
          $id = arg(1);
        }
        else {
          $id = arg(2);
        }
Dries Buytaert's avatar
 
Dries Buytaert committed
        $node = node_load(array('nid' => $id));
Dries Buytaert's avatar
 
Dries Buytaert committed
        if (($user->uid == $node->uid || field_get($node->users, $user->uid)) && $node->moderate == 1) {
Dries Buytaert's avatar
 
Dries Buytaert committed
          foreach (explode(',', $node->users) as $vote) {
Dries Buytaert's avatar
 
Dries Buytaert committed
            if ($vote) {
Dries Buytaert's avatar
 
Dries Buytaert committed
              $data = explode('=', $vote);
              $account = user_load(array('uid' => $data[0]));
              $output .= format_name($account) ." voted \"$data[1]\".<br />";
Dries Buytaert's avatar
 
Dries Buytaert committed
            }
Dries Buytaert's avatar
 
Dries Buytaert committed

Dries Buytaert's avatar
 
Dries Buytaert committed
          $block['subject'] = t('Moderation results');
          $block['content'] = $output ? $output : t('This node has not yet been moderated.');
Dries Buytaert's avatar
 
Dries Buytaert committed

        }
Dries Buytaert's avatar
 
Dries Buytaert committed
/**
 * Implementation of hook_nodeapi().
 */
function queue_nodeapi(&$node, $op) {
    case 'fields':
      return array('score', 'users', 'votes');
    case 'validate':
      if ($node->nid && $node->moderate) {
        // Reset votes when node is updated:
        $node->score = 0;
        $node->votes = 0;
Dries Buytaert's avatar
 
Dries Buytaert committed
      if ($node->moderate && user_access('access submission queue')) {
        drupal_set_message(t('the post is queued for approval. You can check the votes in the <a href="%queue">submission queue</a>.', array('%queue' => url('queue'))));
        drupal_set_message(t('the post is queued for approval. The editors will decide whether it should be published.'));
        drupal_set_message(t('the post is published.'));
Dries Buytaert's avatar
 
Dries Buytaert committed
?>