Объедините проверку на стороне клиента и на стороне сервера в форме Bootstrap 4 - PullRequest
0 голосов
/ 06 июля 2018

У меня есть форма Bootstrap 4 с полем ввода, которое называется runname. Я хочу выполнить следующую проверку в поле ввода:

  • runname не может быть пустым
  • runname не может содержать пробелы
  • runname уже нельзя использовать ранее

У меня уже есть код для формы, которая выдает ошибку, используя пользовательские стили начальной загрузки , если поле ввода пустое:

// JavaScript for disabling form submissions if there are invalid fields
(function() {
  'use strict';
  window.addEventListener('load', function() {
    // Fetch all the forms we want to apply custom Bootstrap validation styles to
    var forms = document.getElementsByClassName('needs-validation');
    // Loop over them and prevent submission
    var validation = Array.prototype.filter.call(forms, function(form) {
      form.addEventListener('submit', function(event) {
        if (form.checkValidity() === false) {
          event.preventDefault();
          event.stopPropagation();
        }
        form.classList.add('was-validated');
      }, false);
    });
  }, false);
})();
<html lang="en">

<head>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
</head>

<body class="bg-light">
  <div class="container">
    <div class="col-md-12 order-md1">
      <form class="needs-validation" novalidate method="post" action="#">
        <div class="form-group row">
          <label for="inputRunname" class="col-sm-2 col-form-label">Run name</label>
          <div class="col-sm-10">
            <input type="text" class="form-control" id="inputRunname" name="runname" placeholder="Run name" required>
            <div class="invalid-feedback">
              Please enter a run name
            </div>
          </div>
        </div>
        <div class="form-group row">
          <div class="col-sm-10">
            <button type="submit" class="btn btn-primary">Submit</button>
          </div>
        </div>
      </form>
    </div>
  </div>
  <!-- Optional JavaScript -->
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
  <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>

</body>

</html>

И у меня есть Javascript, чтобы проверить, содержит ли вход пробелы:

function cannotContainWhiteSpace(input, errorId, name) {
  var value = input.value;
  var errMsgHolder = document.getElementById(errorId);
  if (!(/^\S*$/.test(value))) {
    errMsgHolder.innerHTML =
      'The ' + name + ' cannot contain whitespace';
    input.focus();
    return false;
  }
}

И у меня также есть некоторый код Python на моей бэкэнде Cherrypy, который просматривает базу данных, чтобы узнать, существует ли уже runname:

try:
    myConnection = mysql.connector.connect(host=self.database['host'], user=self.database['user'], passwd=self.database['passwd'], db=self.database['db'])
    cursor = myConnection.cursor(buffered=True)

    # unless overriden by the force flag, check whether the runname has already been used before
    if not force:
        reusedrunquery = "SELECT run FROM logs WHERE run = %s AND errormessage IS NULL"
        cursor.execute(reusedrunquery, (runname,))
        if cursor.fetchall():
            flag = True
            cherrypy.session['reusedRun'] = True
    myConnection.close()
except mysql.connector.Error as err:
    return self.database_failure(str(err))

Но я не знаю, как объединить все эти разные части, чтобы получить форму, в которой у меня есть как две проверки на стороне клиента, так и проверка на стороне сервера.

Ответы [ 2 ]

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

В большинстве случаев я использую собственные стили для достижения этой цели.

.invalid-feedback{
  display:none;
}

.invalid .invalid-feedback {
  display:block;
}
<form novalidate>
  <div class="form-group">
    <label>Label</label>
    <input class="form-control" name="runname" type="text">
    <div class="invalid-feedback"></div>
  </div>
</form>

В Javascript

Проверьте элементы управления вводом и установите классы css и текст сообщения. В вашем случае проверьте не пусто, без пробелов и еще не использовалось [на стороне сервера]. Если неверно, добавьте класс invalid к родительскому form-group и установите сообщение проверки в invalid-feedback div рядом с элементом управления вводом.

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

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

Вот они шаги:

  1. Форма составлена ​​правильно
  2. Запускается HTTP-запрос POST onSubmit событие
  3. Back-end получает запрос и применяет дополнительную логику, собирая данные об ответственном методе для получения запроса POST Http

В противном случае вы можете попытаться сделать AJAX вызов, для которого будут выполняться проверки на стороне клиента, а затем он вызовет метод / класс на стороне сервера для проверки того, что runname был уже используется.

...