Index: modules/profile.module =================================================================== RCS file: /cvs/drupal/drupal/modules/profile.module,v retrieving revision 1.132 diff -u -F^f -r1.132 profile.module --- modules/profile.module 30 Jan 2006 18:32:24 -0000 1.132 +++ modules/profile.module 13 Feb 2006 12:05:04 -0000 @@ -30,6 +30,7 @@ function profile_help($section) {
  • freeform list
  • URL
  • date
  • +
  • taxonomy
  • '); $output .= t('

    You can

    @@ -162,6 +163,7 @@ function profile_browse() { // Determine what query to use: $arguments = array($field->fid); + $table = '{profile_values}'; switch ($field->type) { case 'checkbox': $query = 'v.value = 1'; @@ -174,13 +176,19 @@ function profile_browse() { $query = "v.value LIKE '%%%s%%'"; $arguments[] = $value; break; + case 'taxonomy': + $table = '{profile_values_term}'; + $query = "v.tid = '%s'"; + $terms = taxonomy_get_term_by_name($value); + $arguments[] = $terms[0]->tid; + break; default: drupal_not_found(); return; } // Extract the affected users: - $result = pager_query("SELECT u.uid, u.access FROM {users} u INNER JOIN {profile_values} v ON u.uid = v.uid WHERE v.fid = %d AND $query ORDER BY u.access DESC", 20, 0, NULL, $arguments); + $result = pager_query("SELECT u.uid, u.access FROM {users} u INNER JOIN $table v ON u.uid = v.uid WHERE v.fid = %d AND $query ORDER BY u.access DESC", 20, 0, NULL, $arguments); $output = '
    '; while ($account = db_fetch_object($result)) { @@ -190,7 +198,7 @@ function profile_browse() { } $output .= theme('pager', NULL, 20); - if ($field->type == 'selection' || $field->type == 'list') { + if ($field->type == 'selection' || $field->type == 'list' || $field->type == 'taxonomy') { $title = strtr($field->page, array('%value' => theme('placeholder', $value))); } else { @@ -247,6 +255,21 @@ function profile_save_profile(&$edit, &$ // We use LOWER('%s') instead of PHP's strtolower() to avoid UTF-8 conversion issues. } while ($field = db_fetch_object($result)) { + if ($field->type == 'taxonomy') { + /* Do this before serialize. Also, remove the term "0" if exists + * (corresponds to ) */ + db_query("DELETE FROM {profile_values_term} WHERE fid = %d AND uid = %d", $field->fid, $user->uid); + + foreach ((array)$edit[$field->name] as $index => $term_id) { + if ($term_id) { + db_query("INSERT INTO {profile_values_term} (fid, uid, tid) VALUES (%d, %d, %d)", $field->fid, $user->uid, $term_id); + } + else { + unset($edit[$field->name][$index]); + } + } + } + if (_profile_field_serialize($field->type)) { $edit[$field->name] = serialize($edit[$field->name]); } @@ -295,6 +318,13 @@ function profile_view_field($user, $fiel } } return implode(', ', $fields); + case 'taxonomy': + $fields = array(); + foreach((array)$value as $tid) { + $term = taxonomy_get_term($tid); + $fields[] = $browse ? l($term->name, "profile/". drupal_urlencode($field->name) ."/". drupal_urlencode($term->name)) : check_plain($term->name); + } + return implode(', ', $fields); } } } @@ -381,6 +411,10 @@ function profile_form_profile($edit, $us case 'date': $fields[$category][$field->name] = array('#type' => 'date', '#title' => check_plain($field->title), '#default_value' => $edit[$field->name], '#description' => _profile_form_explanation($field), '#required' => $field->required); break; + case 'taxonomy': + $vid = $field->options; + $fields[$category][$field->name] = taxonomy_form($vid, $edit[$field->name], _profile_form_explanation($field)); + break; } } return $fields; @@ -552,6 +586,7 @@ function profile_admin_delete($fid) { if ($_POST['edit']['confirm']) { db_query('DELETE FROM {profile_fields} WHERE fid = %d', $fid); db_query('DELETE FROM {profile_values} WHERE fid = %d', $fid); + db_query('DELETE FROM {profile_values_term} WHERE fid = %d', $fid); cache_clear_all(); drupal_set_message(t('The field %field has been deleted.', array('%field' => theme('placeholder', $field->title)))); drupal_goto('admin/settings/profile'); @@ -602,6 +637,20 @@ function _profile_field_form($type, $edi '#description' => t('A list of all options. Put each option on a separate line. Example options are "red", "blue", "green", etc.'), ); } + if ($type == 'taxonomy') { + $tax_options = taxonomy_get_vocabularies(); + $taxopt = array(); + foreach ($tax_options as $key => $value) { + $taxopt[$key] = $value->name; + } + $form['fields']['options'] = array( + '#type' => 'select', + '#title' => t('Vocabulary'), + '#description' => t('Select the vocabulary you want to use'), + '#default_value' => $edit['options'], + '#options' => $taxopt + ); + } $form['fields']['weight'] = array('#type' => 'weight', '#title' => t('Weight'), '#default_value' => $edit['weight'], @@ -613,7 +662,7 @@ function _profile_field_form($type, $edi '#default_value' => isset($edit['visibility']) ? $edit['visibility'] : PROFILE_PUBLIC, '#options' => array(PROFILE_HIDDEN => t('Hidden profile field, only accessible by administrators, modules and themes.'), PROFILE_PRIVATE => t('Private field, content only available to privileged users.'), PROFILE_PUBLIC => t('Public field, content shown on profile page but not used on member list pages.'), PROFILE_PUBLIC_LISTINGS => t('Public field, content shown on profile page and on member list pages.')), ); - if ($type == 'selection' || $type == 'list') { + if ($type == 'selection' || $type == 'list' || $type == 'taxonomy') { $form['fields']['page'] = array('#type' => 'textfield', '#title' => t('Page title'), '#default_value' => $edit['page'], @@ -706,10 +755,12 @@ function _profile_field_types($type = NU 'selection' => t('list selection'), 'list' => t('freeform list'), 'url' => t('URL'), - 'date' => t('date')); + 'date' => t('date'), + 'taxonomy' => t('taxonomy'), + ); return isset($type) ? $types[$type] : $types; } function _profile_field_serialize($type = NULL) { - return $type == 'date'; + return $type == 'date' || $type == 'taxonomy'; }