PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 1.3.1
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v1.3.1
5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / DataTable / Renderer / Json.php
matomo / app / core / DataTable / Renderer Last commit date
Console.php 6 years ago Csv.php 6 years ago Html.php 6 years ago Json.php 6 years ago Php.php 6 years ago Rss.php 6 years ago Tsv.php 6 years ago Xml.php 6 years ago
Json.php
138 lines
1 <?php
2 /**
3 * Piwik - free/libre analytics platform
4 *
5 * @link https://matomo.org
6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7 *
8 */
9 namespace Piwik\DataTable\Renderer;
10
11 use Piwik\Common;
12 use Piwik\DataTable\Renderer;
13 use Piwik\DataTable;
14
15 /**
16 * JSON export.
17 * Works with recursive DataTable (when a row can be associated with a subDataTable).
18 *
19 */
20 class Json extends Renderer
21 {
22 /**
23 * Computes the dataTable output and returns the string/binary
24 *
25 * @return string
26 */
27 public function render()
28 {
29 return $this->renderTable($this->table);
30 }
31
32 /**
33 * Computes the output for the given data table
34 *
35 * @param DataTable $table
36 * @return string
37 */
38 protected function renderTable($table)
39 {
40 if (is_array($table)) {
41 $array = $table;
42 if (self::shouldWrapArrayBeforeRendering($array, $wrapSingleValues = true)) {
43 $array = array($array);
44 }
45
46 foreach ($array as $key => $tab) {
47 if ($tab instanceof DataTable\Map
48 || $tab instanceof DataTable
49 || $tab instanceof DataTable\Simple) {
50 $array[$key] = $this->convertDataTableToArray($tab);
51
52 if (!is_array($array[$key])) {
53 $array[$key] = array('value' => $array[$key]);
54 }
55 }
56 }
57 } else {
58 $array = $this->convertDataTableToArray($table);
59 }
60
61 if (!is_array($array)) {
62 $array = array('value' => $array);
63 }
64
65 // convert datatable column/metadata values
66 $this->convertDataTableColumnMetadataValues($array);
67
68 // decode all entities
69 $callback = function (&$value, $key) {
70 if (is_string($value)) {
71 $value = html_entity_decode($value, ENT_QUOTES, "UTF-8");
72 };
73 };
74 array_walk_recursive($array, $callback);
75
76 // silence "Warning: json_encode(): Invalid UTF-8 sequence in argument"
77 $str = @json_encode($array);
78
79 if ($str === false
80 && json_last_error() === JSON_ERROR_UTF8
81 && $this->canMakeArrayUtf8()) {
82 $array = $this->makeArrayUtf8($array);
83 $str = json_encode($array);
84 }
85
86 return $str;
87 }
88
89 private function canMakeArrayUtf8()
90 {
91 return function_exists('mb_convert_encoding');
92 }
93
94 private function makeArrayUtf8($array)
95 {
96 if (is_array($array)) {
97 foreach ($array as $key => $value) {
98 $array[$key] = self::makeArrayUtf8($value);
99 }
100 } elseif (is_string($array)) {
101 return mb_convert_encoding($array, 'UTF-8', 'auto');
102 }
103
104 return $array;
105 }
106
107 public static function sendHeaderJSON()
108 {
109 Common::sendHeader('Content-Type: application/json; charset=utf-8');
110 }
111
112 private function convertDataTableToArray($table)
113 {
114 $renderer = new Php();
115 $renderer->setTable($table);
116 $renderer->setRenderSubTables($this->isRenderSubtables());
117 $renderer->setSerialize(false);
118 $renderer->setHideIdSubDatableFromResponse($this->hideIdSubDatatable);
119 $array = $renderer->flatRender();
120
121 return $array;
122 }
123
124 private function convertDataTableColumnMetadataValues(&$table)
125 {
126 if (empty($table)) {
127 return;
128 }
129
130 array_walk_recursive($table, function (&$value, $key) {
131 if ($value instanceof DataTable) {
132 $value = $this->convertDataTableToArray($value);
133 $this->convertDataTableColumnMetadataValues($value);
134 }
135 });
136 }
137 }
138