PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.8.2
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.8.2
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 3 months ago Csv.php 3 months ago Html.php 3 months ago Json.php 3 months ago Rss.php 3 months ago Tsv.php 3 months ago Xml.php 3 months ago
Json.php
105 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 */
9 namespace Piwik\DataTable\Renderer;
10
11 use Piwik\Common;
12 use Piwik\DataTable\Renderer;
13 use Piwik\DataTable;
14 /**
15 * JSON export.
16 * Works with recursive DataTable (when a row can be associated with a subDataTable).
17 *
18 */
19 class Json extends Renderer
20 {
21 /**
22 * Computes the dataTable output and returns the string/binary
23 *
24 */
25 public function render() : string
26 {
27 return $this->renderTable($this->table);
28 }
29 /**
30 * Computes the output for the given data table
31 *
32 * @param DataTable $table
33 * @return string
34 */
35 protected function renderTable($table)
36 {
37 if (is_array($table)) {
38 $array = $table;
39 if (self::shouldWrapArrayBeforeRendering($array, $wrapSingleValues = \true)) {
40 $array = array($array);
41 }
42 foreach ($array as $key => $tab) {
43 if ($tab instanceof DataTable\Map || $tab instanceof DataTable || $tab instanceof DataTable\Simple) {
44 $array[$key] = $this->convertDataTableToArray($tab);
45 if (!is_array($array[$key])) {
46 $array[$key] = array('value' => $array[$key]);
47 }
48 }
49 }
50 } else {
51 $array = $this->convertDataTableToArray($table);
52 }
53 if (!is_array($array)) {
54 $array = array('value' => $array);
55 }
56 // convert datatable column/metadata values
57 $this->convertDataTableColumnMetadataValues($array);
58 // decode all entities
59 $callback = function (&$value, $key) {
60 if (is_string($value)) {
61 $value = html_entity_decode($value, \ENT_QUOTES, "UTF-8");
62 }
63 };
64 array_walk_recursive($array, $callback);
65 // silence "Warning: json_encode(): Invalid UTF-8 sequence in argument"
66 $str = @json_encode($array);
67 if ($str === \false && json_last_error() === \JSON_ERROR_UTF8 && $this->canMakeArrayUtf8()) {
68 $array = $this->makeArrayUtf8($array);
69 $str = json_encode($array);
70 }
71 return $str;
72 }
73 private function canMakeArrayUtf8()
74 {
75 return function_exists('mb_convert_encoding');
76 }
77 private function makeArrayUtf8($array)
78 {
79 if (is_array($array)) {
80 foreach ($array as $key => $value) {
81 $array[$key] = self::makeArrayUtf8($value);
82 }
83 } elseif (is_string($array)) {
84 return mb_convert_encoding($array, 'UTF-8', 'auto');
85 }
86 return $array;
87 }
88 public static function sendHeaderJSON()
89 {
90 Common::sendHeader('Content-Type: application/json; charset=utf-8');
91 }
92 private function convertDataTableColumnMetadataValues(&$table)
93 {
94 if (empty($table)) {
95 return;
96 }
97 array_walk_recursive($table, function (&$value, $key) {
98 if ($value instanceof DataTable) {
99 $value = $this->convertDataTableToArray($value);
100 $this->convertDataTableColumnMetadataValues($value);
101 }
102 });
103 }
104 }
105