I used http://drupal.org/node/179922#comment-1467932 as a starting point and made modifications.
Here's my .module code for Drupal 6.x:
<?php
// $Id: MODULE_NAME.module
/**
*@file
* Module Name
* Turns a select into an autocomplete textfield.
*
* Specific for 'NODE_NAME' nodes and the 'VIEW_NAME' view
*
*/
/**
* Implementation of hook_menu().
*/
function MODULE_NAME_menu(){
//Initialize the $items array.
$items = array();
//Add menu for the node autocomplete textfield's #autocomplete_path.
$items['NODE_NAME/autocomplete'] = array(
//Required. The untranslated title of the menu item.
'title' => t('Node Title'),
//The function to call to display a web page when the user visits the path. If omitted, the parent menu item's callback will be used instead.
'page callback' => 'NODE_NAME_autocomplete',
//An array of arguments to pass to the access callback function. Integer values pass the corresponding URL component.
'access arguments' => array('access content'),
//Callbacks simply register a path so that the correct function is fired when the URL is accessed.
'type' => MENU_CALLBACK
);
//Return the $items array with the new menu item.
return $items;
}
/**
* Implementation of hook_form_alter().
*/
function MODULE_NAME_form_alter(&$form, $form_state, $form_id){
//Only affect a views exposed form.
if($form_id == 'views_exposed_form'){
//If a view exists, retreive form_state information.
if (array_key_exists('view', $form_state)){
//If the view has a name,
if (array_key_exists('name', $form_state['view'])){
//Only affect the specified view.
if ($form_state['view']->name == 'VIEW_NAME'){
//Turn the node select into a textfield.
$form['SELECT_FIELD']['#type'] ='textfield';
//Turns the node textfield into an autocomplete textfield.
$form['SELECT_FIELD']['#autocomplete_path'] ='NODE_NAME/autocomplete';
//Remove options from the node autocomplete textfield so errors aren't thrown if the user enters something that doesn't exist.
unset($form['SELECT_FIELD']['#options']);
}
}
}
}
}
/**
* Autocomplete Function for nodes.
*/
function NODE_NAME_autocomplete($string = ''){
//Initialize the $matches array.
$matches = array();
//Ensure that a string has been passed.
if ($string){
//Remove any extra spaces before or after the meaningful string.
$string = trim($string);
//Set the query to select all nodes that are published and match what the user entered. - use '%%%s%%' to match from anywhere in the title
$query = "SELECT title FROM {node} WHERE type='NODE_NAME' and title like '%s%'";
//Run the query and restrict the results to the first 10.
$result = db_query_range($query,$string,0,10);
//Ensure there are results returned from the query.
if ($result != false){
//Loop through the all of the results.
while ($NODE_NAME = db_fetch_object($result)){
//Add the plain text select field to the $matches array with the $key set as the same.
$matches[$NODE_NAME->title] = check_plain($NODE_NAME->title);
}
}
}
//Converts the $matches array into its Javascript equivalent and prints it to the page output.
print drupal_to_js($matches);
//Exit the function.
exit;
}
/**
* Implementation of hook_views_query_alter().
*/
function MODULE_NAME_views_query_alter(&$view, &$query){
//Ensure that the WHERE information exists as an array in the query which is not empty.
if (is_array($query->where) && !empty($query->where)){
//Search the where clauses for the select field clause.
$index_value = array_search("node_data_SELECT_FIELD.SELECT_FIELD = '%s'", $query->where[0][clauses]);
//If the select field clause was found,
if ($index_value != '' && $index_value != false){
//If the cooresponding argument is not blank or all,
if($query->where[0][args][$index_value] == '' || strtolower($NODE_NAME_title) == "all"){
//remove the clause and argument because the user isn't searching by the select field.
unset($query->where[0][clauses][$index_value]);
unset($query->where[0][args][$index_value]);
}
else{
//Get the argument that cooresponds to the select field where clause.
$NODE_NAME_title = strtoupper($query->where[0][args][$index_value]);
//Select the node id of the select field argument.
$NODE_NAME_nid = db_result(db_query("SELECT nid FROM {node} WHERE title = '%s'",$NODE_NAME_title));
//If a node id was found for the select field argument,
if($NODE_NAME_nid){
//replace the select field with the cooresponding node id in the argument.
$query->where[0][args][$index_value] = $NODE_NAME_nid;
}
else{
//If the node id wasn't found, replace the select field with 0 as a nonexistent node id that will not return results.
$query->where[0][args][$index_value] = 0;
}
}
}
}
}
?>
Few changes are needed for Drupal 7 in NODE_NAME_autocomplete() function:
ReplyDelete1.
//Set the query to select all nodes that are published and match what the user entered. - use '%%%s%%' to match from anywhere in the title
$query = "SELECT title FROM {node} WHERE type='NODE_NAME' and title like '%s%'";
//Run the query and restrict the results to the first 10.
$result = db_query_range($query,$string,0,10);
to
$query = "SELECT title FROM {node} WHERE type='NODE_NAME' and title LIKE :input";
$result = db_query_range($query, 0, 10, array(':input'=>db_like($string) . '%'));
2.
while ($NODE_NAME = db_fetch_object($result)){
to
foreach($result as $project) {
3.
print drupal_to_js($matches);
to
print drupal_json_encode($matches);