How to upload a file using jquery ajax in laravel 8

3. View

Create file in .

Stored CSRF token in the  tag.

Display file upload response message in using jQuery.

Created  and  element in  to display a file preview according to the file extension using jQuery.

Create a file element and a button. Display error in if file not validated using jQuery.

Script

Read CSRF token from tag and assign to variable.

On the button click read the selected file and assign to variable.

If file not selected then otherwise, pass the selected file using FormData object. Also, pass with FormData.

Send AJAX POST request to  where pass FormData Object as data.

On successful callback check upload status.

If  means file successfully uploaded. Display the response message and preview the file according to the file extension.

If  means file is not uploaded. Display the response message.

If  does not equal 1 or 2 means the file is not validated. Display the error message.

Completed Code

<!DOCTYPE html>
<html>
<head>
<title>How to upload a file using jQuery AJAX in Laravel 8</title>

<!-- Meta -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta charset="utf-8">
<meta name="csrf-token" content="{{ csrf_token() }}">

<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">

<style type="text/css">
.displaynone{
display: none;
}
</style>
</head>
<body>

  <div class="container">

    <div class="row">

      <div class="col-md-12 col-sm-12 col-xs-12">

        <!-- Response message -->
        <div class="alert displaynone" id="responseMsg"></div>

        <!-- File preview --> 
        <div id="filepreview" class="displaynone" > 
          <img src="" class="displaynone" with="200px" height="200px"><br>

          <a href="#" class="displaynone" >Click Here..</a>
        </div>

        <!-- Form -->
        <div class="form-group">
           <label class="control-label col-md-3 col-sm-3 col-xs-12" for="name">File    <span class="required">*</span></label>
           <div class="col-md-6 col-sm-6 col-xs-12">

              <input type='file' id="file" name='file' class="form-control">

              <!-- Error -->
              <div class='alert alert-danger mt-2 d-none text-danger' id="err_file"></div>

           </div>
        </div>

        <div class="form-group">
           <div class="col-md-6">
              <input type="button" id="submit" value='Submit' class='btn btn-success'>
           </div>
        </div>
      </div>
    </div>
  </div>

  <!-- Script -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script type="text/javascript">
  var CSRF_TOKEN = document.querySelector('meta').getAttribute("content");

  $(document).ready(function(){

    $('#submit').click(function(){
   
      // Get the selected file
      var files = $('#file').files;

      if(files.length > 0){
         var fd = new FormData();

         // Append data 
         fd.append('file',files);
         fd.append('_token',CSRF_TOKEN);

         // Hide alert 
         $('#responseMsg').hide();

         // AJAX request 
         $.ajax({
           url: "{{route('uploadFile')}}",
           method: 'post',
           data: fd,
           contentType: false,
           processData: false,
           dataType: 'json',
           success: function(response){

             // Hide error container
             $('#err_file').removeClass('d-block');
             $('#err_file').addClass('d-none');

             if(response.success == 1){ // Uploaded successfully

               // Response message
               $('#responseMsg').removeClass("alert-danger");
               $('#responseMsg').addClass("alert-success");
               $('#responseMsg').html(response.message);
               $('#responseMsg').show();

               // File preview
               $('#filepreview').show();
               $('#filepreview img,#filepreview a').hide();
               if(response.extension == 'jpg' || response.extension == 'jpeg' || response.extension == 'png'){

                  $('#filepreview img').attr('src',response.filepath);
                  $('#filepreview img').show();
               }else{
                  $('#filepreview a').attr('href',response.filepath).show();
                  $('#filepreview a').show();
               }
             }else if(response.success == 2){ // File not uploaded

               // Response message
               $('#responseMsg').removeClass("alert-success");
               $('#responseMsg').addClass("alert-danger");
               $('#responseMsg').html(response.message);
               $('#responseMsg').show();
             }else{
               // Display Error
               $('#err_file').text(response.error);
               $('#err_file').removeClass('d-none');
               $('#err_file').addClass('d-block');
             } 
           },
           error: function(response){
              console.log("error : " + JSON.stringify(response) );
           }
         });
      }else{
         alert("Please select a file.");
      }

    });
  });
  </script>

</body>
</html>

Элементы кода, которые будут использованы в примерах.

XMLHttpRequest, — это класс, для работы AJAX.

request – это переменная или константа в которой будет хранится, — экземпляр класса XMLHttpRequest, объект с набором методов.

