From 7eb33d65c60588bf47f6f3ad9455f2b1b124ffb2 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Sun, 21 Jul 2013 13:20:47 -0400 Subject: [PATCH] Refactored Sort. --- framework/yii/data/Sort.php | 31 ++++++++++++++++++++++--------- framework/yii/widgets/LinkPager.php | 2 +- tests/unit/framework/data/SortTest.php | 21 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/framework/yii/data/Sort.php b/framework/yii/data/Sort.php index 5132188..a466637 100644 --- a/framework/yii/data/Sort.php +++ b/framework/yii/data/Sort.php @@ -275,8 +275,8 @@ class Sort extends Object */ public function getAttributeOrder($attribute) { - $this->getAttributeOrders(); - return isset($this->_attributeOrders[$attribute]) ? $this->_attributeOrders[$attribute] : null; + $orders = $this->getAttributeOrders(); + return isset($orders[$attribute]) ? $orders[$attribute] : null; } /** @@ -300,8 +300,8 @@ class Sort extends Object } $url = $this->createUrl($attribute); - $definition = $this->attributes[$attribute]; - return Html::a($definition['label'], $url, $options); + $options['data-sort'] = $this->createSortVar($attribute); + return Html::a($this->attributes[$attribute]['label'], $url, $options); } /** @@ -317,6 +317,23 @@ class Sort extends Object */ public function createUrl($attribute) { + $params = $this->params === null ? $_GET : $this->params; + $params[$this->sortVar] = $this->createSortVar($attribute); + $route = $this->route === null ? Yii::$app->controller->getRoute() : $this->route; + $urlManager = $this->urlManager === null ? Yii::$app->getUrlManager() : $this->urlManager; + return $urlManager->createUrl($route, $params); + } + + /** + * Creates the sort variable for the specified attribute. + * The newly created sort variable can be used to create a URL that will lead to + * sorting by the specified attribute. + * @param string $attribute the attribute name + * @return string the value of the sort variable + * @throws InvalidConfigException if the specified attribute is not defined in [[attributes]] + */ + public function createSortVar($attribute) + { if (!isset($this->attributes[$attribute])) { throw new InvalidConfigException("Unknown attribute: $attribute"); } @@ -339,10 +356,6 @@ class Sort extends Object foreach ($directions as $attribute => $descending) { $sorts[] = $descending ? $attribute . $this->separators[1] . $this->descTag : $attribute; } - $params = $this->params === null ? $_GET : $this->params; - $params[$this->sortVar] = implode($this->separators[0], $sorts); - $route = $this->route === null ? Yii::$app->controller->getRoute() : $this->route; - $urlManager = $this->urlManager === null ? Yii::$app->getUrlManager() : $this->urlManager; - return $urlManager->createUrl($route, $params); + return implode($this->separators[0], $sorts); } } diff --git a/framework/yii/widgets/LinkPager.php b/framework/yii/widgets/LinkPager.php index f3af72f..4fef971 100644 --- a/framework/yii/widgets/LinkPager.php +++ b/framework/yii/widgets/LinkPager.php @@ -183,7 +183,7 @@ class LinkPager extends Widget } $class = trim($class); $options = array('class' => $class === '' ? null : $class); - return Html::tag('li', Html::a($label, $this->pagination->createUrl($page)), $options); + return Html::tag('li', Html::a($label, $this->pagination->createUrl($page), array('data-page' => $page)), $options); } /** diff --git a/tests/unit/framework/data/SortTest.php b/tests/unit/framework/data/SortTest.php index 80f485c..fb3599c 100644 --- a/tests/unit/framework/data/SortTest.php +++ b/tests/unit/framework/data/SortTest.php @@ -93,6 +93,27 @@ class SortTest extends TestCase $this->assertNull($sort->getAttributeOrder('xyz')); } + public function testCreateSortVar() + { + $sort = new Sort(array( + 'attributes' => array( + 'age', + 'name' => array( + 'asc' => array('first_name' => Sort::ASC, 'last_name' => Sort::ASC), + 'desc' => array('first_name' => Sort::DESC, 'last_name' => Sort::DESC), + ), + ), + 'params' => array( + 'sort' => 'age.name-desc' + ), + 'enableMultiSort' => true, + 'route' => 'site/index', + )); + + $this->assertEquals('age-desc.name-desc', $sort->createSortVar('age')); + $this->assertEquals('name.age', $sort->createSortVar('name')); + } + public function testCreateUrl() { $manager = new UrlManager(array(