PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.5
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.5
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 / stripe / helpers / FrmTransLiteListHelper.php

FrmTransLiteListHelper.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.5, at stripe/helpers/FrmTransLiteListHelper.php

526 lines 13.4 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 FrmTransLiteListHelper extends FrmListHelper {
7
8 /**
9 * @var string
10 */
11 private $table = '';
12
13 /**
14 * An array of all valid entry ids.
15 * This is retrieved all at once with a single database query.
16 * This is used to determine if a specific entry is deleted.
17 * When an entry is deleted, there is no link to the deleted entry.
18 *
19 * @var int[] $valid_entry_ids
20 */
21 private $valid_entry_ids = array();
22
23 public function __construct( $args ) {
24 $this->table = FrmAppHelper::get_simple_request(
25 array(
26 'param' => 'trans_type',
27 'type' => 'request',
28 )
29 );
30 parent::__construct( $args );
31 }
32
33 /**
34 * @return void
35 */
36 public function prepare_items() {
37 global $wpdb;
38
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 ) ) {
42 $order = 'DESC';
43 }
44
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();
50
51 // @codingStandardsIgnoreStart
52 $this->items = $wpdb->get_results(
53 'SELECT * ' . $query . " ORDER BY p.{$orderby} $order LIMIT $start, $per_page"
54 );
55 $total_items = $wpdb->get_var( 'SELECT COUNT(*) ' . $query );
56 // @codingStandardsIgnoreEnd
57
58 $this->set_pagination_args(
59 array(
60 'total_items' => $total_items,
61 'per_page' => $per_page,
62 )
63 );
64 }
65
66 /**
67 * @return string
68 */
69 private function get_table_query() {
70 global $wpdb;
71
72 $table_name = $this->table === 'subscriptions' ? 'frm_subscriptions' : 'frm_payments';
73 $form_id = FrmAppHelper::get_param( 'form', 0, 'get', 'absint' );
74
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";
86 }
87
88 return $query;
89 }
90
91 /**
92 * @return void
93 */
94 public function no_items() {
95 esc_html_e( 'No payments found.', 'formidable' );
96 }
97
98 /**
99 * @return array
100 */
101 public function get_views() {
102 $statuses = array(
103 'payments' => __( 'Payments', 'formidable' ),
104 'subscriptions' => __( 'Subscriptions', 'formidable' ),
105 );
106
107 $links = array();
108
109 $frm_payment = new FrmTransLitePayment();
110 $frm_sub = new FrmTransLiteSubscription();
111 $counts = array(
112 'payments' => $frm_payment->get_count(),
113 'subscriptions' => $frm_sub->get_count(),
114 );
115 $type = FrmAppHelper::get_simple_request(
116 array(
117 'param' => 'trans_type',
118 'type' => 'request',
119 'default' => 'payments',
120 )
121 );
122
123 foreach ( $statuses as $status => $name ) {
124 if ( $status === $type ) {
125 $class = ' class="current"';
126 } else {
127 $class = '';
128 }
129
130 if ( $counts[ $status ] || 'published' === $status ) {
131 $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.
133 . 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 . '</a>';
135 }
136
137 unset( $status, $name );
138 }
139
140 return $links;
141 }
142
143 /**
144 * @return array
145 */
146 public function get_columns() {
147 return FrmTransLiteListsController::payment_columns();
148 }
149
150 /**
151 * @return array
152 */
153 public function get_sortable_columns() {
154 return array(
155 'item_id' => 'item_id',
156 'amount' => 'amount',
157 'created_at' => 'created_at',
158 'receipt_id' => 'receipt_id',
159 'sub_id' => 'sub_id',
160 'begin_date' => 'begin_date',
161 'expire_date' => 'expire_date',
162 'status' => 'status',
163 'next_bill_date' => 'next_bill_date',
164 );
165 }
166
167 /**
168 * @param string $which
169 * @return void
170 */
171 public function extra_tablenav( $which ) {
172 $footer = $which !== 'top';
173 if ( $footer ) {
174 return;
175 }
176
177 $form_id = FrmAppHelper::simple_get( 'form', 'absint', 0 );
178 if ( $form_id ) {
179 // Don't show the switcher if it's already in the header.
180 return;
181 }
182
183 FrmFormsHelper::forms_dropdown(
184 'form',
185 $form_id,
186 array( 'blank' => __( 'View all forms', 'formidable' ) )
187 );
188
189 echo '<input type="hidden" name="trans_type" value="' . esc_attr( FrmAppHelper::get_param( 'trans_type', 'payments', 'get', 'sanitize_text_field' ) ) . '">';
190 echo '<input id="post-query-submit" class="button" type="submit" value="Filter" name="filter_action" />';
191 }
192
193 /**
194 * @return void
195 */
196 public function display_rows() {
197 $date_format = FrmTransLiteAppHelper::get_date_format();
198
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 foreach ( $this->items as $item ) {
206 echo '<tr id="payment-' . esc_attr( $item->id ) . '" ';
207
208 $is_alternate = 0 === $alt % 2;
209 $alt++;
210
211 if ( $is_alternate ) {
212 echo 'class="alternate"';
213 }
214
215 echo '>';
216 $this->display_columns( $item, $args );
217 echo '</tr>';
218
219 unset( $item );
220 }
221 }
222
223 /**
224 * @param array $args
225 *
226 * @return void
227 */
228 private function display_columns( $item, $args ) {
229 list( $columns, $hidden ) = $this->get_column_info();
230
231 foreach ( $columns as $column_name => $column_display_name ) {
232 $attributes = self::get_row_classes( compact( 'column_name', 'hidden' ) );
233 $args['column_name'] = $column_name;
234 $val = $this->get_column_value( $item, $args );
235
236 echo '<td ' . $attributes . '>' . $val . '</td>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
237 unset( $val );
238 }
239 }
240
241 protected function get_column_info() {
242 $column_info = parent::get_column_info();
243 unset( $column_info[0]['cb'] ); // Remove the checkbox column.
244 return $column_info;
245 }
246
247 /**
248 * @param object $item
249 * @param array $args
250 */
251 private function get_column_value( $item, $args ) {
252 $column_name = $args['column_name'];
253 $function_name = 'get_' . $column_name . '_column';
254
255 if ( method_exists( $this, $function_name ) ) {
256 $val = $this->$function_name( $item, $args );
257 } else {
258 $val = $item->$column_name ? $item->$column_name : '';
259
260 if ( strpos( $column_name, '_date' ) !== false ) {
261 if ( ! empty( $item->$column_name ) && $item->$column_name !== '0000-00-00' ) {
262 $val = FrmTransLiteAppHelper::format_the_date( $item->$column_name, $args['date_format'] );
263 } else {
264 $val = '';
265 }
266 }
267 }
268
269 return $val;
270 }
271
272 /**
273 * @return array
274 */
275 private function get_form_ids() {
276 $entry_ids = array();
277 foreach ( $this->items as $item ) {
278 $entry_ids[] = absint( $item->item_id );
279 unset( $item );
280 }
281
282 global $wpdb;
283 // @codingStandardsIgnoreStart
284 $forms = $wpdb->get_results(
285 "SELECT
286 fo.id as form_id,
287 fo.name,
288 e.id
289 FROM {$wpdb->prefix}frm_items e
290 LEFT JOIN {$wpdb->prefix}frm_forms fo ON e.form_id = fo.id
291 WHERE e.id in (" . implode( ',', $entry_ids ) . ')'
292 );
293 // @codingStandardsIgnoreEnd
294 unset( $entry_ids );
295
296 $form_ids = array();
297 foreach ( $forms as $form ) {
298 $form_ids[ $form->id ] = $form;
299 unset( $form );
300 }
301
302 return $form_ids;
303 }
304
305 /**
306 * @param array $atts
307 *
308 * @return string
309 */
310 private function get_row_classes( $atts ) {
311 $class = 'column-' . $atts['column_name'];
312
313 if ( in_array( $atts['column_name'], $atts['hidden'] ) ) {
314 $class .= ' frm_hidden';
315 }
316
317 return 'class="' . esc_attr( $class ) . '"';
318 }
319
320 /**
321 * @param object $item
322 *
323 * @return string
324 */
325 private function get_receipt_id_column( $item ) {
326 return $this->get_action_column( $item, 'receipt_id' );
327 }
328
329 /**
330 * @param object $item
331 * @param string $field
332 *
333 * @return string
334 */
335 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 );
343
344 $link_params = array(
345 'class' => 'rot-title',
346 'href' => esc_url( $link ),
347 'title' => __( 'View', 'formidable' ),
348 );
349 $link = '<a ' . FrmAppHelper::array_to_html_params( $link_params ) . '>'
350 . $item->{$field}
351 . '</a>';
352
353 return '<strong>' . $link . '</strong>'
354 . '<br />'
355 . $this->row_actions( $this->get_row_actions( $item ) );
356 }
357
358 /**
359 * @param object $item
360 * @return array
361 */
362 private function get_row_actions( $item ) {
363 $base_link = '?page=formidable-payments&action=';
364 $view_link = $base_link . 'show&id=' . $item->id . '&type=' . $this->table;
365 $delete_link = $base_link . 'destroy&id=' . $item->id . '&type=' . $this->table;
366
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>';
370
371 return $actions;
372 }
373
374 /**
375 * Get the column value for displaying an entry ID.
376 *
377 * @param object $item A payment or subscription object.
378 * @return string
379 */
380 private function get_item_id_column( $item ) {
381 $entry_id = (int) $item->item_id;
382 $entry_is_deleted = ! in_array( $entry_id, $this->valid_entry_ids );
383
384 if ( $entry_is_deleted ) {
385 // translators: %d: ID of the deleted entry.
386 return sprintf( __( '%d (Deleted)', 'formidable' ), $entry_id );
387 }
388
389 return '<a href="' . esc_url( '?page=formidable-entries&frm_action=show&action=show&id=' . $entry_id ) . '">' . absint( $entry_id ) . '</a>';
390 }
391
392 /**
393 * @param object $item
394 * @param array $atts
395 * @return mixed
396 */
397 private function get_form_id_column( $item, $atts ) {
398 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;
401 }
402
403 return '';
404 }
405
406 /**
407 * @param object $item
408 * @return string
409 */
410 private function get_user_id_column( $item ) {
411 global $wpdb;
412 $val = FrmDb::get_var( 'frm_items', array( 'id' => $item->item_id ), 'user_id' );
413 return FrmTransLiteAppHelper::get_user_link( $val );
414 }
415
416 /**
417 * @param object $item
418 * @param array $atts
419 * @return string
420 */
421 private function get_created_at_column( $item, $atts ) {
422 if ( empty( $item->created_at ) || $item->created_at === '0000-00-00 00:00:00' ) {
423 return '';
424 }
425
426 $date = FrmAppHelper::get_localized_date( $atts['date_format'], $item->created_at );
427 $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;
430 }
431
432 /**
433 * @return string
434 */
435 private function get_amount_column( $item ) {
436 if ( $this->table === 'subscriptions' ) {
437 return FrmTransLiteAppHelper::format_billing_cycle( $item );
438 }
439 return FrmTransLiteAppHelper::formatted_amount( $item );
440 }
441
442 /**
443 * @param object $item
444 *
445 * @return string
446 */
447 private function get_end_count_column( $item ) {
448 $limit = $item->end_count >= 9999 ? __( 'unlimited', 'formidable' ) : $item->end_count;
449 $frm_payment = new FrmTransLitePayment();
450 $completed_payments = $frm_payment->get_all_by( $item->id, 'sub_id' );
451 $count = 0;
452
453 foreach ( $completed_payments as $completed_payment ) {
454 if ( $completed_payment->status === 'complete' ) {
455 $count++;
456 }
457 }
458
459 // translators: %1$s: Count, %2$s: Limit.
460 return sprintf( __( '%1$s of %2$s', 'formidable' ), $count, $limit );
461 }
462
463 private function get_status_column( $item ) {
464 $status = esc_html( FrmTransLiteAppHelper::show_status( FrmTransLiteAppHelper::get_payment_status( $item ) ) );
465
466 if ( 'processing' === $item->status ) {
467 $status .= $this->get_processing_tooltip();
468 }
469
470 return $status;
471 }
472
473 /**
474 * @since 6.5, introduced in v2.04 of the Payments submodule.
475 *
476 * @return string
477 */
478 private function get_processing_tooltip() {
479 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
488 }
489 );
490 }
491
492 /**
493 * @param object $item
494 * @return string
495 */
496 private function get_sub_id_column( $item ) {
497 if ( empty( $item->sub_id ) ) {
498 return '';
499 }
500
501 if ( $this->table === 'subscriptions' ) {
502 return $this->get_action_column( $item, 'sub_id' );
503 }
504
505 return '<a href="' . esc_url( '?page=formidable-payments&action=show&type=subscriptions&id=' . $item->sub_id ) . '">' . $item->sub_id . '</a>';
506 }
507
508 /**
509 * Get the string for the "Processor" column.
510 * Convert the supported pay systems to their proper case.
511 *
512 * @param object $item
513 * @param array $atts
514 * @return string
515 */
516 private function get_paysys_column( $item, $atts ) {
517 switch ( $item->paysys ) {
518 case 'stripe':
519 return 'Stripe';
520 case 'paypal':
521 return 'PayPal';
522 }
523 return $item->paysys;
524 }
525 }
526