url – это путь до файла на сервере, который будет обрабатывать наш запрос. В примерах с GET методом, в нем будут передаваться данные со стороны клиента.

.open() – это метод где мы задаем, первым параметром, — метод передачи данных, а вторым url.

.setRequestHeader() – это метод для указания передаваемых заголовков, здесь мы можем указать что данные идут в url либо закрытым способом, либо хотим получить данные от сервера в json формате.

.send() – это последний этап создания http запроса. С помощью него также можно передать тело запроса т.е. данные от браузера к серверу. Можно не чего не передавать или прямо указать null.

onreadystatechange – это событие, которое случится, когда нам придет ответ от сервера.

readyState – это метод экземпляра, который сообщает статус HTTP-запроса, вот возможные значения, которые он может дать:

Значение Описание
    Метод open() не вызван
1     Метод open() вызван
2     Получены заголовки ответа
3     Получено тело ответа
4     Передача ответа выполнена

status или statusText – возвращают статус http заголовков, нам нужен ответ 200. Хотя бывают и 404 или 500.

.responseText – данные, которые придут от сервера в виде строки.

.response – данные вернуться в json формате, тут как бы мы преобразуем сразу в объект, и дальше работаем уже как с объектом.

.text() – используется в запросе fetch, возвращает строку.

.json() – используется в запросе fetch, возвращает json обращенный в объект.

HTML-код формы

Для начала создадим саму форму на HTML. Для примера будем использовать только 3 поля: имя, телефон и сообщение. Один важный момент: у тега обязательно должен быть id. Если на странице будут использоваться несколько форм, то id соответственно должны быть различные.

Зачем это нужно? Именно по этому идентификатору скрипт и будет отличать отправленную форму от других. И при этом не возникнет необходимости делать несколько включений одного и того же JavaScript кода. Но тут опять же все индивидуально и вы можете переделать код как вам удобно.

<form id="feedback-form" action="">
	<input type="text" name="name" required placeholder="Ваше имя">
	<input type="tel" name="phone" required placeholder="Ваш телефон">
	<textarea name="text" placeholder="Ваш текст"></textarea>
	<input type="submit" name="submit" value="Отправить">
</form>

В форме используем атрибут в зависимости от типа поля. Это даст дополнительное преимущество при проверке вводимых данных. Чаще всего приходится использовать такие поля как:

  • text — простое текстовое поле
  • tel — телефон
  • email — e-mail
  • hidden — скрытое текстовое поле

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

Пример использования метода $.get()

Здесь приводится пример создания запроса AJAX с помощью метода и простая обработка ответа. Для работы примера нужно на сервере создать простой текстовый файл с именем  , содержащий следующий текст:

{
  "city": "Васюки",
  "date": "18 марта 2012",
  "forecast": "Зубодробительный холод и слякоть",
  "maxTemp": +1
}

Данный файл будет имитировать ответ в формате JSON, который мог быть сформирован скриптом прогноза погоды на сервере.

Затем создаем страницу в той же папке что и :

<!doctype html>
<html lang="ru">
<head>
<title>Прогноз погоды</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
 
<script>
 
  $( function() {
 
    $('#getForecast').click( function() {
      var data = { city: "Васюки", date: "20120318" };
      $.get( "getForecast.txt", data, success, "json" );
    } );
 
    function success( forecastData ) {
      var forecast = forecastData.city + " прогноз на " + forecastData.date;
      forecast += ": " + forecastData.forecast + ". Максимальная температура: " + forecastData.maxTemp + "C";
      alert( forecast );
    }
 
  } );
 
</script>
 
</head>
 
<body>
 
<button id="getForecast">Получить прогноз погоды</button>
 
</body>
</html>

Открываем в браузере и нажимаем кнопку «Получить прогноз погоды». В окне сообщения получим прогноз погоды с нашего сервера.

Вот как работает данный код:

  1. содержит элемент «Получить прогноз погоды» с ID .
  2. JavaScript вверху страницы выполняется как только страница будет загружена и DOM окажется в состоянии готовности.
  3. Код JavaScript сначала привязывает обработчик события к кнопке . Данный обработчик выполняет AJAX запрос GET к , передавая название города и дату для прогноза. Также определяется возвратная функция которая будет выполняться по завершению запроса. Формат возвращаемых сервером данных определяется как JSON.
  4. Файл возвращает браузеру данные прогноза в формате JSON.
  5. Вызывается функция . jQuery разбирает данные JSON, полученные от , конвертирует их в объект JavaScript, и передает их в функцию.
  6. Функция возвращает объект данных и выводит сообщение, которое содержит несколько свойств объекта, включая название города, прогноз и температуру.

