PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.0.6
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.0.6
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.6, at classes/Visualizer/Module/Chart.php

602 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 'map_api_key' => get_option( 'visualizer-map-api-key' ),
340 'ajax' => array(
341 'url' => admin_url( 'admin-ajax.php' ),
342 'nonces' => array(
343 'permissions' => wp_create_nonce( Visualizer_Plugin::ACTION_FETCH_PERMISSIONS_DATA ),
344 ),
345 'actions' => array(
346 'permissions' => Visualizer_Plugin::ACTION_FETCH_PERMISSIONS_DATA,
347 ),
348 ),
349 )
350 );
351 $render = new Visualizer_Render_Page_Data();
352 $render->chart = $this->_chart;
353 $render->type = $data['type'];
354 $render->sidebar = $sidebar;
355 if ( filter_input( INPUT_GET, 'library', FILTER_VALIDATE_BOOLEAN ) ) {
356 $render->button = filter_input( INPUT_GET, 'action' ) == Visualizer_Plugin::ACTION_EDIT_CHART
357 ? esc_html__( 'Save Chart', 'visualizer' )
358 : esc_html__( 'Create Chart', 'visualizer' );
359 } else {
360 $render->button = esc_attr__( 'Insert Chart', 'visualizer' );
361 }
362 if ( VISUALIZER_PRO ) {
363 global $Visualizer_Pro;
364 $Visualizer_Pro->_enqueueScriptsAndStyles( $data );
365 }
366 $this->_addAction( 'admin_head', 'renderFlattrScript' );
367 wp_iframe( array( $render, 'render' ) );
368 }
369
370 /**
371 * Handles chart type selection page.
372 *
373 * @since 1.0.0
374 *
375 * @access private
376 */
377 private function _handleTypesPage() {
378 // process post request
379 if ( $_SERVER['REQUEST_METHOD'] == 'POST' && wp_verify_nonce( filter_input( INPUT_POST, 'nonce' ) ) ) {
380 $type = filter_input( INPUT_POST, 'type' );
381 if ( in_array( $type, Visualizer_Plugin::getChartTypes() ) ) {
382 // save new chart type
383 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_CHART_TYPE, $type );
384 // if the chart has default data, update it with appropriate default data for new type
385 if ( filter_var( get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, true ), FILTER_VALIDATE_BOOLEAN ) ) {
386 $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $type . '.csv' );
387 $source->fetch();
388 $this->_chart->post_content = $source->getData();
389 wp_update_post( $this->_chart->to_array() );
390 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
391 }
392 // redirect to next tab
393 // changed by Ash/Upwork
394 wp_redirect( add_query_arg( 'tab', 'settings' ) );
395
396 return;
397 }
398 }
399 $render = new Visualizer_Render_Page_Types();
400 $render->type = get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
401 $render->types = Visualizer_Module_Admin::_getChartTypesLocalized();
402 $render->chart = $this->_chart;
403 wp_enqueue_style( 'visualizer-frame' );
404 wp_enqueue_script( 'visualizer-frame' );
405 wp_iframe( array( $render, 'render' ) );
406 }
407
408 /**
409 * Renders flattr script in the iframe <head>
410 *
411 * @since 1.4.2
412 * @action admin_head
413 *
414 * @access public
415 */
416 public function renderFlattrScript() {
417 echo '';
418 }
419 // changed by Ash/Upwork
420 /**
421 * Parses uploaded CSV file and saves new data for the chart.
422 *
423 * @since 1.0.0
424 *
425 * @access public
426 */
427 public function uploadData() {
428 // validate nonce
429 // do not use filter_input as it does not work for phpunit test cases, use filter_var instead
430 if ( ! isset( $_GET['nonce'] ) || ! wp_verify_nonce( $_GET['nonce'] ) ) {
431 status_header( 403 );
432 exit;
433 }
434 // check chart, if chart exists
435 $chart_id = isset( $_GET['chart'] ) ? filter_var( $_GET['chart'], FILTER_VALIDATE_INT ) : '';
436 if ( ! $chart_id || ! ( $chart = get_post( $chart_id ) ) || $chart->post_type != Visualizer_Plugin::CPT_VISUALIZER ) {
437 status_header( 400 );
438 exit;
439 }
440 if ( ! isset( $_POST['vz-import-time'] ) ) {
441 apply_filters( 'visualizer_pro_remove_schedule', $chart_id );
442 }
443
444 if ( ! isset( $_POST['chart_data_src'] ) || Visualizer_Plugin::CF_SOURCE_FILTER !== $_POST['chart_data_src'] ) {
445 // delete the filters in case this chart is being uploaded from other data sources
446 delete_post_meta( $chart_id, 'visualizer-filter-config' );
447 }
448
449 $source = null;
450 $render = new Visualizer_Render_Page_Update();
451 if ( isset( $_POST['remote_data'] ) && filter_var( $_POST['remote_data'], FILTER_VALIDATE_URL ) ) {
452 $source = new Visualizer_Source_Csv_Remote( $_POST['remote_data'] );
453 if ( isset( $_POST['vz-import-time'] ) ) {
454 apply_filters( 'visualizer_pro_chart_schedule', $chart_id, $_POST['remote_data'], $_POST['vz-import-time'] );
455 }
456 } elseif ( isset( $_FILES['local_data'] ) && $_FILES['local_data']['error'] == 0 ) {
457 $source = new Visualizer_Source_Csv( $_FILES['local_data']['tmp_name'] );
458 // Added by Ash/Upwork
459 } elseif ( isset( $_POST['chart_data'] ) && strlen( $_POST['chart_data'] ) > 0 ) {
460 $source = apply_filters( 'visualizer_pro_handle_chart_data', $_POST['chart_data'], '' );
461 // Added by Ash/Upwork
462 } else {
463 $render->message = esc_html__( 'CSV file with chart data was not uploaded. Please, try again.', 'visualizer' );
464 }
465 if ( $source ) {
466 if ( $source->fetch() ) {
467 $chart->post_content = $source->getData();
468 wp_update_post( $chart->to_array() );
469 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
470 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
471 update_post_meta( $chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, 0 );
472 $render->data = json_encode( $source->getRawData() );
473 $render->series = json_encode( $source->getSeries() );
474 } else {
475 $render->message = esc_html__( 'CSV file is broken or invalid. Please, try again.', 'visualizer' );
476 }
477 }
478 $render->render();
479 if ( ! ( defined( 'VISUALIZER_DO_NOT_DIE' ) && VISUALIZER_DO_NOT_DIE ) ) {
480 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
481 }
482 }
483
484 /**
485 * Clones the chart.
486 *
487 * @since 1.0.0
488 *
489 * @access public
490 */
491 public function cloneChart() {
492 $chart_id = $success = false;
493 $nonce = wp_verify_nonce( filter_input( INPUT_GET, 'nonce' ), Visualizer_Plugin::ACTION_CLONE_CHART );
494 $capable = current_user_can( 'edit_posts' );
495 if ( $nonce && $capable ) {
496 $chart_id = filter_input(
497 INPUT_GET, 'chart', FILTER_VALIDATE_INT, array(
498 'options' => array(
499 'min_range' => 1,
500 ),
501 )
502 );
503 if ( $chart_id ) {
504 $chart = get_post( $chart_id );
505 $success = $chart && $chart->post_type == Visualizer_Plugin::CPT_VISUALIZER;
506 }
507 }
508 $redirect = wp_get_referer();
509 if ( $success ) {
510 $new_chart_id = wp_insert_post(
511 array(
512 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
513 'post_title' => 'Visualization',
514 'post_author' => get_current_user_id(),
515 'post_status' => $chart->post_status,
516 'post_content' => $chart->post_content,
517 )
518 );
519 if ( $new_chart_id && ! is_wp_error( $new_chart_id ) ) {
520 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_CHART_TYPE, get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true ) );
521 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, get_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, true ) );
522 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SOURCE, get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true ) );
523 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SERIES, get_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, true ) );
524 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SETTINGS, get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true ) );
525 $redirect = add_query_arg(
526 array(
527 'page' => 'visualizer',
528 'type' => filter_input( INPUT_GET, 'type' ),
529 ), admin_url( 'upload.php' )
530 );
531 }
532 }
533 wp_redirect( $redirect );
534 exit;
535 }
536
537 /**
538 * Exports the chart data
539 *
540 * @since 1.0.0
541 *
542 * @access public
543 */
544 public function exportData() {
545 check_ajax_referer( Visualizer_Plugin::ACTION_EXPORT_DATA . Visualizer_Plugin::VERSION, 'security' );
546 $capable = current_user_can( 'edit_posts' );
547 if ( $capable ) {
548 $chart_id = isset( $_GET['chart'] ) ? filter_var(
549 $_GET['chart'], FILTER_VALIDATE_INT, array(
550 'options' => array(
551 'min_range' => 1,
552 ),
553 )
554 ) : '';
555 if ( $chart_id ) {
556 $data = $this->_getDataAs( $chart_id, 'csv' );
557 if ( $data ) {
558 echo wp_send_json_success( $data );
559 }
560 }
561 }
562
563 defined( 'WP_TESTS_DOMAIN' ) ? wp_die() : exit();
564 }
565
566 /**
567 * Handles chart data page.
568 *
569 * @since 1.0.0
570 *
571 * @access private
572 */
573 private function _handleDataPage() {
574 $data = $this->_getChartArray();
575 $render = new Visualizer_Render_Page_Data();
576 $render->chart = $this->_chart;
577 $render->type = $data['type'];
578 unset( $data['settings']['width'], $data['settings']['height'] );
579 wp_enqueue_style( 'visualizer-frame' );
580 wp_enqueue_script( 'visualizer-render' );
581 wp_localize_script(
582 'visualizer-render', 'visualizer', array(
583 'l10n' => array(
584 'invalid_source' => esc_html__( 'You have entered invalid URL. Please, insert proper URL.', 'visualizer' ),
585 'loading' => esc_html__( 'Loading...', 'visualizer' ),
586 ),
587 'charts' => array(
588 'canvas' => $data,
589 ),
590 )
591 );
592 // Added by Ash/Upwork
593 if ( VISUALIZER_PRO ) {
594 global $Visualizer_Pro;
595 $Visualizer_Pro->_enqueueScriptsAndStyles( $data );
596 }
597 // Added by Ash/Upwork
598 $this->_addAction( 'admin_head', 'renderFlattrScript' );
599 wp_iframe( array( $render, 'render' ) );
600 }
601 }
602