PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.16.1.2
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.16.1.2
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
← All changes | classes/helpers/FrmFormsListHelper.php +78 -443 6.35 → 6.16.1.2 View file →
@@ -3,19 +3,12 @@
3 3 die( 'You are not allowed to call this page directly.' );
4 4 }
5 5
6 6 class FrmFormsListHelper extends FrmListHelper {
7 -
8 - /**
9 - * @var string
10 - */
11 7 public $status = '';
12 8
13 9 public $total_items = 0;
14 10
15 - /**
16 - * @param array $args
17 - */
18 11 public function __construct( $args ) {
19 12 $this->status = self::get_param( array( 'param' => 'form_type' ) );
20 13
21 14 parent::__construct( $args );
@@ -29,20 +22,19 @@
29 22 /**
30 23 * @return void
31 24 */
32 25 public function prepare_items() {
33 - global $per_page, $mode;
26 + global $wpdb, $per_page, $mode;
34 27
35 28 $page = $this->get_pagenum();
36 29 $per_page = $this->get_items_per_page( 'formidable_page_formidable_per_page' );
37 30
38 - $mode = self::get_param(
31 + $mode = self::get_param(
39 32 array(
40 33 'param' => 'mode',
41 34 'default' => 'list',
42 35 )
43 36 );
44 -
45 37 $orderby = self::get_param(
46 38 array(
47 39 'param' => 'orderby',
48 40 'default' => 'name',
@@ -53,12 +45,9 @@
53 45 'param' => 'order',
54 46 'default' => 'ASC',
55 47 )
56 48 );
57 -
58 - FrmAppController::apply_saved_sort_preference( $orderby, $order );
59 -
60 - $start = self::get_param(
49 + $start = self::get_param(
61 50 array(
62 51 'param' => 'start',
63 52 'default' => ( $page - 1 ) * $per_page,
64 53 )
@@ -90,13 +79,11 @@
90 79 'param' => 's',
91 80 'sanitize' => 'sanitize_text_field',
92 81 )
93 82 );
94 -
95 - if ( $s !== '' ) {
83 + if ( $s != '' ) {
96 84 preg_match_all( '/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $s, $matches );
97 85 $search_terms = array_map( 'trim', $matches[0] );
98 -
99 86 foreach ( $search_terms as $term ) {
100 87 $s_query[] = array(
101 88 'or' => true,
102 89 'name LIKE' => $term,
@@ -124,42 +111,16 @@
124 111 /**
125 112 * @return void
126 113 */
127 114 public function no_items() {
128 - $s = self::get_param(
129 - array(
130 - 'param' => 's',
131 - 'sanitize' => 'sanitize_text_field',
132 - )
133 - );
134 -
135 - if ( $s !== '' ) {
136 - $current_url = set_url_scheme(
137 - 'http://' . FrmAppHelper::get_server_value( 'HTTP_HOST' ) . FrmAppHelper::get_server_value( 'REQUEST_URI' )
138 - );
139 - $clear_url = remove_query_arg( 's', $current_url );
140 -
141 - echo '<p>';
142 - printf(
143 - /* translators: %1$s: Start link HTML, %2$s: End link HTML */
144 - esc_html__( 'No forms match your search. %1$sClear search%2$s', 'formidable' ),
145 - '<a href="' . esc_url( $clear_url ) . '">',
146 - '</a>'
147 - );
148 - echo '</p>';
149 - return;
150 - }
151 -
152 115 if ( $this->status === 'trash' ) {
153 116 echo '<p>';
154 117 esc_html_e( 'No forms found in the trash.', 'formidable' );
155 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
156 118 ?>
157 119 <a href="<?php echo esc_url( admin_url( 'admin.php?page=formidable' ) ); ?>">
158 120 <?php esc_html_e( 'See all forms.', 'formidable' ); ?>
159 121 </a>
160 122 <?php
161 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
162 123 echo '</p>';
163 124 } else {
164 125 $title = __( 'No Forms Found', 'formidable' );
165 126 include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/_no_forms.php';
@@ -186,10 +147,8 @@
186 147 return $actions;
187 148 }
188 149
189 150 /**
190 - * @param string $which
191 - *
192 151 * @return void
193 152 */
194 153 public function extra_tablenav( $which ) {
195 154 if ( 'top' !== $which ) {
@@ -195,19 +154,15 @@
195 154 if ( 'top' !== $which ) {
196 155 return;
197 156 }
198 157
199 - if ( 'trash' !== $this->status || ! current_user_can( 'frm_delete_forms' ) ) {
200 - return;
158 + if ( 'trash' === $this->status && current_user_can( 'frm_delete_forms' ) ) {
159 + ?>
160 + <div class="alignleft actions frm_visible_overflow">
161 + <?php submit_button( __( 'Empty Trash', 'formidable' ), 'apply', 'delete_all', false ); ?>
162 + </div>
163 + <?php
201 164 }
202 -
203 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
204 - ?>
205 - <div class="alignleft actions frm_visible_overflow">
206 - <?php submit_button( __( 'Empty Trash', 'formidable' ), 'apply', 'delete_all', false ); ?>
207 - </div>
208 - <?php
209 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
210 165 }
211 166
212 167 /**
213 168 * @return array
@@ -234,13 +189,18 @@
234 189 )
235 190 );
236 191
237 192 foreach ( $statuses as $status => $name ) {
238 - $class = $status == $form_type ? ' class="current"' : ''; // phpcs:ignore Universal.Operators.StrictComparisons
239 193
194 + if ( $status == $form_type ) {
195 + $class = ' class="current"';
196 + } else {
197 + $class = '';
198 + }
199 +
240 200 if ( $counts->{$status} || 'draft' !== $status ) {
241 201 /* translators: %1$s: Status, %2$s: Number of items */
242 - $links[ $status ] = '<a href="' . esc_url( '?page=formidable&form_type=' . $status ) . '" ' . $class . '>' . sprintf( __( '%1$s <span class="count">(%2$s)</span>', 'formidable' ), $name, number_format_i18n( $counts->{$status} ) ) . '</a>'; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
202 + $links[ $status ] = '<a href="' . esc_url( '?page=formidable&form_type=' . $status ) . '" ' . $class . '>' . sprintf( __( '%1$s <span class="count">(%2$s)</span>', 'formidable' ), $name, number_format_i18n( $counts->{$status} ) ) . '</a>';
243 203 }
244 204
245 205 unset( $status, $name );
246 206 }
@@ -248,15 +208,28 @@
248 208 return $links;
249 209 }
250 210
251 211 /**
212 + * @param string $which
213 + * @return void
214 + */
215 + public function pagination( $which ) {
216 + global $mode;
217 +
218 + parent::pagination( $which );
219 +
220 + if ( 'top' === $which ) {
221 + $this->view_switcher( $mode );
222 + }
223 + }
224 +
225 + /**
252 226 * @param stdClass $item
253 227 * @param string $style
254 - *
255 228 * @return string
256 229 */
257 230 public function single_row( $item, $style = '' ) {
258 - global $mode;
231 + global $frm_vars, $mode;
259 232
260 233 // Set up the hover actions for this user
261 234 $actions = array();
262 235 $edit_link = FrmForm::get_edit_link( $item->id );
@@ -263,15 +236,24 @@
263 236
264 237 $this->get_actions( $actions, $item, $edit_link );
265 238
266 239 $action_links = $this->row_actions( $actions );
267 - $checkbox = $this->get_row_checkbox( $item );
268 - $r = '<tr id="item-action-' . absint( $item->id ) . '"' . $style . '>';
269 240
241 + // Set up the checkbox ( because the user is editable, otherwise its empty )
242 + $checkbox = '<input type="checkbox" name="item-action[]" id="cb-item-action-' . absint( $item->id ) . '" value="' . esc_attr( $item->id ) . '" />';
243 + $checkbox_label_text = sprintf(
244 + // translators: Form title
245 + __( 'Select %s', 'formidable' ),
246 + ! empty( $item->name ) ? $item->name : FrmFormsHelper::get_no_title_text()
247 + );
248 +
249 + $checkbox .= '<label for="cb-item-action-' . absint( $item->id ) . '"><span class="screen-reader-text">' . esc_html( $checkbox_label_text ) . '</span></label>';
250 +
251 + $r = '<tr id="item-action-' . absint( $item->id ) . '"' . $style . '>';
252 +
270 253 list( $columns, $hidden ) = $this->get_column_info();
271 254
272 255 $format = 'Y/m/d';
273 -
274 256 if ( 'list' !== $mode ) {
275 257 $format .= ' \<\b\r \/\> g:i:s a';
276 258 }
277 259
@@ -276,12 +258,12 @@
276 258 }
277 259
278 260 foreach ( $columns as $column_name => $column_display_name ) {
279 261 $class = $column_name . ' column-' . $column_name . ( 'name' === $column_name ? ' post-title page-title column-title' : '' );
262 +
280 263 $style = '';
281 -
282 264 if ( in_array( $column_name, $hidden, true ) ) {
283 - $class .= ' hidden';
265 + $class .= ' frm_hidden';
284 266 }
285 267
286 268 if ( $column_name === 'name' ) {
287 269 $class .= ' column-primary';
@@ -286,10 +268,11 @@
286 268 if ( $column_name === 'name' ) {
287 269 $class .= ' column-primary';
288 270 }
289 271
290 - $class = 'class="' . esc_attr( $class ) . '"';
291 - $attributes = $class . $style . $this->get_column_data_attr( $column_name, $column_display_name );
272 + $class = 'class="' . esc_attr( $class ) . '"';
273 + $data_colname = ' data-colname="' . esc_attr( $column_display_name ) . '"';
274 + $attributes = $class . $style . $data_colname;
292 275
293 276 switch ( $column_name ) {
294 277 case 'cb':
295 278 $r .= '<th scope="row" class="check-column">' . $checkbox . '</th>';
@@ -306,9 +289,21 @@
306 289 $date = gmdate( $format, strtotime( $item->created_at ) );
307 290 $val = '<abbr title="' . esc_attr( gmdate( 'Y/m/d g:i:s A', strtotime( $item->created_at ) ) ) . '">' . $date . '</abbr>';
308 291 break;
309 292 case 'entries':
310 - $val = $this->get_entries_column_value( $item );
293 + if ( isset( $item->options['no_save'] ) && $item->options['no_save'] ) {
294 + $val = FrmAppHelper::icon_by_class(
295 + 'frmfont frm_forbid_icon frm_bstooltip',
296 + array(
297 + 'title' => __( 'Saving entries is disabled for this form', 'formidable' ),
298 + 'echo' => false,
299 + )
300 + );
301 + } else {
302 + $text = FrmEntry::getRecordCount( $item->id );
303 + $val = current_user_can( 'frm_view_entries' ) ? '<a href="' . esc_url( admin_url( 'admin.php?page=formidable-entries&form=' . $item->id ) ) . '">' . $text . '</a>' : $text;
304 + unset( $text );
305 + }
311 306 break;
312 307 default:
313 308 if ( method_exists( $this, 'column_' . $column_name ) ) {
314 309 $val = call_user_func( array( $this, 'column_' . $column_name ), $item ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
@@ -322,80 +317,30 @@
322 317 $r .= '</td>';
323 318 }
324 319 unset( $val );
325 320 }//end foreach
326 - return $r . '</tr>';
327 - }
321 + $r .= '</tr>';
328 322
329 - /**
330 - * @param string $column_name
331 - * @param string $column_display_name
332 - *
333 - * @return string
334 - */
335 - private function get_column_data_attr( $column_name, $column_display_name ) {
336 - if ( 'settings' === $column_name ) {
337 - return ' data-colname="' . esc_attr( trim( strip_tags( $column_display_name ) ) ) . '"';
338 - }
339 - return ' data-colname="' . esc_attr( $column_display_name ) . '"';
323 + return $r;
340 324 }
341 325
342 326 /**
343 - * @param object $item
344 - *
345 - * @return string
346 - */
347 - private function get_entries_column_value( $item ) {
348 - if ( ! empty( $item->options['no_save'] ) ) {
349 - return (string) FrmAppHelper::icon_by_class(
350 - 'frmfont frm_forbid_icon frm_bstooltip',
351 - array(
352 - 'title' => __( 'Saving entries is disabled for this form', 'formidable' ),
353 - 'echo' => false,
354 - )
355 - );
356 - }
357 -
358 - $text = intval( FrmEntry::getRecordCount( $item->id ) );
359 - return current_user_can( 'frm_view_entries' ) ? '<a href="' . esc_url( admin_url( 'admin.php?page=formidable-entries&form=' . $item->id ) ) . '">' . $text . '</a>' : (string) $text; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
360 - }
361 -
362 - /**
363 - * @param object $item
364 - *
365 - * @return string
366 - */
367 - private function get_row_checkbox( $item ) {
368 - // Set up the checkbox (because the user is editable, otherwise it's empty).
369 - $checkbox = '<input type="checkbox" name="item-action[]" id="cb-item-action-' . absint( $item->id ) . '" value="' . esc_attr( $item->id ) . '" />';
370 - $checkbox_label_text = sprintf(
371 - // translators: Form title
372 - __( 'Select %s', 'formidable' ),
373 - ! empty( $item->name ) ? $item->name : FrmFormsHelper::get_no_title_text()
374 - );
375 -
376 - return $checkbox . '<label for="cb-item-action-' . absint( $item->id ) . '"><span class="screen-reader-text">' . esc_html( $checkbox_label_text ) . '</span></label>';
377 - }
378 -
379 - /**
380 327 * Get the HTML for the Actions column in the form list.
381 328 * This includes multiple icons for triggering the embed modal, the visual styler, and an active landing page.
382 329 *
383 330 * @since 6.0
384 - * @deprecated 6.32 We moved these actions to other places. This column will show if there is a filter added to the hook.
385 331 *
386 332 * @param stdClass $form
387 - *
388 333 * @return string
389 334 */
390 335 protected function column_shortcode( $form ) {
391 - $val = '<a href="#" class="frm-embed-form" role="button" aria-label="' . esc_attr__( 'Embed Form', 'formidable' ) . '">' . FrmAppHelper::icon_by_class( 'frmfont frm_code_icon', array( 'echo' => false ) ) . '</a>'; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
336 + $val = '<a href="#" class="frm-embed-form" role="button" aria-label="' . esc_attr__( 'Embed Form', 'formidable' ) . '">' . FrmAppHelper::icon_by_class( 'frmfont frm_code_icon', array( 'echo' => false ) ) . '</a>';
392 337 $val .= $this->column_style( $form );
393 - $val .= $this->column_views( $form );
394 338 $val = apply_filters( 'frm_form_list_actions', $val, array( 'form' => $form ) );
395 339 // Remove the space hard coded in Landing pages.
396 340 $val = str_replace( '&nbsp;', '', $val );
397 - return '<div>' . $val . '</div>';
341 + $val = '<div>' . $val . '</div>';
342 + return $val;
398 343 }
399 344
400 345 /**
401 346 * Get the HTML for the Style column in the form list.
@@ -402,13 +347,12 @@
402 347 *
403 348 * @since 6.0
404 349 *
405 350 * @param stdClass $form
406 - *
407 351 * @return string
408 352 */
409 353 protected function column_style( $form ) {
410 - $style_setting = $form->options['custom_style'] ?? '';
354 + $style_setting = isset( $form->options['custom_style'] ) ? $form->options['custom_style'] : '';
411 355 $frm_settings = FrmAppHelper::get_settings();
412 356
413 357 if ( $style_setting === '0' || 'none' === $frm_settings->load_style ) {
414 358 // Don't show a link if styling is off.
@@ -415,9 +359,8 @@
415 359 return '';
416 360 }
417 361
418 362 $style = FrmStylesController::get_form_style( $form );
419 -
420 363 if ( ! $style ) {
421 364 // Do a second pass to avoid null values.
422 365 $frm_style = new FrmStyle( 'default' );
423 366 $style = $frm_style->get_one();
@@ -423,53 +366,12 @@
423 366 $style = $frm_style->get_one();
424 367 }
425 368
426 369 $href = FrmStylesHelper::get_edit_url( $style, $form->id );
427 - return '<a href="' . esc_url( $href ) . '" title="' . esc_attr( $style->post_title ) . '">' . FrmAppHelper::icon_by_class( 'frmfont frm_pallet_icon', array( 'echo' => false ) ) . '</a>'; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
370 + return '<a href="' . esc_url( $href ) . '" title="' . esc_attr( $style->post_title ) . '">' . FrmAppHelper::icon_by_class( 'frmfont frm_pallet_icon', array( 'echo' => false ) ) . '</a>';
428 371 }
429 372
430 373 /**
431 - * Generate the HTML for the form Views page.
432 - *
433 - * @since 6.19
434 - *
435 - * @param stdClass $form Form object.
436 - *
437 - * @return string
438 - */
439 - protected function column_views( $form ) {
440 - $attributes = array(
441 - 'href' => admin_url( 'admin.php?page=formidable-views&form=' . absint( $form->id ) . '&show_nav=1' ),
442 - 'title' => __( 'Link to list of all views for this form.', 'formidable' ),
443 - 'target' => '_blank',
444 - );
445 -
446 - if ( class_exists( 'FrmViewsDisplay' ) ) {
447 - $view_ids = FrmViewsDisplay::get_display_ids_by_form( $form->id );
448 - $view_count = $view_ids ? count( $view_ids ) : 0;
449 - } else {
450 - $view_count = 0;
451 - }
452 -
453 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
454 - return '<a ' . FrmAppHelper::array_to_html_params( $attributes ) . '>
455 - ' . intval( $view_count ) .
456 - '</a>';
457 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
458 - }
459 -
460 - /**
461 - * Get the HTML for the Settings column in the form list.
462 - *
463 - * @since 6.32
464 - *
465 - * @return string
466 - */
467 - protected function column_settings() {
468 - return '&nbsp;';
469 - }
470 -
471 - /**
472 374 * @param array $actions
473 375 * @param object $item
474 376 * @param string $edit_link
475 377 *
@@ -476,9 +378,8 @@
476 378 * @return void
477 379 */
478 380 private function get_actions( &$actions, $item, $edit_link ) {
479 381 $new_actions = FrmFormsHelper::get_action_links( $item->id, $item );
480 -
481 382 foreach ( $new_actions as $link => $action ) {
482 383 $new_actions[ $link ] = FrmFormsHelper::format_link_html( $action, 'short' );
483 384 }
484 385
@@ -487,15 +388,14 @@
487 388 return;
488 389 }
489 390
490 391 if ( current_user_can( 'frm_edit_forms' ) ) {
491 - $actions['frm_edit'] = '<a href="' . esc_url( $edit_link ) . '">' . esc_html__( 'Edit', 'formidable' ) . '</a>';
492 - $actions['frm_settings'] = '<a href="' . esc_url( '?page=formidable&frm_action=settings&id=' . $item->id ) . '">' . esc_html__( 'Settings', 'formidable' ) . '</a>';
392 + $actions['frm_edit'] = '<a href="' . esc_url( $edit_link ) . '">' . __( 'Edit', 'formidable' ) . '</a>';
393 + $actions['frm_settings'] = '<a href="' . esc_url( '?page=formidable&frm_action=settings&id=' . $item->id ) . '">' . __( 'Settings', 'formidable' ) . '</a>';
493 394 }
494 395
495 - $actions = array_merge( $actions, $new_actions );
496 - $actions['embed'] = '<a href="#" class="frm-embed-form" role="button" aria-label="' . esc_attr__( 'Embed Form', 'formidable' ) . '">' . esc_html__( 'Embed', 'formidable' ) . '</a>'; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
497 - $actions['view'] = '<a href="' . esc_url( FrmFormsHelper::get_direct_link( $item->form_key, $item ) ) . '" target="_blank">' . esc_html__( 'Preview', 'formidable' ) . '</a>'; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
396 + $actions = array_merge( $actions, $new_actions );
397 + $actions['view'] = '<a href="' . esc_url( FrmFormsHelper::get_direct_link( $item->form_key, $item ) ) . '" target="_blank">' . __( 'Preview', 'formidable' ) . '</a>';
498 398 }
499 399
500 400 /**
501 401 * @param object $item
@@ -506,25 +406,21 @@
506 406 * @return string
507 407 */
508 408 private function get_form_name( $item, $actions, $edit_link, $mode = 'list' ) {
509 409 $form_name = $item->name;
510 -
511 - if ( is_null( $form_name ) || trim( $form_name ) === '' ) {
410 + if ( trim( $form_name ) == '' ) {
512 411 $form_name = FrmFormsHelper::get_no_title_text();
513 412 }
514 -
515 413 $form_name = FrmAppHelper::kses( $form_name );
516 -
517 - if ( 'excerpt' !== $mode ) {
414 + if ( 'excerpt' != $mode ) {
518 415 $form_name = FrmAppHelper::truncate( $form_name, 50 );
519 416 }
520 417
521 418 $val = '<strong>';
522 -
523 419 if ( 'trash' === $this->status ) {
524 420 $val .= $form_name;
525 421 } else {
526 - $val .= '<a href="' . esc_url( isset( $actions['frm_edit'] ) ? $edit_link : FrmFormsHelper::get_direct_link( $item->form_key, $item ) ) . '" class="row-title">' . FrmAppHelper::kses( $form_name ) . '</a> '; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
422 + $val .= '<a href="' . esc_url( isset( $actions['frm_edit'] ) ? $edit_link : FrmFormsHelper::get_direct_link( $item->form_key, $item ) ) . '" class="row-title">' . FrmAppHelper::kses( $form_name ) . '</a> ';
527 423 }
528 424
529 425 $this->add_draft_label( $item, $val );
530 426 $val .= '</strong>';
@@ -540,9 +436,9 @@
540 436 *
541 437 * @return void
542 438 */
543 439 private function add_draft_label( $item, &$val ) {
544 - if ( 'draft' === $item->status && 'draft' !== $this->status ) {
440 + if ( 'draft' === $item->status && 'draft' != $this->status ) {
545 441 $val .= ' - <span class="post-state">' . esc_html__( 'Draft', 'formidable' ) . '</span>';
546 442 }
547 443 }
548 444
@@ -553,10 +449,9 @@
553 449 * @return void
554 450 */
555 451 private function add_form_description( $item, &$val ) {
556 452 global $mode;
557 -
558 - if ( 'excerpt' === $mode && ! is_null( $item->description ) ) {
453 + if ( 'excerpt' === $mode ) {
559 454 $val .= FrmAppHelper::truncate( strip_tags( $item->description ), 50 );
560 455 }
561 456 }
562 457
@@ -564,266 +459,6 @@
564 459 * @return string
565 460 */
566 461 protected function confirm_bulk_delete() {
567 462 return __( 'ALL selected forms and their entries will be permanently deleted. Want to proceed?', 'formidable' );
568 - }
569 -
570 - /**
571 - * @param stdClass $form
572 - *
573 - * @return string
574 - */
575 - public function column_embeds( $form ) {
576 - if ( $this->column_is_hidden( 'embeds' ) ) {
577 - // Locating embeds means scanning post_content, so skip it when the column is hidden.
578 - return '';
579 - }
580 -
581 - $posts = $this->get_posts_contain_form( $form );
582 -
583 - if ( ! $posts ) {
584 - return '<span class="frm-forms-list-embeds-zero">0</span>';
585 - }
586 -
587 - return FrmAppHelper::clip(
588 - function () use ( $posts ) {
589 - ?>
590 - <a href="#" class="frm-forms-list-embeds-btn" data-posts="<?php echo esc_attr( wp_json_encode( $posts ) ); ?>">
591 - <?php
592 - FrmAppHelper::icon_by_class( 'frmfont frm_arrowdown6_icon' );
593 - echo intval( count( $posts ) );
594 - ?>
595 - </a>
596 - <?php
597 - }
598 - );
599 - }
600 -
601 - /**
602 - * Checks if a column is hidden with Screen Options.
603 - *
604 - * @since 6.35
605 - *
606 - * @param string $column_name Column name.
607 - *
608 - * @return bool
609 - */
610 - private function column_is_hidden( $column_name ) {
611 - $column_info = $this->get_column_info();
612 -
613 - if ( ! isset( $column_info[1] ) || ! is_array( $column_info[1] ) ) {
614 - return false;
615 - }
616 -
617 - return in_array( $column_name, $column_info[1], true );
618 - }
619 -
620 - /**
621 - * Gets posts or pages that contain the form shortcode.
622 - *
623 - * @since 6.32
624 - *
625 - * @param stdClass $form Form object.
626 - *
627 - * @return array
628 - */
629 - private function get_posts_contain_form( $form ) {
630 - $cached_posts = FrmFormEmbedsHelper::get_cached_posts();
631 -
632 - if ( ! isset( $cached_posts[ $form->id ] ) || ! is_array( $cached_posts[ $form->id ] ) ) {
633 - // A single scan covers every form listed on this page, not just this one.
634 - $cached_posts = $this->fill_embed_posts_cache( $form );
635 - }
636 -
637 - if ( ! isset( $cached_posts[ $form->id ] ) || ! is_array( $cached_posts[ $form->id ] ) ) {
638 - return array();
639 - }
640 -
641 - // Links and title fallbacks are derived at render time, not stored. get_edit_post_link()
642 - // depends on the current user, so caching it in a shared transient would hand one user's
643 - // edit link to another, and a permalink cached now goes stale on any slug change.
644 - return FrmFormEmbedsHelper::prepare_posts( $cached_posts[ $form->id ] );
645 - }
646 -
647 - /**
648 - * Scans for embeds once and caches the result for every form listed on the current page.
649 - *
650 - * @since 6.35
651 - *
652 - * @param stdClass $form The form whose column is currently rendering.
653 - *
654 - * @return array Embed posts keyed by form ID.
655 - */
656 - private function fill_embed_posts_cache( $form ) {
657 - $cached_posts = FrmFormEmbedsHelper::get_cached_posts();
658 - $search_map = array();
659 - $forms = array();
660 -
661 - foreach ( $this->get_forms_to_scan( $form ) as $form_id => $form_to_scan ) {
662 - if ( isset( $cached_posts[ $form_id ] ) && is_array( $cached_posts[ $form_id ] ) ) {
663 - continue;
664 - }
665 -
666 - $search_map[ $form_id ] = $this->get_search_strings_for_form( $form_id );
667 - $forms[ $form_id ] = $form_to_scan;
668 - }
669 -
670 - if ( ! $forms ) {
671 - return $cached_posts;
672 - }
673 -
674 - $matched = FrmFormEmbedsHelper::match_candidate_posts( $search_map );
675 -
676 - foreach ( $forms as $form_id => $form_to_scan ) {
677 - $posts = $this->filter_embed_posts( $matched[ $form_id ], $form_to_scan );
678 - $cached_posts[ $form_id ] = FrmFormEmbedsHelper::slim_posts( $posts );
679 - }
680 -
681 - FrmFormEmbedsHelper::save_cached_posts( $cached_posts );
682 -
683 - return $cached_posts;
684 - }
685 -
686 - /**
687 - * Gets every form rendered on the current list page, keyed by form ID.
688 - *
689 - * @since 6.35
690 - *
691 - * @param stdClass $form The form whose column is currently rendering.
692 - *
693 - * @return array
694 - */
695 - private function get_forms_to_scan( $form ) {
696 - $forms = array( $form->id => $form );
697 -
698 - if ( ! is_array( $this->items ) ) {
699 - return $forms;
700 - }
701 -
702 - foreach ( $this->items as $item ) {
703 - if ( is_object( $item ) && isset( $item->id ) ) {
704 - $forms[ $item->id ] = $item;
705 - }
706 - }
707 -
708 - return $forms;
709 - }
710 -
711 - /**
712 - * Applies the frm_get_posts_contain_form filter to a form's embed posts.
713 - *
714 - * @since 6.35
715 - *
716 - * @param array $posts Posts that embed the form.
717 - * @param stdClass $form Form object.
718 - *
719 - * @return array
720 - */
721 - private function filter_embed_posts( $posts, $form ) {
722 - /**
723 - * @since 6.32
724 - *
725 - * @param stdClass[] $posts
726 - * @param array $args
727 - */
728 - $filtered_posts = apply_filters( 'frm_get_posts_contain_form', $posts, compact( 'form' ) );
729 -
730 - if ( ! is_array( $filtered_posts ) ) {
731 - _doing_it_wrong( 'frm_get_posts_contain_form', 'Filter should return an array.', '6.32' );
732 - return $posts;
733 - }
734 -
735 - return $filtered_posts;
736 - }
737 -
738 - /**
739 - * Gets search strings for a form inside a post.
740 - *
741 - * @since 6.32
742 - *
743 - * @param int $form_id Form ID.
744 - *
745 - * @return string[]
746 - */
747 - protected function get_search_strings_for_form( $form_id ) {
748 - return $this->get_base_search_strings_for_form( $form_id );
749 - }
750 -
751 - /**
752 - * Gets the base search strings for a form inside a post.
753 - *
754 - * @since 6.32
755 - *
756 - * @param int $form_id Form ID.
757 - *
758 - * @return string[]
759 - */
760 - protected function get_base_search_strings_for_form( $form_id ) {
761 - $strings = array(
762 - '<!-- wp:formidable/simple-form {"formId":"' . $form_id . '"',
763 - );
764 -
765 - // The shortcode renders a form from its key just as happily as from its ID, in either
766 - // attribute, so all four spellings have to be searched or those pages never count.
767 - $identifiers = array( $form_id );
768 - $form_key = FrmForm::get_key_by_id( $form_id );
769 -
770 - if ( $form_key && $form_key !== (string) $form_id ) {
771 - $identifiers[] = $form_key;
772 - }
773 -
774 - foreach ( $identifiers as $identifier ) {
775 - foreach ( array( 'id', 'key' ) as $att ) {
776 - $strings[] = '[formidable ' . $att . '=' . $identifier . ']';
777 - $strings[] = '[formidable ' . $att . '=' . $identifier . ' ';
778 - $strings[] = '[formidable ' . $att . '="' . $identifier . '"';
779 - $strings[] = '[formidable ' . $att . "='" . $identifier . "'";
780 - }
781 - }
782 -
783 - return $strings;
784 - }
785 -
786 - /**
787 - * Maybe clear the embed posts transient when a post is inserted.
788 - *
789 - * @since 6.32
790 - *
791 - * @param int $post_id Post ID.
792 - * @param WP_Post $post Post object.
793 - * @param bool $update True when an existing post was updated rather than created.
794 - *
795 - * @return void
796 - */
797 - public static function maybe_clear_embed_posts_transient( $post_id, $post, $update = false ) {
798 - FrmFormEmbedsHelper::maybe_clear_on_insert( $post_id, $post, $update );
799 - }
800 -
801 - /**
802 - * Maybe clear the embed posts transient when a post is updated.
803 - *
804 - * @since 6.35
805 - *
806 - * @param int $post_id Post ID.
807 - * @param WP_Post $post_after Post object after the update.
808 - * @param WP_Post $post_before Post object before the update.
809 - *
810 - * @return void
811 - */
812 - public static function maybe_clear_embed_posts_transient_on_update( $post_id, $post_after, $post_before ) {
813 - FrmFormEmbedsHelper::maybe_clear_on_update( $post_id, $post_after, $post_before );
814 - }
815 -
816 - /**
817 - * Maybe clear the embed posts transient when a post is trashed, untrashed or deleted.
818 - *
819 - * @since 6.35
820 - *
821 - * @param int $post_id Post ID.
822 - * @param WP_Post|null $post Post object, when the hook provides one.
823 - *
824 - * @return void
825 - */
826 - public static function clear_embed_posts_transient_for_post( $post_id, $post = null ) {
827 - FrmFormEmbedsHelper::maybe_clear_for_post( $post_id, $post );
828 463 }
829 464 }