Простой пример в несколько строк демонстрирует работу запроса AJAX с использованием метода .

3 ответа

1

Лучший ответ

Вы ищете https://github.com/whipsterCZ/laravel-ajax

Он делает именно то, что вы хотите, и многое другое !

отправка форм через ajax проста, как это — не требуется настройка

HTML

контроллер

Он также проверяет форму (через пользовательский FormRequest) и показывает ошибки (в errorBag или непосредственно над входами)

29 апр. 2016, в 14:39
Поделиться

В той же области

Моя форма.blade.php

Моя функция.js

Добавить маршруты sendContact в routes.php и присвоить функцию

В My Contrller @sendcontacto

29 апр. 2016, в 17:42
Поделиться

Вот пример использования jquery

контроллер

Что не так с этим примером?

29 апр. 2016, в 16:25
Поделиться

Ещё вопросы

  • 1Рефакторинг кода для соблюдения принципов ООП
  • 1Как увеличить изображения Coverflow с помощью масштабирования пинч в Android
  • iFrame перезагружает фрейм, а не страницу
  • Проверка значений по массиву
  • 1Гарантируется ли неизменность объектов, хранящихся в кэше 2-го уровня Hibernates?
  • C # подключиться к MSSQL .mdf БД без сервера
  • если оператор не работает и не показывает эхо
  • Кнопка анимированная. Когда: активно влияет на всю страницу
  • Выберите одно и то же значение несколько раз
  • 1Узнать текущую позицию вида после применения некоторых преобразований
  • Почему Jquery не включает классы при создании элементов?
  • какой тип данных для чтения нано второго значения?
  • 1Не работает классификатор Android Layout?
  • 1Как мне преобразовать этот список словарей в таблицу или файл csv?
  • 1Перенаправить IP-адрес на доменное имя в .htaccess
  • 1Фильтрация информационного кадра Pandas по условию и минимальному значению в столбце
  • HTML-кнопка onClick слушатель, вызывающий HTML-форму onSubmit функции JavaScript
  • Невозможно получить записи с датой и временем меньше системной даты
  • Как я могу войти в MySQL через код C ++, используя xdevapi?
  • 1Есть ли библиотека обработки фотографий на андроид?
  • Производительность SQL-запросов
  • 1Java: Как найти индекс последнего элемента частично инициализированного отсортированного массива
  • AngularJS Я хочу получить значения для нескольких полей в одном столбце
  • 1С трудом пытаясь развернуть мое приложение vue-cli на heroku
  • Как получить метки конечных точек в соединении JSPLUMB?
  • Изменить строку запроса без перезагрузки / обновления
  • 1Начать новый отступ с ошибкой
  • Вызов функции, когда объект определен в другом скрипте
  • 1BeautifulSoup — TypeError: элемент последовательности 0: ожидаемый экземпляр str
  • 1Не удается получить содержимое различных тегов «h» с помощью селектора.
  • 1Я получаю неправильный ответ, когда я получаю API Википедии
  • 1Переменная не может быть разрешена. Android regex
  • Изменение порядка элементов списка с помощью jQuery путем извлечения имен их классов
  • 1Как считать вызовы DOM API?
  • 1Можем ли мы вызвать конструктор класса?
  • MySQL NOT REGEXP не работает при исключении результатов
  • 12-опционный алгоритм для решения задачи коммивояжера в Python
  • 1MySQLi — вставка нескольких строк — пустой массив POST
  • MySQL: запрос с переменной AS не работает
  • Отключить кнопку после отправки формы
  • Невозможно сделать таблицу прокручиваемой
  • 1Отделение значений от строки в PHP
  • 1Изменение основного () для запуска в затмении
  • внутреннее объединение в нескольких таблицах с использованием одного столбца, оказывающего эффект «множителя» на значения результата
  • 1Поиск перекрывающихся списков в списке списков
  • Развернуть определенные строки в Angular-UI-Grid
  • Как рассчитать высоту HTML-элемента DIV по отношению к существующему разрешению экрана с помощью CSS?
  • Как приостановить (проигрывать) фоновую музыку при нажатии кнопки следующей вкладки
  • Улучшение производительности выбора оператора

