Browse Source

refactored ActiveDataProvider.

tags/2.0.0-beta
Qiang Xue 11 years ago
parent
commit
27238f8d03
  1. 39
      framework/yii/data/ActiveDataProvider.php
  2. 15
      tests/unit/framework/data/ActiveDataProviderTest.php

39
framework/yii/data/ActiveDataProvider.php

@ -111,15 +111,14 @@ class ActiveDataProvider extends DataProvider
* When [[pagination]] is false, this returns the same value as [[count]].
* If [[totalCount]] is not explicitly set, it will be calculated
* using [[query]] with a COUNT query.
* @param boolean $refresh whether to recalculate the model count
* @return integer total number of possible data models.
* @throws InvalidConfigException
*/
public function getTotalCount($refresh = false)
public function getTotalCount()
{
if ($this->getPagination() === false) {
return $this->getCount();
} elseif ($this->_totalCount === null || $refresh) {
} elseif ($this->_totalCount === null) {
if (!$this->query instanceof Query) {
throw new InvalidConfigException('The "query" property must be an instance of Query or its subclass.');
}
@ -141,11 +140,22 @@ class ActiveDataProvider extends DataProvider
/**
* Returns the data models in the current page.
* @return array the list of data models in the current page.
* @throws InvalidConfigException if [[query]] is not set or invalid.
*/
public function getModels()
{
if ($this->_models === null) {
$this->loadModels();
if (!$this->query instanceof Query) {
throw new InvalidConfigException('The "query" property must be an instance of Query or its subclass.');
}
if (($pagination = $this->getPagination()) !== false) {
$pagination->totalCount = $this->getTotalCount();
$this->query->limit($pagination->getLimit())->offset($pagination->getOffset());
}
if (($sort = $this->getSort()) !== false) {
$this->query->orderBy($sort->getOrders());
}
$this->_models = $this->query->all($this->db);
}
return $this->_models;
}
@ -194,21 +204,14 @@ class ActiveDataProvider extends DataProvider
}
/**
* Performs query and load data models.
* @throws InvalidConfigException if [[query]] is not set or invalid.
* 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 loadModels()
public function refresh()
{
if (!$this->query instanceof Query) {
throw new InvalidConfigException('The "query" property must be an instance of Query or its subclass.');
}
if (($pagination = $this->getPagination()) !== false) {
$pagination->totalCount = $this->getTotalCount();
$this->query->limit($pagination->getLimit())->offset($pagination->getOffset());
}
if (($sort = $this->getSort()) !== false) {
$this->query->orderBy($sort->getOrders());
}
$this->_models = $this->query->all($this->db);
$this->_models = null;
$this->_totalCount = null;
$this->_keys = null;
}
}

15
tests/unit/framework/data/ActiveDataProviderTest.php

@ -68,4 +68,19 @@ class ActiveDataProviderTest extends DatabaseTestCase
$orders = $provider->getModels();
$this->assertEquals(2, count($orders));
}
public function testRefresh()
{
$query = new Query;
$provider = new ActiveDataProvider(array(
'db' => $this->getConnection(),
'query' => $query->from('tbl_order')->orderBy('id'),
));
$this->assertEquals(3, count($provider->getModels()));
$provider->getPagination()->pageSize = 2;
$this->assertEquals(3, count($provider->getModels()));
$provider->refresh();
$this->assertEquals(2, count($provider->getModels()));
}
}

Loading…
Cancel
Save