Test Failed
Push — hotfix/license ( b489e1 )
by Ravinder
05:03
created

Give_Donor_Reports_Table   A

Complexity

Total Complexity 34

Size/Duplication

Total Lines 366
Duplicated Lines 35.52 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
dl 130
loc 366
rs 9.2
c 0
b 0
f 0
wmc 34
lcom 1
cbo 2

14 Methods

Rating   Name   Duplication   Size   Complexity  
A search_box() 0 3 1
A __construct() 11 11 1
A give_search_box() 17 17 3
A get_columns() 0 11 1
A get_sortable_columns() 8 8 1
A bulk_actions() 0 3 1
A get_paged() 0 3 2
A get_search() 0 3 2
B reports_data() 30 30 4
A get_donor_count() 10 10 1
B get_donor_query() 26 26 6
A prepare_items() 18 18 1
B column_default() 10 30 6
B display_tablenav() 0 36 4

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
/**
3
 * Donor Reports Table Class
4
 *
5
 * @package     Give
6
 * @subpackage  Admin/Reports
7
 * @copyright   Copyright (c) 2016, WordImpress
8
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
9
 * @since       1.0
10
 */
11
12
// Exit if accessed directly.
13
if ( ! defined( 'ABSPATH' ) ) {
14
	exit;
15
}
16
17
// Load WP_List_Table if not loaded
18
if ( ! class_exists( 'WP_List_Table' ) ) {
19
	require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
20
}
21
22
/**
23
 * Give_Donor_Reports_Table Class
24
 *
25
 * Renders the Donor Reports table
26
 *
27
 * @since 1.0
28
 */
29
class Give_Donor_Reports_Table extends WP_List_Table {
30
31
	/**
32
	 * Number of items per page
33
	 *
34
	 * @var int
35
	 * @since 1.0
36
	 */
37
	public $per_page = 30;
38
39
	/**
40
	 * Number of donors found
41
	 *
42
	 * @var int
43
	 * @since 1.0
44
	 */
45
	public $count = 0;
46
47
	/**
48
	 * Total donors
49
	 *
50
	 * @var int
51
	 * @since 1.0
52
	 */
53
	public $total = 0;
54
55
	/**
56
	 * Get things started
57
	 *
58
	 * @since 1.0
59
	 * @see   WP_List_Table::__construct()
60
	 */
61 View Code Duplication
	public function __construct() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
62
		global $status, $page;
63
64
		// Set parent defaults
65
		parent::__construct( array(
66
			'singular' => esc_html__( 'Donor', 'give' ),     // Singular name of the listed records
67
			'plural'   => esc_html__( 'Donors', 'give' ),    // Plural name of the listed records
68
			'ajax'     => false,// Does this table support ajax?
69
		) );
70
71
	}
72
73
	/**
74
	 * Remove default search field in favor for repositioned location
75
	 *
76
	 * Reposition the search field
77
	 *
78
	 * @since       1.0
79
	 * @access      public
80
	 *
81
	 * @param string $text     Label for the search box
82
	 * @param string $input_id ID of the search box
83
	 *
84
	 * @return false
85
	 */
86
	public function search_box( $text, $input_id ) {
87
		return false;
88
	}
89
90
	/**
91
	 * Show the search field
92
	 *
93
	 * @since  1.0
94
	 * @access public
95
	 *
96
	 * @param string $text     Label for the search box
97
	 * @param string $input_id ID of the search box
98
	 *
99
	 * @return void
100
	 */
101 View Code Duplication
	public function give_search_box( $text, $input_id ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
102
		$input_id = $input_id . '-search-input';
103
104
		if ( ! empty( $_REQUEST['orderby'] ) ) {
0 ignored issues
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
105
			echo '<input type="hidden" name="orderby" value="' . esc_attr( $_REQUEST['orderby'] ) . '" />';
0 ignored issues
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
106
		}
107
		if ( ! empty( $_REQUEST['order'] ) ) {
0 ignored issues
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
108
			echo '<input type="hidden" name="order" value="' . esc_attr( $_REQUEST['order'] ) . '" />';
0 ignored issues
show
introduced by
Detected access of super global var $_REQUEST, probably need manual inspection.
Loading history...
109
		}
110
		?>
111
		<p class="search-box donor-search" role="search">
112
			<label class="screen-reader-text" for="<?php echo $input_id ?>"><?php echo $text; ?>:</label>
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$input_id'
Loading history...
introduced by
Expected next thing to be a escaping function, not '$text'
Loading history...
113
			<input type="search" id="<?php echo $input_id ?>" name="s" value="<?php _admin_search_query(); ?>" />
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$input_id'
Loading history...
114
			<?php submit_button( $text, 'button', false, false, array( 'ID' => 'search-submit' ) ); ?>
115
		</p>
116
	<?php
117
	}
