PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.0.05
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.0.05
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 5.0.05, at classes/controllers/FrmEntriesController.php

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