When creating an order as an admin in Drupal Commerce, we can specify the user that owns the order if we know their user name. This works well in most cases, but to be able to search by the user's e-mail address would be helpful too. I've had a few requests from clients for this feature. So without further ado, let's ado it!
/**
* Implements hook_menu().
*/
function my_module_menu() {
$items = array();
$items['my_module/commerce/order-owner/autocomplete'] = array(
'page callback' => 'my_module_commerce_order_owner_autocomplete',
'access arguments' => array('configure order settings'),
'type' => MENU_CALLBACK
);
return $items;
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function my_module_form_commerce_order_ui_order_form_alter(&$form, &$form_state, $form_id) {
// Attach our custom autocomplete to the order owner name input so we can
// search by e-mail address.
$form['user']['name']['#autocomplete_path'] = 'my_module/commerce/order-owner/autocomplete';
}
/**
* Queries results for the commerce order owner autocomplete.
*/
function my_module_commerce_order_owner_autocomplete($string) {
$matches = array();
$query = db_select('users', 'u');
$query
->fields('u', array('uid', 'name', 'mail'))
->condition(db_or()
->condition("u.mail", '%' . db_like($string) . '%', 'LIKE')
->condition("u.name", '%' . db_like($string) . '%', 'LIKE')
)
->condition('u.uid', 0, '<>')
->range(0, 10);
$results = $query->execute();
foreach ($results as $row) {
$key = "$row->name";
$matches[$key] = "$row->name - $row->mail ($row->uid)";
}
drupal_json_output($matches);
}