profile.module 12.8 KB
Newer Older
Dries's avatar
 
Dries committed
1
<?php
Dries's avatar
 
Dries committed
2
// $Id$
Dries's avatar
 
Dries committed
3 4 5 6 7 8 9 10 11

function _profile_init() {
  /*
  ** Add here any field you might need.  Leave array[0] blank if you
  ** need a special tool (like birthday or avatar).
  **  TODO: add a clear description/explanation.
  */

  $GLOBALS["profile_fields"] = array(
Dries's avatar
 
Dries committed
12 13
    "address"       => array("textfield", t("Address"), "", 64, 64, t("Your address: street and number.")),
    "city"          => array("textfield", t("City"), "", 64, 64, t("Your city.")),
Dries's avatar
 
Dries committed
14 15 16
    "state"         => array("textfield", t("State, province or region"), "", 64, 64, ""),
    "zip"           => array("textfield", t("Zip or postal code"), "", 7, 10, ""),
    "country"       => array("textfield", t("Country"), "", 64, 64, ""),
Dries's avatar
 
Dries committed
17 18 19 20 21 22 23 24 25 26 27
    "birthday"      => array("", t("Birthday"), ""),
    "gender"        => array("select", t("Gender"), "", array(0 => "-", "m" => t("male"), "f" => t("female")), "", 0, 0),
    "job"           => array("textfield", t("Job title"), "", 64, 64, t("Your job title or position.")),
    "icq"           => array("textfield", t("ICQ messenger ID"), "", 12, 12, ""),
    "msn"           => array("textfield", t("MSN messenger ID"), "", 64, 64, ""),
    "yahoo"         => array("textfield", t("Yahoo messenger ID"), "", 64, 64, ""),
    "aim"           => array("textfield", t("AIM messenger ID"), "", 64, 64, ""),
    "homepage"      => array("textfield", t("URL of homepage"), "", 64, 64, t("Make sure you enter a fully qualified URL: remember to include \"http://\".")),
    "biography"     => array("textarea", t("Biography"), "", 64, 4, ""),
    "interests"     => array("textarea", t("Interests"), "", 64, 4, t("What you like.")),
    "publickey"     => array("textarea", t("Public key"), "", 64, 4, ""),
Dries's avatar
 
Dries committed
28
    "avatar"        => array("", t("Avatar or picture"), t("Your virtual face or picture.  Maximum dimensions are %dimensions and the maximum size is %size kB.", array("%dimensions" => variable_get("profile_avatar_dimensions", "85x85"), "%size" => variable_get("profile_avatar_file_size", "30"))))
Dries's avatar
 
Dries committed
29
  );
Dries's avatar
 
Dries committed
30 31

  $GLOBALS["profile_days"][0] = t("day");
Dries's avatar
 
Dries committed
32
  for ($n = 1; $n <= 31; $n++) {
Dries's avatar
 
Dries committed
33 34 35 36 37 38 39 40
    $GLOBALS["profile_days"][$n] = $n;
  }

  $GLOBALS["profile_months"] = array(0 => t("month"), 1 => t("January"), 2 => t("February"), 3 => t("March"), 4 => t("April"), 5 => t("May"), 6 => t("June"), 7 => t("July"), 8 => t("August"), 9 => t("September"), 10 => t("October"), 11 => t("November"), 12 => t("December"));
}

function profile_system($field){
  $system["description"] = t("Support for configurable user profiles.");
Dries's avatar
 
Dries committed
41
  $system["admin_help"] = t("When a user creates an account you can ask them to give you some extra information about themselves, as well as letting them use a small picture, called an avatar.<br />Notes:<ul><li>In order for a user to <i>enter</i> information you <b>MUST</b> check \"enable\".</li><li>In order for other people too see the entered information you must make it \"public\"</li><li>If an item is \"public\" but not enabled then the user can never give it a value and it will never been seen. Public does <b>not</b> imply \"enable\"</li><li>If an item is enabled, but not shown in the registration form the a user will have to ". l("edit their account", "user/edit") ." to place information in the field.</ul>");
Dries's avatar
 
Dries committed
42 43 44
  return $system[$field];
}

