Данные JSON отображаются, но таблица не отображается (с использованием таблиц данных - обработка на стороне сервера)

Я использую серверную обработку Yajra DataTables. Я вижу данные JSON, но таблица не заполняется.

Мне удалось заставить DataTables работать с обработкой на стороне клиента, но, поскольку в конечном итоге у меня будет> 50 000 строк данных, я решил попробовать реализовать обработку на стороне сервера, загрузив Yajra DataTables для Laravel 5.8.

Когда я вызываю свой маршрут, я вижу данные в формате JSON, но я вообще не вижу таблицу. Там написано "draw: 0", так что, я полагаю, возникла проблема с рисованием таблицы?

Я пробовал различные решения, упомянутые в переполнении стека и на официальном веб-сайте DataTables, но, похоже, ни одно из них не работает для меня. Например,
- DataTables json не обрабатывается (в Laravel)
- jQuery Datatables - Таблица не заполнена для ответа Ajax
- https://datatables.net/forums/discussion/45444/populate-table-body-with-ajax

Данные JSON, которые я вижу, когда вызываю свой маршрут, следующие:


{
  "draw": 0,
  "recordsTotal": 3,
  "recordsFiltered": 3,
  "data": [

    {
      "id": "1",
      "customerNr": "98764",
      "orderNr": "23478",
      "pallet_id": "66788",
      "status_id": "2",
      "created_by": "Sara",
      "created_at": "04 Jul 2019",
      "updated_at": "2019-07-09 07:23:20"
    },
    {
      "id": "2",
      "customerNr": "99999",
      "orderNr": "22222",
      "pallet_id": "22335",
      "status_id": "1",
      "created_by": "Sophie",
      "created_at": "04 Jul 2019",
      "updated_at": "2019-07-04 08:26:28"
    },
    {
      "id": "3",
      "customerNr": "54657",
      "orderNr": "89856",
      "pallet_id": "11228",
      "status_id": "1",
      "created_by": "Markus",
      "created_at": "08 Jul 2019",
      "updated_at": "2019-07-08 06:59:42"
    },

  ],
  "input": []
}

Вот соответствующие файлы из моего проекта Laravel:

web.php:

Route::get('returned-shipment', ['uses'=>'ReturnedShipmentController@index', 'as'=>'returned-shipment.index']);

ReturnedShipmentController:

public function index(
{
   return DataTables::of(ReturnedShipment::all())->make();
}

index.blade.php:

<div class="row">
    <div id="tbl" class="col-sm-12">
        <table id="overview" class="cell-border display">

            <thead class="tbl-top">
            <tr>
                <th>Retourennummer</th>
                <th>Auftragsnummer</th>
                <th>Datum</th>
                <th>Zustand</th>
            </tr>
            </thead>

            <tfoot class="tbl-bottom">
            <tr>
                <th>Retourennummer</th>
                <th>Auftragsnummer</th>
                <th>Datum</th>
                <th>Zustand</th>
            </tr>
            </tfoot>
        </table>
    </div>
</div>

<script>
    $(document).ready(function () {
        var startingStatus = 'angelegt';
        var table = $('#overview').DataTable({
            "processing": true,
            "serverSide": true,
            "ajax": "{{ route('returned-shipment.index') }}",
            "columns": [
                {data: 'id'},
                {data: 'orderNr'},
                {data: 'created_at'},
                {data: 'status_id'}
            ],
            "search": {
                "search": "angelegt"
            },
            "dom": "<'row'<'col-sm-4'l><'col-sm-8'f>>" +
                "<'row'<'col-sm-12'tr>>" +
                "<'row'<'col-sm-6'i><'col-sm-6'p>>",
            "paging": true,
            "info": true,
            "searching": true,
            "autoWidth": true,
            "language": {
                "paginate": {
                    "previous": "Vorherige Seite",
                    "next": "Nächste Seite"
                },
                "search": "Suche:",
                "info": "Zeige _START_ - _END_ von insgesamt _TOTAL_ Einträgen",
                "lengthMenu": 'Einträge pro Seite' + '<br>' +
                    '<select class="custom-select mr-sm-2" id="inlineFormCustomSelect">' +
                    '<option selected value="10">10</option>' +
                    '<option value="20">20</option>' +
                    '<option value="30">30</option>' +
                    '<option value="40">40</option>' +
                    '<option value="50">50</option>' +
                    '<option value="-1">Alle</option>' +
                    '</select>'
            },
            initComplete: function () {
                /**
                 * Drop-down filter is created for the 4th column "status" in the header and populates it with
                 * the different status values
                 */
                this.api().columns([3]).every(function () {
                    var column = this;
                    var select = $('<select><option value="">alle</option></select>')
                        .appendTo($(column.header()))
                        .on('change', function () {
                            var val = $.fn.dataTable.util.escapeRegex(
                                $(this).val()
                            );

                            column
                                .search(val ? '^' + val + '$' : '', true, false)
                                .draw();
                        });

                    /**
                     * When clicking on drop-down next to status, the sorting function is not activated
                     */
                    $(select).click(function (e) {
                        e.stopPropagation();
                    });

                    /**
                     * Once an option in the drop-down next to status has been selected, you can read the text in
                     * the drop-down
                     */
                    column.data().unique().sort().each(function (d, j) {
                        if (startingStatus === d) {
                            select.append('<option SELECTED value="' + d + '">' + d + '</option>')
                        } else {
                            select.append('<option value="' + d + '">' + d + '</option>')
                        }
                    });

                    /**
                     * When drop-down is clicked on, search field is cleared. Otherwise search field must be
                     * manually cleared before using the drop-down.
                     */
                    $(select).on('click', function () {
                        table.search(" ").draw();
                    });
                });
            }
        });
    });
</script>

Я ожидаю увидеть заполнение таблицы данными.

Если мне нужно предоставить дополнительный код или пояснить что-то еще, не стесняйтесь спрашивать. Я новичок в Laravel и DataTables, поэтому буду очень признателен за вашу помощь.

Заранее спасибо! :)


