0
votes

I am working on a laravel project, where I get data from an API then I want to display it on pages. I want the return to be spread out across 4 pages, each page with 10 results each. What I have so far, seems like it should work, but I am missing one piece, so any advice and help would be appreciated. So this is how it is suppose to work with code:

1) The users types in a book title in a search box.

<form method=POST action='/search'>
        @csrf
        <input type="text" name="search_term"/>
        <input type="submit" value="Search"/>
    </form>

2) there input is then sent to my controller, which queries the google books api.

class search extends Controller {
public function search(){
    $current_page = LengthAwarePaginator::resolveCurrentPage();
    echo $current_page;
    $term = request('search_term');
    $term = str_replace(' ', '_', $term);
    $client = new \Google_Client();
    $service = new \Google_Service_Books($client);
    $params = array('maxResults'=>40);
    $results = $service->volumes->listVolumes($term,$params);
    $book_collection = collect($results);
    $current_book_page = $book_collection->slice(($current_page-1)*10,10)->all();
    $books_to_show = new LengthAwarePaginator($current_book_page,count($book_collection),10,$current_page);
    return view('library.search')->with(compact('books_to_show'));
    }
}

3) the results are then displayed on my blade

@extends('home')
@section('content')
@foreach($books_to_show as $entries)
<div class="row">
    <div class="col-sm-auto">
        <img class="w-50 img-thumbnail" src={{$entries['volumeInfo']['imageLinks']['smallThumbnail']}}/>
    </div>
    <div class="col-sm">
        {{$entries['volumeInfo']['title']}}<br/>
        @if($entries['volumeInfo']['authors']!=null)
        by: 
        @foreach($entries['volumeInfo']['authors'] as $authors)
            {{$authors}}
        @endforeach
        @endif

    </div>
</div>

@endforeach
{{$books_to_show->links()}}
@endsection

This all works fine and as expected. I get 10 results on the view, and then I have a bar at the bottom which give shows me 4 different pages to choose from.

When I first type in a search term such as "William Shakespeare" My page url is: localhost:8000/search

But, when I click on any of the pages my url becomes: http://localhost:8000/?page=2

I understand that the ?page=* is how the pagination determines which page you are viewing, and that should be sent back to the controller. But, I am missing something on sending it back to the controller I think.

Still kind of fresh to this, so any advice is more then greatly appreciated.

1

1 Answers

1
votes

LengthAwarePaginator accepts a 5th parameter in its constructor: an array of options.

the path option

$books_to_show = new LengthAwarePaginator($current_book_page, count($book_collection), 10, $current_page, [
    // This will fix the path of the pagination links
    'path' => LengthAwarePaginator::resolveCurrentPath()
]);

By the way, on a totally different matter, Laravel makes your life easier by slicing the collection for you, check it out:

$current_book_page = $book_collection->forPage($current_page, 10);

Hope it helps :)