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

1,070 lines 28.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 /**
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 }
721
722 /**
723 * @since 6.3.2
724 *
725 * @return void
726 */
727 public static function admin_enqueue_scripts() {
728 self::load_wp_admin_style();
729 self::maybe_force_formidable_block_on_gutenberg_page();
730 }
731
732 /**
733 * Enqueue required assets for the Legacy Views editor (Views v4.x).
734 *
735 * @since 6.1.2
736 *
737 * @return void
738 */
739 private static function enqueue_legacy_views_assets() {
740 wp_enqueue_style( 'formidable-grids' );
741 wp_enqueue_script( 'jquery-ui-draggable' );
742 self::maybe_deregister_popper2();
743 wp_enqueue_script( 'formidable_admin' );
744 wp_add_inline_style(
745 'formidable-admin',
746 '
747 .frm-white-body.post-type-frm_display .columns-2 {
748 display: block;
749 overflow: visible;
750 }
751
752 .frm-white-body.post-type-frm_display .columns-2 > div {
753 overflow-y: hidden;
754 }
755
756 .frm-white-body.post-type-frm_display #titlediv #title-prompt-text {
757 padding: 3px 0 0 10px;
758 }
759
760 .post-type-frm_display #field-search-input,
761 .post-type-frm_display #advanced-search-input {
762 flex: 1;
763 }
764 '
765 );
766 wp_enqueue_style( 'formidable-admin' );
767 FrmAppHelper::localize_script( 'admin' );
768 self::include_info_overlay();
769 }
770
771 /**
772 * Fix a Duplicator Pro conflict because it uses Popper 2. See issue #3459.
773 *
774 * @since 5.2.02.01
775 *
776 * @return void
777 */
778 private static function maybe_deregister_popper2() {
779 global $wp_scripts;
780
781 if ( ! array_key_exists( 'popper', $wp_scripts->registered ) ) {
782 return;
783 }
784
785 $popper = $wp_scripts->registered['popper'];
786 if ( version_compare( $popper->ver, '2.0', '>=' ) ) {
787 wp_deregister_script( 'popper' );
788 self::register_popper1();
789 }
790 }
791
792 /**
793 * Register Popper required for Bootstrap 4.
794 *
795 * @since 5.2.02.01
796 *
797 * @return void
798 */
799 private static function register_popper1() {
800 wp_register_script( 'popper', FrmAppHelper::plugin_url() . '/js/popper.min.js', array( 'jquery' ), '1.16.0', true );
801 }
802
803 /**
804 * Automatically insert a Formidable block when loading Gutenberg when $_GET['frmForm' is set.
805 *
806 * @since 5.2
807 *
808 * @return void
809 */
810 private static function maybe_force_formidable_block_on_gutenberg_page() {
811 global $pagenow;
812 if ( 'post.php' !== $pagenow ) {
813 return;
814 }
815
816 $form_id = FrmAppHelper::simple_get( 'frmForm', 'absint' );
817 if ( ! $form_id ) {
818 return;
819 }
820
821 self::add_js_to_inject_gutenberg_block( 'formidable/simple-form', 'formId', $form_id );
822 }
823
824 /**
825 * @since 5.3
826 *
827 * @param string $block_name
828 * @param string $object_key
829 * @param array|string $object_id
830 *
831 * @return void
832 */
833 public static function add_js_to_inject_gutenberg_block( $block_name, $object_key, $object_id ) {
834 require FrmAppHelper::plugin_path() . '/classes/views/shared/edit-page-js.php';
835 }
836
837 /**
838 * @return void
839 */
840 public static function load_lang() {
841 load_plugin_textdomain( 'formidable', false, FrmAppHelper::plugin_folder() . '/languages/' );
842 }
843
844 /**
845 * Check if the styles are updated when a form is loaded on the front-end
846 *
847 * @since 3.0.1
848 *
849 * @return void
850 */
851 public static function maybe_update_styles() {
852 if ( self::needs_update() ) {
853 self::network_upgrade_site();
854 }
855 }
856
857 /**
858 * @since 3.0
859 *
860 * @return void
861 */
862 public static function create_rest_routes() {
863 $args = array(
864 'methods' => 'GET',
865 'callback' => 'FrmAppController::api_install',
866 'permission_callback' => __CLASS__ . '::can_update_db',
867 );
868
869 register_rest_route( 'frm-admin/v1', '/install', $args );
870
871 $args = array(
872 'methods' => 'GET',
873 'callback' => 'FrmAddonsController::install_addon_api',
874 'permission_callback' => 'FrmAddonsController::can_install_addon_api',
875 );
876
877 register_rest_route( 'frm-admin/v1', '/install-addon', $args );
878 }
879
880 /**
881 * Make sure the install is only being run when we tell it to.
882 * We don't want to run manually by people calling the API.
883 *
884 * @since 4.06.02
885 */
886 public static function can_update_db() {
887 return get_transient( 'frm_updating_api' );
888 }
889
890 /**
891 * Run silent upgrade on each site in the network during a network upgrade.
892 * Update database settings for all sites in a network during network upgrade process.
893 *
894 * @since 2.0.1
895 *
896 * @param int $blog_id Blog ID.
897 *
898 * @return void
899 */
900 public static function network_upgrade_site( $blog_id = 0 ) {
901 // Flag to check if install is happening as intended.
902 set_transient( 'frm_updating_api', true, MINUTE_IN_SECONDS );
903 $request = new WP_REST_Request( 'GET', '/frm-admin/v1/install' );
904
905 self::maybe_add_wp_site_health();
906
907 if ( $blog_id ) {
908 switch_to_blog( $blog_id );
909 $response = rest_do_request( $request );
910 restore_current_blog();
911 } else {
912 $response = rest_do_request( $request );
913 }
914
915 if ( $response->is_error() ) {
916 // if the remove post fails, use javascript instead
917 add_action( 'admin_notices', 'FrmAppController::install_js_fallback' );
918 }
919 }
920
921 /**
922 * Make sure WP_Site_Health has been included because it is required when calling rest_do_request.
923 * Check first that the file exists because WP_Site_Health was only introduced in WordPress 5.2.
924 *
925 * @return void
926 */
927 private static function maybe_add_wp_site_health() {
928 if ( ! class_exists( 'WP_Site_Health' ) ) {
929 $wp_site_health_path = ABSPATH . 'wp-admin/includes/class-wp-site-health.php';
930 if ( file_exists( $wp_site_health_path ) ) {
931 require_once $wp_site_health_path;
932 }
933 }
934 }
935
936 /**
937 * @since 3.0
938 *
939 * @return true
940 */
941 public static function api_install() {
942 delete_transient( 'frm_updating_api' );
943 if ( self::needs_update() ) {
944 $running = get_option( 'frm_install_running' );
945 if ( false === $running || $running < strtotime( '-5 minutes' ) ) {
946 update_option( 'frm_install_running', time(), 'no' );
947 self::install();
948 delete_option( 'frm_install_running' );
949 }
950 }
951
952 return true;
953 }
954
955 /**
956 * Silent database upgrade (no redirect).
957 * Called via ajax request during network upgrade process.
958 *
959 * @since 2.0.1
960 *
961 * @return void
962 */
963 public static function ajax_install() {
964 FrmAppHelper::permission_check( 'frm_change_settings' );
965 check_ajax_referer( 'frm_ajax', 'nonce' );
966 self::api_install();
967 wp_die();
968 }
969
970 /**
971 * @return void
972 */
973 public static function install() {
974 $frmdb = new FrmMigrate();
975 $frmdb->upgrade();
976 }
977
978 /**
979 * @return void
980 */
981 public static function uninstall() {
982 FrmAppHelper::permission_check( 'administrator' );
983 check_ajax_referer( 'frm_ajax', 'nonce' );
984
985 $frmdb = new FrmMigrate();
986 $frmdb->uninstall();
987
988 //disable the plugin and redirect after uninstall so the tables don't get added right back
989 $plugins = array( FrmAppHelper::plugin_folder() . '/formidable.php', 'formidable-pro/formidable-pro.php' );
990 deactivate_plugins( $plugins, false, false );
991 echo esc_url_raw( admin_url( 'plugins.php?deactivate=true' ) );
992
993 wp_die();
994 }
995
996 public static function drop_tables( $tables ) {
997 global $wpdb;
998 $tables[] = $wpdb->prefix . 'frm_fields';
999 $tables[] = $wpdb->prefix . 'frm_forms';
1000 $tables[] = $wpdb->prefix . 'frm_items';
1001 $tables[] = $wpdb->prefix . 'frm_item_metas';
1002
1003 return $tables;
1004 }
1005
1006 /**
1007 * @return void
1008 */
1009 public static function deauthorize() {
1010 FrmAppHelper::permission_check( 'frm_change_settings' );
1011 check_ajax_referer( 'frm_ajax', 'nonce' );
1012
1013 delete_option( 'frmpro-credentials' );
1014 delete_option( 'frmpro-authorized' );
1015 delete_site_option( 'frmpro-credentials' );
1016 delete_site_option( 'frmpro-authorized' );
1017 wp_die();
1018 }
1019
1020 public static function set_footer_text( $text ) {
1021 if ( FrmAppHelper::is_formidable_admin() ) {
1022 $text = '';
1023 }
1024
1025 return $text;
1026 }
1027
1028 /**
1029 * @deprecated 3.0.04
1030 *
1031 * @codeCoverageIgnore
1032 *
1033 * @return void
1034 */
1035 public static function activation_install() {
1036 FrmDeprecated::activation_install();
1037 }
1038
1039 /**
1040 * @deprecated 3.0
1041 * @codeCoverageIgnore
1042 */
1043 public static function page_route( $content ) {
1044 return FrmDeprecated::page_route( $content );
1045 }
1046
1047 /**
1048 * Include icons on page for Embed Form modal.
1049 *
1050 * @since 5.2
1051 *
1052 * @return void
1053 */
1054 public static function include_embed_form_icons() {
1055 _deprecated_function( __METHOD__, '5.3' );
1056 }
1057
1058 /**
1059 * @deprecated 1.07.05 This is still referenced in the API add on as of v1.13.
1060 * @codeCoverageIgnore
1061 *
1062 * @param array $atts
1063 * @return string
1064 */
1065 public static function get_form_shortcode( $atts ) {
1066 _deprecated_function( __FUNCTION__, '1.07.05', 'FrmFormsController::get_form_shortcode' );
1067 return FrmFormsController::get_form_shortcode( $atts );
1068 }
1069 }
1070