* @package system.web * @since 1.1 */ abstract class CDataProvider extends CComponent implements IDataProvider { private $_id; private $_data; private $_keys; private $_totalItemCount; private $_sort; private $_pagination; /** * Fetches the data from the persistent data storage. * @return array list of data items */ abstract protected function fetchData(); /** * Fetches the data item keys from the persistent data storage. * @return array list of data item keys. */ abstract protected function fetchKeys(); /** * Calculates the total number of data items. * @return integer the total number of data items. */ abstract protected function calculateTotalItemCount(); /** * Returns the ID that uniquely identifies the data provider. * @return string the unique ID that uniquely identifies the data provider among all data providers. */ public function getId() { return $this->_id; } /** * Sets the provider ID. * @param string $value the unique ID that uniquely identifies the data provider among all data providers. */ public function setId($value) { $this->_id=$value; } /** * Returns the pagination object. * @param string $className the pagination object class name. Parameter is available since version 1.1.13. * @return CPagination|false the pagination object. If this is false, it means the pagination is disabled. */ public function getPagination($className='CPagination') { if($this->_pagination===null) { $this->_pagination=new $className; if(($id=$this->getId())!='') $this->_pagination->pageVar=$id.'_page'; } return $this->_pagination; } /** * Sets the pagination for this data provider. * @param mixed $value the pagination to be used by this data provider. This could be a {@link CPagination} object * or an array used to configure the pagination object. If this is false, it means the pagination should be disabled. * * You can configure this property same way as a component: *
	 * array(
	 *     'class' => 'MyPagination',
	 *     'pageSize' => 20,
	 * ),
	 * 
*/ public function setPagination($value) { if(is_array($value)) { if(isset($value['class'])) { $pagination=$this->getPagination($value['class']); unset($value['class']); } else $pagination=$this->getPagination(); foreach($value as $k=>$v) $pagination->$k=$v; } else $this->_pagination=$value; } /** * Returns the sort object. * @param string $className the sorting object class name. Parameter is available since version 1.1.13. * @return CSort|false the sorting object. If this is false, it means the sorting is disabled. */ public function getSort($className='CSort') { if($this->_sort===null) { $this->_sort=new $className; if(($id=$this->getId())!='') $this->_sort->sortVar=$id.'_sort'; } return $this->_sort; } /** * Sets the sorting for this data provider. * @param mixed $value the sorting to be used by this data provider. This could be a {@link CSort} object * or an array used to configure the sorting object. If this is false, it means the sorting should be disabled. * * You can configure this property same way as a component: *
	 * array(
	 *     'class' => 'MySort',
	 *     'attributes' => array('name', 'weight'),
	 * ),
	 * 
*/ public function setSort($value) { if(is_array($value)) { if(isset($value['class'])) { $sort=$this->getSort($value['class']); unset($value['class']); } else $sort=$this->getSort(); foreach($value as $k=>$v) $sort->$k=$v; } else $this->_sort=$value; } /** * Returns the data items currently available. * @param boolean $refresh whether the data should be re-fetched from persistent storage. * @return array the list of data items currently available in this data provider. */ public function getData($refresh=false) { if($this->_data===null || $refresh) $this->_data=$this->fetchData(); return $this->_data; } /** * Sets the data items for this provider. * @param array $value put the data items into this provider. */ public function setData($value) { $this->_data=$value; } /** * Returns the key values associated with the data items. * @param boolean $refresh whether the keys should be re-calculated. * @return array the list of key values corresponding to {@link data}. Each data item in {@link data} * is uniquely identified by the corresponding key value in this array. */ public function getKeys($refresh=false) { if($this->_keys===null || $refresh) $this->_keys=$this->fetchKeys(); return $this->_keys; } /** * Sets the data item keys for this provider. * @param array $value put the data item keys into this provider. */ public function setKeys($value) { $this->_keys=$value; } /** * Returns the number of data items in the current page. * This is equivalent to count($provider->getData()). * When {@link pagination} is set false, this returns the same value as {@link totalItemCount}. * @param boolean $refresh whether the number of data items should be re-calculated. * @return integer the number of data items in the current page. */ public function getItemCount($refresh=false) { return count($this->getData($refresh)); } /** * Returns the total number of data items. * When {@link pagination} is set false, this returns the same value as {@link itemCount}. * @param boolean $refresh whether the total number of data items should be re-calculated. * @return integer total number of possible data items. */ public function getTotalItemCount($refresh=false) { if($this->_totalItemCount===null || $refresh) $this->_totalItemCount=$this->calculateTotalItemCount(); return $this->_totalItemCount; } /** * Sets the total number of data items. * This method is provided in case when the total number cannot be determined by {@link calculateTotalItemCount}. * @param integer $value the total number of data items. * @since 1.1.1 */ public function setTotalItemCount($value) { $this->_totalItemCount=$value; } }