2011-12-26 09:48:53 +01:00
|
|
|
<?php
|
2016-06-15 06:03:16 +02:00
|
|
|
|
|
|
|
namespace SilverStripe\ORM;
|
|
|
|
|
2016-08-19 00:51:35 +02:00
|
|
|
use SilverStripe\View\ArrayData;
|
2016-06-15 06:03:16 +02:00
|
|
|
|
2011-12-26 09:48:53 +01:00
|
|
|
/**
|
|
|
|
* A list decorator that allows a list to be grouped into sub-lists by common
|
|
|
|
* values of a field.
|
|
|
|
*/
|
|
|
|
class GroupedList extends SS_ListDecorator {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param string $index
|
2012-06-23 00:32:43 +02:00
|
|
|
* @return array
|
2011-12-26 09:48:53 +01:00
|
|
|
*/
|
|
|
|
public function groupBy($index) {
|
|
|
|
$result = array();
|
|
|
|
|
|
|
|
foreach ($this->list as $item) {
|
2014-03-30 08:37:54 +02:00
|
|
|
// if $item is an Object, $index can be a method or a value,
|
|
|
|
// if $item is an array, $index is used as the index
|
2013-12-21 03:15:55 +01:00
|
|
|
$key = is_object($item) ? ($item->hasMethod($index) ? $item->$index() : $item->$index) : $item[$index];
|
2011-12-26 09:48:53 +01:00
|
|
|
|
|
|
|
if (array_key_exists($key, $result)) {
|
|
|
|
$result[$key]->push($item);
|
|
|
|
} else {
|
|
|
|
$result[$key] = new ArrayList(array($item));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2012-06-23 00:32:43 +02:00
|
|
|
* Similar to {@link groupBy()}, but returns
|
|
|
|
* the data in a format which is suitable for usage in templates.
|
2014-08-15 08:53:05 +02:00
|
|
|
*
|
2011-12-26 09:48:53 +01:00
|
|
|
* @param string $index
|
2012-06-23 00:32:43 +02:00
|
|
|
* @param string $children Name of the control under which children can be iterated on
|
2011-12-26 09:48:53 +01:00
|
|
|
* @return ArrayList
|
|
|
|
*/
|
|
|
|
public function GroupedBy($index, $children = 'Children') {
|
|
|
|
$grouped = $this->groupBy($index);
|
|
|
|
$result = new ArrayList();
|
|
|
|
|
|
|
|
foreach ($grouped as $indVal => $list) {
|
2013-06-16 14:02:03 +02:00
|
|
|
$list = GroupedList::create($list);
|
2011-12-26 09:48:53 +01:00
|
|
|
$result->push(new ArrayData(array(
|
|
|
|
$index => $indVal,
|
|
|
|
$children => $list
|
|
|
|
)));
|
|
|
|
}
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|