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

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

794 lines 22.7 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 FrmEntriesController {
7
8 public static function menu() {
9 FrmAppHelper::force_capability( 'frm_view_entries' );
10
11 add_submenu_page( 'formidable', 'Formidable | ' . __( 'Entries', 'formidable' ), __( 'Entries', 'formidable' ), 'frm_view_entries', 'formidable-entries', 'FrmEntriesController::route' );
12
13 $views_installed = is_callable( 'FrmProAppHelper::views_is_installed' ) && FrmProAppHelper::views_is_installed();
14 if ( ! $views_installed ) {
15 add_submenu_page( 'formidable', 'Formidable | ' . __( 'Views', 'formidable' ), __( 'Views', 'formidable' ), 'frm_view_entries', 'formidable-views', 'FrmFormsController::no_views' );
16 self::maybe_redirect_to_views_upsell();
17 } else {
18 self::maybe_redirect_to_views_index();
19 }
20
21 if ( FrmAppHelper::is_admin_page( 'formidable-entries' ) ) {
22 self::load_manage_entries_hooks();
23 }
24 }
25
26 /**
27 * This function is called when views is installed.
28 * The Views add-on uses a different URL for the Views tab than the upsell page.
29 * If the user is on the upsell page, instead of showing a permission error on reload,
30 * redirect to the views index page.
31 *
32 * @since 6.14.1
33 *
34 * @return void
35 */
36 private static function maybe_redirect_to_views_index() {
37 if ( ! FrmAppHelper::is_admin_page( 'formidable-views' ) ) {
38 return;
39 }
40
41 $query_args = array(
42 'post_type' => 'frm_display',
43 );
44 $query_args = self::add_url_params_to_views_redirect_query_args( $query_args );
45
46 wp_safe_redirect( add_query_arg( $query_args, admin_url( 'edit.php' ) ) );
47 die();
48 }
49
50 /**
51 * This function is called when views is inactive.
52 * A user may deactivate views but then try to reload the views index.
53 * Instead of showing a permission error, redirect to the views upsell page.
54 *
55 * @since 6.14.1
56 *
57 * @return void
58 */
59 private static function maybe_redirect_to_views_upsell() {
60 global $pagenow;
61 if ( 'edit.php' !== $pagenow || 'frm_display' !== FrmAppHelper::simple_get( 'post_type' ) ) {
62 return;
63 }
64
65 $query_args = array(
66 'page' => 'formidable-views',
67 );
68 $query_args = self::add_url_params_to_views_redirect_query_args( $query_args );
69
70 wp_safe_redirect( add_query_arg( $query_args, admin_url( 'admin.php' ) ) );
71 die();
72 }
73
74 /**
75 * @since 6.14.1
76 *
77 * @param array $query_args
78 * @return array
79 */
80 private static function add_url_params_to_views_redirect_query_args( $query_args ) {
81 $query_args['show_nav'] = FrmAppHelper::simple_get( 'show_nav', 'absint', 0 );
82
83 $form_id = FrmAppHelper::simple_get( 'form', 'absint', 0 );
84 if ( $form_id ) {
85 $query_args['form'] = $form_id;
86 }
87
88 return $query_args;
89 }
90
91 /**
92 * @since 2.05.07
93 */
94 private static function load_manage_entries_hooks() {
95 if ( ! in_array( FrmAppHelper::simple_get( 'frm_action', 'sanitize_title' ), array( 'edit', 'show', 'new', 'duplicate' ), true ) ) {
96 $menu_name = FrmAppHelper::get_menu_name();
97 $base = self::base_column_key( $menu_name );
98
99 add_filter( 'manage_' . $base . '_columns', 'FrmEntriesController::manage_columns' );
100 add_filter( 'get_user_option_' . self::hidden_column_key( $menu_name ), 'FrmEntriesController::hidden_columns' );
101 add_filter( 'manage_' . $base . '_sortable_columns', 'FrmEntriesController::sortable_columns' );
102 } else {
103 add_filter( 'screen_options_show_screen', self::class . '::remove_screen_options', 10, 2 );
104 }
105 }
106
107 /**
108 * Display in Back End.
109 */
110 public static function route() {
111 $action = FrmAppHelper::get_param( 'frm_action', '', 'get', 'sanitize_title' );
112 FrmAppHelper::include_svg();
113
114 switch ( $action ) {
115 case 'show':
116 case 'destroy':
117 return self::$action();
118
119 default:
120 do_action( 'frm_entry_action_route', $action );
121 if ( apply_filters( 'frm_entry_stop_action_route', false, $action ) ) {
122 return;
123 }
124
125 return self::display_list();
126 }
127 }
128
129 /**
130 * Prevent the "screen options" tab from showing when
131 * editing or creating an entry
132 *
133 * @since 3.0
134 */
135 public static function remove_screen_options( $show_screen, $screen ) {
136 $menu_name = sanitize_title( FrmAppHelper::get_menu_name() );
137 $unread_count = FrmEntriesHelper::get_visible_unread_inbox_count();
138
139 if ( $screen->id === $menu_name . ( $unread_count ? '-' . $unread_count : '' ) . '_page_formidable-entries' ) {
140 $show_screen = false;
141 }
142
143 return $show_screen;
144 }
145
146 public static function manage_columns( $columns ) {
147 global $frm_vars;
148 $form_id = FrmForm::get_current_form_id();
149
150 $columns[ $form_id . '_id' ] = 'ID';
151 $columns[ $form_id . '_item_key' ] = esc_html__( 'Entry Key', 'formidable' );
152
153 if ( $form_id ) {
154 self::get_columns_for_form( $form_id, $columns );
155 } else {
156 $columns[ $form_id . '_form_id' ] = esc_html__( 'Form', 'formidable' );
157 $columns[ $form_id . '_name' ] = esc_html__( 'Entry Name', 'formidable' );
158 $columns[ $form_id . '_user_id' ] = esc_html__( 'Created By', 'formidable' );
159 }
160
161 $columns[ $form_id . '_is_draft' ] = esc_html__( 'Entry Status', 'formidable' );
162 $columns[ $form_id . '_created_at' ] = __( 'Entry creation date', 'formidable' );
163 $columns[ $form_id . '_updated_at' ] = __( 'Entry update date', 'formidable' );
164 self::maybe_add_ip_col( $form_id, $columns );
165
166 $frm_vars['cols'] = $columns;
167
168 $action = FrmAppHelper::simple_get( 'frm_action', 'sanitize_title' );
169 if ( FrmAppHelper::is_admin_page( 'formidable-entries' ) && in_array( $action, array( '', 'list', 'destroy' ) ) ) {
170 add_screen_option(
171 'per_page',
172 array(
173 'label' => esc_html__( 'Entries', 'formidable' ),
174 'default' => 20,
175 'option' => 'formidable_page_formidable_entries_per_page',
176 )
177 );
178 }
179
180 return $columns;
181 }
182
183 private static function get_columns_for_form( $form_id, &$columns ) {
184 $form_cols = FrmField::get_all_for_form( $form_id, '', 'include' );
185
186 /**
187 * Allows changing fields in the Entries list table heading.
188 *
189 * @since 5.0.04
190 *
191 * @param array $fields Array of fields.
192 * @param array $args The arguments. Contains `form_id`.
193 */
194 $form_cols = apply_filters( 'frm_fields_in_entries_list_table', $form_cols, compact( 'form_id' ) );
195
196 foreach ( $form_cols as $form_col ) {
197 if ( FrmField::is_no_save_field( $form_col->type ) ) {
198 continue;
199 }
200
201 $has_child_fields = $form_col->type === 'form' && ! empty( $form_col->field_options['form_select'] );
202 if ( $has_child_fields ) {
203 self::add_subform_cols( $form_col, $form_id, $columns );
204 } else {
205 self::add_field_cols( $form_col, $form_id, $columns );
206 }
207 }
208 }
209
210 /**
211 * @since 3.01
212 */
213 private static function add_subform_cols( $field, $form_id, &$columns ) {
214 $sub_form_cols = FrmField::get_all_for_form( $field->field_options['form_select'] );
215 if ( empty( $sub_form_cols ) ) {
216 return;
217 }
218
219 foreach ( $sub_form_cols as $k => $sub_form_col ) {
220 if ( FrmField::is_no_save_field( $sub_form_col->type ) ) {
221 unset( $sub_form_cols[ $k ] );
222 continue;
223 }
224 $columns[ $form_id . '_' . $sub_form_col->field_key . '-_-' . $field->id ] = FrmAppHelper::truncate( $sub_form_col->name, 35 );
225 unset( $sub_form_col );
226 }
227 }
228
229 /**
230 * @since 3.01
231 */
232 private static function add_field_cols( $field, $form_id, &$columns ) {
233 $col_id = $field->field_key;
234 if ( $field->form_id != $form_id ) {
235 $col_id .= '-_-form' . $field->form_id;
236 }
237
238 $has_separate_value = ! FrmField::is_option_empty( $field, 'separate_value' );
239 $is_post_status = FrmField::is_option_true( $field, 'post_field' ) && $field->field_options['post_field'] === 'post_status';
240 if ( $has_separate_value && ! $is_post_status ) {
241 $columns[ $form_id . '_frmsep_' . $col_id ] = FrmAppHelper::truncate( $field->name, 35 );
242 }
243
244 $columns[ $form_id . '_' . $col_id ] = FrmAppHelper::truncate( $field->name, 35 );
245 }
246
247 private static function maybe_add_ip_col( $form_id, &$columns ) {
248 if ( FrmAppHelper::ips_saved() ) {
249 $columns[ $form_id . '_ip' ] = 'IP';
250 }
251 }
252
253 public static function check_hidden_cols( $check, $object_id, $meta_key, $meta_value, $prev_value ) {
254 $this_page_name = self::hidden_column_key();
255 if ( $meta_key != $this_page_name || $meta_value == $prev_value ) {
256 return $check;
257 }
258
259 if ( empty( $prev_value ) ) {
260 $prev_value = get_metadata( 'user', $object_id, $meta_key, true );
261 }
262
263 global $frm_vars;
264 // Add a check so we don't create a loop.
265 $frm_vars['prev_hidden_cols'] = ! empty( $frm_vars['prev_hidden_cols'] ) ? false : $prev_value;
266
267 return $check;
268 }
269
270 /**
271 * Add hidden columns back from other forms
272 */
273 public static function update_hidden_cols( $meta_id, $object_id, $meta_key, $meta_value ) {
274 $this_page_name = self::hidden_column_key();
275 if ( $meta_key != $this_page_name ) {
276 return;
277 }
278
279 global $frm_vars;
280 if ( ! isset( $frm_vars['prev_hidden_cols'] ) || ! $frm_vars['prev_hidden_cols'] ) {
281 // Don't continue if there's no previous value.
282 return;
283 }
284
285 foreach ( $meta_value as $mk => $mv ) {
286 // Remove blank values.
287 if ( empty( $mv ) ) {
288 unset( $meta_value[ $mk ] );
289 }
290 }
291
292 $cur_form_prefix = reset( $meta_value );
293 $cur_form_prefix = explode( '_', $cur_form_prefix );
294 $cur_form_prefix = $cur_form_prefix[0];
295 $save = false;
296
297 foreach ( (array) $frm_vars['prev_hidden_cols'] as $prev_hidden ) {
298 if ( empty( $prev_hidden ) || in_array( $prev_hidden, $meta_value ) ) {
299 // Don't add blank cols or process included cols.
300 continue;
301 }
302
303 $form_prefix = explode( '_', $prev_hidden );
304 $form_prefix = $form_prefix[0];
305 if ( $form_prefix == $cur_form_prefix ) {
306 // Don't add back columns that are meant to be hidden.
307 continue;
308 }
309
310 $meta_value[] = $prev_hidden;
311 $save = true;
312 unset( $form_prefix );
313 }
314
315 if ( $save ) {
316 $user_id = get_current_user_id();
317 update_user_option( $user_id, $this_page_name, $meta_value, true );
318 }
319 }
320
321 /**
322 * @since 2.05.07
323 */
324 private static function hidden_column_key( $menu_name = '' ) {
325 $base = self::base_column_key( $menu_name );
326
327 return 'manage' . $base . 'columnshidden';
328 }
329
330 /**
331 * @since 2.05.07
332 */
333 private static function base_column_key( $menu_name = '' ) {
334 if ( empty( $menu_name ) ) {
335 $menu_name = FrmAppHelper::get_menu_name();
336 }
337
338 $unread_count = FrmEntriesHelper::get_visible_unread_inbox_count();
339
340 return sanitize_title( $menu_name ) . ( $unread_count ? '-' . $unread_count : '' ) . '_page_formidable-entries';
341 }
342
343 public static function save_per_page( $save, $option, $value ) {
344 if ( $option === 'formidable_page_formidable_entries_per_page' ) {
345 $save = (int) $value;
346 }
347
348 return $save;
349 }
350
351 public static function sortable_columns() {
352 $form_id = FrmForm::get_current_form_id();
353 $fields = FrmField::get_all_for_form( $form_id );
354
355 $columns = array(
356 $form_id . '_id' => 'id',
357 $form_id . '_created_at' => 'created_at',
358 $form_id . '_updated_at' => 'updated_at',
359 $form_id . '_ip' => 'ip',
360 $form_id . '_item_key' => 'item_key',
361 $form_id . '_is_draft' => 'is_draft',
362 );
363
364 if ( ! $form_id ) {
365 $columns[ $form_id . '_user_id' ] = 'user_id';
366 $columns[ $form_id . '_name' ] = 'name';
367 $columns[ $form_id . '_form_id' ] = 'form_id';
368 }
369
370 foreach ( $fields as $field ) {
371 if ( self::field_supports_sorting( $field ) ) {
372 $columns[ $form_id . '_' . $field->field_key ] = 'meta_' . $field->id;
373 }
374 }
375
376 return $columns;
377 }
378
379 /**
380 * Can't sort on checkboxes because they are sorted serialized.
381 * Some post content can be sorted but not everything.
382 *
383 * @param stdClass $field
384 * @return bool
385 */
386 private static function field_supports_sorting( $field ) {
387 $is_sortable = 'checkbox' !== $field->type && empty( $field->field_options['post_field'] );
388 return apply_filters( 'frm_field_column_is_sortable', $is_sortable, $field );
389 }
390
391 /**
392 * @param mixed $result Option value from database for hidden columns in entries table.
393 * @return array
394 */
395 public static function hidden_columns( $result ) {
396 global $frm_vars;
397
398 if ( ! is_array( $result ) ) {
399 // Force an unexpected value to be an array.
400 // Since $result is a filtered option and gets saved to the database, it's possible it could be a string.
401 // Since this code expects an array it would break with a "Uncaught Error: [] operator not supported for strings" error.
402 $result = array();
403 }
404
405 $form_id = FrmForm::get_current_form_id();
406 $hidden = self::user_hidden_columns_for_form( $form_id, $result );
407 $i = isset( $frm_vars['cols'] ) ? count( $frm_vars['cols'] ) : 0;
408 $max_columns = 11;
409
410 if ( ! empty( $hidden ) ) {
411 $result = $hidden;
412 $i = $i - count( $result );
413 }
414
415 if ( $i <= $max_columns ) {
416 return $result;
417 }
418
419 self::remove_excess_cols( compact( 'i', 'max_columns', 'form_id' ), $result );
420
421 return $result;
422 }
423
424 /**
425 * @since 2.05.07
426 */
427 private static function user_hidden_columns_for_form( $form_id, $result ) {
428 $hidden = array();
429 foreach ( (array) $result as $r ) {
430 if ( ! empty( $r ) ) {
431 list( $form_prefix, $field_key ) = explode( '_', $r );
432
433 if ( (int) $form_prefix === (int) $form_id ) {
434 $hidden[] = $r;
435 }
436
437 unset( $form_prefix );
438 }
439 }
440
441 return $hidden;
442 }
443
444 /**
445 * Remove some columns by default when there are too many
446 *
447 * @since 2.05.07
448 *
449 * @param array $atts
450 * @param array $result
451 * @return void
452 */
453 private static function remove_excess_cols( $atts, &$result ) {
454 global $frm_vars;
455
456 $remove_first = array(
457 $atts['form_id'] . '_item_key' => '',
458 $atts['form_id'] . '_id' => '',
459 );
460 $cols = $remove_first + array_reverse( $frm_vars['cols'], true );
461
462 $i = $atts['i'];
463
464 foreach ( $cols as $col_key => $col ) {
465 if ( $i <= $atts['max_columns'] ) {
466 break;
467 }
468
469 if ( empty( $result ) || ! in_array( $col_key, $result, true ) ) {
470 $result[] = $col_key;
471 --$i;
472 }
473
474 unset( $col_key, $col );
475 }
476 }
477
478 public static function display_list( $message = '', $errors = array() ) {
479 global $wpdb, $frm_vars;
480
481 $form = FrmForm::maybe_get_current_form();
482 $params = FrmForm::get_admin_params( $form );
483
484 if ( $form ) {
485 $params['form'] = $form->id;
486 $frm_vars['current_form'] = $form;
487
488 self::get_delete_form_time( $form, $errors );
489 }
490
491 $table_class = apply_filters( 'frm_entries_list_class', 'FrmEntriesListHelper' );
492
493 $wp_list_table = new $table_class( array( 'params' => $params ) );
494
495 $pagenum = $wp_list_table->get_pagenum();
496
497 $wp_list_table->prepare_items();
498
499 $total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );
500 if ( $pagenum > $total_pages && $total_pages > 0 ) {
501 $url = add_query_arg( 'paged', $total_pages );
502 if ( headers_sent() ) {
503 FrmAppHelper::js_redirect( $url, true );
504 } else {
505 wp_redirect( esc_url_raw( $url ) );
506 }
507 die();
508 }
509
510 if ( empty( $message ) && isset( $_GET['import-message'] ) ) {
511 $message = __( 'Your import is complete', 'formidable' );
512 }
513
514 require FrmAppHelper::plugin_path() . '/classes/views/frm-entries/list.php';
515 }
516
517 private static function get_delete_form_time( $form, &$errors ) {
518 if ( 'trash' === $form->status ) {
519 $delete_timestamp = time() - ( DAY_IN_SECONDS * EMPTY_TRASH_DAYS );
520 $time_to_delete = FrmAppHelper::human_time_diff( $delete_timestamp, ( $form->options['trash_time'] ?? time() ) );
521
522 /* translators: %1$s: Time string */
523 $errors['trash'] = sprintf( __( 'This form is in the trash and is scheduled to be deleted permanently in %s along with any entries.', 'formidable' ), $time_to_delete );
524 }
525 }
526
527 /**
528 * Back End CRUD.
529 */
530 public static function show( $id = 0 ) {
531 FrmAppHelper::permission_check( 'frm_view_entries' );
532
533 if ( ! $id ) {
534 $id = FrmAppHelper::get_param( 'id', 0, 'get', 'absint' );
535
536 if ( ! $id ) {
537 $id = FrmAppHelper::get_param( 'item_id', 0, 'get', 'absint' );
538 }
539 }
540
541 $entry = FrmEntry::getOne( $id, true );
542 if ( ! $entry ) {
543 FrmAppController::show_error_modal(
544 array(
545 'title' => __( 'You can\'t view the entry', 'formidable' ),
546 'body' => __( 'You are trying to view an entry that does not exist', 'formidable' ),
547 'cancel_url' => admin_url( 'admin.php?page=formidable' ),
548 )
549 );
550 return;
551 }
552
553 $data = $entry->description;
554 if ( ! is_array( $data ) || ! isset( $data['referrer'] ) ) {
555 $data = array( 'referrer' => $data );
556 }
557
558 $fields = FrmField::get_all_for_form( $entry->form_id, '', 'include' );
559 $form = FrmForm::getOne( $entry->form_id );
560
561 include FrmAppHelper::plugin_path() . '/classes/views/frm-entries/show.php';
562 }
563
564 /**
565 * Destroy an entry from the admin page.
566 * This is triggered from the entries list from the "Delete" row action, and also from the "Delete Entry" trigger in the view/edit entry sidebar.
567 *
568 * @return void
569 */
570 public static function destroy() {
571 $permission_error = FrmAppHelper::permission_nonce_error( 'frm_delete_entries', '_wpnonce', -1 );
572 if ( false !== $permission_error ) {
573 $error_args = array(
574 'title' => __( 'Verification failed', 'formidable' ),
575 'body' => $permission_error,
576 'cancel_url' => admin_url( 'admin.php?page=formidable-entries' ),
577 );
578 FrmAppController::show_error_modal( $error_args );
579 return;
580 }
581
582 $params = FrmForm::get_admin_params();
583
584 if ( isset( $params['keep_post'] ) && $params['keep_post'] ) {
585 self::unlink_post( $params['id'] );
586 }
587
588 $message = '';
589 if ( FrmEntry::destroy( $params['id'] ) ) {
590 $message = __( 'Entry was successfully deleted', 'formidable' );
591 }
592
593 self::display_list( $message );
594 }
595
596 public static function process_entry( $errors = '', $ajax = false ) {
597 $form_id = FrmAppHelper::get_post_param( 'form_id', '', 'absint' );
598 if ( FrmAppHelper::is_admin() || empty( $_POST ) || empty( $form_id ) || ! isset( $_POST['item_key'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
599 return;
600 }
601
602 global $frm_vars;
603
604 $form = FrmForm::getOne( $form_id );
605 if ( ! $form ) {
606 return;
607 }
608
609 $is_preview = 'frm_forms_preview' === FrmAppHelper::simple_get( 'action' );
610 if ( $is_preview && FrmFormsHelper::should_block_preview( $form->form_key ) ) {
611 return;
612 }
613
614 $params = FrmForm::get_params( $form );
615
616 if ( ! isset( $frm_vars['form_params'] ) ) {
617 $frm_vars['form_params'] = array();
618 }
619 $frm_vars['form_params'][ $form->id ] = $params;
620
621 if ( isset( $frm_vars['created_entries'][ $form_id ] ) ) {
622 return;
623 }
624
625 if ( $errors == '' && ! $ajax ) {
626 $errors = FrmEntryValidate::validate( wp_unslash( $_POST ) ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
627 }
628
629 /**
630 * Use this filter to add trigger actions and add errors after
631 * all other errors have been processed
632 *
633 * @since 2.0.6
634 */
635 $errors = apply_filters( 'frm_entries_before_create', $errors, $form );
636
637 $frm_vars['created_entries'][ $form_id ] = array( 'errors' => $errors );
638
639 if ( empty( $errors ) ) {
640 $_POST['frm_skip_cookie'] = 1;
641 $do_success = false;
642 if ( $params['action'] === 'create' ) {
643 if ( apply_filters( 'frm_continue_to_create', true, $form_id ) && ! isset( $frm_vars['created_entries'][ $form_id ]['entry_id'] ) ) {
644 $frm_vars['created_entries'][ $form_id ]['entry_id'] = FrmEntry::create( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
645
646 $params['id'] = $frm_vars['created_entries'][ $form_id ]['entry_id'];
647 $do_success = true;
648 }
649 }
650
651 do_action( 'frm_process_entry', $params, $errors, $form, array( 'ajax' => $ajax ) );
652 if ( $do_success ) {
653 FrmFormsController::maybe_trigger_redirect( $form, $params, array( 'ajax' => $ajax ) );
654 }
655 unset( $_POST['frm_skip_cookie'] ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
656 }
657 }
658
659 /**
660 * Escape url entities before redirect
661 *
662 * @since 3.0
663 *
664 * @param string $url
665 *
666 * @return string
667 */
668 public static function prepare_redirect_url( $url ) {
669 return str_replace( array( ' ', '[', ']', '|', '@' ), array( '%20', '%5B', '%5D', '%7C', '%40' ), $url );
670 }
671
672 public static function delete_entry_before_redirect( $url, $form, $atts ) {
673 self::_delete_entry( $atts['id'], $form );
674
675 return $url;
676 }
677
678 /**
679 * Delete entry if not redirected.
680 *
681 * @param array $atts
682 */
683 public static function delete_entry_after_save( $atts ) {
684 self::_delete_entry( $atts['entry_id'], $atts['form'] );
685 }
686
687 private static function _delete_entry( $entry_id, $form ) {
688 if ( ! $form ) {
689 return;
690 }
691
692 FrmAppHelper::unserialize_or_decode( $form->options );
693 if ( isset( $form->options['no_save'] ) && $form->options['no_save'] ) {
694 self::unlink_post( $entry_id );
695 FrmEntry::destroy( $entry_id );
696 }
697 }
698
699 /**
700 * Unlink entry from post
701 */
702 private static function unlink_post( $entry_id ) {
703 global $wpdb;
704 $wpdb->update( $wpdb->prefix . 'frm_items', array( 'post_id' => '' ), array( 'id' => $entry_id ) );
705 FrmEntry::clear_cache();
706 }
707
708 /**
709 * @param array $atts
710 *
711 * @return array|string
712 */
713 public static function show_entry_shortcode( $atts ) {
714 $defaults = array(
715 'id' => false,
716 'entry' => false,
717 'fields' => false,
718 'plain_text' => false,
719 'user_info' => false,
720 'include_blank' => false,
721 'default_email' => false,
722 'form_id' => false,
723 'format' => 'text',
724 'array_key' => 'key',
725 'direction' => 'ltr',
726 'font_size' => '',
727 'text_color' => '',
728 'border_width' => '',
729 'border_color' => '',
730 'bg_color' => '',
731 'alt_bg_color' => '',
732 'class' => '',
733 'clickable' => false,
734 'exclude_fields' => '',
735 'include_fields' => '',
736 'include_extras' => '',
737 'inline_style' => 1,
738 'table_style' => '',
739 // Return embedded fields as nested array.
740 'child_array' => false,
741 'line_breaks' => true,
742 'array_separator' => ', ',
743 );
744 $defaults = apply_filters( 'frm_show_entry_defaults', $defaults );
745
746 $atts = shortcode_atts( $defaults, $atts );
747
748 if ( $atts['default_email'] ) {
749 $shortcode_atts = array(
750 'format' => $atts['format'],
751 'plain_text' => $atts['plain_text'],
752 );
753
754 $entry_formatter = FrmEntryFactory::entry_shortcode_formatter_instance( $atts['form_id'], $shortcode_atts );
755 $formatted_entry = $entry_formatter->content();
756
757 } else {
758
759 $entry_formatter = FrmEntryFactory::entry_formatter_instance( $atts );
760 $formatted_entry = $entry_formatter->get_formatted_entry_values();
761
762 }
763
764 return $formatted_entry;
765 }
766
767 public static function entry_sidebar( $entry = false ) {
768 $data = array();
769 $id = 0;
770
771 $date_format = get_option( 'date_format' );
772 $time_format = get_option( 'time_format' );
773
774 if ( $entry ) {
775 $id = $entry->id;
776 $data = $entry->description;
777 if ( isset( $data['browser'] ) ) {
778 $browser = FrmEntriesHelper::get_browser( $data['browser'] );
779 }
780 /**
781 * Add or remove information in the entry sidebar.
782 *
783 * @since 5.5.2
784 *
785 * @param array $data
786 * @param array{entry:\stdClass} $entry
787 */
788 $data = apply_filters( 'frm_sidebar_data', $data, compact( 'entry' ) );
789 }
790
791 include FrmAppHelper::plugin_path() . '/classes/views/frm-entries/sidebar-shared.php';
792 }
793 }
794