首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对CActiveDataProvider重新排序

对CActiveDataProvider重新排序
EN

Stack Overflow用户
提问于 2012-04-27 18:56:08
回答 1查看 1.4K关注 0票数 1

我正在寻找一种在Yii中重新排序CActiveDataProvider的方法。

目前,我正在使用数据提供程序获取排序和分页的数据。

然后,我使用foreach循环遍历它,调整特定字段的数据,现在我需要根据新调整的数据对其进行重新排序。

我不能使用afterFind对模型中的数据进行排序,因为我需要查询另一个DB (MySQL)来计算出计算值,而它似乎不喜欢在处理过程中进行切换。

我不想使用CArrayDataProvider,因为没有明显的方法来对返回的数据进行分页,除非我在调整数据时将控件放入循环中,但是我不知道可以返回多少数据,比如200条记录,但仅调整20条显示似乎是违反直觉的。

然后将所有这些内容推送到一个CGridView小部件。

例如,现在我需要以升序重新调整下面的数组。

代码语言:javascript
复制
$dataProvider = new CActiveDataProvider( blah );

foreach ( $dataProvider->getData() as $data ) {
 $data->Score += SomeModel::model()->findByPk(1)->NewScore;
}

array(
'Score' => 7
),
array(
'Score' => 6
)

$this->render('blah', array('data' => $dataProvider);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-27 19:08:32

听起来您应该简单地实现一个包装现有CDataProvider的新CDataProvider。您将需要覆盖几个方法,但对于大多数方法,您可以简单地转发到包装数据提供程序。代码最终可能如下所示:

代码语言:javascript
复制
$dataProvider = new CActiveDataProvider(...);
$myProvider = new CustomDataProvider($dataProvider);

// you could make CustomDataProvider work like this:
$myProvider->dataMutator = function(&$row, $key) {
    $row->Score = SomeModel::model()->findByPk(1)->NewScore;
};

$this->render('blah', array('data' => $myProvider);

CustomDataProvider::fetchData可能如下所示:

代码语言:javascript
复制
protected function fetchData()
{
    $data = $this->wrappedProvider->fetchData();
    array_walk(&$data, $this->dataMutator);
    uasort($data, function($a, $b) { return $a->Score - $b->Score; });
    return $data;
}

我在这里硬连接了排序--这适用于原型设计,但要清晰地指定后处理排序并不是一件容易的事情,因为:

  • CDataProvider公开了一个被忽略的sort属性。完全集成该属性将是一项艰巨的工作(您必须编写符合多个排序标准的代码,等等),或者在其基类上更改与sort相比的CustomDataProvider.sort的语义。CDataProviderCSort结合在一起,所以如果您想从OO的角度寻求最干净的解决方案,最好是从scratch.
  • It's实现IDataProvider,如果单个‘sort property is used, becausesort’不能同时反映包装数据提供程序将执行的操作和“后期处理”排序将执行的操作,则CustomDataProvider的用户不能直观地了解排序的工作原理;然而,以上两种情况都会影响最终结果。

我建议您先建立一个原型,然后仔细考虑对象模型应该是什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10349353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档