PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.16.3
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.16.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 / helpers / FrmOnSubmitHelper.php

FrmOnSubmitHelper.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.16.3, at classes/helpers/FrmOnSubmitHelper.php

460 lines 14.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * On Submit action helper
4 *
5 * @package Formidable
6 * @since 6.0
7 */
8
9 if ( ! defined( 'ABSPATH' ) ) {
10 die( 'You are not allowed to call this page directly.' );
11 }
12
13 class FrmOnSubmitHelper {
14
15 /**
16 * Shows message settings.
17 *
18 * @param array $args {
19 * The args.
20 *
21 * @type object $form_action Form action post data.
22 * @type FrmFormAction $action_control Form action object.
23 * @type object $form Form data.
24 * @type string $action_key Action key.
25 * @type array $values Contains `fields` (form fields) and `id` (form ID).
26 * }
27 */
28 public static function show_message_settings( $args ) {
29 $id_attr = $args['action_control']->get_field_id( 'success_msg' );
30 ?>
31 <div class="frm_form_field frm_has_shortcodes">
32 <label for="<?php echo esc_attr( $id_attr ); ?>" class="screen-reader-text">
33 <?php esc_html_e( 'Message on submit', 'formidable' ); ?>
34 </label>
35
36 <?php
37 wp_editor(
38 $args['form_action']->post_content['success_msg'],
39 $id_attr,
40 array(
41 'textarea_name' => $args['action_control']->get_field_name( 'success_msg' ),
42 'textarea_rows' => 4,
43 'editor_class' => 'frm_not_email_message',
44 )
45 );
46 ?>
47 </div>
48
49 <?php
50 $id_attr = $args['action_control']->get_field_id( 'show_form' );
51 $name_attr = $args['action_control']->get_field_name( 'show_form' );
52 ?>
53 <div class="frm_form_field">
54 <?php
55 FrmHtmlHelper::toggle(
56 $id_attr,
57 $name_attr,
58 array(
59 'div_class' => 'with_frm_style frm_toggle',
60 'checked' => ! empty( $args['form_action']->post_content['show_form'] ),
61 'echo' => true,
62 )
63 );
64 ?>
65 <label for="<?php echo esc_attr( $id_attr ); ?>">
66 <?php esc_html_e( 'Show the form with the confirmation message', 'formidable' ); ?>
67 </label>
68 </div>
69 <?php
70 }
71
72 /**
73 * Shows redirect settings.
74 *
75 * @param array $args {
76 * The args.
77 *
78 * @type object $form_action Form action post data.
79 * @type FrmFormAction $action_control Form action object.
80 * @type object $form Form data.
81 * @type string $action_key Action key.
82 * @type array $values Contains `fields` (form fields) and `id` (form ID).
83 * }
84 */
85 public static function show_redirect_settings( $args ) {
86 $id_attr = $args['action_control']->get_field_id( 'success_url' );
87 ?>
88 <div class="frm_form_field frm_has_shortcodes">
89 <label for="<?php echo esc_attr( $id_attr ); ?>"><?php esc_html_e( 'Redirect URL', 'formidable' ); ?></label>
90 <input
91 type="text"
92 id="<?php echo esc_attr( $id_attr ); ?>"
93 name="<?php echo esc_attr( $args['action_control']->get_field_name( 'success_url' ) ); ?>"
94 value="<?php echo esc_attr( $args['form_action']->post_content['success_url'] ); ?>"
95 />
96 </div>
97
98 <?php
99 $id_attr = $args['action_control']->get_field_id( 'open_in_new_tab' );
100 $name_attr = $args['action_control']->get_field_name( 'open_in_new_tab' );
101 ?>
102 <div class="frm_form_field">
103 <?php
104 FrmHtmlHelper::toggle(
105 $id_attr,
106 $name_attr,
107 array(
108 'div_class' => 'with_frm_style frm_toggle',
109 'checked' => ! empty( $args['form_action']->post_content['open_in_new_tab'] ),
110 'echo' => true,
111 )
112 );
113 ?>
114 <label for="<?php echo esc_attr( $id_attr ); ?>" <?php FrmAppHelper::maybe_add_tooltip( 'new_tab' ); ?>>
115 <?php esc_html_e( 'Open in new tab', 'formidable' ); ?>
116 </label>
117 </div>
118 <?php
119 }
120
121 /**
122 * Shows page settings.
123 *
124 * @param array $args {
125 * The args.
126 *
127 * @type object $form_action Form action post data.
128 * @type FrmFormAction $action_control Form action object.
129 * @type object $form Form data.
130 * @type string $action_key Action key.
131 * @type array $values Contains `fields` (form fields) and `id` (form ID).
132 * }
133 */
134 public static function show_page_settings( $args ) {
135 $name_attr = $args['action_control']->get_field_name( 'success_page_id' );
136 ?>
137 <div class="frm_form_field">
138 <div class="frm_note_style">
139 <?php esc_html_e( 'NOTE: The selected page content will be displayed, but the full page will not be loaded. Traditional URL tracking in Google Analytics and similar tools won\'t register a page load event. If precise tracking is essential, consider using the \'Redirect to URL\' option.', 'formidable' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong ?>
140 </div>
141 <label for="<?php echo esc_attr( $name_attr ); ?>" class="screen-reader-text">
142 <?php esc_html_e( 'Select a page', 'formidable' ); ?>
143 </label>
144 <?php
145 FrmAppHelper::maybe_autocomplete_pages_options(
146 array(
147 'field_name' => $name_attr,
148 'page_id' => $args['form_action']->post_content['success_page_id'],
149 'placeholder' => __( 'Select a Page', 'formidable' ),
150 )
151 );
152 ?>
153 </div>
154 <?php
155 }
156
157 /**
158 * Gets all active On Submit form actions for form.
159 * This checks and gets data from WordPress cache group `frm_actions` first. It prevents the cache issue if form
160 * action is created during run time. If you use another cache method, please remember to delete the cache in
161 * {@see FrmFormAction::save_settings()}.
162 *
163 * @param int $form_id Form ID.
164 * @return array
165 */
166 public static function get_actions( $form_id ) {
167 $cache_key = 'frm_on_submit_actions_' . $form_id;
168 $actions = wp_cache_get( $cache_key, 'frm_actions' );
169 if ( false !== $actions ) {
170 return $actions;
171 }
172
173 $actions = FrmFormAction::get_action_for_form( $form_id, FrmOnSubmitAction::$slug, array( 'post_status' => 'publish' ) );
174 wp_cache_set( $cache_key, 'frm_actions' );
175 return $actions;
176 }
177
178 /**
179 * Gets On Submit action type (message, redirect or page).
180 *
181 * @param object $action Form action object.
182 * @return string
183 */
184 public static function get_action_type( $action ) {
185 if ( isset( $action->post_content['success_action'] ) ) {
186 return $action->post_content['success_action'];
187 }
188 return self::get_default_action_type();
189 }
190
191 public static function get_default_action_type() {
192 return 'message';
193 }
194
195 public static function get_default_msg() {
196 $msg = FrmAppHelper::get_settings()->success_msg;
197 return $msg ? $msg : __( 'Your responses were successfully submitted. Thank you!', 'formidable' );
198 }
199
200 public static function get_default_redirect_msg() {
201 return __( 'Please wait while you are redirected.', 'formidable' );
202 }
203
204 /**
205 * Gets the default open in new tab message.
206 *
207 * @since 6.3.1
208 *
209 * @return string
210 */
211 public static function get_default_new_tab_msg() {
212 return FrmAppHelper::get_settings()->new_tab_msg;
213 }
214
215 /**
216 * Adds the first On Submit action data to the form options to be saved.
217 *
218 * @param int $form_id Form ID.
219 */
220 public static function save_on_submit_settings( $form_id ) {
221 $actions = self::get_actions( $form_id );
222 $first_create_action = null;
223 $first_edit_action = null;
224 foreach ( $actions as $action ) {
225 if ( ! $first_create_action && in_array( 'create', $action->post_content['event'], true ) ) {
226 $first_create_action = $action;
227 }
228 if ( ! $first_edit_action && in_array( 'update', $action->post_content['event'], true ) ) {
229 $first_edit_action = $action;
230 }
231 }
232
233 $form_options = array();
234 self::populate_on_submit_data( $form_options, $first_create_action );
235 if ( method_exists( 'FrmProFormActionsController', 'change_on_submit_action_ops' ) && FrmAppHelper::pro_is_connected() ) {
236 $form_editable = FrmDb::get_var( 'frm_forms', array( 'id' => $form_id ), 'editable' );
237 if ( $form_editable ) {
238 self::populate_on_submit_data( $form_options, $first_edit_action, 'update' );
239 }
240 }
241
242 if ( ! empty( $form_options ) ) {
243 $_POST['options'] += $form_options;
244 }
245 }
246
247 /**
248 * Populates the On Submit data to form options.
249 *
250 * @param array $form_options Form options.
251 * @param object $action Optional. The On Submit action object.
252 * @param string $event Form event. Default is `create`.
253 */
254 public static function populate_on_submit_data( &$form_options, $action = null, $event = 'create' ) {
255 $opt = 'update' === $event ? 'edit_' : 'success_';
256 if ( ! $action || ! is_object( $action ) ) {
257 $form_options[ $opt . 'action' ] = self::get_default_action_type();
258 $form_options[ $opt . 'msg' ] = self::get_default_msg();
259
260 return;
261 }
262
263 $form_options[ $opt . 'action' ] = isset( $action->post_content['success_action'] ) ? $action->post_content['success_action'] : 'message';
264
265 switch ( $form_options[ $opt . 'action' ] ) {
266 case 'redirect':
267 $form_options[ $opt . 'url' ] = isset( $action->post_content['success_url'] ) ? $action->post_content['success_url'] : '';
268 $form_options['open_in_new_tab'] = ! empty( $action->post_content['open_in_new_tab'] );
269 break;
270
271 case 'page':
272 $form_options[ $opt . 'page_id' ] = isset( $action->post_content['success_page_id'] ) ? $action->post_content['success_page_id'] : '';
273 break;
274
275 default:
276 $form_options[ $opt . 'msg' ] = ! empty( $action->post_content['success_msg'] ) ? $action->post_content['success_msg'] : self::get_default_msg();
277 $form_options['show_form'] = ! empty( $action->post_content['show_form'] );
278 }
279 }
280
281 /**
282 * Maybe migrate submit settings from the form options to On Submit action.
283 * This is added after On Submit action is released. This might migrate the frontend editing submit settings too.
284 *
285 * @since 6.1.1
286 *
287 * @param int $form_id Form ID.
288 */
289 public static function maybe_migrate_submit_settings_to_action( $form_id ) {
290 $form = FrmDb::get_row( 'frm_forms', array( 'id' => $form_id ), 'options,editable' );
291 if ( ! $form ) {
292 return;
293 }
294
295 FrmAppHelper::unserialize_or_decode( $form->options );
296
297 if ( self::form_has_migrated( $form ) ) {
298 return;
299 }
300
301 $form->id = $form_id;
302 $action_type = FrmOnSubmitAction::$slug;
303
304 // Check if form already has form actions to avoid creating duplicates.
305 $has_actions = FrmFormAction::form_has_action_type( $form_id, $action_type );
306 if ( ! empty( $has_actions ) ) {
307 // Don't migrate again.
308 self::save_migrated_success_actions( $form );
309 return;
310 }
311
312 // Create On Submit action.
313 $base_action = array();
314
315 $base_action['post_type'] = FrmFormActionsController::$action_post_type;
316 $base_action['post_excerpt'] = $action_type;
317 $base_action['post_title'] = FrmOnSubmitAction::get_name();
318 $base_action['menu_order'] = $form_id;
319 $base_action['post_status'] = 'publish';
320 $base_action['post_content'] = array(
321 'event' => array( 'create' ),
322 );
323
324 $action_data = self::get_on_submit_action_data_from_form_options( $form->options );
325
326 // If frontend editing is enabled, migrate its settings too.
327 if ( method_exists( 'FrmProFormActionsController', 'change_on_submit_action_ops' ) && FrmAppHelper::pro_is_connected() && $form->editable ) {
328 $edit_data = self::get_on_submit_action_data_from_form_options( $form->options, 'update' );
329
330 if ( $action_data === $edit_data ) {
331 // Just create one action for both create and update if they are the same.
332 $base_action['post_content']['event'][] = 'update';
333 } else {
334 // Create a separate action for update.
335 $edit_action = $base_action;
336 $edit_action['post_content'] += $edit_data;
337 $edit_action['post_content']['event'] = array( 'update' );
338
339 $edit_action['post_content'] = FrmAppHelper::prepare_and_encode( $edit_action['post_content'] );
340 FrmDb::save_json_post( $edit_action );
341 }
342 }
343
344 $action = $base_action;
345 $action['post_content'] += $action_data;
346
347 $action['post_content'] = FrmAppHelper::prepare_and_encode( $action['post_content'] );
348 FrmDb::save_json_post( $action );
349
350 self::save_migrated_success_actions( $form );
351 }
352
353 /**
354 * Gets On Submit action data from form options to be used for the migration.
355 *
356 * @since 6.1.1
357 *
358 * @param array $form_options Form options.
359 * @param string $event Action event. Accepts `create` or `update`. Default is `create`.
360 * @return array
361 */
362 private static function get_on_submit_action_data_from_form_options( $form_options, $event = 'create' ) {
363 $opt = 'update' === $event ? 'edit_' : 'success_';
364 $data = array(
365 'success_action' => isset( $form_options[ $opt . 'action' ] ) ? $form_options[ $opt . 'action' ] : self::get_default_action_type(),
366 );
367
368 switch ( $data['success_action'] ) {
369 case 'redirect':
370 $data['success_url'] = isset( $form_options[ $opt . 'url' ] ) ? $form_options[ $opt . 'url' ] : '';
371 break;
372
373 case 'page':
374 $data['success_page_id'] = isset( $form_options[ $opt . 'page_id' ] ) ? $form_options[ $opt . 'page_id' ] : '';
375 break;
376
377 default:
378 $data['success_msg'] = isset( $form_options[ $opt . 'msg' ] ) ? $form_options[ $opt . 'msg' ] : self::get_default_msg();
379 $data['show_form'] = ! empty( $form_options['show_form'] );
380 }
381
382 return $data;
383 }
384
385 /**
386 * Checks if On Submit settings are migrated.
387 *
388 * @since 6.1.1
389 *
390 * @param object $form Form object.
391 * @return bool
392 */
393 public static function form_has_migrated( $form ) {
394 return ! empty( $form->options['on_submit_migrated'] );
395 }
396
397 /**
398 * @since 6.1.1
399 *
400 * @param object $form Limited form object.
401 * @return void
402 */
403 private static function save_migrated_success_actions( $form ) {
404 // Options may be an empty string.
405 if ( ! is_array( $form->options ) ) {
406 $form->options = array();
407 }
408 $form->options['on_submit_migrated'] = 1;
409 FrmForm::update( $form->id, array( 'options' => $form->options ) );
410 }
411
412 /**
413 * Gets fallback action, used when no actions match.
414 *
415 * @since 6.1.1
416 *
417 * @param array|string $event Uses 'create' or 'update'.
418 *
419 * @return object
420 */
421 public static function get_fallback_action( $event = 'create' ) {
422 $action = new stdClass();
423
424 $action->post_content = array(
425 'event' => (array) $event,
426 'success_action' => 'message',
427 'success_msg' => self::get_default_msg(),
428 );
429
430 return $action;
431 }
432
433 /**
434 * Gets fallback action after opening the redirect URL in a new tab.
435 *
436 * @since 6.3.1
437 *
438 * @param array|string $event Uses 'create' or 'update'.
439 * @return object
440 */
441 public static function get_fallback_action_after_open_in_new_tab( $event ) {
442 $action = self::get_fallback_action( $event );
443
444 $action->post_content['success_msg'] = self::get_default_new_tab_msg();
445
446 return $action;
447 }
448
449 /**
450 * Check if the current event has been passed. If not, use create actions.
451 *
452 * @since 6.1.1
453 *
454 * @return string
455 */
456 public static function current_event( $atts ) {
457 return ! empty( $atts['action'] ) ? $atts['action'] : 'create';
458 }
459 }
460