JQuery UI автозаполнение с различными источниками данных - PullRequest
0 голосов
/ 03 июля 2018

У меня есть форма с несколькими полями, для которой требуется автозаполнение, и я использую опцию «несколько», чтобы в каждом поле можно было выбрать несколько значений. Я могу заставить все работать нормально с одним источником данных.

Вот в чем проблема: каждое поле должно иметь другой удаленный источник данных (php-файл, выводящий массив JSON). Я подумал использовать пользовательский data-attribute для отображения URL-адреса источника данных JSON.

Вот как выглядит один из моих входов: <input type="text" name="frr" id="frr" data-searchsource="searchFrr.php" class="autofillme">

Вот что у меня есть для jQuery - я не получаю никаких ошибок консоли, но это не работает (автозаполнение больше не работает). Если я жестко закодировал "searchFrr.php" для запроса $.getJSON, все работает нормально (с использованием этого единственного источника данных).

Есть идеи, как заставить это работать правильно? Большое спасибо за поиск !! :)

$( function() {
    function split( val ) {
      return val.split( /,\s*/ );
}
function extractLast( term ) {
    return split( term ).pop();
}

$('.autofillme').each(function() {

    $(this)
      // don't navigate away from the field on tab when selecting an item
      .on( "keydown", function( event ) {
        if ( event.keyCode === $.ui.keyCode.TAB &&
            $( this ).autocomplete( "instance" ).menu.active ) {
          event.preventDefault();
        }
      })
      .autocomplete({
        source: function( request, response ) {
          $.getJSON( $(this).data("searchsource"), {
            term: extractLast( request.term )
          }, response );
        },
        search: function() {
          // custom minLength
          var term = extractLast( this.value );
          if ( term.length < 3  ) {
            return false;
          }
        },
        focus: function() {
          // prevent value inserted on focus
          return false;
        },
        select: function( event, ui ) {
          var terms = split( this.value );
          // remove the current input
          terms.pop();
          // add the selected item
          terms.push( ui.item.value );
          // add placeholder to get the comma-and-space at the end
          terms.push( "" );
          this.value = terms.join( ", " );
          return false;
        }
      });
  });
});

1 Ответ

0 голосов
/ 04 июля 2018

В конце концов, мне не удалось добиться того, что я хотел, с помощью методов, которые я пытался. Я уверен, что кто-то более опытный в jQuery смог бы понять это.

Я нашел решение, которое позволяет мне использовать другой источник данных в зависимости от того, в какое поле вводится текст. Это использует jQuery UI Autocomplete, с удаленным источником данных и опцией «несколько», так что несколько значений могут быть выбрано для каждого поля Я добавляю класс autofillme к каждому входу в моей форме, который я хочу автозаполнить.

JAVASCRIPT

$( function() {
  function split( val ) {
    return val.split( /,\s*/ );
}
function extractLast( term ) {
  return split( term ).pop();
}

$('.autofillme').each(function() {

    $(this)
      // don't navigate away from the field on tab when selecting an item
      .on( "keydown", function( event ) {
        if ( event.keyCode === $.ui.keyCode.TAB &&
            $( this ).autocomplete( "instance" ).menu.active ) {
          event.preventDefault();
        }
      })
      .autocomplete({
        source: function( request, response ) {
          $.getJSON( "searchDB.php", {
            term: extractLast( request.term ),
            // adds an extra query string to the URL, sending the ID of the field sending the request
            field: $(this).attr('element').attr('id')
          }, response );
        },
        search: function() {
          // custom minLength
          var term = extractLast( this.value );
          if ( term.length < 3  ) {
            return false;
          }
        },
        focus: function() {
          // prevent value inserted on focus
          return false;
        },
        select: function( event, ui ) {
          var terms = split( this.value );
          // remove the current input
          terms.pop();
          // add the selected item
          terms.push( ui.item.value );
          // add placeholder to get the comma-and-space at the end
          terms.push( "" );
          this.value = terms.join( ", " );
          return false;
        }
      });
  });
}); 

PHP - searchDB.php

require "config.php"; // DB credentials stored here

$term = $_GET['term']; // What's been typed so far in the field

$field = $_GET['field']; // The ID of the field that's sending the request
try {
      $connection = new PDO($DB, $username, $password, $options);

        if ($field == 'field_A') {
          $array = $connection->query("SELECT * FROM columnA where value LIKE '%".$term."%'")->fetchAll(PDO::FETCH_ASSOC);
          echo json_encode($array);
        }
        elseif ($field == 'field_B') {
          $array = $connection->query("SELECT * FROM columnB where value LIKE '%".$term."%'")->fetchAll(PDO::FETCH_ASSOC);
          echo json_encode($array);
        }
        elseif ($field == 'field_C') {
          $array = $connection->query("SELECT * FROM columnC where value LIKE '%".$term."%'")->fetchAll(PDO::FETCH_ASSOC);
          echo json_encode($array);
        }
        else {
          // whatever happens if no field sent
        }
      } 
      catch(PDOException $error) {

         echo "A problem has occurred fetching data";
      }

В конечном счете, это может быть не звездное решение, или, в частности, масштабируемое, но оно делает именно то, что я хочу - так что это решает мой вопрос. Надеюсь, это может пригодиться кому-то, кто занимается подобными вещами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...