CArrayDataProvider


system.web
继承 class CArrayDataProvider » CDataProvider » CComponent
实现 IDataProvider
源自 1.1.4
版本 $Id: CArrayDataProvider.php 3353 2011-07-12 21:10:36Z alexander.makarow $
源码
CArrayDataProvider是基于一个原始数据的数组实现的数据提供者。

rawData属性包含所有可以被排序和(或)分页的数据。 CArrayDataProvider会返回排序和(或)分页后的数据。 您可以配置sortpagination的属性, 并自定义排序和分页的行为。

原始数据数组中的元素可以是对象(例如,model objects) 或关联数组(例如,query results of DAO)。

CArrayDataProvider的使用方法如下:
$rawData=Yii::app()->db->createCommand('SELECT * FROM tbl_user')->queryAll();
// or using: $rawData=User::model()->findAll();
$dataProvider=new CArrayDataProvider($rawData, array(
    'id'=>'user',
    'sort'=>array(
        'attributes'=>array(
             'id', 'username', 'email',
        ),
    ),
    'pagination'=>array(
        'pageSize'=>10,
    ),
));
// $dataProvider->getData() will return a list of arrays.


注:如果你想使用排序功能,您必须配置sort属性, 以便让provider知道哪些列需要进行排序。

公共属性

属性 类型 描述 定义在
data array 返回当前可用的数据项。 CDataProvider
id string 返回所有数据提供者的唯一标识ID。 CDataProvider
itemCount integer 返回当前页面的数据项数目。 CDataProvider
keyField string 字段的名称。默认值为‘id’。如果设置为false, $rawData数组中的值将被使用。 CArrayDataProvider
keys array 返回相关数据项的键。 CDataProvider
pagination CPagination 返回pagination对象。 CDataProvider
rawData array 未分页或排序的数据。当启用分页时, 此属性通常比data包含更多的元素。 数组中的元素必须使用从零开始的整数值。 CArrayDataProvider
sort CSort 返回sort对象。 CDataProvider
totalItemCount integer 返回所有数据项的总数。 CDataProvider

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__construct() 构造器。 CArrayDataProvider
__get() 返回一个属性值、一个事件处理程序列表或一个行为名称。 CComponent
__isset() 检查一个属性是否为null。 CComponent
__set() 设置一个组件的属性值。 CComponent
__unset() 设置一个组件的属性为null。 CComponent
asa() 返回这个名字的行为对象。 CComponent
attachBehavior() 附加一个行为到组件。 CComponent
attachBehaviors() 附加一个行为列表到组件。 CComponent
attachEventHandler() 为事件附加一个事件处理程序。 CComponent
canGetProperty() 确定属性是否可读。 CComponent
canSetProperty() 确定属性是否可写。 CComponent
detachBehavior() 从组件中分离一个行为。 CComponent
detachBehaviors() 从组件中分离所有行为。 CComponent
detachEventHandler() 分离一个存在的事件处理程序。 CComponent
disableBehavior() 禁用一个附加行为。 CComponent
disableBehaviors() 禁用组件附加的所有行为。 CComponent
enableBehavior() 启用一个附加行为。 CComponent
enableBehaviors() 启用组件附加的所有行为。 CComponent
evaluateExpression() 计算一个PHP表达式,或根据组件上下文执行回调。 CComponent
getData() 返回当前可用的数据项。 CDataProvider
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
getId() 返回所有数据提供者的唯一标识ID。 CDataProvider
getItemCount() 返回当前页面的数据项数目。 CDataProvider
getKeys() 返回相关数据项的键。 CDataProvider
getPagination() 返回pagination对象。 CDataProvider
getSort() 返回sort对象。 CDataProvider
getTotalItemCount() 返回所有数据项的总数。 CDataProvider
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
raiseEvent() 发起一个事件。 CComponent
setData() 为provider设置数据项。 CDataProvider
setId() 设置provider的ID。 CDataProvider
setKeys() 为provider设置数据项的键。 CDataProvider
setPagination() 设置provider的pagination对象。 CDataProvider
setSort() 为数据提供者设置排序。 CDataProvider
setTotalItemCount() 设置所有数据项的总数。 CDataProvider

