Laravel 两侧分页无法正常工作

问题描述 投票:0回答:5

在我的 Laravel (5.7) 控制器中,我已将分页+“每侧导航”设置为 2 个项目。然而,这在我看来是行不通的。我收到的项目比 2 个多得多,这导致我的窗口在小型移动设备上破裂。

造成这种情况的原因是什么以及如何解决?我的意思是,我可以用 CSS 修复它,但我想以正确的方式修复它。

我在控制器中的代码:

public function index(Request $request)
{
    $type = 'all';

    if ($request->has('type')) {
        if ($request->type == 'all') {
            $materials = Material::paginate(10)->onEachSide(2);
        } else {
            $type = $request->type;
            $materials = Material::where('type', $type)->paginate(10)->onEachSide(2);
        }
    } else {
        $materials = Material::paginate(10)->onEachSide(2);
    }

    
    $stock = array(
        'enkelzitKajaks' => Material::where('type', 'Enkelzitkajak')->count(),
        'dubbelzitKajaks' => Material::where('type', 'Dubbelzitkajak')->count(),
        'canadeseKanos' => Material::where('type', 'Canadese kano')->count(),
        'langePeddels' => Material::where('type', 'Lange peddel')->count(),
        'kortePeddels' => Material::where('type', 'Korte peddel')->count(),
        'tonnetjes' => Material::where('type', 'Tonnetje')->count(),
        'zwemvesten' => Material::where('type', 'Zwemvest')->count()
    );

    return view('materials.index')->with('materials', $materials)->with('stock', $stock)->with('type', $type);
}

我在视图中的代码:

<section class="pagination">
    <div class="container">
        <div class="row">
            <div class="col-12">
                {{ $materials->links() }}
            </div>
        </div>

        <hr>
    </div>
</section>

我在小型设备上的视图截图:

laravel pagination
5个回答
7
投票

首先 Laravel 分页 onEachSide(x) 除了中间部分之外还有 前导和尾部部分。前两页,尾两页。

您正在尝试使用 onEachSide(2) 和第 6 页。所以现在我们尝试看看分页的逻辑。

在 laravel 中使用 onEachSide(2) 时会显示这样的分页

领先双页 当前页 - 2 当前页 当前页+2 拖尾双页
1,2 4,5 6 7,8 22,23

然后考虑分页的第一部分,它需要显示第 1 页到第 8 页,而不显示第 3 页。 它需要是一个带点的显示按钮,而不是第三页。

然后,它将显示原始的第 3 页码,而不是显示第三页的带点的按钮。

第 6 页之后,laravel 分页 onEachSide(2) 将正常工作


2
投票

你应该在刀片中使用

onEachSide
这个。

从控制器上取下

onEachSide
。当您创建 API 时,在控制器中使用
onEachSide
将会很有帮助。而是在刀片文件中使用
onEachSide

<section class="pagination">
    <div class="container">
        <div class="row">
            <div class="col-12">
                {{ $materials->onEachSide(1)->links() }}
            </div>
        </div>

        <hr>
    </div>
</section>

用户可以通过更改

onEachSide

中的参数来管理链接窗口

https://laravel.com/docs/8.x/pagination# adjustment-the-pagination-link-window


2
投票

您可以在移动设备上尝试

class="pagination pagination-sm"


2
投票

这是因为 Laravel 5.* 版本中的一个错误。如果您不想升级您的应用程序,您应该手动更改一些代码:

供应商/laravel/framework/src/Illuminate/Pagination/UrlWindow.php

正如下面泰勒·奥特韦尔的链接中提到和讨论的那样。 讨论 Laravel 5 中的各个方面的错误。*


0
投票

Laravel 10 在这里。

感谢耶和华的帮助,在四处寻找后,对我有用的是手动路线。

调用

$paginatorVariable->links();
时,可以选择将其传递为视图。

例如

$paginatorVariable->links('thePaginatorView');


为此,请在 Laravel 项目的资源文件夹中创建一个视图:

MyLaravelProject/resources/views/

因此以类似以下内容结尾:

MyLaravelProject/resources/views/thePaginatorView.blade.php

您可以在

vendor/laravel/framework/src/illuminate/Pagination/resources/
文件夹中看到现成的示例。

default.blade.php
semantic-ui.blade.php
tailwind.blade.php
文件是如何构建视图的相对有效的示例。

视图本身将被“注入”一个

$paginator
变量和一个
$elements
变量,其中包含每个“页面元素”(页码和 url)。

因此,如果您使用

$myPaginatorVar->links('myView');
,则在
myView.blade.php
文件内,您将拥有
$paginator
变量,该变量将等于
$myPaginatorVar
。还有一个
$elements
变量,它将等于分页器变量的项目数组。

因此,通过

$paginator->currentPage()
函数调用,您可以检查页码并与元素进行比较,方法是减去它距离索引有多远,或者通过简单的 if-else 语句,然后根据需要跳过或填充。


如果您不想硬编码固定数量,或者需要“模仿”之前和之后的值,则可以将

['key' => value]
数组传递给 links 方法调用,以便在自定义分页器视图中具有此类值,如文档中所示

例如

$myPaginatorVar->links('myView', ['PagesBeforeAndAfter' => 2]);

您甚至可以添加多个不同的值。例如:

$myPaginatorVar->links('myView', ['showFirstPageWhenNotOnIt' => false,
                                  'pagesAfterFirstPage'      => 0,
                                  'pagesBeforeLastPage'      => 3,
                                  'showLastPageWhenNotOnIt'  => true,
                                  'pagesBeforeAndAfterCurrentPage' => 2]);

并用它们与

$paginator->firstItem()
$paginator->lastItem()
$paginator->lastPage()
$paginator->currentPage()
等进行比较...

以下是在分页器视图中使用的可用函数:https://laravel.com/docs/10.x/pagination#paginator-instance-methods


可以选择使用

artisan vendor:publish
命令执行同样的操作来“覆盖”默认视图,如here所示(或者至少这是我可以理解的)。不过我发现常规查看方式更直接。

© www.soinside.com 2019 - 2024. All rights reserved.