Yii2 GridView如何仅让第一页首行有特殊行为?获取当前页方法
解决Yii2 GridView仅第一页第一行执行特殊逻辑的问题
这个场景我之前做项目时也碰到过,用$index判断确实会让每页的第一行都触发特殊行为——毕竟$index是当前页内的行索引,不是全局的。要实现只有第一页的第一行才执行BEHAVIOR 1,我们需要结合当前页码来判断,具体可以这么做:
核心思路
利用GridView列的value回调函数的第四个参数$widget(也就是当前GridView实例),从它的dataProvider里获取分页信息,再结合$index精准定位目标行。
具体代码实现
[ 'label' => 'col1', 'value' => function($model, $key, $index, $widget) { // 获取当前页码:getPage()返回0开始的索引,加1转为1开始的页码 $currentPage = $widget->dataProvider->pagination?->getPage() + 1 ?? 1; // 仅第一页第一行执行BEHAVIOR 1 if ($currentPage === 1 && $index === 0) { // BEHAVIOR 1 逻辑 return 1; } else { // BEHAVIOR 2 逻辑 return 2; } } ]
代码说明
$widget->dataProvider->pagination:获取当前GridView的分页组件实例,如果没有启用分页(比如数据量少不需要分页),这里会是null,所以用了PHP 7+的空合并运算符??默认设为第一页。getPage()方法返回的是从0开始的页码(第一页是0,第二页是1),加1转为我们常用的1开始的页码格式,判断起来更直观。- 只有同时满足
当前页码为1和当前页内索引为0时,才执行特殊逻辑,完美解决每页第一行都触发的问题。
如果你的项目PHP版本低于7.0,可以把页码判断改成更兼容的写法:
$currentPage = 1; if ($widget->dataProvider->pagination !== null) { $currentPage = $widget->dataProvider->pagination->getPage() + 1; }
内容的提问来源于stack exchange,提问作者MiglyCH
相关产品推荐
相关产品推荐

