summaryrefslogtreecommitdiffstats
path: root/modules/profile.module
blob: cb6dfb145b1cb09967f9e6d01b6f9d8fb7fa282f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
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
288
289
290
291
292
293
294
<?php
// $Id$

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(
    "address"       => array("textfield", t("Address"), "", 64, 64, ""),
    "city"          => array("textfield", t("City"), "", 64, 64, ""),
    "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, ""),
    "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, ""),
    "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, ""),
    "publickey"     => array("textarea", t("Public key"), "", 64, 4, ""),
    "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"))))
  );

  $GLOBALS["profile_days"][0] = t("day");
  for ($n = 1; $n <= 31; $n++) {
    $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.");
  $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 enter 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, the user can never give it a value and it will never be seen.  Public does <b>not</b> imply \"enable\".</li><li>If an item is enabled, but not shown in the registration form the user will have to ". l("edit their account", "user/edit") ." to place information in the field.</ul>");
  return $system[$field];
}

function profile_settings() {
  global $profile_fields;
  if (!$profile_fields) {
    _profile_init();
  }

  $profile_public_fields = variable_get("profile_public_fields", array());
  $profile_private_fields = variable_get("profile_private_fields", array());
  $profile_required_fields = variable_get("profile_required_fields", array());
  $profile_register_fields = variable_get("profile_register_fields", array());

  $output = "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">\n";
  $output .= "<tr><th>field</th><th>enable</th><th>public</th><th>required</th><th>show in registration form</th></tr>\n";
  foreach ($profile_fields as $key => $field) {
    $output .= "<tr><td>$field[1]</td>";
    $output .= "<td style=\"text-align: center;\">". form_checkbox("", "profile_private_fields][", $key, in_array($key, $profile_private_fields)) ."</td>";
    $output .= "<td style=\"text-align: center;\">". form_checkbox("", "profile_public_fields][", $key, in_array($key, $profile_public_fields)) ."</td>";
    $output .= "<td style=\"text-align: center;\">". form_checkbox("", "profile_required_fields][", $key, in_array($key, $profile_required_fields)) ."</td>";
    $output .= "<td style=\"text-align: center;\">". form_checkbox("", "profile_register_fields][", $key, in_array($key, $profile_register_fields)) ."</td>";
    $output .= "</tr>\n";
  }
  $output .= "</table>\n";

  $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."));
  $output .= form_textfield(t("Avatar maximum dimensions"), "profile_avatar_dimensions", variable_get("profile_avatar_dimensions", "85x85"), 10, 10, t("Maximum dimensions for avatars."));
  $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."));

  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
      return _profile_validate($edit, "required", $user);
    case "edit_form":
      // when user tries to edit his own data
      return _profile_form(object2array($user), "private");
    case "edit_validate":
      // validate user data editing
      return _profile_validate($edit, "private", $user);
    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");
  }
}

function profile_required($title) {
  // this pleads "theme, theme" ;)
  return $title ." ". theme("theme_mark");
}

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) {
        $output .= "<img src=\"$file\" alt=\"\" title=\"\" /><br />";
      }
    }
    $output .= form_file($profile_fields["avatar"][1], "profile_avatar", 64, $profile_fields["avatar"][2]);
  }

  return $output;
}

