From b63745ddd6c1d5c92cd291adab75470f585d70d4 Wed, 10 Oct 2012 02:44:26 +0200
From: hass <hass@85918.no-reply.drupal.org>
Date: Wed, 10 Oct 2012 02:44:08 +0200
Subject: [PATCH] #1722112: Autocomplete for entityreference fields

diff --git a/realname.module b/realname.module
index f4f4293..c5b77aa 100644
--- a/realname.module
+++ b/realname.module
@@ -40,11 +40,28 @@
 
   $items['realname/autocomplete'] = array(
     'page callback' => 'realname_autocomplete',
+    'page arguments' => array('', '', 2),
     'access arguments' => array('access user profiles'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['realname/autocomplete/%/%/%'] = array(
+    'page callback' => 'realname_autocomplete',
+    'page arguments' => array(2, 3, 4),
+    'access callback' => 'realname_autocomplete_access_callback',
+    'access arguments' => array(2, 3, 4),
     'type' => MENU_CALLBACK,
   );
 
   return $items;
+}
+
+/**
+ * Implements hook_menu_alter() to replace user autocomplete with realname autocomplete.
+ */
+function realname_menu_alter(&$items) {
+  // Implement realname autocomplete.
+  $items['user/autocomplete']['page callback'] = 'realname_autocomplete';
+  $items['user/autocomplete']['page arguments'] = array('', '', 2);
 }
 
 /**
@@ -142,26 +159,6 @@
   );
 
   return $info;
-}
-
-/**
- * Implements hook_rules_action_info().
- */
-function realname_rules_action_info() {
-  $items['user_realname_update'] = array(
-    'label' => t('Update real name'),
-    'base' => 'realname_action_realname_update',
-    'parameter' => array(
-      'account' => array(
-        'type' => 'user',
-        'label' => t('User'),
-        'save' => FALSE,
-      ),
-    ),
-    'group' => t('User'),
-    'access callback' => 'rules_user_integration_access',
-  );
-  return $items;
 }
 
 /**
@@ -308,22 +305,88 @@
  * Menu callback; Retrieve a JSON object containing autocomplete suggestions
  * for existing users based on their generated real names.
  */
-function realname_autocomplete($string = '') {
+function realname_autocomplete($field_name, $entity_type, $bundle_name, $string = '') {
+  $instance = field_info_instance($entity_type, $field_name, $bundle_name);
   $matches = array();
 
-  if ($string) {
+  // User entityreference autocomplete fields.
+  if ($instance['widget']['type'] == 'entityreference_autocomplete' && $string) {
     $query = db_select('users', 'u');
     $query->leftJoin('realname', 'rn', 'u.uid = rn.uid');
-    $query->fields('u', array('uid'));
-    $query->condition('rn.realname', db_like($string) . '%', 'LIKE');
+    $query->fields('u', array('uid', 'name'));
+    if ($instance['widget']['settings']['match_operator'] == 'CONTAINS') {
+      $query->condition(db_or()
+        ->condition('rn.realname', '%' . db_like($string) . '%', 'LIKE')
+        ->condition('u.name', '%' . db_like($string) . '%', 'LIKE')
+      );
+    }
+    else {
+      $query->condition(db_or()
+        ->condition('rn.realname', db_like($string) . '%', 'LIKE')
+        ->condition('u.name', db_like($string) . '%', 'LIKE')
+      );
+    }
     $query->range(0, 10);
     $uids = $query->execute()->fetchCol();
     $accounts = user_load_multiple($uids);
 
     foreach ($accounts as $account) {
-      $matches[$account->name] = format_username($account);
+      $matches[t('!account (@uid)', array('!account' => format_username($account), '@uid' => $account->uid))] = t('!realname (@username)', array('!realname' => format_username($account), '@username' => $account->name));
+    }
+  }
+  // User autocomplete fields.
+  elseif ($string) {
+    $query = db_select('users', 'u');
+    $query->leftJoin('realname', 'rn', 'u.uid = rn.uid');
+    $query->fields('u', array('uid', 'name'));
+    $query->condition(db_or()
+      ->condition('rn.realname', db_like($string) . '%', 'LIKE')
+      ->condition('u.name', db_like($string) . '%', 'LIKE')
+    );
+    $query->range(0, 10);
+    $uids = $query->execute()->fetchCol();
+    $accounts = user_load_multiple($uids);
+
+    foreach ($accounts as $account) {
+      $matches[$account->name] = t('!realname (@username)', array('!realname' => format_username($account), '@username' => $account->name));
     }
   }
 
   drupal_json_output($matches);
 }
+
+/**
+ * Implements hook_widget_form_alter().
+ *
+ * Overrides entityreference autocomplete fields that point to an entity
+ * of type 'user'.
+ */
+function realname_field_widget_form_alter(&$element, &$form_state, $context) {
+  if ($context['field']['type'] == 'entityreference') {
+    if ($context['field']['settings']['target_type'] == 'user') {
+      $element['target_id']['#autocomplete_path'] = 'realname/autocomplete/' . $context['field']['field_name'] . '/' . $context['instance']['entity_type'] . '/' . $context['instance']['bundle'];
+    }
+  }
+}
+
+/**
+ * Menu Access callback for the autocomplete widget.
+ *
+ * @param $field_name
+ *   The name of the entity-reference field.
+ * @param $entity_type
+ *   The entity type.
+ * @param $bundle_name
+ *   The bundle name.
+ * @return
+ *   True if user can access this menu item.
+ */
+function realname_autocomplete_access_callback($field_name, $entity_type, $bundle_name) {
+  $field = field_info_field($field_name);
+  $instance = field_info_instance($entity_type, $field_name, $bundle_name);
+
+  if (!$field || !$instance || $field['type'] != 'entityreference' || !field_access('edit', $field, $entity_type)) {
+    return FALSE;
+  }
+  return TRUE;
+}
