我对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都没有显示任何项目。我怀疑这与已经分页的数据有关,但是,有没有办法使这项工作有效?
答案 0 :(得分:1)
ArrayDataProvider
分页显示$allModels
中的所有元素。因此,如果每页有50个项目,第二页将显示51-100型。如果您已经有分页数据并且$items
仅包含来自第二页的50个元素,则ArrayDataProvider
仍将搜索不存在的51-100模型,因此您将获得空白页。
在您的情况下,您可能不应该使用ArrayDataProvider
并编写自己的数据提供程序,该程序将像API的代理一样工作。 ArrayDataProvider
仍需要所有模型来执行排序或过滤,因此您可以从API提取所有7k项并允许在ArrayDataProvider
级别处理过滤和排序,或者应在API级别进行过滤和排序而且框架核心的现有数据提供者都无法满足您的需求。
您可以使用诸如ProxyDataProvider
之类的名称搜索扩展名,但可能很难找到与您的API匹配的名称。