Простое разбиение на страницы в datatable с использованием ajax без отправки общего количества с сервера - PullRequest
0 голосов
/ 03 декабря 2018

Я использую DataTables 1.10.5.Моя таблица использует обработку на стороне сервера через ajax.

$('#' + id).dataTable({
  processing: true,
  serverSide: true,
  ajax: 'server-side-php-script-url',
  "pagingType": "simple_incremental_bootstrap"
});

Все будет работать правильно, если я отправлю 'recordsTotal' в ответе сервера.Но я не хочу подсчитывать общее количество записей из-за проблем с производительностью.Поэтому я попытался использовать плагин для разбивки на страницы simple_incremental_bootstrap .Однако это не работает, как ожидалось.Следующая кнопка всегда возвращает первую страницу.Если я дам 'recordsTotal' в ответе сервера, этот плагин будет работать правильно.Я обнаружил, что если мы не передадим «recordsTotal», параметр «start», отправляемый датируемым сценарием на стороне сервера, всегда равен 0. Поэтому мой сценарий на стороне сервера всегда будет возвращать первую страницу.

Согласно это обсуждение , обработка на стороне сервера без вычисления общего количества невозможна, потому что «DataTables использует количество записей, которое передается обратно для обработки элементов управления подкачкой».Предложенный обходной путь: «Таким образом, нужны записи отображения, но можно было бы просто передать обратно статическое число (например, 1000 000 или что-то еще), что заставило бы DataTables думать о миллионе строк.Вы можете скрыть информационный элемент, если эта информация полностью поддельная! »

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

1 Ответ

0 голосов
/ 04 декабря 2018

Обходной путь, который стоит попробовать ..

Если мы не отправим recordsTotal с сервера, разбиение на страницы не будет работать должным образом.Если мы отправим высокое статическое число в виде recordsTotal , в таблице будет отображаться активная кнопка Next , даже если на следующей странице нет данных.

Итак, я оказался в решении, которое использует два параметра, полученных в сценарии ajax - ' start ' и ' length '.

Если строкина текущей странице меньше, чем ' limit ' нет данных на следующей странице.Таким образом, общее количество будет равно « start » + « текущее количество страниц ».Это отключит кнопку Далее на последней странице.

Если строки на текущей странице больше или равны ' limit ', на следующих страницах больше данных.Затем я получу данные для следующей страницы.Если на следующей странице есть хотя бы одна строка, отправьте recordsTotal что-то большее, чем ' start + limit '.При этом отобразится активная кнопка Next .

Пример кода:

$limit = require_param('length');
$offset = require_param('start');
$current_page_data = fn_to_calculate_data($limit, $offset); // in my case, mysqli result.
$data = “fetch data $current_page_data”;
$current_page_count = mysqli_num_rows($current_page_data);
if($current_page_count >= $limit) {
    $next_page_data  = fn_to_calculate_data($limit, $offset+$limit);
    $next_page_count = mysqli_num_rows($next_page_data);
    if($next_page_count >= $limit) {
        // Not the exact count, just indicate that we have more pages to show.
        $total_count = $offset+(2*$limit);
    } else {
        $total_count = $offset+$limit+$next_page_count;
    }
} else {
    $total_count = $offset+$current_page_count;
}
$filtered_count = $total_count;

send_json(array(
    'draw' => $params['draw'],
    'recordsTotal' => $total_count,
    'recordsFiltered' => $filtered_count,
    'data' => $data)
);

Однако это решение добавляет нагрузку на сервер, так как дополнительно рассчитывает количество строк на следующей странице.,В любом случае, это небольшая нагрузка по сравнению с итоговыми строками вычислений.

Нам нужно скрыть информацию о количестве из нижнего колонтитула таблицы и использовать простую нумерацию страниц.

  dtOptions = {};
  dtOptions.pagingType = "simple";
  dtOptions.fnDrawCallback = function() {
    $('#'+table_id+"_info").hide();
  };
  $('#' + table_id).dataTable(dtOptions);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...