Как разбить на страницы таблицу данных, которая отображается через AJAX в Laravel? - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь отобразить шаблон 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 слишком сложным способом?Я пытался как можно больше придерживаться условных обозначений фреймворка, но я открыт, чтобы попытаться сделать это по-другому, если это облегчит эту проблему.

1 Ответ

0 голосов
/ 21 июня 2019

Я предполагаю, что getSalesForcast - это область действия, поэтому она должна возвращать коллекцию. Я бы порекомендовал использовать forPage. Я не уверен на 100%, как вы получаете дату и конечный параметр в запросе, но с учетом этих значений это должно сработать. Кроме того, я предполагаю, что вы используете временные метки.

const $page_limit = 25;

public function get_sales_forecast(Request $request) {

    //Get current page
    $current_page = LengthAwarePaginator::resolveCurrentPage();

    //Get data from Sales model
    $sales_forecast = Sales::where('created_at','>',$request->input('start_date'))
                      ->where('created_at','<',$request->input('end_date'))
                      ->forPage($current_page,self::$page_limit)
                      ->get();

    //Create paginator 
    $LengthAwarePaginator = new LengthAwarePaginator($sales_forecast, $sales_forecast->count(), self::$page_limit);

    //Set URL path for generated links
    $paginated_items->withPath($LengthAwarePaginator->url($current_page));

    //Render the view as an HTML string
    $html = view('sales-forecast-table')->with(['sales_forecast' => $LengthAwarePaginator->items()])->render();

    //Return the HTML 
    return response()->json(compact('html'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...