summaryrefslogtreecommitdiff
path: root/framework/web/CActiveDataProvider.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/web/CActiveDataProvider.php')
-rw-r--r--framework/web/CActiveDataProvider.php183
1 files changed, 183 insertions, 0 deletions
diff --git a/framework/web/CActiveDataProvider.php b/framework/web/CActiveDataProvider.php
new file mode 100644
index 0000000..ef05376
--- /dev/null
+++ b/framework/web/CActiveDataProvider.php
@@ -0,0 +1,183 @@
+<?php
+/**
+ * CActiveDataProvider class file.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.yiiframework.com/
+ * @copyright Copyright &copy; 2008-2011 Yii Software LLC
+ * @license http://www.yiiframework.com/license/
+ */
+
+/**
+ * CActiveDataProvider implements a data provider based on ActiveRecord.
+ *
+ * CActiveDataProvider provides data in terms of ActiveRecord objects which are
+ * of class {@link modelClass}. It uses the AR {@link CActiveRecord::findAll} method
+ * to retrieve the data from database. The {@link criteria} property can be used to
+ * specify various query options.
+ *
+ * CActiveDataProvider may be used in the following way:
+ * <pre>
+ * $dataProvider=new CActiveDataProvider('Post', array(
+ * 'criteria'=>array(
+ * 'condition'=>'status=1',
+ * 'order'=>'create_time DESC',
+ * 'with'=>array('author'),
+ * ),
+ * 'pagination'=>array(
+ * 'pageSize'=>20,
+ * ),
+ * ));
+ * // $dataProvider->getData() will return a list of Post objects
+ * </pre>
+ *
+ * @property CDbCriteria $criteria The query criteria.
+ * @property CSort $sort The sorting object. If this is false, it means the sorting is disabled.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @version $Id: CActiveDataProvider.php 3426 2011-10-25 00:01:09Z alexander.makarow $
+ * @package system.web
+ * @since 1.1
+ */
+class CActiveDataProvider extends CDataProvider
+{
+ /**
+ * @var string the primary ActiveRecord class name. The {@link getData()} method
+ * will return a list of objects of this class.
+ */
+ public $modelClass;
+ /**
+ * @var CActiveRecord the AR finder instance (eg <code>Post::model()</code>).
+ * This property can be set by passing the finder instance as the first parameter
+ * to the constructor. For example, <code>Post::model()->published()</code>.
+ * @since 1.1.3
+ */
+ public $model;
+ /**
+ * @var string the name of key attribute for {@link modelClass}. If not set,
+ * it means the primary key of the corresponding database table will be used.
+ */
+ public $keyAttribute;
+
+ private $_criteria;
+
+ /**
+ * Constructor.
+ * @param mixed $modelClass the model class (e.g. 'Post') or the model finder instance
+ * (e.g. <code>Post::model()</code>, <code>Post::model()->published()</code>).
+ * @param array $config configuration (name=>value) to be applied as the initial property values of this class.
+ */
+ public function __construct($modelClass,$config=array())
+ {
+ if(is_string($modelClass))
+ {
+ $this->modelClass=$modelClass;
+ $this->model=CActiveRecord::model($this->modelClass);
+ }
+ else if($modelClass instanceof CActiveRecord)
+ {
+ $this->modelClass=get_class($modelClass);
+ $this->model=$modelClass;
+ }
+ $this->setId($this->modelClass);
+ foreach($config as $key=>$value)
+ $this->$key=$value;
+ }
+
+ /**
+ * Returns the query criteria.
+ * @return CDbCriteria the query criteria
+ */
+ public function getCriteria()
+ {
+ if($this->_criteria===null)
+ $this->_criteria=new CDbCriteria;
+ return $this->_criteria;
+ }
+
+ /**
+ * Sets the query criteria.
+ * @param mixed $value the query criteria. This can be either a CDbCriteria object or an array
+ * representing the query criteria.
+ */
+ public function setCriteria($value)
+ {
+ $this->_criteria=$value instanceof CDbCriteria ? $value : new CDbCriteria($value);
+ }
+
+ /**
+ * Returns the sorting object.
+ * @return CSort the sorting object. If this is false, it means the sorting is disabled.
+ */
+ public function getSort()
+ {
+ if(($sort=parent::getSort())!==false)
+ $sort->modelClass=$this->modelClass;
+ return $sort;
+ }
+
+ /**
+ * Fetches the data from the persistent data storage.
+ * @return array list of data items
+ */
+ protected function fetchData()
+ {
+ $criteria=clone $this->getCriteria();
+
+ if(($pagination=$this->getPagination())!==false)
+ {
+ $pagination->setItemCount($this->getTotalItemCount());
+ $pagination->applyLimit($criteria);
+ }
+
+ $baseCriteria=$this->model->getDbCriteria(false);
+
+ if(($sort=$this->getSort())!==false)
+ {
+ // set model criteria so that CSort can use its table alias setting
+ if($baseCriteria!==null)
+ {
+ $c=clone $baseCriteria;
+ $c->mergeWith($criteria);
+ $this->model->setDbCriteria($c);
+ }
+ else
+ $this->model->setDbCriteria($criteria);
+ $sort->applyOrder($criteria);
+ }
+
+ $this->model->setDbCriteria($baseCriteria!==null ? clone $baseCriteria : null);
+ $data=$this->model->findAll($criteria);
+ $this->model->setDbCriteria($baseCriteria); // restore original criteria
+ return $data;
+ }
+
+ /**
+ * Fetches the data item keys from the persistent data storage.
+ * @return array list of data item keys.
+ */
+ protected function fetchKeys()
+ {
+ $keys=array();
+ foreach($this->getData() as $i=>$data)
+ {
+ $key=$this->keyAttribute===null ? $data->getPrimaryKey() : $data->{$this->keyAttribute};
+ $keys[$i]=is_array($key) ? implode(',',$key) : $key;
+ }
+ return $keys;
+ }
+
+ /**
+ * Calculates the total number of data items.
+ * @return integer the total number of data items.
+ */
+ protected function calculateTotalItemCount()
+ {
+ $baseCriteria=$this->model->getDbCriteria(false);
+ if($baseCriteria!==null)
+ $baseCriteria=clone $baseCriteria;
+ $count=$this->model->count($this->getCriteria());
+ $this->model->setDbCriteria($baseCriteria);
+ return $count;
+ }
+}