Drupal: Overriding Drupal autocompletion to pass more parameters
Posted: - Modified: | drupal, geekUpdate 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.
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
You can comment with Disqus or you can e-mail me at sacha@sachachua.com.