Это будет сосредоточено исключительно на аспектах DataTables "серверного" решения. То, как вы пишете серверную логи c, необходимую для ее поддержки, выходит за рамки этого ответа. Но я надеюсь, что эти заметки как минимум прояснят, какой должна быть эта логика c, и как вы можете к ней подойти.
Допущения
Предположим, у вас есть текстовый файл, содержащий 1000 строк данных как этот (или миллион - но слишком много строк для отправки в браузер и в DataTables, все сразу). Текстовый файл представляет собой простой файл с разделителями каналов, с тремя полями:
id|name|description
1|widget_1|This is a description for widget 1
2|widget_2|This is a description for widget 2
3|widget_3|This is a description for widget 3
...
1000|widget_1000|This is a description for widget 1000
Вы хотите отправлять 10 элементов одновременно в DataTables, используя обработку на стороне сервера.
Ваши данные сопоставляется с простой структурой JSON, например: массив объектов (каждый объект - одна запись):
[
{
"id": 1,
"name": "widget_1",
"description": "This is a description for widget 1"
},
{
"id": 2,
"name": "widget_2",
"description": "This is a description for widget 2"
},
... // more records...
]
Определение DataTable
Ваше определение данных может выглядеть следующим образом - оно намеренно очень просто, на данном этапе:
<body>
<div style="margin: 20px;">
<table id="demo" class="display dataTable cell-border" style="width:100%">
</table>
</div>
<script type="text/javascript">
$(document).ready(function() {
$('#demo').DataTable({
serverSide: true,
ajax: {
url: 'http://localhost:7000/data',
type: 'POST'
},
columns: [
{ title: 'ID',
data: 'id' },
{ title: 'Name',
data: 'name' },
{ title: 'Description',
data: 'description' }
]
});
});
</script>
</body>
Первоначальный ответ
Когда веб-страница впервые отображается, она отправит начальный запрос POST на URL (* 1021). *: 7000 / data ), и он будет ожидать получения ответа JSON от веб-сервера, содержащего данные для отображения.
Поскольку DataTables использует serverSide: true
, DataTables будет ожидать JSON иметь указанную c структуру, как описано здесь .
В частности, сервер должен добавить все обязательные поля (draw
, recordsTotal
, recordsFiltered
и data
) на JSON, которые он отправляет в DataTables .
В нашем случае это будет выглядеть так: обратите внимание, что это просто наша ранее упомянутая структура JSON с добавлением нескольких дополнительных полей метаданных:
{
"draw": 1,
"recordsTotal": 1000,
"recordsFiltered": 1000,
"data": [{
"id": 1,
"name": "widget_1",
"description": "This is a description for widget 1"
}, {
"id": 2,
"name": "widget_2",
"description": "This is a description for widget 2"
}, {
"id": 3,
"name": "widget_3",
"description": "This is a description for widget 3"
}, {
"id": 4,
"name": "widget_4",
"description": "This is a description for widget 4"
}, {
"id": 5,
"name": "widget_5",
"description": "This is a description for widget 5"
}, {
"id": 6,
"name": "widget_6",
"description": "This is a description for widget 6"
}, {
"id": 7,
"name": "widget_7",
"description": "This is a description for widget 7"
}, {
"id": 8,
"name": "widget_8",
"description": "This is a description for widget 8"
}, {
"id": 9,
"name": "widget_9",
"description": "This is a description for widget 9"
}, {
"id": 10,
"name": "widget_10",
"description": "This is a description for widget 10"
}]
}
Это сервер ответственность за построение этого JSON - первые 10 записей набора данных сервера. Сервер также сообщает DataTables, что он имеет в общей сложности 1000 записей и что он не отфильтровал никаких данных (пока) - следовательно, после фильтрации также имеется в общей сложности 1000 записей.
DataTables нуждается во всем этом информация, поэтому он знает, сколько кнопок разбивки на страницы нужно отобразить, и какие данные разбивки на страницы нужно показать.
Обратите внимание, что вся ответственность за выполнение всей этой работы лежит на сервере, поэтому он называется обработкой на стороне сервера.
Клиент (браузер) может отображать только 10 записей, поэтому это происходит быстро.
(я только что заметил, что на скриншоте упоминается «500 записей» - это ошибка в моем коде на стороне сервера - фильтра нет, поэтому мне нужно это исправить).
Последующие запросы
Когда пользователь нажимает на кнопка навигации по странице (например, страница «4»), которая запускает новый запрос от DataTables к серверу. DataTables создает этот запрос автоматически, используя поля, описанные здесь .
Запрос отправляется как данные формы.
В нашем примере запрос выглядит так:
"Form data": {
"draw": "5",
"columns[0][data]": "id",
"columns[0][name]": "",
"columns[0][searchable]": "true",
"columns[0][orderable]": "true",
"columns[0][search][value]": "",
"columns[0][search][regex]": "false",
"columns[1][data]": "name",
"columns[1][name]": "",
"columns[1][searchable]": "true",
"columns[1][orderable]": "true",
"columns[1][search][value]": "",
"columns[1][search][regex]": "false",
"columns[2][data]": "description",
"columns[2][name]": "",
"columns[2][searchable]": "true",
"columns[2][orderable]": "true",
"columns[2][search][value]": "",
"columns[2][search][regex]": "false",
"order[0][column]": "1",
"order[0][dir]": "asc",
"start": "30",
"length": "10",
"search[value]": "",
"search[regex]": "false"
}
Эти поля сообщают серверу все, что ему нужно знать, чтобы он мог подготовить правильный ответ.
В нашем случае наиболее важными являются следующие поля:
"start": "30",
"length": "10"
Начните со строки 30 и предоставьте 10 записей.
Опять же, ответственность за подготовку ответа JSON лежит на сервере.
В нашем случае это означает сервер должен иметь лог c для чтения текстового файла до правильной начальной точки (строка данных 31 - запомните, что смещение начинается с нуля) и всего 10 строк (строки с 31 по 40).
Другие поля в приведенном выше запросе от DataTables описывают, как данные должны быть отсортированы и отфильтрованы. В нашем случае нет фильтра "search[value]": "",
- и данные должны сортироваться по первому столбцу в порядке возрастания.
Заключительные примечания
Я специально не описал следующее:
1) Как ваш серверный код обрабатывает создание ответов JSON, которые он отправляет обратно в DataTables;
2) Как ваш серверный код анализирует запросы формы, полученные из DataTables.
Все зависит полностью от того, какая у вас технология на стороне сервера. DataTables не волнует. Он просто передает JSON сообщения - он не связан с реализацией на стороне сервера - как и должно быть.
Относительно опции "defer render", описанной здесь , это улучшение, которое вы можете добавить, если вам это нужно. Но я бы порекомендовал сначала получить более базовую c серверную реализацию.