diff --git a/cake/libs/configure.php b/cake/libs/configure.php index e29e77d60..318cbcb86 100644 --- a/cake/libs/configure.php +++ b/cake/libs/configure.php @@ -1018,9 +1018,7 @@ class App extends Object { * @access private */ function __overload($type, $name) { - $overload = array('Model', 'Helper'); - - if (in_array($type, $overload) && low($name) != 'schema') { + if (($type ==='Model' || $type === 'Helper') && strtolower($name) != 'schema') { Overloadable::overload($name); } } diff --git a/cake/libs/controller/app_controller.php b/cake/libs/controller/app_controller.php index a97c8c068..aeea73944 100644 --- a/cake/libs/controller/app_controller.php +++ b/cake/libs/controller/app_controller.php @@ -20,7 +20,7 @@ * @copyright Copyright 2005-2008, Cake Software Foundation, Inc. * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project * @package cake - * @subpackage cake.cake + * @subpackage cake.cake.libs.controller * @since CakePHP(tm) v 0.2.9 * @version $Revision$ * @modifiedby $LastChangedBy$ @@ -35,7 +35,7 @@ * will inherit them. * * @package cake - * @subpackage cake.cake + * @subpackage cake.cake.libs.controller */ class AppController extends Controller { } diff --git a/cake/libs/controller/controller.php b/cake/libs/controller/controller.php index 25ced4096..5fe9bc351 100644 --- a/cake/libs/controller/controller.php +++ b/cake/libs/controller/controller.php @@ -919,19 +919,21 @@ class Controller extends Object { } if (!empty($options['order']) && is_array($options['order'])) { + $alias = $object->alias ; $key = $field = key($options['order']); - if (strpos($key, '.') !== false) { - $field = array_pop(explode('.', $key)); - } + if (strpos($key, '.') !== false) { + list($alias, $field) = explode('.', $key); + } $value = $options['order'][$key]; unset($options['order'][$key]); - if ($object->hasField($field)) { - $options['order'][$object->alias . '.' . $field] = $value; + if (isset($object->{$alias}) && $object->{$alias}->hasField($field)) { + $options['order'][$alias . '.' . $field] = $value; + } elseif ($object->hasField($field)) { + $options['order'][$alias . '.' . $field] = $value; } } - $vars = array('fields', 'order', 'limit', 'page', 'recursive'); $keys = array_keys($options); $count = count($keys); @@ -946,13 +948,13 @@ class Controller extends Object { unset($options[$keys[$i]]); } } - $conditions = $fields = $order = $limit = $page = $recursive = null; + if (!isset($defaults['conditions'])) { $defaults['conditions'] = array(); } - extract($options = array_merge(array('page' => 1, 'limit' => 20), $defaults, $options)); + if (is_array($scope) && !empty($scope)) { $conditions = array_merge($conditions, $scope); } elseif (is_string($scope)) { @@ -962,10 +964,12 @@ class Controller extends Object { $recursive = $object->recursive; } $type = 'all'; + if (isset($defaults[0])) { $type = array_shift($defaults); } $extra = array_diff_key($defaults, compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive')); + if (method_exists($object, 'paginateCount')) { $count = $object->paginateCount($conditions, $recursive); } else { @@ -1002,13 +1006,11 @@ class Controller extends Object { 'defaults' => array_merge(array('limit' => 20, 'step' => 1), $defaults), 'options' => $options ); - $this->params['paging'][$object->alias] = $paging; if (!in_array('Paginator', $this->helpers) && !array_key_exists('Paginator', $this->helpers)) { $this->helpers[] = 'Paginator'; } - return $results; } /** diff --git a/cake/libs/model/app_model.php b/cake/libs/model/app_model.php index 63a07d019..49427f923 100644 --- a/cake/libs/model/app_model.php +++ b/cake/libs/model/app_model.php @@ -20,7 +20,7 @@ * @copyright Copyright 2005-2008, Cake Software Foundation, Inc. * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project * @package cake - * @subpackage cake.cake + * @subpackage cake.cake.libs.model * @since CakePHP(tm) v 0.2.9 * @version $Revision$ * @modifiedby $LastChangedBy$ @@ -35,7 +35,7 @@ * Add your application-wide methods to the class, your models will inherit them. * * @package cake - * @subpackage cake.cake + * @subpackage cake.cake.libs.model */ class AppModel extends Model { } diff --git a/cake/libs/model/schema.php b/cake/libs/model/schema.php index 41d0aa16c..0c4cf3635 100644 --- a/cake/libs/model/schema.php +++ b/cake/libs/model/schema.php @@ -17,7 +17,7 @@ * @copyright Copyright 2005-2008, Cake Software Foundation, Inc. * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project * @package cake - * @subpackage cake.cake.libs + * @subpackage cake.cake.libs.model * @since CakePHP(tm) v 1.2.0.5550 * @version $Revision$ * @modifiedby $LastChangedBy$ @@ -28,8 +28,8 @@ App::import('Model', 'ConnectionManager'); /** * Base Class for Schema management * - * @package cake.libs - * @subpackage cake.libs + * @package cake + * @subpackage ccake.cake.libs.model */ class CakeSchema extends Object { /** diff --git a/cake/libs/set.php b/cake/libs/set.php index a43bd4523..52777fcad 100644 --- a/cake/libs/set.php +++ b/cake/libs/set.php @@ -1114,5 +1114,4 @@ class Set extends Object { return $sorted; } } - ?> \ No newline at end of file diff --git a/cake/libs/view/helpers/paginator.php b/cake/libs/view/helpers/paginator.php index be4581b45..063115fe2 100644 --- a/cake/libs/view/helpers/paginator.php +++ b/cake/libs/view/helpers/paginator.php @@ -140,6 +140,9 @@ class PaginatorHelper extends AppHelper { } if (isset($options['sort']) && !empty($options['sort'])) { + if (preg_match('/(?:\w+\.)?(\w+)/', $options['sort'], $result) && isset($result[1])) { + return $result[1]; + } return $options['sort']; } elseif (isset($options['order']) && is_array($options['order'])) { return preg_replace('/.*\./', '', key($options['order'])); @@ -219,16 +222,20 @@ class PaginatorHelper extends AppHelper { $key = $title; $title = __(Inflector::humanize(preg_replace('/_id$/', '', $title)), true); } - $dir = 'asc'; + $model = null; + + if (strpos($key, '.') !== false) { + list($model, $key) = explode('.', $key); + $model = $model . '.'; + } if ($this->sortKey($options['model']) == $key && $this->sortDir($options['model']) == 'asc') { $dir = 'desc'; } if (is_array($title) && array_key_exists($dir, $title)) { $title = $title[$dir]; } - - $url = array_merge(array('sort' => $key, 'direction' => $dir), $url, array('order' => null)); + $url = array_merge(array('sort' => $model . $key, 'direction' => $dir), $url, array('order' => null)); return $this->link($title, $url, $options); } /** diff --git a/cake/tests/cases/libs/view/helpers/paginator.test.php b/cake/tests/cases/libs/view/helpers/paginator.test.php index 94cdab7eb..ea8382727 100644 --- a/cake/tests/cases/libs/view/helpers/paginator.test.php +++ b/cake/tests/cases/libs/view/helpers/paginator.test.php @@ -37,7 +37,7 @@ uses('view'.DS.'helpers'.DS.'app_helper', 'view'.DS.'helper', 'view'.DS.'helpers class PaginatorTest extends UnitTestCase { /** * setUp method - * + * * @access public * @return void */ @@ -74,7 +74,7 @@ class PaginatorTest extends UnitTestCase { } /** * testHasPrevious method - * + * * @access public * @return void */ @@ -86,7 +86,7 @@ class PaginatorTest extends UnitTestCase { } /** * testHasNext method - * + * * @access public * @return void */ @@ -98,7 +98,7 @@ class PaginatorTest extends UnitTestCase { } /** * testDisabledLink method - * + * * @access public * @return void */ @@ -108,7 +108,7 @@ class PaginatorTest extends UnitTestCase { $result = $this->Paginator->next('Next', array(), true); $expected = '
Next
'; $this->assertEqual($result, $expected); - + $this->Paginator->params['paging']['Article']['prevPage'] = false; $result = $this->Paginator->prev('prev', array('update'=> 'theList', 'indicator'=> 'loading', 'url'=> array('controller' => 'posts')), null, array('class' => 'disabled', 'tag' => 'span')); $expected = 'prev'; @@ -116,7 +116,7 @@ class PaginatorTest extends UnitTestCase { } /** * testSortLinks method - * + * * @access public * @return void */ @@ -148,15 +148,48 @@ class PaginatorTest extends UnitTestCase { $result = $this->Paginator->sort(array('asc' => 'ascending', 'desc' => 'descending'), 'title'); $this->assertPattern('/\/accounts\/index\/param\/page:1\/sort:title\/direction:desc">descending<\/a>$/', $result); } +/** + * testSortLinksUsingDotNotation method + * + * @access public + * @return void + */ + function testSortLinksUsingDotNotation() { + Router::reload(); + Router::parse('/'); + Router::setRequestInfo(array( + array('plugin' => null, 'controller' => 'accounts', 'action' => 'index', 'pass' => array(), 'form' => array(), 'url' => array('url' => 'accounts/', 'mod_rewrite' => 'true'), 'bare' => 0), + array('plugin' => null, 'controller' => null, 'action' => null, 'base' => '/officespace', 'here' => '/officespace/accounts/', 'webroot' => '/officespace/', 'passedArgs' => array()) + )); + $this->Paginator->params['paging']['Article']['options']['order'] = array('Article.title' => 'desc'); + $this->Paginator->params['paging']['named'] = array( + 'page' => 1, + 'sort' => 'Artist.title', + 'direction' => 'desc' + ); + $result = $this->Paginator->sort('Title','Article.title'); + $this->assertPattern('/\/accounts\/index\/page:1\/sort:Article.title\/direction:asc">Title<\/a>$/', $result); + + + $this->Paginator->params['paging']['named'] = array( + 'page' => 1, + 'sort' => 'Artist.title', + 'direction' => 'asc' + ); + $this->Paginator->params['paging']['Article']['options']['order'] = array('Article.title' => 'asc'); + $result = $this->Paginator->sort('Title','Article.title'); + $this->assertPattern('/\/accounts\/index\/page:1\/sort:Article.title\/direction:desc">Title<\/a>$/', $result); + + } /** * testSortAdminLinks method - * + * * @access public * @return void */ function testSortAdminLinks() { Configure::write('Routing.admin', 'admin'); - + Router::reload(); Router::setRequestInfo(array( array('pass' => array(), 'named' => array(), 'controller' => 'users', 'plugin' => null, 'action' => 'admin_index', 'prefix' => 'admin', 'admin' => true, 'url' => array('ext' => 'html', 'url' => 'admin/users'), 'form' => array()), @@ -167,7 +200,7 @@ class PaginatorTest extends UnitTestCase { $result = $this->Paginator->next('Next'); $this->assertPattern('/^]+>Next<\/a>$/', $result); $this->assertPattern('/href="\/admin\/users\/index\/page:2"/', $result); - + Router::reload(); Router::setRequestInfo(array( array('plugin' => null, 'controller' => 'test', 'action' => 'admin_index', 'pass' => array(), 'prefix' => 'admin', 'admin' => true, 'form' => array(), 'url' => array('url' => 'admin/test')), @@ -180,7 +213,7 @@ class PaginatorTest extends UnitTestCase { } /** * testUrlGeneration method - * + * * @access public * @return void */ @@ -195,14 +228,14 @@ class PaginatorTest extends UnitTestCase { $this->Paginator->params['paging']['Article']['options']['page'] = 2; $result = $this->Paginator->url(); $this->assertEqual($result, '/index/page:2'); - + $options = array('order' => array('Article' => 'desc')); $result = $this->Paginator->url($options); - $this->assertEqual($result, '/index/page:2/sort:Article/direction:desc'); + $this->assertEqual($result, '/index/page:2/sort:Article/direction:desc'); } /** * testOptions method - * + * * @access public * @return void */ @@ -215,7 +248,7 @@ class PaginatorTest extends UnitTestCase { $options = array('paging' => array('Article' => array( 'order' => 'desc', - 'sort' => 'title' + 'sort' => 'title' ))); $this->Paginator->options($options); @@ -230,14 +263,14 @@ class PaginatorTest extends UnitTestCase { $options = array('Article' => array( 'order' => 'desc', - 'sort' => 'title' + 'sort' => 'title' )); $this->Paginator->options($options); $this->assertEqual($expected, $this->Paginator->params['paging']); } /** * testPagingLinks method - * + * * @access public * @return void */ @@ -250,7 +283,7 @@ class PaginatorTest extends UnitTestCase { $result = $this->Paginator->prev('<< Previous', null, null, array('class' => 'disabled')); $expected = '
<< Previous
'; $this->assertEqual($result, $expected); - + $result = $this->Paginator->prev('<< Previous', null, null, array('class' => 'disabled', 'tag' => 'span')); $expected = '<< Previous'; $this->assertEqual($result, $expected); @@ -267,7 +300,7 @@ class PaginatorTest extends UnitTestCase { } /** * testGenericLinks method - * + * * @access public * @return void */ @@ -287,7 +320,7 @@ class PaginatorTest extends UnitTestCase { } /** * testNumbers method - * + * * @access public * @return void */ @@ -380,22 +413,22 @@ class PaginatorTest extends UnitTestCase { $this->Paginator->params['paging'] = array( 'Client' => array( - 'page' => 1, - 'current' => 10, - 'count' => 30, - 'prevPage' => false, - 'nextPage' => 2, + 'page' => 1, + 'current' => 10, + 'count' => 30, + 'prevPage' => false, + 'nextPage' => 2, 'pageCount' => 3, 'defaults' => array( - 'limit' => 3, - 'step' => 1, - 'order' => array('Client.name' => 'DESC'), + 'limit' => 3, + 'step' => 1, + 'order' => array('Client.name' => 'DESC'), 'conditions' => array() ), 'options' => array( - 'page' => 1, - 'limit' => 3, - 'order' => array('Client.name' => 'DESC'), + 'page' => 1, + 'limit' => 3, + 'order' => array('Client.name' => 'DESC'), 'conditions' => array() ) ) @@ -408,7 +441,7 @@ class PaginatorTest extends UnitTestCase { } /** * testFirstAndLast method - * + * * @access public * @return void */ @@ -457,79 +490,79 @@ class PaginatorTest extends UnitTestCase { } /** * testCounter method - * + * * @access public * @return void */ function testCounter() { $this->Paginator->params['paging'] = array( 'Client' => array( - 'page' => 1, - 'current' => 3, - 'count' => 13, - 'prevPage' => false, - 'nextPage' => true, + 'page' => 1, + 'current' => 3, + 'count' => 13, + 'prevPage' => false, + 'nextPage' => true, 'pageCount' => 5, 'defaults' => array( - 'limit' => 3, - 'step' => 1, - 'order' => array('Client.name' => 'DESC'), + 'limit' => 3, + 'step' => 1, + 'order' => array('Client.name' => 'DESC'), 'conditions' => array() ), 'options' => array( - 'page' => 1, - 'limit' => 3, - 'order' => array('Client.name' => 'DESC'), + 'page' => 1, + 'limit' => 3, + 'order' => array('Client.name' => 'DESC'), 'conditions' => array(), 'separator' => 'of' ), ) ); - $input = 'Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%'; + $input = 'Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%'; $result = $this->Paginator->counter($input); $expected = 'Page 1 of 5, showing 3 records out of 13 total, starting on record 1, ending on 3'; $this->assertEqual($result, $expected); - + $input = 'Page %page% of %pages%'; $result = $this->Paginator->counter($input); $expected = 'Page 1 of 5'; $this->assertEqual($result, $expected); - + $result = $this->Paginator->counter(array('format' => $input)); $expected = 'Page 1 of 5'; $this->assertEqual($result, $expected); - + $result = $this->Paginator->counter(array('format' => 'pages')); $expected = '1 of 5'; $this->assertEqual($result, $expected); - + $result = $this->Paginator->counter(array('format' => 'range')); $expected = '1 - 3 of 13'; $this->assertEqual($result, $expected); - + } /** * testHasPage method - * + * * @access public * @return void */ function testHasPage() { $result = $this->Paginator->hasPage('Article', 15); $this->assertFalse($result); - + $result = $this->Paginator->hasPage('UndefinedModel', 2); $this->assertFalse($result); - + $result = $this->Paginator->hasPage('Article', 2); $this->assertTrue($result); - + $result = $this->Paginator->hasPage(2); $this->assertTrue($result); } /** * tearDown method - * + * * @access public * @return void */