You are here

biblio_autocomplete.module in Biblio Autocomplete 6

Same filename and directory in other branches
  1. 7 biblio_autocomplete.module

Module extending biblio module with autocompletion.

File

biblio_autocomplete.module
View source
<?php

/**
 * @file
 * Module extending biblio module with autocompletion.
 */

/**
 * Implements hook_menu().
 */
function biblio_autocomplete_menu() {
  $items = array();
  $autocompletes = module_invoke_all('biblio_autocomplete_info');
  foreach ($autocompletes as $field => $data) {
    $items['biblio_autocomplete/' . $field] = array(
      'title' => 'Biblio autocomplete for ' . $field,
      'page callback' => 'biblio_autocomplete_json',
      'page arguments' => array(
        $field,
        2,
      ),
      'access callback' => 'user_access',
      'access arguments' => array(
        'access biblio autocomplete',
      ),
      'type' => MENU_CALLBACK,
    );
  }
  return $items;
}

/**
 * Implements of hook_perm().
 */
function biblio_autocomplete_perm() {
  return array(
    'access biblio autocomplete',
  );
}
function biblio_autocomplete_json($biblio_field, $string) {
  $autocompletes = module_invoke_all('biblio_autocomplete_info');
  $matches = array();
  foreach ($autocompletes as $field => $data) {
    if ($field == $biblio_field) {
      if (!is_array($data['function'])) {
        $data['function'] = array(
          $data['function'],
        );
      }
      foreach ($data['function'] as $function) {
        $matches = array_merge($matches, $function($string));
      }
    }
  }
  asort($matches);
  $return_matches = array();
  $i = 0;
  foreach ($matches as $data) {
    if ($data['key'] != '' && $data['description'] != '') {
      $i++;
      $return_matches[$data['key']] = $data['provider'] . ': ' . $data['description'];
      if ($i >= 10) {
        break;
      }
    }
  }
  print drupal_json($return_matches);
}

/**
 * Implements hook_form_alter().
 */
function biblio_autocomplete_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'biblio_node_form') {
    $autocompletes = module_invoke_all('biblio_autocomplete_info');
    foreach ($autocompletes as $field => $values) {
      if (in_array($field, $form)) {
        $key = _biblio_autocomplete_array_tree_search_key($form, $field);
        if (!is_null($key)) {
          _biblio_autocomplete_array_tree_update_autocomplete($form, $key, 'biblio_autocomplete/' . $field);
        }
      }
    }
  }
}
function _biblio_autocomplete_array_tree_search_key($a, $subkey) {
  if (is_array($a)) {
    foreach (array_keys($a) as $k) {
      if ($k === $subkey) {
        return array(
          $k,
        );
      }
      elseif ($pos = _biblio_autocomplete_array_tree_search_key($a[$k], $subkey)) {
        return array_merge(array(
          $k,
        ), $pos);
      }
    }
  }
}
function _biblio_autocomplete_array_tree_update_autocomplete(&$a, $key_array, $autocomplete) {
  if (count($key_array) == 0) {
    $a['#autocomplete_path'] = $autocomplete;
  }
  else {
    $a_next = array_shift($key_array);
    _biblio_autocomplete_array_tree_update_autocomplete($a[$a_next], $key_array, $autocomplete);
  }
}