From fc4576333de3114245fb82be7116f0f90af628e5 Sun, 16 Sep 2012 16:54:37 +0200
From: hass <hass@85918.no-reply.drupal.org>
Date: Sun, 16 Sep 2012 16:54:19 +0200
Subject: [PATCH] #1722112: Autocomplete for entityreference fields

diff --git a/realname.module b/realname.module
index f4f4293..9d91a96 100644
--- a/realname.module
+++ b/realname.module
@@ -43,6 +43,12 @@
     'access arguments' => array('access user profiles'),
     'type' => MENU_CALLBACK,
   );
+  $items['realname/autocomplete/%'] = array(
+    'page callback' => 'realname_autocomplete',
+    'page arguments' => array(3, 2),
+    'access arguments' => array('access user profiles'),
+    'type' => MENU_CALLBACK,
+  );
 
   return $items;
 }
@@ -307,23 +313,58 @@
 /**
  * Menu callback; Retrieve a JSON object containing autocomplete suggestions
  * for existing users based on their generated real names.
+ *
+ * @param string $string
+ *   An search string with a real name.
+ *
+ * @param string $match_operator
+ *   An match operator for the search e.g. 'contains'.
  */
-function realname_autocomplete($string = '') {
+function realname_autocomplete($string = '', $match_operator = 'starts_with') {
   $matches = array();
 
   if ($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');
+
+    if ($match_operator == 'contains') {
+      // Search for realname with type 'contains'.
+      $query->condition('rn.realname', '%' . db_like($string) . '%', 'LIKE');
+    }
+    else {
+      // By default search for realname with type 'starts_with'.
+      $query->condition('rn.realname', 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))] = format_username($account);
     }
   }
 
   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') {
+      $match_operator = strtolower($context['instance']['widget']['settings']['match_operator']);
+      if ($match_operator == 'contains') {
+        $element['target_id']['#autocomplete_path'] = 'realname/autocomplete/' . $match_operator;
+      }
+      else {
+        $element['target_id']['#autocomplete_path'] = 'realname/autocomplete';
+      }
+    }
+  }
+}
