PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.3.0
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.3.0
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.3.0, at classes/Visualizer/Gutenberg/Block.php

417 lines 13.0 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', 'visualizer-datatables', 'moment' ), $version, true );
83
84 $type = 'community';
85
86 if ( Visualizer_Module::is_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 'charts' => Visualizer_Module_Admin::_getChartTypesLocalized(),
98 'adminPage' => menu_page_url( 'visualizer', false ),
99 );
100 wp_localize_script( 'visualizer-gutenberg-block', 'visualizerLocalize', $translation_array );
101
102 // Enqueue frontend and editor block styles
103 wp_enqueue_style( 'handsontable', $handsontableCSS );
104 wp_enqueue_style( 'visualizer-gutenberg-block', $stylePath, array( 'visualizer-datatables' ), $version );
105 }
106 /**
107 * Hook server side rendering into render callback
108 */
109 public function register_block_type() {
110 register_block_type(
111 'visualizer/chart', array(
112 'render_callback' => array( $this, 'gutenberg_block_callback' ),
113 'attributes' => array(
114 'id' => array(
115 'type' => 'number',
116 ),
117 ),
118 )
119 );
120 }
121
122 /**
123 * Gutenberg Block Callback Function
124 */
125 public function gutenberg_block_callback( $attr ) {
126 if ( isset( $attr['id'] ) ) {
127 $id = $attr['id'];
128 if ( empty( $id ) || $id === 'none' ) {
129 return ''; // no id = no fun
130 }
131 return '[visualizer id="' . $id . '"]';
132 }
133 }
134
135 /**
136 * Hook server side rendering into render callback
137 */
138 public function register_rest_endpoints() {
139 register_rest_field(
140 'visualizer',
141 'chart_data',
142 array(
143 'get_callback' => array( $this, 'get_visualizer_data' ),
144 )
145 );
146
147 register_rest_route(
148 'visualizer/v' . VISUALIZER_REST_VERSION,
149 '/update-chart',
150 array(
151 'methods' => 'POST',
152 'callback' => array( $this, 'update_chart_data' ),
153 'args' => array(
154 'id' => array(
155 'sanitize_callback' => 'absint',
156 ),
157 ),
158 )
159 );
160
161 register_rest_route(
162 'visualizer/v' . VISUALIZER_REST_VERSION,
163 '/upload-data',
164 array(
165 'methods' => 'POST',
166 'callback' => array( $this, 'upload_csv_data' ),
167 'args' => array(
168 'url' => array(
169 'sanitize_callback' => 'esc_url_raw',
170 ),
171 ),
172 )
173 );
174
175 register_rest_route(
176 'visualizer/v' . VISUALIZER_REST_VERSION,
177 '/get-permission-data',
178 array(
179 'methods' => 'GET',
180 'callback' => array( $this, 'get_permission_data' ),
181 'args' => array(
182 'type' => array(
183 'sanitize_callback' => 'sanitize_text_field',
184 ),
185 ),
186 )
187 );
188 }
189
190 /**
191 * Get Post Meta Fields
192 */
193 public function get_visualizer_data( $post ) {
194 $data = array();
195 $post_id = $post['id'];
196
197 $data['visualizer-chart-type'] = get_post_meta( $post_id, Visualizer_Plugin::CF_CHART_TYPE, true );
198
199 $data['visualizer-chart-library'] = get_post_meta( $post_id, Visualizer_Plugin::CF_CHART_LIBRARY, true );
200
201 $data['visualizer-source'] = get_post_meta( $post_id, Visualizer_Plugin::CF_SOURCE, true );
202
203 $data['visualizer-default-data'] = get_post_meta( $post_id, Visualizer_Plugin::CF_DEFAULT_DATA, true );
204
205 // faetch and update settings
206 $data['visualizer-settings'] = get_post_meta( $post_id, Visualizer_Plugin::CF_SETTINGS, true );
207
208 // handle series filter hooks
209 $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'] );
210
211 // handle settings filter hooks
212 $data['visualizer-settings'] = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SETTINGS, $data['visualizer-settings'], $post_id, $data['visualizer-chart-type'] );
213
214 // handle data filter hooks
215 $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'] );
216
217 $import = get_post_meta( $post_id, Visualizer_Plugin::CF_CHART_URL, true );
218
219 $schedule = get_post_meta( $post_id, Visualizer_Plugin::CF_CHART_SCHEDULE, true );
220
221 if ( ! empty( $import ) && ! empty( $schedule ) ) {
222 $data['visualizer-chart-url'] = $import;
223 $data['visualizer-chart-schedule'] = $schedule;
224 }
225
226 if ( Visualizer_Module::is_pro() ) {
227 $permissions = get_post_meta( $post_id, Visualizer_PRO::CF_PERMISSIONS, true );
228
229 if ( ! empty( $permissions ) ) {
230 $data['visualizer-permissions'] = $permissions;
231 }
232 }
233
234 return $data;
235 }
236
237 /**
238 * Rest Callback Method
239 */
240 public function update_chart_data( $data ) {
241 if ( $data['id'] && ! is_wp_error( $data['id'] ) ) {
242
243 update_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_TYPE, $data['visualizer-chart-type'] );
244 update_post_meta( $data['id'], Visualizer_Plugin::CF_SOURCE, $data['visualizer-source'] );
245 update_post_meta( $data['id'], Visualizer_Plugin::CF_DEFAULT_DATA, $data['visualizer-default-data'] );
246 update_post_meta( $data['id'], Visualizer_Plugin::CF_SERIES, $data['visualizer-series'] );
247 update_post_meta( $data['id'], Visualizer_Plugin::CF_SETTINGS, $data['visualizer-settings'] );
248
249 if ( $data['visualizer-chart-url'] && $data['visualizer-chart-schedule'] ) {
250 update_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_URL, $data['visualizer-chart-url'] );
251 apply_filters( 'visualizer_pro_chart_schedule', $data['id'], $data['visualizer-chart-url'], $data['visualizer-chart-schedule'] );
252 } else {
253 delete_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_URL );
254 apply_filters( 'visualizer_pro_remove_schedule', $data['id'] );
255 }
256
257 if ( Visualizer_Module::is_pro() ) {
258 update_post_meta( $data['id'], Visualizer_PRO::CF_PERMISSIONS, $data['visualizer-permissions'] );
259 }
260
261 if ( $data['visualizer-chart-url'] ) {
262 $content['source'] = $data['visualizer-chart-url'];
263 $content['data'] = $this->format_chart_data( $data['visualizer-data'], $data['visualizer-series'] );
264 } else {
265 $content = $this->format_chart_data( $data['visualizer-data'], $data['visualizer-series'] );
266 }
267
268 $chart = array(
269 'ID' => $data['id'],
270 'post_content' => serialize( $content ),
271 );
272
273 wp_update_post( $chart );
274
275 $revisions = wp_get_post_revisions( $data['id'], array( 'order' => 'ASC' ) );
276
277 if ( count( $revisions ) > 1 ) {
278 $revision_ids = array_keys( $revisions );
279
280 // delete all revisions.
281 foreach ( $revision_ids as $id ) {
282 wp_delete_post_revision( $id );
283 }
284 }
285
286 return new \WP_REST_Response( array( 'success' => sprintf( 'Chart updated' ) ) );
287 }
288 }
289
290 /**
291 * Format chart data.
292 */
293 public function format_chart_data( $data, $series ) {
294 foreach ( $series as $i => $row ) {
295 // if no value exists for the seires, then add null
296 if ( ! isset( $series[ $i ] ) ) {
297 $series[ $i ] = null;
298 }
299
300 if ( is_null( $series[ $i ] ) ) {
301 continue;
302 }
303
304 if ( $row['type'] === 'number' ) {
305 foreach ( $data as $o => $col ) {
306 $data[ $o ][ $i ] = ( is_numeric( $col[ $i ] ) ) ? floatval( $col[ $i ] ) : ( is_numeric( str_replace( ',', '', $col[ $i ] ) ) ? floatval( str_replace( ',', '', $col[ $i ] ) ) : null );
307 }
308 }
309
310 if ( $row['type'] === 'boolean' ) {
311 foreach ( $data as $o => $col ) {
312 $data[ $o ][ $i ] = ! empty( $col[ $i ] ) ? filter_validate( $col[ $i ], FILTER_VALIDATE_BOOLEAN ) : null;
313 }
314 }
315
316 if ( $row['type'] === 'timeofday' ) {
317 foreach ( $data as $o => $col ) {
318 $date = new DateTime( '1984-03-16T' . $col[ $i ] );
319 if ( $date ) {
320 $data[ $o ][ $i ] = array(
321 intval( $date->format( 'H' ) ),
322 intval( $date->format( 'i' ) ),
323 intval( $date->format( 's' ) ),
324 0,
325 );
326 }
327 }
328 }
329
330 if ( $row['type'] === 'string' ) {
331 foreach ( $data as $o => $col ) {
332 $data[ $o ][ $i ] = $this->toUTF8( $col[ $i ] );
333 }
334 }
335 }
336
337 return $data;
338 }
339
340 /**
341 * Use toUTF8 function
342 */
343 public function toUTF8( $datum ) {
344 if ( ! function_exists( 'mb_detect_encoding' ) || mb_detect_encoding( $datum ) !== 'ASCII' ) {
345 $datum = \ForceUTF8\Encoding::toUTF8( $datum );
346 }
347 return $datum;
348 }
349
350 /**
351 * Handle remote CSV data
352 */
353 public function upload_csv_data( $data ) {
354 if ( $data['url'] && ! is_wp_error( $data['url'] ) && filter_var( $data['url'], FILTER_VALIDATE_URL ) ) {
355 $source = new Visualizer_Source_Csv_Remote( $data['url'] );
356 if ( $source->fetch() ) {
357 $temp = $source->getData();
358 if ( is_string( $temp ) && is_array( unserialize( $temp ) ) ) {
359 $content['series'] = $source->getSeries();
360 $content['data'] = $source->getRawData();
361 return $content;
362 } else {
363 return new \WP_REST_Response( array( 'failed' => sprintf( 'Invalid CSV URL' ) ) );
364 }
365 } else {
366 return new \WP_REST_Response( array( 'failed' => sprintf( 'Invalid CSV URL' ) ) );
367 }
368 } else {
369 return new \WP_REST_Response( array( 'failed' => sprintf( 'Invalid CSV URL' ) ) );
370 }
371 }
372
373 /**
374 * Get permission data
375 */
376 public function get_permission_data( $data ) {
377 $options = array();
378 switch ( $data['type'] ) {
379 case 'users':
380 $query = new WP_User_Query(
381 array(
382 'number' => 1000,
383 'orderby' => 'display_name',
384 'fields' => array( 'ID', 'display_name' ),
385 'count_total' => false,
386 )
387 );
388 $users = $query->get_results();
389 if ( ! empty( $users ) ) {
390 $i = 0;
391 foreach ( $users as $user ) {
392 $options[ $i ]['value'] = $user->ID;
393 $options[ $i ]['label'] = $user->display_name;
394 $i++;
395 }
396 }
397 break;
398 case 'roles':
399 if ( ! function_exists( 'get_editable_roles' ) ) {
400 require_once ABSPATH . 'wp-admin/includes/user.php';
401 }
402 $roles = get_editable_roles();
403 if ( ! empty( $roles ) ) {
404 $i = 0;
405 foreach ( get_editable_roles() as $name => $info ) {
406 $options[ $i ]['value'] = $name;
407 $options[ $i ]['label'] = $name;
408 $i++;
409 }
410 }
411 break;
412 }
413 return $options;
414 }
415
416 }
417