Commit 27238f8d by Qiang Xue

refactored ActiveDataProvider.

parent 250ec28e
...@@ -111,15 +111,14 @@ class ActiveDataProvider extends DataProvider ...@@ -111,15 +111,14 @@ class ActiveDataProvider extends DataProvider
* When [[pagination]] is false, this returns the same value as [[count]]. * When [[pagination]] is false, this returns the same value as [[count]].
* If [[totalCount]] is not explicitly set, it will be calculated * If [[totalCount]] is not explicitly set, it will be calculated
* using [[query]] with a COUNT query. * using [[query]] with a COUNT query.
* @param boolean $refresh whether to recalculate the model count
* @return integer total number of possible data models. * @return integer total number of possible data models.
* @throws InvalidConfigException * @throws InvalidConfigException
*/ */
public function getTotalCount($refresh = false) public function getTotalCount()
{ {
if ($this->getPagination() === false) { if ($this->getPagination() === false) {
return $this->getCount(); return $this->getCount();
} elseif ($this->_totalCount === null || $refresh) { } elseif ($this->_totalCount === null) {
if (!$this->query instanceof Query) { if (!$this->query instanceof Query) {
throw new InvalidConfigException('The "query" property must be an instance of Query or its subclass.'); throw new InvalidConfigException('The "query" property must be an instance of Query or its subclass.');
} }
...@@ -141,11 +140,22 @@ class ActiveDataProvider extends DataProvider ...@@ -141,11 +140,22 @@ class ActiveDataProvider extends DataProvider
/** /**
* Returns the data models in the current page. * Returns the data models in the current page.
* @return array the list of 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() public function getModels()
{ {
if ($this->_models === null) { 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; return $this->_models;
} }
...@@ -194,21 +204,14 @@ class ActiveDataProvider extends DataProvider ...@@ -194,21 +204,14 @@ class ActiveDataProvider extends DataProvider
} }
/** /**
* Performs query and load data models. * Refreshes the data provider.
* @throws InvalidConfigException if [[query]] is not set or invalid. * 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) { $this->_models = null;
throw new InvalidConfigException('The "query" property must be an instance of Query or its subclass.'); $this->_totalCount = null;
} $this->_keys = null;
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);
} }
} }
...@@ -68,4 +68,19 @@ class ActiveDataProviderTest extends DatabaseTestCase ...@@ -68,4 +68,19 @@ class ActiveDataProviderTest extends DatabaseTestCase
$orders = $provider->getModels(); $orders = $provider->getModels();
$this->assertEquals(2, count($orders)); $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()));
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment