PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 1.1.2
Visualizer – Tables & Charts Manager with Built-in AI Generator v1.1.2
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 3.10.4 All 148 releases
← All changes | classes/Visualizer/Source.php +44 -316 3.10.31.1.2 View file →
@@ -1,5 +1,6 @@
1 1 <?php
2 +
2 3 // +----------------------------------------------------------------------+
3 4 // | Copyright 2013 Madpixels (email : visualizer@madpixels.net) |
4 5 // +----------------------------------------------------------------------+
5 6 // | This program is free software; you can redistribute it and/or modify |
@@ -17,8 +18,9 @@
17 18 // | MA 02110-1301 USA |
18 19 // +----------------------------------------------------------------------+
19 20 // | Author: Eugene Manuilov <eugene@manuilov.org> |
20 21 // +----------------------------------------------------------------------+
22 +
21 23 /**
22 24 * The abstract class for source managers.
23 25 *
24 26 * @category Visualizer
@@ -29,17 +31,8 @@
29 31 */
30 32 abstract class Visualizer_Source {
31 33
32 34 /**
33 - * The array of allowed types.
34 - *
35 - * @since 1.0.0
36 - *
37 - * @access protected
38 - * @var array
39 - */
40 - protected static $allowed_types = array( 'string', 'number', 'boolean', 'date', 'datetime', 'timeofday' );
41 - /**
42 35 * The array of data.
43 36 *
44 37 * @since 1.0.0
45 38 *
@@ -46,8 +39,9 @@
46 39 * @access protected
47 40 * @var array
48 41 */
49 42 protected $_data = array();
43 +
50 44 /**
51 45 * The array of series.
52 46 *
53 47 * @since 1.0.0
@@ -57,51 +51,8 @@
57 51 */
58 52 protected $_series = array();
59 53
60 54 /**
61 - * The error message.
62 - *
63 - * @access protected
64 - * @var string
65 - */
66 - protected $_error;
67 -
68 - /**
69 - * Return allowed types
70 - *
71 - * @since 1.0.1
72 - *
73 - * @static
74 - * @access public
75 - * @return array the allowed types
76 - */
77 - public static function getAllowedTypes() {
78 - return self::$allowed_types;
79 - }
80 -
81 - /**
82 - * Validates series tyeps.
83 - *
84 - * @since 1.0.1
85 - *
86 - * @static
87 - * @access protected
88 - *
89 - * @param array $types The icoming series types.
90 - *
91 - * @return boolean TRUE if sereis types are valid, otherwise FALSE.
92 - */
93 - protected static function _validateTypes( $types ) {
94 - foreach ( $types as $type ) {
95 - if ( ! in_array( $type, self::$allowed_types, true ) ) {
96 - return false;
97 - }
98 - }
99 -
100 - return true;
101 - }
102 -
103 - /**
104 55 * Returns source name.
105 56 *
106 57 * @since 1.0.0
107 58 *
@@ -140,12 +91,9 @@
140 91 *
141 92 * @access public
142 93 * @return string The serialized array of data.
143 94 */
144 - public function getData( $fetch_from_editable_table = false ) {
145 - if ( $fetch_from_editable_table ) {
146 - $this->_fetchDataFromEditableTable();
147 - }
95 + public function getData() {
148 96 return serialize( $this->_data );
149 97 }
150 98
151 99 /**
@@ -155,56 +103,19 @@
155 103 *
156 104 * @access public
157 105 * @return array
158 106 */
159 - public function getRawData( $fetch_from_editable_table = false ) {
160 - if ( $fetch_from_editable_table ) {
161 - $this->_fetchDataFromEditableTable();
162 - }
107 + public function getRawData() {
163 108 return $this->_data;
164 109 }
165 110
166 111 /**
167 - * Re populates series if the source is dynamic.
168 - *
169 - * @since 1.1.0
170 - *
171 - * @access public
172 - *
173 - * @param array $series The actual array of series.
174 - * @param int $chart_id The chart id.
175 - *
176 - * @return array The re populated array of series or old one.
177 - */
178 - public function repopulateSeries( $series, $chart_id ) {
179 - return $series;
180 - }
181 -
182 - /**
183 - * Re populates data if the source is dynamic.
184 - *
185 - * @since 1.1.0
186 - *
187 - * @access public
188 - *
189 - * @param array $data The actual array of data.
190 - * @param int $chart_id The chart id.
191 - *
192 - * @return array The re populated array of data or old one.
193 - */
194 - public function repopulateData( $data, $chart_id ) {
195 - return $data;
196 - }
197 -
198 - /**
199 112 * Normalizes values according to series' type.
200 113 *
201 114 * @since 1.0.0
202 115 *
203 116 * @access protected
204 - *
205 117 * @param array $data The row of data.
206 - *
207 118 * @return array Normalized row of data.
208 119 */
209 120 protected function _normalizeData( $data ) {
210 121 // normalize values
@@ -209,27 +120,29 @@
209 120 protected function _normalizeData( $data ) {
210 121 // normalize values
211 122 foreach ( $this->_series as $i => $series ) {
212 123 // if no value exists for the seires, then add null
213 - if ( ! isset( $data[ $i ] ) ) {
214 - $data[ $i ] = null;
124 + if ( !isset( $data[$i] ) ) {
125 + $data[$i] = null;
215 126 }
216 - if ( is_null( $data[ $i ] ) ) {
127 +
128 + if ( is_null( $data[$i] ) ) {
217 129 continue;
218 130 }
131 +
219 132 switch ( $series['type'] ) {
220 133 case 'number':
221 - $data[ $i ] = preg_replace( '/[\x{200B}-\x{200D}\x{FEFF}]/u', '', $data[ $i ] );
222 - $data[ $i ] = ( is_numeric( $data[ $i ] ) ) ? floatval( $data[ $i ] ) : ( is_numeric( str_replace( ',', '', $data[ $i ] ) ) ? floatval( str_replace( ',', '', $data[ $i ] ) ) : null );
134 + $data[$i] = is_float( $data[$i] )
135 + ? floatval( $data[$i] )
136 + : intval( $data[$i] );
223 137 break;
224 138 case 'boolean':
225 - $datum = trim( strval( $data[ $i ] ) );
226 - $data[ $i ] = in_array( $datum, array( 'true', 'yes', '1' ), true ) ? 'true' : 'false';
139 + $data[$i] = filter_validate( $data[$i], FILTER_VALIDATE_BOOLEAN );
227 140 break;
228 141 case 'timeofday':
229 - $date = new DateTime( '1984-03-16T' . $data[ $i ] );
142 + $date = new DateTime( '1984-03-16T' . $data[$i] );
230 143 if ( $date ) {
231 - $data[ $i ] = array(
144 + $data[$i] = array(
232 145 intval( $date->format( 'H' ) ),
233 146 intval( $date->format( 'i' ) ),
234 147 intval( $date->format( 's' ) ),
235 148 0,
@@ -235,245 +148,60 @@
235 148 0,
236 149 );
237 150 }
238 151 break;
239 - case 'datetime':
240 - // let's check if the date is a Unix epoch
241 - $value = DateTime::createFromFormat( 'U', $data[ $i ] );
242 - if ( $value !== false && ! is_wp_error( $value ) ) {
243 - $data[ $i ] = $value->format( 'Y-m-d H:i:s' );
244 - }
245 - break;
246 - case 'string':
247 - // if a ' is provided, strip the backslash
248 - $data[ $i ] = stripslashes( $this->toUTF8( $data[ $i ] ) );
249 - break;
250 152 }
251 153 }
252 154
253 - return apply_filters( 'visualizer_format_data', $data, $this->_series );
155 + return $data;
254 156 }
255 157
256 -
257 158 /**
258 - * Converts values to UTF8, if required.
159 + * Validates series tyeps.
259 160 *
161 + * @since 1.0.1
162 + *
163 + * @static
260 164 * @access protected
261 - *
262 - * @param string $datum The data to convert.
263 - *
264 - * @return string The converted data.
165 + * @param array $types The icoming series types.
166 + * @return boolean TRUE if sereis types are valid, otherwise FALSE.
265 167 */
266 - protected final function toUTF8( $datum ) {
267 - if ( ! function_exists( 'mb_detect_encoding' ) || mb_detect_encoding( $datum ) !== 'ASCII' ) {
268 - $datum = \ForceUTF8\Encoding::toUTF8( $datum );
269 - }
270 - return $datum;
271 - }
272 -
273 - /**
274 - * Determines the formats of date/time columns.
275 - *
276 - * @access public
277 - *
278 - * @param array $series The actual array of series.
279 - * @param array $data The actual array of data.
280 - *
281 - * @return array
282 - */
283 - public static final function get_date_formats_if_exists( $series, $data ) {
284 - $date_formats = array();
285 - $types = array();
286 - $index = 0;
287 - foreach ( $series as $column ) {
288 - if ( in_array( $column['type'], array( 'date', 'datetime', 'timeofday' ), true ) ) {
289 - $types[] = array( 'index' => $index, 'type' => $column['type'] );
168 + protected static function _validateTypes( $types ) {
169 + $allowed_types = array( 'string', 'number', 'boolean', 'date', 'datetime', 'timeofday' );
170 + foreach ( $types as $type ) {
171 + if ( !in_array( $type, $allowed_types ) ) {
172 + return false;
290 173 }
291 - $index++;
292 174 }
293 175
294 - if ( ! $types ) {
295 - return $date_formats;
296 - }
297 -
298 - $random = $data;
299 - // let's randomly pick 5 data points instead of cycling through the entire data set.
300 - if ( count( $data ) > 5 ) {
301 - $random = array();
302 - for ( $x = 0; $x < 5; $x++ ) {
303 - $random[] = $data[ rand( 0, count( $data ) - 1 ) ];
304 - }
305 - }
306 -
307 - foreach ( $types as $type ) {
308 - $formats = array();
309 - foreach ( $random as $datum ) {
310 - $f = self::determine_date_format( $datum[ $type['index'] ], $type['type'] );
311 - if ( $f ) {
312 - $formats[] = $f;
313 - }
314 - }
315 - // if there are multiple formats, use the most frequent format.
316 - $formats = array_filter( $formats );
317 - if ( $formats ) {
318 - $formats = array_count_values( $formats );
319 - arsort( $formats );
320 - $formats = array_keys( $formats );
321 - $final_format = reset( $formats );
322 - // we have determined the PHP format; now we have to change this into the JS format where m = MM, d = DD etc.
323 - $date_formats[] = array( 'index' => $type['index'], 'format' => str_replace( array( 'Y', 'm', 'd', 'H', 'i', 's' ), array( 'YYYY', 'MM', 'DD', 'HH', 'mm', 'ss' ), $final_format ) );
324 - }
325 - }
326 - return $date_formats;
176 + return true;
327 177 }
328 178
329 179 /**
330 - * Determines the date/time format of the given string.
180 + * Re populates series if the source is dynamic.
331 181 *
332 - * @access private
182 + * @since 1.1.0
333 183 *
334 - * @param string $value The string.
335 - * @param string $type 'date', 'timeofday' or 'datetime'.
336 - *
337 - * @return string|null
338 - */
339 - private static function determine_date_format( $value, $type ) {
340 - if ( version_compare( phpversion(), '5.3.0', '<' ) ) {
341 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'PHP version %s not supported', phpversion() ), 'error', __FILE__, __LINE__ );
342 - return null;
343 - }
344 -
345 - $formats = array(
346 - 'Y/m/d',
347 - 'Y-m-d',
348 - 'm/d/Y',
349 - 'm-d-Y',
350 - 'd-m-Y',
351 - 'd/m/Y',
352 - );
353 -
354 - switch ( $type ) {
355 - case 'datetime':
356 - $formats = array_merge(
357 - $formats, array(
358 - 'U',
359 - 'Y/m/d H:i:s',
360 - 'Y-m-d H:i:s',
361 - 'm/d/Y H:i:s',
362 - 'm-d-Y H:i:s',
363 - )
364 - );
365 - break;
366 - case 'timeofday':
367 - $formats = array_merge(
368 - $formats, array(
369 - 'H:i:s',
370 - 'H:i',
371 - )
372 - );
373 - break;
374 - }
375 -
376 - $formats = apply_filters( 'visualizer_date_formats', $formats, $type );
377 -
378 - foreach ( $formats as $format ) {
379 - $return = DateTime::createFromFormat( $format, $value );
380 - if ( $return !== false && ! is_wp_error( $return ) ) {
381 - return $format;
382 - }
383 - }
384 - // invalid format
385 - return null;
386 - }
387 -
388 - /**
389 - * Returns the error, if any.
390 - *
391 184 * @access public
392 - * @return string
185 + * @param array $series The actual array of series.
186 + * @param int $chart_id The chart id.
187 + * @return array The re populated array of series or old one.
393 188 */
394 - public function get_error() {
395 - return $this->_error;
189 + public function repopulateSeries( $series, $chart_id ) {
190 + return $series;
396 191 }
397 192
398 193 /**
399 - * Fetches information from the editable table and parses it to build series and data arrays.
194 + * Re populates data if the source is dynamic.
400 195 *
401 - * @since ?
196 + * @since 1.1.0
402 197 *
403 198 * @access public
404 - * @return boolean TRUE on success, otherwise FALSE.
199 + * @param array $data The actual array of data.
200 + * @param int $chart_id The chart id.
201 + * @return array The re populated array of data or old one.
405 202 */
406 - public function fetchFromEditableTable() {
407 - if ( empty( $this->_args ) ) {
408 - return false;
409 - }
410 -
411 - $this->_fetchSeriesFromEditableTable();
412 - $this->_fetchDataFromEditableTable();
413 - return true;
203 + public function repopulateData( $data, $chart_id ) {
204 + return $data;
414 205 }
415 206
416 - /**
417 - * Fetches series information from the editable table. This is fetched only through the UI and not while refreshing the chart data.
418 - *
419 - * @since 1.0.0
420 - *
421 - * @access private
422 - */
423 - private function _fetchSeriesFromEditableTable() {
424 - $params = $this->_args;
425 - $headers = array_filter( $params['header'] );
426 - $types = array_filter( $params['type'] );
427 - $header_row = $type_row = array();
428 - if ( $headers ) {
429 - foreach ( $headers as $header ) {
430 - if ( ! empty( $types[ $header ] ) ) {
431 - $this->_series[] = array(
432 - 'label' => $header,
433 - 'type' => $types[ $header ],
434 - );
435 - }
436 - }
437 - }
438 -
439 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Series found for %s = %s', print_r( $this->_args, true ), print_r( $this->_series, true ) ), 'debug', __FILE__, __LINE__ );
440 -
441 - return true;
442 - }
443 -
444 -
445 - /**
446 - * Fetches data information from the editable table.
447 - *
448 - * @since 1.0.0
449 - *
450 - * @access private
451 - */
452 - private function _fetchDataFromEditableTable() {
453 - $headers = wp_list_pluck( $this->_series, 'label' );
454 - $this->fetch();
455 -
456 - $data = $this->_data;
457 - $this->_data = array();
458 -
459 - foreach ( $data as $line ) {
460 - $data_row = array();
461 - // we have to make sure we are fetching the data in the right order
462 - // in case the columns have been reordered
463 - foreach ( $headers as $header ) {
464 - $value = $line[ $header ];
465 - // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
466 - if ( in_array( $header, $headers ) ) {
467 - $data_row[] = $value;
468 - }
469 - }
470 - $this->_data[] = $this->_normalizeData( $data_row );
471 - }
472 -
473 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Data found for %s = %s', print_r( $this->_args, true ), print_r( $this->_data, true ) ), 'debug', __FILE__, __LINE__ );
474 -
475 - return true;
476 - }
477 -
478 -
479 -}
207 +}