You are here

function _forum_access_form_submit in Forum Access 6

Same name and namespace in other branches
  1. 7 forum_access.admin.inc \_forum_access_form_submit()
1 string reference to '_forum_access_form_submit'
_forum_access_forum_form in ./forum_access.admin.inc
Rewrite the forum administration page with our new access rules.

File

./forum_access.admin.inc, line 527
forum_access.admin.inc

Code

function _forum_access_form_submit($form, &$form_state) {
  $access = $form_state['values']['forum_access'];

  // shortcut
  // Save template choice:
  $template_tid = reset($access['template']['taxonomy']);
  if ($access['template']['select_by_default']) {
    variable_set('forum_access_default_template_tid', $template_tid);
  }
  elseif (variable_get('forum_access_default_template_tid', 0) == $template_tid) {
    variable_del('forum_access_default_template_tid');
  }
  if ($access['template']['load_for_new']) {
    variable_set('forum_access_new_template_tid', $template_tid);
  }
  elseif (variable_get('forum_access_new_template_tid', 0) == $template_tid) {
    variable_del('forum_access_new_template_tid');
  }
  module_load_include('node.inc', 'forum_access');
  $moderator_rid = _forum_access_get_moderator_rid(TRUE);

  // create the moderators role if it doesn't exist
  // check for changes
  $is_changed = $is_new = strpos($_GET['q'], 'admin/content/forum/add/') === 0;
  $is_changed = $is_changed || !empty($access['force_update']);
  $form_initial_values = $form;

  // avoid Coder warning
  $form_initial_values = $form_initial_values['forum_access'];
  foreach (array(
    'view',
    'create',
    'update',
    'delete',
  ) as $grant_type) {
    if (isset($form_initial_values[$grant_type])) {
      $defaults = $form_initial_values[$grant_type]['#default_value'];
      $defaults = array_flip($defaults);
      foreach ($access[$grant_type] as $rid => $checked) {
        $is_changed = $is_changed || empty($form_initial_values[$grant_type][$rid]['#disabled']) && !empty($checked) != isset($defaults[$rid]);
      }
    }
  }
  if (!$is_changed && $access['acl']['user_list'] == $form_initial_values['acl']['user_list']['#default_value'] && (empty($fa_values['interference']) || $access['interference']['advanced']['priority'] == $form_initial_values['interference']['advanced']['priority']['#default_value'])) {
    drupal_set_message(t('The content access permissions are unchanged.'));
    return;
  }
  $tid = $form_state['values']['tid'];
  db_query("DELETE FROM {forum_access} WHERE tid = %d", $tid);
  $fa_priority = isset($access['interference']['advanced']['priority']) ? $access['interference']['advanced']['priority'] : 0;
  if (array_key_exists('acl', $access)) {
    $moderators = unserialize($access['acl']['user_list']);
    acl_save_form($access['acl'], $fa_priority);
  }
  $permissions = _forum_access_get_role_permissions();
  foreach ($access['view'] as $rid => $checked) {
    if ($rid == $moderator_rid) {
      continue;
    }
    if (isset($permissions[$rid]['administer nodes'])) {

      // We prefer not to save records for node administrators, because these have access anyway.
      if (isset($permissions[$rid]['administer forums']) && $access['view'][$rid]) {

        // For forum administrators, View needs to be saved, ...
      }
      else {

        // ... otherwise forget View.
        $access['view'][$rid] = FALSE;
      }
      if ($access['view'][$rid] || $access['create'][$rid]) {
        db_query("INSERT INTO {forum_access} (tid, rid, grant_view, grant_update, grant_delete, grant_create, priority) VALUES (%d, %d, %d, %d, %d, %d, %d)", $tid, $rid, !empty($access['view'][$rid]), 0, 0, !empty($access['create'][$rid]), $fa_priority);
      }
    }
    else {
      db_query("INSERT INTO {forum_access} (tid, rid, grant_view, grant_update, grant_delete, grant_create, priority) VALUES (%d, %d, %d, %d, %d, %d, %d)", $tid, $rid, (bool) $checked, !empty($access['update'][$rid]), !empty($access['delete'][$rid]), !empty($access['create'][$rid]), $fa_priority);
    }
  }
  $tr = 't';
  $link = l($tr('edit'), 'admin/content/forum/edit/forum/' . $tid);
  watchdog('access', 'Changed grants for %forum forum.', array(
    '%forum' => $form_state['values']['name'],
  ), WATCHDOG_NOTICE, $link);
  if (!$is_new && $form_state['values']['form_id'] != 'forum_form_container') {
    if (!isset($access['update_choice']) || $access['update_choice'] == 2) {
      node_access_needs_rebuild(TRUE);
    }
    elseif ($access['update_choice'] == 0) {

      // update immediately (but use the batch functions anyway
      $save_redirect = $form_state['redirect'];
      $form_state['redirect'] = $_GET['q'];
      $context = array();
      $pending_error_messages = drupal_get_messages('error', FALSE);
      $our_error_message_index = isset($pending_error_messages['error']) ? count($pending_error_messages['error']) : 0;
      _forum_access_update_batch_finished(FALSE, array(), array());

      // add our error message (in case we die underway)
      _forum_access_update_batch_operation($tid, 999999, 1, $context);
      $pending_error_messages = drupal_get_messages('error', TRUE);

      // still alive, get and clear all 'error' messages
      unset($pending_error_messages['error'][$our_error_message_index]);

      // remove our error message
      foreach ($pending_error_messages['error'] as $message) {

        // replay any others
        drupal_set_message($message, 'error');
      }
      _forum_access_update_batch_finished(TRUE, array(), array());
      $form_state['redirect'] = $save_redirect;
    }
    else {

      // mass update in batch mode, modeled after node.module
      $limit = $access['update_limit'];
      $count = db_result(db_query("SELECT COUNT(DISTINCT n.nid) FROM {node} n INNER JOIN {term_node} tn ON tn.vid = n.vid WHERE tn.tid = %d", $tid));
      $batch = array(
        'title' => t('Updating content access permissions'),
        'file' => drupal_get_path('module', 'forum_access') . '/forum_access.admin.inc',
        'operations' => array(
          array(
            '_forum_access_update_batch_operation',
            array(
              $tid,
              $limit,
              $count,
            ),
          ),
        ),
        'finished' => '_forum_access_update_batch_finished',
      );
      batch_set($batch);
    }
  }
  variable_del('forum_access_rids');

  // clear cache
}