GroupedList.php
1.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
/**
* A list decorator that allows a list to be grouped into sub-lists by common
* values of a field.
*
* @package framework
* @subpackage model
*/
class GroupedList extends SS_ListDecorator {
/**
* @param string $index
* @return array
*/
public function groupBy($index) {
$result = array();
foreach ($this->list as $item) {
// if $item is an Object, $index can be a method or a value,
// if $item is an array, $index is used as the index
$key = is_object($item) ? ($item->hasMethod($index) ? $item->$index() : $item->$index) : $item[$index];
if (array_key_exists($key, $result)) {
$result[$key]->push($item);
} else {
$result[$key] = new ArrayList(array($item));
}
}
return $result;
}
/**
* Similar to {@link groupBy()}, but returns
* the data in a format which is suitable for usage in templates.
*
* @param string $index
* @param string $children Name of the control under which children can be iterated on
* @return ArrayList
*/
public function GroupedBy($index, $children = 'Children') {
$grouped = $this->groupBy($index);
$result = new ArrayList();
foreach ($grouped as $indVal => $list) {
$list = GroupedList::create($list);
$result->push(new ArrayData(array(
$index => $indVal,
$children => $list
)));
}
return $result;
}
}