Drupal 6: Creating an autocomplete field using the forms api and a menu callback

In this snippet, I'll explain how to implement an autocompleting field using the forms API and a menu callback. The first thing you'll need to create is the callback function that queries the database and returns an non-themed javascript result. In this function I'll return a list of node IDs and their titles:

<?php
function MYMODULE_autocomplete_node($userString) {
  // create the SQL to query the node table
  $sql = "select nid, title from {node} where status='1' and lower(title) like lower('%%%s%%') order by title asc";

  // query the database
  $resource = db_query_range($sql, $userString, 0, 10);

  // loop through the results and create an associative array
  $results = array();
  while ($row = db_fetch_array($resource)) $results[$row['nid']] = $row['title'];

  // output the results in javascript
  print drupal_to_js($results);

  // exit, to prevent your results form hitting the theme layer
  exit();
}
?>

Next create a menu item:

<?php
function MYMODULE_menu() {
  $items[] = array();
  // ...code...
  $items['MYMODULE/autocomplete/node'] = array(
    'type' => MENU_CALLBACK,
    'access arguments' => array('access content'),
    'page callback' => 'MYMODULE_autocomplete_node',
  );
  // ...code...
  return $items;
?>

Now if you flush your menu cache and go to your newly created menu path, you should see a list of nodeID and their titles formatted in JSON. Lastly, you'll need to create the form element:

<?php
function MYMODULE_form() {
  $form = array();
  // ...code...
  $form['MYFIELDNAME'] = array(
    '#type' => 'textfield',
    '#title' => t('MYFIELDTITLE'),
    '#autocomplete_path' => 'MYMODULE/autocomplete/node',
  );
  // ...code...
  return $form;
}
?>