mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
commit
9a1644f9e1
50
model/GroupedList.php
Normal file
50
model/GroupedList.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
/**
|
||||
* A list decorator that allows a list to be grouped into sub-lists by common
|
||||
* values of a field.
|
||||
*
|
||||
* @package sapphire
|
||||
* @subpackage model
|
||||
*/
|
||||
class GroupedList extends SS_ListDecorator {
|
||||
|
||||
/**
|
||||
* @param string $index
|
||||
* @return ArrayList
|
||||
*/
|
||||
public function groupBy($index) {
|
||||
$result = array();
|
||||
|
||||
foreach ($this->list as $item) {
|
||||
$key = is_object($item) ? $item->$index : $item[$index];
|
||||
|
||||
if (array_key_exists($key, $result)) {
|
||||
$result[$key]->push($item);
|
||||
} else {
|
||||
$result[$key] = new ArrayList(array($item));
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $index
|
||||
* @param string $children
|
||||
* @return ArrayList
|
||||
*/
|
||||
public function GroupedBy($index, $children = 'Children') {
|
||||
$grouped = $this->groupBy($index);
|
||||
$result = new ArrayList();
|
||||
|
||||
foreach ($grouped as $indVal => $list) {
|
||||
$result->push(new ArrayData(array(
|
||||
$index => $indVal,
|
||||
$children => $list
|
||||
)));
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
}
|
52
tests/model/GroupedListTest.php
Normal file
52
tests/model/GroupedListTest.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
/**
|
||||
* Tests for the {@link GroupedList} list decorator.
|
||||
*
|
||||
* @package sapphire
|
||||
* @subpackage tests
|
||||
*/
|
||||
class GroupedListTest extends SapphireTest {
|
||||
|
||||
public function testGroupBy() {
|
||||
$list = new GroupedList(new ArrayList(array(
|
||||
array('Name' => 'AAA'),
|
||||
array('Name' => 'AAA'),
|
||||
array('Name' => 'BBB'),
|
||||
array('Name' => 'BBB'),
|
||||
array('Name' => 'AAA'),
|
||||
array('Name' => 'BBB'),
|
||||
array('Name' => 'CCC'),
|
||||
array('Name' => 'CCC')
|
||||
)));
|
||||
|
||||
$grouped = $list->groupBy('Name');
|
||||
|
||||
$this->assertEquals(3, count($grouped));
|
||||
$this->assertEquals(3, count($grouped['AAA']));
|
||||
$this->assertEquals(3, count($grouped['BBB']));
|
||||
$this->assertEquals(2, count($grouped['CCC']));
|
||||
}
|
||||
|
||||
public function testGroupedBy() {
|
||||
$list = new GroupedList(new ArrayList(array(
|
||||
array('Name' => 'AAA'),
|
||||
array('Name' => 'AAA'),
|
||||
array('Name' => 'BBB'),
|
||||
array('Name' => 'BBB'),
|
||||
array('Name' => 'AAA'),
|
||||
array('Name' => 'BBB'),
|
||||
array('Name' => 'CCC'),
|
||||
array('Name' => 'CCC')
|
||||
)));
|
||||
|
||||
$grouped = $list->GroupedBy('Name');
|
||||
$first = $grouped->first();
|
||||
$last = $grouped->last();
|
||||
|
||||
$this->assertEquals(3, count($first->Children));
|
||||
$this->assertEquals('AAA', $first->Name);
|
||||
$this->assertEquals(2, count($last->Children));
|
||||
$this->assertEquals('CCC', $last->Name);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user