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

1,061 lines 28.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 /**
9 * @return void
10 */
11 public static function menu() {
12 FrmAppHelper::maybe_add_permissions();
13 if ( ! current_user_can( 'frm_view_forms' ) ) {
14 return;
15 }
16
17 $menu_name = FrmAppHelper::get_menu_name();
18 add_menu_page( 'Formidable', $menu_name, 'frm_view_forms', 'formidable', 'FrmFormsController::route', self::menu_icon(), self::get_menu_position() );
19 }
20
21 /**
22 * @return int
23 */
24 private static function get_menu_position() {
25 return (int) apply_filters( 'frm_menu_position', 29 );
26 }
27
28 /**
29 * @since 3.05
30 */
31 private static function menu_icon() {
32 $icon = FrmAppHelper::svg_logo(
33 array(
34 'fill' => '#a0a5aa',
35 'orange' => '#a0a5aa',
36 )
37 );
38 $icon = 'data:image/svg+xml;base64,' . base64_encode( $icon );
39
40 return apply_filters( 'frm_icon', $icon );
41 }
42
43 /**
44 * @since 3.0
45 */
46 public static function add_admin_class( $classes ) {
47 if ( self::is_white_page() ) {
48 $classes .= ' frm-white-body ';
49 $classes .= self::get_os();
50
51 $page = str_replace( 'formidable-', '', FrmAppHelper::simple_get( 'page', 'sanitize_title' ) );
52 if ( empty( $page ) || $page === 'formidable' ) {
53 $action = FrmAppHelper::simple_get( 'frm_action', 'sanitize_title' );
54 if ( in_array( $action, array( 'settings', 'edit', 'list' ) ) ) {
55 $page .= $action;
56 } else {
57 $page = $action;
58 }
59 }
60 if ( ! empty( $page ) ) {
61 $classes .= ' frm-admin-page-' . $page;
62 }
63 }
64
65 if ( FrmAppHelper::is_full_screen() ) {
66 $full_screen_on = self::get_full_screen_setting();
67 $add_class = '';
68 if ( $full_screen_on ) {
69 $add_class = ' frm-full-screen is-fullscreen-mode';
70 wp_enqueue_style( 'wp-edit-post' ); // Load the CSS for .is-fullscreen-mode.
71 }
72 $classes .= apply_filters( 'frm_admin_full_screen_class', $add_class );
73 }
74
75 if ( ! FrmAppHelper::pro_is_installed() ) {
76 $classes .= ' frm-lite ';
77 }
78
79 return $classes;
80 }
81
82 /**
83 * Get the full screen mode setting from the block editor.
84 *
85 * @since 6.1
86 *
87 * @return bool
88 */
89 private static function get_full_screen_setting() {
90 global $wpdb;
91 $meta_key = $wpdb->get_blog_prefix() . 'persisted_preferences';
92
93 $prefs = get_user_meta( get_current_user_id(), $meta_key, true );
94 if ( $prefs && isset( $prefs['core/edit-post']['fullscreenMode'] ) ) {
95 return $prefs['core/edit-post']['fullscreenMode'];
96 }
97
98 return true;
99 }
100
101 /**
102 * @since 4.0
103 *
104 * @return string
105 */
106 private static function get_os() {
107 $agent = strtolower( FrmAppHelper::get_server_value( 'HTTP_USER_AGENT' ) );
108 $os = '';
109 if ( strpos( $agent, 'mac' ) !== false ) {
110 $os = ' osx';
111 } elseif ( strpos( $agent, 'linux' ) !== false ) {
112 $os = ' linux';
113 } elseif ( strpos( $agent, 'windows' ) !== false ) {
114 $os = ' windows';
115 }
116 return $os;
117 }
118
119 /**
120 * @since 3.0
121 */
122 private static function is_white_page() {
123 $white_pages = array(
124 'formidable',
125 'formidable-entries',
126 'formidable-views',
127 'formidable-views-editor',
128 'formidable-pro-upgrade',
129 'formidable-addons',
130 'formidable-import',
131 'formidable-settings',
132 'formidable-styles',
133 'formidable-styles2',
134 'formidable-inbox',
135 'formidable-welcome',
136 'formidable-applications',
137 );
138
139 $get_page = FrmAppHelper::simple_get( 'page', 'sanitize_title' );
140 $is_white_page = in_array( $get_page, $white_pages, true );
141
142 if ( ! $is_white_page ) {
143 $screen = get_current_screen();
144 $is_white_page = ( $screen && strpos( $screen->id, 'frm_display' ) !== false );
145 }
146
147 /**
148 * Allow another add on to style a page as a Formidable "white page", which adds a white background color.
149 *
150 * @since 5.3
151 *
152 * @param bool $is_white_page
153 */
154 $is_white_page = apply_filters( 'frm_is_white_page', $is_white_page );
155
156 return $is_white_page;
157 }
158
159 /**
160 * @return void
161 */
162 public static function load_wp_admin_style() {
163 FrmAppHelper::load_font_style();
164 }
165
166 /**
167 * @param bool $show_nav
168 * @param string $title
169 *
170 * @psalm-param 'hide'|'show' $title
171 *
172 * @return void
173 */
174 public static function get_form_nav( $form, $show_nav = false, $title = 'show' ) {
175 $show_nav = FrmAppHelper::get_param( 'show_nav', $show_nav, 'get', 'absint' );
176 if ( empty( $show_nav ) || ! $form ) {
177 return;
178 }
179
180 FrmForm::maybe_get_form( $form );
181 if ( ! is_object( $form ) ) {
182 return;
183 }
184
185 $id = $form->id;
186 $current_page = self::get_current_page();
187 $nav_items = self::get_form_nav_items( $form );
188
189 include( FrmAppHelper::plugin_path() . '/classes/views/shared/form-nav.php' );
190 }
191
192 /**
193 * @return string
194 */
195 private static function get_current_page() {
196 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title' );
197 $post_type = FrmAppHelper::simple_get( 'post_type', 'sanitize_title', 'None' );
198 $current_page = isset( $_GET['page'] ) ? $page : $post_type;
199
200 if ( FrmAppHelper::is_view_builder_page() ) {
201 $current_page = 'frm_display';
202 }
203
204 return $current_page;
205 }
206
207 /**
208 * @param object $form
209 * @return array
210 */
211 private static function get_form_nav_items( $form ) {
212 $id = $form->parent_form_id ? $form->parent_form_id : $form->id;
213
214 $nav_items = array(
215 array(
216 'link' => FrmForm::get_edit_link( $id ),
217 'label' => __( 'Build', 'formidable' ),
218 'current' => array( 'edit', 'new', 'duplicate' ),
219 'page' => 'formidable',
220 'permission' => 'frm_edit_forms',
221 ),
222 array(
223 'link' => FrmStylesHelper::get_list_url( $id ),
224 'label' => __( 'Style', 'formidable' ),
225 'current' => array(),
226 'page' => 'formidable-styles',
227 'permission' => 'frm_edit_forms',
228 ),
229 array(
230 'link' => admin_url( 'admin.php?page=formidable&frm_action=settings&id=' . absint( $id ) ),
231 'label' => __( 'Settings', 'formidable' ),
232 'current' => array( 'settings' ),
233 'page' => 'formidable',
234 'permission' => 'frm_edit_forms',
235 ),
236 array(
237 'link' => admin_url( 'admin.php?page=formidable-entries&frm_action=list&form=' . absint( $id ) ),
238 'label' => __( 'Entries', 'formidable' ),
239 'current' => array(),
240 'page' => 'formidable-entries',
241 'permission' => 'frm_view_entries',
242 ),
243 );
244
245 $views_installed = is_callable( 'FrmProAppHelper::views_is_installed' ) ? FrmProAppHelper::views_is_installed() : FrmAppHelper::pro_is_installed();
246
247 if ( ! $views_installed ) {
248 $nav_items[] = array(
249 'link' => admin_url( 'admin.php?page=formidable-views&form=' . absint( $id ) ),
250 'label' => __( 'Views', 'formidable' ),
251 'current' => array(),
252 'page' => 'formidable-views',
253 'permission' => 'frm_view_entries',
254 'atts' => array(
255 'class' => 'frm_noallow',
256 ),
257 );
258 }
259
260 // Let people know reports and views exist.
261 if ( ! FrmAppHelper::pro_is_installed() ) {
262 $nav_items[] = array(
263 'link' => admin_url( 'admin.php?page=formidable&frm_action=lite-reports&form=' . absint( $id ) ),
264 'label' => __( 'Reports', 'formidable' ),
265 'current' => array( 'reports' ),
266 'page' => 'formidable',
267 'permission' => 'frm_view_entries',
268 'atts' => array(
269 'class' => 'frm_noallow',
270 ),
271 );
272 }
273
274 $nav_args = array(
275 'form_id' => $id,
276 'form' => $form,
277 );
278
279 return (array) apply_filters( 'frm_form_nav_list', $nav_items, $nav_args );
280 }
281
282 // Adds a settings link to the plugins page
283 /**
284 * @return array
285 */
286 public static function settings_link( $links ) {
287 $settings = array();
288
289 if ( ! FrmAppHelper::pro_is_installed() ) {
290 $settings[] = '<a href="' . esc_url( FrmAppHelper::admin_upgrade_link( 'plugin-row' ) ) . '" target="_blank" rel="noopener"><b>' . esc_html__( 'Upgrade to Pro', 'formidable' ) . '</b></a>';
291 }
292
293 $settings[] = '<a href="' . esc_url( admin_url( 'admin.php?page=formidable' ) ) . '">' . __( 'Build a Form', 'formidable' ) . '</a>';
294
295 return array_merge( $settings, $links );
296 }
297
298 /**
299 * @return void
300 */
301 public static function pro_get_started_headline() {
302 self::review_request();
303 FrmAppHelper::min_pro_version_notice( '4.0' );
304 }
305
306 /**
307 * Add admin notices as needed for reviews
308 *
309 * @since 3.04.03
310 *
311 * @return void
312 */
313 private static function review_request() {
314 $reviews = new FrmReviews();
315 $reviews->review_request();
316 }
317
318 /**
319 * Save the request to hide the review
320 *
321 * @since 3.04.03
322 *
323 * @return void
324 */
325 public static function dismiss_review() {
326 FrmAppHelper::permission_check( 'frm_change_settings' );
327 check_ajax_referer( 'frm_ajax', 'nonce' );
328
329 $reviews = new FrmReviews();
330 $reviews->dismiss_review();
331 }
332
333 /**
334 * @since 3.04.02
335 *
336 * @return void
337 */
338 public static function include_upgrade_overlay() {
339 self::enqueue_dialog_assets();
340 add_action( 'admin_footer', 'FrmAppController::upgrade_overlay_html' );
341 }
342
343 /**
344 * Enqueue scripts and styles required for modals.
345 *
346 * @since 5.3
347 *
348 * @return void
349 */
350 public static function enqueue_dialog_assets() {
351 wp_enqueue_script( 'jquery-ui-dialog' );
352 wp_enqueue_style( 'jquery-ui-dialog' );
353 }
354
355 /**
356 * @since 3.06.03
357 *
358 * @return void
359 */
360 public static function upgrade_overlay_html() {
361 $is_pro = FrmAppHelper::pro_is_installed();
362 $upgrade_link = array(
363 'medium' => 'builder',
364 'content' => 'upgrade',
365 );
366 $default_link = FrmAppHelper::admin_upgrade_link( $upgrade_link );
367 $plugin_path = FrmAppHelper::plugin_path();
368 $shared_path = $plugin_path . '/classes/views/shared/';
369
370 include $shared_path . 'upgrade_overlay.php';
371 include $shared_path . 'confirm-overlay.php';
372
373 if ( FrmAppHelper::is_admin_page( 'formidable-welcome' ) || FrmAppHelper::on_form_listing_page() ) {
374 self::new_form_overlay_html();
375 }
376 }
377
378 /**
379 * @return void
380 */
381 private static function new_form_overlay_html() {
382 FrmFormsController::before_list_templates();
383
384 $plugin_path = FrmAppHelper::plugin_path();
385 $path = $plugin_path . '/classes/views/frm-forms/';
386 $expired = FrmFormsController::expired();
387 $expiring = FrmAddonsController::is_license_expiring();
388 $user = wp_get_current_user(); // $user used in leave-email.php to determine a default value for field
389 $view_path = $path . 'new-form-overlay/';
390 $modal_class = '';
391 $upgrade_link = FrmAppHelper::admin_upgrade_link(
392 array(
393 'medium' => 'new-template',
394 'content' => 'upgrade',
395 )
396 );
397 $renew_link = FrmAppHelper::admin_upgrade_link(
398 array(
399 'medium' => 'new-template',
400 'content' => 'renew',
401 )
402 );
403 $blocks_to_render = array();
404
405 if ( ! FrmAppHelper::pro_is_installed() ) {
406 // avoid rendering the email and code blocks for users who have upgraded or have a free license already
407 $api = new FrmFormTemplateApi();
408 if ( ! $api->has_free_access() ) {
409 array_push( $blocks_to_render, 'email', 'code' );
410 }
411 }
412
413 // avoid rendering the upgrade block for users with elite
414 if ( 'elite' !== FrmAddonsController::license_type() ) {
415 $blocks_to_render[] = 'upgrade';
416 }
417
418 // avoid rendering the renew block for users who are not currently expired
419 if ( $expired ) {
420 $blocks_to_render[] = 'renew';
421 $modal_class = 'frm-expired';
422 } elseif ( $expiring ) {
423 $modal_class = 'frm-expiring';
424 }
425
426 include $path . 'new-form-overlay.php';
427 }
428
429 /**
430 * @return void
431 */
432 public static function include_info_overlay() {
433 self::enqueue_dialog_assets();
434 add_action( 'admin_footer', 'FrmAppController::info_overlay_html' );
435 }
436
437 /**
438 * @return void
439 */
440 public static function info_overlay_html() {
441 include FrmAppHelper::plugin_path() . '/classes/views/shared/info-overlay.php';
442 }
443
444 /**
445 * @since 3.04.02
446 *
447 * @return void
448 */
449 public static function remove_upsells() {
450 remove_action( 'frm_before_settings', 'FrmSettingsController::license_box' );
451 remove_action( 'frm_after_settings', 'FrmSettingsController::settings_cta' );
452 remove_action( 'frm_add_form_style_tab_options', 'FrmFormsController::add_form_style_tab_options' );
453 remove_action( 'frm_after_field_options', 'FrmFormsController::logic_tip' );
454 }
455
456 /**
457 * If there are CURL problems on this server, wp_remote_post won't work for installing
458 * Use a javascript fallback instead.
459 *
460 * @since 2.0.3
461 *
462 * @return void
463 */
464 public static function install_js_fallback() {
465 FrmAppHelper::load_admin_wide_js();
466 ?>
467 <div id="frm_install_message"></div>
468 <script>jQuery(document).ready( frm_install_now );</script>
469 <?php
470 }
471
472 /**
473 * Check if the database is outdated
474 *
475 * @since 2.0.1
476 * @return boolean
477 */
478 public static function needs_update() {
479 $needs_upgrade = self::compare_for_update(
480 array(
481 'option' => 'frm_db_version',
482 'new_db_version' => FrmAppHelper::$db_version,
483 'new_plugin_version' => FrmAppHelper::plugin_version(),
484 )
485 );
486
487 if ( ! $needs_upgrade ) {
488 $needs_upgrade = apply_filters( 'frm_db_needs_upgrade', $needs_upgrade );
489 }
490
491 return $needs_upgrade;
492 }
493
494 /**
495 * Check both version number and DB number for changes
496 *
497 * @since 3.0.04
498 *
499 * @param array $atts
500 * @return bool
501 */
502 public static function compare_for_update( $atts ) {
503 $db_version = get_option( $atts['option'] );
504
505 if ( strpos( $db_version, '-' ) === false ) {
506 $needs_upgrade = true;
507 } else {
508 $last_upgrade = explode( '-', $db_version );
509 $needs_db_upgrade = (int) $last_upgrade[1] < (int) $atts['new_db_version'];
510 $new_version = version_compare( $last_upgrade[0], $atts['new_plugin_version'], '<' );
511 $needs_upgrade = $needs_db_upgrade || $new_version;
512 }
513
514 return $needs_upgrade;
515 }
516
517 /**
518 * Check for database update and trigger js loading
519 *
520 * @since 2.0.1
521 *
522 * @return void
523 */
524 public static function admin_init() {
525 if ( FrmAppHelper::is_admin_page( 'formidable' ) && 'duplicate' === FrmAppHelper::get_param( 'frm_action' ) ) {
526 FrmFormsController::duplicate();
527 }
528
529 if ( FrmAppHelper::is_style_editor_page() && 'save' === FrmAppHelper::get_param( 'frm_action' ) ) {
530 // Hook in earlier than FrmStylesController::route so we can redirect before the headers have been sent.
531 FrmStylesController::save_style();
532 }
533
534 new FrmPersonalData(); // register personal data hooks
535
536 if ( ! FrmAppHelper::doing_ajax() && self::needs_update() ) {
537 self::network_upgrade_site();
538 }
539
540 if ( ! FrmAppHelper::doing_ajax() ) {
541 // don't continue during ajax calls
542 self::admin_js();
543 }
544
545 if ( FrmAppHelper::is_admin_page( 'formidable' ) ) {
546 $action = FrmAppHelper::get_param( 'frm_action' );
547
548 if ( in_array( $action, array( 'add_new', 'list_templates' ), true ) ) {
549 wp_safe_redirect( admin_url( 'admin.php?page=formidable&triggerNewFormModal=1' ) );
550 exit;
551 }
552
553 FrmInbox::maybe_disable_screen_options();
554 }
555
556 self::maybe_add_ip_warning();
557 }
558
559 /**
560 * Show a warning for the IP address setting if it hasn't been set.
561 *
562 * @since 6.1
563 *
564 * @return void
565 */
566 private static function maybe_add_ip_warning() {
567 $settings = FrmAppHelper::get_settings();
568 if ( false !== $settings->custom_header_ip ) {
569 // The setting has been changed from the false default (to either 1 or 0), so stop showing the message.
570 return;
571 }
572
573 if ( ! self::is_behind_proxy() ) {
574 // This message is only applicable when using a reverse proxy.
575 return;
576 }
577
578 if ( FrmAppHelper::get_post_param( 'frm_action', '', 'sanitize_text_field' ) ) {
579 // Avoid the message on a POST action. We don't want to show the message if we're saving global settings.
580 return;
581 }
582
583 $global_settings_link = admin_url( 'admin.php?page=formidable-settings' ) . '#frm_custom_header_ip';
584 $message = sprintf(
585 // Translators: 1: Global Settings Link
586 __( 'IP addresses in form submissions may no longer be accurate! If you are experiencing issues, we recommend going to %1$s and enabling the "Use custom headers when retrieving IPs with form submissions." setting.', 'formidable' ),
587 '<a href="' . esc_url( $global_settings_link ) . '">Global Settings</a>'
588 );
589 $option_name = 'frm_dismiss_ip_address_notice';
590 FrmAppHelper::add_dismissable_warning_message( $message, $option_name );
591 }
592
593 /**
594 * Check if any reverse proxy headers are set.
595 *
596 * @since 6.1
597 *
598 * @return bool
599 */
600 private static function is_behind_proxy() {
601 $custom_headers = FrmAppHelper::get_custom_header_keys_for_ip();
602 foreach ( $custom_headers as $header ) {
603 if ( 'REMOTE_ADDR' === $header ) {
604 // We want to check every key but REMOTE_ADDR. REMOTE_ATTR is not unique to reverse proxy servers.
605 continue;
606 }
607
608 $ip = trim( FrmAppHelper::get_server_value( $header ) );
609 // Return true for anything that isn't empty but ignoring values like ::1.
610 if ( $ip && 0 !== strpos( $ip, '::' ) ) {
611 return true;
612 }
613 }
614
615 return false;
616 }
617
618 /**
619 * @return void
620 */
621 public static function admin_js() {
622 $plugin_url = FrmAppHelper::plugin_url();
623 $version = FrmAppHelper::plugin_version();
624
625 FrmAppHelper::load_admin_wide_js();
626
627 wp_register_style( 'formidable_admin_global', $plugin_url . '/css/admin/frm_admin_global.css', array(), $version );
628 wp_enqueue_style( 'formidable_admin_global' );
629
630 wp_register_style( 'formidable-admin', $plugin_url . '/css/frm_admin.css', array(), $version );
631 wp_register_style( 'formidable-grids', $plugin_url . '/css/frm_grids.css', array(), $version );
632
633 wp_register_script( 'formidable_dom', $plugin_url . '/js/admin/dom.js', array( 'jquery', 'jquery-ui-dialog', 'wp-i18n' ), $version, true );
634 wp_register_script( 'formidable_embed', $plugin_url . '/js/admin/embed.js', array( 'formidable_dom', 'jquery-ui-autocomplete' ), $version, true );
635 self::register_popper1();
636 wp_register_script( 'bootstrap_tooltip', $plugin_url . '/js/bootstrap.min.js', array( 'jquery', 'popper' ), '4.6.1', true );
637 wp_register_script( 'formidable_settings', $plugin_url . '/js/admin/settings.js', array(), $version, true );
638
639 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title' );
640
641 if ( 'formidable-applications' === $page ) {
642 FrmApplicationsController::load_assets();
643 return;
644 }
645
646 $dependencies = array(
647 'formidable_admin_global',
648 'jquery',
649 'jquery-ui-core',
650 'jquery-ui-draggable',
651 'jquery-ui-sortable',
652 'bootstrap_tooltip',
653 'bootstrap-multiselect',
654 'wp-i18n',
655 'wp-hooks', // Required in WP versions older than 5.7
656 'formidable_dom',
657 'formidable_embed',
658 );
659
660 if ( FrmAppHelper::is_style_editor_page( 'edit' ) ) {
661 // We only need to load the color picker when editing styles.
662 $dependencies[] = 'wp-color-picker';
663 }
664
665 wp_register_script( 'formidable_admin', $plugin_url . '/js/formidable_admin.js', $dependencies, $version, true );
666
667 if ( FrmAppHelper::on_form_listing_page() ) {
668 // For the existing page dropdown in the Form embed modal.
669 wp_enqueue_script( 'jquery-ui-autocomplete' );
670 }
671
672 wp_register_script( 'bootstrap-multiselect', $plugin_url . '/js/bootstrap-multiselect.js', array( 'jquery', 'bootstrap_tooltip', 'popper' ), '1.1.1', true );
673
674 $post_type = FrmAppHelper::simple_get( 'post_type', 'sanitize_title' );
675
676 global $pagenow;
677 if ( strpos( $page, 'formidable' ) === 0 || ( $pagenow === 'edit.php' && $post_type === 'frm_display' ) ) {
678
679 wp_enqueue_script( 'admin-widgets' );
680 wp_enqueue_style( 'widgets' );
681 self::maybe_deregister_popper2();
682 wp_enqueue_script( 'formidable_admin' );
683 wp_enqueue_script( 'formidable_embed' );
684 FrmAppHelper::localize_script( 'admin' );
685
686 wp_enqueue_style( 'formidable-admin' );
687 if ( 'formidable-styles' !== $page && 'formidable-styles2' !== $page ) {
688 wp_enqueue_style( 'formidable-grids' );
689 wp_enqueue_style( 'formidable-dropzone' );
690 } else {
691 wp_enqueue_style( 'formidable-grids' );
692 }
693
694 if ( 'formidable-entries' === $page ) {
695 // Load front end js for entries.
696 wp_enqueue_script( 'formidable' );
697 }
698
699 do_action( 'frm_enqueue_builder_scripts' );
700 self::include_upgrade_overlay();
701 self::include_info_overlay();
702 } elseif ( FrmAppHelper::is_view_builder_page() ) {
703 if ( isset( $_REQUEST['post_type'] ) ) {
704 $post_type = sanitize_title( wp_unslash( $_REQUEST['post_type'] ) );
705 } elseif ( isset( $_REQUEST['post'] ) && absint( $_REQUEST['post'] ) ) {
706 $post = get_post( absint( wp_unslash( $_REQUEST['post'] ) ) );
707 if ( ! $post ) {
708 return;
709 }
710 $post_type = $post->post_type;
711 } else {
712 return;
713 }
714
715 if ( $post_type === 'frm_display' ) {
716 self::enqueue_legacy_views_assets();
717 }
718 }
719
720 self::maybe_force_formidable_block_on_gutenberg_page();
721 }
722
723 /**
724 * Enqueue required assets for the Legacy Views editor (Views v4.x).
725 *
726 * @since 6.1.2
727 *
728 * @return void
729 */
730 private static function enqueue_legacy_views_assets() {
731 wp_enqueue_style( 'formidable-grids' );
732 wp_enqueue_script( 'jquery-ui-draggable' );
733 self::maybe_deregister_popper2();
734 wp_enqueue_script( 'formidable_admin' );
735 wp_add_inline_style(
736 'formidable-admin',
737 '
738 .frm-white-body.post-type-frm_display .columns-2 {
739 display: block;
740 overflow: visible;
741 }
742
743 .frm-white-body.post-type-frm_display .columns-2 > div {
744 overflow-y: hidden;
745 }
746
747 .frm-white-body.post-type-frm_display #titlediv #title-prompt-text {
748 padding: 3px 0 0 10px;
749 }
750
751 .post-type-frm_display #field-search-input,
752 .post-type-frm_display #advanced-search-input {
753 flex: 1;
754 }
755 '
756 );
757 wp_enqueue_style( 'formidable-admin' );
758 FrmAppHelper::localize_script( 'admin' );
759 self::include_info_overlay();
760 }
761
762 /**
763 * Fix a Duplicator Pro conflict because it uses Popper 2. See issue #3459.
764 *
765 * @since 5.2.02.01
766 *
767 * @return void
768 */
769 private static function maybe_deregister_popper2() {
770 global $wp_scripts;
771
772 if ( ! array_key_exists( 'popper', $wp_scripts->registered ) ) {
773 return;
774 }
775
776 $popper = $wp_scripts->registered['popper'];
777 if ( version_compare( $popper->ver, '2.0', '>=' ) ) {
778 wp_deregister_script( 'popper' );
779 self::register_popper1();
780 }
781 }
782
783 /**
784 * Register Popper required for Bootstrap 4.
785 *
786 * @since 5.2.02.01
787 *
788 * @return void
789 */
790 private static function register_popper1() {
791 wp_register_script( 'popper', FrmAppHelper::plugin_url() . '/js/popper.min.js', array( 'jquery' ), '1.16.0', true );
792 }
793
794 /**
795 * Automatically insert a Formidable block when loading Gutenberg when $_GET['frmForm' is set.
796 *
797 * @since 5.2
798 *
799 * @return void
800 */
801 private static function maybe_force_formidable_block_on_gutenberg_page() {
802 global $pagenow;
803 if ( 'post.php' !== $pagenow ) {
804 return;
805 }
806
807 $form_id = FrmAppHelper::simple_get( 'frmForm', 'absint' );
808 if ( ! $form_id ) {
809 return;
810 }
811
812 self::add_js_to_inject_gutenberg_block( 'formidable/simple-form', 'formId', $form_id );
813 }
814
815 /**
816 * @since 5.3
817 *
818 * @param string $block_name
819 * @param string $object_key
820 * @param array|string $object_id
821 *
822 * @return void
823 */
824 public static function add_js_to_inject_gutenberg_block( $block_name, $object_key, $object_id ) {
825 require FrmAppHelper::plugin_path() . '/classes/views/shared/edit-page-js.php';
826 }
827
828 /**
829 * @return void
830 */
831 public static function load_lang() {
832 load_plugin_textdomain( 'formidable', false, FrmAppHelper::plugin_folder() . '/languages/' );
833 }
834
835 /**
836 * Check if the styles are updated when a form is loaded on the front-end
837 *
838 * @since 3.0.1
839 *
840 * @return void
841 */
842 public static function maybe_update_styles() {
843 if ( self::needs_update() ) {
844 self::network_upgrade_site();
845 }
846 }
847
848 /**
849 * @since 3.0
850 *
851 * @return void
852 */
853 public static function create_rest_routes() {
854 $args = array(
855 'methods' => 'GET',
856 'callback' => 'FrmAppController::api_install',
857 'permission_callback' => __CLASS__ . '::can_update_db',
858 );
859
860 register_rest_route( 'frm-admin/v1', '/install', $args );
861
862 $args = array(
863 'methods' => 'GET',
864 'callback' => 'FrmAddonsController::install_addon_api',
865 'permission_callback' => 'FrmAddonsController::can_install_addon_api',
866 );
867
868 register_rest_route( 'frm-admin/v1', '/install-addon', $args );
869 }
870
871 /**
872 * Make sure the install is only being run when we tell it to.
873 * We don't want to run manually by people calling the API.
874 *
875 * @since 4.06.02
876 */
877 public static function can_update_db() {
878 return get_transient( 'frm_updating_api' );
879 }
880
881 /**
882 * Run silent upgrade on each site in the network during a network upgrade.
883 * Update database settings for all sites in a network during network upgrade process.
884 *
885 * @since 2.0.1
886 *
887 * @param int $blog_id Blog ID.
888 *
889 * @return void
890 */
891 public static function network_upgrade_site( $blog_id = 0 ) {
892 // Flag to check if install is happening as intended.
893 set_transient( 'frm_updating_api', true, MINUTE_IN_SECONDS );
894 $request = new WP_REST_Request( 'GET', '/frm-admin/v1/install' );
895
896 self::maybe_add_wp_site_health();
897
898 if ( $blog_id ) {
899 switch_to_blog( $blog_id );
900 $response = rest_do_request( $request );
901 restore_current_blog();
902 } else {
903 $response = rest_do_request( $request );
904 }
905
906 if ( $response->is_error() ) {
907 // if the remove post fails, use javascript instead
908 add_action( 'admin_notices', 'FrmAppController::install_js_fallback' );
909 }
910 }
911
912 /**
913 * Make sure WP_Site_Health has been included because it is required when calling rest_do_request.
914 * Check first that the file exists because WP_Site_Health was only introduced in WordPress 5.2.
915 *
916 * @return void
917 */
918 private static function maybe_add_wp_site_health() {
919 if ( ! class_exists( 'WP_Site_Health' ) ) {
920 $wp_site_health_path = ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
921 if ( file_exists( $wp_site_health_path ) ) {
922 require_once $wp_site_health_path;
923 }
924 }
925 }
926
927 /**
928 * @since 3.0
929 *
930 * @return true
931 */
932 public static function api_install() {
933 delete_transient( 'frm_updating_api' );
934 if ( self::needs_update() ) {
935 $running = get_option( 'frm_install_running' );
936 if ( false === $running || $running < strtotime( '-5 minutes' ) ) {
937 update_option( 'frm_install_running', time(), 'no' );
938 self::install();
939 delete_option( 'frm_install_running' );
940 }
941 }
942
943 return true;
944 }
945
946 /**
947 * Silent database upgrade (no redirect).
948 * Called via ajax request during network upgrade process.
949 *
950 * @since 2.0.1
951 *
952 * @return void
953 */
954 public static function ajax_install() {
955 FrmAppHelper::permission_check( 'frm_change_settings' );
956 check_ajax_referer( 'frm_ajax', 'nonce' );
957 self::api_install();
958 wp_die();
959 }
960
961 /**
962 * @return void
963 */
964 public static function install() {
965 $frmdb = new FrmMigrate();
966 $frmdb->upgrade();
967 }
968
969 /**
970 * @return void
971 */
972 public static function uninstall() {
973 FrmAppHelper::permission_check( 'administrator' );
974 check_ajax_referer( 'frm_ajax', 'nonce' );
975
976 $frmdb = new FrmMigrate();
977 $frmdb->uninstall();
978
979 //disable the plugin and redirect after uninstall so the tables don't get added right back
980 $plugins = array( FrmAppHelper::plugin_folder() . '/formidable.php', 'formidable-pro/formidable-pro.php' );
981 deactivate_plugins( $plugins, false, false );
982 echo esc_url_raw( admin_url( 'plugins.php?deactivate=true' ) );
983
984 wp_die();
985 }
986
987 public static function drop_tables( $tables ) {
988 global $wpdb;
989 $tables[] = $wpdb->prefix . 'frm_fields';
990 $tables[] = $wpdb->prefix . 'frm_forms';
991 $tables[] = $wpdb->prefix . 'frm_items';
992 $tables[] = $wpdb->prefix . 'frm_item_metas';
993
994 return $tables;
995 }
996
997 /**
998 * @return void
999 */
1000 public static function deauthorize() {
1001 FrmAppHelper::permission_check( 'frm_change_settings' );
1002 check_ajax_referer( 'frm_ajax', 'nonce' );
1003
1004 delete_option( 'frmpro-credentials' );
1005 delete_option( 'frmpro-authorized' );
1006 delete_site_option( 'frmpro-credentials' );
1007 delete_site_option( 'frmpro-authorized' );
1008 wp_die();
1009 }
1010
1011 public static function set_footer_text( $text ) {
1012 if ( FrmAppHelper::is_formidable_admin() ) {
1013 $text = '';
1014 }
1015
1016 return $text;
1017 }
1018
1019 /**
1020 * @deprecated 3.0.04
1021 *
1022 * @codeCoverageIgnore
1023 *
1024 * @return void
1025 */
1026 public static function activation_install() {
1027 FrmDeprecated::activation_install();
1028 }
1029
1030 /**
1031 * @deprecated 3.0
1032 * @codeCoverageIgnore
1033 */
1034 public static function page_route( $content ) {
1035 return FrmDeprecated::page_route( $content );
1036 }
1037
1038 /**
1039 * Include icons on page for Embed Form modal.
1040 *
1041 * @since 5.2
1042 *
1043 * @return void
1044 */
1045 public static function include_embed_form_icons() {
1046 _deprecated_function( __METHOD__, '5.3' );
1047 }
1048
1049 /**
1050 * @deprecated 1.07.05 This is still referenced in the API add on as of v1.13.
1051 * @codeCoverageIgnore
1052 *
1053 * @param array $atts
1054 * @return string
1055 */
1056 public static function get_form_shortcode( $atts ) {
1057 _deprecated_function( __FUNCTION__, '1.07.05', 'FrmFormsController::get_form_shortcode' );
1058 return FrmFormsController::get_form_shortcode( $atts );
1059 }
1060 }
1061