Same name and namespace in other branches
  1. 4.7.x modules/node.module \node_admin_nodes()
  2. 5.x modules/node/node.module \node_admin_nodes()
  3. 6.x modules/node/node.admin.inc \node_admin_nodes()
  4. 7.x modules/node/node.admin.inc \node_admin_nodes()

Generate the content administration overview.

File

modules/node.module, line 739
The core that allows content to be submitted to the site.

Code

function node_admin_nodes() {

  /*
   ** Operations
   */
  $operations = array(
    'approve' => array(
      t('Approve the selected posts'),
      'UPDATE {node} SET status = 1, moderate = 0 WHERE nid = %d',
    ),
    'promote' => array(
      t('Promote the selected posts'),
      'UPDATE {node} SET status = 1, promote = 1 WHERE nid = %d',
    ),
    'sticky' => array(
      t('Make the selected posts sticky'),
      'UPDATE {node} SET status = 1, sticky = 1 WHERE nid = %d',
    ),
    'demote' => array(
      t('Demote the selected posts'),
      'UPDATE {node} SET promote = 0 WHERE nid = %d',
    ),
    'unpublish' => array(
      t('Unpublish the selected posts'),
      'UPDATE {node} SET status = 0 WHERE nid = %d',
    ),
    'delete' => array(
      t('Delete the selected posts'),
      '',
    ),
  );

  // Handle operations
  $op = $_POST['op'];
  $edit = $_POST['edit'];
  if (($op == t('Update') || $op == t('Delete all')) && isset($edit['operation']) && isset($edit['nodes'])) {
    $edit['nodes'] = array_diff($edit['nodes'], array(
      0,
    ));
    if (count($edit['nodes']) == 0) {
      form_set_error('', t('Please select some items to perform the update on.'));
    }
    else {
      if ($operations[$edit['operation']][1]) {

        // Flag changes
        $operation = $operations[$edit['operation']][1];
        foreach ($edit['nodes'] as $nid => $value) {
          if ($value) {
            db_query($operation, $nid);
          }
        }
        drupal_set_message(t('The update has been performed.'));
      }
      else {
        if ($edit['operation'] == 'delete') {

          // Mass delete
          if ($edit['confirm']) {
            foreach ($edit['nodes'] as $nid => $value) {
              node_delete(array(
                'nid' => $nid,
                'confirm' => 1,
              ));
            }
            drupal_set_message(t('The items have been deleted.'));
          }
          else {
            $extra = '<ul>';
            foreach ($edit['nodes'] as $nid => $value) {
              if ($value) {
                $title = db_result(db_query('SELECT title FROM {node} WHERE nid = %d', $nid));
                $extra .= '<li>' . form_hidden('nodes][' . $nid, 1) . check_plain($title) . '</li>';
              }
            }
            $extra .= '</ul>';
            $extra .= form_hidden('operation', 'delete');
            $output = theme('confirm', t('Are you sure you want to delete these items?'), 'admin/node', t('This action cannot be undone.'), t('Delete all'), t('Cancel'), $extra);
            return $output;
          }
        }
      }
    }
  }

  /*
   ** Filters
   */
  $node_types = drupal_map_assoc(node_list());
  foreach ($node_types as $k => $v) {
    $node_types[$k] = node_invoke($v, 'node_name');
  }

  // Regular filters
  $filters = array(
    'status' => array(
      'title' => t('status'),
      'options' => array(
        'status-1' => t('published'),
        'status-0' => t('not published'),
        'moderate-1' => t('in moderation'),
        'moderate-0' => t('not in moderation'),
        'promote-1' => t('promoted'),
        'promote-0' => t('not promoted'),
        'sticky-1' => t('sticky'),
        'sticky-0' => t('not sticky'),
      ),
    ),
    'type' => array(
      'title' => t('type'),
      'where' => "n.type = '%s'",
      'options' => $node_types,
    ),
  );

  // Merge all vocabularies into one for retrieving $value below
  if ($taxonomy = module_invoke('taxonomy', 'form_all')) {
    $terms = array();
    foreach ($taxonomy as $key => $value) {
      $terms = $terms + $value;
    }
    $filters['category'] = array(
      'title' => t('category'),
      'where' => 'tn.tid = %d',
      'options' => $terms,
      'join' => 'INNER JOIN {term_node} tn ON n.nid = tn.nid',
    );
  }

  // Initialize/reset filters
  if (!isset($_SESSION['node_overview_filter']) || !is_array($_SESSION['node_overview_filter']) || $op == t('Reset')) {
    $_SESSION['node_overview_filter'] = array();
  }
  $session =& $_SESSION['node_overview_filter'];
  $filter = $edit['filter'];
  if (($op == t('Filter') || $op == t('Refine')) && isset($filter)) {
    if (isset($filters[$filter]['options'][$edit[$filter]])) {
      $session[] = array(
        $filter,
        $edit[$filter],
      );
    }
  }
  if ($op == t('Undo')) {
    array_pop($session);
  }
  if ($op != '') {
    drupal_goto('admin/node');
  }

  /*
   ** Form
   */
  $output .= '<div id="node-admin-filter">';

  // Existing filters
  $form = '<ul>';
  $i = 0;
  foreach ($session as $filter) {
    list($type, $value) = $filter;
    $params = array(
      '%a' => '<strong>' . $filters[$type]['title'] . '</strong>',
      '%b' => '<strong>' . $filters[$type]['options'][$value] . '</strong>',
    );
    $form .= '<li>' . ($i++ ? t('<em>and</em> where <strong>%a</strong> is <strong>%b</strong>', $params) : t('<strong>%a</strong> is <strong>%b</strong>', $params)) . '</li>';
  }

  // New filter form
  if (isset($filters['category'])) {
    $filters['category']['options'] = $taxonomy;
  }
  $values = '';
  $options = array();
  foreach ($filters as $key => $value) {
    $options[$key] = $value['title'];
    $b .= form_select('', $key, 1, $filters[$key]['options']);
  }
  $buttons = '';
  if (count($options)) {
    $form .= '<li><dl class="multiselect">';
    $a = '';
    foreach ($options as $key => $value) {
      $a .= form_radio($value, 'filter', $key);
    }
    if (!$i) {
      $form .= t('<dd class="a">%a</dd> <dt>is</dt> <dd class="b">%b</dd>', array(
        '%a' => $a,
        '%b' => $b,
      ));
    }
    else {
      $form .= t('<dt><em>and</em> where</dt> <dd class="a">%a</dd> <dt>is</dt> <dd class="b">%b</dd>', array(
        '%a' => $a,
        '%b' => $b,
      ));
    }
    $form .= '</dl>';
    $buttons = form_submit(count($session) ? t('Refine') : t('Filter'));
  }
  if (count($session)) {
    $buttons .= form_submit(t('Undo')) . form_submit(t('Reset'));
  }
  $form .= '<div class="container-inline" id="node-admin-buttons">' . $buttons . '</div>';
  $form .= '</li></ul><br class="clear" />';
  $output .= form_group(t('Show only items where'), $form);

  // Build query
  $where = $args = array();
  $join = '';
  foreach ($session as $filter) {
    list($key, $value) = $filter;
    if ($key == 'status') {

      // Note: no exploit hole as $value has already been checked
      list($key, $value) = explode('-', $value, 2);
      $where[] = 'n.' . $key . ' = %d';
    }
    else {
      $where[] = $filters[$key]['where'];
    }
    $args[] = $value;
    $join .= $filters[$key]['join'];
  }
  $where = count($where) ? 'WHERE ' . implode(' AND ', $where) : '';
  $result = pager_query('SELECT n.*, u.name, u.uid FROM {node} n ' . $join . ' INNER JOIN {users} u ON n.uid = u.uid ' . $where . ' ORDER BY n.changed DESC', 50, 0, NULL, $args);

  // Make sure the update controls are disabled if we don't have any rows to select from.
  $disabled = !db_num_rows($result);
  $options = array();
  foreach ($operations as $key => $value) {
    $options[$key] = $value[0];
  }
  $form = form_select(NULL, 'operation', 'approve', $options, NULL, $disabled ? 'disabled="disabled"' : '');
  $form .= form_submit(t('Update'), 'op', $disabled ? array(
    'disabled' => 'disabled',
  ) : array());
  $output .= form_group(t('Update options'), "<div class=\"container-inline\">{$form}</div>");
  $output .= '</div>';

  // Overview table:
  $header = array(
    NULL,
    t('Title'),
    t('Type'),
    t('Author'),
    t('Status'),
    t('Operations'),
  );
  $destination = drupal_get_destination();
  while ($node = db_fetch_object($result)) {
    $rows[] = array(
      form_checkbox(NULL, 'nodes][' . $node->nid, 1, 0),
      l($node->title, 'node/' . $node->nid) . ' ' . theme('mark', node_mark($node->nid, $node->changed)),
      node_invoke($node, 'node_name'),
      format_name($node),
      $node->status ? t('published') : t('not published'),
      l(t('edit'), 'node/' . $node->nid . '/edit', array(), $destination),
    );
  }
  if ($pager = theme('pager', NULL, 50, 0)) {
    $rows[] = array(
      array(
        'data' => $pager,
        'colspan' => '7',
      ),
    );
  }
  if (!$rows) {
    $rows[] = array(
      array(
        'data' => t('No posts available.'),
        'colspan' => '6',
      ),
    );
  }
  $output .= theme('table', $header, $rows);
  return form($output, 'post', url('admin/node/action'));
}