Chris@0
|
1 <?php
|
Chris@0
|
2 namespace Consolidation\OutputFormatters\Transformations;
|
Chris@0
|
3
|
Chris@0
|
4 use Consolidation\OutputFormatters\StructuredData\TableDataInterface;
|
Chris@0
|
5 use Consolidation\OutputFormatters\StructuredData\OriginalDataInterface;
|
Chris@13
|
6 use Consolidation\OutputFormatters\StructuredData\MetadataHolderInterface;
|
Chris@17
|
7 use Consolidation\OutputFormatters\Options\FormatterOptions;
|
Chris@17
|
8 use Consolidation\OutputFormatters\Formatters\TsvFormatter;
|
Chris@17
|
9 use Symfony\Component\Console\Output\BufferedOutput;
|
Chris@0
|
10
|
Chris@17
|
11 class TableTransformation extends \ArrayObject implements TableDataInterface, StringTransformationInterface, OriginalDataInterface
|
Chris@0
|
12 {
|
Chris@0
|
13 protected $headers;
|
Chris@0
|
14 protected $rowLabels;
|
Chris@0
|
15 protected $layout;
|
Chris@13
|
16 /** @var MetadataHolderInterface */
|
Chris@13
|
17 protected $originalData;
|
Chris@0
|
18
|
Chris@0
|
19 const TABLE_LAYOUT = 'table';
|
Chris@0
|
20 const LIST_LAYOUT = 'list';
|
Chris@0
|
21
|
Chris@0
|
22 public function __construct($data, $fieldLabels, $rowLabels = [])
|
Chris@0
|
23 {
|
Chris@0
|
24 $this->headers = $fieldLabels;
|
Chris@0
|
25 $this->rowLabels = $rowLabels;
|
Chris@0
|
26 $rows = static::transformRows($data, $fieldLabels);
|
Chris@0
|
27 $this->layout = self::TABLE_LAYOUT;
|
Chris@0
|
28 parent::__construct($rows);
|
Chris@0
|
29 }
|
Chris@0
|
30
|
Chris@0
|
31 public function setLayout($layout)
|
Chris@0
|
32 {
|
Chris@0
|
33 $this->layout = $layout;
|
Chris@0
|
34 }
|
Chris@0
|
35
|
Chris@0
|
36 public function getLayout()
|
Chris@0
|
37 {
|
Chris@0
|
38 return $this->layout;
|
Chris@0
|
39 }
|
Chris@0
|
40
|
Chris@0
|
41 public function isList()
|
Chris@0
|
42 {
|
Chris@0
|
43 return $this->layout == self::LIST_LAYOUT;
|
Chris@0
|
44 }
|
Chris@0
|
45
|
Chris@17
|
46 /**
|
Chris@17
|
47 * @inheritdoc
|
Chris@17
|
48 */
|
Chris@17
|
49 public function simplifyToString(FormatterOptions $options)
|
Chris@17
|
50 {
|
Chris@17
|
51 $alternateFormatter = new TsvFormatter();
|
Chris@17
|
52 $output = new BufferedOutput();
|
Chris@17
|
53
|
Chris@17
|
54 try {
|
Chris@17
|
55 $data = $alternateFormatter->validate($this->getArrayCopy());
|
Chris@17
|
56 $alternateFormatter->write($output, $this->getArrayCopy(), $options);
|
Chris@17
|
57 } catch (\Exception $e) {
|
Chris@17
|
58 }
|
Chris@17
|
59 return $output->fetch();
|
Chris@17
|
60 }
|
Chris@17
|
61
|
Chris@0
|
62 protected static function transformRows($data, $fieldLabels)
|
Chris@0
|
63 {
|
Chris@0
|
64 $rows = [];
|
Chris@0
|
65 foreach ($data as $rowid => $row) {
|
Chris@0
|
66 $rows[$rowid] = static::transformRow($row, $fieldLabels);
|
Chris@0
|
67 }
|
Chris@0
|
68 return $rows;
|
Chris@0
|
69 }
|
Chris@0
|
70
|
Chris@0
|
71 protected static function transformRow($row, $fieldLabels)
|
Chris@0
|
72 {
|
Chris@0
|
73 $result = [];
|
Chris@0
|
74 foreach ($fieldLabels as $key => $label) {
|
Chris@0
|
75 $result[$key] = array_key_exists($key, $row) ? $row[$key] : '';
|
Chris@0
|
76 }
|
Chris@0
|
77 return $result;
|
Chris@0
|
78 }
|
Chris@0
|
79
|
Chris@0
|
80 public function getHeaders()
|
Chris@0
|
81 {
|
Chris@0
|
82 return $this->headers;
|
Chris@0
|
83 }
|
Chris@0
|
84
|
Chris@0
|
85 public function getHeader($key)
|
Chris@0
|
86 {
|
Chris@0
|
87 if (array_key_exists($key, $this->headers)) {
|
Chris@0
|
88 return $this->headers[$key];
|
Chris@0
|
89 }
|
Chris@0
|
90 return $key;
|
Chris@0
|
91 }
|
Chris@0
|
92
|
Chris@0
|
93 public function getRowLabels()
|
Chris@0
|
94 {
|
Chris@0
|
95 return $this->rowLabels;
|
Chris@0
|
96 }
|
Chris@0
|
97
|
Chris@0
|
98 public function getRowLabel($rowid)
|
Chris@0
|
99 {
|
Chris@0
|
100 if (array_key_exists($rowid, $this->rowLabels)) {
|
Chris@0
|
101 return $this->rowLabels[$rowid];
|
Chris@0
|
102 }
|
Chris@0
|
103 return $rowid;
|
Chris@0
|
104 }
|
Chris@0
|
105
|
Chris@0
|
106 public function getOriginalData()
|
Chris@0
|
107 {
|
Chris@13
|
108 if (isset($this->originalData)) {
|
Chris@13
|
109 return $this->originalData->reconstruct($this->getArrayCopy(), $this->originalData->getMetadata());
|
Chris@13
|
110 }
|
Chris@0
|
111 return $this->getArrayCopy();
|
Chris@0
|
112 }
|
Chris@0
|
113
|
Chris@13
|
114 public function setOriginalData(MetadataHolderInterface $data)
|
Chris@13
|
115 {
|
Chris@13
|
116 $this->originalData = $data;
|
Chris@13
|
117 }
|
Chris@13
|
118
|
Chris@0
|
119 public function getTableData($includeRowKey = false)
|
Chris@0
|
120 {
|
Chris@0
|
121 $data = $this->getArrayCopy();
|
Chris@0
|
122 if ($this->isList()) {
|
Chris@0
|
123 $data = $this->convertTableToList();
|
Chris@0
|
124 }
|
Chris@0
|
125 if ($includeRowKey) {
|
Chris@0
|
126 $data = $this->getRowDataWithKey($data);
|
Chris@0
|
127 }
|
Chris@0
|
128 return $data;
|
Chris@0
|
129 }
|
Chris@0
|
130
|
Chris@0
|
131 protected function convertTableToList()
|
Chris@0
|
132 {
|
Chris@0
|
133 $result = [];
|
Chris@0
|
134 foreach ($this as $row) {
|
Chris@0
|
135 foreach ($row as $key => $value) {
|
Chris@0
|
136 $result[$key][] = $value;
|
Chris@0
|
137 }
|
Chris@0
|
138 }
|
Chris@0
|
139 return $result;
|
Chris@0
|
140 }
|
Chris@0
|
141
|
Chris@0
|
142 protected function getRowDataWithKey($data)
|
Chris@0
|
143 {
|
Chris@0
|
144 $result = [];
|
Chris@0
|
145 $i = 0;
|
Chris@0
|
146 foreach ($data as $key => $row) {
|
Chris@0
|
147 array_unshift($row, $this->getHeader($key));
|
Chris@0
|
148 $i++;
|
Chris@0
|
149 $result[$key] = $row;
|
Chris@0
|
150 }
|
Chris@0
|
151 return $result;
|
Chris@0
|
152 }
|
Chris@0
|
153 }
|