Я пытаюсь отобразить шаблон Blade в Laravel, который содержит HTML-таблицу с данными, полученными через AJAX, и мне нужно вручную разбить на страницы результаты, используя Laravel LengthAwarePaginator.
У меня есть основной блейд-файл с именем reports.blade.php , в котором содержится вызов AJAX для метода контроллера с именем SalesController @ get_sales_forecast .В этом контроллере я извлекаю некоторые данные из базы данных MSSQL и отрисовываю частичное представление под названием sales-forecast-table , которое помещает данные в таблицу HTML.Это все работает успешно.
Однако сейчас я пытаюсь разбить эти результаты на страницы, потому что набор данных очень большой.
В моем главном блейд-файле (reports.blade.php) вызов AJAX выглядит следующим образом:
$.ajax({
type: 'POST',
url:'{{action('SalesController@get_sales_forecast')}}',
data: {
_token: $('meta[name="_token"]').attr('content'),
start_date: $('#txtStartDate').val(),
end_date: $('#txtEndDate').val()
},
success:function(data) {
$('#table-sales-forecast').html(data.html);
}
});
Кроме того, reports.blade.php включает частичное представление:
<div class="table-responsive" id="table-part-forecast-annual">
@include('sales-forecast-table')
</div>
Вызов AJAX поступает в SalesController @ get_sales_forecast, который выглядит следующим образом:
public function get_sales_forecast(Request $request) {
//Get data from Sales model
$sales_forecast = Sales::getSalesForecast($start_date, $end_date);
//Get current page
$current_page = LengthAwarePaginator::resolveCurrentPage();
//Create new collection
$item_collection = collect($sales_forecast);
//Define how many items to show per page
$page_limit = 25;
//Slice the collection to get the items to display in current page
$current_page_items = $item_collection->slice(($current_page * $page_limit) - $page_limit, $page_limit)->all();
//Create paginator
$paginated_items = new LengthAwarePaginator($current_page_items, count($item_collection), $page_limit);
//Set URL path for generated links
$paginated_items->withPath($request->url());
//Render the view as an HTML string
$html = view('sales-forecast-table')->with(['sales_forecast' => $paginated_items])->render();
//Return the HTML
return response()->json(compact('html'));
}
И представление, отображаемое из вызова AJAX ( sales-forecast-table.blade.php ) выглядит так:
@if(isset($sales_forecast))
{!!$sales_forecast->links()!!}
<table class='table table-hover table-striped table-bordered'>
@foreach($sales_forecast as $record)
<tr>
<td>{{$record->id}}</td>
<td>{{$record->location}}</td>
<td>{!!$record->customer!!}</td>
<td>{!!$record->forecast!!}</td>
@endforeach
</table>
@endif
На этом этапе таблица выполняетрендер и ссылки на страницы даже появляются.Таблица отображает только первые 25 строк, как и ожидалось (для строки $page_limit = 25
) с выбранной страницей 1, но когда я нажимаю на любую из других ссылок на страницу, я просто получаю сообщение об ошибке «Нет сообщения».Сообщение об ошибке настолько расплывчато, что я не совсем уверен, куда идти дальше.Возможно, я использую AJAX в Laravel слишком сложным способом?Я пытался как можно больше придерживаться условных обозначений фреймворка, но я открыт, чтобы попытаться сделать это по-другому, если это облегчит эту проблему.