You are here

nodeaccess_userreference.module in Node access user reference 5

File

nodeaccess_userreference.module
View source
<?php

/**
 * Implementation of hook_perm().
 */
function nodeaccess_userreference_perm() {
  return array(
    'administer node access user reference',
  );
}

/**
 * Implementation of hook_menu().
 */
function hook_menu($may_cache) {
  $items = array();
  if ($may_cache) {
    $items[] = array(
      'path' => 'admin/settings/nodeaccess_userreference',
      'title' => t('Node access user reference settings'),
      'access' => user_access('administer site configuration'),
      'description' => t('Configure Node Access User Reference.'),
      'type' => MENU_NORMAL_ITEM,
      'callback' => 'drupal_get_form',
      'callback arguments' => array(
        'nodeaccess_userreference_admin_settings',
      ),
    );
  }
  return $items;
}

/**
 * System settings form for nodeaccess_userreference.
 */
function nodeaccess_userreference_admin_settings() {
  $form['nodeaccess_userreference_priority'] = array(
    '#type' => 'weight',
    '#title' => t('Set node grants priority for Node Access User Reference'),
    '#default_value' => variable_get('nodeaccess_userreference_priority', 0),
    '#description' => t('If you are only using this access control module, you can safely ignore this. If you are using multiple access control modules you can adjust the priority of this module.'),
  );

  // Add additional submit processing
  $form['#submit'][] = 'nodeaccess_userreference_admin_settings_submit';
  return system_settings_form($form);
}

/**
 * Additional submit callback for nodeaccess_userreference_admin_settings()
 */
function nodeaccess_userreference_admin_settings_submit($form, &$form_state) {

  // If priority has changed, prompt user to rebuild node access permissions
  $old_priority = $form['nodeaccess_userreference_priority']['#default_value'];
  $new_priority = $form['nodeaccess_userreference_priority']['#post']['nodeaccess_userreference_priority'];
  if ($old_priority != $new_priority) {
    node_access_needs_rebuild(TRUE);
  }
}

/**
 * Implementation of hook_node_grants().
 */
function nodeaccess_userreference_node_grants($account, $op) {
  $grants = array();
  $grants['nodeaccess_userreference'][] = $account->uid;
  if (!empty($grants)) {
    return $grants;
  }
  return null;
}

/**
 * Implementation of hook_form_alter().
 */
function nodeaccess_userreference_form_alter($form_id, &$form) {
  if ($form_id == '_content_admin_field' && $form['field_type']['#value'] == "userreference") {
    $variable = 'nodeaccess_userreference_' . $form['field_name']['#value'] . '_' . $form['type_name']['#value'];
    $data = variable_get($variable, array(
      'view' => 0,
      'update' => 0,
      'delete' => 0,
    ));
    $form['widget']['nodeaccess_userreference_view'] = array(
      '#type' => 'checkbox',
      '#title' => t('Grant "view" node access to user'),
      '#default_value' => $data['view'],
      '#description' => t('Give the referenced user access to view the node, if they cannot already do so.'),
      '#weight' => 42,
    );
    $form['widget']['nodeaccess_userreference_update'] = array(
      '#type' => 'checkbox',
      '#title' => t('Grant "edit" node access to user'),
      '#default_value' => $data['update'],
      '#description' => t('Give the referenced user access to edit the node, if they cannot already do so.'),
      '#weight' => 43,
    );
    $form['widget']['nodeaccess_userreference_delete'] = array(
      '#type' => 'checkbox',
      '#title' => t('Grant "delete" node access to user'),
      '#default_value' => $data['delete'],
      '#description' => t('Give the referenced user access to delete the node, if they cannot already do so.'),
      '#weight' => 44,
    );
    $form['#submit']['nodeaccess_userreference_content_field_edit_form_submit'] = array();
  }
}

/**
 * Extra submit function for User Reference field config.
 */
function nodeaccess_userreference_content_field_edit_form_submit($form_id, $form_values) {
  $variable = 'nodeaccess_userreference_' . $form_values['field_name'] . '_' . $form_values['type_name'];
  $data = array(
    'view' => $form_values['nodeaccess_userreference_view'],
    'update' => $form_values['nodeaccess_userreference_update'],
    'delete' => $form_values['nodeaccess_userreference_delete'],
  );
  variable_set($variable, $data);
}

/**
 * Implementation of hook_node_access_records().
 */
function nodeaccess_userreference_node_access_records($node) {
  if (nodeaccess_userreference_disabling()) {
    return;
  }
  $grants = array();
  $info = content_fields(NULL, $node->type);
  $priority = variable_get('nodeaccess_userreference_priority', 0);
  if (is_array($info)) {
    foreach ($info as $field) {
      if ($field['type'] == 'userreference') {
        $variable = 'nodeaccess_userreference_' . $field['field_name'] . '_' . $field['type_name'];
        $data = variable_get($variable, array(
          'view' => 0,
          'update' => 0,
          'delete' => 0,
        ));
        if (($data['view'] || $data['update'] || $data['delete']) && is_array($node->{$field}['field_name'])) {
          foreach ($node->{$field}['field_name'] as $userreference) {
            $uid =& $userreference['uid'];
            $grants[$uid] = array(
              'realm' => 'nodeaccess_userreference',
              'gid' => $uid,
              'priority' => $priority,
            );
            if ($data['view']) {
              $grants[$uid]['grant_view'] = 1;
            }
            if ($data['update']) {
              $grants[$uid]['grant_update'] = 1;
            }
            if ($data['delete']) {
              $grants[$uid]['grant_delete'] = 1;
            }
          }
        }
      }
    }
  }
  if (!empty($grants)) {
    return $grants;
  }
  return null;
}

/**
 * Implementation of hook_enable().
 */
function nodeaccess_userreference_enable() {
  node_access_rebuild();
}

/**
 * Implementation of hook_disable().
 */
function nodeaccess_userreference_disable() {
  nodeaccess_userreference_disabling(TRUE);
  node_access_rebuild();
}
function nodeaccess_userreference_disabling($set = NULL) {
  static $disabling = FALSE;
  if ($set !== NULL) {
    $disabling = $set;
  }
  return $disabling;
}