diff --git a/docs/en/02_Developer_Guides/01_Templates/01_Syntax.md b/docs/en/02_Developer_Guides/01_Templates/01_Syntax.md index ad8499f5f..8b8c50e44 100644 --- a/docs/en/02_Developer_Guides/01_Templates/01_Syntax.md +++ b/docs/en/02_Developer_Guides/01_Templates/01_Syntax.md @@ -296,8 +296,11 @@ iteration. * `$Even`, `$Odd`: Returns boolean, handy for zebra striping * `$EvenOdd`: Returns a string, either 'even' or 'odd'. Useful for CSS classes. * `$First`, `$Last`, `$Middle`: Booleans about the position in the list - * `$FirstLast`: Returns a string, "first", "last", or "". Useful for CSS classes. - * `$Pos`: The current position in the list (integer). Will start at 1. + * `$FirstLast`: Returns a string, "first", "last", "first last" (if both), or "". Useful for CSS classes. + * `$Pos`: The current position in the list (integer). + Will start at 1, but can take a starting index as a parameter. + * `$FromEnd`: The position of the item from the end (integer). + Last item defaults to 1, but can be passed as a parameter. * `$TotalItems`: Number of items in the list (integer) :::ss diff --git a/docs/en/04_Changelogs/3.2.0.md b/docs/en/04_Changelogs/3.2.0.md index 1aa96c057..8658bc785 100644 --- a/docs/en/04_Changelogs/3.2.0.md +++ b/docs/en/04_Changelogs/3.2.0.md @@ -460,3 +460,4 @@ coding conventions. E.g. `DB::requireTable` is now `DB::require_table` This is in order to promote better referencing of elements across the codebase. See `FulltextSearchable->enable` for example. * `FormField` subclasses must now use `validate(Validator $validator)` as the interface has changed for this function + * `$FromEnd` iterator variable now available in templates. diff --git a/tests/view/SSViewerTest.php b/tests/view/SSViewerTest.php index d653fe328..647d7cb0c 100644 --- a/tests/view/SSViewerTest.php +++ b/tests/view/SSViewerTest.php @@ -830,7 +830,19 @@ after') //test Pos $result = $this->render('<% loop Set %>$Pos<% end_loop %>',$data); - $this->assertEquals("12345678910",$result,"Even and Odd is returned in sequence numbers rendered in order"); + $this->assertEquals("12345678910", $result, '$Pos is rendered in order'); + + //test Pos + $result = $this->render('<% loop Set %>$Pos(0)<% end_loop %>',$data); + $this->assertEquals("0123456789", $result, '$Pos(0) is rendered in order'); + + //test FromEnd + $result = $this->render('<% loop Set %>$FromEnd<% end_loop %>',$data); + $this->assertEquals("10987654321", $result, '$FromEnd is rendered in order'); + + //test FromEnd + $result = $this->render('<% loop Set %>$FromEnd(0)<% end_loop %>',$data); + $this->assertEquals("9876543210", $result, '$FromEnd(0) rendered in order'); //test Total $result = $this->render('<% loop Set %>$TotalItems<% end_loop %>',$data); diff --git a/view/SSViewer.php b/view/SSViewer.php index 703dd0f7f..99ca40f34 100644 --- a/view/SSViewer.php +++ b/view/SSViewer.php @@ -206,6 +206,7 @@ class SSViewer_BasicIteratorSupport implements TemplateIteratorProvider { 'Odd', 'EvenOdd', 'Pos', + 'FromEnd', 'TotalItems', 'Modulus', 'MultipleOf', @@ -312,6 +313,17 @@ class SSViewer_BasicIteratorSupport implements TemplateIteratorProvider { return $this->iteratorPos + $startIndex; } + /** + * Return the position of this item from the last item in the list. The position of the final + * item is $endIndex, which defaults to 1. + * + * @param integer $endIndex Value of the last item + * @return int + */ + public function FromEnd($endIndex = 1) { + return $this->iteratorTotalItems - $this->iteratorPos + $endIndex - 1; + } + /** * Return the total number of "sibling" items in the dataset. *