PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.3.1
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.3.1
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 / models / FrmSettings.php

FrmSettings.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.3.1, at classes/models/FrmSettings.php

399 lines 10.8 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 #[\AllowDynamicProperties]
7 class FrmSettings {
8 public $option_name = 'frm_options';
9 public $menu;
10 public $mu_menu;
11 public $use_html;
12 public $jquery_css;
13 public $accordion_js;
14 public $fade_form;
15 public $old_css;
16 public $admin_bar;
17
18 public $success_msg;
19 public $blank_msg;
20 public $unique_msg;
21 public $invalid_msg;
22 public $failed_msg;
23 public $submit_value;
24 public $login_msg;
25 public $admin_permission;
26
27 public $email_to;
28 public $load_style;
29 public $custom_style;
30
31 public $active_captcha;
32 public $hcaptcha_pubkey;
33 public $hcaptcha_privkey;
34 public $pubkey;
35 public $privkey;
36 public $re_lang;
37 public $re_type;
38 public $re_msg;
39 public $re_multi;
40
41 public $no_ips;
42 public $custom_header_ip;
43 public $current_form = 0;
44 public $tracking;
45
46 /**
47 * @since 6.0
48 *
49 * @var string|false|null
50 */
51 public $custom_css;
52
53 public function __construct( $args = array() ) {
54 if ( ! defined( 'ABSPATH' ) ) {
55 die( 'You are not allowed to call this page directly.' );
56 }
57
58 $settings = get_transient( $this->option_name );
59
60 if ( ! is_object( $settings ) ) {
61 $settings = $this->translate_settings( $settings );
62 }
63
64 foreach ( $settings as $setting_name => $setting ) {
65 $this->{$setting_name} = $setting;
66 unset( $setting_name, $setting );
67 }
68
69 $this->set_default_options();
70
71 $this->maybe_filter_for_form( $args );
72 }
73
74 private function translate_settings( $settings ) {
75 if ( $settings ) { //workaround for W3 total cache conflict
76 return unserialize( serialize( $settings ) );
77 }
78
79 $settings = get_option( $this->option_name );
80 if ( is_object( $settings ) ) {
81 set_transient( $this->option_name, $settings );
82
83 return $settings;
84 }
85
86 // If unserializing didn't work
87 if ( $settings ) { //workaround for W3 total cache conflict
88 $settings = unserialize( serialize( $settings ) );
89 } else {
90 $settings = $this;
91 }
92
93 update_option( $this->option_name, $settings );
94 set_transient( $this->option_name, $settings );
95
96 return $settings;
97 }
98
99 /**
100 * @return array
101 */
102 public function default_options() {
103 return array(
104 'menu' => apply_filters( 'frm_default_menu', 'Formidable' ),
105 'mu_menu' => 0,
106 'use_html' => true,
107 'jquery_css' => false,
108 'accordion_js' => false,
109 'fade_form' => false,
110 'old_css' => false,
111 'admin_bar' => false,
112
113 're_multi' => 1,
114
115 'success_msg' => __( 'Your responses were successfully submitted. Thank you!', 'formidable' ),
116 'blank_msg' => __( 'This field cannot be blank.', 'formidable' ),
117 'unique_msg' => __( 'This value must be unique.', 'formidable' ),
118 'invalid_msg' => __( 'There was a problem with your submission. Errors are marked below.', 'formidable' ),
119 'failed_msg' => __( 'We\'re sorry. It looks like you\'ve already submitted that.', 'formidable' ),
120 'submit_value' => __( 'Submit', 'formidable' ),
121 'login_msg' => __( 'You do not have permission to view this form.', 'formidable' ),
122 'admin_permission' => __( 'You do not have permission to do that', 'formidable' ),
123 'new_tab_msg' => __( 'The page has been opened in a new tab.', 'formidable' ),
124
125 'email_to' => '[admin_email]',
126 'no_ips' => 0,
127 'custom_header_ip' => false, // Use false by default. We show a warning when this is unset. Once global settings have been saved, this gets saved
128 'tracking' => FrmAppHelper::pro_is_installed(),
129
130 // Normally custom CSS is a string. A false value is used when nothing has been set.
131 // When it is false, we try to use the old custom_key value from the default style's post_content array.
132 'custom_css' => false,
133 );
134 }
135
136 /**
137 * @return void
138 */
139 private function set_default_options() {
140 $this->fill_captcha_settings();
141
142 if ( ! isset( $this->load_style ) ) {
143 if ( ! isset( $this->custom_style ) ) {
144 $this->custom_style = true;
145 }
146
147 $this->load_style = 'all';
148 }
149
150 $this->fill_with_defaults();
151
152 if ( is_multisite() && is_admin() ) {
153 $mu_menu = get_site_option( 'frm_admin_menu_name' );
154 if ( $mu_menu && ! empty( $mu_menu ) ) {
155 $this->menu = $mu_menu;
156 $this->mu_menu = 1;
157 }
158 }
159
160 $frm_roles = FrmAppHelper::frm_capabilities( 'pro' );
161 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
162 if ( ! isset( $this->$frm_role ) ) {
163 $this->$frm_role = 'administrator';
164 }
165 }
166 }
167
168 /**
169 * @param array $params
170 * @return void
171 */
172 public function fill_with_defaults( $params = array() ) {
173 $settings = $this->default_options();
174 $filter_html = ! FrmAppHelper::allow_unfiltered_html();
175
176 if ( $filter_html ) {
177 $filter_keys = array( 'failed_msg', 'blank_msg', 'invalid_msg', 'admin_permission', 'unique_msg', 'success_msg', 'submit_value', 'login_msg', 'menu' );
178 if ( ! empty( $params['additional_filter_keys'] ) ) {
179 $filter_keys = array_merge( $filter_keys, $params['additional_filter_keys'] );
180 }
181 } else {
182 $filter_keys = array();
183 }
184
185 foreach ( $settings as $setting => $default ) {
186 if ( isset( $params[ 'frm_' . $setting ] ) ) {
187 $this->{$setting} = $params[ 'frm_' . $setting ];
188 } elseif ( ! isset( $this->{$setting} ) ) {
189 $this->{$setting} = $default;
190 }
191
192 if ( $setting === 'menu' && empty( $this->{$setting} ) ) {
193 $this->{$setting} = $default;
194 }
195
196 $this->{$setting} = $this->maybe_sanitize_global_setting( $this->{$setting}, $setting, $filter_keys );
197 unset( $setting, $default );
198 }
199 }
200
201 /**
202 * Handle sanitizing for a target global setting key.
203 *
204 * @since 6.0
205 *
206 * @param mixed $value The unsanitized global setting value.
207 * @param string $key The key of the global setting being saved.
208 * @param array $filter_keys These keys that are filtered with kses.
209 * @return mixed
210 */
211 private function maybe_sanitize_global_setting( $value, $key, $filter_keys ) {
212 if ( 'custom_css' === $key ) {
213 if ( false === $value ) {
214 // Avoid changing the false default value to an empty string.
215 return $value;
216 }
217 return sanitize_textarea_field( $value );
218 }
219
220 if ( in_array( $key, $filter_keys, true ) ) {
221 return FrmAppHelper::kses( $value, 'all' );
222 }
223
224 return $value;
225 }
226
227 /**
228 * @return void
229 */
230 private function fill_captcha_settings() {
231 if ( ! isset( $this->active_captcha ) ) {
232 $this->active_captcha = 'recaptcha';
233 }
234
235 $privkey = '';
236 $re_lang = '';
237
238 if ( ! isset( $this->hcaptcha_privkey ) ) {
239 $this->hcaptcha_privkey = '';
240 }
241
242 if ( ! isset( $this->pubkey ) ) {
243 // get the options from the database
244 $recaptcha_opt = is_multisite() ? get_site_option( 'recaptcha' ) : get_option( 'recaptcha' );
245 $this->pubkey = isset( $recaptcha_opt['pubkey'] ) ? $recaptcha_opt['pubkey'] : '';
246 $privkey = isset( $recaptcha_opt['privkey'] ) ? $recaptcha_opt['privkey'] : $privkey;
247 $re_lang = isset( $recaptcha_opt['re_lang'] ) ? $recaptcha_opt['re_lang'] : $re_lang;
248 }
249
250 if ( ! isset( $this->re_msg ) || empty( $this->re_msg ) ) {
251 $this->re_msg = __( 'The CAPTCHA was not entered correctly', 'formidable' );
252 }
253
254 if ( ! isset( $this->privkey ) ) {
255 $this->privkey = $privkey;
256 }
257
258 if ( ! isset( $this->re_lang ) ) {
259 $this->re_lang = $re_lang;
260 }
261
262 if ( ! isset( $this->re_type ) ) {
263 $this->re_type = '';
264 }
265
266 if ( ! isset( $this->re_threshold ) ) {
267 $this->re_threshold = .5;
268 }
269 }
270
271 /**
272 * Get values that may be shown on the front-end without an override in the form settings.
273 *
274 * @since 3.06.01
275 *
276 * @return string[]
277 */
278 public function translatable_strings() {
279 return array(
280 'invalid_msg',
281 'admin_permission',
282 'failed_msg',
283 'login_msg',
284 );
285 }
286
287 /**
288 * Allow strings to be filtered when a specific form may be displaying them.
289 *
290 * @since 3.06.01
291 *
292 * @return void
293 */
294 public function maybe_filter_for_form( $args ) {
295 if ( isset( $args['current_form'] ) && is_numeric( $args['current_form'] ) ) {
296 $this->current_form = $args['current_form'];
297 foreach ( $this->translatable_strings() as $string ) {
298 $this->{$string} = apply_filters( 'frm_global_setting', $this->{$string}, $string, $this );
299 $this->{$string} = apply_filters( 'frm_global_' . $string, $this->{$string}, $this );
300 }
301 }
302 }
303
304 /**
305 * @param array $params
306 * @param array $errors
307 */
308 public function validate( $params, $errors ) {
309 return apply_filters( 'frm_validate_settings', $errors, $params );
310 }
311
312 /**
313 * @param array $params
314 *
315 * @return void
316 */
317 public function update( $params ) {
318 $this->fill_with_defaults( $params );
319 $this->update_settings( $params );
320
321 if ( $this->mu_menu ) {
322 update_site_option( 'frm_admin_menu_name', $this->menu );
323 } elseif ( current_user_can( 'administrator' ) ) {
324 update_site_option( 'frm_admin_menu_name', false );
325 }
326
327 $this->update_roles( $params );
328
329 do_action( 'frm_update_settings', $params );
330
331 if ( function_exists( 'get_filesystem_method' ) ) {
332 // Save styling settings in case fallback setting changes.
333 $frm_style = new FrmStyle();
334 $frm_style->update( 'default' );
335 }
336 }
337
338 /**
339 * @return void
340 */
341 private function update_settings( $params ) {
342 $this->active_captcha = $params['frm_active_captcha'];
343 $this->hcaptcha_pubkey = trim( $params['frm_hcaptcha_pubkey'] );
344 $this->hcaptcha_privkey = $params['frm_hcaptcha_privkey'];
345 $this->pubkey = trim( $params['frm_pubkey'] );
346 $this->privkey = $params['frm_privkey'];
347 $this->re_type = $params['frm_re_type'];
348 $this->re_lang = $params['frm_re_lang'];
349 $this->re_threshold = floatval( $params['frm_re_threshold'] );
350 $this->load_style = $params['frm_load_style'];
351 $this->custom_css = $params['frm_custom_css'];
352
353 $checkboxes = array( 'mu_menu', 're_multi', 'use_html', 'jquery_css', 'accordion_js', 'fade_form', 'no_ips', 'custom_header_ip', 'tracking', 'admin_bar' );
354 foreach ( $checkboxes as $set ) {
355 $this->$set = isset( $params[ 'frm_' . $set ] ) ? absint( $params[ 'frm_' . $set ] ) : 0;
356 }
357 }
358
359 /**
360 * @return void
361 */
362 private function update_roles( $params ) {
363 global $wp_roles;
364
365 $frm_roles = FrmAppHelper::frm_capabilities();
366 $roles = get_editable_roles();
367 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
368 $this->$frm_role = (array) ( isset( $params[ $frm_role ] ) ? $params[ $frm_role ] : 'administrator' );
369
370 // Make sure administrators always have permissions
371 if ( ! in_array( 'administrator', $this->$frm_role ) ) {
372 array_push( $this->$frm_role, 'administrator' );
373 }
374
375 foreach ( $roles as $role => $details ) {
376 if ( in_array( $role, $this->$frm_role ) ) {
377 $wp_roles->add_cap( $role, $frm_role );
378 } else {
379 $wp_roles->remove_cap( $role, $frm_role );
380 }
381 }
382 }
383 }
384
385 /**
386 * @return void
387 */
388 public function store() {
389 // Save the posted value in the database
390
391 update_option( 'frm_options', $this );
392
393 delete_transient( 'frm_options' );
394 set_transient( 'frm_options', $this );
395
396 do_action( 'frm_store_settings' );
397 }
398 }
399