PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 4.08
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v4.08
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
formidable / classes / controllers / FrmAppController.php

FrmAppController.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 4.08, at classes/controllers/FrmAppController.php

630 lines 17.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 class FrmAppController {
7
8 public static function menu() {
9 FrmAppHelper::maybe_add_permissions();
10 if ( ! current_user_can( 'frm_view_forms' ) ) {
11 return;
12 }
13
14 $menu_name = FrmAppHelper::get_menu_name();
15 add_menu_page( 'Formidable', $menu_name, 'frm_view_forms', 'formidable', 'FrmFormsController::route', self::menu_icon(), self::get_menu_position() );
16 }
17
18 private static function get_menu_position() {
19 return apply_filters( 'frm_menu_position', '29.3' );
20 }
21
22 /**
23 * @since 3.05
24 */
25 private static function menu_icon() {
26 $icon = FrmAppHelper::svg_logo(
27 array(
28 'fill' => '#a0a5aa',
29 'orange' => '#a0a5aa',
30 )
31 );
32 $icon = 'data:image/svg+xml;base64,' . base64_encode( $icon );
33
34 return apply_filters( 'frm_icon', $icon );
35 }
36
37 /**
38 * @since 3.0
39 */
40 public static function add_admin_class( $classes ) {
41 if ( self::is_white_page() ) {
42 $classes .= ' frm-white-body ';
43 $classes .= self::get_os();
44
45 $page = str_replace( 'formidable-', '', FrmAppHelper::simple_get( 'page', 'sanitize_title' ) );
46 if ( empty( $page ) || $page === 'formidable' ) {
47 $action = FrmAppHelper::simple_get( 'frm_action', 'sanitize_title' );
48 if ( in_array( $action, array( 'settings', 'edit', 'list' ) ) ) {
49 $page .= $action;
50 } else {
51 $page = $action;
52 }
53 }
54 if ( ! empty( $page ) ) {
55 $classes .= ' frm-admin-page-' . $page;
56 }
57 }
58
59 if ( FrmAppHelper::is_full_screen() ) {
60 $classes .= apply_filters( 'frm_admin_full_screen_class', ' frm-full-screen folded' );
61 }
62
63 return $classes;
64 }
65
66 /**
67 * @since 4.0
68 */
69 private static function get_os() {
70 $agent = strtolower( FrmAppHelper::get_server_value( 'HTTP_USER_AGENT' ) );
71 $os = '';
72 if ( strpos( $agent, 'mac' ) !== false ) {
73 $os = ' osx';
74 } elseif ( strpos( $agent, 'linux' ) !== false ) {
75 $os = ' linux';
76 } elseif ( strpos( $agent, 'windows' ) !== false ) {
77 $os = ' windows';
78 }
79 return $os;
80 }
81
82 /**
83 * @since 3.0
84 */
85 private static function is_white_page() {
86 $white_pages = array(
87 'formidable',
88 'formidable-entries',
89 'formidable-views',
90 'formidable-pro-upgrade',
91 'formidable-addons',
92 'formidable-import',
93 'formidable-settings',
94 'formidable-styles',
95 'formidable-styles2',
96 'formidable-inbox',
97 );
98
99 $get_page = FrmAppHelper::simple_get( 'page', 'sanitize_title' );
100 $is_white_page = in_array( $get_page, $white_pages );
101
102 if ( ! $is_white_page ) {
103 $screen = get_current_screen();
104 $is_white_page = ( $screen && strpos( $screen->id, 'frm_display' ) !== false );
105 }
106
107 return $is_white_page;
108 }
109
110 public static function load_wp_admin_style() {
111 FrmAppHelper::load_font_style();
112 }
113
114 public static function get_form_nav( $form, $show_nav = false, $title = 'show' ) {
115 $show_nav = FrmAppHelper::get_param( 'show_nav', $show_nav, 'get', 'absint' );
116 if ( empty( $show_nav ) || ! $form ) {
117 return;
118 }
119
120 FrmForm::maybe_get_form( $form );
121 if ( ! is_object( $form ) ) {
122 return;
123 }
124
125 $id = $form->id;
126 $current_page = self::get_current_page();
127 $nav_items = self::get_form_nav_items( $form );
128
129 include( FrmAppHelper::plugin_path() . '/classes/views/shared/form-nav.php' );
130 }
131
132 private static function get_current_page() {
133 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title' );
134 $post_type = FrmAppHelper::simple_get( 'post_type', 'sanitize_title', 'None' );
135 $current_page = isset( $_GET['page'] ) ? $page : $post_type;
136
137 if ( FrmAppHelper::is_view_builder_page() ) {
138 $current_page = 'frm_display';
139 }
140
141 return $current_page;
142 }
143
144 private static function get_form_nav_items( $form ) {
145 $id = $form->parent_form_id ? $form->parent_form_id : $form->id;
146
147 $nav_items = array(
148 array(
149 'link' => FrmForm::get_edit_link( $id ),
150 'label' => __( 'Build', 'formidable' ),
151 'current' => array( 'edit', 'new', 'duplicate' ),
152 'page' => 'formidable',
153 'permission' => 'frm_edit_forms',
154 ),
155 array(
156 'link' => admin_url( 'admin.php?page=formidable&frm_action=settings&id=' . absint( $id ) ),
157 'label' => __( 'Settings', 'formidable' ),
158 'current' => array( 'settings' ),
159 'page' => 'formidable',
160 'permission' => 'frm_edit_forms',
161 ),
162 array(
163 'link' => admin_url( 'admin.php?page=formidable-entries&frm-full=1&frm_action=list&form=' . absint( $id ) ),
164 'label' => __( 'Entries', 'formidable' ),
165 'current' => array(),
166 'page' => 'formidable-entries',
167 'permission' => 'frm_view_entries',
168 ),
169 );
170
171 // Let people know reports and views exist.
172 if ( ! FrmAppHelper::pro_is_installed() ) {
173 $nav_items[] = array(
174 'link' => admin_url( 'admin.php?page=formidable-views&frm-full=1&form=' . absint( $id ) ),
175 'label' => __( 'Views', 'formidable' ),
176 'current' => array(),
177 'page' => 'formidable-views',
178 'permission' => 'frm_view_entries',
179 'atts' => array(
180 'class' => 'frm_noallow',
181 ),
182 );
183 $nav_items[] = array(
184 'link' => admin_url( 'admin.php?page=formidable&frm_action=lite-reports&frm-full=1&form=' . absint( $id ) ),
185 'label' => __( 'Reports', 'formidable' ),
186 'current' => array( 'reports' ),
187 'page' => 'formidable',
188 'permission' => 'frm_view_entries',
189 'atts' => array(
190 'class' => 'frm_noallow',
191 ),
192 );
193 }
194
195 $nav_args = array(
196 'form_id' => $id,
197 'form' => $form,
198 );
199
200 return apply_filters( 'frm_form_nav_list', $nav_items, $nav_args );
201 }
202
203 // Adds a settings link to the plugins page
204 public static function settings_link( $links ) {
205 $settings = '<a href="' . esc_url( admin_url( 'admin.php?page=formidable' ) ) . '">' . __( 'Build a Form', 'formidable' ) . '</a>';
206 array_unshift( $links, $settings );
207
208 return $links;
209 }
210
211 public static function pro_get_started_headline() {
212 self::review_request();
213 FrmAppHelper::min_pro_version_notice( '4.0' );
214 }
215
216 /**
217 * Add admin notices as needed for reviews
218 *
219 * @since 3.04.03
220 */
221 private static function review_request() {
222 $reviews = new FrmReviews();
223 $reviews->review_request();
224 }
225
226 /**
227 * Save the request to hide the review
228 *
229 * @since 3.04.03
230 */
231 public static function dismiss_review() {
232 FrmAppHelper::permission_check( 'frm_change_settings' );
233 check_ajax_referer( 'frm_ajax', 'nonce' );
234
235 $reviews = new FrmReviews();
236 $reviews->dismiss_review();
237 }
238
239 /**
240 * @since 3.04.02
241 */
242 public static function include_upgrade_overlay() {
243 wp_enqueue_script( 'jquery-ui-dialog' );
244 wp_enqueue_style( 'jquery-ui-dialog' );
245
246 add_action( 'admin_footer', 'FrmAppController::upgrade_overlay_html' );
247 }
248
249 /**
250 * @since 3.06.03
251 */
252 public static function upgrade_overlay_html() {
253 $is_pro = FrmAppHelper::pro_is_installed();
254 $upgrade_link = array(
255 'medium' => 'builder',
256 'content' => 'upgrade',
257 );
258 $default_link = FrmAppHelper::admin_upgrade_link( $upgrade_link );
259
260 include( FrmAppHelper::plugin_path() . '/classes/views/shared/upgrade_overlay.php' );
261
262 include( FrmAppHelper::plugin_path() . '/classes/views/shared/confirm-overlay.php' );
263 }
264
265 public static function include_info_overlay() {
266 wp_enqueue_script( 'jquery-ui-dialog' );
267 wp_enqueue_style( 'jquery-ui-dialog' );
268
269 add_action( 'admin_footer', 'FrmAppController::info_overlay_html' );
270 }
271
272 public static function info_overlay_html() {
273 include( FrmAppHelper::plugin_path() . '/classes/views/shared/info-overlay.php' );
274 }
275
276 /**
277 * @since 3.04.02
278 */
279 public static function remove_upsells() {
280 remove_action( 'frm_before_settings', 'FrmSettingsController::license_box' );
281 remove_action( 'frm_after_settings', 'FrmSettingsController::settings_cta' );
282 remove_action( 'frm_add_form_style_tab_options', 'FrmFormsController::add_form_style_tab_options' );
283 remove_action( 'frm_after_field_options', 'FrmFormsController::logic_tip' );
284 }
285
286 /**
287 * If there are CURL problems on this server, wp_remote_post won't work for installing
288 * Use a javascript fallback instead.
289 *
290 * @since 2.0.3
291 */
292 public static function install_js_fallback() {
293 FrmAppHelper::load_admin_wide_js();
294 echo '<div id="hidden frm_install_message"></div><script type="text/javascript">jQuery(document).ready(function(){frm_install_now();});</script>';
295 }
296
297 /**
298 * Check if the database is outdated
299 *
300 * @since 2.0.1
301 * @return boolean
302 */
303 public static function needs_update() {
304 $needs_upgrade = self::compare_for_update(
305 array(
306 'option' => 'frm_db_version',
307 'new_db_version' => FrmAppHelper::$db_version,
308 'new_plugin_version' => FrmAppHelper::plugin_version(),
309 )
310 );
311
312 if ( ! $needs_upgrade ) {
313 $needs_upgrade = apply_filters( 'frm_db_needs_upgrade', $needs_upgrade );
314 }
315
316 return $needs_upgrade;
317 }
318
319 /**
320 * Check both version number and DB number for changes
321 *
322 * @since 3.0.04
323 */
324 public static function compare_for_update( $atts ) {
325 $db_version = get_option( $atts['option'] );
326
327 if ( strpos( $db_version, '-' ) === false ) {
328 $needs_upgrade = true;
329 } else {
330 $last_upgrade = explode( '-', $db_version );
331 $needs_db_upgrade = (int) $last_upgrade[1] < (int) $atts['new_db_version'];
332 $new_version = version_compare( $last_upgrade[0], $atts['new_plugin_version'], '<' );
333 $needs_upgrade = $needs_db_upgrade || $new_version;
334 }
335
336 return $needs_upgrade;
337 }
338
339 /**
340 * Check for database update and trigger js loading
341 *
342 * @since 2.0.1
343 */
344 public static function admin_init() {
345 new FrmPersonalData(); // register personal data hooks
346
347 if ( ! FrmAppHelper::doing_ajax() && self::needs_update() ) {
348 self::network_upgrade_site();
349 }
350
351 if ( ! FrmAppHelper::doing_ajax() ) {
352 // don't continue during ajax calls
353 self::admin_js();
354 }
355 }
356
357 public static function admin_js() {
358 $version = FrmAppHelper::plugin_version();
359 FrmAppHelper::load_admin_wide_js();
360
361 $dependecies = array(
362 'formidable_admin_global',
363 'jquery',
364 'jquery-ui-core',
365 'jquery-ui-draggable',
366 'jquery-ui-sortable',
367 'bootstrap_tooltip',
368 'bootstrap-multiselect',
369 );
370
371 if ( FrmAppHelper::is_admin_page( 'formidable-styles' ) || FrmAppHelper::is_admin_page( 'formidable-styles2' ) ) {
372 $dependecies[] = 'wp-color-picker';
373 }
374
375 wp_register_script( 'formidable_admin', FrmAppHelper::plugin_url() . '/js/formidable_admin.js', $dependecies, $version, true );
376 wp_register_style( 'formidable-admin', FrmAppHelper::plugin_url() . '/css/frm_admin.css', array(), $version );
377 wp_register_script( 'bootstrap_tooltip', FrmAppHelper::plugin_url() . '/js/bootstrap.min.js', array( 'jquery' ), '3.3.4' );
378 wp_register_style( 'formidable-grids', FrmAppHelper::plugin_url() . '/css/frm_grids.css', array(), $version );
379
380 // load multselect js
381 $depends_on = array( 'jquery', 'bootstrap_tooltip' );
382 wp_register_script( 'bootstrap-multiselect', FrmAppHelper::plugin_url() . '/js/bootstrap-multiselect.js', $depends_on, '0.9.8', true );
383
384 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title' );
385 $post_type = FrmAppHelper::simple_get( 'post_type', 'sanitize_title' );
386
387 global $pagenow;
388 if ( strpos( $page, 'formidable' ) === 0 || ( $pagenow == 'edit.php' && $post_type == 'frm_display' ) ) {
389
390 wp_enqueue_script( 'admin-widgets' );
391 wp_enqueue_style( 'widgets' );
392 wp_enqueue_script( 'formidable_admin' );
393 FrmAppHelper::localize_script( 'admin' );
394
395 wp_enqueue_style( 'formidable-admin' );
396 if ( 'formidable-styles' !== $page && 'formidable-styles2' !== $page ) {
397 wp_enqueue_style( 'formidable-grids' );
398 wp_enqueue_style( 'formidable-dropzone' );
399 } else {
400 $settings = FrmAppHelper::get_settings();
401 if ( empty( $settings->old_css ) ) {
402 wp_enqueue_style( 'formidable-grids' );
403 }
404 }
405
406 if ( 'formidable-entries' === $page ) {
407 // Load front end js for entries.
408 wp_enqueue_script( 'formidable' );
409 }
410
411 do_action( 'frm_enqueue_builder_scripts' );
412 self::include_upgrade_overlay();
413 self::include_info_overlay();
414 } elseif ( FrmAppHelper::is_view_builder_page() ) {
415 if ( isset( $_REQUEST['post_type'] ) ) {
416 $post_type = sanitize_title( wp_unslash( $_REQUEST['post_type'] ) );
417 } elseif ( isset( $_REQUEST['post'] ) && absint( $_REQUEST['post'] ) ) {
418 $post = get_post( absint( wp_unslash( $_REQUEST['post'] ) ) );
419 if ( ! $post ) {
420 return;
421 }
422 $post_type = $post->post_type;
423 } else {
424 return;
425 }
426
427 if ( $post_type == 'frm_display' ) {
428 wp_enqueue_style( 'formidable-grids' );
429 wp_enqueue_script( 'jquery-ui-draggable' );
430 wp_enqueue_script( 'formidable_admin' );
431 wp_enqueue_style( 'formidable-admin' );
432 FrmAppHelper::localize_script( 'admin' );
433 self::include_info_overlay();
434 }
435 }
436 }
437
438 public static function load_lang() {
439 load_plugin_textdomain( 'formidable', false, FrmAppHelper::plugin_folder() . '/languages/' );
440 }
441
442 /**
443 * Check if the styles are updated when a form is loaded on the front-end
444 *
445 * @since 3.0.1
446 */
447 public static function maybe_update_styles() {
448 if ( self::needs_update() ) {
449 self::network_upgrade_site();
450 }
451 }
452
453 /**
454 * @since 3.0
455 */
456 public static function create_rest_routes() {
457 $args = array(
458 'methods' => 'GET',
459 'callback' => 'FrmAppController::api_install',
460 'permission_callback' => __CLASS__ . '::can_update_db',
461 );
462
463 register_rest_route( 'frm-admin/v1', '/install', $args );
464
465 $args = array(
466 'methods' => 'GET',
467 'callback' => 'FrmAddonsController::install_addon_api',
468 'permission_callback' => 'FrmAddonsController::can_install_addon_api',
469 );
470
471 register_rest_route( 'frm-admin/v1', '/install-addon', $args );
472 }
473
474 /**
475 * Make sure the install is only being run when we tell it to.
476 * We don't want to run manually by people calling the API.
477 *
478 * @since 4.06.02
479 */
480 public static function can_update_db() {
481 return get_transient( 'frm_updating_api' );
482 }
483
484 /**
485 * Run silent upgrade on each site in the network during a network upgrade.
486 * Update database settings for all sites in a network during network upgrade process.
487 *
488 * @since 2.0.1
489 *
490 * @param int $blog_id Blog ID.
491 */
492 public static function network_upgrade_site( $blog_id = 0 ) {
493 // Flag to check if install is happening as intended.
494 set_transient( 'frm_updating_api', true, MINUTE_IN_SECONDS );
495 $request = new WP_REST_Request( 'GET', '/frm-admin/v1/install' );
496
497 if ( $blog_id ) {
498 switch_to_blog( $blog_id );
499 $response = rest_do_request( $request );
500 restore_current_blog();
501 } else {
502 $response = rest_do_request( $request );
503 }
504
505 if ( $response->is_error() ) {
506 // if the remove post fails, use javascript instead
507 add_action( 'admin_notices', 'FrmAppController::install_js_fallback' );
508 }
509 }
510
511 /**
512 * @since 3.0
513 */
514 public static function api_install() {
515 delete_transient( 'frm_updating_api' );
516 if ( self::needs_update() ) {
517 $running = get_option( 'frm_install_running' );
518 if ( false === $running || $running < strtotime( '-5 minutes' ) ) {
519 update_option( 'frm_install_running', time(), 'no' );
520 self::install();
521 delete_option( 'frm_install_running' );
522 }
523 }
524
525 return true;
526 }
527
528 /**
529 * Silent database upgrade (no redirect).
530 * Called via ajax request during network upgrade process.
531 *
532 * @since 2.0.1
533 */
534 public static function ajax_install() {
535 self::api_install();
536 wp_die();
537 }
538
539 public static function install() {
540 $frmdb = new FrmMigrate();
541 $frmdb->upgrade();
542 }
543
544 public static function uninstall() {
545 FrmAppHelper::permission_check( 'administrator' );
546 check_ajax_referer( 'frm_ajax', 'nonce' );
547
548 $frmdb = new FrmMigrate();
549 $frmdb->uninstall();
550
551 //disable the plugin and redirect after uninstall so the tables don't get added right back
552 $plugins = array( FrmAppHelper::plugin_folder() . '/formidable.php', 'formidable-pro/formidable-pro.php' );
553 deactivate_plugins( $plugins, false, false );
554 echo esc_url_raw( admin_url( 'plugins.php?deactivate=true' ) );
555
556 wp_die();
557 }
558
559 public static function drop_tables( $tables ) {
560 global $wpdb;
561 $tables[] = $wpdb->prefix . 'frm_fields';
562 $tables[] = $wpdb->prefix . 'frm_forms';
563 $tables[] = $wpdb->prefix . 'frm_items';
564 $tables[] = $wpdb->prefix . 'frm_item_metas';
565
566 return $tables;
567 }
568
569 public static function deauthorize() {
570 FrmAppHelper::permission_check( 'frm_change_settings' );
571 check_ajax_referer( 'frm_ajax', 'nonce' );
572
573 delete_option( 'frmpro-credentials' );
574 delete_option( 'frmpro-authorized' );
575 delete_site_option( 'frmpro-credentials' );
576 delete_site_option( 'frmpro-authorized' );
577 wp_die();
578 }
579
580 public static function set_footer_text( $text ) {
581 if ( FrmAppHelper::is_formidable_admin() ) {
582 $text = '';
583 }
584
585 return $text;
586 }
587
588 /**
589 * @deprecated 1.07.05
590 * @codeCoverageIgnore
591 */
592 public static function get_form_shortcode( $atts ) {
593 return FrmDeprecated::get_form_shortcode( $atts );
594 }
595
596 /**
597 * @deprecated 2.5.4
598 * @codeCoverageIgnore
599 */
600 public static function widget_text_filter( $content ) {
601 return FrmDeprecated::widget_text_filter( $content );
602 }
603
604 /**
605 * Deprecated in favor of wpmu_upgrade_site
606 *
607 * @deprecated 2.3
608 * @codeCoverageIgnore
609 */
610 public static function front_head() {
611 FrmDeprecated::front_head();
612 }
613
614 /**
615 * @deprecated 3.0.04
616 * @codeCoverageIgnore
617 */
618 public static function activation_install() {
619 FrmDeprecated::activation_install();
620 }
621
622 /**
623 * @deprecated 3.0
624 * @codeCoverageIgnore
625 */
626 public static function page_route( $content ) {
627 return FrmDeprecated::page_route( $content );
628 }
629 }
630