Commit 6b54d34b authored by catch's avatar catch
Browse files

Issue #93854 by pillarsdotnet, Steven Jones, Dave Reid, ericduran, das-peter,...

Issue #93854 by pillarsdotnet, Steven Jones, Dave Reid, ericduran, das-peter, et al.: Fixed Allow autocompletion requests to include slashes.
parent 4325efbd
......@@ -287,10 +287,11 @@ Drupal.ACDB.prototype.search = function (searchString) {
this.timer = setTimeout(function () {
db.owner.setStatus('begin');
// Ajax GET request for autocompletion.
// Ajax GET request for autocompletion. We use Drupal.encodePath instead of
// encodeURIComponent to allow autocomplete search terms to contain slashes.
$.ajax({
type: 'GET',
url: db.uri + '/' + encodeURIComponent(searchString),
url: db.uri + '/' + Drupal.encodePath(searchString),
dataType: 'json',
success: function (matches) {
if (typeof matches.status == 'undefined' || matches.status != 0) {
......
......@@ -312,7 +312,21 @@ function taxonomy_menu() {
'type' => MENU_CALLBACK,
'file' => 'taxonomy.pages.inc',
);
$items['taxonomy/autocomplete'] = array(
// We append /%menu_tail so the search text may contain slashes.
$items['taxonomy/autocomplete/%/%menu_tail'] = array(
'title' => 'Autocomplete taxonomy',
'page callback' => 'taxonomy_autocomplete',
'page arguments' => array(2, 3),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
'file' => 'taxonomy.pages.inc',
// Needed for menu_tail_load().
'load arguments' => array('%map', '%index'),
);
// This matches the vocabulary name without any search text. Even though this
// path is never called, its existence is checked by theme_textfield() and
// tested in ProfileTestAutocomplete.
$items['taxonomy/autocomplete/%'] = array(
'title' => 'Autocomplete taxonomy',
'page callback' => 'taxonomy_autocomplete',
'access arguments' => array('access content'),
......
......@@ -640,6 +640,41 @@ class TaxonomyTermTestCase extends TaxonomyWebTestCase {
$this->assertRaw('{"' . $term3->name . '":"' . $term3->name . '"}', t('Autocomplete returns term %term_name after typing the first 3 letters.', array('%term_name' => $term3->name)));
}
/**
* Tests term autocompletion edge cases with slashes in the names.
*/
function testTermAutocompletion() {
// Add a term with a slash in the name.
$first_term = $this->createTerm($this->vocabulary);
$first_term->name = '10/16/2011';
taxonomy_term_save($first_term);
// Add another term that differs after the slash character.
$second_term = $this->createTerm($this->vocabulary);
$second_term->name = '10/17/2011';
taxonomy_term_save($second_term);
// Try to autocomplete a term name that matches both terms.
// We should get both term in a json encoded string.
$input = '10/';
$path = 'taxonomy/autocomplete/taxonomy_';
$path .= $this->vocabulary->machine_name . '/' . $input;
// The result order is not guaranteed, so check each term separately.
$url = url($path, array('absolute' => TRUE));
$result = drupal_http_request($url);
$data = drupal_json_decode($result->data);
$this->assertEqual($data[$first_term->name], check_plain($first_term->name), t('Autocomplete returned the first matching term'));
$this->assertEqual($data[$second_term->name], check_plain($second_term->name), t('Autocomplete returned the second matching term'));
// Try to autocomplete a term name that matches first term.
// We should only get the first term in a json encoded string.
$input = '10/16';
$url = 'taxonomy/autocomplete/taxonomy_';
$url .= $this->vocabulary->machine_name . '/' . $input;
$this->drupalGet($url);
$target = array($first_term->name => check_plain($first_term->name));
$this->assertRaw(drupal_json_encode($target), t('Autocomplete returns only the expected matching term.'));
}
/**
* Save, edit and delete a term using the user interface.
*/
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment