diff --git a/forms/TableListField.php b/forms/TableListField.php index 2370220a9..862f83d8c 100755 --- a/forms/TableListField.php +++ b/forms/TableListField.php @@ -792,6 +792,16 @@ JS $baseLink = ($this->paginationBaseLink) ? $this->paginationBaseLink : $this->Link(); $link = Controller::join_links($baseLink, "?ctf[{$this->Name()}][start]={$start}"); if($this->extraLinkParams) $link .= "&" . http_build_query($this->extraLinkParams); + + // preserve sort options + if(isset($_REQUEST['ctf'][$this->Name()]['sort'])) { + $link .= "&ctf[{$this->Name()}][sort]=" . $_REQUEST['ctf'][$this->Name()]['sort']; + // direction + if(isset($_REQUEST['ctf'][$this->Name()]['dir'])) { + $link .= "&ctf[{$this->Name()}][dir]=" . $_REQUEST['ctf'][$this->Name()]['dir']; + } + } + return $link; } @@ -807,6 +817,16 @@ JS $baseLink = ($this->paginationBaseLink) ? $this->paginationBaseLink : $this->Link(); $link = Controller::join_links($baseLink, "?ctf[{$this->Name()}][start]={$start}"); if($this->extraLinkParams) $link .= "&" . http_build_query($this->extraLinkParams); + + // preserve sort options + if(isset($_REQUEST['ctf'][$this->Name()]['sort'])) { + $link .= "&ctf[{$this->Name()}][sort]=" . $_REQUEST['ctf'][$this->Name()]['sort']; + // direction + if(isset($_REQUEST['ctf'][$this->Name()]['dir'])) { + $link .= "&ctf[{$this->Name()}][dir]=" . $_REQUEST['ctf'][$this->Name()]['dir']; + } + } + return $link; } @@ -820,6 +840,16 @@ JS $baseLink = ($this->paginationBaseLink) ? $this->paginationBaseLink : $this->Link(); $link = Controller::join_links($baseLink, "?ctf[{$this->Name()}][start]={$start}"); if($this->extraLinkParams) $link .= "&" . http_build_query($this->extraLinkParams); + + // preserve sort options + if(isset($_REQUEST['ctf'][$this->Name()]['sort'])) { + $link .= "&ctf[{$this->Name()}][sort]=" . $_REQUEST['ctf'][$this->Name()]['sort']; + // direction + if(isset($_REQUEST['ctf'][$this->Name()]['dir'])) { + $link .= "&ctf[{$this->Name()}][dir]=" . $_REQUEST['ctf'][$this->Name()]['dir']; + } + } + return $link; } @@ -834,6 +864,16 @@ JS $baseLink = ($this->paginationBaseLink) ? $this->paginationBaseLink : $this->Link(); $link = Controller::join_links($baseLink, "?ctf[{$this->Name()}][start]={$start}"); if($this->extraLinkParams) $link .= "&" . http_build_query($this->extraLinkParams); + + // preserve sort options + if(isset($_REQUEST['ctf'][$this->Name()]['sort'])) { + $link .= "&ctf[{$this->Name()}][sort]=" . $_REQUEST['ctf'][$this->Name()]['sort']; + // direction + if(isset($_REQUEST['ctf'][$this->Name()]['dir'])) { + $link .= "&ctf[{$this->Name()}][dir]=" . $_REQUEST['ctf'][$this->Name()]['dir']; + } + } + return $link; } diff --git a/tests/forms/TableListFieldTest.php b/tests/forms/TableListFieldTest.php index f3a683ca6..a346e19af 100755 --- a/tests/forms/TableListFieldTest.php +++ b/tests/forms/TableListFieldTest.php @@ -212,6 +212,63 @@ class TableListFieldTest extends SapphireTest { unlink($csvFileName); } + + function testPreservedSortOptionsInPaginationLink() { + $item1 = $this->objFromFixture('TableListFieldTest_Obj', 'one'); + $item2 = $this->objFromFixture('TableListFieldTest_Obj', 'two'); + $item3 = $this->objFromFixture('TableListFieldTest_Obj', 'three'); + $item4 = $this->objFromFixture('TableListFieldTest_Obj', 'four'); + $item5 = $this->objFromFixture('TableListFieldTest_Obj', 'five'); + + /* With pagination enabled, only the first page of items should be shown */ + $table = new TableListField("Tester", "TableListFieldTest_Obj", array( + "A" => "Col A", + "B" => "Col B", + "C" => "Col C", + "D" => "Col D", + "E" => "Col E", + )); + // A TableListField must be inside a form for its links to be generated + $form = new Form(new TableListFieldTest_TestController(), "TestForm", new FieldSet( + $table + ), new FieldSet()); + + $table->ShowPagination = true; + $table->PageSize = 2; + + // first page & sort A column by ASC + $_REQUEST['ctf']['Tester']['start'] = 0; + $_REQUEST['ctf']['Tester']['sort'] = 'A'; + $this->assertContains('&ctf[Tester][sort]=A', $table->NextLink()); + $this->assertNotContains('ctf[Tester][dir]', $table->NextLink()); + $this->assertContains('&ctf[Tester][sort]=A', $table->LastLink()); + $this->assertNotContains('ctf[Tester][dir]', $table->LastLink()); + + // second page & sort A column by ASC + $_REQUEST['ctf']['Tester']['start'] = 2; + $this->assertContains('&ctf[Tester][sort]=A', $table->PrevLink()); + $this->assertNotContains('&ctf[Tester][dir]', $table->PrevLink()); + $this->assertContains('&ctf[Tester][sort]=A', $table->FirstLink()); + $this->assertNotContains('&ctf[Tester][dir]', $table->FirstLink()); + + // first page & sort A column by DESC + $_REQUEST['ctf']['Tester']['start'] = 0; + $_REQUEST['ctf']['Tester']['sort'] = 'A'; + $_REQUEST['ctf']['Tester']['dir'] = 'desc'; + $this->assertContains('&ctf[Tester][sort]=A', $table->NextLink()); + $this->assertContains('&ctf[Tester][dir]=desc', $table->NextLink()); + $this->assertContains('&ctf[Tester][sort]=A', $table->LastLink()); + $this->assertContains('&ctf[Tester][dir]=desc', $table->LastLink()); + + // second page & sort A column by DESC + $_REQUEST['ctf']['Tester']['start'] = 2; + $this->assertContains('&ctf[Tester][sort]=A', $table->PrevLink()); + $this->assertContains('&ctf[Tester][dir]=desc', $table->PrevLink()); + $this->assertContains('&ctf[Tester][sort]=A', $table->FirstLink()); + $this->assertContains('&ctf[Tester][dir]=desc', $table->FirstLink()); + + unset($_REQUEST['ctf']); + } } class TableListFieldTest_Obj extends DataObject implements TestOnly {