45
function profile_settings() {
Dries's avatar
 
Dries committed
46 47 48 49 50
  global $profile_fields;
  if (!$profile_fields) {
    _profile_init();
  }

Dries's avatar
 
Dries committed
51 52
  $profile_public_fields = variable_get("profile_public_fields", array());
  $profile_private_fields = variable_get("profile_private_fields", array());
Dries's avatar
 
Dries committed
53
  $profile_required_fields = variable_get("profile_required_fields", array());
Dries's avatar
 
Dries committed
54 55 56
  $profile_register_fields = variable_get("profile_register_fields", array());

  $output = "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">\n";
Dries's avatar
 
Dries committed
57
  $output .= "<tr><th>field</th><th>enable</th><th>public</th><th>required</th><th>show in registration form</th></tr>\n";
Dries's avatar
 
Dries committed
58
  foreach ($profile_fields as $key => $field) {
Dries's avatar
 
Dries committed
59 60
    $output .= "<tr><td>$field[1]</td>";
    $output .= "<td align=\"center\">". form_checkbox("", "profile_private_fields][", $key, in_array($key, $profile_private_fields)) ."</td>";
Dries's avatar
 
Dries committed
61
    $output .= "<td align=\"center\">". form_checkbox("", "profile_public_fields][", $key, in_array($key, $profile_public_fields)) ."</td>";
Dries's avatar
 
Dries committed
62 63 64
    $output .= "<td align=\"center\">". form_checkbox("", "profile_required_fields][", $key, in_array($key, $profile_required_fields)) ."</td>";
    $output .= "<td align=\"center\">". form_checkbox("", "profile_register_fields][", $key, in_array($key, $profile_register_fields)) ."</td>";
    $output .= "</tr>\n";
Dries's avatar
 
Dries committed
65
  }
Dries's avatar
 
Dries committed
66
  $output .= "</table>\n";
Dries's avatar
 
Dries committed
67

Dries's avatar
 
Dries committed
68
  $output .= form_textfield(t("Avatar image path"), "profile_avatar_path", variable_get("profile_avatar_path", "misc/avatars/"), 30, 255, t("Path for avatar directory; it must be writable and visible from the web."));
Dries's avatar
 
Dries committed
69
  $output .= form_textfield(t("Avatar maximum dimensions"), "profile_avatar_dimensions", variable_get("profile_avatar_dimensions", "85x85"), 10, 10, t("Maximum dimensions for avatars."));
Dries's avatar
 
Dries committed
70
  $output .= form_textfield(t("Avatar maximum file size"), "profile_avatar_file_size", variable_get("profile_avatar_file_size", "30"), 10, 10, t("Maximum file size for avatars, in kB."));
Dries's avatar
 
Dries committed
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

  return $output;
}

function profile_user($type, $edit, &$user) {
  global $profile_fields;
  if (!$profile_fields) {
    _profile_init();
  }

  switch ($type) {
    case "register_form":
      // first registration form (to add something to just email and nick)
      return _profile_form($edit, "register");
    case "register_validate":
      // validate first registration form
Dries's avatar
 
Dries committed
87
      return _profile_validate($edit, "required", $user);
Dries's avatar
 
Dries committed
88 89 90 91 92
    case "edit_form":
      // when user tries to edit his own data
      return _profile_form(object2array($user), "private");
    case "edit_validate":
      // validate user data editing
Dries's avatar
 
Dries committed
93
      return _profile_validate($edit, "private", $user);
Dries's avatar
 
Dries committed
94 95 96 97 98 99
    case "view_public":
      // when others look at user data
      return _profile_user_view($user, "public");
    case "view_private":
      // when user looks at his own data
      return _profile_user_view($user, "private");
Dries's avatar
 
Dries committed
100
  }
Dries's avatar
 
Dries committed
101 102 103
}

function profile_required($title) {
104 105
  // this pleads "theme, theme" ;)
  return $title ." ". theme("theme_mark");
Dries's avatar
 
Dries committed
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
}

function _profile_form($edit, $mode) {
  global $profile_fields, $user;

  $reg_fields = _profile_active_fields($mode);
  $required_fields = _profile_active_fields("required");

  foreach ($profile_fields as $name => $field) {
    if ($field[0] && in_array($name, $reg_fields)) {
      $f = "form_".$field[0];
      $t = "profile_".$name;
      $output .= $f((in_array($name, $required_fields) ? profile_required($field[1]) : $field[1]), $t, $edit[$t], $field[3], $field[4], $field[5], $field[6]);
    }
  }

  if (in_array("birthday", $reg_fields)) {
    $output .= form_item((in_array("birthday", $required_fields) ? profile_required($profile_fields["birthday"][1]) : $profile_fields["birthday"][1]), _profile_edit_birth(array2object($edit)), $profile_fields["birthday"][2]);
  }

  if (in_array("avatar", $reg_fields)) {
    if ($edit["profile_avatar"] && $edit["uid"]) {
      $file = profile_avatar_path($edit["uid"], $edit["profile_avatar"]);
      if ($file) {
Dries's avatar
Dries committed
130
        $output .= "<img src=\"$file\" alt=\"\" /><br />";
Dries's avatar
 
Dries committed
131 132 133 134 135 136 137 138
      }
    }
    $output .= form_file($profile_fields["avatar"][1], "profile_avatar", 64, $profile_fields["avatar"][2]);
  }

  return $output;
}

