[Laravel8.x] simple-defaultのページネーションをカスタマイズしたい

まず、paginationでsimple-defaultを使用している時の表示

	<div class="d-flex justify-content-center">
            {!! $products->appends(request()->input())->links('vendor.pagination.simple-default') !!}
    </div>

previous, nextと表示されています。

/resources/views/vendor/pagination/simple-default.blade.php

@if ($paginator->hasPages())
    <nav>
        <ul class="pagination">
            {{-- Previous Page Link --}}
            @if ($paginator->onFirstPage())
                <li class="disabled" aria-disabled="true"><span>@lang('pagination.previous')</span></li>
            @else
                <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">@lang('pagination.previous')</a></li>
            @endif

            {{-- Next Page Link --}}
            @if ($paginator->hasMorePages())
                <li><a href="{{ $paginator->nextPageUrl() }}" rel="next">@lang('pagination.next')</a></li>
            @else
                <li class="disabled" aria-disabled="true"><span>@lang('pagination.next')</span></li>
            @endif
        </ul>
    </nav>
@endif

@lang(‘pagination.next’) はどこを読みに行っているかというと、これ。
/resources/lang/en/pagination.php

    'previous' => '&laquo; Previous',
    'next' => 'Next &raquo;',

jaにコピーします。
/resources/lang/en/pagination.php

    'previous' => '&laquo; 前へ ',
    'next' => ' 次へ &raquo;',

まあこれで良いけど、画像も試しておきたい。

画像はこちら

@if ($paginator->hasPages())
    <nav>
        <ul class="pagination">
            {{-- Previous Page Link --}}
            @if ($paginator->onFirstPage())
                <li class="disabled" aria-disabled="true"><span></li>
            @else
                <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev"><img src="{{ asset('storage/img/left.png') }}">&nbsp;</span></li>
            @endif

            {{-- Next Page Link --}}
            @if ($paginator->hasMorePages())
                <li> <a href="{{ $paginator->nextPageUrl() }}" rel="next">&nbsp;<img src="{{ asset('storage/img/right.png') }}"></a></li>
            @else
                <li class="disabled" aria-disabled="true"><span></li>
            @endif
        </ul>
    </nav>
@endif

画像よりテキストの方が良いな

[Laravel8.x] ページネーションをカスタマイズしたい

ページ数が増えた場合に、横に広がってしまうため、ページネーションをカスタマイズしたい。

$ php artisan vendor:publish –tag=laravel-pagination

/resources/views/vendor/pagination/element.blade.php

@if ($paginator->hasPages())
	<ul class="pagination" role="navigation">
		{{-- First Page Link --}}
		<li class="page-item {{ $paginator->onFirstPage() ? ' disabled' : '' }}">
	        <a class="page-link" href="{{ $paginator->url(1) }}">&laquo;</a>
	    </li>

		{{-- Previous Page Link --}}
		<li class="page-item {{ $paginator->onFirstPage() ? ' disabled' : '' }}">
	        <a class="page-link" href="{{ $paginator->previousPageUrl() }}">&lsaquo;</a>
	    </li>

		{{-- Pagination Elemnts --}}
    		{{-- Array Of Links --}}
		    @if ($paginator->lastPage() > config('const.PAGINATE.LINK_NUM'))


	        @if ($paginator->currentPage() <= floor(config('const.PAGINATE.LINK_NUM') / 2))
	            <?php $start_page = 1; //最初のページ ?> 
	            <?php $end_page = config('const.PAGINATE.LINK_NUM'); ?>

	        @elseif ($paginator->currentPage() > $paginator->lastPage() - floor(config('const.PAGINATE.LINK_NUM') / 2))
	            <?php $start_page = $paginator->lastPage() - (config('const.PAGINATE.LINK_NUM') - 1); ?>
	            <?php $end_page = $paginator->lastPage(); ?>

	        @else
	            <?php $start_page = $paginator->currentPage() - (floor((config('const.PAGINATE.LINK_NUM') % 2 == 0 ? config('const.PAGINATE.LINK_NUM') - 1 : config('const.PAGINATE.LINK_NUM'))  / 2)); ?>
	            <?php $end_page = $paginator->currentPage() + floor(config('const.PAGINATE.LINK_NUM') / 2); ?>
	        @endif

	    @else
	        <?php $start_page = 1; ?>
	        <?php $end_page = $paginator->lastPage(); ?>
	    @endif

	    @for ($i = $start_page; $i <= $end_page; $i++)
	        @if ($i == $paginator->currentPage())
	            <li class="page-item active"><span class="page-link">{{ $i }}</span></li>
	        @else
	            <li class="page-item"><a class="page-link" href="{{ $paginator->url($i) }}">{{ $i }}</a></li>
	        @endif
	    @endfor

		{{-- Next Page Link --}}
		<li class="page-item {{ $paginator->currentPage() == $paginator->lastPage() ? ' disabled' : '' }}">
	        <a class="page-link" href="{{ $paginator->nextPageUrl() }}">&rsaquo;</a>
	    </li>

		{{-- Last Page Link --}}
		<li class="page-item {{ $paginator->currentPage() == $paginator->lastPage() ? ' disabled' : '' }}">
	        <a class="page-link" href="{{ $paginator->url($paginator->lastPage()) }}">&raquo;</a>
	    </li>

	</ul>
@endif

const.php

	'PAGINATE' => [
        'LINK_NUM' => '3', //paginationの一度に表示するリンクの数
    ],

view

