PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / trunk
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More vtrunk
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 | stripe/helpers/FrmTransLiteListHelper.php +223 -87 6.5 → trunk View file →
@@ -15,12 +15,15 @@
15 15 * This is retrieved all at once with a single database query.
16 16 * This is used to determine if a specific entry is deleted.
17 17 * When an entry is deleted, there is no link to the deleted entry.
18 18 *
19 - * @var int[] $valid_entry_ids
19 + * @var int[]
20 20 */
21 21 private $valid_entry_ids = array();
22 22
23 + /**
24 + * @param array $args
25 + */
23 26 public function __construct( $args ) {
24 27 $this->table = FrmAppHelper::get_simple_request(
25 28 array(
26 29 'param' => 'trans_type',
@@ -26,9 +29,15 @@
26 29 'param' => 'trans_type',
27 30 'type' => 'request',
28 31 )
29 32 );
33 +
30 34 parent::__construct( $args );
35 + $this->screen->set_screen_reader_content(
36 + array(
37 + 'heading_list' => esc_html__( 'Payments list', 'formidable' ),
38 + )
39 + );
31 40 }
32 41
33 42 /**
34 43 * @return void
@@ -35,23 +44,33 @@
35 44 */
36 45 public function prepare_items() {
37 46 global $wpdb;
38 47
39 - $orderby = FrmAppHelper::get_param( 'orderby', 'id', 'get', 'sanitize_title' );
40 - $order = FrmAppHelper::get_param( 'order', 'DESC', 'get', 'sanitize_text_field' );
41 - if ( ! in_array( $order, array( 'ASC', 'DESC' ), true ) ) {
48 + $orderby = FrmAppHelper::get_param( 'orderby', 'id', 'get', 'sanitize_title' );
49 + $order = FrmAppHelper::get_param( 'order', 'DESC', 'get', 'sanitize_text_field' );
50 +
51 + if ( ! is_string( $orderby ) ) {
52 + $orderby = 'id';
53 + }
54 +
55 + if ( ! is_string( $order ) || ! in_array( strtoupper( $order ), array( 'ASC', 'DESC' ), true ) ) {
42 56 $order = 'DESC';
43 57 }
44 58
45 - $page = $this->get_pagenum();
46 - $per_page = $this->get_items_per_page( 'formidable_page_formidable_payments_per_page' );
47 - $start = ( $page - 1 ) * $per_page;
48 - $start = FrmAppHelper::get_param( 'start', $start, 'get', 'absint' );
49 - $query = $this->get_table_query();
59 + $page = $this->get_pagenum();
60 + $per_page = $this->get_items_per_page( 'formidable_page_formidable_payments_per_page' );
61 + $start = ( $page - 1 ) * $per_page;
62 + $start = FrmAppHelper::get_param( 'start', $start, 'get', 'absint' );
63 + $query = $this->get_table_query();
64 + $order_query = FrmDb::esc_order( "ORDER BY p.{$orderby} $order" );
50 65
51 66 // @codingStandardsIgnoreStart
52 67 $this->items = $wpdb->get_results(
53 - 'SELECT * ' . $query . " ORDER BY p.{$orderby} $order LIMIT $start, $per_page"
68 + $wpdb->prepare(
69 + 'SELECT p.* ' . $query . $order_query . ' LIMIT %d, %d',
70 + $start,
71 + $per_page
72 + )
54 73 );
55 74 $total_items = $wpdb->get_var( 'SELECT COUNT(*) ' . $query );
56 75 // @codingStandardsIgnoreEnd
57 76
@@ -71,22 +90,20 @@
71 90
72 91 $table_name = $this->table === 'subscriptions' ? 'frm_subscriptions' : 'frm_payments';
73 92 $form_id = FrmAppHelper::get_param( 'form', 0, 'get', 'absint' );
74 93
75 - if ( $form_id ) {
76 - // @codingStandardsIgnoreStart
77 - $query = $wpdb->prepare(
78 - "FROM `{$wpdb->prefix}{$table_name}` p
79 - LEFT JOIN `{$wpdb->prefix}frm_items` i ON p.item_id = i.id
80 - WHERE i.form_id = %d",
81 - $form_id
82 - );
83 - // @codingStandardsIgnoreEnd
84 - } else {
85 - $query = "FROM `{$wpdb->prefix}{$table_name}` p";
94 + if ( ! $form_id ) {
95 + return "FROM `{$wpdb->prefix}{$table_name}` p";
86 96 }
87 97
88 - return $query;
98 + // @codingStandardsIgnoreStart
99 + return $wpdb->prepare(
100 + "FROM `{$wpdb->prefix}{$table_name}` p
101 + JOIN `{$wpdb->prefix}frm_items` i ON p.item_id = i.id
102 + WHERE i.form_id = %d",
103 + $form_id
104 + );
105 + // @codingStandardsIgnoreEnd
89 106 }
90 107
91 108 /**
92 109 * @return void
@@ -91,9 +108,9 @@
91 108 /**
92 109 * @return void
93 110 */
94 111 public function no_items() {
95 - esc_html_e( 'No payments found.', 'formidable' );
112 + include FrmTransLiteAppHelper::plugin_path() . '/views/lists/no-payments.php';
96 113 }
97 114
98 115 /**
99 116 * @return array
@@ -103,10 +120,9 @@
103 120 'payments' => __( 'Payments', 'formidable' ),
104 121 'subscriptions' => __( 'Subscriptions', 'formidable' ),
105 122 );
106 123
107 - $links = array();
108 -
124 + $links = array();
109 125 $frm_payment = new FrmTransLitePayment();
110 126 $frm_sub = new FrmTransLiteSubscription();
111 127 $counts = array(
112 128 'payments' => $frm_payment->get_count(),
@@ -120,19 +136,17 @@
120 136 )
121 137 );
122 138
123 139 foreach ( $statuses as $status => $name ) {
124 - if ( $status === $type ) {
125 - $class = ' class="current"';
126 - } else {
127 - $class = '';
128 - }
140 + $class = $status === $type ? ' class="current"' : '';
129 141
130 - if ( $counts[ $status ] || 'published' === $status ) {
142 + if ( $counts[ $status ] || 'payments' === $status ) {
143 + // phpcs:disable Generic.WhiteSpace.ScopeIndent
131 144 $links[ $status ] = '<a href="' . esc_url( '?page=formidable-payments&trans_type=' . $status ) . '" ' . $class . '>'
132 - // translators: %1$s: Transaction type (Payments or Subscriptions), %2$s: Span start tag, %3$s: Count, %3$s: Span close tag.
145 + // translators: %1$s: Transaction type (Payments or Subscriptions), %2$s: Span start tag, %3$s: Count, %4$s: Span close tag.
133 146 . sprintf( esc_html__( '%1$s %2$s(%3$s)%4$s', 'formidable' ), esc_html( $name ), '<span class="count">', number_format_i18n( $counts[ $status ] ), '</span>' )
134 147 . '</a>';
148 + // phpcs:enable Generic.WhiteSpace.ScopeIndent
135 149 }
136 150
137 151 unset( $status, $name );
138 152 }
@@ -158,8 +172,9 @@
158 172 'receipt_id' => 'receipt_id',
159 173 'sub_id' => 'sub_id',
160 174 'begin_date' => 'begin_date',
161 175 'expire_date' => 'expire_date',
176 + 'paysys' => 'paysys',
162 177 'status' => 'status',
163 178 'next_bill_date' => 'next_bill_date',
164 179 );
165 180 }
@@ -164,18 +179,38 @@
164 179 );
165 180 }
166 181
167 182 /**
183 + * If the Payments submodule or the PayPal add-on is active, add a bulk delete action.
184 + *
185 + * @since 6.27
186 + *
187 + * @return array
188 + */
189 + public function get_bulk_actions() {
190 + $actions = array();
191 +
192 + if ( $this->payments_addon_list_helper_exists() ) {
193 + $actions['bulk_delete'] = __( 'Delete', 'formidable' );
194 + }
195 +
196 + return $actions;
197 + }
198 +
199 + /**
168 200 * @param string $which
201 + *
169 202 * @return void
170 203 */
171 204 public function extra_tablenav( $which ) {
172 205 $footer = $which !== 'top';
206 +
173 207 if ( $footer ) {
174 208 return;
175 209 }
176 210
177 211 $form_id = FrmAppHelper::simple_get( 'form', 'absint', 0 );
212 +
178 213 if ( $form_id ) {
179 214 // Don't show the switcher if it's already in the header.
180 215 return;
181 216 }
@@ -194,20 +229,20 @@
194 229 * @return void
195 230 */
196 231 public function display_rows() {
197 232 $date_format = FrmTransLiteAppHelper::get_date_format();
233 + $gateways = FrmTransLiteAppHelper::get_gateways();
234 + $alt = 0;
235 + $form_ids = $this->get_form_ids();
236 + $args = compact( 'form_ids', 'date_format', 'gateways' );
237 + // $form_ids is indexed by entry ID.
238 + $this->valid_entry_ids = array_keys( $form_ids );
198 239
199 - $alt = 0;
200 -
201 - $form_ids = $this->get_form_ids();
202 - $args = compact( 'form_ids', 'date_format' );
203 - $this->valid_entry_ids = array_keys( $form_ids ); // $form_ids is indexed by entry ID.
204 -
205 240 foreach ( $this->items as $item ) {
206 241 echo '<tr id="payment-' . esc_attr( $item->id ) . '" ';
207 242
208 243 $is_alternate = 0 === $alt % 2;
209 - $alt++;
244 + ++$alt;
210 245
211 246 if ( $is_alternate ) {
212 247 echo 'class="alternate"';
213 248 }
@@ -220,9 +255,10 @@
220 255 }
221 256 }
222 257
223 258 /**
224 - * @param array $args
259 + * @param object $item
260 + * @param array $args
225 261 *
226 262 * @return void
227 263 */
228 264 private function display_columns( $item, $args ) {
@@ -239,15 +275,33 @@
239 275 }
240 276
241 277 protected function get_column_info() {
242 278 $column_info = parent::get_column_info();
243 - unset( $column_info[0]['cb'] ); // Remove the checkbox column.
279 +
280 + if ( ! $this->payments_addon_list_helper_exists() ) {
281 + // Remove the checkbox column for Lite only.
282 + unset( $column_info[0]['cb'] );
283 + }
284 +
244 285 return $column_info;
245 286 }
246 287
247 288 /**
289 + * Check for Payments submodule (Stripe, Authorize.Net add-ons), as well as PayPal.
290 + *
291 + * @since 6.27
292 + *
293 + * @return bool
294 + */
295 + private function payments_addon_list_helper_exists() {
296 + return class_exists( 'FrmTransListHelper' ) || class_exists( 'FrmPaymentsListHelper' );
297 + }
298 +
299 + /**
248 300 * @param object $item
249 301 * @param array $args
302 + *
303 + * @return string
250 304 */
251 305 private function get_column_value( $item, $args ) {
252 306 $column_name = $args['column_name'];
253 307 $function_name = 'get_' . $column_name . '_column';
@@ -256,9 +310,9 @@
256 310 $val = $this->$function_name( $item, $args );
257 311 } else {
258 312 $val = $item->$column_name ? $item->$column_name : '';
259 313
260 - if ( strpos( $column_name, '_date' ) !== false ) {
314 + if ( str_contains( $column_name, '_date' ) ) {
261 315 if ( ! empty( $item->$column_name ) && $item->$column_name !== '0000-00-00' ) {
262 316 $val = FrmTransLiteAppHelper::format_the_date( $item->$column_name, $args['date_format'] );
263 317 } else {
264 318 $val = '';
@@ -273,8 +327,9 @@
273 327 * @return array
274 328 */
275 329 private function get_form_ids() {
276 330 $entry_ids = array();
331 +
277 332 foreach ( $this->items as $item ) {
278 333 $entry_ids[] = absint( $item->item_id );
279 334 unset( $item );
280 335 }
@@ -293,8 +348,9 @@
293 348 // @codingStandardsIgnoreEnd
294 349 unset( $entry_ids );
295 350
296 351 $form_ids = array();
352 +
297 353 foreach ( $forms as $form ) {
298 354 $form_ids[ $form->id ] = $form;
299 355 unset( $form );
300 356 }
@@ -309,9 +365,9 @@
309 365 */
310 366 private function get_row_classes( $atts ) {
311 367 $class = 'column-' . $atts['column_name'];
312 368
313 - if ( in_array( $atts['column_name'], $atts['hidden'] ) ) {
369 + if ( in_array( $atts['column_name'], $atts['hidden'], true ) ) {
314 370 $class .= ' frm_hidden';
315 371 }
316 372
317 373 return 'class="' . esc_attr( $class ) . '"';
@@ -317,12 +373,26 @@
317 373 return 'class="' . esc_attr( $class ) . '"';
318 374 }
319 375
320 376 /**
377 + * Get the checkbox for bulk actions.
378 + * This is only required when the Payments submodule or PayPal is active.
379 + *
380 + * @since 6.27
381 + *
321 382 * @param object $item
322 383 *
323 384 * @return string
324 385 */
386 + private function get_cb_column( $item ) {
387 + return '<input type="checkbox" name="item-action[]" value="' . esc_attr( $item->id ) . '" />';
388 + }
389 +
390 + /**
391 + * @param object $item
392 + *
393 + * @return string
394 + */
325 395 private function get_receipt_id_column( $item ) {
326 396 return $this->get_action_column( $item, 'receipt_id' );
327 397 }
328 398
@@ -332,32 +402,50 @@
332 402 *
333 403 * @return string
334 404 */
335 405 private function get_action_column( $item, $field ) {
336 - $link = add_query_arg(
337 - array(
338 - 'action' => 'show',
339 - 'id' => $item->id,
340 - 'type' => $this->table,
341 - )
342 - );
406 + $link = $this->get_view_payment_link( $item, $field );
407 + return '<strong>' . $link . '</strong><br />' . $this->row_actions( $this->get_row_actions( $item ) );
408 + }
343 409
410 + /**
411 + * @since 6.27
412 + *
413 + * @param object $item
414 + * @param string $field
415 + *
416 + * @return string
417 + */
418 + private function get_view_payment_link( $item, $field ) {
344 419 $link_params = array(
345 420 'class' => 'rot-title',
346 - 'href' => esc_url( $link ),
421 + 'href' => esc_url( $this->get_url_to_payment( $item->id, 'show' ) ),
347 422 'title' => __( 'View', 'formidable' ),
348 423 );
349 - $link = '<a ' . FrmAppHelper::array_to_html_params( $link_params ) . '>'
350 - . $item->{$field}
351 - . '</a>';
424 + return '<a ' . FrmAppHelper::array_to_html_params( $link_params ) . '>' . esc_html( $item->{ $field } ) . '</a>';
425 + }
352 426
353 - return '<strong>' . $link . '</strong>'
354 - . '<br />'
355 - . $this->row_actions( $this->get_row_actions( $item ) );
427 + /**
428 + * @param int|string $payment_id
429 + * @param string $action Supports 'show' and 'edit'.
430 + *
431 + * @return string
432 + */
433 + private function get_url_to_payment( $payment_id, $action = 'show' ) {
434 + return add_query_arg(
435 + array(
436 + 'action' => $action,
437 + 'id' => $payment_id,
438 + 'type' => $this->table,
439 + 'page' => FrmAppHelper::simple_get( 'page' ),
440 + ),
441 + admin_url( 'admin.php' )
442 + );
356 443 }
357 444
358 445 /**
359 446 * @param object $item
447 + *
360 448 * @return array
361 449 */
362 450 private function get_row_actions( $item ) {
363 451 $base_link = '?page=formidable-payments&action=';
@@ -363,23 +451,44 @@
363 451 $base_link = '?page=formidable-payments&action=';
364 452 $view_link = $base_link . 'show&id=' . $item->id . '&type=' . $this->table;
365 453 $delete_link = $base_link . 'destroy&id=' . $item->id . '&type=' . $this->table;
366 454
367 - $actions = array();
368 - $actions['view'] = '<a href="' . esc_url( $view_link ) . '">' . esc_html__( 'View', 'formidable' ) . '</a>';
369 - $actions['delete'] = '<a href="' . esc_url( wp_nonce_url( $delete_link ) ) . '" data-frmverify="' . esc_attr__( 'Permanently delete this payment?', 'formidable' ) . '" data-frmverify-btn="frm-button-red">' . esc_html__( 'Delete', 'formidable' ) . '</a>';
455 + $actions = array();
456 + $actions['view'] = '<a href="' . esc_url( $view_link ) . '">' . esc_html__( 'View', 'formidable' ) . '</a>';
370 457
458 + if ( $this->supports_edit_link() ) {
459 + $edit_link = $base_link . 'edit&id=' . $item->id;
460 + $actions['edit'] = '<a href="' . esc_url( $edit_link ) . '">' . esc_html__( 'Edit', 'formidable' ) . '</a>';
461 + }
462 +
463 + $actions['delete'] = '<a href="' . esc_url( wp_nonce_url( $delete_link ) ) . '" data-frmverify="' . esc_attr__( 'Permanently delete this payment?', 'formidable' ) . '" data-frmverify-btn="frm-button-red">' . esc_html__( 'Delete', 'formidable' ) . '</a>'; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
464 +
371 465 return $actions;
372 466 }
373 467
374 468 /**
469 + * @since 6.27
470 + *
471 + * @return bool
472 + */
473 + private function supports_edit_link() {
474 + if ( $this->table === 'subscriptions' ) {
475 + return false;
476 + }
477 +
478 + return class_exists( 'FrmTransAppController', false ) || class_exists( 'FrmPaymentsController', false );
479 + }
480 +
481 + /**
375 482 * Get the column value for displaying an entry ID.
376 483 *
377 484 * @param object $item A payment or subscription object.
485 + *
378 486 * @return string
379 487 */
380 488 private function get_item_id_column( $item ) {
381 - $entry_id = (int) $item->item_id;
489 + $entry_id = (int) $item->item_id;
490 + // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
382 491 $entry_is_deleted = ! in_array( $entry_id, $this->valid_entry_ids );
383 492
384 493 if ( $entry_is_deleted ) {
385 494 // translators: %d: ID of the deleted entry.
@@ -391,14 +500,14 @@
391 500
392 501 /**
393 502 * @param object $item
394 503 * @param array $atts
504 + *
395 505 * @return mixed
396 506 */
397 507 private function get_form_id_column( $item, $atts ) {
398 508 if ( isset( $atts['form_ids'][ $item->item_id ] ) ) {
399 - $form_link = FrmFormsHelper::edit_form_link( $atts['form_ids'][ $item->item_id ]->form_id );
400 - return $form_link;
509 + return FrmFormsHelper::edit_form_link( $atts['form_ids'][ $item->item_id ]->form_id );
401 510 }
402 511
403 512 return '';
404 513 }
@@ -404,12 +513,12 @@
404 513 }
405 514
406 515 /**
407 516 * @param object $item
517 + *
408 518 * @return string
409 519 */
410 520 private function get_user_id_column( $item ) {
411 - global $wpdb;
412 521 $val = FrmDb::get_var( 'frm_items', array( 'id' => $item->item_id ), 'user_id' );
413 522 return FrmTransLiteAppHelper::get_user_link( $val );
414 523 }
415 524
@@ -415,8 +524,9 @@
415 524
416 525 /**
417 526 * @param object $item
418 527 * @param array $atts
528 + *
419 529 * @return string
420 530 */
421 531 private function get_created_at_column( $item, $atts ) {
422 532 if ( empty( $item->created_at ) || $item->created_at === '0000-00-00 00:00:00' ) {
@@ -424,13 +534,14 @@
424 534 }
425 535
426 536 $date = FrmAppHelper::get_localized_date( $atts['date_format'], $item->created_at );
427 537 $date_title = FrmAppHelper::get_localized_date( $atts['date_format'] . ' g:i:s A', $item->created_at );
428 - $val = '<abbr title="' . esc_attr( $date_title ) . '">' . $date . '</abbr>';
429 - return $val;
538 + return '<abbr title="' . esc_attr( $date_title ) . '">' . $date . '</abbr>';
430 539 }
431 540
432 541 /**
542 + * @param object $item
543 + *
433 544 * @return string
434 545 */
435 546 private function get_amount_column( $item ) {
436 547 if ( $this->table === 'subscriptions' ) {
@@ -447,24 +558,23 @@
447 558 private function get_end_count_column( $item ) {
448 559 $limit = $item->end_count >= 9999 ? __( 'unlimited', 'formidable' ) : $item->end_count;
449 560 $frm_payment = new FrmTransLitePayment();
450 561 $completed_payments = $frm_payment->get_all_by( $item->id, 'sub_id' );
451 - $count = 0;
562 + $count = FrmTransLiteAppHelper::count_completed_payments( $completed_payments );
452 563
453 - foreach ( $completed_payments as $completed_payment ) {
454 - if ( $completed_payment->status === 'complete' ) {
455 - $count++;
456 - }
457 - }
458 -
459 564 // translators: %1$s: Count, %2$s: Limit.
460 565 return sprintf( __( '%1$s of %2$s', 'formidable' ), $count, $limit );
461 566 }
462 567
568 + /**
569 + * @param object $item
570 + *
571 + * @return string
572 + */
463 573 private function get_status_column( $item ) {
464 574 $status = esc_html( FrmTransLiteAppHelper::show_status( FrmTransLiteAppHelper::get_payment_status( $item ) ) );
465 575
466 - if ( 'processing' === $item->status ) {
576 + if ( 'processing' === ( $item->status ?? '' ) ) {
467 577 $status .= $this->get_processing_tooltip();
468 578 }
469 579
470 580 return $status;
@@ -476,16 +586,10 @@
476 586 * @return string
477 587 */
478 588 private function get_processing_tooltip() {
479 589 return FrmAppHelper::clip(
480 - function() {
481 - $params = array(
482 - 'class' => 'frm_help frm_icon_font frm_tooltip_icon',
483 - 'title' => __( 'This payment method may take between 4-5 business days to process.', 'formidable' ),
484 - );
485 - ?>
486 - <span <?php FrmAppHelper::array_to_html_params( $params, true ); ?>></span>
487 - <?php
590 + function () {
591 + FrmAppHelper::tooltip_icon( __( 'This payment method may take between 4-5 business days to process.', 'formidable' ) );
488 592 }
489 593 );
490 594 }
491 595
@@ -490,8 +594,9 @@
490 594 }
491 595
492 596 /**
493 597 * @param object $item
598 + *
494 599 * @return string
495 600 */
496 601 private function get_sub_id_column( $item ) {
497 602 if ( empty( $item->sub_id ) ) {
@@ -510,16 +615,47 @@
510 615 * Convert the supported pay systems to their proper case.
511 616 *
512 617 * @param object $item
513 618 * @param array $atts
619 + *
514 620 * @return string
515 621 */
516 622 private function get_paysys_column( $item, $atts ) {
517 - switch ( $item->paysys ) {
518 - case 'stripe':
519 - return 'Stripe';
520 - case 'paypal':
521 - return 'PayPal';
623 + if ( isset( $atts['gateways'][ $item->paysys ] ) ) {
624 + return $atts['gateways'][ $item->paysys ]['label'];
522 625 }
626 +
523 627 return $item->paysys;
628 + }
629 +
630 + /**
631 + * Display 'Test' or 'Live' in a mode column if the value is known.
632 + * Old payment entries will have a NULL 'test' column value.
633 + *
634 + * @since 6.6
635 + *
636 + * @param stdClass $item Payment or Subscription object.
637 + *
638 + * @return string
639 + */
640 + private function get_mode_column( $item ) {
641 + return esc_html( FrmTransLiteAppHelper::get_test_mode_display_string( $item ) );
642 + }
643 +
644 + /**
645 + * Render the tabs for the payments list, if the user has access to coupons.
646 + *
647 + * @since 6.27
648 + *
649 + * @param string $active_tab
650 + *
651 + * @return void
652 + */
653 + public static function render_tabs( $active_tab = 'payments' ) {
654 + if ( ! current_user_can( 'frm_change_settings' ) ) {
655 + // Coupons are only available to people who can access global settings.
656 + return;
657 + }
658 +
659 + include FrmTransLiteAppHelper::plugin_path() . '/views/lists/tabs.php';
524 660 }
525 661 }