Концепция технологии AJAX

Как вы уже поняли, эта «золотая» технология позволяет нам обмениваться данными меду браузером и сервером в фоновом режиме, не обновляя страницу. Говоря по-умному, сей обмен является асинхронным.

Под асинхронностью в программировании я понимаю процесс выполнения второстепенного действия, не прекращая основное.

Под асинхронность относительно AJAX можно представить, что первостепенным действием является процесс отображения страницы браузером. А второстепенным – обработка запросов пользователя сервером. В момент выполнения операций на стороне сервера, благодаря аяксу, браузер ждет ответа, не ограничивая работу пользователя со страницей.

Итак, концепция такова: между браузером и сервером не переставая происходит обмен данными, которые:

  1. Вводятся в браузер средствами пользовательского интерфейса;
  2. Отправляются на сервер;
  3. Обрабатываются на сервере, возможно, заносятся в БД;
  4. В это время браузер ожидает возвращение ответа;
  5. Пока браузер ждет, он не прекращает работу пользователя;
  6. Дождавшись данных от сервера в определенном формате, обрабатывает их и выводит в контент HTML страницы.

Вы можете пронаблюдать представленный процесс на схематической иллюстрации работы описываемой технологии.

Осталось упомянуть важный момент: данные циркулирующие между сервером и браузером, должны отвечать определённым правилам форматирования. Такие правила обычно описывают два формата:

  1. XML(eXtensible Markup Language) — расширяемый язык разметки;
  2. JSON(JavaScript Object Notation) —текстовый формат основанный на JavaScript.

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

Технология AJAX расшифровывается как (Asynchronous JavaScript and XML), из этого можно сделать вывод, что разработчики в первую очередь предполагают использование формата XML. Но на деле, как показывает практика все чаще используется формат JSON, в силу своего минимализма. Другими словами – работать с обоими форматами можно одинаково хорошо, но один и тот же набор данных, представленный в JSON и XML, в первом будет иметь меньший размер. Следовательно, если JSON имеет меньший размер, то и передаваться он будет быстрее, чем XML.

Включаем кэширование для AJAX запросов

По умолчанию все AJAX запросы НЕ кэшируются браузером для этого PHP устанавливает специальные заголовки функцией nocache_headers().

Чаще всего AJAX запросы кэшировать и не надо, потому что они должны возвращать свежие данные, но бывают случаи когда такое кэширование может сэкономить ресурсы и увеличить скорость работы скрипта. Например, если у нас есть сложный фильтр товаров который юзеры используют постоянно. Тут было бы разумно кэшировать все результаты фильтра например на пару часов, все равно товары не добавляются с такой скоростью…

Как включить кэширование для указанных AJAX запросов смотрите во втором примере функции nocache_headers().

Указание ожидаемого типа данных

При использовании методов get() и post() библиотеке jQuery приходится определять тип данных, получаемых от сервера в ответ на запрос. Данными может быть все что угодно, начиная от HTML-кода и заканчивая файлами JavaScript. Для определения типа данных библиотека jQuery использует содержащуюся в ответе информацию, и в частности — заголовок Content-Type. Как правило, этого вполне достаточно, но иногда jQuery приходится оказывать небольшую помощь. Обычно необходимость в этом возникает из-за указания сервером неверного MIME-типа в ответе.

Можно изменить информацию, поставляемую сервером, и сообщить jQuery, какой тип данных ожидается, передавая методам get() и post() дополнительную информацию. Аргумент может принимать одно из следующих значений:

  • xml
  • json
  • jsonp
  • script
  • html
  • text

В примере ниже показано, как задать ожидаемый тип данных для метода post():

Теперь, если вы удалите из серверного сценария строку, с явной установкой заголовка, пример все равно будет работать корректно:

Файл app.py сам проект на Flask

Строка 6 форма обратной связи.

Строка 21 декоратор обработки url «/send».

Строка 22 функция отправки «сообщения».

Строка 24 если валидация успешна, возвращает json с положительным ответом (строка 27) иначе с отрицательным (строка 30).

from flask import Flask
from flask import request
from flask import render_template
import json
#  форма для обратной сзвязи
from forms import ContactForm

app = Flask(__name__)
app.config = "12345"


@app.route('/', methods=)
def index():
    form = ContactForm()

    return render_template("index.html",
                           title="index page",
                           form=form)


