Completed
Pull Request — master (#320)
by
unknown
03:42
created

ColumnsSummary::canColumnAdd()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 8
rs 9.4285
cc 2
eloc 4
nc 2
nop 2
1
<?php
2
3
/**
4
 * @copyright   Copyright (c) 2015 ublaboo <[email protected]>
5
 * @author      Pavel Janda <[email protected]>
6
 * @package     Ublaboo
7
 */
8
9
namespace Ublaboo\DataGrid;
10
11
use Nette\Utils\Callback;
12
use Ublaboo\DataGrid\Column\ColumnNumber;
13
14
class ColumnsSummary
15
{
16
17
	/**
18
	 * @var DataGrid
19
	 */
20
	protected $datagrid;
21
22
	/**
23
	 * @var array
24
	 */
25
	protected $summary;
26
27
	/**
28
	 * @var array
29
	 */
30
	protected $format = [];
31
32
	/**
33
	 * @var callable
34
	 */
35
	protected $rowCallback = NULL;
36
37
	/**
38
	 * @param DataGrid $datagrid
39
	 * @param array    $columns
40
	 */
41
	public function __construct(DataGrid $datagrid, array $columns, $rowCallback = NULL)
42
	{
43
		$this->summary = array_fill_keys(array_values($columns), 0);
44
		$this->datagrid = $datagrid;
45
		$this->rowCallback = $rowCallback;
46
47
		foreach ($this->summary as $key => $sum) {
48
			$column = $this->datagrid->getColumn($key);
49
50
			if ($column instanceof ColumnNumber) {
51
				$arg = $column->getFormat();
52
				array_unshift($arg, $key);
53
54
				call_user_func_array([$this, 'setFormat'], $arg);
55
			}
56
		}
57
	}
58
59
	/**
60
	 * Check if can add row sum into sums.. check for every summary column
61
	 * @param Row    $row
62
	 * @param string $column
63
	 * @return bool
64
	 */
65
	private function canColumnAdd(Row $row, $column)
66
	{
67
		if (empty($this->rowCallback)) {
68
			return TRUE;
69
		}
70
71
		return Callback::invoke($this->rowCallback, $row->getItem(), $column);
72
	}
73
74
	/**
75
	 * @param Row $row
76
	 */
77
	public function add(Row $row)
78
	{
79
		foreach ($this->summary as $key => $sum) {
80
			$column = $this->datagrid->getColumn($key);
81
82
			if ($this->canColumnAdd($row, $column->getColumn())) {
83
				$value = $row->getValue($column->getColumn());
84
				$this->summary[$key] += $value;
85
			}
86
		}
87
	}
88
89
90
	/**
91
	 * @param  string $key
92
	 * @return mixed
93
	 */
94
	public function render($key)
95
	{
96
		if (!isset($this->summary[$key])) {
97
			return NULL;
98
		}
99
100
		return number_format(
101
			$this->summary[$key],
102
			$this->format[$key][0],
103
			$this->format[$key][1],
104
			$this->format[$key][2]
105
		);
106
	}
107
108
109
	/**
110
	 * Set number format
111
	 * @param string $key
112
	 * @param int    $decimals
113
	 * @param string $dec_point
114
	 * @param string $thousands_sep
115
	 */
116
	public function setFormat($key, $decimals = 0, $dec_point = '.', $thousands_sep = ' ')
117
	{
118
		$this->format[$key] = [$decimals, $dec_point, $thousands_sep];
119
120
		return $this;
121
	}
122
123
124
	/**
125
	 * @param  array  $columns
126
	 * @return bool
127
	 */
128
	public function someColumnsExist(array $columns)
129
	{
130
		foreach ($columns as $key => $column) {
131
			if (isset($this->summary[$key])) {
132
				return TRUE;
133
			}
134
		}
135
136
		return FALSE;
137
	}
138
139
}
140