PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.7
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.7
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
visualizer / classes / Visualizer / Module / Chart.php

Chart.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.0.7, at classes/Visualizer/Module/Chart.php

603 lines 20.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // +----------------------------------------------------------------------+
3 // | Copyright 2013 Madpixels (email : visualizer@madpixels.net) |
4 // +----------------------------------------------------------------------+
5 // | This program is free software; you can redistribute it and/or modify |
6 // | it under the terms of the GNU General Public License, version 2, as |
7 // | published by the Free Software Foundation. |
8 // | |
9 // | This program is distributed in the hope that it will be useful, |
10 // | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 // | GNU General Public License for more details. |
13 // | |
14 // | You should have received a copy of the GNU General Public License |
15 // | along with this program; if not, write to the Free Software |
16 // | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, |
17 // | MA 02110-1301 USA |
18 // +----------------------------------------------------------------------+
19 // | Author: Eugene Manuilov <eugene@manuilov.org> |
20 // +----------------------------------------------------------------------+
21 /**
22 * The module for all stuff related to getting, editing, creating and deleting charts.
23 *
24 * @category Visualizer
25 * @package Module
26 *
27 * @since 1.0.0
28 */
29 class Visualizer_Module_Chart extends Visualizer_Module {
30
31 const NAME = __CLASS__;
32
33 /**
34 * The chart object.
35 *
36 * @since 1.0.0
37 *
38 * @access private
39 * @var WP_Post
40 */
41 private $_chart;
42
43 /**
44 * Constructor.
45 *
46 * @since 1.0.0
47 *
48 * @access public
49 *
50 * @param Visualizer_Plugin $plugin The instance of the plugin.
51 */
52 public function __construct( Visualizer_Plugin $plugin ) {
53 parent::__construct( $plugin );
54 $this->_addAjaxAction( Visualizer_Plugin::ACTION_GET_CHARTS, 'getCharts' );
55 $this->_addAjaxAction( Visualizer_Plugin::ACTION_DELETE_CHART, 'deleteChart' );
56 $this->_addAjaxAction( Visualizer_Plugin::ACTION_CREATE_CHART, 'renderChartPages' );
57 $this->_addAjaxAction( Visualizer_Plugin::ACTION_EDIT_CHART, 'renderChartPages' );
58 $this->_addAjaxAction( Visualizer_Plugin::ACTION_UPLOAD_DATA, 'uploadData' );
59 $this->_addAjaxAction( Visualizer_Plugin::ACTION_CLONE_CHART, 'cloneChart' );
60 // Added by Ash/Upwork
61 $this->_addAjaxAction( Visualizer_Plugin::ACTION_EXPORT_DATA, 'exportData' );
62 // Added by Ash/Upwork
63 }
64
65 /**
66 * Fetches charts from database.
67 *
68 * @since 1.0.0
69 *
70 * @access public
71 */
72 public function getCharts() {
73 $query_args = array(
74 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
75 'posts_per_page' => 9,
76 'paged' => filter_input(
77 INPUT_GET, 'page', FILTER_VALIDATE_INT, array(
78 'options' => array(
79 'min_range' => 1,
80 'default' => 1,
81 ),
82 )
83 ),
84 );
85 $filter = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
86 if ( empty( $filter ) ) {
87 // 'filter' is from the modal from the add media button.
88 $filter = filter_input( INPUT_GET, 'filter', FILTER_SANITIZE_STRING );
89 }
90
91 if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
92 $query_args['meta_query'] = array(
93 array(
94 'key' => Visualizer_Plugin::CF_CHART_TYPE,
95 'value' => $filter,
96 'compare' => '=',
97 ),
98 );
99 }
100 $query = new WP_Query( $query_args );
101 $charts = array();
102 while ( $query->have_posts() ) {
103 $chart = $query->next_post();
104 $chart_data = $this->_getChartArray( $chart );
105 $chart_data['id'] = $chart->ID;
106 $charts[] = $chart_data;
107 }
108 self::_sendResponse(
109 array(
110 'success' => true,
111 'data' => $charts,
112 'total' => $query->max_num_pages,
113 )
114 );
115 }
116
117 /**
118 * Returns chart data required for rendering.
119 *
120 * @since 1.0.0
121 *
122 * @access private
123 *
124 * @param WP_Post $chart The chart object.
125 *
126 * @return array The array of chart data.
127 */
128 private function _getChartArray( WP_Post $chart = null ) {
129 if ( is_null( $chart ) ) {
130 $chart = $this->_chart;
131 }
132 $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
133 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
134 $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( $chart->post_content ), $chart->ID, $type );
135
136 return array(
137 'type' => $type,
138 'series' => $series,
139 'settings' => get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true ),
140 'data' => $data,
141 );
142 }
143
144 /**
145 * Sends json response.
146 *
147 * @since 1.0.0
148 *
149 * @access private
150 *
151 * @param array $results The response array.
152 */
153 public static function _sendResponse( $results ) {
154 header( 'Content-type: application/json' );
155 nocache_headers();
156 echo json_encode( $results );
157 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
158 }
159
160 /**
161 * Deletes a chart from database.
162 *
163 * @since 1.0.0
164 * @uses wp_delete_post() To delete a chart.
165 *
166 * @access public
167 */
168 public function deleteChart() {
169 $is_post = $_SERVER['REQUEST_METHOD'] == 'POST';
170 $input_method = $is_post ? INPUT_POST : INPUT_GET;
171 $chart_id = $success = false;
172 $nonce = wp_verify_nonce( filter_input( $input_method, 'nonce' ) );
173 $capable = current_user_can( 'delete_posts' );
174 if ( $nonce && $capable ) {
175 $chart_id = filter_input(
176 $input_method, 'chart', FILTER_VALIDATE_INT, array(
177 'options' => array(
178 'min_range' => 1,
179 ),
180 )
181 );
182 if ( $chart_id ) {
183 $chart = get_post( $chart_id );
184 $success = $chart && $chart->post_type == Visualizer_Plugin::CPT_VISUALIZER;
185 }
186 }
187 if ( $success ) {
188 wp_delete_post( $chart_id, true );
189 }
190 if ( $is_post ) {
191 self::_sendResponse(
192 array(
193 'success' => $success,
194 )
195 );
196 }
197 wp_redirect( wp_get_referer() );
198 exit;
199 }
200
201 /**
202 * Renders appropriate page for chart builder. Creates new auto draft chart
203 * if no chart has been specified.
204 *
205 * @since 1.0.0
206 *
207 * @access public
208 */
209 public function renderChartPages() {
210 defined( 'IFRAME_REQUEST' ) || define( 'IFRAME_REQUEST', 1 );
211 // check chart, if chart not exists, will create new one and redirects to the same page with proper chart id
212 $chart_id = isset( $_GET['chart'] ) ? filter_var( $_GET['chart'], FILTER_VALIDATE_INT ) : '';
213 if ( ! $chart_id || ! ( $chart = get_post( $chart_id ) ) || $chart->post_type != Visualizer_Plugin::CPT_VISUALIZER ) {
214 $default_type = 'line';
215 $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $default_type . '.csv' );
216 $source->fetch();
217 $chart_id = wp_insert_post(
218 array(
219 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
220 'post_title' => 'Visualization',
221 'post_author' => get_current_user_id(),
222 'post_status' => 'auto-draft',
223 'post_content' => $source->getData(),
224 )
225 );
226 if ( $chart_id && ! is_wp_error( $chart_id ) ) {
227 add_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, $default_type );
228 add_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, 1 );
229 add_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
230 add_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
231 add_post_meta(
232 $chart_id, Visualizer_Plugin::CF_SETTINGS, array(
233 'focusTarget' => 'datum',
234 )
235 );
236 do_action( 'visualizer_pro_new_chart_defaults', $chart_id );
237 }
238 wp_redirect( add_query_arg( 'chart', (int) $chart_id ) );
239 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
240 }
241 // enqueue and register scripts and styles
242 wp_register_script( 'visualizer-chosen', VISUALIZER_ABSURL . 'js/lib/chosen.jquery.min.js', array( 'jquery' ), Visualizer_Plugin::VERSION );
243 wp_register_style( 'visualizer-chosen', VISUALIZER_ABSURL . 'css/lib/chosen.min.css', array(), Visualizer_Plugin::VERSION );
244
245 wp_register_style( 'visualizer-frame', VISUALIZER_ABSURL . 'css/frame.css', array( 'visualizer-chosen' ), Visualizer_Plugin::VERSION );
246 wp_register_script( 'visualizer-frame', VISUALIZER_ABSURL . 'js/frame.js', array( 'visualizer-chosen' ), Visualizer_Plugin::VERSION, true );
247 wp_register_script( 'google-jsapi-new', '//www.gstatic.com/charts/loader.js', array(), null, true );
248 wp_register_script( 'google-jsapi-old', '//www.google.com/jsapi', array( 'google-jsapi-new' ), null, true );
249 wp_register_script(
250 'visualizer-render', VISUALIZER_ABSURL . 'js/render.js', array(
251 'google-jsapi-old',
252 'google-jsapi-new',
253 'visualizer-frame',
254 ), Visualizer_Plugin::VERSION, true
255 );
256 wp_register_script(
257 'visualizer-preview', VISUALIZER_ABSURL . 'js/preview.js', array(
258 'wp-color-picker',
259 'visualizer-render',
260 ), Visualizer_Plugin::VERSION, true
261 );
262 // added by Ash/Upwork
263 if ( VISUALIZER_PRO ) {
264 global $Visualizer_Pro;
265 $Visualizer_Pro->_addScriptsAndStyles();
266 }
267 // dispatch pages
268 $this->_chart = get_post( $chart_id );
269 $tab = isset( $_GET['tab'] ) && ! empty( $_GET['tab'] ) ? $_GET['tab'] : 'visualizer';
270
271 // skip chart type pages only for existing charts.
272 if ( VISUALIZER_SKIP_CHART_TYPE_PAGE && 'auto-draft' !== $this->_chart->post_status ) {
273 $tab = 'settings';
274 }
275
276 switch ( $tab ) {
277 case 'settings':
278 $this->_handleDataAndSettingsPage();
279 break;
280 case 'type': // fall through.
281 case 'visualizer': // fall through.
282 $this->_handleTypesPage();
283 break;
284 default:
285 do_action( 'visualizer_pro_handle_tab', $tab, $this->_chart );
286 break;
287 }
288 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
289 }
290
291 /**
292 * Handle data and settings page
293 */
294 private function _handleDataAndSettingsPage() {
295 if ( isset( $_POST['map_api_key'] ) ) {
296 update_option( 'visualizer-map-api-key', $_POST['map_api_key'] );
297 }
298 if ( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_GET['nonce'] ) && wp_verify_nonce( $_GET['nonce'] ) ) {
299 if ( $this->_chart->post_status == 'auto-draft' ) {
300 $this->_chart->post_status = 'publish';
301 wp_update_post( $this->_chart->to_array() );
302 }
303 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, $_POST );
304 $render = new Visualizer_Render_Page_Send();
305 $render->text = sprintf( '[visualizer id="%d"]', $this->_chart->ID );
306 wp_iframe( array( $render, 'render' ) );
307
308 return;
309 }
310 $data = $this->_getChartArray();
311 $sidebar = '';
312 $sidebar_class = 'Visualizer_Render_Sidebar_Type_' . ucfirst( $data['type'] );
313 if ( class_exists( $sidebar_class, true ) ) {
314 $sidebar = new $sidebar_class( $data['settings'] );
315 $sidebar->__series = $data['series'];
316 $sidebar->__data = $data['data'];
317 } else {
318 $sidebar = apply_filters( 'visualizer_pro_chart_type_sidebar', '', $data );
319 if ( $sidebar != '' ) {
320 $sidebar->__series = $data['series'];
321 $sidebar->__data = $data['data'];
322 }
323 }
324 unset( $data['settings']['width'], $data['settings']['height'] );
325 wp_enqueue_style( 'visualizer-frame' );
326 wp_enqueue_style( 'wp-color-picker' );
327 wp_enqueue_style( 'visualizer-frame' );
328 wp_enqueue_script( 'visualizer-preview' );
329 wp_enqueue_script( 'visualizer-render' );
330 wp_localize_script(
331 'visualizer-render', 'visualizer', array(
332 'l10n' => array(
333 'invalid_source' => esc_html__( 'You have entered invalid URL. Please, insert proper URL.', 'visualizer' ),
334 'loading' => esc_html__( 'Loading...', 'visualizer' ),
335 ),
336 'charts' => array(
337 'canvas' => $data,
338 ),
339 'language' => $this->get_language(),
340 'map_api_key' => get_option( 'visualizer-map-api-key' ),
341 'ajax' => array(
342 'url' => admin_url( 'admin-ajax.php' ),
343 'nonces' => array(
344 'permissions' => wp_create_nonce( Visualizer_Plugin::ACTION_FETCH_PERMISSIONS_DATA ),
345 ),
346 'actions' => array(
347 'permissions' => Visualizer_Plugin::ACTION_FETCH_PERMISSIONS_DATA,
348 ),
349 ),
350 )
351 );
352 $render = new Visualizer_Render_Page_Data();
353 $render->chart = $this->_chart;
354 $render->type = $data['type'];
355 $render->sidebar = $sidebar;
356 if ( filter_input( INPUT_GET, 'library', FILTER_VALIDATE_BOOLEAN ) ) {
357 $render->button = filter_input( INPUT_GET, 'action' ) == Visualizer_Plugin::ACTION_EDIT_CHART
358 ? esc_html__( 'Save Chart', 'visualizer' )
359 : esc_html__( 'Create Chart', 'visualizer' );
360 } else {
361 $render->button = esc_attr__( 'Insert Chart', 'visualizer' );
362 }
363 if ( VISUALIZER_PRO ) {
364 global $Visualizer_Pro;
365 $Visualizer_Pro->_enqueueScriptsAndStyles( $data );
366 }
367 $this->_addAction( 'admin_head', 'renderFlattrScript' );
368 wp_iframe( array( $render, 'render' ) );
369 }
370
371 /**
372 * Handles chart type selection page.
373 *
374 * @since 1.0.0
375 *
376 * @access private
377 */
378 private function _handleTypesPage() {
379 // process post request
380 if ( $_SERVER['REQUEST_METHOD'] == 'POST' && wp_verify_nonce( filter_input( INPUT_POST, 'nonce' ) ) ) {
381 $type = filter_input( INPUT_POST, 'type' );
382 if ( in_array( $type, Visualizer_Plugin::getChartTypes() ) ) {
383 // save new chart type
384 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_CHART_TYPE, $type );
385 // if the chart has default data, update it with appropriate default data for new type
386 if ( filter_var( get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, true ), FILTER_VALIDATE_BOOLEAN ) ) {
387 $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $type . '.csv' );
388 $source->fetch();
389 $this->_chart->post_content = $source->getData();
390 wp_update_post( $this->_chart->to_array() );
391 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
392 }
393 // redirect to next tab
394 // changed by Ash/Upwork
395 wp_redirect( add_query_arg( 'tab', 'settings' ) );
396
397 return;
398 }
399 }
400 $render = new Visualizer_Render_Page_Types();
401 $render->type = get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
402 $render->types = Visualizer_Module_Admin::_getChartTypesLocalized();
403 $render->chart = $this->_chart;
404 wp_enqueue_style( 'visualizer-frame' );
405 wp_enqueue_script( 'visualizer-frame' );
406 wp_iframe( array( $render, 'render' ) );
407 }
408
409 /**
410 * Renders flattr script in the iframe <head>
411 *
412 * @since 1.4.2
413 * @action admin_head
414 *
415 * @access public
416 */
417 public function renderFlattrScript() {
418 echo '';
419 }
420 // changed by Ash/Upwork
421 /**
422 * Parses uploaded CSV file and saves new data for the chart.
423 *
424 * @since 1.0.0
425 *
426 * @access public
427 */
428 public function uploadData() {
429 // validate nonce
430 // do not use filter_input as it does not work for phpunit test cases, use filter_var instead
431 if ( ! isset( $_GET['nonce'] ) || ! wp_verify_nonce( $_GET['nonce'] ) ) {
432 status_header( 403 );
433 exit;
434 }
435 // check chart, if chart exists
436 $chart_id = isset( $_GET['chart'] ) ? filter_var( $_GET['chart'], FILTER_VALIDATE_INT ) : '';
437 if ( ! $chart_id || ! ( $chart = get_post( $chart_id ) ) || $chart->post_type != Visualizer_Plugin::CPT_VISUALIZER ) {
438 status_header( 400 );
439 exit;
440 }
441 if ( ! isset( $_POST['vz-import-time'] ) ) {
442 apply_filters( 'visualizer_pro_remove_schedule', $chart_id );
443 }
444
445 if ( ! isset( $_POST['chart_data_src'] ) || Visualizer_Plugin::CF_SOURCE_FILTER !== $_POST['chart_data_src'] ) {
446 // delete the filters in case this chart is being uploaded from other data sources
447 delete_post_meta( $chart_id, 'visualizer-filter-config' );
448 }
449
450 $source = null;
451 $render = new Visualizer_Render_Page_Update();
452 if ( isset( $_POST['remote_data'] ) && filter_var( $_POST['remote_data'], FILTER_VALIDATE_URL ) ) {
453 $source = new Visualizer_Source_Csv_Remote( $_POST['remote_data'] );
454 if ( isset( $_POST['vz-import-time'] ) ) {
455 apply_filters( 'visualizer_pro_chart_schedule', $chart_id, $_POST['remote_data'], $_POST['vz-import-time'] );
456 }
457 } elseif ( isset( $_FILES['local_data'] ) && $_FILES['local_data']['error'] == 0 ) {
458 $source = new Visualizer_Source_Csv( $_FILES['local_data']['tmp_name'] );
459 // Added by Ash/Upwork
460 } elseif ( isset( $_POST['chart_data'] ) && strlen( $_POST['chart_data'] ) > 0 ) {
461 $source = apply_filters( 'visualizer_pro_handle_chart_data', $_POST['chart_data'], '' );
462 // Added by Ash/Upwork
463 } else {
464 $render->message = esc_html__( 'CSV file with chart data was not uploaded. Please, try again.', 'visualizer' );
465 }
466 if ( $source ) {
467 if ( $source->fetch() ) {
468 $chart->post_content = $source->getData();
469 wp_update_post( $chart->to_array() );
470 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
471 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
472 update_post_meta( $chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, 0 );
473 $render->data = json_encode( $source->getRawData() );
474 $render->series = json_encode( $source->getSeries() );
475 } else {
476 $render->message = esc_html__( 'CSV file is broken or invalid. Please, try again.', 'visualizer' );
477 }
478 }
479 $render->render();
480 if ( ! ( defined( 'VISUALIZER_DO_NOT_DIE' ) && VISUALIZER_DO_NOT_DIE ) ) {
481 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
482 }
483 }
484
485 /**
486 * Clones the chart.
487 *
488 * @since 1.0.0
489 *
490 * @access public
491 */
492 public function cloneChart() {
493 $chart_id = $success = false;
494 $nonce = wp_verify_nonce( filter_input( INPUT_GET, 'nonce' ), Visualizer_Plugin::ACTION_CLONE_CHART );
495 $capable = current_user_can( 'edit_posts' );
496 if ( $nonce && $capable ) {
497 $chart_id = filter_input(
498 INPUT_GET, 'chart', FILTER_VALIDATE_INT, array(
499 'options' => array(
500 'min_range' => 1,
501 ),
502 )
503 );
504 if ( $chart_id ) {
505 $chart = get_post( $chart_id );
506 $success = $chart && $chart->post_type == Visualizer_Plugin::CPT_VISUALIZER;
507 }
508 }
509 $redirect = wp_get_referer();
510 if ( $success ) {
511 $new_chart_id = wp_insert_post(
512 array(
513 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
514 'post_title' => 'Visualization',
515 'post_author' => get_current_user_id(),
516 'post_status' => $chart->post_status,
517 'post_content' => $chart->post_content,
518 )
519 );
520 if ( $new_chart_id && ! is_wp_error( $new_chart_id ) ) {
521 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_CHART_TYPE, get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true ) );
522 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, get_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, true ) );
523 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SOURCE, get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true ) );
524 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SERIES, get_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, true ) );
525 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SETTINGS, get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true ) );
526 $redirect = add_query_arg(
527 array(
528 'page' => 'visualizer',
529 'type' => filter_input( INPUT_GET, 'type' ),
530 ), admin_url( 'upload.php' )
531 );
532 }
533 }
534 wp_redirect( $redirect );
535 exit;
536 }
537
538 /**
539 * Exports the chart data
540 *
541 * @since 1.0.0
542 *
543 * @access public
544 */
545 public function exportData() {
546 check_ajax_referer( Visualizer_Plugin::ACTION_EXPORT_DATA . Visualizer_Plugin::VERSION, 'security' );
547 $capable = current_user_can( 'edit_posts' );
548 if ( $capable ) {
549 $chart_id = isset( $_GET['chart'] ) ? filter_var(
550 $_GET['chart'], FILTER_VALIDATE_INT, array(
551 'options' => array(
552 'min_range' => 1,
553 ),
554 )
555 ) : '';
556 if ( $chart_id ) {
557 $data = $this->_getDataAs( $chart_id, 'csv' );
558 if ( $data ) {
559 echo wp_send_json_success( $data );
560 }
561 }
562 }
563
564 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
565 }
566
567 /**
568 * Handles chart data page.
569 *
570 * @since 1.0.0
571 *
572 * @access private
573 */
574 private function _handleDataPage() {
575 $data = $this->_getChartArray();
576 $render = new Visualizer_Render_Page_Data();
577 $render->chart = $this->_chart;
578 $render->type = $data['type'];
579 unset( $data['settings']['width'], $data['settings']['height'] );
580 wp_enqueue_style( 'visualizer-frame' );
581 wp_enqueue_script( 'visualizer-render' );
582 wp_localize_script(
583 'visualizer-render', 'visualizer', array(
584 'l10n' => array(
585 'invalid_source' => esc_html__( 'You have entered invalid URL. Please, insert proper URL.', 'visualizer' ),
586 'loading' => esc_html__( 'Loading...', 'visualizer' ),
587 ),
588 'charts' => array(
589 'canvas' => $data,
590 ),
591 )
592 );
593 // Added by Ash/Upwork
594 if ( VISUALIZER_PRO ) {
595 global $Visualizer_Pro;
596 $Visualizer_Pro->_enqueueScriptsAndStyles( $data );
597 }
598 // Added by Ash/Upwork
599 $this->_addAction( 'admin_head', 'renderFlattrScript' );
600 wp_iframe( array( $render, 'render' ) );
601 }
602 }
603