Note: Requires content.module.'); } } /** * Implementation of hook_field_info(). */ function userreference_field_info() { return array( 'userreference' => array('label' => 'User Reference'), ); } /** * Implementation of hook_field_settings(). */ function userreference_field_settings($op, $field) { switch ($op) { case 'database columns': $columns = array( 'uid' => array('type' => 'int', 'not null' => TRUE, 'default' => '0'), ); return $columns; } } /** * Implementation of hook_field(). */ function userreference_field($op, &$node, $field, &$node_field, $teaser, $page) { switch ($op) { case 'view': foreach ($node_field as $delta => $item) { $node_field[$delta]['view'] = userreference_field_view_item($field, $item, $node); } return theme('field', $node, $field, $node_field, $teaser, $page); } } /** * Implementation of hook_field_view_item(). */ function userreference_field_view_item($field, $node_field_item) { if (isset($node_field_item['uid'])) { $referenced_user = user_load(array('uid' => $node_field_item['uid'])); if ($referenced_user) { return theme('username', $referenced_user); } } return ''; } /** * Implementation of hook_widget_info(). */ function userreference_widget_info() { return array( 'userreference_select' => array( 'label' => 'Select List', 'field types' => array('userreference'), ), 'userreference_autocomplete' => array( 'label' => 'Autocomplete Text Field', 'field types' => array('userreference'), ), ); } /** * Implementation of hook_widget(). */ function userreference_widget($op, &$node, $field, &$node_field) { if ($field['widget']['type'] == 'userreference_select') { switch ($op) { case 'prepare form values': $node_field_transposed = content_transpose_array_rows_cols($node_field); $node_field['default uids'] = $node_field_transposed['uid']; break; case 'form': $form = array(); $form[$field['field_name']] = array('#tree' => TRUE); $form[$field['field_name']]['uids'] = array( '#type' => 'select', '#title' => t($field['widget']['label']), '#default_value' => $node_field['default uids'], '#multiple' => $field['multiple'], '#options' => _userreference_potential_references($field), '#required' => $field['required'], '#description' => $field['widget']['description'], ); return $form; case 'process form values': if ($field['multiple']) { $node_field = content_transpose_array_rows_cols(array('uid' => $node_field['uids'])); } else { $node_field[0]['uid'] = $node_field['uids']; } // Remove the widget's data representation so it isn't saved. unset($node_field['uids']); } } else { switch ($op) { case 'prepare form values': foreach($node_field as $delta => $item) { $node_field[$delta]['default user_name'] = db_result(db_query("SELECT name FROM {users} WHERE uid = '%d'", $node_field[$delta]['uid'])); } break; case 'form': $form = array(); $form[$field['field_name']] = array('#tree' => TRUE); if ($field['multiple']) { $form[$field['field_name']]['#type'] = 'fieldset'; $form[$field['field_name']]['#title'] = t($field['widget']['label']); $form[$field['field_name']]['#description'] = $field['widget']['description']; $delta = 0; foreach ($node_field as $item) { if ($item['uid']) { $form[$field['field_name']][$delta]['user_name'] = array( '#type' => 'textfield', '#title' => '', '#autocomplete_path' => 'user/autocomplete', '#default_value' => $item['default user_name'], '#required' => ($delta == 0) ? $field['required'] : FALSE, ); $delta++; } } foreach (range($delta, $delta + 2) as $delta) { $form[$field['field_name']][$delta]['user_name'] = array( '#type' => 'textfield', '#title' => '', '#autocomplete_path' => 'user/autocomplete', '#default_value' => '', '#required' => ($delta == 0) ? $field['required'] : FALSE, ); } } else { $form[$field['field_name']][0]['user_name'] = array( '#type' => 'textfield', '#title' => t($field['widget']['label']), '#autocomplete_path' => 'user/autocomplete', '#default_value' => $node_field[0]['default user_name'], '#required' => $field['required'], '#description' => $field['widget']['description'], ); } return $form; case 'validate': foreach ($node_field as $delta => $item) { if ($item['user_name'] && !in_array($item['user_name'], _userreference_potential_references($field))) { form_set_error($field['field_name'], t('Invalid user name.')); } } return; case 'process form values': foreach ($node_field as $delta => $item) { $uid = db_result(db_query("SELECT uid FROM {users} WHERE name = '%s'", $node_field[$delta]['user_name'])); // Remove the widget's data representation so it isn't saved. unset($node_field[$delta]['user_name']); if ($uid) { $node_field[$delta]['uid'] = $uid; } else { unset($node_field[$delta]); } } } } } /** * Fetch an array of all candidate referenced users, for use in presenting the selection form to the user. */ function _userreference_potential_references($field) { $result = db_query("SELECT u.name, u.uid FROM {users} u WHERE uid > 0 ORDER BY u.name ASC"); if (!$field['required']) { $rows = array(0 => ''); } else { $rows = array(); } while ($user = db_fetch_object($result)) { $rows[$user->uid] = $user->name; } return $rows; } function userreference_referenced_by_list($uid, $content_type = '') { if ($content_type) { $result = db_query("SELECT n.* FROM {node_field_userreference_data} user_ref INNER JOIN {node} n ON n.vid = user_ref.vid AND n.type = '%s' WHERE user_ref.field_uid = %d ORDER BY n.type, delta", $content_type, $uid); } else { $result = db_query("SELECT n.* FROM {node_field_userreference_data} user_ref INNER JOIN {node} n ON n.vid = user_ref.vid WHERE user_ref.field_uid = %d ORDER BY n.type, delta", $uid); } $values = array(); while ($value = db_fetch_object($result)) { $values[] = $value; } return $values; }