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

850 lines 23.4 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 'wp-hooks', // Required in WP versions older than 5.7
498 'formidable_dom',
499 'formidable_embed',
500 );
501
502 if ( FrmAppHelper::is_admin_page( 'formidable-styles' ) || FrmAppHelper::is_admin_page( 'formidable-styles2' ) ) {
503 $dependencies[] = 'wp-color-picker';
504 }
505
506 wp_register_script( 'formidable_admin', $plugin_url . '/js/formidable_admin.js', $dependencies, $version, true );
507
508 if ( FrmAppHelper::on_form_listing_page() ) {
509 // For the existing page dropdown in the Form embed modal.
510 wp_enqueue_script( 'jquery-ui-autocomplete' );
511 }
512
513 wp_register_script( 'bootstrap-multiselect', $plugin_url . '/js/bootstrap-multiselect.js', array( 'jquery', 'bootstrap_tooltip', 'popper' ), '1.1.1', true );
514
515 $post_type = FrmAppHelper::simple_get( 'post_type', 'sanitize_title' );
516
517 global $pagenow;
518 if ( strpos( $page, 'formidable' ) === 0 || ( $pagenow === 'edit.php' && $post_type === 'frm_display' ) ) {
519
520 wp_enqueue_script( 'admin-widgets' );
521 wp_enqueue_style( 'widgets' );
522 self::maybe_deregister_popper2();
523 wp_enqueue_script( 'formidable_admin' );
524 wp_enqueue_script( 'formidable_embed' );
525 FrmAppHelper::localize_script( 'admin' );
526
527 wp_enqueue_style( 'formidable-admin' );
528 if ( 'formidable-styles' !== $page && 'formidable-styles2' !== $page ) {
529 wp_enqueue_style( 'formidable-grids' );
530 wp_enqueue_style( 'formidable-dropzone' );
531 } else {
532 wp_enqueue_style( 'formidable-grids' );
533 }
534
535 if ( 'formidable-entries' === $page ) {
536 // Load front end js for entries.
537 wp_enqueue_script( 'formidable' );
538 }
539
540 do_action( 'frm_enqueue_builder_scripts' );
541 self::include_upgrade_overlay();
542 self::include_info_overlay();
543 } elseif ( FrmAppHelper::is_view_builder_page() ) {
544 if ( isset( $_REQUEST['post_type'] ) ) {
545 $post_type = sanitize_title( wp_unslash( $_REQUEST['post_type'] ) );
546 } elseif ( isset( $_REQUEST['post'] ) && absint( $_REQUEST['post'] ) ) {
547 $post = get_post( absint( wp_unslash( $_REQUEST['post'] ) ) );
548 if ( ! $post ) {
549 return;
550 }
551 $post_type = $post->post_type;
552 } else {
553 return;
554 }
555
556 if ( $post_type === 'frm_display' ) {
557 wp_enqueue_style( 'formidable-grids' );
558 wp_enqueue_script( 'jquery-ui-draggable' );
559 self::maybe_deregister_popper2();
560 wp_enqueue_script( 'formidable_admin' );
561 wp_enqueue_style( 'formidable-admin' );
562 FrmAppHelper::localize_script( 'admin' );
563 self::include_info_overlay();
564 }
565 }
566
567 self::maybe_force_formidable_block_on_gutenberg_page();
568 }
569
570 /**
571 * Fix a Duplicator Pro conflict because it uses Popper 2. See issue #3459.
572 *
573 * @since 5.2.02.01
574 *
575 * @return void
576 */
577 private static function maybe_deregister_popper2() {
578 global $wp_scripts;
579
580 if ( ! array_key_exists( 'popper', $wp_scripts->registered ) ) {
581 return;
582 }
583
584 $popper = $wp_scripts->registered['popper'];
585 if ( version_compare( $popper->ver, '2.0', '>=' ) ) {
586 wp_deregister_script( 'popper' );
587 self::register_popper1();
588 }
589 }
590
591 /**
592 * Register Popper required for Bootstrap 4.
593 *
594 * @since 5.2.02.01
595 *
596 * @return void
597 */
598 private static function register_popper1() {
599 wp_register_script( 'popper', FrmAppHelper::plugin_url() . '/js/popper.min.js', array( 'jquery' ), '1.16.0', true );
600 }
601
602 /**
603 * Automatically insert a Formidable block when loading Gutenberg when $_GET['frmForm' is set.
604 *
605 * @since 5.2
606 *
607 * @return void
608 */
609 private static function maybe_force_formidable_block_on_gutenberg_page() {
610 global $pagenow;
611 if ( 'post.php' !== $pagenow ) {
612 return;
613 }
614
615 $form_id = FrmAppHelper::simple_get( 'frmForm', 'absint' );
616 if ( ! $form_id ) {
617 return;
618 }
619
620 self::add_js_to_inject_gutenberg_block( 'formidable/simple-form', 'formId', $form_id );
621 }
622
623 /**
624 * @since 5.3
625 *
626 * @return void
627 */
628 public static function add_js_to_inject_gutenberg_block( $block_name, $object_key, $object_id ) {
629 require FrmAppHelper::plugin_path() . '/classes/views/shared/edit-page-js.php';
630 }
631
632 public static function load_lang() {
633 load_plugin_textdomain( 'formidable', false, FrmAppHelper::plugin_folder() . '/languages/' );
634 }
635
636 /**
637 * Check if the styles are updated when a form is loaded on the front-end
638 *
639 * @since 3.0.1
640 */
641 public static function maybe_update_styles() {
642 if ( self::needs_update() ) {
643 self::network_upgrade_site();
644 }
645 }
646
647 /**
648 * @since 3.0
649 */
650 public static function create_rest_routes() {
651 $args = array(
652 'methods' => 'GET',
653 'callback' => 'FrmAppController::api_install',
654 'permission_callback' => __CLASS__ . '::can_update_db',
655 );
656
657 register_rest_route( 'frm-admin/v1', '/install', $args );
658
659 $args = array(
660 'methods' => 'GET',
661 'callback' => 'FrmAddonsController::install_addon_api',
662 'permission_callback' => 'FrmAddonsController::can_install_addon_api',
663 );
664
665 register_rest_route( 'frm-admin/v1', '/install-addon', $args );
666 }
667
668 /**
669 * Make sure the install is only being run when we tell it to.
670 * We don't want to run manually by people calling the API.
671 *
672 * @since 4.06.02
673 */
674 public static function can_update_db() {
675 return get_transient( 'frm_updating_api' );
676 }
677
678 /**
679 * Run silent upgrade on each site in the network during a network upgrade.
680 * Update database settings for all sites in a network during network upgrade process.
681 *
682 * @since 2.0.1
683 *
684 * @param int $blog_id Blog ID.
685 */
686 public static function network_upgrade_site( $blog_id = 0 ) {
687 // Flag to check if install is happening as intended.
688 set_transient( 'frm_updating_api', true, MINUTE_IN_SECONDS );
689 $request = new WP_REST_Request( 'GET', '/frm-admin/v1/install' );
690
691 self::maybe_add_wp_site_health();
692
693 if ( $blog_id ) {
694 switch_to_blog( $blog_id );
695 $response = rest_do_request( $request );
696 restore_current_blog();
697 } else {
698 $response = rest_do_request( $request );
699 }
700
701 if ( $response->is_error() ) {
702 // if the remove post fails, use javascript instead
703 add_action( 'admin_notices', 'FrmAppController::install_js_fallback' );
704 }
705 }
706
707 /**
708 * Make sure WP_Site_Health has been included because it is required when calling rest_do_request.
709 * Check first that the file exists because WP_Site_Health was only introduced in WordPress 5.2.
710 */
711 private static function maybe_add_wp_site_health() {
712 if ( ! class_exists( 'WP_Site_Health' ) ) {
713 $wp_site_health_path = ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
714 if ( file_exists( $wp_site_health_path ) ) {
715 require_once $wp_site_health_path;
716 }
717 }
718 }
719
720 /**
721 * @since 3.0
722 */
723 public static function api_install() {
724 delete_transient( 'frm_updating_api' );
725 if ( self::needs_update() ) {
726 $running = get_option( 'frm_install_running' );
727 if ( false === $running || $running < strtotime( '-5 minutes' ) ) {
728 update_option( 'frm_install_running', time(), 'no' );
729 self::install();
730 delete_option( 'frm_install_running' );
731 }
732 }
733
734 return true;
735 }
736
737 /**
738 * Silent database upgrade (no redirect).
739 * Called via ajax request during network upgrade process.
740 *
741 * @since 2.0.1
742 */
743 public static function ajax_install() {
744 self::api_install();
745 wp_die();
746 }
747
748 public static function install() {
749 $frmdb = new FrmMigrate();
750 $frmdb->upgrade();
751 }
752
753 public static function uninstall() {
754 FrmAppHelper::permission_check( 'administrator' );
755 check_ajax_referer( 'frm_ajax', 'nonce' );
756
757 $frmdb = new FrmMigrate();
758 $frmdb->uninstall();
759
760 //disable the plugin and redirect after uninstall so the tables don't get added right back
761 $plugins = array( FrmAppHelper::plugin_folder() . '/formidable.php', 'formidable-pro/formidable-pro.php' );
762 deactivate_plugins( $plugins, false, false );
763 echo esc_url_raw( admin_url( 'plugins.php?deactivate=true' ) );
764
765 wp_die();
766 }
767
768 public static function drop_tables( $tables ) {
769 global $wpdb;
770 $tables[] = $wpdb->prefix . 'frm_fields';
771 $tables[] = $wpdb->prefix . 'frm_forms';
772 $tables[] = $wpdb->prefix . 'frm_items';
773 $tables[] = $wpdb->prefix . 'frm_item_metas';
774
775 return $tables;
776 }
777
778 public static function deauthorize() {
779 FrmAppHelper::permission_check( 'frm_change_settings' );
780 check_ajax_referer( 'frm_ajax', 'nonce' );
781
782 delete_option( 'frmpro-credentials' );
783 delete_option( 'frmpro-authorized' );
784 delete_site_option( 'frmpro-credentials' );
785 delete_site_option( 'frmpro-authorized' );
786 wp_die();
787 }
788
789 public static function set_footer_text( $text ) {
790 if ( FrmAppHelper::is_formidable_admin() ) {
791 $text = '';
792 }
793
794 return $text;
795 }
796
797 /**
798 * @deprecated 1.07.05
799 * @codeCoverageIgnore
800 */
801 public static function get_form_shortcode( $atts ) {
802 return FrmDeprecated::get_form_shortcode( $atts );
803 }
804
805 /**
806 * @deprecated 2.5.4
807 * @codeCoverageIgnore
808 */
809 public static function widget_text_filter( $content ) {
810 return FrmDeprecated::widget_text_filter( $content );
811 }
812
813 /**
814 * Deprecated in favor of wpmu_upgrade_site
815 *
816 * @deprecated 2.3
817 * @codeCoverageIgnore
818 */
819 public static function front_head() {
820 FrmDeprecated::front_head();
821 }
822
823 /**
824 * @deprecated 3.0.04
825 * @codeCoverageIgnore
826 */
827 public static function activation_install() {
828 FrmDeprecated::activation_install();
829 }
830
831 /**
832 * @deprecated 3.0
833 * @codeCoverageIgnore
834 */
835 public static function page_route( $content ) {
836 return FrmDeprecated::page_route( $content );
837 }
838
839 /**
840 * Include icons on page for Embed Form modal.
841 *
842 * @since 5.2
843 *
844 * @return void
845 */
846 public static function include_embed_form_icons() {
847 _deprecated_function( __METHOD__, '5.3' );
848 }
849 }
850