PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.27
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.27
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 / FrmSettingsController.php

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

536 lines 14.6 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 FrmSettingsController {
7
8 /**
9 * Payments sections are removed from the top level and added to a payments section.
10 *
11 * @since 6.22.1
12 *
13 * @var array
14 */
15 private static $removed_payments_sections = array();
16
17 /**
18 * @return void
19 */
20 public static function menu() {
21 // Make sure admins can see the menu items
22 FrmAppHelper::force_capability( 'frm_change_settings' );
23
24 add_submenu_page( 'formidable', 'Formidable | ' . __( 'Global Settings', 'formidable' ), __( 'Global Settings', 'formidable' ), 'frm_change_settings', 'formidable-settings', 'FrmSettingsController::route' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
25 }
26
27 /**
28 * Include license box template on demand.
29 *
30 * @return void
31 */
32 public static function license_box() {
33 if ( ! current_user_can( 'activate_plugins' ) ) {
34 return;
35 }
36 include FrmAppHelper::plugin_path() . '/classes/views/frm-settings/license_box.php';
37 }
38
39 /**
40 * @param array $errors
41 * @param string $message
42 *
43 * @return void
44 */
45 public static function display_form( $errors = array(), $message = '' ) {
46 global $frm_vars;
47
48 $frm_settings = FrmAppHelper::get_settings();
49 $uploads = wp_upload_dir();
50 $target_path = $uploads['basedir'] . '/formidable/css';
51 $sections = self::get_settings_tabs();
52 $current = FrmAppHelper::simple_get( 't', 'sanitize_title', 'general_settings' );
53
54 if ( in_array( $current, array( 'stripe_settings', 'square_settings', 'authorize_net_settings', 'paypal_settings' ), true ) ) {
55 $current = 'payments_settings';
56 }
57
58 require FrmAppHelper::plugin_path() . '/classes/views/frm-settings/form.php';
59 }
60
61 /**
62 * Get sections to use for Global Settings.
63 *
64 * @return array<array>
65 */
66 private static function get_settings_tabs() {
67 $sections = array(
68 'general' => array(
69 'class' => self::class,
70 'function' => 'general_settings',
71 'name' => __( 'General Settings', 'formidable' ),
72 'icon' => 'frmfont frm_settings_icon',
73 ),
74 'messages' => array(
75 'class' => self::class,
76 'function' => 'message_settings',
77 'name' => __( 'Message Defaults', 'formidable' ),
78 'icon' => 'frmfont frm_stamp_icon',
79 ),
80 'permissions' => array(
81 'class' => self::class,
82 'function' => 'permission_settings',
83 'name' => __( 'Permissions', 'formidable' ),
84 'icon' => 'frmfont frm_lock_icon',
85 ),
86 'payments' => array(
87 'name' => __( 'Payments', 'formidable' ),
88 'icon' => 'frmfont frm_simple_cc_icon',
89 'class' => self::class,
90 'function' => 'payments_settings',
91 ),
92 'custom_css' => array(
93 'class' => 'FrmStylesController',
94 'function' => 'custom_css',
95 'name' => __( 'Custom CSS', 'formidable' ),
96 'icon' => 'frmfont frm_code_icon',
97 ),
98 'manage_styles' => array(
99 'class' => 'FrmStylesController',
100 'function' => 'manage',
101 'name' => __( 'Manage Styles', 'formidable' ),
102 'icon' => 'frmfont frm_pallet_icon',
103 ),
104 'captcha' => array(
105 'class' => self::class,
106 'function' => 'captcha_settings',
107 'name' => __( 'Captcha/Spam', 'formidable' ),
108 'icon' => 'frmfont frm_shield_check_icon',
109 ),
110 'email' => array(
111 'class' => self::class,
112 'function' => 'email_settings',
113 'name' => __( 'Email', 'formidable' ),
114 'icon' => 'frmfont frm_email_icon',
115 ),
116 'white_label' => array(
117 'name' => __( 'White Labeling', 'formidable' ),
118 'icon' => 'frmfont frm_ghost_icon',
119 'html_class' => 'frm_show_upgrade_tab frm_noallow',
120 'data' => array(
121 'medium' => 'white-label',
122 'upgrade' => __( 'White labeling options', 'formidable' ),
123 'screenshot' => 'white-label.png',
124 'learn-more' => FrmAppHelper::get_doc_url( 'features/white-label-form-builder-wordpress', 'white-labeling-global-settings', false ),
125 ),
126 ),
127 'inbox' => array(
128 'name' => __( 'Inbox', 'formidable' ),
129 'icon' => 'frmfont frm_email_icon',
130 'html_class' => 'frm_show_upgrade_tab frm_noallow',
131 'data' => array(
132 'medium' => 'inbox-settings',
133 'upgrade' => __( 'Inbox settings', 'formidable' ),
134 'screenshot' => 'inbox.png',
135 'learn-more' => FrmAppHelper::get_doc_url( 'global-settings-overview/#kb-inbox', 'inbox-global-settings' ),
136 ),
137 ),
138 );
139
140 if ( apply_filters( 'frm_include_addon_page', false ) ) {
141 // If no addons need a license, skip this page
142 $show_licenses = false;
143 $installed_addons = apply_filters( 'frm_installed_addons', array() );
144
145 foreach ( $installed_addons as $installed_addon ) {
146 if ( ! $installed_addon->is_parent_licence && $installed_addon->plugin_name !== 'Formidable Pro' && $installed_addon->needs_license ) {
147 $show_licenses = true;
148 break;
149 }
150 }
151
152 if ( $show_licenses ) {
153 $sections['licenses'] = array(
154 'class' => 'FrmAddonsController',
155 'function' => 'license_settings',
156 'name' => __( 'Plugin Licenses', 'formidable' ),
157 'icon' => 'frmfont frm_key_icon',
158 'ajax' => true,
159 );
160 }
161 }//end if
162
163 /**
164 * @param array<array> $sections
165 */
166 $sections = apply_filters( 'frm_add_settings_section', $sections );
167 self::remove_payments_sections( $sections );
168
169 $sections['misc'] = array(
170 'name' => __( 'Miscellaneous', 'formidable' ),
171 'icon' => 'frmfont frm_shuffle_icon',
172 'class' => self::class,
173 'function' => 'misc_settings',
174 );
175
176 foreach ( $sections as $key => $section ) {
177 $original = $section;
178 $defaults = array(
179 'html_class' => '',
180 'name' => ucfirst( $key ),
181 'icon' => 'frmfont frm_settings_icon',
182 'anchor' => $key . '_settings',
183 'data' => array(),
184 );
185
186 $section = array_merge( $defaults, $section );
187
188 if ( isset( $section['ajax'] ) && ! isset( $section['data']['frmajax'] ) ) {
189 $section['data']['frmajax'] = $section['ajax'];
190 }
191
192 // For reverse compatibility.
193 if ( ! isset( $section['function'] ) && ( ! is_array( $original ) || ! isset( $original['name'] ) ) ) {
194 $section['function'] = $original;
195 }
196
197 $sections[ $key ] = $section;
198 }//end foreach
199
200 return $sections;
201 }
202
203 /**
204 * Remove the payments sections (PayPal, Square, Stripe, Authorize.Net)
205 * and show them all on the payments section in separate tabs.
206 *
207 * @since 6.22.1
208 *
209 * @param array $sections
210 *
211 * @return void
212 */
213 private static function remove_payments_sections( &$sections ) {
214 $payment_section_keys = array( 'paypal', 'square', 'stripe', 'authorize_net' );
215
216 foreach ( $sections as $key => $section ) {
217 if ( in_array( $key, $payment_section_keys, true ) ) {
218 self::$removed_payments_sections[ $key ] = $section;
219 unset( $sections[ $key ] );
220 }
221 }
222
223 uksort( self::$removed_payments_sections, array( self::class, 'payment_sections_sort_callback' ) );
224 }
225
226 /**
227 * Sort the payments sections (PayPal, Square, Stripe, Authorize.Net)
228 *
229 * @since 6.22.1
230 *
231 * @param string $a
232 * @param string $b
233 *
234 * @return int
235 */
236 private static function payment_sections_sort_callback( $a, $b ) {
237 $order = array( 'stripe', 'square', 'paypal', 'authorize_net' );
238 $first_key = array_search( $a, $order, true );
239 $second_key = array_search( $b, $order, true );
240
241 if ( false === $first_key || false === $second_key ) {
242 return 0;
243 }
244
245 return $first_key - $second_key;
246 }
247
248 public static function load_settings_tab() {
249 FrmAppHelper::permission_check( 'frm_change_settings' );
250 check_ajax_referer( 'frm_ajax', 'nonce' );
251
252 $section = FrmAppHelper::get_post_param( 'tab', '', 'sanitize_text_field' );
253 $sections = self::get_settings_tabs();
254
255 if ( ! isset( $sections[ $section ] ) ) {
256 wp_die();
257 }
258
259 $section = $sections[ $section ];
260
261 if ( isset( $section['class'] ) ) {
262 call_user_func( array( $section['class'], $section['function'] ) );
263 } else {
264 call_user_func( ( $section['function'] ?? $section ) );
265 }
266
267 wp_die();
268 }
269
270 /**
271 * Render the general global settings section.
272 *
273 * @since 4.0
274 *
275 * @return void
276 */
277 public static function general_settings() {
278 $frm_settings = FrmAppHelper::get_settings();
279 $uploads = wp_upload_dir();
280 $target_path = $uploads['basedir'] . '/formidable/css';
281
282 include FrmAppHelper::plugin_path() . '/classes/views/frm-settings/general.php';
283 }
284
285 /**
286 * Render the global currency selector if Pro is up to date.
287 *
288 * @param FrmSettings $frm_settings
289 *
290 * @return void
291 */
292 public static function maybe_render_currency_selector( $frm_settings ) {
293 if ( is_callable( 'FrmProSettingsController::add_currency_settings' ) ) {
294 FrmProSettingsController::add_currency_settings();
295 return;
296 }
297
298 $currencies = FrmCurrencyHelper::get_currencies();
299 include FrmAppHelper::plugin_path() . '/classes/views/frm-settings/_currency.php';
300 }
301
302 /**
303 * @since 4.0
304 *
305 * @return void
306 */
307 public static function message_settings() {
308 $frm_settings = FrmAppHelper::get_settings();
309 include FrmAppHelper::plugin_path() . '/classes/views/frm-settings/messages.php';
310 }
311
312 /**
313 * @since 4.0
314 *
315 * @return void
316 */
317 public static function captcha_settings() {
318 $frm_settings = FrmAppHelper::get_settings();
319 $captcha_lang = FrmAppHelper::locales( 'captcha' );
320
321 include FrmAppHelper::plugin_path() . '/classes/views/frm-settings/captcha/captcha.php';
322 }
323
324 /**
325 * Shows email settings.
326 *
327 * @since 6.25
328 *
329 * @return void
330 */
331 public static function email_settings() {
332 $frm_settings = FrmAppHelper::get_settings();
333 include FrmAppHelper::plugin_path() . '/classes/views/frm-settings/email/email-styles.php';
334 }
335
336 /**
337 * @since 4.0
338 *
339 * @return void
340 */
341 public static function permission_settings() {
342 $frm_settings = FrmAppHelper::get_settings();
343 $frm_roles = FrmAppHelper::frm_capabilities();
344
345 include FrmAppHelper::plugin_path() . '/classes/views/frm-settings/permissions.php';
346 }
347
348 /**
349 * @return void
350 */
351 public static function payments_settings() {
352 $payment_sections = self::$removed_payments_sections;
353 $tab = FrmAppHelper::simple_get( 't', 'sanitize_title', 'general_settings' );
354
355 if ( $tab && in_array( $tab, array( 'stripe_settings', 'square_settings', 'authorize_net_settings', 'paypal_settings' ), true ) ) {
356 $tab = str_replace( '_settings', '', $tab );
357 } else {
358 $tab = 'stripe';
359 }
360
361 include FrmAppHelper::plugin_path() . '/classes/views/frm-settings/payments.php';
362 }
363
364 /**
365 * @since 4.0
366 *
367 * @return void
368 */
369 public static function misc_settings() {
370 $frm_settings = FrmAppHelper::get_settings();
371 include FrmAppHelper::plugin_path() . '/classes/views/frm-settings/misc.php';
372 }
373
374 /**
375 * Save form data submitted from the Global settings page.
376 *
377 * @param bool|string $stop_load
378 *
379 * @return void
380 */
381 public static function process_form( $stop_load = false ) {
382 global $frm_vars;
383
384 $frm_settings = FrmAppHelper::get_settings();
385 $process_form = FrmAppHelper::get_post_param( 'process_form', '', 'sanitize_text_field' );
386
387 if ( ! wp_verify_nonce( $process_form, 'process_form_nonce' ) ) {
388 $error_args = array(
389 'title' => __( 'Verification failed', 'formidable' ),
390 'body' => $frm_settings->admin_permission,
391 'cancel_text' => __( 'Cancel', 'formidable' ),
392 );
393 FrmAppController::show_error_modal( $error_args );
394 return;
395 }
396
397 $errors = array();
398 $message = '';
399
400 if ( empty( $frm_vars['settings_routed'] ) ) {
401 $errors = $frm_settings->validate( $_POST, array() );
402
403 $frm_settings->update( wp_unslash( $_POST ) );
404
405 if ( ! $errors ) {
406 $frm_settings->store();
407 $message = __( 'Settings Saved', 'formidable' );
408 }
409 } else {
410 $message = __( 'Settings Saved', 'formidable' );
411 }
412
413 if ( $stop_load === 'stop_load' ) {
414 $frm_vars['settings_routed'] = true;
415 return;
416 }
417
418 self::display_form( $errors, $message );
419 }
420
421 /**
422 * Include the Update button on the global settings page.
423 *
424 * @since 4.0.02
425 *
426 * @return void
427 */
428 public static function save_button() {
429 echo '<input class="button-primary frm-button-primary" type="submit"
430 value="' . esc_attr__( 'Update', 'formidable' ) . '"/>';
431 }
432
433 /**
434 * @param bool|string $stop_load
435 *
436 * @return void
437 */
438 public static function route( $stop_load = false ) {
439 $action = isset( $_REQUEST['frm_action'] ) ? 'frm_action' : 'action';
440 $action = FrmAppHelper::get_param( $action, '', 'get', 'sanitize_title' );
441 FrmAppHelper::include_svg();
442
443 if ( $action === 'process-form' ) {
444 self::process_form( $stop_load );
445 } elseif ( $stop_load !== 'stop_load' ) {
446 self::display_form();
447 }
448 }
449
450 /**
451 * Add CTA to the bottom on the plugin settings pages.
452 *
453 * @since 3.04.02
454 *
455 * @return void
456 */
457 public static function settings_cta() {
458 if ( get_option( 'frm_lite_settings_upgrade', false ) ) {
459 return;
460 }
461
462 include FrmAppHelper::plugin_path() . '/classes/views/frm-settings/settings_cta.php';
463 }
464
465 /**
466 * Dismiss upgrade notice at the bottom on the plugin settings pages.
467 *
468 * @since 3.04.02
469 */
470 public static function settings_cta_dismiss() {
471 check_ajax_referer( 'frm_ajax', 'nonce' );
472 FrmAppHelper::permission_check( 'frm_change_settings' );
473
474 update_option( 'frm_lite_settings_upgrade', time(), 'no' );
475
476 wp_send_json_success();
477 }
478
479 /**
480 * Autocomplete page admin ajax endpoint
481 *
482 * @since 4.03.06
483 */
484 public static function page_search() {
485 FrmAppHelper::permission_check( 'frm_edit_forms' );
486 check_ajax_referer( 'frm_ajax', 'nonce' );
487
488 global $wpdb;
489
490 $term = FrmAppHelper::get_param( 'term', '', 'get', 'sanitize_text_field' );
491 $post_type = FrmAppHelper::get_param( 'post_type', 'page', 'get', 'sanitize_text_field' );
492
493 $where = array(
494 'post_status' => 'publish',
495 'post_type' => $post_type,
496 'post_title LIKE' => $term,
497 );
498
499 $atts = array(
500 'limit' => 25,
501 'order_by' => 'post_title',
502 );
503
504 $pages = FrmDb::get_results( $wpdb->posts, $where, 'ID, post_title', $atts );
505 $results = array();
506
507 foreach ( $pages as $page ) {
508 $results[] = array(
509 'value' => $page->ID,
510 'label' => $page->post_title,
511 );
512 }
513
514 wp_send_json( $results );
515 }
516
517 /**
518 * Shows a fake color picker.
519 *
520 * @since 6.25
521 *
522 * @param string $color Color value.
523 *
524 * @return void
525 */
526 public static function fake_color_picker( $color ) {
527 ?>
528 <div class="wp-picker-container">
529 <button type="button" class="button wp-color-result" aria-expanded="false" aria-disabled="true" tabindex="-1" style="background-color:<?php echo esc_attr( $color ); ?>;"><?php // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong ?>
530 <span class="wp-color-result-text" style="color:#a7aaad;"><?php esc_html_e( 'Select Color', 'formidable' ); ?></span>
531 </button>
532 </div>
533 <?php
534 }
535 }
536