function _profile_validate($edit, $mode, $user) {

  global $profile_fields;

  $enabled_fields = _profile_active_fields($mode);

  if (in_array("birthday", $enabled_fields) && ($birth_error = _profile_validate_birth($edit))) {
    $error .= $birth_error ."<br />";
  }

  if (in_array("avatar", $enabled_fields) && ($avatar_error = _profile_validate_avatar($edit, $user))) {
    $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) {
    if ($required != "0" && in_array($required, $enabled_fields)) {
      if (!$edit["profile_". $required]) {
        $error .= t("This required field is missing: %a", array("%a" => $profile_fields[$required][1])) ."<br />";
      }
    }
  }

  return $error ? $error : $edit;
}

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

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

    if (!empty($user->$t)) {
      switch ($field[0]) {
        case "textfield":
        case "textarea":
        case "checkbox":
          $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);
          break;
        case "select":
          $output .= form_item($field[1], check_output($profile_fields[$name][3][$user->$t]));
          break;
        case "":
          // special
          if ($t == "profile_avatar") {
            $file = profile_avatar_path($user->uid, $user->profile_avatar);
            if (file_exists($file)) {
              $output .= form_item(t("Avatar"), "<img src=\"$file\" alt=\"\" title=\"\" />");
            }
          }

          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);
              $output .= form_item(t("Birthday"), format_date($time, "custom", "F j, Y"));
            }
          }
      }
    }
  }
  return $output;
}

function _profile_validate_avatar(&$edit, $user) {
  // check that uploaded file is an image, with a maximum file size and maximum height/width

  unset($edit["profile_avatar"]);

  if ($_FILES["edit"]["name"]["profile_avatar"] == "") {
    $edit["profile_avatar"] = $user->profile_avatar;
    return "";
  }

  $image_file = $_FILES["edit"]["tmp_name"]["profile_avatar"];
  if (is_uploaded_file($image_file)) {
    $extension = strtolower(strrchr($_FILES["edit"]["name"]["profile_avatar"], "."));
    $size = getimagesize($image_file);
    list($maxwidth, $maxheight) = explode("x", variable_get("profile_avatar_dimensions", "85x85"));
    if ((!in_array($size[2], array(1, 2, 3))) || (!in_array($extension, array(".gif", ".jpg", ".png", ".jpeg")))) {
      $error = t("The uploaded file was not an image.");
    }
    else if (filesize($image_file) > (variable_get("profile_avatar_file_size", "30") * 1000)) {
      $error = t("The uploaded image is too large; the maximum file size is %a kB.", array("%a" => variable_get("profile_avatar_file_size", "30")));
    }
    else if ($size[0] > $maxwidth || $size[1] > $maxheight) {
      $error = t("The uploaded image is too large; the maximum dimensions are %a pixels.", array("%a" => variable_get("profile_avatar_dimensions", "85x85")));
    }
    else if (!is_dir(variable_get("profile_avatar_path", "misc/avatars/"))) {
      $error = t("Failed to upload the avatar image; the '%directory' directory doesn't exist.", array("%directory" => variable_get("profile_avatar_path", "misc/avatars/")));
    }
    else if (!is_writeable(variable_get("profile_avatar_path", "misc/avatars/"))) {
      $error = t("Failed to upload the avatar image; the webserver has no write permission to the '%directory' directory.", array("%directory" => variable_get("profile_avatar_path", "misc/avatars/")));
    }
    else if (!copy($image_file, variable_get("profile_avatar_path", "misc/avatars/").md5($user->uid).$extension)) {
      $error = t("Failed to upload the avatar image; could not copy file '%filename' to directory '%directory'.", array("%filename" => $_FILES["edit"]["name"]["profile_avatar"], "%directory" => variable_get("profile_avatar_path", "misc/avatars/")));
    }
    else {
      $edit["profile_avatar"] = $extension;
    }
  }

  return $error ? "$error<br />" : "";
}

function profile_avatar_path($uid, $extension) {
  return $extension ? variable_get("profile_avatar_path", "misc/avatars/") . md5($uid) . $extension : "";
}

function _profile_active_fields($mode) {
  return variable_get("profile_". $mode ."_fields", array());
}

function _profile_edit_birth($edit = "") {
  global $profile_months, $profile_days;
  $output = _profile_select("profile_birthday", $edit->profile_birthday, $profile_days);
  $output .= "&nbsp;";
  $output .= _profile_select("profile_birthmonth", $edit->profile_birthmonth, $profile_months);
  $output .= "&nbsp;";
  $output .= "<input type=\"text\" 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>";
  }
}

?>