118
119
	/**
120
	 * Generate the table navigation above or below the table
121
	 *
122
	 * @since  1.0
123
	 * @access protected
124
	 *
125
	 * @param string $which
126
	 */
127
	protected function display_tablenav( $which ) {
128
129
		if ( 'top' === $which ) {
130
			wp_nonce_field( 'bulk-' . $this->_args['plural'] );
131
		}
132
		?>
133
		<div class="tablenav give-clearfix <?php echo esc_attr( $which ); ?>">
134
135
			<?php if ( 'top' === $which ) { ?>
136
				<h2 class="alignleft reports-earnings-title">
137
					<?php esc_html_e( 'Donors Report', 'give' ); ?>
138
				</h2>
139
			<?php } ?>
140
141
			<div class="alignright tablenav-right">
142
				<div class="actions bulkactions">
143
					<?php
144
					if ( 'top' === $which ) {
145
						$this->give_search_box( esc_html__( 'Search Donors', 'give' ), 'give-donors-report-search' );
146
					}
147
148
					$this->bulk_actions( $which ); ?>
149
150
				</div>
151
				<?php
152
				$this->extra_tablenav( $which );
153
				$this->pagination( $which );
154
				?>
155
			</div>
156
157
158
			<br class="clear"/>
159
160
		</div>
161
		<?php
162
	}
163
164
	/**
165
	 * This function renders most of the columns in the list table.
166
	 *
167
	 * @access public
168
	 * @since  1.0
169
	 *
170
	 * @param array  $item        Contains all the data of the donors
171
	 * @param string $column_name The name of the column
172
	 *
173
	 * @return string Column Name
174
	 */
175
	public function column_default( $item, $column_name ) {
176
177
		switch ( $column_name ) {
178
179
			case 'name' :
180
				$name = '#' . $item['id'] . ' ';
181
				$name .= ! empty( $item['name'] ) ? $item['name'] : '<em>' . esc_html__( 'Unnamed Donor', 'give' ) . '</em>';
182
				$view_url = admin_url( 'edit.php?post_type=give_forms&page=give-donors&view=overview&id=' . $item['id'] );
183
				$value    = '<a href="' . esc_url( $view_url ) . '">' . $name . '</a>';
184
				break;
185
186 View Code Duplication
			case 'num_donations' :
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
187
				$value = sprintf(
188
					'<a href="%s">%s</a>',
189
					admin_url( 'edit.php?post_type=give_forms&page=give-payment-history&donor=' . absint( $item['id'] ) ),
190
						esc_html( $item['num_donations'] )
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 20 spaces, but found 24.
Loading history...
191
					);
0 ignored issues
show
Coding Style introduced by
This line of the multi-line function call does not seem to be indented correctly. Expected 16 spaces, but found 20.
Loading history...
192
				break;
193
194 View Code Duplication
			case 'amount_spent' :
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
195
				$value = give_currency_filter( give_format_amount( $item[ $column_name ], array( 'sanitize' => false ) ) );
196
				break;
197
198
			default:
199
				$value = isset( $item[ $column_name ] ) ? $item[ $column_name ] : null;
200
				break;
201
		}
202
203
		return apply_filters( "give_report_column_{$column_name}", $value, $item['id'] );
204
	}
205
206
	/**
207
	 * Retrieve the table columns
208
	 *
209
	 * @access public
210
	 * @since  1.0
211
	 * @return array $columns Array of all the list table columns
212
	 */
213
	public function get_columns() {
214
		$columns = array(
215
			'name'          => __( 'Name', 'give' ),
216
			'email'         => __( 'Email', 'give' ),
217
			'num_donations' => __( 'Donations', 'give' ),
218
			'amount_spent'  => __( 'Total Donated', 'give' ),
219
		);
220
221
		return apply_filters( 'give_report_donor_columns', $columns );
222
223
	}
224
225
	/**
226
	 * Get the sortable columns
227
	 *
228
	 * @access public
229
	 * @since  1.0
230
	 * @return array Array of all the sortable columns
231
	 */
232 View Code Duplication
	public function get_sortable_columns() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
233
		return array(
234
			'id'            => array( 'id', true ),
235
			'name'          => array( 'name', true ),
236
			'num_donations' => array( 'purchase_count', false ),
237
			'amount_spent'  => array( 'purchase_value', false ),
238
		);
239
	}
