TRUE); foreach (array('user_data' => t('User inputed data'), 'imports' => t('Admin imports')) as $data_key => $title) { $form['namedb_settings'][$data_key] = array( '#type' => 'fieldset', '#title' => $title, ); $form['namedb_settings'][$data_key]['minimum_length'] = array( '#type' => 'select', '#title' => t('Minimum length'), '#required' => TRUE, '#options' => drupal_map_assoc(range(1, 10, 1)), '#default_value' => $settings[$data_key]['minimum_length'], ); $form['namedb_settings'][$data_key]['hyphenated'] = array( '#type' => 'checkbox', '#title' => t('Allow hyphenated names to pass the test, (e.g. Lee-Smith)'), '#default_value' => $settings[$data_key]['hyphenated'], ); $pass_defaults = array(); foreach ($settings[$data_key]['passed'] as $key => $value) { if ($value) { $pass_defaults[$key] = $key; } } $form['namedb_settings'][$data_key]['passed'] = array( '#type' => 'checkboxes', '#title' => t('Insertion options for passed results'), '#options' => array( 'insert' => t('Insert the name.'), 'status' => t('Publish inserted the words. Excludes updates.'), 'banned' => t('Ban inserted words. Excludes updates.'), ), '#default_value' => $pass_defaults, '#description' => t('All given and family names go through a simple cleaning function that will fail if the pattern does not meet one of the predefined formats.'), ); $failed_defaults = array(); foreach ($settings[$data_key]['failed'] as $key => $value) { if ($value) { $failed_defaults[$key] = $key; } } $form['namedb_settings'][$data_key]['failed'] = array( '#type' => 'checkboxes', '#title' => t('Insertion options for failed results'), '#options' => array( 'insert' => t('Insert the name.'), 'status' => t('Publish inserted the words. Excludes updates.'), 'banned' => t('Ban inserted words. Excludes updates.'), ), '#default_value' => $failed_defaults, '#description' => t('All given and family names go through a simple cleaning function that will fail if the pattern does not meet one of the predefined formats.'), ); } return system_settings_form($form); } /** * Lists the known names. */ function namedb_list_names($keys = NULL, $components = NULL) { $header = array(); $header[] = array('data' => t('Name'), 'field' => 'name', 'sort' => 'asc'); $header[] = array('data' => t('Abbr.'), 'field' => 'abbr'); $header[] = array('data' => t('Title'), 'field' => 'title'); $header[] = array('data' => t('Given'), 'field' => 'given'); $header[] = array('data' => t('Family'), 'field' => 'family'); $header[] = array('data' => t('Gen.'), 'field' => 'generational'); $header[] = array('data' => t('Cred.'), 'field' => 'credentials'); $header[] = array('data' => t('Status'), 'field' => 'status'); $header[] = array('data' => t('Banned'), 'field' => 'banned'); $header[] = array('data' => t('Operations')); // Add the filter form above the overview table. $build['namedb_filter_form'] = drupal_get_form('namedb_filter_form', $keys, $components); $query = db_select('name_database')->extend('PagerDefault')->extend('TableSort'); if ($keys) { // Replace wildcards with PDO wildcards. $query->condition('name', '%' . preg_replace('!\*+!', '%', $keys) . '%', 'LIKE'); } if ($components) { $components = explode('][', $components); foreach (array('title', 'given', 'family', 'generational', 'credentials', 'banned', 'status') as $component) { if (in_array($component, $components)) { $query->condition($component, 1); } } } $result = $query ->fields('name_database') ->orderByHeader($header) ->limit(50) ->execute(); $rows = array(); $destination = drupal_get_destination(); foreach ($result as $data) { $row = array(); $row['data']['name'] = array('data' => $data->name); $row['data']['abbr'] = array('data' => $data->abbr); $row['data']['title'] = array('data' => $data->title); $row['data']['given'] = array('data' => $data->given); $row['data']['family'] = array('data' => $data->family); $row['data']['generational'] = array('data' => $data->generational); $row['data']['credentials'] = array('data' => $data->credentials); $row['data']['status'] = array('data' => $data->status); $row['data']['banned'] = array('data' => $data->banned); $operations = array(); $operations['edit'] = array( 'title' => t('edit'), 'href' => "admin/config/regional/name/namedb/{$data->ndbid}", 'query' => $destination, ); $operations['delete'] = array( 'title' => t('delete'), 'href' => "admin/config/regional/name/namedb/{$data->ndbid}/delete", 'query' => $destination, ); $row['data']['operations'] = array( 'data' => array( '#theme' => 'links', '#links' => $operations, '#attributes' => array('class' => array('links', 'inline', 'nowrap')), ), ); // Clearly show up banned names. if ($data->banned) { $row['class'] = array('warning'); } $rows[] = $row; } $build['name_table'] = array( '#theme' => 'table', '#header' => $header, '#rows' => $rows, '#empty' => t('No names are available. Add a name.', array('@link' => url('admin/config/regional/name/namedb/add'))), ); $build['name_pager'] = array('#theme' => 'pager'); return $build; } /** * Return a form to filter URL aliases. * * @ingroup forms * @see namedb_filter_form_submit() */ function namedb_filter_form($form, &$form_state, $keys = '', $options = '') { $form['#attributes'] = array('class' => array('search-form')); $form['basic'] = array('#type' => 'fieldset', '#title' => t('Filter names'), //'#attributes' => array('class' => array('container-inline clearfix')), 'buttons' => array( '#weight' => 1, ), ); $form['basic']['filter'] = array( '#type' => 'textfield', '#title' => 'Key words', '#default_value' => $keys, '#maxlength' => 128, '#size' => 25, '#prefix' => '
', '#suffix' => '
', '#autocomplete_path' => 'name/autocomplete/-/name-all', ); $form['basic']['components'] = array( '#type' => 'checkboxes', '#title' => 'Components', '#default_value' => explode('][', $options), '#attributes' => array('class' => array('container-inline')), '#options' => array('title' => t('Title'), 'family' => t('Family'), 'given' => t('Given'), 'generational' => t('Generational'), 'credentials' => t('Credentials'), 'banned' => t('Banned'), 'status' => t('Status')), '#prefix' => '
', '#suffix' => '
', ); $form['basic']['buttons']['submit'] = array( '#type' => 'submit', '#value' => t('Filter'), '#submit' => array('namedb_filter_form_submit_filter'), ); if ($keys || $options) { $form['basic']['buttons']['reset'] = array( '#type' => 'submit', '#value' => t('Reset'), '#submit' => array('namedb_filter_form_submit_reset'), ); } return $form; } /** * Process filter form submission when the Filter button is pressed. */ function namedb_filter_form_submit_filter($form, &$form_state) { $form_state['redirect'] = 'admin/config/regional/name/namedb/list/' . trim($form_state['values']['filter']) . '/' . implode('][', array_filter($form_state['values']['components'])); } /** * Process filter form submission when the Reset button is pressed. */ function namedb_filter_form_submit_reset($form, &$form_state) { $form_state['redirect'] = 'admin/config/regional/name/namedb/list'; } /** * Form callback to edit or add a new name. */ function namedb_name_form($form, $form_state, $edit = array()) { $edit += array( 'ndbid' => NULL, 'name' => '', 'abbr' => '', 'title' => 0, 'given' => 0, 'family' => 0, 'generational' => 0, 'credentials' => 0, 'status' => 1, 'banned' => 0, ); $form = array(); $form['ndbid'] = array( '#type' => 'value', '#value' => $edit['ndbid'], ); $form['name'] = array( '#type' => 'textfield', '#title' => t('Name'), '#default_value' => $edit['name'], '#maxlength' => 255, '#required' => TRUE, ); $form['abbr'] = array( '#title' => t('Abbr.'), '#description' => t('An abbrivation for the name. This is mainly only useful for titles and credentials.'), '#type' => 'textfield', '#default_value' => $edit['abbr'], ); foreach (array('title', 'given', 'family', 'generational', 'credentials') as $component) { $form[$component] = array( '#type' => 'checkbox', '#title' => t('Used for %key.', array('%key' => $component)), '#default_value' => $edit[$component], ); } $form['status'] = array( '#type' => 'checkbox', '#title' => t('Flag that this name should be displayed to users.'), '#default_value' => $edit['status'], ); $form['banned'] = array( '#type' => 'checkbox', '#title' => t('Flag that this name should not be allowed as a name componenet.'), '#default_value' => $edit['banned'], ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Save'), ); if (!empty($edit['ndbid'])) { $form['delete'] = array( '#type' => 'submit', '#value' => t('Delete'), ); } return $form; } /** * Custom validation for namedb_name_form(). */ function namedb_name_form_validate($form, &$form_state) { $values = $form_state['values']; // Ensure that the name is unique if (empty($values['ndbid'])) { $count = db_query_range("SELECT 1 FROM {name_database} WHERE name = :name", 0, 1, array(':name' => $values['name']))->fetchField(); } else { $count = db_query_range("SELECT 1 FROM {name_database} WHERE name = :name AND ndbid <> :ndbid", 0, 1, array(':name' => $values['name'], ':ndbid' => $values['ndbid']))->fetchField(); } if ($count) { form_set_error('name', t('The name you have chosen is already in use.')); } } /** * Submit handler for namedb_name_form(). */ function namedb_name_form_submit($form, &$form_state) { $values = $form_state['values']; $values['normalized'] = strtoupper(name_translite_word($form_state['values']['name'])); if (empty($values['ndbid'])) { drupal_write_record('name_database', $values); $message = 'Name %name has been created.'; } else { drupal_write_record('name_database', $values, 'ndbid'); $message = 'Name %name has been updated.'; } drupal_set_message(t($message, array('%name' => $values['name']))); $form_state['redirect'] = 'admin/config/regional/name/namedb'; } /** * Page to edit a name. */ function namedb_name_edit($ndbid) { if ((isset($_POST['op']) && $_POST['op'] == t('Delete')) || isset($_POST['confirm'])) { return drupal_get_form('namedb_name_delete_form', $ndbid); } if ($name = db_query("SELECT ndb.* FROM {name_database} ndb WHERE ndbid = :ndbid", array(':ndbid' => $ndbid))->fetchAssoc()) { return drupal_get_form('namedb_name_form', $name); } drupal_set_message(t('The name could not be found.'), 'error'); drupal_goto('admin/config/regional/name/namedb'); } /** * Name deletion form. */ function namedb_name_delete_form($form, $form_state, $ndbid) { $name = db_query("SELECT ndb.* FROM {name_database} ndb WHERE ndbid = :ndbid", array(':ndbid' => $ndbid))->fetchAssoc(); if (!$name) { drupal_set_message(t('The name could not be found.'), 'error'); drupal_goto('admin/config/regional/name/namedb'); } $form = array(); $form['ndbid'] = array( '#type' => 'value', '#value' => $name['ndbid'], ); $form['#name'] = $name; return confirm_form( $form, t('Are you sure you want to delete the name %name?', array('%name' => $name['name']) ), 'admin/config/regional/name/namedb', t('This action cannot be undone.'), t('Delete'), t('Cancel') ); } /** * Submit handler for namedb_name_delete_form(). */ function namedb_name_delete_form_submit($form, &$form_state) { db_delete('name_database') ->condition('ndbid', $form_state['values']['ndbid']) ->execute(); drupal_set_message(t('The name %name was deleted.', array('%name' => $form['#name']['name']))); $form_state['redirect'] = 'admin/config/regional/name/namedb'; } /** * The form callback for importing predefined name .dat files. */ function namedb_import_form($form, &$form_state) { $settings = namedb_settings(); $enabled = ($settings['imports']['passed']['insert'] || $settings['imports']['failed']['insert']); if (!$enabled) { drupal_set_message(t('There are no insertion rules enabled. At least one insert option must be selected for the administration import to work.'), 'warning'); } $form['imports'] = array( '#type' => 'checkboxes', '#title' => t('Select data files to import.'), '#options' => array( 'family' => t('Family names: Approx 50,000 names from USA cenus data.'), 'given' => t('Given names: Approx 85,000 names from USA cenus data.'), 'title' => t('Titles: 40 titles from Mr to Lieutenant Commander.'), ), '#required' => TRUE, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Import'), '#disabled' => !$enabled ); return $form; } /** * The submit handler for namedb_import_form(). */ function namedb_import_form_submit($form, &$form_state) { $imports = array_filter($form_state['values']['imports']); $contents = file_get_contents(drupal_get_path('module', 'namedb') . '/data/data.dat'); $lines = explode("\n", $contents); $counter = 0; foreach ($lines as $line => $name) { if (empty($line) || strpos($line, ';')) { continue; } if ($line % 100 === 0) { $counter++; } if (!isset($batched_names[$counter])) { $batched_names[$counter] = array(); } $batched_names[$counter][] = $name; } namedb_batch_name_import($batched_names, $imports); } /** * The batch handler for namedb_import_form_submit(). * * This is used if there are more than 50 individual names imported at any * one time. */ function namedb_batch_name_import($batched_names, $imports) { $total = count($batched_names); $operations = array(); foreach ($batched_names as $index => $batched_name_group) { $operations[] = array( 'namedb_batch_name_import_process', array( $batched_name_group, $imports, $index, $total, ), ); } $batch = array( 'operations' => $operations, 'finished' => 'namedb_batch_name_import_finished', 'title' => t('Processing %key name import', array('%key' => implode(', ', $imports))), 'init_message' => t('Name Import is starting.'), 'progress_message' => t('Processed @current out of @total %key name blocks.', array('%key' => implode(', ', $imports))), 'error_message' => t('Name import has encountered an error.'), 'file' => drupal_get_path('module', 'namedb') . '/namedb.admin.inc', ); batch_set($batch); } /** * Batch 'operation' callback for namedb_import_form_submit(). */ function namedb_batch_name_import_process($batched_name_group, $imports, $index, $total, &$context) { $file = drupal_get_path('module', 'name') . '/' . 'i18n-ascii.txt'; $letters = 'a-z' . implode('', array_keys(parse_ini_file($file))); $context['results'] = array('passed' => array(), 'failed' => array()); $context['sandbox']['progress'] = $index; $context['sandbox']['max'] = $total; $imports = drupal_map_assoc($imports); foreach ($batched_name_group as $line) { list($name, $abbr, $title, $family, $given, $weight) = $item = explode(',', $line, 6); $item = array_combine(array('name', 'abbr', 'title', 'family', 'given', 'weight'), $item); if (is_null($weight)) { $weight = 1024; } $row_flags = array_filter(array_intersect_key($item, $imports)); if (empty($row_flags)) { continue; } $old_name = $name; // 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'; if ($name = $func($name, 'imports', $letters)) { if (namedb_update_database(array_keys($row_flags), $name, $abbr, 'imports', $weight)) { $context['results']['passed'][] = check_plain($name); } else { $context['results']['failed'][] = check_plain($name); } } else { $context['results']['failed'][] = check_plain($old_name) .'--'. $func($name, 'imports'); } } // Update our progress information. $message = t('Successfully imported or updated %c1 %key names, failed on %c2 names.', array('%key' => $key, '%c1' => count($context['results']['passed']), '%c2' => count($context['results']['failed']))); if (!empty($context['results']['failed'])) { $message .= t('Failed imports:') . implode(', ', $context['results']['failed']) ; } $context['message'] = $message; $context['finished'] = 1; } /** * Batch 'finished' callback for namedb_import_form_submit(). */ function namedb_batch_name_import_finished($success, $results, $operations) { if ($success) { // Here we do something meaningful with the results. $message = t('Import complete'); } else { // An error occurred. // $operations contains the operations that remained unprocessed. $error_operation = reset($operations); $message = t('An error occurred while processing %error_operation with arguments: @arguments', array('%error_operation' => $error_operation[0], '@arguments' => print_r($error_operation[1], TRUE))); } drupal_set_message($message); }