=== modified file 'realname.admin.inc'
--- realname.admin.inc 2009-03-08 09:22:40 +0000
+++ realname.admin.inc 2009-03-08 09:23:15 +0000
@@ -19,6 +19,11 @@
}
function realname_admin_general() {
+ // Show rebuild warning
+ if (variable_get('realname_recalculate', FALSE)) {
+ drupal_set_message(t('In order to apply new settings you need to rebuild your realnames', array('!rebuild' => url('admin/user/realname/recalc'))), 'warning');
+ }
+
$form = array();
$form['realname_nodeapi'] = array(
@@ -28,6 +33,15 @@
'#default_value' => variable_get('realname_nodeapi', FALSE),
);
+ if ( module_exists('views') ) {
+ $form['realname_view'] = array(
+ '#type' => 'checkbox',
+ '#title' => ''. t('Overwrite user fields in view to show realnames') .'',
+ '#description' => t('This option will overwrite default user name definition in Views in order to show realnames without the need to modify views. Remember to rebuild view cache after changing this option.'),
+ '#default_value' => variable_get('realname_view', FALSE),
+ );
+ }
+
$form['theme'] = array(
'#type' => 'fieldset',
'#title' => t('Theme_username options'),
@@ -62,6 +76,10 @@
}
function realname_admin_bypass() {
+ // Show rebuild warning
+ if (variable_get('realname_recalculate', FALSE)) {
+ drupal_set_message(t('In order to apply new settings you need to rebuild your realnames', array('!rebuild' => url('admin/user/realname/recalc'))), 'warning');
+ }
$form = array();
$current = variable_get('realname_bypass_forms', array(array('name' => 'comment_form', 'fields' => array('name'))));
@@ -106,10 +124,18 @@
}
}
variable_set('realname_bypass_forms', $bypass_forms);
+ // mark form for realname recalculation
+ variable_set('realname_recalculate', TRUE);
+
drupal_set_message(t('Information saved for !count forms.', array('!count' => count($bypass_forms))), 'status');
}
function realname_admin_module($form_state) {
+ // Show rebuild warning
+ if (variable_get('realname_recalculate', FALSE)) {
+ drupal_set_message(t('In order to apply new settings you need to rebuild your realnames', array('!rebuild' => url('admin/user/realname/recalc'))), 'warning');
+ }
+
$form = array();
// Get the list of modules we support.
include_once(drupal_get_path('module', 'realname') .'/realname_supported.inc');
@@ -183,6 +209,10 @@
}
}
}
+
+ // mark form for realname recalculation
+ variable_set('realname_recalculate', TRUE);
+
// We are done with types, so go pick fields.
unset($form_state['storage']);
$form_state['redirect'] = 'admin/user/realname/fields'; // Go get the fields now.
@@ -190,6 +220,11 @@
}
function realname_admin_fields() {
+ // Show rebuild warning
+ if (variable_get('realname_recalculate', FALSE)) {
+ drupal_set_message(t('In order to apply new settings you need to rebuild your realnames', array('!rebuild' => url('admin/user/realname/recalc'))), 'warning');
+ }
+
$form = array();
$current = variable_get('realname_fields', array());
$module = variable_get('realname_profile_module', NULL);
@@ -325,6 +360,36 @@
variable_set('realname_pattern', $form_state['values']['realname_pattern']);
variable_set('realname_homepage', $form_state['values']['realname_homepage']);
variable_set('realname_nofollow', $form_state['values']['realname_nofollow']);
-
+
+ // mark realnames for recalculation
+ variable_set('realname_recalculate', TRUE);
+
drupal_set_message(t('Configuration has been updated.'), 'status');
}
+
+/**
+ * Real names rebuild (in case of config change) handlers
+ */
+
+/**
+ * Menu callback: confirm rebuilding of realnames.
+ */
+function realname_rebuild_confirm() {
+ return confirm_form(array(), t('Are you sure you want to rebuild the realnames for all site users?'),
+ 'admin/user/realname', t('This action rebuilds realnames for all users , and may be a lengthy process. This action cannot be undone.'), t('Rebuild realnames'), t('Cancel'));
+}
+
+/**
+ * Handler for rebuild confirmation
+ */
+function realname_rebuild_confirm_submit($form, &$form_state) {
+ $batch = array(
+ 'title' => t('Rebuilding realnames'),
+ 'operations' => array(
+ array('_realname_rebuild_realnames', array()),
+ ),
+ 'finished' => '_realname_rebuild_batch_finished'
+ );
+ batch_set($batch);
+}
+
=== modified file 'realname.install'
--- realname.install 2009-03-08 09:22:40 +0000
+++ realname.install 2009-03-08 09:23:15 +0000
@@ -11,6 +11,30 @@
//********************************************************************
//* Drupal Hooks
//********************************************************************
+/**
+ * Implementation of hook_schema().
+ */
+function realname_schema() {
+ $schema['realname_calculated_realname'] = array(
+ 'fields' => array(
+ 'uid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+ 'realname' => array('type' => 'varchar', 'length' => '255', 'not null' => TRUE),
+ ),
+ 'primary key' => array('uid'),
+ 'indexes' => array(
+ 'realname' => array('realname')
+ ),
+ );
+ return $schema;
+}
+
+/**
+ * Implementation of hook_install().
+ */
+function realname_install() {
+ drupal_install_schema('realname');
+}
+
/**
* Implementation of hook_enable().
@@ -34,6 +58,8 @@
variable_del('realname_profile_module');
variable_del('realname_profile_type');
variable_del('realname_theme');
+
+ drupal_uninstall_schema('realname');
}
/**
@@ -71,3 +97,40 @@
return $ret;
}
+
+/**
+ * Implementation of hook_update_N().
+ */
+function realname_update_6102() {
+ $ret = array();
+ $table = array(
+ 'fields' => array(
+ 'uid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+ 'realname' => array('type' => 'varchar', 'length' => '255', 'not null' => TRUE),
+ ),
+ 'primary key' => array('uid'),
+ 'indexes' => array(
+ 'realname' => array('realname')
+ ),
+ );
+ // 1. Create new table
+ db_create_table($ret, 'realname_calculated_realname', $table);
+ // 2. Populate table using current settings
+ // @TODO: User processing can take quite long. We probably need to use BATCH API
+ $module = variable_get('realname_profile_module' , null);
+ if ($module) {
+ include_once(drupal_get_path('module', 'realname') .'/realname.module');
+ $query = "SELECT u.uid, u.name, u.mail FROM {users} u";
+ $result = db_query($query);
+ while ($row = db_fetch_object($result)) {
+ $realname = _realname_make_name($row);
+ db_query("INSERT INTO {realname_calculated_realname} (uid, realname) VALUES(%d, '%s')", $row->uid, $realname);
+ }
+ $ret[] = array('success' => TRUE, 'query' => t('Realnames has been recalculated'));
+ }
+ else {
+ drupal_set_message(t('Realname module has been updated. In order to start using it you have to select profile module to be used'), 'warning');
+ }
+
+ return $ret;
+}
=== modified file 'realname.module'
--- realname.module 2009-03-08 09:22:40 +0000
+++ realname.module 2009-03-08 09:23:15 +0000
@@ -18,7 +18,12 @@
//********************************************************************
//* Drupal Hooks
//********************************************************************/
-
+/**
+ * Views API implementation
+ */
+function realname_views_api() {
+ return array('api' => 2.0);
+}
/**
* Implementation of hook_help().
*/
@@ -38,16 +43,16 @@
* Implementation of hook_theme().
*/
function realname_theme() {
- return array(
- 'realname_admin_levels' => array(
- 'arguments' => array('form' => NULL),
- 'file' => 'realname.admin.inc',
- ),
- 'realname_new_role' => array(
- 'arguments' => array('form' => NULL),
- 'file' => 'realname_theme.inc',
- ),
- );
+ return array(
+ 'realname_admin_levels' => array(
+ 'arguments' => array('form' => NULL),
+ 'file' => 'realname.admin.inc',
+ ),
+ 'realname_new_role' => array(
+ 'arguments' => array('form' => NULL),
+ 'file' => 'realname_theme.inc',
+ ),
+ );
}
/**
@@ -69,8 +74,8 @@
'description' => "Configure which fields are used to create a user's RealName.",
'access arguments' => array('administer users'),
'page callback' => 'realname_admin_settings',
+ 'file' => 'realname.admin.inc',
'type' => MENU_NORMAL_ITEM,
- 'file' => 'realname.admin.inc',
);
$items['admin/user/realname/fields'] = array(
@@ -112,6 +117,25 @@
'file' => 'realname.admin.inc',
'weight' => 6,
);
+
+ $items['admin/user/realname/recalc'] = array(
+ 'title' => 'Recalculate names',
+ 'access arguments' => array('administer users'),
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('realname_rebuild_confirm'),
+ 'type' => MENU_LOCAL_TASK,
+ 'file' => 'realname.admin.inc',
+ 'weight' => 8,
+ );
+
+ // Path is not admin/build/views due to menu complications with the wildcards from
+ // the generic ajax callback.
+ $items['admin/user/realname/ajax/autocomplete/user'] = array(
+ 'page callback' => 'realname_ajax_autocomplete_user',
+ 'access callback' => 'user_access',
+ 'access arguments' => array('access content'),
+ 'type' => MENU_CALLBACK,
+ );
return $items;
}
@@ -237,17 +261,16 @@
$theme_registry['user_admin_new_role']['file'] = $path .'/realname_theme.inc';
$theme_registry['user_admin_new_role']['theme path'] = $path;
$theme_registry['user_admin_new_role']['theme paths'][0] = $path;
-
$theme_registry['user_picture']['theme path'] = $path;
$theme_registry['user_picture']['theme paths'][0] = $path;
foreach ($theme_registry['user_picture']['preprocess functions'] as $key => $value) {
if ($value == 'template_preprocess_user_picture') {
$theme_registry['user_picture']['preprocess functions'][$key] = 'template_preprocess_user_picture_realname';
}
- }
+ }
}
}
-
+
/**
* Process variables for user-picture.tpl.php (copied from user.module).
*/
@@ -261,7 +284,7 @@
elseif (variable_get('user_picture_default', '')) {
$picture = variable_get('user_picture_default', '');
}
-
+
if (isset($picture)) {
$account->name = isset($account->realname) ? $account->realname : realname_make_name($account);
$name = $account->name ? $account->name : variable_get('anonymous', t('Anonymous'));
@@ -271,7 +294,7 @@
$attributes = array('attributes' => array('title' => t('View user profile.')), 'html' => TRUE);
$variables['picture'] = l($variables['picture'], "user/$account->uid", $attributes);
}
- }
+ }
}
}
@@ -279,16 +302,29 @@
* Implementation of hook_user().
*/
function realname_user($op, &$edit, &$account, $category = NULL) {
- if ($op == 'load') {
- $account->realname = realname_make_name($account);
+ switch ($op) {
+ case 'load':
+ $account->realname = realname_make_name($account);
- // If theme then replace name with realname.
- if (variable_get('realname_theme', TRUE) && $account->realname) {
- //Store it for places where it needed
- if (!isset($account->realname_save) && is_object($account)) {
- $account->realname_save = $account->name;
- }
- }
+ // If theme then replace name with realname.
+ if (variable_get('realname_theme', TRUE) && $account->realname) {
+ //Store it for places where it needed
+ if (!isset($account->realname_save) && is_object($account)) {
+ $account->realname_save = $account->name;
+ }
+ }
+ break;
+ case 'delete':
+ db_query("DELETE FROM {realname_calculated_realname} WHERE uid=%d", $account->uid);
+ break;
+ case 'insert':
+ case 'after_update':
+ $realname->uid = $account->uid;
+ $realname->realname = _realname_make_name($account);
+ // try to update, if fail - try to insert
+ if (!drupal_write_record('realname_calculated_realname', $realname, 'uid')) {
+ drupal_write_record('realname_calculated_realname', $realname);
+ }
}
}
@@ -302,6 +338,23 @@
return;
}
+ // NickSI: Yes, we will have another switch later but I would like to separate table update with other processing
+ if ( variable_get('realname_profile_module', NULL) == 'content_profile' &&
+ is_content_profile($node->type)) { // do realnames table update if content_profile has been changed
+ switch ($op) {
+ case 'update':
+ case 'insert':
+ case 'delete':
+ $realname->uid = $account->uid;
+ $realname->realname = _realname_make_name($account);
+ // try to update, if fail - try to insert
+ if (!drupal_write_record('realname_calculated_realname', $realname, 'uid')) {
+ drupal_write_record('realname_calculated_realname', $realname);
+ }
+ }
+ }
+
+
if (!variable_get('realname_nodeapi', FALSE)) {
return;
}
@@ -359,7 +412,6 @@
else {
$users[$comment->uid] = $account = realname_get_user($comment->uid);
}
-
$comment->homepage = isset($account->homepage) ? $account->homepage : NULL;
}
break;
@@ -390,7 +442,6 @@
if (!user_access('use realname')) {
return;
}
-// drupal_set_message($form_id);
$bypass_forms = variable_get('realname_bypass_forms', array(array('name' => 'comment_form', 'fields' => array('name'))));
foreach ($bypass_forms as $bypass) {
@@ -434,17 +485,17 @@
'#default_value' => $pic,
'#title' => t('User level image'),
'#description' => t('This image will be shown when the user name is themed.
- It can be used to show special attributes or user participation level.'),
+ It can be used to show special attributes or user participation level.'),
'#field_suffix' => empty($pic) ? '' : '
',
);
-
+
$form['submit']['#weight'] = 98;
$form['delete']['#weight'] = 99;
$form['#submit'][] = '_realname_role_submit';
break;
// case 'user_admin_new_role': // See http://drupal.org/node/392156
-// drupal_set_message(show_array($form));
+// drupal_set_message(show_array($form));
}
}
@@ -454,38 +505,62 @@
function _realname_role_submit($form, &$form_state) {
$rid = $form_state['values']['rid'];
$pic = $form_state['values']['level'];
-// variable_set('realname_user_level_'. $rid, $pic);
- drupal_set_message("realname_user_level_$rid => '$pic'");
+ variable_set('realname_user_level_'. $rid, $pic);
+ drupal_set_message("realname_user_level_$rid => '$pic'");
}
//********************************************************************
//* Module Functions
//********************************************************************
-
/**
- * Using selected fields, build the "real name" field in the object.
+ * Retreive calculated user name. Try static cache first, DB next and on failure call
+ * helper function to calculate realname and populate DB
*
* @param
* $account - the user object to update.
*
* @return
- * The constructed "real name" string.
- */
+ * The retreived "real name" string.
+ */
function realname_make_name(&$account) {
- static $fields, $pattern_saved, $homepage, $use_theme, $type, $module, $profile_privacy;
static $users = array();
- static $links = array();
- static $edit = array();
-
// Return anonymous user right away.
if ($account->uid == 0) {
return $account->name;
}
-
+
+ // Check static cache first
if (isset($users[$account->uid])) {
$account->homepage = isset($links[$account->uid]) ? $links[$account->uid] : NULL;
return $users[$account->uid];
}
+ // Check DB next
+ $query = "SELECT realname from {realname_calculated_realname} WHERE uid=%d";
+ $result = db_result(db_query($query, $account->uid));
+
+ if ($result) { // we've succeed
+ return $result;
+ }
+
+ $result = _realname_make_name($account);
+ db_query("INSERT INTO {realname_calculated_realname} (uid, realname) VALUES(%d, '%s')", $account->uid, $result);
+ return $result;
+}
+
+/**
+ * Helper function for realname_make_name. Using selected fields, build the "real name" field in the object.
+ *
+ * @param
+ * $account - the user object to update.
+ *
+ * @return
+ * The constructed "real name" string.
+ */
+function _realname_make_name(&$account) {
+ static $fields, $pattern_saved, $homepage, $use_theme, $type, $module, $profile_privacy;
+ static $users = array();
+ static $links = array();
+ static $edit = array();
// Get our controlling variables (static makes it once per page load).
if (!isset($fields)) {
@@ -587,3 +662,76 @@
return $ret;
}
+
+/**
+* Page callback for user autocomplete
+*/
+function realname_ajax_autocomplete_user($string = '') {
+ // The user enters a comma-separated list of tags. We only autocomplete the last tag.
+ $array = drupal_explode_tags($string);
+
+ // Fetch last tag
+ $last_string = trim(array_pop($array));
+ $matches = array();
+ if ($last_string != '') {
+ $prefix = count($array) ? implode(', ', $array) . ', ' : '';
+
+ if (strpos('anonymous', strtolower($last_string)) !== FALSE) {
+ $matches[$prefix . 'Anonymous'] = 'Anonymous';
+ }
+ $result = db_query_range("SELECT realname FROM {realname_calculated_realname} WHERE LOWER(realname) LIKE LOWER('%s%%')", $last_string, 0, 10);
+
+ while ($account = db_fetch_object($result)) {
+ $n = $account->realname;
+ // Commas and quotes in terms are special cases, so encode 'em.
+ if (strpos($account->realname, ',') !== FALSE || strpos($account->realname, '"') !== FALSE) {
+ $n = '"' . str_replace('"', '""', $account->realname) . '"';
+ }
+ $matches[$prefix . $n] = check_plain($account->realname);
+ }
+ }
+
+ drupal_json($matches);
+}
+
+/**
+ * Batchable function used to rebuild realnames
+ * Batch API does not for some reason pick'em up in realname.admin.inc
+ */
+function _realname_rebuild_realnames(&$context) {
+ if (empty($context['sandbox'])) {
+ // Initiate multistep processing.
+ $context['sandbox']['progress'] = 0;
+ $context['sandbox']['current_user'] = 0;
+ $context['sandbox']['max'] = db_result(db_query('SELECT COUNT(DISTINCT uid) FROM {users}'));
+ }
+ // Process the next 20 users.
+ $limit = 20;
+ $result = db_query_range("SELECT u.uid, u.name, u.mail FROM {users} u WHERE uid >= %d ORDER BY uid ASC", $context['sandbox']['current_user'], 0, $limit);
+ while ($row = db_fetch_object($result)) {
+ $realname->uid = $row->uid;
+ $realname->realname = _realname_make_name($row);
+ // try to update, if fail - try to insert
+ if (!drupal_write_record('realname_calculated_realname', $realname, 'uid')) {
+ drupal_write_record('realname_calculated_realname', $realname);
+ }
+ $context['sandbox']['progress']++;
+ $context['sandbox']['current_user'] = $row->uid;
+ }
+
+ // Multistep processing : report progress.
+ if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
+ $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
+ }
+}
+
+function _realname_rebuild_batch_finished($success, $results, $operations) {
+ if ($success) {
+ drupal_set_message(t('The realnames have been rebuilt.'));
+ variable_set('realname_recalculate', FALSE);
+ drupal_goto('admin/user/realname');
+ }
+ else {
+ drupal_set_message(t('The realanmes have not been properly rebuilt.'), 'error');
+ }
+}
=== added file 'realname.views.inc'
--- realname.views.inc 1970-01-01 00:00:00 +0000
+++ realname.views.inc 2009-03-08 09:23:15 +0000
@@ -0,0 +1,98 @@
+ array(
+ 'group' => t('Realname'),
+ 'join' => array(
+ 'users' => array (
+ 'field' => 'uid',
+ 'left_field' => 'uid'
+ )
+ ),
+ ),
+ 'uid' => array(
+ 'title' => t('Uid'),
+ 'help' => t('The user ID'), // The help that appears on the UI,
+ 'argument' => array(
+ 'handler' => 'realname_handler_argument_user_uid',
+ ),
+ 'filter' => array(
+ 'title' => t('User Realname'),
+ 'handler' => 'realname_handler_filter_user_name',
+ ),
+ 'sort' => array(
+ 'handler' => 'views_handler_sort',
+ ),
+ ),
+ 'realname' => array(
+ 'title' => t('Name'), // The item it appears as on the UI,
+ 'help' => t('The user or author name.'), // The help that appears on the UI,
+ 'field' => array(
+ 'handler' => 'realname_handler_field_user_name',
+ 'click sortable' => TRUE,
+ ),
+ 'sort' => array(
+ 'handler' => 'views_handler_sort',
+ ),
+ 'argument' => array(
+ 'handler' => 'views_handler_argument_string',
+ ),
+ ),
+ );
+
+ return $tables;
+}
+
+/**
+ * Implementation of hook_views_plugins
+ */
+function realname_views_plugins() {
+ return array(
+ 'argument validator' => array(
+ 'user_realname' => array(
+ 'title' => t('User (realname)'),
+ 'handler' => 'realname_plugin_argument_validate_user',
+ 'parent' => 'user',
+ ),
+ ),
+ );
+}
+
+/**
+ * Define all realname views handlers
+ *
+ **/
+function realname_views_handlers() {
+ return array(
+ 'info' => array(),
+ 'handlers' => array(
+ 'realname_handler_field_user_name' => array(
+ 'parent' => 'views_handler_field_user_name',
+ ),
+ 'realname_handler_argument_user_uid' => array(
+ 'parent' => 'views_handler_argument_user_uid',
+ ),
+ 'realname_handler_filter_user_name' => array(
+ 'parent' => 'views_handler_filter_user_name',
+ ),
+ 'realname_handler_field_user_name_override' => array(
+ 'parent' => 'views_handler_field_user_name',
+ ),
+ )
+ );
+}
\ No newline at end of file
=== added file 'realname_handler_argument_user_uid.inc'
--- realname_handler_argument_user_uid.inc 1970-01-01 00:00:00 +0000
+++ realname_handler_argument_user_uid.inc 2009-03-08 09:23:15 +0000
@@ -0,0 +1,25 @@
+argument) {
+ return array(variable_get('anonymous', t('Anonymous')));
+ }
+
+ $titles = array();
+ $placeholders = implode(', ', array_fill(0, sizeof($this->value), '%d'));
+
+ $result = db_query("SELECT ru.realname FROM {users} u LEFT JOIN {realname_calculated_realname} ru ON u.uid = ru.uid WHERE u.uid IN ($placeholders)", $this->value);
+ while ($term = db_fetch_object($result)) {
+ $titles[] = check_plain($term->realname);
+ }
+ return $titles;
+ }
+}
\ No newline at end of file
=== added file 'realname_handler_field_user_name.inc'
--- realname_handler_field_user_name.inc 1970-01-01 00:00:00 +0000
+++ realname_handler_field_user_name.inc 2009-03-08 09:23:15 +0000
@@ -0,0 +1,30 @@
+additional_fields['realname'] = 'realname';
+ }
+
+ function render_link($data, $values) {
+ if (!empty($this->options['link_to_user']) || !empty($this->options['overwrite_anonymous'])) {
+ $account = new stdClass();
+ $account->uid = $values->{$this->aliases['uid']};
+ if (!empty($this->options['overwrite_anonymous']) && !$account->uid) {
+ // This is an anonymous user, and we're overriting the text.
+ return check_plain($this->options['anonymous_text']);
+ }
+ elseif (!empty($this->options['link_to_user'])) {
+ $account->name = $values->{$this->field_alias};
+ return theme('username', $account);
+ }
+ }
+ // Otherwise, there's no special handling, so return the data directly.
+ return $values->{$this->aliases['realname']};
+ }
+
+}
\ No newline at end of file
=== added file 'realname_handler_field_user_name_override.inc'
--- realname_handler_field_user_name_override.inc 1970-01-01 00:00:00 +0000
+++ realname_handler_field_user_name_override.inc 2009-03-08 09:23:15 +0000
@@ -0,0 +1,31 @@
+additional_fields['uid'] = 'uid';
+ }
+
+ function render_link($data, $values) {
+ $account = new stdClass();
+ $account->uid = $values->{$this->aliases['uid']};
+ $account->name = $values->{$this->field_alias};
+
+ if (!empty($this->options['link_to_user']) || !empty($this->options['overwrite_anonymous'])) {
+ if (!empty($this->options['overwrite_anonymous']) && !$account->uid) {
+ // This is an anonymous user, and we're overriting the text.
+ return check_plain($this->options['anonymous_text']);
+ }
+ elseif (!empty($this->options['link_to_user'])) {
+ return theme('username', $account);
+ }
+ }
+ // Otherwise, there's no special handling, so return the data directly.
+ return realname_make_name($account);
+ }
+
+}
\ No newline at end of file
=== added file 'realname_handler_filter_user_name.inc'
--- realname_handler_filter_user_name.inc 1970-01-01 00:00:00 +0000
+++ realname_handler_filter_user_name.inc 2009-03-08 09:23:15 +0000
@@ -0,0 +1,96 @@
+value) {
+ $result = db_query("SELECT u.*, ru.realname FROM {users} u LEFT JOIN {realname_calculated_realname} ru ON ru.uid=u.uid WHERE u.uid IN (" . implode(', ', $this->value) . ")");
+ while ($account = db_fetch_object($result)) {
+ if ($account->uid) {
+ $values[] = $account->realname;
+ }
+ else {
+ $values[] = 'Anonymous'; // Intentionally NOT translated.
+ }
+ }
+ }
+
+ sort($values);
+ $default_value = implode(', ', $values);
+ $form['value'] = array(
+ '#type' => 'textfield',
+ '#title' => t('Realnames'),
+ '#description' => t('Enter a comma separated list of user real names.'),
+ '#default_value' => $default_value,
+ '#autocomplete_path' => 'admin/user/realname/ajax/autocomplete/user',
+ );
+
+ if (!empty($form_state['exposed']) && !isset($form_state['input'][$this->options['expose']['identifier']])) {
+ $form_state['input'][$this->options['expose']['identifier']] = $default_value;
+ }
+ }
+
+ /**
+ * Validate the user string. Since this can come from either the form
+ * or the exposed filter, this is abstracted out a bit so it can
+ * handle the multiple input sources.
+ */
+ function validate_user_strings(&$form, $values) {
+ $uids = array();
+ $placeholders = array();
+ $args = array();
+ $results = array();
+ foreach ($values as $value) {
+ if (strtolower($value) == 'anonymous') {
+ $uids[] = 0;
+ }
+ else {
+ $missing[strtolower($value)] = TRUE;
+ $args[] = $value;
+ $placeholders[] = "'%s'";
+ }
+ }
+
+ if (!$args) {
+ return $uids;
+ }
+
+ $result = db_query("SELECT u.*, ru.realname FROM {users} u LEFT JOIN {realname_calculated_realname} ru ON ru.uid=u.uid WHERE ru.realname IN (" . implode(', ', $placeholders) . ")", $args);
+ while ($account = db_fetch_object($result)) {
+ unset($missing[strtolower($account->realname)]);
+ $uids[] = $account->uid;
+ }
+
+ if ($missing) {
+ form_error($form, format_plural(count($missing), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', array_keys($missing)))));
+ }
+
+ return $uids;
+ }
+
+ function admin_summary() {
+ // set up $this->value_options for the parent summary
+ $this->value_options = array();
+
+ if ($this->value) {
+ $result = db_query("SELECT u.*, ru.realname FROM {users} u LEFT JOIN {realname_calculated_realname} ru ON ru.uid=u.uid WHERE u.uid IN (" . implode(', ', $this->value) . ")");
+
+ while ($account = db_fetch_object($result)) {
+ if ($account->uid) {
+ $this->value_options[$account->uid] = $account->realname;
+ }
+ else {
+ $this->value_options[$account->uid] = 'Anonymous'; // Intentionally NOT translated.
+ }
+ }
+ }
+
+ return parent::admin_summary();
+ }
+}
=== added file 'realname_plugin_argument_validate_user.inc'
--- realname_plugin_argument_validate_user.inc 1970-01-01 00:00:00 +0000
+++ realname_plugin_argument_validate_user.inc 2009-03-08 09:23:15 +0000
@@ -0,0 +1,16 @@
+argument->validated_title = realname_make_name($account);
+ return TRUE;
+ }
+}
+