You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2 DataProvider无法加载GET参数:分页page属性始终为0求助

解决Yii2 ListView分页中pagination->page始终为0的问题

首先,咱们先理清一个容易混淆的关键点:Yii2的Pagination组件里,URL中的page参数是从1开始计数的,但$pagination->page属性是从0开始的索引值(比如?page=1对应page属性为0,?page=2对应为1)。如果你的调试中看到传了page=1但page属性是0,这其实是正常行为;但如果不管传page=2、page=3,page属性始终是0,那咱们来找找问题根源。

最可能的原因:WinerySearch::search()方法中分页配置错误

你的search方法里很可能在初始化ActiveDataProvider时,要么硬编码了page值,要么没把请求参数传递给分页组件,导致它无法读取URL中的page参数。

修复步骤:

  1. 打开你的WinerySearch模型,找到search()方法,检查ActiveDataProvider的分页配置:
    错误示例(会导致page始终为0):

    public function search($params)
    {
        $query = Winery::find();
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => [
                'page' => 0, // 硬编码page为0,覆盖了URL参数
                'params' => [], // 空参数数组,无法读取URL中的page
            ],
        ]);
        // ... 其他代码
    }
    

    正确配置:

    public function search($params)
    {
        $query = Winery::find();
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => [
                'params' => $params, // 关键:让分页组件从传入的请求参数中读取page
                // 不要设置'page' => 0这类硬编码值
            ],
        ]);
    
        $this->load($params);
    
        // ... 你的过滤逻辑
    
        return $dataProvider;
    }
    
  2. 检查控制器代码中是否无意中重置了分页对象:
    确保在调用$searchModel->search()之后,没有重新实例化Pagination,比如:

    // 错误:这会重置所有分页配置,包括page参数
    $dataProvider->pagination = new Pagination();
    

额外注意:当前页数据计数的正确写法

你代码中计算displayedItems的逻辑有点问题,$dataProvider->count是当前页的记录数,而总记录数应该用$dataProvider->getTotalCount()。正确的计数示例:

$currentPage = $dataProvider->pagination->page;
$pageSize = $dataProvider->pagination->pageSize;
$start = $currentPage * $pageSize + 1;
$end = min(($currentPage + 1) * $pageSize, $dataProvider->getTotalCount());
$displayedItems = "显示 {$start}-{$end} 条,共 {$dataProvider->getTotalCount()} 条";

最后验证

在控制器里加一行调试代码,确认请求参数是否正确传递:

var_dump(Yii::$app->request->get('page')); // 应该能看到你AJAX传的pageNumber值
var_dump($dataProvider->pagination->page); // 对应的值应该是pageNumber - 1

如果还是有问题,检查你的AJAX请求是否真的把page参数传到了正确的URL上(比如有没有URL重写导致参数丢失)。

内容的提问来源于stack exchange,提问作者DeeMax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:12:53