function ajax_example_node_by_author_autocomplete
Search by title and author.
In this example, we'll look up nodes by title, but we want only nodes that have been authored by a particular user. That means that we'll have to make an autocomplete function which takes a username as an argument, and use #ajax to change the #autocomplete_path based on the selected user.
Although the implementation of the validate handler may look complex, it's just ambitious. The idea here is: 1. Autcomplete to get a valid username. 2. Use #ajax to update the node element with a #autocomplete_callback that gives the context for the username. 3. Do an autcomplete on the node field that is limited by the username.
Parameters
array $form: Form API form.
array $form_state: Form API form state.
Return value
array Form API array.
1 string reference to 'ajax_example_node_by_author_autocomplete'
- ajax_example_menu in ajax_example/
ajax_example.module - Implements hook_menu().
File
-
ajax_example/
ajax_example_autocomplete.inc, line 257
Code
function ajax_example_node_by_author_autocomplete($form, &$form_state) {
$form['intro'] = array(
'#markup' => '<div>' . t("This example uses a user autocomplete to dynamically change a node title autocomplete using #ajax.\n This is a way to get past the fact that we have no other way to provide context to the autocomplete function.\n It won't work very well unless you have a few users who have created some content that you can search for.") . '</div>',
);
$form['author'] = array(
'#type' => 'textfield',
'#title' => t('Choose the username that authored nodes you are interested in'),
// Since we just need simple user lookup, we can use the simplest function
// of them all, user_autocomplete().
'#autocomplete_path' => 'user/autocomplete',
'#ajax' => array(
'callback' => 'ajax_example_node_by_author_ajax_callback',
'wrapper' => 'autocomplete-by-node-ajax-replace',
),
);
// This form element with autocomplete will be replaced by #ajax whenever the
// author changes, allowing the search to be limited by user.
$form['node'] = array(
'#type' => 'textfield',
'#title' => t('Choose a node by title'),
'#prefix' => '<div id="autocomplete-by-node-ajax-replace">',
'#suffix' => '</div>',
'#disabled' => TRUE,
);
// When the author changes in the author field, we'll change the
// autocomplete_path to match.
if (!empty($form_state['values']['author'])) {
$author = user_load_by_name($form_state['values']['author']);
if (!empty($author)) {
$autocomplete_path = 'examples/ajax_example/node_by_author_autocomplete/' . $author->uid;
$form['node']['#autocomplete_path'] = $autocomplete_path;
$form['node']['#title'] = t('Choose a node title authored by %author', array(
'%author' => $author->name,
));
$form['node']['#disabled'] = FALSE;
}
}
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}