<div class="d-flex justify-content-center">
            {!! $products->appends(request()->input())->links('vendor.pagination.element') !!}
    </div>

OK 大分できてきた。後はBI周りを何とかしたい。

[Laravel8.16.0] Getメソッドのページネーション実装

View
-> pagingは $products->appends(request()->input())->links(”)とする

	<h1>Get Method Test</h1>
	<form action="/admin/show" method="get">
		<div class="form-group">
		  <label for="text1">Product:</label>
		  <div class="row">
			  <input type="text" id="text1" name="search" class="form-control col-md-2" style="margin-left:15px">
			  <input type="submit" class="btn btn-primary">
		  </div>
		</div>
	</form>
	<p>{{ $query ? '「' .$query. '」'  : '' }}<p>
	@foreach($products as $product)
	<p>{{ $product->name}}</p>
	@endforeach

	{{-- Pagination --}}
	<div class="d-flex justify-content-center">
            {!! $products->appends(request()->input())->links('') !!}
    </div>

controller
-> 部分一致は’%’.$query.’%’と書く。 %$query%と書かない様に注意

public function show(Request $request){
        $query = $request->get('search');
        if($query !== Null){
            $products = DB::table('products')->where('name', 'like', '%'.$query.'%')->Paginate(4);
        } else {
            $products = DB::table('products')->Paginate(4);
        }
        
        return view('admin.show', compact('products','query'));
    }

取り敢えずページングはOKっぽい。
続いてメール周りを整理する。Let’s Gooooooooooo

[Laravel8.16.0] ページネーションのカスタマイズ

デフォルトだと、ページ数の数だけページネーションが表示される

@foreach($products as $product)
	<p>{{ $product->name}}</p>
	@endforeach
	<div class="d-flex justify-content-center">
            {!! $products->links() !!}
    </div>

$ php artisan vendor:publish –tag=laravel-pagination

	{{-- Pagination --}}
	<div class="d-flex justify-content-center">
            {!! $products->links('vendor.pagination.default') !!}
    </div>

以下のファイルを読み込んでいる。
vendor/laravel/framework/src/illuminate/Pagination/resources/views

なるほど

[Laravel8.16.0] bootstrapでpaginationが崩れて表示される時

controller

public function show(){
        $products = DB::table('products')->Paginate(4);
        return view('admin.show', compact('products'));
    }

views

@foreach($products as $product)
	<p>{{ $product->name}}</p>
	@endforeach

	{{-- Pagination --}}
	<div class="d-flex justify-content-center">
            {!! $products->links() !!}
    </div>

は? 何これ?

app/Providers/AppServiceProvider.php

use Illuminate\Pagination\Paginator;
    public function boot()
    {
        //
        Paginator::useBootstrap();
    }

Ok, I think we got keep going men!

onEachSide()が効かない時

bladeのpaginationでonEachSideを実装するも、Laravel6.xで全て表示されてしまう。

{{$users->onEachSide(1)->appends(request()->input())->render()}}
{{$users->appends(request()->input())->onEachSide(1)->render()}}

Controller側で、onEachSide()を付ける。

$users = User::orderBy('updated_at','DESC')->paginate(10)->onEachSide(1);

公式では、デフォルトで3つと書かれているが、機能しない。何故だか釈然としないが、controllerで対応する。
https://readouble.com/laravel/6.x/ja/pagination.html

laravel 6.x paginationで2ページ目以降も検索条件を引き継ぐ書き方

検索フォームから検索結果に遷移した後、2ページ目以降も検索条件を引継ぎたい

### bladeのページネーション

{{$data->render()}}

{{$data->appends(request()->input())->render()}}

こう書いたんだが、2ページ目以降、一向反映されない。
何故だああああああ????
(※今日はbiz confortってコワーキングに行こうと思って、横浜元町まで来たら祝日でやってないじゃないか。。。何故だあああああ)

フラ〜とアクエリアス飲んで考えてたら、気が付いた。appendsは、パラメータを配列で渡すメソッドなので、検索フォームはGETメソッドでないと上手く動作しない

### 検索フォーム

{!! Form::open(['method'=>'POST', 'action'=>'HogeController@index']) !!}
// 省略
{!! Form::close() !!}

{!! Form::open(['method'=>'GET', 'action'=>'HogeController@index']) !!}
 <input type="hidden" name="search" value="{{ rand() }}">
// 省略
{!! Form::close() !!}

Postメソッド時のControllerでの検索時の処理は、isMethod(‘post’)で判定していたが、Getメソッドの場合は、hiddenでname=”search”をcontrollerに送って、それで判定する事にした。

### Controller

if($request->isMethod('post')){
$inputs = $request->all();
$query = Data::query();
// 検索処理 省略 
}

if($request->has('search')){
  $inputs = $request->all();
  $query = Data::query();
// 検索処理 省略 
}

FORMはセキュリティ上、POSTメソッドしか使わないと考えてたが、ユーザ検索のページネーションの処理では、POSTメソッドではなくGETメソッドの方が都合が良い、ということを理解しました。

### 1冊やっておいても損はない本

Laravel ページングの書き方

グローバルのrender()を使います。

AdminPostsController.php

public function index()
    {
        // $posts = Post::all();
        $posts = Post::paginate(4);
        return view('admin.posts.index', compact('posts'));
    }

posts/index.blade.php

<div class="row">
		<div class="col-sm-6 col-sm-offset-5">
			{{$posts->render()}}
		</div>
    </div>

URLに自動的に?page=${n} が付与されます。

super amazing! あれほどページングべた書きに苦労したのは一体何だったんだ