JQuery-UI автозаполнения начать поиск с начала массива - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь использовать нативный escape-запрос jquery-ui с моим поисковым термином, который мне не удается сделать.

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

Когда пользователь выбирает вторичного клиента, мое второе автозаполнение берет основной идентификатор клиента из поля cId, затем отправляет его в PHP, который указан ниже, и получает имя второго клиента и идентификатор.Который отправляется обратно через JSON в виде массива.

При моем первом автозаполнении я получил упомянутую функцию RegEx для вывода списка клиентов в соответствии с первой набранной буквой.Например, если я наберу букву A, сценарий перечислит все имена, начинающиеся с A. Это то, что я хочу сделать на моем втором автозаполнении.Но я не могу понять, как применить функцию escapeRegex.Я опробовал несколько старых ответов, но ни один из них не работал с моим кодом.

Основной код страницы PHP,

 <div class="usrCreate-form-right">/* Search 1*/
        <label for="cuName">Customer / Kunde:</label><br>
        <input id="cuName" name="cuName" class="usrCreate-form-inputs">
        <input id="cId" class="usrCreate-form-inputs" hidden><br />
        <script type="text/javascript" language="JavaScript">
            var kNames = [
                <?php
                //Loads the data from kunde data base to the MultiDimentional Array
                while ($getKundeRow = $getKundeQuery -> fetch(PDO::FETCH_ASSOC)){ echo '{label:"'.$getKundeRow['customer_name'].'", value:"'.$getKundeRow['kId'].'"},'; }
                ?>
            ];

            $('#cuName').autocomplete({
                source: function( request, response ) {
                    var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( request.term ), "i" );
                    response( $.grep( kNames, function( item ){
                        return matcher.test( item.label );
                    }) );
                },
                minLength: 1,
                focus: function (event, ui) {
                    $('#cuName').val(ui.item.label);
                    return false;
                },
                select: function (event, ui) {
                    $('#cuName').val(ui.item.label);
                    $('#cId').val(ui.item.value);
                    return false;
                }
            });
        </script>
    </div>
    <div class="usrCreate-form-left">/*Search 2*/
        <label for="tName">Target / Mal:</label><br>
        <input id="tName" name="tName" class="usrCreate-form-inputs">
        <input id="mid" name="mid" class="usrCreate-form-inputs"><br>
        <script type="text/javascript" language="JavaScript">
            $('#tName').autocomplete({
                source: function (request, response) {
                    $.ajax({
                        url: "addNewJobProcess.php",
                        dataType: "json",
                        data:{
                            kId: $('#cId').val()
                        },
                        success:function (data) {
                            var re = $.ui.autocomplete.escapeRegex(request.term),
                                matcher = new RegExp("^" + re, "i");

                            response($.map(data.myMalData, function (item) {

                                return{
                                    label: item.mal_name,
                                    value: item.mId
                                }
                            }))
                        }
                    })
                },
                minLength: 1,
                focus:function (event, ui) {
                    $('#tName').val(ui.item.label);
                    return false;
                },
                select: function (event, ui) {
                    $('#tName').val(ui.item.label);
                    $('#mid').val(ui.item.value);
                    return false;
                }
            })
        </script>
    </div>

Код PHP для базы данных,

include_once("../deLink/deLinker.php");

 if (isset($_GET['kId'])){

 $malNames = array();

 $getMalQuery = $dbConnect -> prepare("SELECT * FROM mal_list WHERE kId = :kid");
 $getMalQuery -> bindValue(':kid', $_GET['kId']);
 $getMalQuery -> execute();

 while($getMalRow = $getMalQuery -> fetch(PDO::FETCH_ASSOC)){
     $malNames['myMalData'][] = array(
         'mal_name' => $getMalRow['Mal Name'],
         'mId' => $getMalRow['mId']
     );
 }

 echo json_encode($malNames);
 }

1 Ответ

0 голосов
/ 16 октября 2018

Во-первых, я настоятельно рекомендую не заполнять массив JavaScript с помощью PHP.Я бы посоветовал использовать вызов PHP Script с AJAX для обоих.