240
241
	/**
242
	 * Outputs the reporting views
243
	 *
244
	 * @access public
245
	 * @since  1.0
246
	 * @return void
247
	 */
248
	public function bulk_actions( $which = '' ) {
249
250
	}
251
252
	/**
253
	 * Retrieve the current page number
254
	 *
255
	 * @access public
256
	 * @since  1.0
257
	 * @return int Current page number
258
	 */
259
	public function get_paged() {
260
		return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
261
	}
262
263
	/**
264
	 * Retrieves the search query string
265
	 *
266
	 * @access public
267
	 * @since  1.0
268
	 * @return mixed string If search is present, false otherwise
269
	 */
270
	public function get_search() {
271
		return ! empty( $_GET['s'] ) ? urldecode( trim( $_GET['s'] ) ) : false;
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
272
	}
273
274
	/**
275
	 * Build all the reports data
276
	 *
277
	 * @access public
278
	 * @since  1.0
279
	 * @global object $wpdb Used to query the database using the WordPress
280
	 *                      Database API
281
	 * @return array $reports_data All the data for donor reports
282
	 */
283 View Code Duplication
	public function reports_data() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
284
		global $wpdb;
285
286
		$data = array();
287
288
		// Get donor query.
289
		$args   = $this->get_donor_query();
290
		$donors = Give()->donors->get_donors( $args );
291
292
		if ( $donors ) {
293
294
			$this->count = count( $donors );
295
296
			foreach ( $donors as $donor ) {
297
298
				$user_id = ! empty( $donor->user_id ) ? absint( $donor->user_id ) : 0;
299
300
				$data[] = array(
301
					'id'            => $donor->id,
302
					'user_id'       => $user_id,
303
					'name'          => $donor->name,
304
					'email'         => $donor->email,
305
					'num_donations' => $donor->purchase_count,
306
					'amount_spent'  => $donor->purchase_value,
307
				);
308
			}
309
		}
310
311
		return $data;
312
	}
313
314
	/**
315
	 * Get donor count.
316
	 *
317
	 * @since 1.8.1
318
	 * @access private
319
	 */
320 View Code Duplication
	private function get_donor_count() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
321
		// Get donor query.
322
		$_donor_query = $this->get_donor_query();
323
324
		$_donor_query['number'] = -1;
325
		$_donor_query['offset'] = 0;
326
		$donors = Give()->donors->get_donors( $_donor_query );
327
328
		return count( $donors );
329
	}
330
331
	/**
332
	 * Get donor query.
333
	 *
334
	 * @since  1.8.1
335
	 * @access public
336
	 * @return array
337
	 */
338 View Code Duplication
	public function get_donor_query() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
339
		$paged   = $this->get_paged();
340
		$offset  = $this->per_page * ( $paged - 1 );
341
		$search  = $this->get_search();
342
		$order   = isset( $_GET['order'] ) ? sanitize_text_field( $_GET['order'] ) : 'DESC';
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
343
		$orderby = isset( $_GET['orderby'] ) ? sanitize_text_field( $_GET['orderby'] ) : 'id';
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
344
345
		$args = array(
346
			'number'  => $this->per_page,
347
			'offset'  => $offset,
348
			'order'   => $order,
349
			'orderby' => $orderby,
350
		);
351
352
		if( $search ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $search of type string|false is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
353
			if ( is_email( $search ) ) {
354
				$args['email'] = $search;
355
			} elseif ( is_numeric( $search ) ) {
356
				$args['id'] = $search;
357
			} else {
358
				$args['name'] = $search;
359
			}
360
		}
361
362
		return $args;
363
	}
364
365
	/**
366
	 * Setup the final data for the table
367
	 *
368
	 * @access public
369
	 * @since  1.0
370
	 * @uses   Give_Donor_Reports_Table::get_columns()
371
	 * @uses   WP_List_Table::get_sortable_columns()
372
	 * @uses   Give_Donor_Reports_Table::get_pagenum()
373
	 * @uses   Give_Donor_Reports_Table::get_total_donors()
374
	 * @return void
375
	 */
376 View Code Duplication
	public function prepare_items() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
377
378
		$columns  = $this->get_columns();
379
		$hidden   = array(); // No hidden columns
380
		$sortable = $this->get_sortable_columns();
381
382
		$this->_column_headers = array( $columns, $hidden, $sortable );
383
384
		$this->items = $this->reports_data();
385
386
		$this->total = $this->get_donor_count();
387
388
		$this->set_pagination_args( array(
389
			'total_items' => $this->total,
390
			'per_page'    => $this->per_page,
391
			'total_pages' => ceil( $this->total / $this->per_page ),
392
		) );
393
	}
394
}
395