Drupal: Overriding Drupal autocompletion to pass more parameters
Update 2014-02-19: See LittleDynamo’s comment with a link to this StackOverflow answer.
Update 2014-02-11: See Claus’ comment below for a better way to do this.
Drupal autocompletion is easy – just add #autocomplete_path
to a Form API element, set it to something that returns a JSON hash, and off you go.
What if you want to pass form values into your autocompletion function so that you can filter results?
Searching, I found some pages that suggested changing the value in the hidden autocomplete field so that it would go to a different URL. However, that probably doesn’t handle the autocomplete cache. Here’s another way to do it:
Drupal.ACDB.prototype.customSearch = function (searchString) {
searchString = searchString + "/" + $("#otherfield").val();
return this.search(searchString);
};
Drupal.jsAC.prototype.populatePopup = function () {
// Show popup
if (this.popup) {
$(this.popup).remove();
}
this.selected = false;
this.popup = document.createElement('div');
this.popup.id = 'autocomplete';
this.popup.owner = this;
$(this.popup).css({
marginTop: this.input.offsetHeight +'px',
width: (this.input.offsetWidth - 4) +'px',
display: 'none'
});
$(this.input).before(this.popup);
// Do search
this.db.owner = this;
if (this.input.id == 'edit-your-search-field') {
this.db.customSearch(this.input.value);
} else {
this.db.search(this.input.value);
}
}
Drupal.behaviors.rebindAutocomplete = function(context) {
// Unbind the behaviors to prevent multiple search handlers
$("#edit-your-search-field").unbind('keydown').unbind('keyup').unbind('blur').removeClass('autocomplete-processed');
// Rebind autocompletion with the new code
Drupal.behaviors.autocomplete(context);
}
You’ll need to use drupal_add_js
to add misc/autocomplete.js
before you add the Javascript file for your form.
Hope this helps!
2011-08-08 Mon 19:16