traffske
traffske

Reputation: 111

How add manual pagination in Laravel

I am beginner in Laravel and php. I try show list articles with pagination.

I have controller:

public function poradnik(Request $request)
    {
        MetaTag::set('title', 'name.pl | xxxxx');
        MetaTag::set('description', 'name.pl | xxxxx');
        MetaTag::set('keywords', 'name.pl | xxxxx');

        $data = [
            [
                'title' => 'Strona Internetowa, jak Odnieść Sukces?',
                'desc' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vestibulum luctus ex. Morbi sollicitudin condimentum ante, vel euismod quam rhoncus nec. Ut consectetur convallis libero, ut venenatis libero sagittis ac. Sed hendrerit risus quis luctus dignissim. Morbi tincidunt tempus enim, at volutpat leo placerat sed. Aliquam pharetra dolor faucibus, posuere lacus sit amet, venenatis nulla...',
                'url' => 'poradnik-strona-internetowa-jak-odniesc-sukces'
            ],
            [
                'title' => 'Znaczenie Linków w Budowaniu Pozycji Strony',
                'desc' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vestibulum luctus ex. Morbi sollicitudin condimentum ante, vel euismod quam rhoncus nec. Ut consectetur convallis libero, ut venenatis libero sagittis ac. Sed hendrerit risus quis luctus dignissim. Morbi tincidunt tempus enim, at volutpat leo placerat sed. Aliquam pharetra dolor faucibus, posuere lacus sit amet, venenatis nulla...',
                'url' => 'poradnik-znaczenie-linkow-w-budowaniu-pozycji-strony'
            ],
            [
                'title' => 'Planowanie Sklepu Internetowego',
                'desc' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vestibulum luctus ex. Morbi sollicitudin condimentum ante, vel euismod quam rhoncus nec. Ut consectetur convallis libero, ut venenatis libero sagittis ac. Sed hendrerit risus quis luctus dignissim. Morbi tincidunt tempus enim, at volutpat leo placerat sed. Aliquam pharetra dolor faucibus, posuere lacus sit amet, venenatis nulla...',
                'url' => 'poradnik-planowanie-sklepu-internetowego'
            ]
.........
        ];

        return view('frontend.poradnik.index', ['data' => $data]);
    }

(243 records)

View:

@foreach($data as $value)
                        <li class="guide-item">
                            <a href="{{ $value['www'] }}">
                                <h2>{{ $value['title'] }}</h2></a>
                            <a href="{{ $value['www'] }}"><p
                                    class="justify-text">
                                    {{ $value['desc'] }}
                                </p></a>
                        </li>
                    @endforeach

<nav aria-label="Page navigation">
                    <ul class="pagination">
                        <li class="page-item"><a class="page-link" href="#" aria-label="Previous"></a></li>
                        <li class="page-item"><a class="page-link" href="#">1</a></li>
                        <li class="page-item"><a class="page-link" href="#">2</a></li>
                        <li class="page-item"><a class="page-link" href="#">3</a></li>
                        <li class="page-item"><a class="page-link" href="#" aria-label="Next"></a></li>
                    </ul>
                </nav>

How can I add paginate to my code? I need limit 4 records per page. I use Laravel 6 :)

Upvotes: 0

Views: 1427

Answers (2)

LordOfLabVIEW
LordOfLabVIEW

Reputation: 101

You can use LengthAwarePaginator to achieve this.

Example for your case:

$currentPage = $request->page ?? 1;
$itemsPerPage = 4;

// You should manually make a slice of array for current page
$items = array_slice($data, ($currentPage - 1) * $itemsPerPage, $itemsPerPage);
$pagination = new LengthAwarePaginator($items, count($data), $itemsPerPage, $currentPage);

Then pass this LengthAwarePaginator instance in parameters array when calling view like this:

return view('frontend.poradnik.index', ['data' => $pagination]);

To use it in your view, iterate over $data to render your items.

@foreach($data as $value)
    {{-- Your HTML code here, e.g. show title --}}
    <h1>{{ $value['title'] }}</h1>
@endforeach

To show pagination, use links() method like this:

{{ $data->links() }}

Upvotes: 3

Collin
Collin

Reputation: 944

If i understand correctly you want a pagination on your array. If that is the case take a look at this example:

class PaginationController extends Controller
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    public function index()
    {
        $myArray = [
            ['id'=>1, 'title'=>'Laravel CRUD'],
            ['id'=>2, 'title'=>'Laravel Ajax CRUD'],
            ['id'=>3, 'title'=>'Laravel CORS Middleware'],
            ['id'=>4, 'title'=>'Laravel Autocomplete'],
            ['id'=>5, 'title'=>'Laravel Image Upload'],
            ['id'=>6, 'title'=>'Laravel Ajax Request'],
            ['id'=>7, 'title'=>'Laravel Multiple Image Upload'],
            ['id'=>8, 'title'=>'Laravel Ckeditor'],
            ['id'=>9, 'title'=>'Laravel Rest API'],
            ['id'=>10, 'title'=>'Laravel Pagination'],
        ];

        $data = $this->paginate($myArray);

        return view('paginate', compact('data'));
    }

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    public function paginate($items, $perPage = 5, $page = null, $options = [])
    {
        $page = $page ?: (Paginator::resolveCurrentPage() ?: 1);
        $items = $items instanceof Collection ? $items : Collection::make($items);
        return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, $options);
    }
}

The above has a array, then runs the paginate function to create pagination using the laravel paginator.

Then in blade you would do the following:

<div class="container">
    <table class="table table-bordered">
        <tr>
            <th>Id</th>
            <th>Title</th>
        </tr>
        @foreach($data as $post)
        <tr>
            <td>{{ $post->id }}</td>
            <td>{{ $post->title }}</td>
        </tr>
        @endforeach
    </table>
</div>

{{ $data->links() }}

For more explaination take a look at the source: https://www.itsolutionstuff.com/post/how-to-create-pagination-from-array-in-laravelexample.html

Upvotes: 1

Related Questions