person Elle    schedule 09.08.2019    source источник
comment
Постарайтесь предоставить минимальный код. По возможности старайтесь использовать фрагменты кода.   -  person Deepak A    schedule 09.08.2019
comment
В javascript может быть ошибка. Попробуйте взглянуть на Console в Developer Tools.   -  person linuxartisan    schedule 09.08.2019
comment
@ObitoUchiha Спасибо за отзыв. Я предоставил код, который, как я думал, необходимо увидеть. Я предполагаю, что могу уменьшить вывод JSON и, возможно, вырезать часть моего Javascript, но я думал, что весь JS имеет значение, поскольку что-то ниже могло быть причиной проблемы.   -  person Elle    schedule 09.08.2019
comment
Не могли бы вы проверить, что сценарий запускает вызов для получения информации? Вы используете маршрут в "ajax": "{{ route('returned-shipment.index') }}",, но согласно документации вы должны использовать строку URL-адреса или строку в параметре URL-адреса объекта: editor.datatables.net/reference/option/ajax   -  person AltShiftZero    schedule 09.08.2019
comment
@DempseyvanWissen Я изменил его на url: Return-shipment, введите: GET в ajax, и я все еще вижу ту же страницу с данными JSON. Однако я только что проверил консоль и получил следующую ошибку: Политика безопасности содержимого: настройки страницы заблокировали загрузку ресурса по адресу https: returns.jdoe.blah.test / favicon.ico (defauolt-src). Может ли это иметь какое-то отношение к этому? Почему вдруг эта иконка упоминается сейчас? Я ничего не менял по этому поводу.   -  person Elle    schedule 09.08.2019
comment
Вероятно, favicon.ico - это автоматический запрос браузера, основанный на другом запросе. Не могли бы вы проверить вкладку «сеть» в «инструментах разработчика», чтобы увидеть, является ли какой-либо из выполненных запросов URL-адресом, который соответствует введенному в поле URL-адресу?   -  person AltShiftZero    schedule 09.08.2019
comment
@DempseyvanWissen Я проверил вкладку сети в инструментах разработки (в Firefox), и, как и ожидалось, вызывается только один URL-адрес: returns.jdoe.blah.test / Return-shipment. Это маршрут, который я зарегистрировал для отображения своей индексной страницы.   -  person Elle    schedule 09.08.2019
comment
@DempseyvanWissen Я только что проверил другой URL-адрес (returns.jdoe.blah.test / Return-shipment / 1), чтобы узнать, работает ли он и работает. Я проверил вкладку сети, и эта страница может загружать значок. Я не понимаю, почему другая страница не может?   -  person Elle    schedule 09.08.2019


Ответы (1)


Я проверил ваш текущий код и ваш JSON. Ваш файл JSON недействителен.


{
  "draw": 0,
  "recordsTotal": 3,
  "recordsFiltered": 3,
  "data": [

    {
      "id": "1",
      "customerNr": "98764",
      "orderNr": "23478",
      "pallet_id": "66788",
      "status_id": "2",
      "created_by": "Sara",
      "created_at": "04 Jul 2019",
      "updated_at": "2019-07-09 07:23:20"
    },
    {
      "id": "2",
      "customerNr": "99999",
      "orderNr": "22222",
      "pallet_id": "22335",
      "status_id": "1",
      "created_by": "Sophie",
      "created_at": "04 Jul 2019",
      "updated_at": "2019-07-04 08:26:28"
    },
    {
      "id": "3",
      "customerNr": "54657",
      "orderNr": "89856",
      "pallet_id": "11228",
      "status_id": "1",
      "created_by": "Markus",
      "created_at": "08 Jul 2019",
      "updated_at": "2019-07-08 06:59:42"
    }
  ],
  "input": []
}

Это правильный формат. Необходимо удалить запятую после последнего объекта в массиве данных. Можете ли вы подтвердить, что это решает вашу проблему? Таблицы данных работают без этой запятой.

person AltShiftZero    schedule 09.08.2019
comment
Привет, спасибо, что взглянули на это, я очень ценю это. На самом деле после моего последнего объекта данных нет запятой - один из первых комментаторов попросил меня удалить код, что я и сделал, и я, должно быть, забыл удалить запятую. В любом случае, данные JSON - это результат, который я получаю на returns.jdoe.blah.test / Return -отгрузка, а не ввод. Я все еще вижу только данные JSON вместо своей таблицы. Это связано с тем, что там написано draw: 0? - person Elle; 09.08.2019
comment
Как видите, в предоставленном вами коде нет ничего плохого: jsfiddle.net/mrdemc/2s76w18v Если я правильно понимаю: HTML-страница с html и JS, как указано выше, не отображает данные, а вместо этого возвращает текстовое представление jsonfile в этом документе без дополнительных ошибок в консоли или из таблиц данных? - person AltShiftZero; 09.08.2019
comment
Да, точно. Вместо таблицы я вижу только данные JSON. Единственная ошибка, которую я обнаружил, - это когда я перешел на вкладку сети в инструментах разработки и увидел ошибку политики безопасности контента в отношении значка. Как вы думаете, это из-за этого? Кроме того, draw не должно быть 0, но я понятия не имею, почему это так. Полагаю, это как-то связано с этим? - person Elle; 09.08.2019