Dries's avatar
 
Dries committed
139
function _profile_validate($edit, $mode, $user) {
Dries's avatar
 
Dries committed
140

Dries's avatar
 
Dries committed
141
  global $profile_fields;
Dries's avatar
 
Dries committed
142

Dries's avatar
 
Dries committed
143
  $enabled_fields = _profile_active_fields($mode);
Dries's avatar
 
Dries committed
144

Dries's avatar
 
Dries committed
145
  if (in_array("birthday", $enabled_fields) && ($birth_error = _profile_validate_birth($edit))) {
Dries's avatar
 
Dries committed
146 147 148
    $error .= $birth_error."<br />";
  }

Dries's avatar
 
Dries committed
149
  if (in_array("avatar", $enabled_fields) && ($avatar_error = _profile_validate_avatar($edit, $user))) {
Dries's avatar
 
Dries committed
150 151 152 153 154 155 156 157 158 159 160 161
    $error .= $avatar_error."<br />";
  }

  foreach (array_keys($profile_fields) as $field) {
    // replicate any key which was saved during registration but is not in this form
    if (!$edit[$field] && $user->$field) {
      $edit[$field] = $user->$field;
    }
  }

  // now check for required fields
  foreach(_profile_active_fields("required") as $required) {
Dries's avatar
 
Dries committed
162
    if ($required != "0" && in_array($required, $enabled_fields)) {
Dries's avatar
 
Dries committed
163 164 165 166 167 168
      if (!$edit["profile_".$required]) {
        $error .= t("This required field is missing: %a", array("%a" => $profile_fields[$required][1]))."<br />";
      }
    }
  }

Dries's avatar
 
Dries committed
169
  return $error ? $error : $edit;
Dries's avatar
 
Dries committed
170 171 172 173 174 175 176 177
}

function _profile_user_view(&$user, $mode) {
  global $profile_fields;

  foreach (_profile_active_fields($mode) as $name) {
    $field = $profile_fields[$name];
    $t = "profile_".$name;
178

Dries's avatar
 
Dries committed
179
    if (!empty($user->$t)) {
Dries's avatar
 
Dries committed
180 181
      switch ($field[0]) {
        case "textfield":
Dries's avatar
 
Dries committed
182 183
        case "textarea":
        case "checkbox":
184 185
          $value = ($t == "profile_homepage") ? "<a href=\"".check_output($user->$t)."\">".check_output($user->$t)."</a>" : check_output($user->$t);
          $output .= form_item($field[1], $value);
Dries's avatar
 
Dries committed
186 187
          break;
        case "select":
Dries's avatar
 
Dries committed
188
          $output .= form_item($field[1], check_output($profile_fields[$name][3][$user->$t]));
Dries's avatar
 
Dries committed
189 190 191 192
          break;
        case "":
          // special
          if ($t == "profile_avatar") {
Dries's avatar
 
Dries committed
193 194
            $file = profile_avatar_path($user->uid, $user->profile_avatar);
            if (file_exists($file)) {
Dries's avatar
Dries committed
195
              $output .= form_item(t("Avatar"), "<img src=\"$file\" alt=\"\" />");
Dries's avatar
 
Dries committed
196 197 198
            }
          }

Dries's avatar
 
Dries committed
199 200 201 202
          if ($t == "profile_birthday") {
            if (isset($user->profile_birthday) && isset($user->profile_birthmonth) && isset($user->profile_birthyear)) {
              // this is very european-centric, can we use format_date?
              $time = mktime(0, 0, 0, $user->profile_birthmonth, $user->profile_birthday, $user->profile_birthyear);
203
              $output .= form_item(t("Birthday"), format_date($time, "custom", "F j, Y"));
Dries's avatar
 
Dries committed
204 205
            }
          }
Dries's avatar
 
Dries committed
206 207 208 209 210 211
      }
    }
  }
  return $output;
}

Dries's avatar
 