@app.route('/send', methods=)
def send():
    form = ContactForm()
    if request.method == "POST":
        if form.validate_on_submit():
            #  отправить почту, записать в БД и т. д.
            return json.dumps({'success': 'true', 'msg': 'Ждите звонка!'})
        else:
            #  обработать ошибку
            return json.dumps({'success': 'false', 'msg': 'Ошибка на сервере!'})


if __name__ == '__main__':
    app.run(debug=True)

Отправка HTTP-заголовков

Метод позволяет указывать заголовки HTTP-запроса. Для этого используется параметр .

В этом примере на сервер отправляется значение, хранящееся в поле ввода текста с .

$(document).ready(function () {
 $("#btnSend").on('click', function (){
   $.ajax({
     url: 'header.php',
     type: 'post',
     dataType: 'html',
     headers: {'x-my-header': $('#header').val()},
     success: function(data){
       $('#target').html(data);
     }
   });
 });
});

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

$_SERVER;

Символы переводятся в верхний регистр, и к имени добавляется префикс «».

Форма в модальном окне

Нашу форму можно показать и в модальном окне. Модалку будет выводить библиотека Magnific Popup.

HTML код

Код кнопки

Код формы

Инициализируем модальное окно и форму. Давайте сделаем автоматическое закрытие окошка через 3 сек. после успешной отправки формы. Код вызова Magnific Popup вы также найдете в файле scripts.js.

Как включить Recaptcha?

Если вы хотите включить рекаптчу в форме, то вам необходимо добавить пустой блок с классом recaptcha в html-коде формы в том месте, где вы хотите ее вывести. Далее в коде вызова плагина формы передаем опцию captcha со значением true, а опцииcaptchaPublicKey передаем ваш публичный ключ recaptcha. Публичный и приватный ключи можете получить здесь.

Далее открываем файл обработчика формы submit.php из директории form-submit. Ищем переменную recaptchaOn (примерно 7-я строка) и выставляем ей значение true. Далее ищем переменную $secret (примерно 89-я строка) и меняем приватный ключ на свой.

В принципе все. После этих манипуляций каптча у вас должна появиться.

Теперь давайте заглянем в файл обработчика (submit.php) формы и пройдемся по основным кускам кода. Обработчик работает на языке php, поэтому если хотите протестировать форму вам необходимо будет использовать локальный сервер.

AJAX Action

Следующий шаг заключается в создании PHP-функции,  необходимой для запуска  WordPress AJAX-запроса

WordPress использует единичный файл  “admin-ajax.php” для всего, что связано с AJAX. Чтоб идентифицировать каждый запрос и отреагировать на него правильным результатом/данными  WP использует переменную “action” , отсылая данные в качестве уникального идентификатора и загружая экшн-хук, основываясь на action-запросе.

Так что в файле “admin-ajax.php” WordPress загрузит функцию, в основе которой лежит запросный экшн, основанный на экшн-хуке.

Вот пример:

    $.ajax({
        url: my_ajaxurl,
        data: {
            action     : 'my_ajax_action', // load function hooked to: "wp_ajax_*" action hook
            first_name : 'John',           // PHP: $_POST
            last_name  : 'Cena',           // PHP: $_POST
        },
    });

Так, для этого AJAX, мы можем показать результат в PHP –функции, используя wp_ajax_*экшн-хуки, как здесь:

    /* Load Ajax Callback to "wp_ajax_*" Action Hook */
    add_action( 'wp_ajax_my_ajax_action', 'my_ajax_action_callback' );
     
    /**
     * Ajax Callback
     */
    function my_ajax_action_callback(){
        $first_name = isset( $_POST ) ? $_POST : 'N/A';
        $last_name = isset( $_POST ) ? $_POST : 'N/A';
        ?>
        <p>Hello. Your First Name is <?php echo $first_name; ?>.</p>
        <p>And your last name is <?php echo $last_name; ?>.</p>
        <?php
        wp_die(); // required. to end AJAX request.
    }

На самом деле WordPress  имеет два экшн-хука для AJAX-возврата:

  1. wp_ajax_* (тот же, что и выше): для авторизованного пользователя
  2. wp_ajax_nopriv_* :для не авторизованного пользователя.

Так, если вы хотите отобразить один и тот же результат для авторизованных и не авторизованных пользователей, мы можем использовать это (просто используйте ту же callback-функцию для обоих хуков):

    add_action( 'wp_ajax_my_ajax_action', 'my_ajax_action_callback' );
    add_action( 'wp_ajax_nopriv_my_ajax_action', 'my_ajax_action_callback' );

