diff --git a/nodeaccess.admin.inc b/nodeaccess.admin.inc index d4fb284..7a15f55 100644 --- a/nodeaccess.admin.inc +++ b/nodeaccess.admin.inc @@ -309,13 +309,15 @@ function nodeaccess_admin_form_submit($form, $form_state) { if (module_exists('user_reference') && isset($form_values[$type]['user_reference'])) { $user_reference_grants = array(); foreach ($form_values[$type]['user_reference'] as $user_reference_field => $val) { - $user_reference_grants[$user_reference_field] = array( - 'gid' => 'nodeaccess_uid', - 'enabled' => $val['enabled'], - 'grant_view' => $val['grant_view'], - 'grant_update' => $val['grant_update'], - 'grant_delete' => $val['grant_delete'], - ); + if (!empty($val['enabled'])) { + $user_reference_grants[$user_reference_field] = array( + 'gid' => 'nodeaccess_uid', + 'enabled' => $val['enabled'], + 'grant_view' => $val['grant_view'], + 'grant_update' => $val['grant_update'], + 'grant_delete' => $val['grant_delete'], + ); + } } variable_set('nodeaccess_' . $type . '_user_reference', $user_reference_grants); } @@ -426,7 +428,7 @@ function theme_nodeaccess_admin_form_types($variables) { $row[] = drupal_render($form['user_reference'][$user_reference_field]['enabled']); $row[] = drupal_render($form['user_reference'][$user_reference_field]['grant_view']); $row[] = drupal_render($form['user_reference'][$user_reference_field]['grant_update']); - $row[] = drupal_render_children($form['user_reference'][$user_reference_field]['grant_delete']); + $row[] = drupal_render($form['user_reference'][$user_reference_field]['grant_delete']); $rows[] = $row; } $output .= theme('table', array( diff --git a/nodeaccess.module b/nodeaccess.module index 1108d2e..ee660d5 100644 --- a/nodeaccess.module +++ b/nodeaccess.module @@ -441,6 +441,22 @@ function nodeaccess_grants_form_validate($form, &$form_state) { foreach ($form_values['uid'] as $uid => $row) { if (!$row['keep']) { unset($form_values['uid'][$uid]); + } else { + if (module_exists('user_reference')) { + $nid = $form_values['nid']; + $node = node_load($nid); + $fields = variable_get('nodeaccess_' . $node->type . '_user_reference', array()); + foreach ($fields as $field_name => $field) { + if (isset($field["enabled"]) && !empty($node->$field_name) && is_array($node->$field_name)) { + $user_uids = array_map('_nodeaccess_user_reference_get_id', field_get_items('node', $node, $field_name)); + if (is_array($user_uids) && in_array($uid, $user_uids)) { + // We unset uid from user reference if enabled to avoid duplicates + unset($form_values['uid'][$uid]); + break; + } + } + } + } } } } @@ -636,29 +652,6 @@ function nodeaccess_node_grants($account, $op) { ); } -/** - * Implements hook_node_update(). - * - * @param Object $node - */ -function nodeaccess_node_update($node) { - if (module_exists('user_reference')) { - $fields = variable_get('nodeaccess_' . $node->type . '_user_reference', array()); - foreach (array_keys($fields) as $field_name) { - if (isset($node->$field_name)) { - $old_node = node_load($node->nid); - // Delete the old user as it's changed. - if ($node->$field_name != $old_node->$field_name) { - nodeaccess_delete_user_reference($old_node); - nodeaccess_insert_user_reference($node); - } - break; - } - } - } - // Done, author permissions are not written into nodeaccess. -} - /** * Implements hook_node_delete(). * @@ -720,6 +713,33 @@ function nodeaccess_node_access_records($node) { // needed to overwrite an older value. $grants[] = $grant; + // Apply User references grants if module exists + if (module_exists('user_reference')) { + $fields = variable_get('nodeaccess_' . $node->type . '_user_reference', array()); + $users_done = array(); + foreach ($fields as $field_name => $field) { + if (isset($field["enabled"]) && !empty($node->$field_name) && is_array($node->$field_name)) { + $user_uids = array_map('_nodeaccess_user_reference_get_id', field_get_items('node', $node, $field_name)); + $user_references = user_load_multiple($user_uids); + // Add each of the referenced users a form value. + foreach ($user_references as $user) { + // To avoid duplicate entries + if (!in_array($user->uid, $users_done)) { + $users_done[] = $user->uid; + $grant = array( + 'gid' => $user->uid, + 'realm' => 'nodeaccess_uid', + 'grant_view' => $field['grant_view'], + 'grant_update' => $field['grant_update'], + 'grant_delete' => $field['grant_delete'], + ); + $grants[] = $grant; + } + } + } + } + } + foreach ($grants as $id => $grant) { // Merge missing default grant keys. $grants[$id] = $grants[$id] + $grant_defaults; @@ -875,58 +895,14 @@ function nodeaccess_save_role_aliases($edit) { } /** - * Insert userreference grants from a node. + * array_map() callback for getting the user ID from a user reference field. * - * @param Object $node - */ -function nodeaccess_insert_user_reference($node) { - $form_values = nodeaccess_get_grants($node); - // Now, append or overwrite the uid with what was specified in the user - // reference field. - $fields = variable_get('nodeaccess_' . $node->type . '_user_reference', array()); - foreach ($fields as $field_name => $field) { - $user_uids = field_get_items('node', $node, $field_name); - $user_references = user_load_multiple($user_uids); - // Add each of the referenced users a form value. - foreach ($user_references as $user) { - $form_values['uid'][$user->uid] = array( - 'name' => $user->name, - 'keep' => 1, - 'grant_view' => $field['grant_view'], - 'grant_update' => $field['grant_update'], - 'grant_delete' => $field['grant_delete'], - ); - } - } - // Only do the changes if there are users to save. - if (count($form_values['uid']) > 0) { - $form_values['nid'] = $node->nid; - $form_state = array('values' => $form_values); - _nodeaccess_grants_form_submit(NULL, $form_state); - } -} - -/** - * Delete all userreference user grants from a node. + * @param $item * - * @param Object $node + * @return mixed */ -function nodeaccess_delete_user_reference($node) { - $form_values = nodeaccess_get_grants($node); - // Now, append or overwrite the uid with what was specified in the user - // reference field. - $fields = variable_get('nodeaccess_' . $node->type . '_user_reference', array()); - foreach ($fields as $field_name => $field) { - $user_uids = field_get_items('node', $node, $field_name); - $user_references = user_load_multiple($user_uids); - foreach ($user_references as $user) { - unset($form_values['uid'][$user->uid]); - } - } - $form_values['nid'] = $node->nid; - $form_state = array('values' => $form_values); - - _nodeaccess_grants_form_submit(NULL, $form_state); +function _nodeaccess_user_reference_get_id($item) { + return $item['uid']; } /**