PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.2
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.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/Module.php +7 -232 3.1.33.0.2 View file →
@@ -62,12 +62,8 @@
62 62 global $wpdb;
63 63
64 64 $this->_wpdb = $wpdb;
65 65 $this->_plugin = $plugin;
66 -
67 - $this->_addFilter( Visualizer_Plugin::FILTER_UNDO_REVISIONS, 'undoRevisions', 10, 2 );
68 - $this->_addFilter( Visualizer_Plugin::FILTER_HANDLE_REVISIONS, 'handleExistingRevisions', 10, 2 );
69 -
70 66 }
71 67
72 68 /**
73 69 * Registers an action hook.
@@ -252,31 +248,26 @@
252 248 * @param array $rows The array of data.
253 249 * @param string $filename The name of the file to use.
254 250 */
255 251 private function _getExcel( $rows, $filename ) {
256 - // PHPExcel did not like sheet names longer than 31 characters and we will assume the same with PhpSpreadsheet
252 + // PHPExcel does not like sheet names longer than 31 characters.
257 253 $chart = substr( $filename, 0, 30 );
258 254 $filename .= '.xlsx';
259 255
260 - $vendor_file = VISUALIZER_ABSPATH . '/vendor/autoload.php';
261 - if ( is_readable( $vendor_file ) ) {
262 - include_once( $vendor_file );
263 - }
264 -
265 256 $xlsData = '';
266 - if ( class_exists( 'PhpOffice\PhpSpreadsheet\Spreadsheet' ) ) {
267 - $doc = new PhpOffice\PhpSpreadsheet\Spreadsheet();
257 + if ( class_exists( 'PHPExcel' ) ) {
258 + $doc = new PHPExcel();
268 259 $doc->getActiveSheet()->fromArray( $rows, null, 'A1' );
269 - $doc->getActiveSheet()->setTitle( sanitize_title( $chart ) );
260 + $doc->getActiveSheet()->setTitle( $chart );
270 261 $doc = apply_filters( 'visualizer_excel_doc', $doc );
271 - $writer = PhpOffice\PhpSpreadsheet\IOFactory::createWriter( $doc, 'Xlsx' );
262 + $writer = PHPExcel_IOFactory::createWriter( $doc, 'Excel2007' );
272 263 ob_start();
273 264 $writer->save( 'php://output' );
274 265 $xlsData = ob_get_contents();
275 266 ob_end_clean();
276 267 } else {
277 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, 'Class PhpOffice\PhpSpreadsheet\Spreadsheet does not exist!', 'error', __FILE__, __LINE__ );
278 - error_log( 'Class PhpOffice\PhpSpreadsheet\Spreadsheet does not exist!' );
268 + do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, 'Class PHPExcel does not exist!', 'error', __FILE__, __LINE__ );
269 + error_log( 'Class PHPExcel does not exist!' );
279 270 }
280 271 return array(
281 272 'csv' => 'data:application/vnd.ms-excel;base64,' . base64_encode( $xlsData ),
282 273 'name' => $filename,
@@ -329,223 +320,7 @@
329 320 </html>';
330 321 return array(
331 322 'csv' => $html,
332 323 );
333 - }
334 -
335 - /**
336 - * Undo revisions for the chart, and if necessary, restore the earliest version.
337 - *
338 - * @return bool If any revisions were found.
339 - */
340 - public final function undoRevisions( $chart_id, $restore = false ) {
341 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'undoRevisions for %d with%s restore', $chart_id, ( $restore ? '' : 'out' ) ), 'debug', __FILE__, __LINE__ );
342 -
343 - $revisions = wp_get_post_revisions( $chart_id, array( 'order' => 'ASC' ) );
344 - if ( count( $revisions ) > 1 ) {
345 - $revision_ids = array_keys( $revisions );
346 -
347 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'found %d revisions = %s', count( $revisions ), print_r( $revision_ids, true ) ), 'debug', __FILE__, __LINE__ );
348 -
349 - // when we restore, a new revision is likely to be created. so, let's disable revisions for the time being.
350 - add_filter( 'wp_revisions_to_keep', '__return_false' );
351 -
352 - if ( $restore ) {
353 - // restore to the oldest one i.e. the first one.
354 - wp_restore_post_revision( array_shift( $revision_ids ) );
355 - }
356 -
357 - // delete all revisions.
358 - foreach ( $revision_ids as $id ) {
359 - wp_delete_post_revision( $id );
360 - }
361 -
362 - return true;
363 - }
364 - return false;
365 - }
366 -
367 - /**
368 - * If existing revisions exist for the chart, restore the earliest version and then create a new revision to initiate editing.
369 - */
370 - public final function handleExistingRevisions( $chart_id, $chart ) {
371 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'handleExistingRevisions for %d', $chart_id ), 'debug', __FILE__, __LINE__ );
372 -
373 - // undo revisions.
374 - $revisions_found = $this->undoRevisions( $chart_id, true );
375 -
376 - // create revision for the edit action.
377 - wp_save_post_revision( $chart_id );
378 -
379 - if ( $revisions_found ) {
380 - // fetch chart data again in case it was updated by an earlier revision.
381 - $chart = get_post( $chart_id );
382 - }
383 - return $chart;
384 - }
385 -
386 - /**
387 - * Returns the language of the locale.
388 - *
389 - * @access protected
390 - */
391 - protected function get_language() {
392 - $locale = get_locale();
393 - if ( empty( $locale ) ) {
394 - return '';
395 - }
396 - $array = explode( '_', $locale );
397 - if ( count( $array ) < 2 ) {
398 - return '';
399 - }
400 - return reset( $array );
401 - }
402 -
403 - /**
404 - * Gets/creates the JS where user-specific customizations can be/have been added.
405 - */
406 - protected function get_user_customization_js() {
407 - // use this as the JS file in case we are not able to create the file in uploads.
408 - $default = VISUALIZER_ABSURL . 'js/customization.js';
409 -
410 - $uploads = wp_get_upload_dir();
411 - $specific = $uploads['baseurl'] . '/visualizer/customization.js';
412 -
413 - // for testing on user sites (before we send them the correctly customized file).
414 - if ( VISUALIZER_TEST_JS_CUSTOMIZATION ) {
415 - return $default;
416 - }
417 -
418 - require_once( ABSPATH . 'wp-admin/includes/file.php' );
419 - WP_Filesystem();
420 - global $wp_filesystem;
421 -
422 - $dir = $wp_filesystem->wp_content_dir() . 'uploads/visualizer';
423 - $file = $wp_filesystem->wp_content_dir() . 'uploads/visualizer/customization.js';
424 -
425 - if ( $wp_filesystem->is_readable( $file ) ) {
426 - return $specific;
427 - }
428 -
429 - if ( $wp_filesystem->exists( $file ) && ! $wp_filesystem->is_readable( $file ) ) {
430 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Unable to read file %s', $file ), 'error', __FILE__, __LINE__ );
431 - return $default;
432 - }
433 -
434 - if ( ! $wp_filesystem->exists( $dir ) ) {
435 - if ( ( $done = $wp_filesystem->mkdir( $dir ) ) === false ) {
436 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Unable to create directory %s', $dir ), 'error', __FILE__, __LINE__ );
437 - return $default;
438 - }
439 - }
440 -
441 - // if file does not exist, copy.
442 - if ( ! $wp_filesystem->exists( $file ) ) {
443 - $src = str_replace( ABSPATH, $wp_filesystem->abspath(), VISUALIZER_ABSPATH . '/js/customization.js' );
444 - if ( ( $done = $wp_filesystem->copy( $src, $file ) ) === false ) {
445 - do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Unable to copy file %s to %s', $src, $file ), 'error', __FILE__, __LINE__ );
446 - return $default;
447 - }
448 - }
449 -
450 - return $specific;
451 - }
452 -
453 - /**
454 - * Load the class for the given chart's chart type so that its assets can be loaded.
455 - */
456 - protected function load_chart_type( $chart_id ) {
457 - $type = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true );
458 - $name = 'Visualizer_Render_Sidebar_Type_' . ucwords( $type );
459 - $class = null;
460 - if ( class_exists( $name ) || true === apply_filters( 'visualizer_load_chart', false, $name ) ) {
461 - $class = new $name;
462 - }
463 -
464 - if ( is_null( $class ) && VISUALIZER_PRO ) {
465 - // lets see if this type exists in pro. New Lite(3.1.0+) & old Pro(1.8.0-).
466 - $class = apply_filters( 'visualizer_pro_chart_type_sidebar', null, array( 'type' => $type, 'settings' => get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true ) ) );
467 - }
468 -
469 - return is_null( $class ) ? null : $class->getLibrary();
470 - }
471 -
472 - /**
473 - * Generates the inline CSS to apply to the chart and adds these classes to the settings.
474 - *
475 - * @access public
476 - * @param int $id The id of the chart.
477 - * @param array $settings The settings of the chart.
478 - */
479 - protected function get_inline_custom_css( $id, $settings ) {
480 - $css = '';
481 -
482 - $arguments = array( '', $settings );
483 - if ( ! isset( $settings['customcss'] ) ) {
484 - return $arguments;
485 - }
486 -
487 - $classes = array();
488 - $css = '<style type="text/css" name="visualizer-custom-css" id="customcss-' . $id . '">';
489 - foreach ( $settings['customcss'] as $name => $element ) {
490 - $attributes = array();
491 - foreach ( $element as $property => $value ) {
492 - $attributes[] = $this->handle_css_property( $property, $value );
493 - }
494 - $class_name = $id . $name;
495 - $properties = implode( '; ', array_filter( $attributes ) );
496 - if ( ! empty( $properties ) ) {
497 - $css .= '.' . $class_name . ' {' . $properties . ' !important;}';
498 - $classes[ $name ] = $class_name;
499 - }
500 - }
501 - $css .= '</style>';
502 -
503 - $settings['cssClassNames'] = $classes;
504 -
505 - $arguments = array( $css, $settings );
506 - apply_filters_ref_array( 'visualizer_inline_css', array( &$arguments ) );
507 -
508 - return $arguments;
509 - }
510 -
511 - /**
512 - * Handles CSS properties that might need special syntax.
513 - *
514 - * @access private
515 - * @param string $property The name of the css property.
516 - * @param string $value The value of the css property.
517 - */
518 - private function handle_css_property( $property, $value ) {
519 - if ( empty( $property ) || empty( $value ) ) {
520 - return '';
521 - }
522 -
523 - switch ( $property ) {
524 - case 'transform':
525 - $value = 'rotate(' . $value . 'deg)';
526 - break;
527 - }
528 - return $property . ': ' . $value;
529 - }
530 -
531 - /**
532 - * Determines if charts have been created of the particular chart type.
533 - */
534 - protected static function hasChartType( $type ) {
535 - $args = array(
536 - 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
537 - 'fields' => 'ids',
538 - 'post_status' => 'publish',
539 - 'meta_query' => array(
540 - array(
541 - 'key' => Visualizer_Plugin::CF_CHART_TYPE,
542 - 'value' => $type,
543 - ),
544 - ),
545 - );
546 -
547 - $q = new WP_Query( $args );
548 - return $q->found_posts > 0;
549 324 }
550 325
551 326 }