summaryrefslogtreecommitdiff
path: root/modules/profile.module
blob: d09639c85a736c938d49ae46cb547850e97c0586 (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
<?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, t("Your address: street and number.")),
    "city"          => array("textfield", t("City"), "", 64, 64, t("Your city.")),
    "state"         => array("textfield", t("State"), "", 4, 2, t("Your state as a two letter code.")),
    "zip"           => array("textfield", t("Zip"), "", 7, 5, t("Your ZIP code.")),
    "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, ""),
    "avatar"        => array("", t("Avatar or picture"), t("Your virtual face or picture."))
  );

  $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.");
  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 align=\"center\">". form_checkbox("", "profile_private_fields][", $key, in_array($key, $profile_private_fields)) ."</td>";
    $output .= "<td align=\"center\">". form_checkbox("", "profile_public_fields][", $key, in_array($key, $profile_public_fields)) ."</td>";
    $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";
  }
  $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");
    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");
    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=\"\" /><br />";
      }
    }
    $output .= form_file($profile_fields["avatar"][1], "profile_avatar", 64, $profile_fields["avatar"][2]);
  }

  return $output;
}

function _profile_validate($edit, $mode) {

  global $profile_fields, $user, $HTTP_POST_VARS;

  $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))) {
    $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":
          $output .= form_item($field[1], check_output($user->$t));
          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=\"\" />");
            }
          }

          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));
            }
          }
      }
    }
  }
  return $output;
}

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

  unset($edit["profile_avatar"]);

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

  $image_file = $HTTP_POST_FILES["edit"]["tmp_name"]["profile_avatar"];
  if (is_uploaded_file($image_file)) {
    $extension = strtolower(strrchr($HTTP_POST_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("uploaded file was not an image.");
    }
    else if (filesize($image_file) > (variable_get("profile_avatar_file_size", "30")*1000)) {
      $error = t("uploaded image is too large, max %a kb.", array("%a" => variable_get("profile_avatar_file_size", "30")));
    }
    else if ($size[0] > $maxwidth || $size[1] > $maxheight) {
      $error = t("uploaded image is too large, max %a.", array("%a" => variable_get("profile_avatar_dimensions", "85x85")));
    }
    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;
    }
  }

  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 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>";
  }
}

?>