background image
HomeRecent PostsDrupalSearchTagsRSSContactAboutAccount
Eric.London's picture

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;
}
?>

Syndicate content