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

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

845 lines 22.5 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 FrmFormActionsController {
7
8 /**
9 * @var string
10 */
11 public static $action_post_type = 'frm_form_actions';
12
13 /**
14 * @var array|null
15 */
16 public static $registered_actions;
17
18 /**
19 * Variables saved in the post:
20 * post_content: json settings
21 * menu_order: form id
22 * post_excerpt: action type
23 */
24 public static function register_post_types() {
25 register_post_type(
26 self::$action_post_type,
27 array(
28 'label' => __( 'Form Actions', 'formidable' ),
29 'description' => '',
30 'public' => false,
31 'show_ui' => false,
32 'exclude_from_search' => true,
33 'show_in_nav_menus' => false,
34 'show_in_menu' => true,
35 'capability_type' => 'page',
36 'supports' => array( 'title', 'editor', 'excerpt', 'custom-fields', 'page-attributes' ),
37 'has_archive' => false,
38 )
39 );
40
41 self::actions_init();
42 }
43
44 public static function actions_init() {
45 self::$registered_actions = new Frm_Form_Action_Factory();
46 self::register_actions();
47 do_action( 'frm_form_actions_init' );
48 }
49
50 /**
51 * @return void
52 */
53 public static function register_actions() {
54 $action_classes = array(
55 'on_submit' => 'FrmOnSubmitAction',
56 'email' => 'FrmEmailAction',
57 'wppost' => 'FrmDefPostAction',
58 'register' => 'FrmDefRegAction',
59 'paypal' => 'FrmDefPayPalAction',
60 'payment' => 'FrmTransLiteAction',
61 'quiz' => 'FrmDefQuizAction',
62 'quiz_outcome' => 'FrmDefQuizOutcomeAction',
63 'mailchimp' => 'FrmDefMlcmpAction',
64 'api' => 'FrmDefApiAction',
65 'salesforce' => 'FrmDefSalesforceAction',
66 'activecampaign' => 'FrmDefActiveCampaignAction',
67 'constantcontact' => 'FrmDefConstContactAction',
68 'getresponse' => 'FrmDefGetResponseAction',
69 'hubspot' => 'FrmDefHubspotAction',
70 'zapier' => 'FrmDefZapierAction',
71 'n8n' => 'FrmDefN8NAction',
72 'twilio' => 'FrmDefTwilioAction',
73 'highrise' => 'FrmDefHighriseAction',
74 'mailpoet' => 'FrmDefMailpoetAction',
75 'aweber' => 'FrmDefAweberAction',
76 'convertkit' => 'FrmDefConvertKitAction',
77 'googlespreadsheet' => 'FrmDefGoogleSpreadsheetAction',
78 );
79
80 $action_classes = apply_filters( 'frm_registered_form_actions', $action_classes );
81 $action_classes = self::maybe_unset_highrise( $action_classes );
82
83 include_once FrmAppHelper::plugin_path() . '/classes/views/frm-form-actions/email_action.php';
84 include_once FrmAppHelper::plugin_path() . '/classes/views/frm-form-actions/default_actions.php';
85
86 foreach ( $action_classes as $action_class ) {
87 self::$registered_actions->register( $action_class );
88 }
89 }
90
91 /**
92 * Remove the Highrise action if it is not registered.
93 *
94 * @since 6.23
95 *
96 * @param array $action_classes
97 *
98 * @return array
99 */
100 private static function maybe_unset_highrise( $action_classes ) {
101 if ( 'FrmDefHighriseAction' === ( $action_classes['highrise'] ?? '' ) ) {
102 unset( $action_classes['highrise'] );
103 }
104 return $action_classes;
105 }
106
107 /**
108 * @since 4.0
109 *
110 * @param array $values
111 */
112 public static function email_settings( $values ) {
113 $form = FrmForm::getOne( $values['id'] );
114 $groups = self::form_action_groups();
115 $action_controls = self::get_form_actions();
116 self::maybe_add_action_to_group( $action_controls, $groups );
117
118 $allowed = self::active_actions( $action_controls );
119
120 include FrmAppHelper::plugin_path() . '/classes/views/frm-form-actions/settings.php';
121 }
122
123 /**
124 * Add unknown actions to a group.
125 *
126 * @since 4.0
127 *
128 * @param array $action_controls
129 * @param array $groups
130 *
131 * @return void
132 */
133 private static function maybe_add_action_to_group( $action_controls, &$groups ) {
134 $grouped = array();
135
136 foreach ( $groups as $group ) {
137 if ( isset( $group['actions'] ) ) {
138 $grouped = array_merge( $grouped, $group['actions'] );
139 }
140 }
141
142 foreach ( $action_controls as $action ) {
143 if ( isset( $groups[ $action->id_base ] ) || in_array( $action->id_base, $grouped, true ) ) {
144 continue;
145 }
146
147 $this_group = $action->action_options['group'];
148
149 if ( ! isset( $groups[ $this_group ] ) ) {
150 $this_group = 'misc';
151 }
152
153 if ( ! isset( $groups[ $this_group ]['actions'] ) ) {
154 $groups[ $this_group ]['actions'] = array();
155 }
156 $groups[ $this_group ]['actions'][] = $action->id_base;
157
158 unset( $action );
159 }
160 }
161
162 /**
163 * @since 4.0
164 *
165 * @return array
166 */
167 public static function form_action_groups() {
168 $groups = array(
169 'misc' => array(
170 'name' => '',
171 'icon' => 'frmfont frm_shuffle_icon',
172 'actions' => array(
173 'email',
174 'wppost',
175 'register',
176 'quiz',
177 'quiz_outcome',
178 'twilio',
179 ),
180 ),
181 'payment' => array(
182 'name' => __( 'eCommerce', 'formidable' ),
183 'icon' => 'frmfont frm_credit_card_alt_icon',
184 'actions' => array(
185 'paypal',
186 'payment',
187 ),
188 ),
189 'marketing' => array(
190 'name' => __( 'Email Marketing', 'formidable' ),
191 'icon' => 'frmfont frm_mail_bulk_icon',
192 'actions' => array(
193 'mailchimp',
194 'activecampaign',
195 'constantcontact',
196 'getresponse',
197 'aweber',
198 'mailpoet',
199 'convertkit',
200 ),
201 ),
202 'crm' => array(
203 'name' => __( 'CRM', 'formidable' ),
204 'icon' => 'frmfont frm_address_card_icon',
205 'actions' => self::get_crm_actions(),
206 ),
207 );
208
209 return apply_filters( 'frm_action_groups', $groups );
210 }
211
212 /**
213 * Get the actions to include in the CRM section.
214 *
215 * @since 6.23
216 *
217 * @return array
218 */
219 private static function get_crm_actions() {
220 $crm_actions = array(
221 'salesforce',
222 'hubspot',
223 );
224
225 // Only include Highrise when the add-on is active.
226 // This is because Highrise is deprecated. We don't want to show it in Lite.
227 if ( class_exists( 'FrmHrsSettings' ) ) {
228 $crm_actions[] = 'highrise';
229 }
230
231 return $crm_actions;
232 }
233
234 /**
235 * Get the number of currently active form actions.
236 *
237 * @since 4.0
238 *
239 * @param array $action_controls
240 *
241 * @return array
242 */
243 private static function active_actions( $action_controls ) {
244 $allowed = array();
245
246 foreach ( $action_controls as $action_control ) {
247 if ( ! empty( $action_control->action_options['active'] ) ) {
248 $allowed[] = $action_control->id_base;
249 }
250 }
251
252 return $allowed;
253 }
254
255 /**
256 * For each add-on, add an li, class, and javascript function. If active, add an additional class.
257 *
258 * @since 4.0
259 *
260 * @param object $action_control
261 * @param array $allowed
262 */
263 public static function show_action_icon_link( $action_control, $allowed ) {
264 $data = array();
265 $classes = ' frm_' . $action_control->id_base . '_action frm_single_action';
266 $group_class = ' frm-group-' . $action_control->action_options['group'];
267
268 /* translators: %s: Name of form action */
269 $upgrade_label = sprintf( esc_html__( '%s form actions', 'formidable' ), $action_control->action_options['tooltip'] );
270
271 $default_shown = array( 'wppost', 'register', 'payment', 'quiz', 'hubspot' );
272 $default_shown = array_values( array_diff( $default_shown, $allowed ) );
273 $default_position = array_search( $action_control->id_base, $default_shown, true );
274 $allowed_count = count( $allowed );
275
276 if ( ! empty( $action_control->action_options['active'] ) ) {
277 $classes .= ' frm_active_action';
278 } else {
279 $classes .= ' frm_inactive_action';
280
281 if ( $default_position !== false && ( $allowed_count + $default_position ) < 6 ) {
282 $group_class .= ' frm-default-show';
283 }
284
285 $data['data-upgrade'] = $upgrade_label;
286 $data['data-medium'] = 'settings-' . $action_control->id_base;
287
288 $upgrading = FrmAddonsController::install_link( $action_control->action_options['plugin'] );
289
290 if ( isset( $upgrading['url'] ) ) {
291 $data['data-oneclick'] = json_encode( $upgrading );
292 }
293
294 if ( isset( $action_control->action_options['message'] ) ) {
295 $data['data-message'] = $action_control->action_options['message'];
296 }
297
298 $requires = FrmFormsHelper::get_plan_required( $upgrading );
299
300 if ( $requires && 'free' !== $requires ) {
301 $data['data-requires'] = $requires;
302 }
303 }//end if
304
305 // HTML to include on the icon.
306 $icon_atts = array();
307
308 if ( $action_control->action_options['color'] !== 'var(--primary-700)' ) {
309 $icon_atts = array(
310 'style' => '--primary-700:' . $action_control->action_options['color'],
311 );
312 }
313
314 include FrmAppHelper::plugin_path() . '/classes/views/frm-form-actions/_action_icon.php';
315 }
316
317 /**
318 * @param string $action
319 *
320 * @return array|FrmFormAction A single form action is returned when a specific $action value is requested.
321 */
322 public static function get_form_actions( $action = 'all' ) {
323 $temp_actions = self::$registered_actions;
324
325 if ( ! $temp_actions ) {
326 self::actions_init();
327 $temp_actions = self::$registered_actions->actions;
328 } else {
329 $temp_actions = $temp_actions->actions;
330 }
331
332 $actions = array();
333
334 foreach ( $temp_actions as $a ) {
335 if ( 'all' !== $action && $a->id_base === $action ) {
336 return $a;
337 }
338
339 $actions[ $a->id_base ] = $a;
340 }
341
342 return $actions;
343 }
344
345 /**
346 * @since 2.0
347 *
348 * @param object $form
349 * @param array $values
350 *
351 * @return void
352 */
353 public static function list_actions( $form, $values ) {
354 if ( ! $form ) {
355 return;
356 }
357
358 /**
359 * Use this hook to migrate old settings into a new action
360 *
361 * @since 2.0
362 */
363 do_action( 'frm_before_list_actions', $form );
364
365 $filters = array(
366 'post_status' => 'all',
367 );
368 $form_actions = FrmFormAction::get_action_for_form( $form->id, 'all', $filters );
369
370 /**
371 * @var array
372 */
373 $action_controls = self::get_form_actions();
374
375 $action_map = array();
376
377 foreach ( $action_controls as $key => $control ) {
378 $action_map[ $control->id_base ] = $key;
379 }
380
381 self::maybe_show_limit_warning( $form->id, $form_actions );
382
383 foreach ( $form_actions as $action ) {
384 if ( ! isset( $action_map[ $action->post_excerpt ] ) ) {
385 // Don't try and show settings if action no longer exists
386 continue;
387 }
388
389 self::action_control( $action, $form, $action->ID, $action_controls[ $action_map[ $action->post_excerpt ] ], $values );
390 }
391 }
392
393 /**
394 * Show a warning before the form actions list if there are 99 actions, and the limit is set to 99.
395 * If it is filtered, the warning is still shown when applicable, just using the new limit.
396 *
397 * @since 6.17
398 *
399 * @param int|string $form_id
400 * @param array $form_actions
401 *
402 * @return void
403 */
404 private static function maybe_show_limit_warning( $form_id, $form_actions ) {
405 $count = count( $form_actions );
406
407 if ( $count < 99 ) {
408 return;
409 }
410
411 $limit = FrmFormAction::get_action_limit( $form_id );
412
413 if ( $limit < 99 || $count < $limit ) {
414 return;
415 }
416
417 $documentation_url = 'https://formidableforms.com/knowledgebase/frm_form_action_limit/#kb-increase-limit-of-form-actions';
418
419 echo '<div class="frm_warning_style">';
420 FrmAppHelper::icon_by_class( 'frmfont frm_alert_icon' );
421 echo '&nbsp;';
422 printf(
423 // translators: %s: URL to documentation
424 esc_html__( 'You have reached your form action limit. To increase this limit, you will require additional code. Visit our documentation at %s.', 'formidable' ),
425 '<a href="' . esc_url( $documentation_url ) . '" target="_blank">' . esc_html( $documentation_url ) . '</a>'
426 );
427 echo '</div>';
428 }
429
430 /**
431 * @param WP_Post $form_action
432 * @param object $form
433 * @param int $action_key Action ID.
434 * @param FrmFormAction $action_control
435 * @param array $values
436 *
437 * @return void
438 */
439 public static function action_control( $form_action, $form, $action_key, $action_control, $values ) {
440 $action_control->_set( $action_key );
441
442 $use_logging = self::should_show_log_message( $form_action->post_excerpt );
443
444 include FrmAppHelper::plugin_path() . '/classes/views/frm-form-actions/form_action.php';
445 }
446
447 public static function add_form_action() {
448 FrmAppHelper::permission_check( 'frm_edit_forms' );
449 check_ajax_referer( 'frm_ajax', 'nonce' );
450
451 global $frm_vars;
452
453 $action_key = FrmAppHelper::get_param( 'list_id', '', 'post', 'absint' );
454 $action_type = FrmAppHelper::get_param( 'type', '', 'post', 'sanitize_text_field' );
455
456 /**
457 * @var FrmFormAction
458 */
459 $action_control = self::get_form_actions( $action_type );
460 $action_control->_set( $action_key );
461
462 $form_id = FrmAppHelper::get_param( 'form_id', '', 'post', 'absint' );
463 $form_action = $action_control->prepare_new( $form_id );
464 $use_logging = self::should_show_log_message( $action_type );
465 $values = array();
466 $form = self::fields_to_values( $form_id, $values );
467
468 include FrmAppHelper::plugin_path() . '/classes/views/frm-form-actions/form_action.php';
469 wp_die();
470 }
471
472 public static function fill_action() {
473 FrmAppHelper::permission_check( 'frm_edit_forms' );
474 check_ajax_referer( 'frm_ajax', 'nonce' );
475
476 $action_key = FrmAppHelper::get_param( 'action_id', '', 'post', 'absint' );
477 $action_type = FrmAppHelper::get_param( 'action_type', '', 'post', 'sanitize_text_field' );
478 $action_control = self::get_form_actions( $action_type );
479
480 if ( ! $action_control ) {
481 wp_die();
482 }
483
484 $form_action = $action_control->get_single_action( $action_key );
485 $values = array();
486 $form = self::fields_to_values( $form_action->menu_order, $values );
487 $use_logging = self::should_show_log_message( $action_type );
488
489 include FrmAppHelper::plugin_path() . '/classes/views/frm-form-actions/_action_inside.php';
490 wp_die();
491 }
492
493 /**
494 * @since 3.06.04
495 *
496 * @param string $action_type
497 *
498 * @return bool
499 */
500 private static function should_show_log_message( $action_type ) {
501 $logging = array( 'api', 'salesforce', 'constantcontact', 'activecampaign' );
502 return in_array( $action_type, $logging, true ) && ! function_exists( 'frm_log_autoloader' );
503 }
504
505 /**
506 * @param int|string $form_id
507 * @param array $values
508 *
509 * @return object
510 */
511 private static function fields_to_values( $form_id, array &$values ) {
512 $form = FrmForm::getOne( $form_id );
513
514 $values = array(
515 'fields' => array(),
516 'id' => $form->id,
517 );
518
519 $fields = FrmField::get_all_for_form( $form->id );
520
521 foreach ( $fields as $k => $f ) {
522 $f = (array) $f;
523 $opts = (array) $f['field_options'];
524 $f = array_merge( $opts, $f );
525
526 if ( ! isset( $f['post_field'] ) ) {
527 $f['post_field'] = '';
528 }
529 $values['fields'][] = $f;
530 unset( $k, $f );
531 }
532
533 return $form;
534 }
535
536 /**
537 * @param int $form_id
538 *
539 * @return void
540 */
541 public static function update_settings( $form_id ) {
542 FrmAppHelper::permission_check( 'frm_edit_forms' );
543 $process_form = FrmAppHelper::get_post_param( 'process_form', '', 'sanitize_text_field' );
544
545 if ( ! wp_verify_nonce( $process_form, 'process_form_nonce' ) ) {
546 $frm_settings = FrmAppHelper::get_settings();
547 $error_args = array(
548 'title' => __( 'Verification failed', 'formidable' ),
549 'body' => $frm_settings->admin_permission,
550 'cancel_url' => add_query_arg(
551 array(
552 'page' => 'formidable',
553 'frm_action' => 'settings',
554 'id' => $form_id,
555 ),
556 admin_url( 'admin.php?' )
557 ),
558 );
559 FrmAppController::show_error_modal( $error_args );
560 return;
561 }
562
563 global $wpdb;
564
565 $registered_actions = self::$registered_actions->actions;
566
567 $old_actions = FrmDb::get_col(
568 $wpdb->posts,
569 array(
570 'post_type' => self::$action_post_type,
571 'menu_order' => $form_id,
572 ),
573 'ID'
574 );
575 $new_actions = array();
576
577 foreach ( $registered_actions as $registered_action ) {
578 $action_ids = $registered_action->update_callback( $form_id );
579
580 if ( $action_ids ) {
581 $new_actions[] = $action_ids;
582 }
583 }
584
585 // Only use array_merge if there are new actions.
586 if ( $new_actions ) {
587 $new_actions = call_user_func_array( 'array_merge', $new_actions );
588 }
589
590 $old_actions = array_diff( $old_actions, $new_actions );
591
592 self::delete_missing_actions( $old_actions );
593
594 FrmOnSubmitHelper::save_on_submit_settings( $form_id );
595 }
596
597 /**
598 * @param array $old_actions
599 *
600 * @return void
601 */
602 public static function delete_missing_actions( $old_actions ) {
603 if ( $old_actions ) {
604 foreach ( $old_actions as $old_id ) {
605 wp_delete_post( $old_id );
606 }
607 FrmDb::cache_delete_group( 'frm_actions' );
608 }
609 }
610
611 /**
612 * @param int|string $entry_id
613 * @param int|string $form_id
614 * @param array $args
615 *
616 * @return void
617 */
618 public static function trigger_create_actions( $entry_id, $form_id, $args = array() ) {
619 $filter_args = $args;
620 $filter_args['entry_id'] = $entry_id;
621 $filter_args['form_id'] = $form_id;
622
623 /**
624 * @since 2.0.23
625 * @since 6.11.2 $filter_args is now passed instead of $args. It includes additional ID data.
626 *
627 * @param string $event 'create' by default. Pro may filter this value to 'draft' instead.
628 * @param array $filter_args
629 */
630 $event = apply_filters( 'frm_trigger_create_action', 'create', $filter_args );
631
632 self::trigger_actions( $event, $form_id, $entry_id, 'all', $args );
633 }
634
635 /**
636 * @param string $event
637 * @param int|object|string $form
638 * @param int|object|string $entry
639 * @param string $type
640 * @param array $args
641 *
642 * @return void
643 */
644 public static function trigger_actions( $event, $form, $entry, $type = 'all', $args = array() ) { // phpcs:ignore SlevomatCodingStandard.Complexity.Cognitive.ComplexityTooHigh
645 $action_status = array(
646 'post_status' => 'publish',
647 );
648 $form_actions = FrmFormAction::get_action_for_form( is_object( $form ) ? $form->id : $form, $type, $action_status );
649
650 if ( ! $form_actions ) {
651 return;
652 }
653
654 FrmForm::maybe_get_form( $form );
655
656 if ( ! is_object( $form ) ) {
657 return;
658 }
659
660 $link_settings = self::get_form_actions( $type );
661
662 if ( 'all' !== $type ) {
663 $link_settings = array( $type => $link_settings );
664 }
665
666 $stored_actions = array();
667 $action_priority = array();
668
669 if ( in_array( $event, array( 'create', 'update' ), true ) && defined( 'WP_IMPORTING' ) && WP_IMPORTING ) {
670 $this_event = 'import';
671 } else {
672 $this_event = $event;
673 }
674
675 foreach ( $form_actions as $action ) {
676 $skip_this_action = ! in_array( $this_event, $action->post_content['event'], true ) || FrmOnSubmitAction::$slug === $action->post_excerpt;
677 $skip_this_action = apply_filters( 'frm_skip_form_action', $skip_this_action, compact( 'action', 'entry', 'form', 'event' ) );
678
679 if ( $skip_this_action ) {
680 continue;
681 }
682
683 if ( ! is_object( $entry ) ) {
684 $entry = FrmEntry::getOne( $entry, true );
685 }
686
687 if ( ! $entry || ( FrmEntriesHelper::DRAFT_ENTRY_STATUS === (int) $entry->is_draft && 'draft' !== $event ) ) {
688 continue;
689 }
690
691 $child_entry = ( is_numeric( $form->parent_form_id ) && $form->parent_form_id ) || ( $entry && ( (int) $entry->form_id !== (int) $form->id || $entry->parent_item_id ) ) || ! empty( $args['is_child'] ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
692
693 if ( $child_entry ) {
694 // Maybe trigger actions for sub forms
695 $trigger_children = apply_filters( 'frm_use_embedded_form_actions', false, compact( 'form', 'entry' ) );
696
697 if ( ! $trigger_children ) {
698 continue;
699 }
700 }
701
702 // Check conditional logic.
703 $stop = FrmFormAction::action_conditions_met( $action, $entry );
704
705 if ( $stop ) {
706 continue;
707 }
708
709 // Store actions so they can be triggered with the correct priority.
710 $stored_actions[ $action->ID ] = $action;
711 $action_priority[ $action->ID ] = $link_settings[ $action->post_excerpt ]->action_options['priority'];
712
713 unset( $action );
714 }//end foreach
715
716 if ( $stored_actions ) {
717 asort( $action_priority );
718
719 // Make sure hooks are loaded.
720 new FrmNotification();
721
722 foreach ( $action_priority as $action_id => $priority ) {
723 $action = $stored_actions[ $action_id ];
724
725 /**
726 * Allows custom form action trigger.
727 *
728 * @since 6.10
729 *
730 * @param bool $skip Skip default trigger.
731 * @param object $action Action object.
732 * @param object $entry Entry object.
733 * @param object $form Form object.
734 * @param string $event Event ('create' or 'update').
735 */
736 if ( false === apply_filters( 'frm_custom_trigger_action', false, $action, $entry, $form, $event ) ) {
737 do_action( 'frm_trigger_' . $action->post_excerpt . '_action', $action, $entry, $form, $event );
738 do_action( 'frm_trigger_' . $action->post_excerpt . '_' . $event . '_action', $action, $entry, $form );
739 }
740
741 // If post is created, get updated $entry object.
742 if ( $action->post_excerpt === 'wppost' && $event === 'create' ) {
743 $entry = FrmEntry::getOne( $entry->id, true );
744 }
745 }//end foreach
746 }//end if
747 }
748
749 /**
750 * @param int|string $form_id
751 * @param array $values
752 * @param array $args
753 *
754 * @return void
755 */
756 public static function duplicate_form_actions( $form_id, $values, $args = array() ) {
757 if ( empty( $args['old_id'] ) ) {
758 // Continue if we know which actions to copy.
759 return;
760 }
761
762 /**
763 * @var array
764 */
765 $action_controls = self::get_form_actions();
766
767 foreach ( $action_controls as $action_control ) {
768 $action_control->duplicate_form_actions( $form_id, $args['old_id'] );
769 unset( $action_control );
770 }
771 }
772
773 /**
774 * @param string $where
775 *
776 * @return string
777 */
778 public static function limit_by_type( $where ) {
779 global $frm_vars, $wpdb;
780
781 if ( ! isset( $frm_vars['action_type'] ) ) {
782 return $where;
783 }
784
785 return $where . $wpdb->prepare( ' AND post_excerpt = %s ', $frm_vars['action_type'] );
786 }
787
788 /**
789 * Prevent WPML from filtering form actions based on the active language.
790 *
791 * @since 6.20
792 *
793 * @param bool|null $null
794 * @param string $post_type
795 *
796 * @return bool|null
797 */
798 public static function prevent_wpml_translations( $null, $post_type ) {
799 return self::$action_post_type === $post_type ? false : $null;
800 }
801 }
802
803 class Frm_Form_Action_Factory {
804
805 /**
806 * @var array
807 */
808 public $actions = array();
809
810 public function __construct() {
811 add_action( 'frm_form_actions_init', array( $this, '_register_actions' ), 100 );
812 }
813
814 /**
815 * @param string $action_class
816 *
817 * @return void
818 */
819 public function register( $action_class ) {
820 $this->actions[ $action_class ] = new $action_class();
821 }
822
823 /**
824 * @param string $action_class
825 *
826 * @return void
827 */
828 public function unregister( $action_class ) {
829 if ( isset( $this->actions[ $action_class ] ) ) {
830 unset( $this->actions[ $action_class ] );
831 }
832 }
833
834 public function _register_actions() {
835 $keys = array_keys( $this->actions );
836
837 foreach ( $keys as $key ) {
838 // Don't register new action if old action with the same id is already registered
839 if ( ! isset( $this->actions[ $key ] ) ) {
840 $this->actions[ $key ]->_register();
841 }
842 }
843 }
844 }
845