Dries committed
212
function _profile_validate_avatar(&$edit, $user) {
Dries's avatar
 
Dries committed
213
  // check that uploaded file is an image, with a maximum file size and maximum height/width
Dries's avatar
 
Dries committed
214 215 216

  unset($edit["profile_avatar"]);

Dries's avatar
 
Dries committed
217
  if ($_FILES["edit"]["name"]["profile_avatar"] == "") {
Dries's avatar
 
Dries committed
218 219 220 221
    $edit["profile_avatar"] = $user->profile_avatar;
    return "";
  }

Dries's avatar
 
Dries committed
222
  $image_file = $_FILES["edit"]["tmp_name"]["profile_avatar"];
Dries's avatar
 
Dries committed
223
  if (is_uploaded_file($image_file)) {
Dries's avatar
 
Dries committed
224
    $extension = strtolower(strrchr($_FILES["edit"]["name"]["profile_avatar"], "."));
Dries's avatar
 
Dries committed
225
    $size = getimagesize($image_file);
Dries's avatar
 
Dries committed
226
    list($maxwidth, $maxheight) = explode("x", variable_get("profile_avatar_dimensions", "85x85"));
Dries's avatar
 
Dries committed
227
    if ((!in_array($size[2], array(1,2,3))) || (!in_array($extension, array(".gif", ".jpg", ".png", ".jpeg")))) {
Dries's avatar
 
Dries committed
228
      $error = t("the uploaded file was not an image.");
Dries's avatar
 
Dries committed
229
    }
Dries's avatar
 
Dries committed
230
    else if (filesize($image_file) > (variable_get("profile_avatar_file_size", "30")*1000)) {
Dries's avatar
 
Dries committed
231
      $error = t("the uploaded image is too large, maximum %a kB.", array("%a" => variable_get("profile_avatar_file_size", "30")));
Dries's avatar
 
Dries committed
232 233
    }
    else if ($size[0] > $maxwidth || $size[1] > $maxheight) {
Dries's avatar
 
Dries committed
234
      $error = t("the uploaded image is too large, maximum %a.", array("%a" => variable_get("profile_avatar_dimensions", "85x85")));
Dries's avatar
 
Dries committed
235 236 237 238 239 240 241 242 243
    }
    else if (!copy($image_file, variable_get("profile_avatar_path", "misc/avatars/").md5($user->uid).$extension)) {
      $error = t("error in file upload");
    }
    else {
      $edit["profile_avatar"] = $extension;
    }
  }

Dries's avatar
 
Dries committed
244
  return $error ? "$error<br />" : "";
Dries's avatar
 
Dries committed
245 246 247
}

function profile_avatar_path($uid, $extension) {
Dries's avatar
 
Dries committed
248
  return $extension ? variable_get("profile_avatar_path", "misc/avatars/") . md5($uid) . $extension : "";
Dries's avatar
 
Dries committed
249 250 251
}

function _profile_active_fields($mode) {
Dries's avatar
 
Dries committed
252
  return variable_get("profile_". $mode ."_fields", array());
Dries's avatar
 
Dries committed
253 254 255 256
}

function _profile_edit_birth($edit = "") {
  global $profile_months, $profile_days;
Dries's avatar
 
Dries committed
257
  $output = _profile_select("profile_birthday", $edit->profile_birthday, $profile_days);
Dries's avatar
 
Dries committed
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
  $output .= "&nbsp;";
  $output .= _profile_select("profile_birthmonth", $edit->profile_birthmonth, $profile_months);
  $output .= "&nbsp;";
  $output .= "<input maxlength=\"4\" name=\"edit[profile_birthyear]\" size=\"5\" value=\"$edit->profile_birthyear\" />";
  return $output;
}

function _profile_validate_birth(&$edit) {
  if (!$edit["profile_birthday"] && !$edit["profile_birthmonth"] && !$edit["profile_birthyear"]) {
    // change this if you want required birth
    return;
  }

  if ($edit["profile_birthyear"] > 1900 && checkdate($edit["profile_birthmonth"], $edit["profile_birthday"], $edit["profile_birthyear"])) {
    return;
  }
  else {
    return t("The specified birthday is not valid.")."<br />";
  }
}

function _profile_select($name, $value, $options, $extra = 0, $multiple = 0) {
  if (count($options) > 0) {
    foreach ($options as $key=>$choice) {
      $select .= "<option value=\"$key\"". (is_array($value) ? (in_array($key, $value) ? " selected=\"selected\"" : "") : ($key == $value ? " selected=\"selected\"" : "")) .">". check_form($choice) ."</option>";
    }
    return "<select name=\"edit[$name]". ($multiple ? "[]" : "") ."\"". ($multiple ? " multiple " : "") . ($extra ? " $extra" : "") .">$select</select>";
  }
}

Dries's avatar
 
Dries committed
288
?>