[b354002] | 1 | <?php |
---|
| 2 | |
---|
| 3 | /** |
---|
| 4 | * @file |
---|
| 5 | * Support for configurable user profiles. |
---|
| 6 | */ |
---|
| 7 | |
---|
| 8 | /** |
---|
| 9 | * Private field, content only available to privileged users. |
---|
| 10 | */ |
---|
| 11 | define('PROFILE_PRIVATE', 1); |
---|
| 12 | |
---|
| 13 | /** |
---|
| 14 | * Public field, content shown on profile page but not used on member list pages. |
---|
| 15 | */ |
---|
| 16 | define('PROFILE_PUBLIC', 2); |
---|
| 17 | |
---|
| 18 | /** |
---|
| 19 | * Public field, content shown on profile page and on member list pages. |
---|
| 20 | */ |
---|
| 21 | define('PROFILE_PUBLIC_LISTINGS', 3); |
---|
| 22 | |
---|
| 23 | /** |
---|
| 24 | * Hidden profile field, only accessible by administrators, modules and themes. |
---|
| 25 | */ |
---|
| 26 | define('PROFILE_HIDDEN', 4); |
---|
| 27 | |
---|
| 28 | /** |
---|
| 29 | * Implementation of hook_help(). |
---|
| 30 | */ |
---|
| 31 | function profile_help($path, $arg) { |
---|
| 32 | switch ($path) { |
---|
| 33 | case 'admin/help#profile': |
---|
| 34 | $output = '<p>'. t('The profile module allows custom fields (such as country, full name, or age) to be defined and displayed in the <em>My Account</em> section. This permits users of a site to share more information about themselves, and can help community-based sites organize users around specific information.') .'</p>'; |
---|
| 35 | $output .= '<p>'. t('The following types of fields can be added to a user profile:') .'</p>'; |
---|
| 36 | $output .= '<ul><li>'. t('single-line textfield') .'</li>'; |
---|
| 37 | $output .= '<li>'. t('multi-line textfield') .'</li>'; |
---|
| 38 | $output .= '<li>'. t('checkbox') .'</li>'; |
---|
| 39 | $output .= '<li>'. t('list selection') .'</li>'; |
---|
| 40 | $output .= '<li>'. t('freeform list') .'</li>'; |
---|
| 41 | $output .= '<li>'. t('URL') .'</li>'; |
---|
| 42 | $output .= '<li>'. t('date') .'</li></ul>'; |
---|
| 43 | $output .= '<p>'. t('For more information, see the online handbook entry for <a href="@profile">Profile module</a>.', array('@profile' => 'http://drupal.org/handbook/modules/profile/')) .'</p>'; |
---|
| 44 | return $output; |
---|
| 45 | case 'admin/user/profile': |
---|
| 46 | return '<p>'. t("This page displays a list of the existing custom profile fields to be displayed on a user's <em>My Account</em> page. To provide structure, similar or related fields may be placed inside a category. To add a new category (or edit an existing one), edit a profile field and provide a new category name. To change the category of a field or the order of fields within a category, grab a drag-and-drop handle under the Title column and drag the field to a new location in the list. (Grab a handle by clicking and holding the mouse while hovering over a handle icon.) Remember that your changes will not be saved until you click the <em>Save configuration</em> button at the bottom of the page.") .'</p>'; |
---|
| 47 | } |
---|
| 48 | } |
---|
| 49 | |
---|
| 50 | /** |
---|
| 51 | * Implementation of hook_theme() |
---|
| 52 | */ |
---|
| 53 | function profile_theme() { |
---|
| 54 | return array( |
---|
| 55 | 'profile_block' => array( |
---|
| 56 | 'arguments' => array('account' => NULL, 'fields' => array()), |
---|
| 57 | 'template' => 'profile-block', |
---|
| 58 | ), |
---|
| 59 | 'profile_listing' => array( |
---|
| 60 | 'arguments' => array('account' => NULL, 'fields' => array()), |
---|
| 61 | 'template' => 'profile-listing', |
---|
| 62 | ), |
---|
| 63 | 'profile_wrapper' => array( |
---|
| 64 | 'arguments' => array('content' => NULL), |
---|
| 65 | 'template' => 'profile-wrapper', |
---|
| 66 | ), |
---|
| 67 | 'profile_admin_overview' => array( |
---|
| 68 | 'arguments' => array('form' => NULL), |
---|
| 69 | 'file' => 'profile.admin.inc', |
---|
| 70 | ) |
---|
| 71 | ); |
---|
| 72 | } |
---|
| 73 | |
---|
| 74 | /** |
---|
| 75 | * Implementation of hook_menu(). |
---|
| 76 | */ |
---|
| 77 | function profile_menu() { |
---|
| 78 | $items['profile'] = array( |
---|
| 79 | 'title' => 'User list', |
---|
| 80 | 'page callback' => 'profile_browse', |
---|
| 81 | 'access arguments' => array('access user profiles'), |
---|
| 82 | 'type' => MENU_SUGGESTED_ITEM, |
---|
| 83 | 'file' => 'profile.pages.inc', |
---|
| 84 | ); |
---|
| 85 | $items['admin/user/profile'] = array( |
---|
| 86 | 'title' => 'Profiles', |
---|
| 87 | 'description' => 'Create customizable fields for your users.', |
---|
| 88 | 'page callback' => 'drupal_get_form', |
---|
| 89 | 'page arguments' => array('profile_admin_overview'), |
---|
| 90 | 'access arguments' => array('administer users'), |
---|
| 91 | 'file' => 'profile.admin.inc', |
---|
| 92 | ); |
---|
| 93 | $items['admin/user/profile/add'] = array( |
---|
| 94 | 'title' => 'Add field', |
---|
| 95 | 'page callback' => 'drupal_get_form', |
---|
| 96 | 'page arguments' => array('profile_field_form'), |
---|
| 97 | 'access arguments' => array('administer users'), |
---|
| 98 | 'type' => MENU_CALLBACK, |
---|
| 99 | 'file' => 'profile.admin.inc', |
---|
| 100 | ); |
---|
| 101 | $items['admin/user/profile/autocomplete'] = array( |
---|
| 102 | 'title' => 'Profile category autocomplete', |
---|
| 103 | 'page callback' => 'profile_admin_settings_autocomplete', |
---|
| 104 | 'access arguments' => array('administer users'), |
---|
| 105 | 'type' => MENU_CALLBACK, |
---|
| 106 | 'file' => 'profile.admin.inc', |
---|
| 107 | ); |
---|
| 108 | $items['admin/user/profile/edit'] = array( |
---|
| 109 | 'title' => 'Edit field', |
---|
| 110 | 'page callback' => 'drupal_get_form', |
---|
| 111 | 'page arguments' => array('profile_field_form'), |
---|
| 112 | 'access arguments' => array('administer users'), |
---|
| 113 | 'type' => MENU_CALLBACK, |
---|
| 114 | 'file' => 'profile.admin.inc', |
---|
| 115 | ); |
---|
| 116 | $items['admin/user/profile/delete'] = array( |
---|
| 117 | 'title' => 'Delete field', |
---|
| 118 | 'page callback' => 'drupal_get_form', |
---|
| 119 | 'page arguments' => array('profile_field_delete'), |
---|
| 120 | 'access arguments' => array('administer users'), |
---|
| 121 | 'type' => MENU_CALLBACK, |
---|
| 122 | 'file' => 'profile.admin.inc', |
---|
| 123 | ); |
---|
| 124 | $items['profile/autocomplete'] = array( |
---|
| 125 | 'title' => 'Profile autocomplete', |
---|
| 126 | 'page callback' => 'profile_autocomplete', |
---|
| 127 | 'access arguments' => array('access user profiles'), |
---|
| 128 | 'type' => MENU_CALLBACK, |
---|
| 129 | 'file' => 'profile.pages.inc', |
---|
| 130 | ); |
---|
| 131 | return $items; |
---|
| 132 | } |
---|
| 133 | |
---|
| 134 | /** |
---|
| 135 | * Implementation of hook_block(). |
---|
| 136 | */ |
---|
| 137 | function profile_block($op = 'list', $delta = 0, $edit = array()) { |
---|
| 138 | |
---|
| 139 | if ($op == 'list') { |
---|
| 140 | $blocks[0]['info'] = t('Author information'); |
---|
| 141 | $blocks[0]['cache'] = BLOCK_CACHE_PER_PAGE | BLOCK_CACHE_PER_ROLE; |
---|
| 142 | return $blocks; |
---|
| 143 | } |
---|
| 144 | else if ($op == 'configure' && $delta == 0) { |
---|
| 145 | // Compile a list of fields to show |
---|
| 146 | $fields = array(); |
---|
| 147 | $result = db_query('SELECT name, title, weight, visibility FROM {profile_fields} WHERE visibility IN (%d, %d) ORDER BY weight', PROFILE_PUBLIC, PROFILE_PUBLIC_LISTINGS); |
---|
| 148 | while ($record = db_fetch_object($result)) { |
---|
| 149 | $fields[$record->name] = check_plain($record->title); |
---|
| 150 | } |
---|
| 151 | $fields['user_profile'] = t('Link to full user profile'); |
---|
| 152 | $form['profile_block_author_fields'] = array('#type' => 'checkboxes', |
---|
| 153 | '#title' => t('Profile fields to display'), |
---|
| 154 | '#default_value' => variable_get('profile_block_author_fields', array()), |
---|
| 155 | '#options' => $fields, |
---|
| 156 | '#description' => t('Select which profile fields you wish to display in the block. Only fields designated as public in the <a href="@profile-admin">profile field configuration</a> are available.', array('@profile-admin' => url('admin/user/profile'))), |
---|
| 157 | ); |
---|
| 158 | return $form; |
---|
| 159 | } |
---|
| 160 | else if ($op == 'save' && $delta == 0) { |
---|
| 161 | variable_set('profile_block_author_fields', $edit['profile_block_author_fields']); |
---|
| 162 | } |
---|
| 163 | else if ($op == 'view') { |
---|
| 164 | if (user_access('access user profiles')) { |
---|
| 165 | $output = ''; |
---|
| 166 | if ((arg(0) == 'node') && is_numeric(arg(1)) && (arg(2) == NULL)) { |
---|
| 167 | $node = node_load(arg(1)); |
---|
| 168 | $account = user_load(array('uid' => $node->uid)); |
---|
| 169 | |
---|
| 170 | if ($use_fields = variable_get('profile_block_author_fields', array())) { |
---|
| 171 | // Compile a list of fields to show. |
---|
| 172 | $fields = array(); |
---|
| 173 | $result = db_query('SELECT name, title, type, visibility, weight FROM {profile_fields} WHERE visibility IN (%d, %d) ORDER BY weight', PROFILE_PUBLIC, PROFILE_PUBLIC_LISTINGS); |
---|
| 174 | while ($record = db_fetch_object($result)) { |
---|
| 175 | // Ensure that field is displayed only if it is among the defined block fields and, if it is private, the user has appropriate permissions. |
---|
| 176 | if (isset($use_fields[$record->name]) && $use_fields[$record->name]) { |
---|
| 177 | $fields[] = $record; |
---|
| 178 | } |
---|
| 179 | } |
---|
| 180 | } |
---|
| 181 | |
---|
| 182 | if (!empty($fields)) { |
---|
| 183 | $profile = _profile_update_user_fields($fields, $account); |
---|
| 184 | $output .= theme('profile_block', $account, $profile, TRUE); |
---|
| 185 | } |
---|
| 186 | |
---|
| 187 | if (isset($use_fields['user_profile']) && $use_fields['user_profile']) { |
---|
| 188 | $output .= '<div>'. l(t('View full user profile'), 'user/'. $account->uid) .'</div>'; |
---|
| 189 | } |
---|
| 190 | } |
---|
| 191 | |
---|
| 192 | if ($output) { |
---|
| 193 | $block['subject'] = t('About %name', array('%name' => $account->name)); |
---|
| 194 | $block['content'] = $output; |
---|
| 195 | return $block; |
---|
| 196 | } |
---|
| 197 | } |
---|
| 198 | } |
---|
| 199 | } |
---|
| 200 | |
---|
| 201 | /** |
---|
| 202 | * Implementation of hook_user(). |
---|
| 203 | */ |
---|
| 204 | function profile_user($type, &$edit, &$user, $category = NULL) { |
---|
| 205 | switch ($type) { |
---|
| 206 | case 'load': |
---|
| 207 | return profile_load_profile($user); |
---|
| 208 | case 'register': |
---|
| 209 | return profile_form_profile($edit, $user, $category, TRUE); |
---|
| 210 | case 'update': |
---|
| 211 | return profile_save_profile($edit, $user, $category); |
---|
| 212 | case 'insert': |
---|
| 213 | return profile_save_profile($edit, $user, $category, TRUE); |
---|
| 214 | case 'view': |
---|
| 215 | return profile_view_profile($user); |
---|
| 216 | case 'form': |
---|
| 217 | return profile_form_profile($edit, $user, $category); |
---|
| 218 | case 'validate': |
---|
| 219 | return profile_validate_profile($edit, $category); |
---|
| 220 | case 'categories': |
---|
| 221 | return profile_categories(); |
---|
| 222 | case 'delete': |
---|
| 223 | db_query('DELETE FROM {profile_values} WHERE uid = %d', $user->uid); |
---|
| 224 | } |
---|
| 225 | } |
---|
| 226 | |
---|
| 227 | function profile_load_profile(&$user) { |
---|
| 228 | $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); |
---|
| 229 | while ($field = db_fetch_object($result)) { |
---|
| 230 | if (empty($user->{$field->name})) { |
---|
| 231 | $user->{$field->name} = _profile_field_serialize($field->type) ? unserialize($field->value) : $field->value; |
---|
| 232 | } |
---|
| 233 | } |
---|
| 234 | } |
---|
| 235 | |
---|
| 236 | function profile_save_profile(&$edit, &$user, $category, $register = FALSE) { |
---|
| 237 | $result = _profile_get_fields($category, $register); |
---|
| 238 | while ($field = db_fetch_object($result)) { |
---|
| 239 | if (_profile_field_serialize($field->type)) { |
---|
| 240 | $edit[$field->name] = serialize($edit[$field->name]); |
---|
| 241 | } |
---|
| 242 | db_query("DELETE FROM {profile_values} WHERE fid = %d AND uid = %d", $field->fid, $user->uid); |
---|
| 243 | db_query("INSERT INTO {profile_values} (fid, uid, value) VALUES (%d, %d, '%s')", $field->fid, $user->uid, $edit[$field->name]); |
---|
| 244 | // Mark field as handled (prevents saving to user->data). |
---|
| 245 | $edit[$field->name] = NULL; |
---|
| 246 | } |
---|
| 247 | } |
---|
| 248 | |
---|
| 249 | function profile_view_field($user, $field) { |
---|
| 250 | // Only allow browsing of private fields for admins, if browsing is enabled, |
---|
| 251 | // and if a user has permission to view profiles. Note that this check is |
---|
| 252 | // necessary because a user may always see their own profile. |
---|
| 253 | $browse = user_access('access user profiles') |
---|
| 254 | && (user_access('administer users') || $field->visibility != PROFILE_PRIVATE) |
---|
| 255 | && !empty($field->page); |
---|
| 256 | |
---|
| 257 | if (isset($user->{$field->name}) && $value = $user->{$field->name}) { |
---|
| 258 | switch ($field->type) { |
---|
| 259 | case 'textarea': |
---|
| 260 | return check_markup($value); |
---|
| 261 | case 'textfield': |
---|
| 262 | case 'selection': |
---|
| 263 | return $browse ? l($value, 'profile/'. $field->name .'/'. $value) : check_plain($value); |
---|
| 264 | case 'checkbox': |
---|
| 265 | return $browse ? l($field->title, 'profile/'. $field->name) : check_plain($field->title); |
---|
| 266 | case 'url': |
---|
| 267 | return '<a href="'. check_url($value) .'">'. check_plain($value) .'</a>'; |
---|
| 268 | case 'date': |
---|
| 269 | $format = substr(variable_get('date_format_short', 'm/d/Y - H:i'), 0, 5); |
---|
| 270 | // Note: Avoid PHP's date() because it does not handle dates before |
---|
| 271 | // 1970 on Windows. This would make the date field useless for e.g. |
---|
| 272 | // birthdays. |
---|
| 273 | $replace = array( |
---|
| 274 | 'd' => sprintf('%02d', $value['day']), |
---|
| 275 | 'j' => $value['day'], |
---|
| 276 | 'm' => sprintf('%02d', $value['month']), |
---|
| 277 | 'M' => map_month($value['month']), |
---|
| 278 | 'Y' => $value['year'], |
---|
| 279 | 'H:i' => NULL, |
---|
| 280 | 'g:ia' => NULL, |
---|
| 281 | ); |
---|
| 282 | return strtr($format, $replace); |
---|
| 283 | case 'list': |
---|
| 284 | $values = split("[,\n\r]", $value); |
---|
| 285 | $fields = array(); |
---|
| 286 | foreach ($values as $value) { |
---|
| 287 | if ($value = trim($value)) { |
---|
| 288 | $fields[] = $browse ? l($value, 'profile/'. $field->name .'/'. $value) : check_plain($value); |
---|
| 289 | } |
---|
| 290 | } |
---|
| 291 | return implode(', ', $fields); |
---|
| 292 | } |
---|
| 293 | } |
---|
| 294 | } |
---|
| 295 | |
---|
| 296 | function profile_view_profile(&$user) { |
---|
| 297 | |
---|
| 298 | profile_load_profile($user); |
---|
| 299 | |
---|
| 300 | // Show private fields to administrators and people viewing their own account. |
---|
| 301 | if (user_access('administer users') || $GLOBALS['user']->uid == $user->uid) { |
---|
| 302 | $result = db_query('SELECT * FROM {profile_fields} WHERE visibility != %d ORDER BY category, weight', PROFILE_HIDDEN); |
---|
| 303 | } |
---|
| 304 | else { |
---|
| 305 | $result = db_query('SELECT * FROM {profile_fields} WHERE visibility != %d AND visibility != %d ORDER BY category, weight', PROFILE_PRIVATE, PROFILE_HIDDEN); |
---|
| 306 | } |
---|
| 307 | |
---|
| 308 | $fields = array(); |
---|
| 309 | while ($field = db_fetch_object($result)) { |
---|
| 310 | if ($value = profile_view_field($user, $field)) { |
---|
| 311 | $title = ($field->type != 'checkbox') ? check_plain($field->title) : NULL; |
---|
| 312 | |
---|
| 313 | // Create a single fieldset for each category. |
---|
| 314 | if (!isset($user->content[$field->category])) { |
---|
| 315 | $user->content[$field->category] = array( |
---|
| 316 | '#type' => 'user_profile_category', |
---|
| 317 | '#title' => $field->category, |
---|
| 318 | ); |
---|
| 319 | } |
---|
| 320 | |
---|
| 321 | $user->content[$field->category][$field->name] = array( |
---|
| 322 | '#type' => 'user_profile_item', |
---|
| 323 | '#title' => $title, |
---|
| 324 | '#value' => $value, |
---|
| 325 | '#weight' => $field->weight, |
---|
| 326 | '#attributes' => array('class' => 'profile-'. $field->name), |
---|
| 327 | ); |
---|
| 328 | } |
---|
| 329 | } |
---|
| 330 | } |
---|
| 331 | |
---|
| 332 | function _profile_form_explanation($field) { |
---|
| 333 | $output = $field->explanation; |
---|
| 334 | |
---|
| 335 | if ($field->type == 'list') { |
---|
| 336 | $output .= ' '. t('Put each item on a separate line or separate them by commas. No HTML allowed.'); |
---|
| 337 | } |
---|
| 338 | |
---|
| 339 | if ($field->visibility == PROFILE_PRIVATE) { |
---|
| 340 | $output .= ' '. t('The content of this field is kept private and will not be shown publicly.'); |
---|
| 341 | } |
---|
| 342 | |
---|
| 343 | return $output; |
---|
| 344 | } |
---|
| 345 | |
---|
| 346 | function profile_form_profile($edit, $user, $category, $register = FALSE) { |
---|
| 347 | $result = _profile_get_fields($category, $register); |
---|
| 348 | $weight = 1; |
---|
| 349 | $fields = array(); |
---|
| 350 | while ($field = db_fetch_object($result)) { |
---|
| 351 | $category = $field->category; |
---|
| 352 | if (!isset($fields[$category])) { |
---|
| 353 | $fields[$category] = array('#type' => 'fieldset', '#title' => check_plain($category), '#weight' => $weight++); |
---|
| 354 | } |
---|
| 355 | switch ($field->type) { |
---|
| 356 | case 'textfield': |
---|
| 357 | case 'url': |
---|
| 358 | $fields[$category][$field->name] = array('#type' => 'textfield', |
---|
| 359 | '#title' => check_plain($field->title), |
---|
| 360 | '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : '', |
---|
| 361 | '#maxlength' => 255, |
---|
| 362 | '#description' => _profile_form_explanation($field), |
---|
| 363 | '#required' => $field->required, |
---|
| 364 | ); |
---|
| 365 | if ($field->autocomplete) { |
---|
| 366 | $fields[$category][$field->name]['#autocomplete_path'] = "profile/autocomplete/". $field->fid; |
---|
| 367 | } |
---|
| 368 | break; |
---|
| 369 | case 'textarea': |
---|
| 370 | $fields[$category][$field->name] = array('#type' => 'textarea', |
---|
| 371 | '#title' => check_plain($field->title), |
---|
| 372 | '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : '', |
---|
| 373 | '#description' => _profile_form_explanation($field), |
---|
| 374 | '#required' => $field->required, |
---|
| 375 | ); |
---|
| 376 | break; |
---|
| 377 | case 'list': |
---|
| 378 | $fields[$category][$field->name] = array('#type' => 'textarea', |
---|
| 379 | '#title' => check_plain($field->title), |
---|
| 380 | '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : '', |
---|
| 381 | '#description' => _profile_form_explanation($field), |
---|
| 382 | '#required' => $field->required, |
---|
| 383 | ); |
---|
| 384 | break; |
---|
| 385 | case 'checkbox': |
---|
| 386 | $fields[$category][$field->name] = array('#type' => 'checkbox', |
---|
| 387 | '#title' => check_plain($field->title), |
---|
| 388 | '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : '', |
---|
| 389 | '#description' => _profile_form_explanation($field), |
---|
| 390 | '#required' => $field->required, |
---|
| 391 | ); |
---|
| 392 | break; |
---|
| 393 | case 'selection': |
---|
| 394 | $options = $field->required ? array() : array('--'); |
---|
| 395 | $lines = split("[\n\r]", $field->options); |
---|
| 396 | foreach ($lines as $line) { |
---|
| 397 | if ($line = trim($line)) { |
---|
| 398 | $options[$line] = $line; |
---|
| 399 | } |
---|
| 400 | } |
---|
| 401 | $fields[$category][$field->name] = array('#type' => 'select', |
---|
| 402 | '#title' => check_plain($field->title), |
---|
| 403 | '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : '', |
---|
| 404 | '#options' => $options, |
---|
| 405 | '#description' => _profile_form_explanation($field), |
---|
| 406 | '#required' => $field->required, |
---|
| 407 | ); |
---|
| 408 | break; |
---|
| 409 | case 'date': |
---|
| 410 | $fields[$category][$field->name] = array('#type' => 'date', |
---|
| 411 | '#title' => check_plain($field->title), |
---|
| 412 | '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : '', |
---|
| 413 | '#description' => _profile_form_explanation($field), |
---|
| 414 | '#required' => $field->required, |
---|
| 415 | ); |
---|
| 416 | break; |
---|
| 417 | } |
---|
| 418 | } |
---|
| 419 | return $fields; |
---|
| 420 | } |
---|
| 421 | |
---|
| 422 | /** |
---|
| 423 | * Helper function: update an array of user fields by calling profile_view_field |
---|
| 424 | */ |
---|
| 425 | function _profile_update_user_fields($fields, $account) { |
---|
| 426 | foreach ($fields as $key => $field) { |
---|
| 427 | $fields[$key]->value = profile_view_field($account, $field); |
---|
| 428 | } |
---|
| 429 | return $fields; |
---|
| 430 | } |
---|
| 431 | |
---|
| 432 | function profile_validate_profile($edit, $category) { |
---|
| 433 | $result = _profile_get_fields($category); |
---|
| 434 | while ($field = db_fetch_object($result)) { |
---|
| 435 | if ($edit[$field->name]) { |
---|
| 436 | if ($field->type == 'url') { |
---|
| 437 | if (!valid_url($edit[$field->name], TRUE)) { |
---|
| 438 | form_set_error($field->name, t('The value provided for %field is not a valid URL.', array('%field' => $field->title))); |
---|
| 439 | } |
---|
| 440 | } |
---|
| 441 | } |
---|
| 442 | else if ($field->required && !user_access('administer users')) { |
---|
| 443 | form_set_error($field->name, t('The field %field is required.', array('%field' => $field->title))); |
---|
| 444 | } |
---|
| 445 | } |
---|
| 446 | |
---|
| 447 | return $edit; |
---|
| 448 | } |
---|
| 449 | |
---|
| 450 | function profile_categories() { |
---|
| 451 | $result = db_query("SELECT DISTINCT(category) FROM {profile_fields}"); |
---|
| 452 | $data = array(); |
---|
| 453 | while ($category = db_fetch_object($result)) { |
---|
| 454 | $data[] = array( |
---|
| 455 | 'name' => $category->category, |
---|
| 456 | 'title' => $category->category, |
---|
| 457 | 'weight' => 3, |
---|
| 458 | 'access callback' => 'profile_category_access', |
---|
| 459 | 'access arguments' => array(1, $category->category) |
---|
| 460 | ); |
---|
| 461 | } |
---|
| 462 | return $data; |
---|
| 463 | } |
---|
| 464 | |
---|
| 465 | /** |
---|
| 466 | * Menu item access callback - check if a user has access to a profile category. |
---|
| 467 | */ |
---|
| 468 | function profile_category_access($account, $category) { |
---|
| 469 | if (user_access('administer users') && $account->uid > 0) { |
---|
| 470 | return TRUE; |
---|
| 471 | } |
---|
| 472 | else { |
---|
| 473 | return user_edit_access($account) && db_result(db_query("SELECT COUNT(*) FROM {profile_fields} WHERE category = '%s' AND visibility <> %d", $category, PROFILE_HIDDEN)); |
---|
| 474 | } |
---|
| 475 | } |
---|
| 476 | |
---|
| 477 | /** |
---|
| 478 | * Process variables for profile-block.tpl.php. |
---|
| 479 | * |
---|
| 480 | * The $variables array contains the following arguments: |
---|
| 481 | * - $account |
---|
| 482 | * - $fields |
---|
| 483 | * |
---|
| 484 | * @see profile-block.tpl.php |
---|
| 485 | */ |
---|
| 486 | function template_preprocess_profile_block(&$variables) { |
---|
| 487 | |
---|
| 488 | $variables['picture'] = theme('user_picture', $variables['account']); |
---|
| 489 | $variables['profile'] = array(); |
---|
| 490 | // Supply filtered version of $fields that have values. |
---|
| 491 | foreach ($variables['fields'] as $field) { |
---|
| 492 | if ($field->value) { |
---|
| 493 | $variables['profile'][$field->name]->title = check_plain($field->title); |
---|
| 494 | $variables['profile'][$field->name]->value = $field->value; |
---|
| 495 | $variables['profile'][$field->name]->type = $field->type; |
---|
| 496 | } |
---|
| 497 | } |
---|
| 498 | |
---|
| 499 | } |
---|
| 500 | |
---|
| 501 | /** |
---|
| 502 | * Process variables for profile-listing.tpl.php. |
---|
| 503 | * |
---|
| 504 | * The $variables array contains the following arguments: |
---|
| 505 | * - $account |
---|
| 506 | * - $fields |
---|
| 507 | * |
---|
| 508 | * @see profile-listing.tpl.php |
---|
| 509 | */ |
---|
| 510 | function template_preprocess_profile_listing(&$variables) { |
---|
| 511 | |
---|
| 512 | $variables['picture'] = theme('user_picture', $variables['account']); |
---|
| 513 | $variables['name'] = theme('username', $variables['account']); |
---|
| 514 | $variables['profile'] = array(); |
---|
| 515 | // Supply filtered version of $fields that have values. |
---|
| 516 | foreach ($variables['fields'] as $field) { |
---|
| 517 | if ($field->value) { |
---|
| 518 | $variables['profile'][$field->name]->title = $field->title; |
---|
| 519 | $variables['profile'][$field->name]->value = $field->value; |
---|
| 520 | $variables['profile'][$field->name]->type = $field->type; |
---|
| 521 | } |
---|
| 522 | } |
---|
| 523 | |
---|
| 524 | } |
---|
| 525 | |
---|
| 526 | /** |
---|
| 527 | * Process variables for profile-wrapper.tpl.php. |
---|
| 528 | * |
---|
| 529 | * The $variables array contains the following arguments: |
---|
| 530 | * - $content |
---|
| 531 | * |
---|
| 532 | * @see profile-wrapper.tpl.php |
---|
| 533 | */ |
---|
| 534 | function template_preprocess_profile_wrapper(&$variables) { |
---|
| 535 | $variables['current_field'] = ''; |
---|
| 536 | if ($field = arg(1)) { |
---|
| 537 | $variables['current_field'] = $field; |
---|
| 538 | // Supply an alternate template suggestion based on the browsable field. |
---|
| 539 | $variables['template_files'][] = 'profile-wrapper-'. $field; |
---|
| 540 | } |
---|
| 541 | } |
---|
| 542 | |
---|
| 543 | function _profile_field_types($type = NULL) { |
---|
| 544 | $types = array('textfield' => t('single-line textfield'), |
---|
| 545 | 'textarea' => t('multi-line textfield'), |
---|
| 546 | 'checkbox' => t('checkbox'), |
---|
| 547 | 'selection' => t('list selection'), |
---|
| 548 | 'list' => t('freeform list'), |
---|
| 549 | 'url' => t('URL'), |
---|
| 550 | 'date' => t('date')); |
---|
| 551 | return isset($type) ? $types[$type] : $types; |
---|
| 552 | } |
---|
| 553 | |
---|
| 554 | function _profile_field_serialize($type = NULL) { |
---|
| 555 | return $type == 'date'; |
---|
| 556 | } |
---|
| 557 | |
---|
| 558 | function _profile_get_fields($category, $register = FALSE) { |
---|
| 559 | $args = array(); |
---|
| 560 | $sql = 'SELECT * FROM {profile_fields} WHERE '; |
---|
| 561 | $filters = array(); |
---|
| 562 | if ($register) { |
---|
| 563 | $filters[] = 'register = 1'; |
---|
| 564 | } |
---|
| 565 | else { |
---|
| 566 | // Use LOWER('%s') instead of PHP's strtolower() to avoid UTF-8 conversion issues. |
---|
| 567 | $filters[] = "LOWER(category) = LOWER('%s')"; |
---|
| 568 | $args[] = $category; |
---|
| 569 | } |
---|
| 570 | if (!user_access('administer users')) { |
---|
| 571 | $filters[] = 'visibility != %d'; |
---|
| 572 | $args[] = PROFILE_HIDDEN; |
---|
| 573 | } |
---|
| 574 | $sql .= implode(' AND ', $filters); |
---|
| 575 | $sql .= ' ORDER BY category, weight'; |
---|
| 576 | return db_query($sql, $args); |
---|
| 577 | } |
---|
| 578 | |
---|