'Name Database', 'page callback' => 'namedb_list_names', 'description' => 'List and configure the name database.', 'access arguments' => array('administer site configuration'), 'file' => 'namedb.admin.inc', 'type' => MENU_LOCAL_TASK, ); $items['admin/config/regional/name/namedb/list'] = array( 'title' => 'List', 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10, ); $items['admin/config/regional/name/namedb/add'] = array( 'title' => 'Add a name', 'page callback' => 'drupal_get_form', 'page arguments' => array('namedb_name_form'), 'access arguments' => array('administer site configuration'), 'file' => 'namedb.admin.inc', 'type' => MENU_LOCAL_TASK, ); $items['admin/config/regional/name/namedb/settings'] = array( 'title' => 'Settings', 'page callback' => 'drupal_get_form', 'page arguments' => array('namedb_admin_settings_form'), 'description' => 'Administer the Names Database settings.', 'access arguments' => array('administer site configuration'), 'file' => 'namedb.admin.inc', 'type' => MENU_LOCAL_TASK, 'weight' => 10, ); $items['admin/config/regional/name/namedb/import'] = array( 'title' => 'Import', 'page callback' => 'drupal_get_form', 'page arguments' => array('namedb_import_form'), 'description' => 'Input data into the Names Database.', 'access arguments' => array('administer site configuration'), 'file' => 'namedb.admin.inc', 'type' => MENU_LOCAL_TASK, ); $items['admin/config/regional/name/namedb/%'] = array( 'title' => 'Edit name', 'page callback' => 'namedb_name_edit', 'page arguments' => array(5), 'access arguments' => array('administer site configuration'), 'file' => 'namedb.admin.inc', 'type' => MENU_CALLBACK, ); $items['admin/config/regional/name/namedb/%/delete'] = array( 'title' => 'Delete name', 'page callback' => 'drupal_get_form', 'page arguments' => array('namedb_name_delete_form', 5), 'access arguments' => array('administer site configuration'), 'file' => 'namedb.admin.inc', 'type' => MENU_CALLBACK, ); return $items; } /** * The core settings used by the module. */ function namedb_settings() { $settings = variable_get('namedb_settings', array()); $settings += array( 'user_data' => array( 'minimum_length' => 3, 'hyphenated' => 0, 'passed' => array( 'insert' => TRUE, 'status' => 1, 'banned' => 0, ), 'failed' => array( 'insert' => TRUE, 'status' => 0, 'banned' => 0, ), ), 'imports' => array( 'minimum_length' => 2, 'hyphenated' => 0, 'passed' => array( 'insert' => TRUE, 'status' => 1, 'banned' => 0, ), 'failed' => array( 'insert' => FALSE, 'status' => 0, 'banned' => 0, ), ), ); return $settings; } /** * This callback is called by Name Field to insert names into the database. */ function namedb_update_database($components, $name, $abbr = '', $data_key = 'user_data', $weight = NULL) { $components = (array) $components; $settings = namedb_settings(); $settings = $settings[$data_key]; // No insertion allowed! $enabled = ($settings['passed']['insert'] || $settings['failed']['insert']); if (!$enabled) { return FALSE; } $clean = array_intersect($components, array('family', 'given')); if ($clean) { // Handles the API change from Name Field 7.x-1.4 to 7.x-1.5 that was // required after implementing theme_name_component(). $func = function_exists('name_clean_name_component') ? 'name_clean_name_component' : 'name_process_name_component'; $cleaned_name = name_clean_name_component($name, $data_key); } else { $cleaned_name = trim($name); } if (($cleaned_name && $settings['passed']['insert']) || (!$cleaned_name&& $settings['failed']['insert'])) { // Use the cleaned name when possible. $name = $cleaned_name ? $cleaned_name : $name; $ndbid = db_select('name_database', 'ndb') ->fields('ndb', array('ndbid')) ->condition('ndb.name', db_like($name), 'LIKE') ->execute()->fetchField(); $record = array(); foreach ($components as $component) { $record[$component] = 1; } if ($weight !== NULL) { $record['weight'] = $weight; } // Only applicable to title, etc, but open to other uses. $abbr = trim($abbr); if (!empty($abbr)) { $record['abbr'] = $abbr; } if ($ndbid) { $record['ndbid'] = $ndbid; drupal_write_record('name_database', $record, array('ndbid')); } else { $record['name'] = $name; $record['normalized'] = strtoupper(name_translite_word($name)); $insert_options = $cleaned_name ? $settings['passed'] : $settings['failed']; unset($insert_options['insert']); foreach ($settings as $key => $value) { $record[$key] = $value; } drupal_write_record('name_database', $record); } return TRUE; } return FALSE; } function namedb_query_names($string, $component, $attributes = array()) { $matches = array(); // By default unpublished and banned names are not included. $attributes += array( 'status' => 1, 'banned' => 0, ); $select = db_select('name_database')->fields('name_database', array('name', 'normalized')) ->orderBy('weight', 'ASC'); if ($string) { $condition = db_or()->condition('name', db_like($string) . '%', 'LIKE') ->condition('name', db_like($string), 'LIKE'); $select->condition($condition); } if (!empty($component)) { $components = drupal_map_assoc((array) $component); $condition = db_or(); if (isset($components['middle'])) { $components['given'] = 'given'; unset($components['middle']); } foreach ($components as $component) { $condition->condition($component, 1, '='); } $select->condition($condition); } if (isset($attributes['status']) && !is_null($attributes['status'])) { $select->condition('status', $attributes['status'], '='); } if (isset($attributes['banned']) && !is_null($attributes['banned'])) { $select->condition('banned', $attributes['banned'], '='); } // Supports custom offset and limit as required. $limit = isset($attributes['limit']) && $attributes['limit'] > 0 ? $attributes['limit'] : 25; $offset = isset($attributes['offset']) && $attributes['offset'] >= 0 ? $attributes['offset'] : 0; $select->range($offset, $limit); $result = $select->execute(); foreach ($result as $user) { $matches[$user->name] = check_plain($user->normalized); } asort($matches); return drupal_map_assoc(array_keys($matches)); }