Но, мы также можем отобразить отличные сообщения (или ссылку авторизации) для авторизованного пользователя, вот так:

    /* Load Ajax Callback to "wp_ajax_nopriv_*" Action Hook */
    add_action( 'wp_ajax_nopriv_my_ajax_action', 'my_ajax_action_logged_out_user_callback' );
     
    /**
     * Ajax callback for logged-out user:
     */
    function my_ajax_action_logged_out_user_callback(){
        ?>
        <p>Please log in.</p>
        <?php
        wp_die(); // required. to end AJAX request.
    }

Если вы используете WordPress AJAX в админ-панели, вам просто нужно использовать “wp_ajax_*” –хук, потому что не авторизованные пользователи просто не могут посетить админ-панель. Но если вы используете AJAX во фронтенде и для пользователя, и для посетителя (например, для отображения  контента записи), вам нужно использовать оба хука —  “wp_ajax_*” и “wp_ajax_nopriv_*”.

Вы можете делать все, используя callback-функцию

  • Вы можете загрузить запись, используя “wp_query”
  • Вы можете возвращать опции, используя “get_option()”
  • Вы можете получать метаданные записи, сохранить их и т. д.

Вы можете протестировать этот простой шорткод-плагин, используя код, данный выше:

Сделать это очень просто. Создаем запись, добавляем шорткод  внутрь нее, публикуем и видим результат.

Определяем тип данных ответа

Обычно, серверная сторона передает данные в одном из нескольких типовых форматов, включая XML, JSON, JavaScript, или HTML. По умолчанию jQuery пытается определить наиболее подходящий формат и разобрать данные соответствующим образом. Но лучше явно определить формат.

Для указания формата надо передать четвертый аргумент методу . Данный аргумент может быть строкой из следующего списка:

Например, если вы знаете, что скрипт сервера возвращает данные в формате JSON, то вызываете метод следующим образом:

$.get( "http://example.com/getForecast.php", data, myCallback, "json" );

Как прочитать данные в формате JSON с помощью jQuery

4.1 Показать товары на странице при загрузке

В папке products откройте файл read-products.js

Следующий код вызовет метод showProducts() при первой загрузке веб-страницы.

Функция showProducts() покажет список продуктов в виде HTML-таблицы. Поместите следующий код в файл read-products.js.

4.2 Показать товары при клике на кнопку

Следующий код вызовет метод showProducts() при нажатии кнопки с классом кнопки read-products-button.

Кнопку можно найти в HTML-шаблонах «Создать товар и «Обновить товар. Мы увидим это в следующих разделах.

Поместите следующий код под showProducts(); предыдущего раздела.

4.3 Создание функции showProducts()

Теперь мы создадим метод showProducts(). Замените комментарий // здесь будет метод showProducts() в файле read-products.js следующим кодом.

4.4 Получение списка товаров

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

4.5 Создание кнопки «Добавить товар»

Мы должны добавить кнопку «Создать продукт» в списке товаров. Мы заставим эту кнопку работать позже в этом руководстве.

Поместите следующий код после открывающей фигурной скобки предыдущего раздела.

4.6 Создание HTML-таблицы

Мы должны начать строить HTML-таблицу, в которой появится список продуктов.

Следующий код создаст HTML-таблицу с ее заголовком. Разместите его после кода предыдущего раздела.

4.7 Построение строки таблицы для каждой записи

Мы пройдемся по каждой записи, возвращаемой API. Для каждой записи мы создадим строку таблицы.

Помимо данных о товаре, строка таблицы также будет иметь кнопки «Действие». К ним относятся кнопки «Просмотр», «Редактировать» и «Удалить».

Замените комментарий // здесь будут строки следующим кодом.

4.8 Вставка контента на страницу

Мы должны сделать так, чтобы HTML-таблица появилась на нашей веб-странице. Мы сделаем это, выводя таблицу в div page-content.

Поместите следующий код после закрывающего тега table

4.9 Изменение заголовка страницы

Следующий код изменит «заголовок» на веб-странице и «заголовок» на вкладке браузера.

Поместите следующий код после кода предыдущего раздела.

jQuery — Сериализация формы

