Как для пагинации добавить классы? Сейчас просто выводится в простых лишках PHP: $posts = Post::paginate(2); --- Добавлено --- Вывожу так Код (Text): {{$posts->links()}} --- Добавлено --- Всё понял, нашёл нужные методы
Допустимый ли такой код пагинатора в laravel? Плохо то, что я напрямую обращаюсь к массиву GET? Надо что бы первые и последние страницы исчезали из видимости, по мере нахождения на странице. Например, изначально так: 1 2 3 4. Если окажусь на 6 странице, то первые 2 не будут отображаться и будет так 3 4 5 6. Код полностью рабочий PHP: <div class="myPag"> <a href="?page=1">Первая</a> <?php if (!empty($_GET['page'])) { if (($_GET['page'] + 3) <= $posts->total()) { $countPag = $_GET['page'] + 3; } else { $countPag = $posts->total(); } $prev = $_GET['page'] - 1; if ($_GET['page'] != 1) { echo '<a href=?page=' . $prev . '>Назад</a>'; } if ($_GET['page'] > 1) { //это для предыдущих страниц (можно удалить полностью условие, тогда их не будет) $prevPage = $_GET['page'] - 1; $arr = []; for ($j = $prevPage; $j >= 1; $j--) { $arr[] = $j; } $newArr = array_reverse($arr); $output = array_slice($newArr, -3, 3); foreach ($output as $key => $val) { echo '<a href=?page=' . $val . '>' . $val . '</a>'; } } for ($i = $_GET['page']; $i <= $countPag; $i++) { if ($_GET['page'] == $i) { echo '<span class="active">' . $i . '</span>'; } else { echo '<a href=?page=' . $i . '>' . $i . '</a>'; } } $next = $_GET['page'] + 1; if ($_GET['page'] != $posts->total()) { echo '<a href=?page=' . $next . '>Далее</a>'; } } else { for ($i = 1; $i <= 3; $i++) { if ($i == 1) { echo '<span class="active">' . $i . '</span>'; } else { echo '<a href=?page=' . $i . '>' . $i . '</a>'; } } echo '<a href=?page=2>Далее</a>'; } ?> <a href="?page=<?php echo $posts->lastPage(); ?>">Последняя</a> </div>
Допустимый, но лучше сделать всё через Laravel. Если бы я был твоим начальником в конторе по Laravel, я бы тебя за такой код по головке не погладил. Вот же: https://laravel.com/docs/master/pagination#customizing-the-pagination-view, и делай там внутри что хочешь, используя стандартные методы --- Добавлено --- В любой системе надо всё делать стандартно. Если ты программируешь под WordPress, значит стараешься как можно больше использовать его функций/хуков и пр, если под Laravel - то делать стандартным путём для Laravel.
@mkramer там про манипуляцию со страницами ничего нету --- Добавлено --- @mkramer а такой выведет все страницы PHP: <div> <a href="?page=1">Первая</a> @for ($i = 1; $i < $posts->total()+1; $i++) @if ($i != $posts->currentPage()) <a href="?page={{ $i }}">{{ $i }}</a> @else {{ $posts->currentPage()}} @endif @endfor <a href="?page=<?php echo $posts->lastPage(); ?>">Последняя</a> </div>
Запили свой шаблон пагинации и манипулируй сколько хочешь. В доке и не должны решать твою конкретную задачу
@mkramer немного улучшил код, теперь он стал более понятен. Только, если надо будет изменить количество отображаемых постов, то код придётся немного изменить. PHP: <?php //total показывает не количество страниц, а количество записей в БД $page = [1,2,3]; $prevPage = []; $total = $posts->total(); // $countPage количество страниц function paginator($page, $current) { foreach($page as $key => $val) { if($current!= $val) { if($val != 0) { echo '<a href=?page=' . $val . '>' . $val . '</a>'; } } else { echo '<span>' . $val . '</span>'; } } } if($posts->currentPage() < 3) { paginator($page, $posts->currentPage()); } if(!empty($_GET['page'])) { if($posts->currentPage() >= 3 && $posts->currentPage() <= $total) { $ostatok = $posts->currentPage(); $once = $ostatok + 1; $two = $ostatok + 2; $prev1 = $posts->currentPage() - 3; $prev2 = $posts->currentPage() - 2; $prev3 = $posts->currentPage() - 1; array_splice($prevPage, 0, 3); array_push($prevPage, $prev1, $prev2, $prev3); array_splice($page, 0, 3); if($total >= $once && $total >= $two){ array_push($page, $once, $two); } elseif($total >= $once) { array_push($page, $once); } paginator($prevPage, $posts->currentPage()); echo '<span>'.$posts->currentPage().'</span>'; paginator($page, $posts->currentPage()); } } ?>