diff --git a/term_permissions.info b/term_permissions.info index 7f8ca95..88edcd1 100644 --- a/term_permissions.info +++ b/term_permissions.info @@ -1,4 +1,4 @@ name = Taxonomy Term Permissions description = Allows limiting the selection of specific taxonomy terms by user or role. -core=6.x +core = 7.x dependencies[] = taxonomy diff --git a/term_permissions.install b/term_permissions.install index 1e1b991..dc63804 100644 --- a/term_permissions.install +++ b/term_permissions.install @@ -1,12 +1,19 @@ array( - 'tid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE), - 'uid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE), + 'tid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + ), + 'uid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + ), ), 'primary key' => array( 'tid', @@ -37,8 +52,16 @@ function term_permissions_schema() { $schema['term_permissions_role'] = array( 'fields' => array( - 'tid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE), - 'rid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE), + 'tid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + ), + 'rid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + ), ), 'primary key' => array( 'tid', @@ -50,8 +73,9 @@ function term_permissions_schema() { } /** - * Implementation of hook_uninstall(). + * Implements hook_uninstall(). */ function term_permissions_uninstall() { - drupal_uninstall_schema('term_permissions'); + // TODO The drupal_(un)install_schema functions are called automatically in D7. + // drupal_uninstall_schema('term_permissions') } diff --git a/term_permissions.module b/term_permissions.module index e6550b6..d481a21 100644 --- a/term_permissions.module +++ b/term_permissions.module @@ -1,12 +1,11 @@ fields('term_permissions_user') + ->condition('tid', $form['#term']['tid']) + ->execute(); + + foreach ($result as $row) { + $u = user_load($row->uid); $allowed_users[] = $u->name; } } @@ -82,14 +85,20 @@ function term_permissions_form_alter(&$form, $form_state, $form_id) { '#weight' => -10, ); - $allowed_roles = array(); + + $allowed_roles = array(); if (!empty($form['tid']['#value'])) { - $result = db_query("SELECT rid FROM {term_permissions_role} WHERE tid = %d", array($form['tid']['#value'])); - while($rid = db_result($result)) { - $allowed_roles[] = $rid; + $result = db_select('term_permissions_role') + ->fields('term_permissions_role') + ->condition('tid', $form['#term']['tid']) + ->execute(); + + foreach ($result as $row) { + $allowed_roles[] = $row->rid; } } + // Now, lets do the Roles table. $form['access']['role'] = array( '#type' => 'checkboxes', @@ -107,35 +116,38 @@ function term_permissions_form_alter(&$form, $form_state, $form_id) { // 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']) && isset($form['taxonomy']) && (!variable_get('taxonomy_override_selector', FALSE)) && $form['type']['#value'] .'_node_form' == $form_id) { - foreach($form['taxonomy'] as $vid => $vocabulary) { - if (!is_array($vocabulary) || !isset($vocabulary['#options'])) { + if (isset($form['type']) && isset($form['#node']) && (!variable_get('taxonomy_override_selector', FALSE)) && $form['type']['#value'] .'_node_form' == $form_id) { + $types = array('taxonomy_term_reference'); // Field types we are looking for + + foreach($form as $field_name => $field) { + if(!$field_info = field_info_field($field_name)) // Should be handled by the field API + continue; + + $options = &$form[$field_name][$form[$field_name]['#language']]['#options']; + if (!in_array($field_info['type'], $types) || !isset($options)) { continue; } - $total_terms = count($vocabulary['#options']); - foreach($vocabulary['#options'] as $terms) { - if (!isset($terms->option)) { + + 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]); } - foreach($terms->option as $tid => $term) { - // 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)) { - $total_terms--; - unset($terms->option[$tid]); - } - // If the user doesn't have access to any of the terms in the - // vocabulary, remove the form item entirely. - if ($total_terms <= 0) { - if ($vocabulary['#required']) { - drupal_set_message(t("Your account doesn't have permission to use any of the terms in the %vocabulary vocabulary. Your account must be given permission to use at least one term in the %vocabulary vocabulary to be able to add or edit the %content-type content type.", array('%vocabulary' => $vocabulary['#title'], '%content-type' => node_get_types('name', $form['type']['#value']))), '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 %vocabulary vocabulary.', array('%user' => isset($user->name) ? $user->name : variable_get('anonymous', 'Anonymous'), '%content-type' => node_get_types('name', $form['type']['#value']), '@vocabulary-url' => url('admin/content/taxonomy/' . $vid), '%vocabulary' => $vocabulary['#title']), WATCHDOG_WARNING, l(t('edit vocabulary'), 'admin/content/taxonomy/' . $vid)); - drupal_access_denied(); - exit(); - } - unset($form['taxonomy'][$vid]); + // If the user doesn't have access to any of the terms in the + // vocabulary, remove the form item entirely. + if (count($options) <= 1) { + if ($vocabulary['#required']) { + drupal_set_message(t("Your account doesn't have permission to use any of the terms in the %vocabulary vocabulary. Your account must be given permission to use at least one term in the %vocabulary vocabulary to be able to add or edit the %content-type content type.", array('%vocabulary' => $vocabulary['#title'], '%content-type' => node_get_types('name', $form['type']['#value']))), '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 %vocabulary vocabulary.', array('%user' => isset($user->name) ? $user->name : variable_get('anonymous', 'Anonymous'), '%content-type' => node_get_types('name', $form['type']['#value']), '@vocabulary-url' => url('admin/content/taxonomy/' . $vid), '%vocabulary' => $vocabulary['#title']), WATCHDOG_WARNING, l(t('edit vocabulary'), 'admin/content/taxonomy/' . $vid)); + drupal_access_denied(); + exit(); } + unset($form[$field_name]); } } } @@ -154,7 +166,7 @@ function term_permissions_validate($form, &$form_state) { if (!empty($form_state['values']['access']['user'])) { $allowed_users = drupal_explode_tags($form_state['values']['access']['user']); foreach ($allowed_users as $name) { - if (!(user_load(array('name' => $name)))) { + if (!(array_shift(user_load_multiple(array(), array('name' => $name))))) { form_set_error('search_user', t('The user %name does not exist.', array('%user' => $name))); } } @@ -172,20 +184,42 @@ function term_permissions_validate($form, &$form_state) { */ function term_permissions_submit($form, &$form_state) { // For each user, save the term ID and the user ID. - db_query("DELETE FROM {term_permissions_user} WHERE tid = %d", $form_state['values']['tid']); + // TODO Please review the conversion of this statement to the D7 database API syntax. + /* db_query("DELETE FROM {term_permissions_user} WHERE tid = %d", $form_state['values']['tid']) */ + db_delete('term_permissions_user') + ->condition('tid', $form_state['values']['tid']) + ->execute(); if (!empty($form_state['values']['access']['user'])) { $allowed_users = drupal_explode_tags($form_state['values']['access']['user']); - foreach($allowed_users as $name) { - $u = user_load(array('name' => $name)); - db_query("INSERT INTO {term_permissions_user} (tid, uid) VALUES (%d, %d)", $form_state['values']['tid'], $u->uid); + foreach ($allowed_users as $name) { + $u = array_shift(user_load_multiple(array(), array('name' => $name))); + // TODO Please review the conversion of this statement to the D7 database API syntax. + /* db_query("INSERT INTO {term_permissions_user} (tid, uid) VALUES (%d, %d)", $form_state['values']['tid'], $u->uid) */ + $id = db_insert('term_permissions_user') + ->fields(array( + 'tid' => $form_state['values']['tid'], + 'uid' => $u->uid, + )) + ->execute(); } } // For each role, save the term ID and the role ID. - db_query("DELETE FROM {term_permissions_role} WHERE tid = %d", $form_state['values']['tid']); + // TODO Please review the conversion of this statement to the D7 database API syntax. + /* db_query("DELETE FROM {term_permissions_role} WHERE tid = %d", $form_state['values']['tid']) */ + db_delete('term_permissions_role') + ->condition('tid', $form_state['values']['tid']) + ->execute(); if (!empty($form_state['values']['access']['role'])) { - foreach(array_keys(array_filter($form_state['values']['access']['role'])) as $rid) { - db_query("INSERT INTO {term_permissions_role} (tid, rid) VALUES (%d, %d)", $form_state['values']['tid'], $rid); + foreach (array_keys(array_filter($form_state['values']['access']['role'])) as $rid) { + // TODO Please review the conversion of this statement to the D7 database API syntax. + /* db_query("INSERT INTO {term_permissions_role} (tid, rid) VALUES (%d, %d)", $form_state['values']['tid'], $rid) */ + $id = db_insert('term_permissions_role') + ->fields(array( + 'tid' => $form_state['values']['tid'], + 'rid' => $rid, + )) + ->execute(); } } } @@ -207,38 +241,37 @@ function term_permissions_allowed($tid, $user) { return TRUE; } // Are permissions enabled on this term? - if (!(db_result(db_query("SELECT COUNT(1) FROM {term_permissions_user} WHERE tid = %d", $tid)) || db_result(db_query("SELECT COUNT(1) FROM {term_permissions_role} WHERE tid = %d", $tid)))) { + if (!(db_query("SELECT COUNT(1) FROM {term_permissions_user} WHERE tid = :tid", array(':tid' => $tid))->fetchField() || db_query("SELECT COUNT(1) FROM {term_permissions_role} WHERE tid = :tid", array(':tid' => $tid))->fetchField())) { return TRUE; } // Permissions are enabled, check to see if this user or one of their roles // is allowed. - if (db_result(db_query("SELECT uid FROM {term_permissions_user} WHERE tid = %d AND uid = %d", $tid, $user->uid)) || db_result(db_query("SELECT rid FROM {term_permissions_role} WHERE tid = %d AND rid IN (" . implode(', ', array_keys($user->roles)) . ")", $tid))) { + // TODO Please convert this statement to the D7 database API syntax. + if (db_query("SELECT uid FROM {term_permissions_user} WHERE tid = :tid AND uid = :uid", array(':tid' => $tid, ':uid' => $user->uid))->fetchField() || db_query("SELECT rid FROM {term_permissions_role} WHERE tid = %d AND rid IN (" . implode(', ', array_keys($user->roles)) . ")", $tid)->fetchField()) { return TRUE; } return FALSE; } /** - * Returns JS array for Taxonomy Term Permissions autocomplete fields. Supports + * Returns Json array for Taxonomy Term Permissions autocomplete fields. Supports * multiple entries separated by a comma. */ function term_permissions_autocomplete_multiple($string) { - // The user enters a comma-separated list of users. We only autocomplete the last user. + // The user enters a comma-separated list of users. + // We only autocomplete the last user. $array = drupal_explode_tags($string); - // Fetch last tag + // Fetch last user. $last_string = trim(array_pop($array)); $matches = array(); - $result = db_query_range("SELECT u.name FROM {users} u WHERE LOWER(u.name) LIKE LOWER('%s%%')", $last_string, 0, 10); + $result = db_select('users')->fields('users', array('name'))->condition('name', db_like($last_string) . '%', 'LIKE')->range(0, 10)->execute(); - $prefix = count($array) ? implode(', ', $array) .', ' : ''; + $prefix = count($array) ? implode(', ', $array) . ', ' : ''; - while ($user = db_fetch_object($result)) { + foreach ($result as $user) { $matches[$prefix . $user->name] = check_plain($user->name); } - if (module_exists('devel')) { - $GLOBALS['devel_shutdown'] = FALSE; - } - exit(drupal_json($matches)); + exit(drupal_json_output($matches)); }