PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.4.3
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.4.3
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 5.4.3, at classes/controllers/FrmAppController.php

849 lines 23.3 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 /**
19 * @return int
20 */
21 private static function get_menu_position() {
22 return (int) apply_filters( 'frm_menu_position', 29 );
23 }
24
25 /**
26 * @since 3.05
27 */
28 private static function menu_icon() {
29 $icon = FrmAppHelper::svg_logo(
30 array(
31 'fill' => '#a0a5aa',
32 'orange' => '#a0a5aa',
33 )
34 );
35 $icon = 'data:image/svg+xml;base64,' . base64_encode( $icon );
36
37 return apply_filters( 'frm_icon', $icon );
38 }
39
40 /**
41 * @since 3.0
42 */
43 public static function add_admin_class( $classes ) {
44 if ( self::is_white_page() ) {
45 $classes .= ' frm-white-body ';
46 $classes .= self::get_os();
47
48 $page = str_replace( 'formidable-', '', FrmAppHelper::simple_get( 'page', 'sanitize_title' ) );
49 if ( empty( $page ) || $page === 'formidable' ) {
50 $action = FrmAppHelper::simple_get( 'frm_action', 'sanitize_title' );
51 if ( in_array( $action, array( 'settings', 'edit', 'list' ) ) ) {
52 $page .= $action;
53 } else {
54 $page = $action;
55 }
56 }
57 if ( ! empty( $page ) ) {
58 $classes .= ' frm-admin-page-' . $page;
59 }
60 }
61
62 if ( FrmAppHelper::is_full_screen() ) {
63 $classes .= apply_filters( 'frm_admin_full_screen_class', ' frm-full-screen folded' );
64 }
65
66 if ( ! FrmAppHelper::pro_is_installed() ) {
67 $classes .= ' frm-lite ';
68 }
69
70 return $classes;
71 }
72
73 /**
74 * @since 4.0
75 */
76 private static function get_os() {
77 $agent = strtolower( FrmAppHelper::get_server_value( 'HTTP_USER_AGENT' ) );
78 $os = '';
79 if ( strpos( $agent, 'mac' ) !== false ) {
80 $os = ' osx';
81 } elseif ( strpos( $agent, 'linux' ) !== false ) {
82 $os = ' linux';
83 } elseif ( strpos( $agent, 'windows' ) !== false ) {
84 $os = ' windows';
85 }
86 return $os;
87 }
88
89 /**
90 * @since 3.0
91 */
92 private static function is_white_page() {
93 $white_pages = array(
94 'formidable',
95 'formidable-entries',
96 'formidable-views',
97 'formidable-pro-upgrade',
98 'formidable-addons',
99 'formidable-import',
100 'formidable-settings',
101 'formidable-styles',
102 'formidable-styles2',
103 'formidable-inbox',
104 'formidable-welcome',
105 'formidable-applications',
106 );
107
108 $get_page = FrmAppHelper::simple_get( 'page', 'sanitize_title' );
109 $is_white_page = in_array( $get_page, $white_pages, true );
110
111 if ( ! $is_white_page ) {
112 $screen = get_current_screen();
113 $is_white_page = ( $screen && strpos( $screen->id, 'frm_display' ) !== false );
114 }
115
116 /**
117 * Allow another add on to style a page as a Formidable "white page", which adds a white background color.
118 *
119 * @since 5.3
120 *
121 * @param bool $is_white_page
122 */
123 $is_white_page = apply_filters( 'frm_is_white_page', $is_white_page );
124
125 return $is_white_page;
126 }
127
128 public static function load_wp_admin_style() {
129 FrmAppHelper::load_font_style();
130 }
131
132 public static function get_form_nav( $form, $show_nav = false, $title = 'show' ) {
133 $show_nav = FrmAppHelper::get_param( 'show_nav', $show_nav, 'get', 'absint' );
134 if ( empty( $show_nav ) || ! $form ) {
135 return;
136 }
137
138 FrmForm::maybe_get_form( $form );
139 if ( ! is_object( $form ) ) {
140 return;
141 }
142
143 $id = $form->id;
144 $current_page = self::get_current_page();
145 $nav_items = self::get_form_nav_items( $form );
146
147 include( FrmAppHelper::plugin_path() . '/classes/views/shared/form-nav.php' );
148 }
149
150 private static function get_current_page() {
151 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title' );
152 $post_type = FrmAppHelper::simple_get( 'post_type', 'sanitize_title', 'None' );
153 $current_page = isset( $_GET['page'] ) ? $page : $post_type;
154
155 if ( FrmAppHelper::is_view_builder_page() ) {
156 $current_page = 'frm_display';
157 }
158
159 return $current_page;
160 }
161
162 private static function get_form_nav_items( $form ) {
163 $id = $form->parent_form_id ? $form->parent_form_id : $form->id;
164
165 $nav_items = array(
166 array(
167 'link' => FrmForm::get_edit_link( $id ),
168 'label' => __( 'Build', 'formidable' ),
169 'current' => array( 'edit', 'new', 'duplicate' ),
170 'page' => 'formidable',
171 'permission' => 'frm_edit_forms',
172 ),
173 array(
174 'link' => admin_url( 'admin.php?page=formidable&frm_action=settings&id=' . absint( $id ) ),
175 'label' => __( 'Settings', 'formidable' ),
176 'current' => array( 'settings' ),
177 'page' => 'formidable',
178 'permission' => 'frm_edit_forms',
179 ),
180 array(
181 'link' => admin_url( 'admin.php?page=formidable-entries&frm-full=1&frm_action=list&form=' . absint( $id ) ),
182 'label' => __( 'Entries', 'formidable' ),
183 'current' => array(),
184 'page' => 'formidable-entries',
185 'permission' => 'frm_view_entries',
186 ),
187 );
188
189 $views_installed = is_callable( 'FrmProAppHelper::views_is_installed' ) ? FrmProAppHelper::views_is_installed() : FrmAppHelper::pro_is_installed();
190
191 if ( ! $views_installed ) {
192 $nav_items[] = array(
193 'link' => admin_url( 'admin.php?page=formidable-views&frm-full=1&form=' . absint( $id ) ),
194 'label' => __( 'Views', 'formidable' ),
195 'current' => array(),
196 'page' => 'formidable-views',
197 'permission' => 'frm_view_entries',
198 'atts' => array(
199 'class' => 'frm_noallow',
200 ),
201 );
202 }
203
204 // Let people know reports and views exist.
205 if ( ! FrmAppHelper::pro_is_installed() ) {
206 $nav_items[] = array(
207 'link' => admin_url( 'admin.php?page=formidable&frm_action=lite-reports&frm-full=1&form=' . absint( $id ) ),
208 'label' => __( 'Reports', 'formidable' ),
209 'current' => array( 'reports' ),
210 'page' => 'formidable',
211 'permission' => 'frm_view_entries',
212 'atts' => array(
213 'class' => 'frm_noallow',
214 ),
215 );
216 }
217
218 $nav_args = array(
219 'form_id' => $id,
220 'form' => $form,
221 );
222
223 return apply_filters( 'frm_form_nav_list', $nav_items, $nav_args );
224 }
225
226 // Adds a settings link to the plugins page
227 public static function settings_link( $links ) {
228 $settings = array();
229
230 if ( ! FrmAppHelper::pro_is_installed() ) {
231 $settings[] = '<a href="' . esc_url( FrmAppHelper::admin_upgrade_link( 'plugin-row' ) ) . '" target="_blank" rel="noopener"><b>' . esc_html__( 'Upgrade to Pro', 'formidable' ) . '</b></a>';
232 }
233
234 $settings[] = '<a href="' . esc_url( admin_url( 'admin.php?page=formidable' ) ) . '">' . __( 'Build a Form', 'formidable' ) . '</a>';
235
236 return array_merge( $settings, $links );
237 }
238
239 public static function pro_get_started_headline() {
240 self::review_request();
241 FrmAppHelper::min_pro_version_notice( '4.0' );
242 }
243
244 /**
245 * Add admin notices as needed for reviews
246 *
247 * @since 3.04.03
248 */
249 private static function review_request() {
250 $reviews = new FrmReviews();
251 $reviews->review_request();
252 }
253
254 /**
255 * Save the request to hide the review
256 *
257 * @since 3.04.03
258 */
259 public static function dismiss_review() {
260 FrmAppHelper::permission_check( 'frm_change_settings' );
261 check_ajax_referer( 'frm_ajax', 'nonce' );
262
263 $reviews = new FrmReviews();
264 $reviews->dismiss_review();
265 }
266
267 /**
268 * @since 3.04.02
269 */
270 public static function include_upgrade_overlay() {
271 self::enqueue_dialog_assets();
272 add_action( 'admin_footer', 'FrmAppController::upgrade_overlay_html' );
273 }
274
275 /**
276 * Enqueue scripts and styles required for modals.
277 *
278 * @since 5.3
279 *
280 * @return void
281 */
282 public static function enqueue_dialog_assets() {
283 wp_enqueue_script( 'jquery-ui-dialog' );
284 wp_enqueue_style( 'jquery-ui-dialog' );
285 }
286
287 /**
288 * @since 3.06.03
289 */
290 public static function upgrade_overlay_html() {
291 $is_pro = FrmAppHelper::pro_is_installed();
292 $upgrade_link = array(
293 'medium' => 'builder',
294 'content' => 'upgrade',
295 );
296 $default_link = FrmAppHelper::admin_upgrade_link( $upgrade_link );
297 $plugin_path = FrmAppHelper::plugin_path();
298 $shared_path = $plugin_path . '/classes/views/shared/';
299
300 include $shared_path . 'upgrade_overlay.php';
301 include $shared_path . 'confirm-overlay.php';
302
303 if ( FrmAppHelper::is_admin_page( 'formidable-welcome' ) || FrmAppHelper::on_form_listing_page() ) {
304 self::new_form_overlay_html();
305 }
306 }
307
308 private static function new_form_overlay_html() {
309 FrmFormsController::before_list_templates();
310
311 $plugin_path = FrmAppHelper::plugin_path();
312 $path = $plugin_path . '/classes/views/frm-forms/';
313 $expired = FrmFormsController::expired();
314 $expiring = FrmAddonsController::is_license_expiring();
315 $user = wp_get_current_user(); // $user used in leave-email.php to determine a default value for field
316 $view_path = $path . 'new-form-overlay/';
317 $modal_class = '';
318 $upgrade_link = FrmAppHelper::admin_upgrade_link(
319 array(
320 'medium' => 'new-template',
321 'content' => 'upgrade',
322 )
323 );
324 $renew_link = FrmAppHelper::admin_upgrade_link(
325 array(
326 'medium' => 'new-template',
327 'content' => 'renew',
328 )
329 );
330 $blocks_to_render = array();
331
332 if ( ! FrmAppHelper::pro_is_installed() ) {
333 // avoid rendering the email and code blocks for users who have upgraded or have a free license already
334 $api = new FrmFormTemplateApi();
335 if ( ! $api->has_free_access() ) {
336 array_push( $blocks_to_render, 'email', 'code' );
337 }
338 }
339
340 // avoid rendering the upgrade block for users with elite
341 if ( 'elite' !== FrmAddonsController::license_type() ) {
342 $blocks_to_render[] = 'upgrade';
343 }
344
345 // avoid rendering the renew block for users who are not currently expired
346 if ( $expired ) {
347 $blocks_to_render[] = 'renew';
348 $modal_class = 'frm-expired';
349 } elseif ( $expiring ) {
350 $modal_class = 'frm-expiring';
351 }
352
353 include $path . 'new-form-overlay.php';
354 }
355
356 public static function include_info_overlay() {
357 self::enqueue_dialog_assets();
358 add_action( 'admin_footer', 'FrmAppController::info_overlay_html' );
359 }
360
361 public static function info_overlay_html() {
362 include FrmAppHelper::plugin_path() . '/classes/views/shared/info-overlay.php';
363 }
364
365 /**
366 * @since 3.04.02
367 */
368 public static function remove_upsells() {
369 remove_action( 'frm_before_settings', 'FrmSettingsController::license_box' );
370 remove_action( 'frm_after_settings', 'FrmSettingsController::settings_cta' );
371 remove_action( 'frm_add_form_style_tab_options', 'FrmFormsController::add_form_style_tab_options' );
372 remove_action( 'frm_after_field_options', 'FrmFormsController::logic_tip' );
373 }
374
375 /**
376 * If there are CURL problems on this server, wp_remote_post won't work for installing
377 * Use a javascript fallback instead.
378 *
379 * @since 2.0.3
380 */
381 public static function install_js_fallback() {
382 FrmAppHelper::load_admin_wide_js();
383 echo '<div id="hidden frm_install_message"></div><script type="text/javascript">jQuery(document).ready(function(){frm_install_now();});</script>';
384 }
385
386 /**
387 * Check if the database is outdated
388 *
389 * @since 2.0.1
390 * @return boolean
391 */
392 public static function needs_update() {
393 $needs_upgrade = self::compare_for_update(
394 array(
395 'option' => 'frm_db_version',
396 'new_db_version' => FrmAppHelper::$db_version,
397 'new_plugin_version' => FrmAppHelper::plugin_version(),
398 )
399 );
400
401 if ( ! $needs_upgrade ) {
402 $needs_upgrade = apply_filters( 'frm_db_needs_upgrade', $needs_upgrade );
403 }
404
405 return $needs_upgrade;
406 }
407
408 /**
409 * Check both version number and DB number for changes
410 *
411 * @since 3.0.04
412 */
413 public static function compare_for_update( $atts ) {
414 $db_version = get_option( $atts['option'] );
415
416 if ( strpos( $db_version, '-' ) === false ) {
417 $needs_upgrade = true;
418 } else {
419 $last_upgrade = explode( '-', $db_version );
420 $needs_db_upgrade = (int) $last_upgrade[1] < (int) $atts['new_db_version'];
421 $new_version = version_compare( $last_upgrade[0], $atts['new_plugin_version'], '<' );
422 $needs_upgrade = $needs_db_upgrade || $new_version;
423 }
424
425 return $needs_upgrade;
426 }
427
428 /**
429 * Check for database update and trigger js loading
430 *
431 * @since 2.0.1
432 */
433 public static function admin_init() {
434 if ( FrmAppHelper::is_admin_page( 'formidable' ) && 'duplicate' === FrmAppHelper::get_param( 'frm_action' ) ) {
435 FrmFormsController::duplicate();
436 }
437
438 new FrmPersonalData(); // register personal data hooks
439
440 if ( ! FrmAppHelper::doing_ajax() && self::needs_update() ) {
441 self::network_upgrade_site();
442 }
443
444 if ( ! FrmAppHelper::doing_ajax() ) {
445 // don't continue during ajax calls
446 self::admin_js();
447 }
448
449 if ( FrmAppHelper::is_admin_page( 'formidable' ) ) {
450 $action = FrmAppHelper::get_param( 'frm_action' );
451
452 if ( in_array( $action, array( 'add_new', 'list_templates' ), true ) ) {
453 wp_safe_redirect( admin_url( 'admin.php?page=formidable&triggerNewFormModal=1' ) );
454 exit;
455 }
456
457 FrmInbox::maybe_disable_screen_options();
458 }
459 }
460
461 /**
462 * @return void
463 */
464 public static function admin_js() {
465 $plugin_url = FrmAppHelper::plugin_url();
466 $version = FrmAppHelper::plugin_version();
467
468 FrmAppHelper::load_admin_wide_js();
469
470 wp_register_style( 'formidable_admin_global', $plugin_url . '/css/admin/frm_admin_global.css', array(), $version );
471 wp_enqueue_style( 'formidable_admin_global' );
472
473 wp_register_style( 'formidable-admin', $plugin_url . '/css/frm_admin.css', array(), $version );
474 wp_register_style( 'formidable-grids', $plugin_url . '/css/frm_grids.css', array(), $version );
475
476 wp_register_script( 'formidable_dom', $plugin_url . '/js/admin/dom.js', array( 'jquery', 'jquery-ui-dialog', 'wp-i18n' ), $version, true );
477 wp_register_script( 'formidable_embed', $plugin_url . '/js/admin/embed.js', array( 'formidable_dom', 'jquery-ui-autocomplete' ), $version, true );
478 self::register_popper1();
479 wp_register_script( 'bootstrap_tooltip', $plugin_url . '/js/bootstrap.min.js', array( 'jquery', 'popper' ), '4.6.1', true );
480
481 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title' );
482
483 if ( 'formidable-applications' === $page ) {
484 FrmApplicationsController::load_assets();
485 return;
486 }
487
488 $dependencies = array(
489 'formidable_admin_global',
490 'jquery',
491 'jquery-ui-core',
492 'jquery-ui-draggable',
493 'jquery-ui-sortable',
494 'bootstrap_tooltip',
495 'bootstrap-multiselect',
496 'wp-i18n',
497 'formidable_dom',
498 'formidable_embed',
499 );
500
501 if ( FrmAppHelper::is_admin_page( 'formidable-styles' ) || FrmAppHelper::is_admin_page( 'formidable-styles2' ) ) {
502 $dependencies[] = 'wp-color-picker';
503 }
504
505 wp_register_script( 'formidable_admin', $plugin_url . '/js/formidable_admin.js', $dependencies, $version, true );
506
507 if ( FrmAppHelper::on_form_listing_page() ) {
508 // For the existing page dropdown in the Form embed modal.
509 wp_enqueue_script( 'jquery-ui-autocomplete' );
510 }
511
512 wp_register_script( 'bootstrap-multiselect', $plugin_url . '/js/bootstrap-multiselect.js', array( 'jquery', 'bootstrap_tooltip', 'popper' ), '1.1.1', true );
513
514 $post_type = FrmAppHelper::simple_get( 'post_type', 'sanitize_title' );
515
516 global $pagenow;
517 if ( strpos( $page, 'formidable' ) === 0 || ( $pagenow === 'edit.php' && $post_type === 'frm_display' ) ) {
518
519 wp_enqueue_script( 'admin-widgets' );
520 wp_enqueue_style( 'widgets' );
521 self::maybe_deregister_popper2();
522 wp_enqueue_script( 'formidable_admin' );
523 wp_enqueue_script( 'formidable_embed' );
524 FrmAppHelper::localize_script( 'admin' );
525
526 wp_enqueue_style( 'formidable-admin' );
527 if ( 'formidable-styles' !== $page && 'formidable-styles2' !== $page ) {
528 wp_enqueue_style( 'formidable-grids' );
529 wp_enqueue_style( 'formidable-dropzone' );
530 } else {
531 wp_enqueue_style( 'formidable-grids' );
532 }
533
534 if ( 'formidable-entries' === $page ) {
535 // Load front end js for entries.
536 wp_enqueue_script( 'formidable' );
537 }
538
539 do_action( 'frm_enqueue_builder_scripts' );
540 self::include_upgrade_overlay();
541 self::include_info_overlay();
542 } elseif ( FrmAppHelper::is_view_builder_page() ) {
543 if ( isset( $_REQUEST['post_type'] ) ) {
544 $post_type = sanitize_title( wp_unslash( $_REQUEST['post_type'] ) );
545 } elseif ( isset( $_REQUEST['post'] ) && absint( $_REQUEST['post'] ) ) {
546 $post = get_post( absint( wp_unslash( $_REQUEST['post'] ) ) );
547 if ( ! $post ) {
548 return;
549 }
550 $post_type = $post->post_type;
551 } else {
552 return;
553 }
554
555 if ( $post_type === 'frm_display' ) {
556 wp_enqueue_style( 'formidable-grids' );
557 wp_enqueue_script( 'jquery-ui-draggable' );
558 self::maybe_deregister_popper2();
559 wp_enqueue_script( 'formidable_admin' );
560 wp_enqueue_style( 'formidable-admin' );
561 FrmAppHelper::localize_script( 'admin' );
562 self::include_info_overlay();
563 }
564 }
565
566 self::maybe_force_formidable_block_on_gutenberg_page();
567 }
568
569 /**
570 * Fix a Duplicator Pro conflict because it uses Popper 2. See issue #3459.
571 *
572 * @since 5.2.02.01
573 *
574 * @return void
575 */
576 private static function maybe_deregister_popper2() {
577 global $wp_scripts;
578
579 if ( ! array_key_exists( 'popper', $wp_scripts->registered ) ) {
580 return;
581 }
582
583 $popper = $wp_scripts->registered['popper'];
584 if ( version_compare( $popper->ver, '2.0', '>=' ) ) {
585 wp_deregister_script( 'popper' );
586 self::register_popper1();
587 }
588 }
589
590 /**
591 * Register Popper required for Bootstrap 4.
592 *
593 * @since 5.2.02.01
594 *
595 * @return void
596 */
597 private static function register_popper1() {
598 wp_register_script( 'popper', FrmAppHelper::plugin_url() . '/js/popper.min.js', array( 'jquery' ), '1.16.0', true );
599 }
600
601 /**
602 * Automatically insert a Formidable block when loading Gutenberg when $_GET['frmForm' is set.
603 *
604 * @since 5.2
605 *
606 * @return void
607 */
608 private static function maybe_force_formidable_block_on_gutenberg_page() {
609 global $pagenow;
610 if ( 'post.php' !== $pagenow ) {
611 return;
612 }
613
614 $form_id = FrmAppHelper::simple_get( 'frmForm', 'absint' );
615 if ( ! $form_id ) {
616 return;
617 }
618
619 self::add_js_to_inject_gutenberg_block( 'formidable/simple-form', 'formId', $form_id );
620 }
621
622 /**
623 * @since 5.3
624 *
625 * @return void
626 */
627 public static function add_js_to_inject_gutenberg_block( $block_name, $object_key, $object_id ) {
628 require FrmAppHelper::plugin_path() . '/classes/views/shared/edit-page-js.php';
629 }
630
631 public static function load_lang() {
632 load_plugin_textdomain( 'formidable', false, FrmAppHelper::plugin_folder() . '/languages/' );
633 }
634
635 /**
636 * Check if the styles are updated when a form is loaded on the front-end
637 *
638 * @since 3.0.1
639 */
640 public static function maybe_update_styles() {
641 if ( self::needs_update() ) {
642 self::network_upgrade_site();
643 }
644 }
645
646 /**
647 * @since 3.0
648 */
649 public static function create_rest_routes() {
650 $args = array(
651 'methods' => 'GET',
652 'callback' => 'FrmAppController::api_install',
653 'permission_callback' => __CLASS__ . '::can_update_db',
654 );
655
656 register_rest_route( 'frm-admin/v1', '/install', $args );
657
658 $args = array(
659 'methods' => 'GET',
660 'callback' => 'FrmAddonsController::install_addon_api',
661 'permission_callback' => 'FrmAddonsController::can_install_addon_api',
662 );
663
664 register_rest_route( 'frm-admin/v1', '/install-addon', $args );
665 }
666
667 /**
668 * Make sure the install is only being run when we tell it to.
669 * We don't want to run manually by people calling the API.
670 *
671 * @since 4.06.02
672 */
673 public static function can_update_db() {
674 return get_transient( 'frm_updating_api' );
675 }
676
677 /**
678 * Run silent upgrade on each site in the network during a network upgrade.
679 * Update database settings for all sites in a network during network upgrade process.
680 *
681 * @since 2.0.1
682 *
683 * @param int $blog_id Blog ID.
684 */
685 public static function network_upgrade_site( $blog_id = 0 ) {
686 // Flag to check if install is happening as intended.
687 set_transient( 'frm_updating_api', true, MINUTE_IN_SECONDS );
688 $request = new WP_REST_Request( 'GET', '/frm-admin/v1/install' );
689
690 self::maybe_add_wp_site_health();
691
692 if ( $blog_id ) {
693 switch_to_blog( $blog_id );
694 $response = rest_do_request( $request );
695 restore_current_blog();
696 } else {
697 $response = rest_do_request( $request );
698 }
699
700 if ( $response->is_error() ) {
701 // if the remove post fails, use javascript instead
702 add_action( 'admin_notices', 'FrmAppController::install_js_fallback' );
703 }
704 }
705
706 /**
707 * Make sure WP_Site_Health has been included because it is required when calling rest_do_request.
708 * Check first that the file exists because WP_Site_Health was only introduced in WordPress 5.2.
709 */
710 private static function maybe_add_wp_site_health() {
711 if ( ! class_exists( 'WP_Site_Health' ) ) {
712 $wp_site_health_path = ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
713 if ( file_exists( $wp_site_health_path ) ) {
714 require_once $wp_site_health_path;
715 }
716 }
717 }
718
719 /**
720 * @since 3.0
721 */
722 public static function api_install() {
723 delete_transient( 'frm_updating_api' );
724 if ( self::needs_update() ) {
725 $running = get_option( 'frm_install_running' );
726 if ( false === $running || $running < strtotime( '-5 minutes' ) ) {
727 update_option( 'frm_install_running', time(), 'no' );
728 self::install();
729 delete_option( 'frm_install_running' );
730 }
731 }
732
733 return true;
734 }
735
736 /**
737 * Silent database upgrade (no redirect).
738 * Called via ajax request during network upgrade process.
739 *
740 * @since 2.0.1
741 */
742 public static function ajax_install() {
743 self::api_install();
744 wp_die();
745 }
746
747 public static function install() {
748 $frmdb = new FrmMigrate();
749 $frmdb->upgrade();
750 }
751
752 public static function uninstall() {
753 FrmAppHelper::permission_check( 'administrator' );
754 check_ajax_referer( 'frm_ajax', 'nonce' );
755
756 $frmdb = new FrmMigrate();
757 $frmdb->uninstall();
758
759 //disable the plugin and redirect after uninstall so the tables don't get added right back
760 $plugins = array( FrmAppHelper::plugin_folder() . '/formidable.php', 'formidable-pro/formidable-pro.php' );
761 deactivate_plugins( $plugins, false, false );
762 echo esc_url_raw( admin_url( 'plugins.php?deactivate=true' ) );
763
764 wp_die();
765 }
766
767 public static function drop_tables( $tables ) {
768 global $wpdb;
769 $tables[] = $wpdb->prefix . 'frm_fields';
770 $tables[] = $wpdb->prefix . 'frm_forms';
771 $tables[] = $wpdb->prefix . 'frm_items';
772 $tables[] = $wpdb->prefix . 'frm_item_metas';
773
774 return $tables;
775 }
776
777 public static function deauthorize() {
778 FrmAppHelper::permission_check( 'frm_change_settings' );
779 check_ajax_referer( 'frm_ajax', 'nonce' );
780
781 delete_option( 'frmpro-credentials' );
782 delete_option( 'frmpro-authorized' );
783 delete_site_option( 'frmpro-credentials' );
784 delete_site_option( 'frmpro-authorized' );
785 wp_die();
786 }
787
788 public static function set_footer_text( $text ) {
789 if ( FrmAppHelper::is_formidable_admin() ) {
790 $text = '';
791 }
792
793 return $text;
794 }
795
796 /**
797 * @deprecated 1.07.05
798 * @codeCoverageIgnore
799 */
800 public static function get_form_shortcode( $atts ) {
801 return FrmDeprecated::get_form_shortcode( $atts );
802 }
803
804 /**
805 * @deprecated 2.5.4
806 * @codeCoverageIgnore
807 */
808 public static function widget_text_filter( $content ) {
809 return FrmDeprecated::widget_text_filter( $content );
810 }
811
812 /**
813 * Deprecated in favor of wpmu_upgrade_site
814 *
815 * @deprecated 2.3
816 * @codeCoverageIgnore
817 */
818 public static function front_head() {
819 FrmDeprecated::front_head();
820 }
821
822 /**
823 * @deprecated 3.0.04
824 * @codeCoverageIgnore
825 */
826 public static function activation_install() {
827 FrmDeprecated::activation_install();
828 }
829
830 /**
831 * @deprecated 3.0
832 * @codeCoverageIgnore
833 */
834 public static function page_route( $content ) {
835 return FrmDeprecated::page_route( $content );
836 }
837
838 /**
839 * Include icons on page for Embed Form modal.
840 *
841 * @since 5.2
842 *
843 * @return void
844 */
845 public static function include_embed_form_icons() {
846 _deprecated_function( __METHOD__, '5.3' );
847 }
848 }
849