В jQuery для получения всех полей формы , и можно использовать следующие методы:

  • serialize() — предназначен для сериализации данных формы в строку запроса.
    имяПоля1=значение1&имяПоля2=значение2...
  • serializeArray() — выполняет кодирование элементов формы в массив, состоящий из имен и значений.

Методы jQuery и оличаются друг от друга только форматом вывода данных. Метод обычно применяется в том случае, когда результат (данные формы) необходимо положить в строку HTTP запроса. Метод наоборот, используется тогда, когда результат, который он предоставил, как правило, ещё необходимо обработать.

Например, рассмотрим, как можно перебрать массив, который вернул метод , с помощью функции :

// создание массива объектов из данных формы
var data = $('#myForm').serializeArray();
// переберём каждое значение массива и выведем его в формате имяЭлемента=значение в консоль
$.each(data,function(){
  console.log(this.name+'='+this.value);
});

Если же вы собираете данные для того чтобы их передать в метод библиотеки jQuery ajax, то в этом случае неважно, какой из этих методов использовать. Т.к

данный метод может принимать данные, закодированные как с помощью метода , так и посредством .

Для того чтобы элемент был сериализован методом или , он должен отвечать критериям «successful controls», указанным в спецификации HTML. Первое условие «successful controls» – это наличие у элемента атрибута . Второе, если форма отправлена не с помощью кнопки , то она (имя и значение кнопки) не будет добавлена в возвращаемую методом строку или массив. Третье, значения из элементов checkboxes и radio кнопок ( с type «radio» или «checkbox») будут включены в набор только в том случае, если они установлены (отмечены). Четвёртое, элементы, которые отключены, обработаны не будут. Т.е. для того чтобы элемент был сериализован, он должен иметь в качестве значение свойства (другими словами, у элемента обязан отсутствовать атрибут ).

Внимание: Методы и не сериализуют данные из элементов, которые используются для выбора файлов. Разберём пример, в котором в зависимости от нажатай кнопки в форме соберём данные с помощью метода или

Для отправки данных на сервер и получения от него ответа будем использовать функцию jQuery. Ответ, который прийдёт с сервера вставим в элемент с идентиикатором

Разберём пример, в котором в зависимости от нажатай кнопки в форме соберём данные с помощью метода или . Для отправки данных на сервер и получения от него ответа будем использовать функцию jQuery . Ответ, который прийдёт с сервера вставим в элемент с идентиикатором .

<!-- Элемент для вывода результата -->
<div id="form_result"></div>
<hr>
<!-- HTML-форма -->
<form id="orderCallBack" action="process.php">
  Ваше имя: <input type="text" name="name" value=""><br>
  Ваш телефон: <input type="text" name="phone" value=""><br>
  Ваше сообщение:<br> <textarea name="message"></textarea><br>
  <input type="submit" name="submit1" value="Заказать звонок" data-method="serialize"><br>
  <input type="submit" name="submit2" value="Заказать звонок" data-method="serializeArray">
</form>
<!-- Сценарий для обработки формы -->
<script>
$(function() {
  // при нажатию на кнопку с типом submit
  $('#orderCallBack input').click(function(e) {
    // отменяем стандартное поведение браузера
    e.preventDefault();
    // переменная, которая будет содержать данные серилизации
    var $data;
    // в зависимости от того какую нажали кнопку, выполняем
    // серилизацию тем или иным способом
    if ($(this).attr('data-method') == 'serialize') {
      $data = $(this).parent('form').serialize();
    } else {
      $data = $(this).parent('form').serializeArray();
    }
    // для отправки данных будем использовать технологию ajax
    //   url - адрес скрипта, с помощью которого будем обрабатывать форму на сервере
    //   type - метод отправки запроса (POST)
    //   data - данные, которые необходимо передать серверу
    //   success - функция, которая будет вызвана, когда ответ прийдёт с сервера
    $.ajax({
      url: $(this).parent('form').attr('action'),
      type: 'post',
      data: $data,
      success: function(result) {
        $('#form_result').html(result);
      }
    })
  });
});
</script>

PHP код, обрабатывающий ajax запрос на сервере:

<?php
// переменная для сохранения результата
$data='';
// переберём массив $_POST
foreach ($_POST as $key => $value) {
  // добавим в переменную $data имя и значение ключа
  $data .= $key . ' = ' . $value . '';
}
// выведим результат
echo $data;
?>

Вышеприведёный код просто формирует строку из данных формы на сервере, которая затем будет отправлена клиенту (браузеру).

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: