Index: profile.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/profile.module,v
retrieving revision 1.132
diff -u -F^function -r1.132 profile.module
--- profile.module	30 Jan 2006 18:32:24 -0000	1.132
+++ profile.module	6 Feb 2006 16:42:53 -0000
@@ -230,20 +230,30 @@ function profile_browse() {
 }
 
 function profile_load_profile(&$user) {
-  $result = db_query('SELECT f.name, f.type, v.value FROM {profile_fields} f INNER JOIN {profile_values} v ON f.fid = v.fid WHERE uid = %d', $user->uid);
+  $result = db_query('SELECT f.name, f.type, f.multiple, v.value FROM {profile_fields} f INNER JOIN {profile_values} v ON f.fid = v.fid WHERE uid = %d', $user->uid);
   while ($field = db_fetch_object($result)) {
-    if (empty($user->{$field->name})) {
+    if ($field->multiple) {
+      $multiple_values[$field->name][] = $field->value;
+    }
+    elseif (empty($user->{$field->name})) {
       $user->{$field->name} = _profile_field_serialize($field->type) ? unserialize($field->value) : $field->value;
     }
   }
+
+  // Add fields with multiple values.
+  foreach ($multiple_values as $name => $values) {
+    if (empty($user->{$name})) {
+      $user->{$name} = $values;
+    }
+  }
 }
 
 function profile_save_profile(&$edit, &$user, $category) {
   if ($_GET['q'] == 'user/register' || $_GET['q'] == 'admin/user/create') {
-    $result = db_query('SELECT fid, name, type FROM {profile_fields} WHERE register = 1 AND visibility != %d ORDER BY category, weight', PROFILE_HIDDEN);
+    $result = db_query('SELECT fid, name, type, multiple FROM {profile_fields} WHERE register = 1 AND visibility != %d ORDER BY category, weight', PROFILE_HIDDEN);
   }
   else {
-    $result = db_query("SELECT fid, name, type FROM {profile_fields} WHERE LOWER(category) = LOWER('%s') AND visibility != %d", $category, PROFILE_HIDDEN);
+    $result = db_query("SELECT fid, name, type, multiple FROM {profile_fields} WHERE LOWER(category) = LOWER('%s') AND visibility != %d", $category, PROFILE_HIDDEN);
     // We use LOWER('%s') instead of PHP's strtolower() to avoid UTF-8 conversion issues.
   }
   while ($field = db_fetch_object($result)) {
@@ -251,9 +261,17 @@ function profile_save_profile(&$edit, &$
        $edit[$field->name] = serialize($edit[$field->name]);
     }
     db_query("DELETE FROM {profile_values} WHERE fid = %d AND uid = %d", $field->fid, $user->uid);
-    db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $field->fid, $user->uid, $edit[$field->name]);
+    // Flatten out multiple selects.
+    if (is_array($edit[$field->name]) && $field->multiple) {
+      foreach ($edit[$field->name] as $key => $value) {
+        db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $field->fid, $user->uid, $value);
+      }
+    }
+    else {
+      db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $field->fid, $user->uid, $edit[$field->name]);
+    }
     // Mark field as handled (prevents saving to user->data).
-    $edit[$field->name] = NULL;
+    $edit[$field->name] = null;
   }
 }
 
@@ -268,7 +286,14 @@ function profile_view_field($user, $fiel
       case 'textarea':
         return check_markup($value);
       case 'selection':
-        return $browse ? l($value, 'profile/'. $field->name .'/'. $value) : check_plain($value);
+        if (is_array($value)) {
+          foreach($value as $v) {
+            $values[] = $browse ? l($v, 'profile/' . drupal_urlencode($field->name).'/'.drupal_urlencode($v)) : check_plain($v);
+          }
+          return implode(', ', $values);
+        } else {
+          return $browse ? l($value, 'profile/'. drupal_urlencode($field->name) .'/'. drupal_urlencode($value)) : check_plain($value);
+        }
       case 'checkbox':
         return $browse ? l($field->title, 'profile/'. $field->name) : check_plain($field->title);
       case 'url':
@@ -369,14 +394,15 @@ function profile_form_profile($edit, $us
         $fields[$category][$field->name] = array('#type' => 'checkbox', '#title' => check_plain($field->title), '#default_value' => $edit[$field->name], '#description' => _profile_form_explanation($field), '#required' => $field->required);
         break;
       case 'selection':
-        $options = array('--');
+        $options = array();
+        $options[-1] = '--';
         $lines = split("[,\n\r]", $field->options);
         foreach ($lines as $line) {
           if ($line = trim($line)) {
             $options[$line] = $line;
           }
         }
-        $fields[$category][$field->name] = array('#type' => 'select', '#title' => check_plain($field->title), '#default_value' => $edit[$field->name], '#options' => $options, '#description' => _profile_form_explanation($field), '#required' => $field->required);
+        $fields[$category][$field->name] = array('#type' => 'select', '#title' => check_plain($field->title), '#default_value' => $edit[$field->name], '#options' => $options, '#description' => _profile_form_explanation($field), '#required' => $field->required, '#multiple' => $field->multiple);
         break;
       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);
@@ -500,7 +526,7 @@ function profile_admin_add($type) {
     }
 
     if (!form_get_errors()) {
-      db_query("INSERT INTO {profile_fields} (title, name, explanation, category, type, weight, required, register, visibility, options, page) VALUES ('%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, '%s', '%s')", $data['title'], $data['name'], $data['explanation'], $data['category'], $type, $data['weight'], $data['required'], $data['register'], $data['visibility'], $data['options'], $data['page']);
+      db_query("INSERT INTO {profile_fields} (title, name, explanation, category, type, weight, multiple, required, register, visibility, options, page) VALUES ('%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s', '%s')", $data['title'], $data['name'], $data['explanation'], $data['category'], $type, $data['weight'], $data['multiple'], $data['required'], $data['register'], $data['visibility'], $data['options'], $data['page']);
 
       cache_clear_all();
 
@@ -528,7 +554,7 @@ function profile_admin_edit($fid) {
     profile_validate_form($data);
 
     if (!form_get_errors()) {
-      db_query("UPDATE {profile_fields} SET title = '%s', name = '%s', explanation = '%s', category = '%s', weight = %d, required = %d, register = %d, visibility = %d, options = '%s', page = '%s' WHERE fid = %d", $data['title'], $data['name'], $data['explanation'], $data['category'], $data['weight'], $data['required'], $data['register'], $data['visibility'], $data['options'], $data['page'], $fid);
+      db_query("UPDATE {profile_fields} SET title = '%s', name = '%s', explanation = '%s', category = '%s', weight = %d, multiple = %d, required = %d, register = %d, visibility = %d, options = '%s', page = '%s' WHERE fid = %d", $data['title'], $data['name'], $data['explanation'], $data['category'], $data['weight'], $data['multiple'], $data['required'], $data['register'], $data['visibility'], $data['options'], $data['page'], $fid);
 
       cache_clear_all();
 
@@ -601,6 +627,10 @@ function _profile_field_form($type, $edi
       '#default_value' => $edit['options'],
       '#description' => t('A list of all options. Put each option on a separate line. Example options are "red", "blue", "green", etc.'),
     );
+    $form['fields']['multiple'] = array('#type' => 'checkbox', 
+      '#title' => t('Multiple select'), 
+      '#default_value' => $edit['multiple'], t('Allows users to select more than one item in this field.')
+    );
   }
   $form['fields']['weight'] = array('#type' => 'weight',
     '#title' => t('Weight'),