Во-вторых, нет ничего плохого в вашем скрипте в целом, просто подумайте о некоторой очистке.Вы можете использовать RegEx, если хотите, но я бы посоветовал вам настроить поиск PHP, например:

SELECT customer_name, kId FROM table_name WHERE customer_name LIKE '?%';

Где ? - значение термина, а % - подстановочный знак.Поэтому, если они введут «joh», он будет искать имена, начинающиеся с «joh», и должен выдавать результаты, такие как john и johan.Всегда лучше взвесить сценарий на стороне клиента и поместить его в сценарии на стороне сервера.Вывод результатов через JSON Encoding.

$(function() {
  $('#cuName').autocomplete({
    source: function(request, response) {
      var q = request.term;
      var r = [];
      $.ajax({
        url: "getCustomerName.php",
        data: {
          query: q
        },
        dataType: "json",
        success: function(data) {
          $.each(data, function(k, v) {
            r.push({
              label: v.customer_name,
              value: v.kId
            });
          });
        }
      });
      response(r);
    },
    minLength: 1,
    focus: function(event, ui) {
      $('#cuName').val(ui.item.label);
      return false;
    },
    select: function(event, ui) {
      $('#cuName').val(ui.item.label);
      $('#cId').val(ui.item.value);
      return false;
    }
  });
  $('#tName').autocomplete({
    source: function(request, response) {
      var sq = $("#cuName").val();
      var q = request.term;
      var r = [];
      $.ajax({
        url: "addNewJobProcess.php",
        dataType: "json",
        data: {
          kId: sq
        },
        success: function(data) {
          $.each(data, function(k, v) {
            if (v.mal_name.indexOf(q) === 0) {
              r.push({
                label: v.mal_name,
                value: v.mId
              });
            }
          });
        }
      });
      response(r);
    },
    minLength: 1,
    focus: function(event, ui) {
      $('#tName').val(ui.item.label);
      return false;
    },
    select: function(event, ui) {
      $('#tName').val(ui.item.label);
      $('#mid').val(ui.item.value);
      return false;
    }
  });
});
<div class="usrCreate-form-right">
  <label for="cuName">Customer / Kunde:</label><br>
  <input id="cuName" name="cuName" class="usrCreate-form-inputs">
  <input id="cId" class="usrCreate-form-inputs" hidden><br />
</div>
<div class="usrCreate-form-left">
  <label for="tName">Target / Mal:</label><br>
  <input id="tName" name="tName" class="usrCreate-form-inputs">
  <input id="mid" name="mid" class="usrCreate-form-inputs"><br>
</div>

Обновление

Поскольку #tName зависит от первого, вы можете отключить его, пока значение не будетбыл выбран в #cuName.

Также #tName будет получать любые исходные данные, которые будут возвращаться, и будет полагаться на фильтрацию на стороне клиента.Вы можете отправить запрос источника и термин, чтобы SQL мог выполнить эту работу за вас.Таким образом, AJAX-подобный:

$.ajax({
  url: "addNewJobProcess.php",
  dataType: "json",
  data: {
    kId: sq,
    term: q
  },
  success: function(data) {
    $.each(data, function(k, v) {
      r.push({
        label: v.mal_name,
        value: v.mId
      });
    });
  }
});

А затем PHP-подобный:

if (isset($_GET['kId']) && isset($_GET['term'])){
  $malNames = array();
  $getMalQuery = $dbConnect -> prepare("SELECT * FROM mal_list WHERE kId = :kid AND mal_name LIKE ':term%'");
  $getMalQuery -> bindValue(':kid', $_GET['kId']);
  $getMalQuery -> bindValue(':term', $_GET['term']);
  $getMalQuery -> execute();

  while($getMalRow = $getMalQuery -> fetch(PDO::FETCH_ASSOC)){
    $malNames['myMalData'][] = array(
      'mal_name' => $getMalRow['Mal Name'],
      'mId' => $getMalRow['mId']
    );
  }
  echo json_encode($malNames);
}

SQL был разработан для такого тяжелого подъема, а JavaScript - нет.Если ваш запрос имеет результирующий набор более 100 ... JavaScript будет работать плохо.SQL даже не вздрогнет.

Надеюсь, это поможет.

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