You are here

function term_permissions_form_alter in Taxonomy Term Permissions 7

Same name and namespace in other branches
  1. 6 term_permissions.module \term_permissions_form_alter()

Implements hook_form_alter().

Parameters

array $form: The form to alter.

array $form_state: The form state of the current form.

array $form_id: The form id of the current form.

File

./term_permissions.module, line 48
Allows access to terms in a vocabulary to be limited by user or role.

Code

function term_permissions_form_alter(&$form, $form_state, $form_id) {

  // This is the add / edit term form from the taxonomy page.
  if ($form_id == 'taxonomy_form_term') {

    // Normally the term is an array, but when deleting terms it becomes an
    // object. So, we cast it to an object so we can consistently reference it.
    $term = (object) $form['#term'];
    $form['access'] = array(
      '#type' => 'fieldset',
      '#title' => t('Permissions'),
      '#description' => t('To limit selection of this term by user or roles,
         add users or roles to the following lists. Leave empty to allow
         selection by all users.'),
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
      '#attributes' => array(
        'id' => 'fieldset_term_access',
      ),
      '#weight' => -5,
      '#tree' => TRUE,
    );

    // Pull in any stored users in the database.
    $allowed_users = array();
    if (!empty($form['tid']['#value'])) {
      $result = db_select('term_permissions_user')
        ->fields('term_permissions_user')
        ->condition('tid', $term->tid)
        ->execute();
      foreach ($result as $row) {
        $u = user_load($row->uid);
        $allowed_users[] = $u->name;
      }
    }
    $allowed_users = drupal_implode_tags($allowed_users);

    // Note that the autocomplete widget will only enable for users with the
    // 'access profiles' permission. Other users will have to specify the name
    // manually.
    $form['access']['user'] = array(
      '#type' => 'textfield',
      '#title' => t('Allowed users'),
      '#description' => t('Enter a comma-separated list of user names to give
        them permission to use this term.'),
      '#default_value' => $allowed_users,
      '#size' => 60,
      '#maxlength' => NULL,
      '#autocomplete_path' => 'term-permissions/autocomplete',
      '#weight' => -10,
    );
    $allowed_roles = array();
    if (!empty($form['tid']['#value'])) {
      $result = db_select('term_permissions_role')
        ->fields('term_permissions_role')
        ->condition('tid', $term->tid)
        ->execute();
      foreach ($result as $row) {
        $allowed_roles[] = $row->rid;
      }
    }

    // Now, lets do the Roles table.
    $form['access']['role'] = array(
      '#type' => 'checkboxes',
      '#title' => t('Allowed roles'),
      '#description' => t('Select a role to allow all members of that role access to this term.'),
      '#default_value' => $allowed_roles,
      '#options' => user_roles(),
      '#multiple' => FALSE,
      '#weight' => 5,
    );
    $form['#validate'][] = 'term_permissions_validate';
    $form['#submit'][] = 'term_permissions_submit';
  }

  // This is the node add / edit form. If a different selector is used from
  // another contributed module, we do nothing so as to not break the form.
  if (isset($form['type']) && isset($form['#node']) && !variable_get('taxonomy_override_selector', FALSE) && $form['type']['#value'] . '_node_form' == $form_id || isset($form['#entity_type']) && isset($form['#bundle'])) {
    $types = array(
      'taxonomy_term_reference',
    );

    // Field types we are looking for
    foreach (element_children($form) as $field_name) {
      if (!($field_info = field_info_field($field_name))) {
        continue;
      }
      if (!in_array('#language', $form[$field_name])) {
        continue;
      }
      if (!empty($form[$field_name]['#language']) && isset($form[$field_name][$form[$field_name]['#language']]['#options'])) {
        $options =& $form[$field_name][$form[$field_name]['#language']]['#options'];
      }
      if (!in_array($field_info['type'], $types) || !isset($options)) {
        continue;
      }
      foreach ($options as $tid => $name) {
        if ($tid == "_none") {
          continue;
        }

        // Now we have the term ID, check to see if the current user has
        // access to the term.
        global $user;
        if (!term_permissions_allowed($tid, $user)) {
          unset($options[$tid]);
        }

        // If the user doesn't have access to any of the terms in the
        // vocabulary, remove the form item entirely.
        if (count($options) < 1) {
          $vocabulary = $form[$field_name][$form[$field_name]['#language']];
          if ($vocabulary['#required']) {
            $vocabulary_name = $field_info['settings']['allowed_values'][0]['vocabulary'];
            drupal_set_message(t("Your account doesn't have permission to use\n                any of the terms in the %vocabulary vocabulary. Your account\n                must be given permission to use at least one term in the\n                %vocabulary vocabulary to be able to add or edit the\n                %content-type content type.", array(
              '%vocabulary' => $vocabulary['#title'],
              '%content-type' => node_type_get_name($form['#node']),
            )), 'warning');
            watchdog('term_permissions', '%user was blocked from accessing the
                %content-type form as they do not have permission to use any
                terms in the <a href="@vocabulary-url">%vocabulary</a>
                vocabulary.', array(
              '%user' => isset($user->name) ? $user->name : variable_get('anonymous', 'Anonymous'),
              '%content-type' => node_type_get_name($form['#node']),
              '@vocabulary-url' => url('admin/structure/taxonomy/' . $vocabulary_name),
              '%vocabulary' => $vocabulary['#title'],
            ), WATCHDOG_WARNING, l(t('edit vocabulary'), 'admin/structure/taxonomy/' . $vocabulary_name . '/edit'));
            drupal_access_denied();
            exit;
          }
          unset($form[$field_name]);
        }
      }
      if (isset($form[$field_name])) {
        $form[$field_name][$form[$field_name]['#language']]['#element_validate'][] = 'term_permissions_field_widget_validate';
      }
    }
  }
}