123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- <?php
- /**
- * @link http://www.yiiframework.com/
- * @copyright Copyright (c) 2008 Yii Software LLC
- * @license http://www.yiiframework.com/license/
- */
- namespace yii\data;
- use Yii;
- use yii\base\Component;
- use yii\base\InvalidArgumentException;
- /**
- * BaseDataProvider provides a base class that implements the [[DataProviderInterface]].
- *
- * For more details and usage information on BaseDataProvider, see the [guide article on data providers](guide:output-data-providers).
- *
- * @property int $count The number of data models in the current page. This property is read-only.
- * @property array $keys The list of key values corresponding to [[models]]. Each data model in [[models]] is
- * uniquely identified by the corresponding key value in this array.
- * @property array $models The list of data models in the current page.
- * @property Pagination|false $pagination The pagination object. If this is false, it means the pagination is
- * disabled. Note that the type of this property differs in getter and setter. See [[getPagination()]] and
- * [[setPagination()]] for details.
- * @property Sort|bool $sort The sorting object. If this is false, it means the sorting is disabled. Note that
- * the type of this property differs in getter and setter. See [[getSort()]] and [[setSort()]] for details.
- * @property int $totalCount Total number of possible data models.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @since 2.0
- */
- abstract class BaseDataProvider extends Component implements DataProviderInterface
- {
- /**
- * @var int Number of data providers on the current page. Used to generate unique IDs.
- */
- private static $counter = 0;
- /**
- * @var string an ID that uniquely identifies the data provider among all data providers.
- * Generated automatically the following way in case it is not set:
- *
- * - First data provider ID is empty.
- * - Second and all subsequent data provider IDs are: "dp-1", "dp-2", etc.
- */
- public $id;
- private $_sort;
- private $_pagination;
- private $_keys;
- private $_models;
- private $_totalCount;
- /**
- * {@inheritdoc}
- */
- public function init()
- {
- parent::init();
- if ($this->id === null) {
- if (self::$counter > 0) {
- $this->id = 'dp-' . self::$counter;
- }
- self::$counter++;
- }
- }
- /**
- * Prepares the data models that will be made available in the current page.
- * @return array the available data models
- */
- abstract protected function prepareModels();
- /**
- * Prepares the keys associated with the currently available data models.
- * @param array $models the available data models
- * @return array the keys
- */
- abstract protected function prepareKeys($models);
- /**
- * Returns a value indicating the total number of data models in this data provider.
- * @return int total number of data models in this data provider.
- */
- abstract protected function prepareTotalCount();
- /**
- * Prepares the data models and keys.
- *
- * This method will prepare the data models and keys that can be retrieved via
- * [[getModels()]] and [[getKeys()]].
- *
- * This method will be implicitly called by [[getModels()]] and [[getKeys()]] if it has not been called before.
- *
- * @param bool $forcePrepare whether to force data preparation even if it has been done before.
- */
- public function prepare($forcePrepare = false)
- {
- if ($forcePrepare || $this->_models === null) {
- $this->_models = $this->prepareModels();
- }
- if ($forcePrepare || $this->_keys === null) {
- $this->_keys = $this->prepareKeys($this->_models);
- }
- }
- /**
- * Returns the data models in the current page.
- * @return array the list of data models in the current page.
- */
- public function getModels()
- {
- $this->prepare();
- return $this->_models;
- }
- /**
- * Sets the data models in the current page.
- * @param array $models the models in the current page
- */
- public function setModels($models)
- {
- $this->_models = $models;
- }
- /**
- * Returns the key values associated with the data models.
- * @return array the list of key values corresponding to [[models]]. Each data model in [[models]]
- * is uniquely identified by the corresponding key value in this array.
- */
- public function getKeys()
- {
- $this->prepare();
- return $this->_keys;
- }
- /**
- * Sets the key values associated with the data models.
- * @param array $keys the list of key values corresponding to [[models]].
- */
- public function setKeys($keys)
- {
- $this->_keys = $keys;
- }
- /**
- * Returns the number of data models in the current page.
- * @return int the number of data models in the current page.
- */
- public function getCount()
- {
- return count($this->getModels());
- }
- /**
- * Returns the total number of data models.
- * When [[pagination]] is false, this returns the same value as [[count]].
- * Otherwise, it will call [[prepareTotalCount()]] to get the count.
- * @return int total number of possible data models.
- */
- public function getTotalCount()
- {
- if ($this->getPagination() === false) {
- return $this->getCount();
- } elseif ($this->_totalCount === null) {
- $this->_totalCount = $this->prepareTotalCount();
- }
- return $this->_totalCount;
- }
- /**
- * Sets the total number of data models.
- * @param int $value the total number of data models.
- */
- public function setTotalCount($value)
- {
- $this->_totalCount = $value;
- }
- /**
- * Returns the pagination object used by this data provider.
- * Note that you should call [[prepare()]] or [[getModels()]] first to get correct values
- * of [[Pagination::totalCount]] and [[Pagination::pageCount]].
- * @return Pagination|false the pagination object. If this is false, it means the pagination is disabled.
- */
- public function getPagination()
- {
- if ($this->_pagination === null) {
- $this->setPagination([]);
- }
- return $this->_pagination;
- }
- /**
- * Sets the pagination for this data provider.
- * @param array|Pagination|bool $value the pagination to be used by this data provider.
- * This can be one of the following:
- *
- * - a configuration array for creating the pagination object. The "class" element defaults
- * to 'yii\data\Pagination'
- * - an instance of [[Pagination]] or its subclass
- * - false, if pagination needs to be disabled.
- *
- * @throws InvalidArgumentException
- */
- public function setPagination($value)
- {
- if (is_array($value)) {
- $config = ['class' => Pagination::className()];
- if ($this->id !== null) {
- $config['pageParam'] = $this->id . '-page';
- $config['pageSizeParam'] = $this->id . '-per-page';
- }
- $this->_pagination = Yii::createObject(array_merge($config, $value));
- } elseif ($value instanceof Pagination || $value === false) {
- $this->_pagination = $value;
- } else {
- throw new InvalidArgumentException('Only Pagination instance, configuration array or false is allowed.');
- }
- }
- /**
- * Returns the sorting object used by this data provider.
- * @return Sort|bool the sorting object. If this is false, it means the sorting is disabled.
- */
- public function getSort()
- {
- if ($this->_sort === null) {
- $this->setSort([]);
- }
- return $this->_sort;
- }
- /**
- * Sets the sort definition for this data provider.
- * @param array|Sort|bool $value the sort definition to be used by this data provider.
- * This can be one of the following:
- *
- * - a configuration array for creating the sort definition object. The "class" element defaults
- * to 'yii\data\Sort'
- * - an instance of [[Sort]] or its subclass
- * - false, if sorting needs to be disabled.
- *
- * @throws InvalidArgumentException
- */
- public function setSort($value)
- {
- if (is_array($value)) {
- $config = ['class' => Sort::className()];
- if ($this->id !== null) {
- $config['sortParam'] = $this->id . '-sort';
- }
- $this->_sort = Yii::createObject(array_merge($config, $value));
- } elseif ($value instanceof Sort || $value === false) {
- $this->_sort = $value;
- } else {
- throw new InvalidArgumentException('Only Sort instance, configuration array or false is allowed.');
- }
- }
- /**
- * Refreshes the data provider.
- * After calling this method, if [[getModels()]], [[getKeys()]] or [[getTotalCount()]] is called again,
- * they will re-execute the query and return the latest data available.
- */
- public function refresh()
- {
- $this->_totalCount = null;
- $this->_models = null;
- $this->_keys = null;
- }
- }
|