Blame view

framework/model/GroupedList.php 1.32 KB
0084d336   Administrator   Importers CRUD
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;
  	}
  
  }