summaryrefslogtreecommitdiff
path: root/framework/web/CDataProvider.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/web/CDataProvider.php')
-rw-r--r--framework/web/CDataProvider.php207
1 files changed, 207 insertions, 0 deletions
diff --git a/framework/web/CDataProvider.php b/framework/web/CDataProvider.php
new file mode 100644
index 0000000..3fc7f87
--- /dev/null
+++ b/framework/web/CDataProvider.php
@@ -0,0 +1,207 @@
+<?php
+/**
+ * CDataProvider is a base class that implements the {@link IDataProvider} interface.
+ *
+ * Derived classes mainly need to implement three methods: {@link fetchData},
+ * {@link fetchKeys} and {@link calculateTotalItemCount}.
+ *
+ * @property string $id The unique ID that uniquely identifies the data provider among all data providers.
+ * @property CPagination $pagination The pagination object. If this is false, it means the pagination is disabled.
+ * @property CSort $sort The sorting object. If this is false, it means the sorting is disabled.
+ * @property array $data The list of data items currently available in this data provider.
+ * @property array $keys 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.
+ * @property integer $itemCount The number of data items in the current page.
+ * @property integer $totalItemCount Total number of possible data items.
+ *
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @version $Id: CDataProvider.php 3426 2011-10-25 00:01:09Z alexander.makarow $
+ * @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.
+ * @return CPagination the pagination object. If this is false, it means the pagination is disabled.
+ */
+ public function getPagination()
+ {
+ if($this->_pagination===null)
+ {
+ $this->_pagination=new CPagination;
+ 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.
+ */
+ public function setPagination($value)
+ {
+ if(is_array($value))
+ {
+ $pagination=$this->getPagination();
+ foreach($value as $k=>$v)
+ $pagination->$k=$v;
+ }
+ else
+ $this->_pagination=$value;
+ }
+
+ /**
+ * Returns the sort object.
+ * @return CSort the sorting object. If this is false, it means the sorting is disabled.
+ */
+ public function getSort()
+ {
+ if($this->_sort===null)
+ {
+ $this->_sort=new CSort;
+ 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.
+ */
+ public function setSort($value)
+ {
+ if(is_array($value))
+ {
+ $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 <code>count($provider->getData())</code>.
+ * 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;
+ }
+}