【问题标题】:Yii2 ArrayDataProvider does not show already paginated dataYii2 ArrayDataProvider 不显示已经分页的数据
【发布时间】:2022-04-29 17:14:53
【问题描述】:

我对 Yii2 提供的 ArrayDataProvider 对象有疑问。我有一个巨大的 API 调用,它返回超过 7k 个项目(这是一个问题,因为获取所有项目需要很长时间)。我意识到我可以告诉 API 为我分页,所以我试图将已经分页的数据实现到 ArrayDataProvider 但只在第 1 页有效,当我要求第 2 页时,我看到 API 返回接下来的 50 个项目,但在我的查看 GridView 对象不显示任何内容。

一个例子:

$dataProvider = new ArrayDataProvider([
        'key' => 'id',
        'allModels' => $items,
        'totalCount' => self::GetNumOfItems(),
        'sort' => [
            'attributes' => ['id', 'name', 'email'],
        ],
        'pagination' => [
            'pageSize' => 50,
        ],
    ]);

我要求正确显示分页器的项目总数。如果我要求第 1 页一切正常,但如果更改到第 2 页或任何 gridview 没有显示任何项目。我怀疑这与已经分页的数据有关,但是,有没有办法使这项工作?

【问题讨论】:

  • 添加$itemstotalCount函数。

标签: php arrays yii2


【解决方案1】:

ArrayDataProvider$allModels 中的所有元素进行分页。因此,如果您每页有 50 件商品,则第二页将显示型号 51-100。如果您已经有分页数据并且$items 仅包含第二页中的 50 个元素,ArrayDataProvider 仍将搜索不存在的模型 51-100,因此您会得到空白页。

在您的情况下,您可能不应该使用 ArrayDataProvider 并编写您自己的数据提供程序,它将像 API 的代理一样工作。 ArrayDataProvider 仍然需要所有模型来执行排序或过滤,因此您要么从 API 获取所有 7k 项并允许在 ArrayDataProvider 级别处理过滤和排序,要么过滤和排序应该在 API 级别完成并且不存在来自框架核心的数据提供者将满足您的需求。 您可以使用 ProxyDataProvider 之类的内容搜索扩展名,但可能很难找到与您的 API 匹配的内容。

【讨论】:

    【解决方案2】:

    ArrayDataProvider 有一个“prepareModels”方法,可以形成一个数据数组。在该方法内部,有一个 array_slice() 函数,它根据页码选择一个数组切片。这就是为什么 gridview 不在其他页面上显示任何项目的原因。 Image“prepareModels”方法

    您可以从 ArrayDataProvider 继承,覆盖“prepareModels”方法并移除“array_slice”函数。

    例如,我的ApiArrayDataProviderSearchModel

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-10
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      相关资源
      最近更新 更多