PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.2.0
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.2.0
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 1 year ago Csv.php 1 year ago Html.php 1 year ago Json.php 1 year ago Rss.php 1 year ago Tsv.php 2 years ago Xml.php 1 year ago
Json.php
106 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 * @return string
25 */
26 public function render()
27 {
28 return $this->renderTable($this->table);
29 }
30 /**
31 * Computes the output for the given data table
32 *
33 * @param DataTable $table
34 * @return string
35 */
36 protected function renderTable($table)
37 {
38 if (is_array($table)) {
39 $array = $table;
40 if (self::shouldWrapArrayBeforeRendering($array, $wrapSingleValues = \true)) {
41 $array = array($array);
42 }
43 foreach ($array as $key => $tab) {
44 if ($tab instanceof DataTable\Map || $tab instanceof DataTable || $tab instanceof DataTable\Simple) {
45 $array[$key] = $this->convertDataTableToArray($tab);
46 if (!is_array($array[$key])) {
47 $array[$key] = array('value' => $array[$key]);
48 }
49 }
50 }
51 } else {
52 $array = $this->convertDataTableToArray($table);
53 }
54 if (!is_array($array)) {
55 $array = array('value' => $array);
56 }
57 // convert datatable column/metadata values
58 $this->convertDataTableColumnMetadataValues($array);
59 // decode all entities
60 $callback = function (&$value, $key) {
61 if (is_string($value)) {
62 $value = html_entity_decode($value, \ENT_QUOTES, "UTF-8");
63 }
64 };
65 array_walk_recursive($array, $callback);
66 // silence "Warning: json_encode(): Invalid UTF-8 sequence in argument"
67 $str = @json_encode($array);
68 if ($str === \false && json_last_error() === \JSON_ERROR_UTF8 && $this->canMakeArrayUtf8()) {
69 $array = $this->makeArrayUtf8($array);
70 $str = json_encode($array);
71 }
72 return $str;
73 }
74 private function canMakeArrayUtf8()
75 {
76 return function_exists('mb_convert_encoding');
77 }
78 private function makeArrayUtf8($array)
79 {
80 if (is_array($array)) {
81 foreach ($array as $key => $value) {
82 $array[$key] = self::makeArrayUtf8($value);
83 }
84 } elseif (is_string($array)) {
85 return mb_convert_encoding($array, 'UTF-8', 'auto');
86 }
87 return $array;
88 }
89 public static function sendHeaderJSON()
90 {
91 Common::sendHeader('Content-Type: application/json; charset=utf-8');
92 }
93 private function convertDataTableColumnMetadataValues(&$table)
94 {
95 if (empty($table)) {
96 return;
97 }
98 array_walk_recursive($table, function (&$value, $key) {
99 if ($value instanceof DataTable) {
100 $value = $this->convertDataTableToArray($value);
101 $this->convertDataTableColumnMetadataValues($value);
102 }
103 });
104 }
105 }
106