PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.1.3
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.1.3
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 / Gutenberg / Block.php

Block.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 3.1.3, at classes/Visualizer/Gutenberg/Block.php

413 lines 12.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // +----------------------------------------------------------------------+
3 // | Copyright 2018 ThemeIsle (email : friends@themeisle.com) |
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: Hardeep Asrani <hardeep@themeisle.com> |
20 // +----------------------------------------------------------------------+
21 /**
22 * All the Gutenberg block related code.
23 *
24 * @category Visualizer
25 * @package Gutenberg
26 *
27 * @since 3.1.0
28 */
29 class Visualizer_Gutenberg_Block {
30
31 /**
32 * A reference to an instance of this class.
33 *
34 * @var Visualizer_Gutenberg_Block The one Visualizer_Gutenberg_Block instance.
35 */
36 private static $instance;
37
38 /**
39 * Visualizer plugin version.
40 *
41 * @var string $version The current version of the plugin.
42 */
43 protected $version;
44
45 /**
46 * Returns an instance of this class.
47 */
48 public static function get_instance() {
49 if ( null == self::$instance ) {
50 self::$instance = new Visualizer_Gutenberg_Block();
51 }
52 return self::$instance;
53 }
54
55 /**
56 * Initializes the plugin by setting filters and administration functions.
57 */
58 private function __construct() {
59 $this->version = Visualizer_Plugin::VERSION;
60 add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_gutenberg_scripts' ) );
61 add_action( 'init', array( $this, 'register_block_type' ) );
62 add_action( 'rest_api_init', array( $this, 'register_rest_endpoints' ) );
63 }
64
65 /**
66 * Enqueue front end and editor JavaScript and CSS
67 */
68 public function enqueue_gutenberg_scripts() {
69 $blockPath = VISUALIZER_ABSURL . 'classes/Visualizer/Gutenberg/build/block.js';
70 $handsontableJS = VISUALIZER_ABSURL . 'classes/Visualizer/Gutenberg/build/handsontable.js';
71 $stylePath = VISUALIZER_ABSURL . 'classes/Visualizer/Gutenberg/build/block.css';
72 $handsontableCSS = VISUALIZER_ABSURL . 'classes/Visualizer/Gutenberg/build/handsontable.css';
73
74 if ( VISUALIZER_TEST_JS_CUSTOMIZATION ) {
75 $version = filemtime( VISUALIZER_ABSPATH . 'classes/Visualizer/Gutenberg/build/block.js' );
76 } else {
77 $version = $this->version;
78 }
79
80 // Enqueue the bundled block JS file
81 wp_enqueue_script( 'handsontable', $handsontableJS );
82 wp_enqueue_script( 'visualizer-gutenberg-block', $blockPath, array( 'wp-api', 'handsontable' ), $version, true );
83
84 $type = 'community';
85
86 if ( VISUALIZER_PRO ) {
87 $type = 'pro';
88 if ( apply_filters( 'visualizer_is_business', false ) ) {
89 $type = 'developer';
90 }
91 }
92
93 $translation_array = array(
94 'isPro' => $type,
95 'proTeaser' => Visualizer_Plugin::PRO_TEASER_URL,
96 'absurl' => VISUALIZER_ABSURL,
97 );
98 wp_localize_script( 'visualizer-gutenberg-block', 'visualizerLocalize', $translation_array );
99
100 // Enqueue frontend and editor block styles
101 wp_enqueue_style( 'handsontable', $handsontableCSS );
102 wp_enqueue_style( 'visualizer-gutenberg-block', $stylePath, '', $version );
103 }
104 /**
105 * Hook server side rendering into render callback
106 */
107 public function register_block_type() {
108 register_block_type(
109 'visualizer/chart', array(
110 'render_callback' => array( $this, 'gutenberg_block_callback' ),
111 'attributes' => array(
112 'id' => array(
113 'type' => 'number',
114 ),
115 ),
116 )
117 );
118 }
119
120 /**
121 * Gutenberg Block Callback Function
122 */
123 public function gutenberg_block_callback( $attr ) {
124 if ( isset( $attr['id'] ) ) {
125 $id = $attr['id'];
126 if ( empty( $id ) || $id === 'none' ) {
127 return ''; // no id = no fun
128 }
129 return '[visualizer id="' . $id . '"]';
130 }
131 }
132
133 /**
134 * Hook server side rendering into render callback
135 */
136 public function register_rest_endpoints() {
137 register_rest_field(
138 'visualizer',
139 'chart_data',
140 array(
141 'get_callback' => array( $this, 'get_visualizer_data' ),
142 )
143 );
144
145 register_rest_route(
146 'visualizer/v' . VISUALIZER_REST_VERSION,
147 '/update-chart',
148 array(
149 'methods' => 'POST',
150 'callback' => array( $this, 'update_chart_data' ),
151 'args' => array(
152 'id' => array(
153 'sanitize_callback' => 'absint',
154 ),
155 ),
156 )
157 );
158
159 register_rest_route(
160 'visualizer/v' . VISUALIZER_REST_VERSION,
161 '/upload-data',
162 array(
163 'methods' => 'POST',
164 'callback' => array( $this, 'upload_csv_data' ),
165 'args' => array(
166 'url' => array(
167 'sanitize_callback' => 'esc_url_raw',
168 ),
169 ),
170 )
171 );
172
173 register_rest_route(
174 'visualizer/v' . VISUALIZER_REST_VERSION,
175 '/get-permission-data',
176 array(
177 'methods' => 'GET',
178 'callback' => array( $this, 'get_permission_data' ),
179 'args' => array(
180 'type' => array(
181 'sanitize_callback' => 'sanitize_text_field',
182 ),
183 ),
184 )
185 );
186 }
187
188 /**
189 * Get Post Meta Fields
190 */
191 public function get_visualizer_data( $post ) {
192 $data = array();
193 $post_id = $post['id'];
194
195 $data['visualizer-chart-type'] = get_post_meta( $post_id, Visualizer_Plugin::CF_CHART_TYPE, true );
196
197 $data['visualizer-source'] = get_post_meta( $post_id, Visualizer_Plugin::CF_SOURCE, true );
198
199 $data['visualizer-default-data'] = get_post_meta( $post_id, Visualizer_Plugin::CF_DEFAULT_DATA, true );
200
201 // faetch and update settings
202 $data['visualizer-settings'] = get_post_meta( $post_id, Visualizer_Plugin::CF_SETTINGS, true );
203
204 // handle series filter hooks
205 $data['visualizer-series'] = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $post_id, Visualizer_Plugin::CF_SERIES, true ), $post_id, $data['visualizer-chart-type'] );
206
207 // handle settings filter hooks
208 $data['visualizer-settings'] = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SETTINGS, $data['visualizer-settings'], $post_id, $data['visualizer-chart-type'] );
209
210 // handle data filter hooks
211 $data['visualizer-data'] = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( html_entity_decode( get_the_content( $post_id ) ) ), $post_id, $data['visualizer-chart-type'] );
212
213 $import = get_post_meta( $post_id, Visualizer_Plugin::CF_CHART_URL, true );
214
215 $schedule = get_post_meta( $post_id, Visualizer_Plugin::CF_CHART_SCHEDULE, true );
216
217 if ( ! empty( $import ) && ! empty( $schedule ) ) {
218 $data['visualizer-chart-url'] = $import;
219 $data['visualizer-chart-schedule'] = $schedule;
220 }
221
222 if ( VISUALIZER_PRO ) {
223 $permissions = get_post_meta( $post_id, Visualizer_PRO::CF_PERMISSIONS, true );
224
225 if ( ! empty( $permissions ) ) {
226 $data['visualizer-permissions'] = $permissions;
227 }
228 }
229
230 return $data;
231 }
232
233 /**
234 * Rest Callback Method
235 */
236 public function update_chart_data( $data ) {
237 if ( $data['id'] && ! is_wp_error( $data['id'] ) ) {
238
239 update_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_TYPE, $data['visualizer-chart-type'] );
240 update_post_meta( $data['id'], Visualizer_Plugin::CF_SOURCE, $data['visualizer-source'] );
241 update_post_meta( $data['id'], Visualizer_Plugin::CF_DEFAULT_DATA, $data['visualizer-default-data'] );
242 update_post_meta( $data['id'], Visualizer_Plugin::CF_SERIES, $data['visualizer-series'] );
243 update_post_meta( $data['id'], Visualizer_Plugin::CF_SETTINGS, $data['visualizer-settings'] );
244
245 if ( $data['visualizer-chart-url'] && $data['visualizer-chart-schedule'] ) {
246 update_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_URL, $data['visualizer-chart-url'] );
247 apply_filters( 'visualizer_pro_chart_schedule', $data['id'], $data['visualizer-chart-url'], $data['visualizer-chart-schedule'] );
248 } else {
249 delete_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_URL );
250 apply_filters( 'visualizer_pro_remove_schedule', $data['id'] );
251 }
252
253 if ( VISUALIZER_PRO ) {
254 update_post_meta( $data['id'], Visualizer_PRO::CF_PERMISSIONS, $data['visualizer-permissions'] );
255 }
256
257 if ( $data['visualizer-chart-url'] ) {
258 $content['source'] = $data['visualizer-chart-url'];
259 $content['data'] = $this->format_chart_data( $data['visualizer-data'], $data['visualizer-series'] );
260 } else {
261 $content = $this->format_chart_data( $data['visualizer-data'], $data['visualizer-series'] );
262 }
263
264 $chart = array(
265 'ID' => $data['id'],
266 'post_content' => serialize( $content ),
267 );
268
269 wp_update_post( $chart );
270
271 $revisions = wp_get_post_revisions( $data['id'], array( 'order' => 'ASC' ) );
272
273 if ( count( $revisions ) > 1 ) {
274 $revision_ids = array_keys( $revisions );
275
276 // delete all revisions.
277 foreach ( $revision_ids as $id ) {
278 wp_delete_post_revision( $id );
279 }
280 }
281
282 return new \WP_REST_Response( array( 'success' => sprintf( 'Chart updated' ) ) );
283 }
284 }
285
286 /**
287 * Format chart data.
288 */
289 public function format_chart_data( $data, $series ) {
290 foreach ( $series as $i => $row ) {
291 // if no value exists for the seires, then add null
292 if ( ! isset( $series[ $i ] ) ) {
293 $series[ $i ] = null;
294 }
295
296 if ( is_null( $series[ $i ] ) ) {
297 continue;
298 }
299
300 if ( $row['type'] == 'number' ) {
301 foreach ( $data as $o => $col ) {
302 $data[ $o ][ $i ] = ( is_numeric( $col[ $i ] ) ) ? floatval( $col[ $i ] ) : ( is_numeric( str_replace( ',', '', $col[ $i ] ) ) ? floatval( str_replace( ',', '', $col[ $i ] ) ) : null );
303 }
304 }
305
306 if ( $row['type'] == 'boolean' ) {
307 foreach ( $data as $o => $col ) {
308 $data[ $o ][ $i ] = ! empty( $col[ $i ] ) ? filter_validate( $col[ $i ], FILTER_VALIDATE_BOOLEAN ) : null;
309 }
310 }
311
312 if ( $row['type'] == 'timeofday' ) {
313 foreach ( $data as $o => $col ) {
314 $date = new DateTime( '1984-03-16T' . $col[ $i ] );
315 if ( $date ) {
316 $data[ $o ][ $i ] = array(
317 intval( $date->format( 'H' ) ),
318 intval( $date->format( 'i' ) ),
319 intval( $date->format( 's' ) ),
320 0,
321 );
322 }
323 }
324 }
325
326 if ( $row['type'] == 'string' ) {
327 foreach ( $data as $o => $col ) {
328 $data[ $o ][ $i ] = $this->toUTF8( $col[ $i ] );
329 }
330 }
331 }
332
333 return $data;
334 }
335
336 /**
337 * Use toUTF8 function
338 */
339 public function toUTF8( $datum ) {
340 if ( ! function_exists( 'mb_detect_encoding' ) || mb_detect_encoding( $datum ) !== 'ASCII' ) {
341 $datum = \ForceUTF8\Encoding::toUTF8( $datum );
342 }
343 return $datum;
344 }
345
346 /**
347 * Handle remote CSV data
348 */
349 public function upload_csv_data( $data ) {
350 if ( $data['url'] && ! is_wp_error( $data['url'] ) && filter_var( $data['url'], FILTER_VALIDATE_URL ) ) {
351 $source = new Visualizer_Source_Csv_Remote( $data['url'] );
352 if ( $source->fetch() ) {
353 $temp = $source->getData();
354 if ( is_string( $temp ) && is_array( unserialize( $temp ) ) ) {
355 $content['series'] = $source->getSeries();
356 $content['data'] = $source->getRawData();
357 return $content;
358 } else {
359 return new \WP_REST_Response( array( 'failed' => sprintf( 'Invalid CSV URL' ) ) );
360 }
361 } else {
362 return new \WP_REST_Response( array( 'failed' => sprintf( 'Invalid CSV URL' ) ) );
363 }
364 } else {
365 return new \WP_REST_Response( array( 'failed' => sprintf( 'Invalid CSV URL' ) ) );
366 }
367 }
368
369 /**
370 * Get permission data
371 */
372 public function get_permission_data( $data ) {
373 $options = array();
374 switch ( $data['type'] ) {
375 case 'users':
376 $query = new WP_User_Query(
377 array(
378 'number' => 1000,
379 'orderby' => 'display_name',
380 'fields' => array( 'ID', 'display_name' ),
381 'count_total' => false,
382 )
383 );
384 $users = $query->get_results();
385 if ( ! empty( $users ) ) {
386 $i = 0;
387 foreach ( $users as $user ) {
388 $options[ $i ]['value'] = $user->ID;
389 $options[ $i ]['label'] = $user->display_name;
390 $i++;
391 }
392 }
393 break;
394 case 'roles':
395 if ( ! function_exists( 'get_editable_roles' ) ) {
396 require_once ABSPATH . 'wp-admin/includes/user.php';
397 }
398 $roles = get_editable_roles();
399 if ( ! empty( $roles ) ) {
400 $i = 0;
401 foreach ( get_editable_roles() as $name => $info ) {
402 $options[ $i ]['value'] = $name;
403 $options[ $i ]['label'] = $name;
404 $i++;
405 }
406 }
407 break;
408 }
409 return $options;
410 }
411
412 }
413