受保护方法

方法 描述 定义在
calculateTotalItemCount() 计算数据项的总数。 CArrayDataProvider
fetchData() 从持久性数据存储中获取数据。 CArrayDataProvider
fetchKeys() 获取持久性数据存储的数据项键。 CArrayDataProvider
getSortDirections() 将“ORDER BY”语句转换为表示排序方向的数组。 CArrayDataProvider
sortData() 根据指定的排序指令对原始数据进行排序。 CArrayDataProvider

属性详细

keyField 属性
public string $keyField;

字段的名称。默认值为‘id’。如果设置为false, $rawData数组中的值将被使用。

rawData 属性
public array $rawData;

未分页或排序的数据。当启用分页时, 此属性通常比data包含更多的元素。 数组中的元素必须使用从零开始的整数值。

方法详细

__construct() 方法
public void __construct(array $rawData, array $config=array ( ))
$rawData array 未分页或排序的数据。数组中的元素必须使用从零开始的整数值。
$config array 配置(name=>value)作为这个类的初始属性值。
public function __construct($rawData,$config=array())
{
    
$this->rawData=$rawData;
    foreach(
$config as $key=>$value)
        
$this->$key=$value;
}

构造器。

calculateTotalItemCount() 方法
protected integer calculateTotalItemCount()
{return} integer 数据项的总数。
protected function calculateTotalItemCount()
{
    return 
count($this->rawData);
}

计算数据项的总数。 这种方法只返回rawData中元素的数量。

fetchData() 方法
protected array fetchData()
{return} array 数据项列表
protected function fetchData()
{
    if((
$sort=$this->getSort())!==false && ($order=$sort->getOrderBy())!='')
        
$this->sortData($this->getSortDirections($order));

    if((
$pagination=$this->getPagination())!==false)
    {
        
$pagination->setItemCount($this->getTotalItemCount());
        return 
array_slice($this->rawData$pagination->getOffset(), $pagination->getLimit());
    }
    else
        return 
$this->rawData;
}

从持久性数据存储中获取数据。

fetchKeys() 方法
protected array fetchKeys()
{return} array 列表数据项的键。
protected function fetchKeys()
{
    if(
$this->keyField===false)
        return 
array_keys($this->rawData);
    
$keys=array();
    foreach(
$this->getData() as $i=>$data)
        
$keys[$i]=is_object($data) ? $data->{$this->keyField} : $data[$this->keyField];
    return 
$keys;
}

获取持久性数据存储的数据项键。

getSortDirections() 方法
protected array getSortDirections(string $order)
$order string “ORDER BY”语句。
{return} array 排序方向(字段名=>是否为降序)
protected function getSortDirections($order)
{
    
$segs=explode(',',$order);
    
$directions=array();
    foreach(
$segs as $seg)
    {
        if(
preg_match('/(.*?)(\s+(desc|asc))?$/i',trim($seg),$matches))
            
$directions[$matches[1]]=isset($matches[3]) && !strcasecmp($matches[3],'desc');
        else
            
$directions[trim($seg)]=false;
    }
    return 
$directions;
}

将“ORDER BY”语句转换为表示排序方向的数组。

sortData() 方法
protected void sortData(array $directions)
$directions array 排序方向(字段名=>是否为降序)
protected function sortData($directions)
{
    if(empty(
$directions))
        return;
    
$args=array();
    
$dummy=array();
    foreach(
$directions as $name=>$descending)
    {
        
$column=array();
        foreach(
$this->rawData as $index=>$data)
            
$column[$index]=is_object($data) ? $data->$name $data[$name];
        
$args[]=&$column;
        
$dummy[]=&$column;
        unset(
$column);
        
$direction=$descending SORT_DESC SORT_ASC;
        
$args[]=&$direction;
        
$dummy[]=&$direction;
        unset(
$direction);
    }
    
$args[]=&$this->rawData;
    
call_user_func_array('array_multisort'$args);
}

根据指定的排序指令对原始数据进行排序。 调用此方法后,rawData将被修改。