Passed
Pull Request — master (#365)
by Brian
430:40 queued 310:21
created

WPInv_Customers_Table   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 181
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 53
c 1
b 0
f 0
dl 0
loc 181
rs 10
wmc 13

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A prepare_items() 0 6 1
A single_row() 0 10 2
A column_name() 0 27 2
A get_paged() 0 2 2
A get_primary_column_name() 0 2 1
A bulk_actions() 0 2 1
A prepare_query() 0 15 1
A column_default() 0 3 1
A get_columns() 0 13 1
1
<?php
2
/**
3
 * Customers Table Class
4
 *
5
 */
6
7
// Exit if accessed directly
8
if ( ! defined( 'ABSPATH' ) ) exit;
9
10
// Load WP_List_Table if not loaded
11
if ( ! class_exists( 'WP_List_Table' ) ) {
12
	require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
13
}
14
15
/**
16
 * WPInv_Customers_Table Class
17
 *
18
 * Renders the Gateway Reports table
19
 *
20
 * @since 1.0.19
21
 */
22
class WPInv_Customers_Table extends WP_List_Table {
23
24
	/**
25
	 * @var int Number of items per page
26
	 * @since 1.0.19
27
	 */
28
	public $per_page = 10;
29
30
	/**
31
	 * Get things started
32
	 *
33
	 * @since 1.0.19
34
	 * @see WP_List_Table::__construct()
35
	 */
36
	public function __construct() {
37
38
		// Set parent defaults
39
		parent::__construct( array(
40
			'singular' => 'id',
41
			'plural'   => 'ids',
42
			'ajax'     => false,
43
		) );
44
45
	}
46
47
	/**
48
	 * Gets the name of the primary column.
49
	 *
50
	 * @since 1.0.19
51
	 * @access protected
52
	 *
53
	 * @return string Name of the primary column.
54
	 */
55
	protected function get_primary_column_name() {
56
		return 'name';
57
	}
58
59
	/**
60
	 * This function renders most of the columns in the list table.
61
	 *
62
	 * @since 1.0.19
63
	 *
64
	 * @param WP_User $item
65
	 * @param string $column_name The name of the column
66
	 *
67
	 * @return string Column Name
68
	 */
69
	public function column_default( $item, $column_name ) {
70
		$value = sanitize_text_field( get_user_meta( $item->ID, '_wpinv_' . $column_name, true ) );
0 ignored issues
show
Bug introduced by
It seems like get_user_meta($item->ID,...' . $column_name, true) can also be of type false; however, parameter $str of sanitize_text_field() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

70
		$value = sanitize_text_field( /** @scrutinizer ignore-type */ get_user_meta( $item->ID, '_wpinv_' . $column_name, true ) );
Loading history...
71
		return apply_filters( 'wpinv_customers_table_column' . $column_name, $value, $item );
72
	}
73
74
	/**
75
	 * Generates content for a single row of the table
76
	 * @since 1.0.19
77
	 *
78
	 * @param int $item The user id.
79
	 */
80
	public function single_row( $item ) {
81
		$item = get_user_by( 'id', $item );
82
83
		if ( empty( $item ) ) {
84
			return;
85
		}
86
87
		echo '<tr>';
88
		$this->single_row_columns( $item );
89
		echo '</tr>';
90
	}
91
92
	/**
93
	 * Displays the customers name
94
	 *
95
	 * @param  WP_User $customer customer.
96
	 * @return string
97
	 */
98
	public function column_name( $customer ) {
99
100
		// Customer view URL.
101
		$view_url    = esc_url( add_query_arg( 'user_id', $customer->ID, admin_url( 'user-edit.php' ) ) );
102
		$row_actions = $this->row_actions(
0 ignored issues
show
Unused Code introduced by
The assignment to $row_actions is dead and can be removed.
Loading history...
103
			array(
104
				'view' => '<a href="' . $view_url . '">' . __( 'View', 'invoicing' ) . '</a>',
105
			)
106
		);
107
108
		// Customer email address.
109
		$email       = sanitize_email( $customer->user_email );
110
111
		// Customer's avatar.
112
		$avatar = esc_url( get_avatar_url( $email ) );
0 ignored issues
show
Bug introduced by
It seems like get_avatar_url($email) can also be of type false; however, parameter $url of esc_url() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

112
		$avatar = esc_url( /** @scrutinizer ignore-type */ get_avatar_url( $email ) );
Loading history...
113
		$avatar = "<img src='$avatar' height='32' width='32'/>";
114
115
		// Customer's name.
116
		$name   = sanitize_text_field( "{$customer->display_name} ($customer->user_login)" );
117
118
		if ( ! empty( $name ) ) {
119
			$name = "<div style='overflow: hidden;height: 18px;'>$name</div>";
120
		}
121
122
		$email = "<div class='row-title'><a href='$view_url'>$email</a></div>";
123
124
		return "<div style='display: flex;'><div>$avatar</div><div style='margin-left: 10px;'>$name<strong>$email</strong></div></div>";
125
126
	}
127
128
	/**
129
	 * Retrieve the table columns
130
	 *
131
	 * @since 1.0.19
132
	 * @return array $columns Array of all the list table columns
133
	 */
134
	public function get_columns() {
135
136
		$columns = array(
137
			'name'     => __( 'Name', 'invoicing' ),
138
			'country'  => __( 'Country', 'invoicing' ),
139
			'state'    => __( 'State', 'invoicing' ),
140
			'city'     => __( 'City', 'invoicing' ),
141
			'zip'      => __( 'ZIP', 'invoicing' ),
142
			'address'  => __( 'Address', 'invoicing' ),
143
			'phone'    => __( 'Phone', 'invoicing' ),
144
			'company'  => __( 'Company', 'invoicing' ),
145
		);
146
		return apply_filters( 'wpinv_customers_table_columns', $columns );
147
148
	}
149
150
	/**
151
	 * Retrieve the current page number
152
	 *
153
	 * @since 1.0.19
154
	 * @return int Current page number
155
	 */
156
	public function get_paged() {
157
		return isset( $_GET['paged'] ) ? absint( $_GET['paged'] ) : 1;
158
	}
159
160
	/**
161
	 * Returns bulk actions.
162
	 *
163
	 * @since 1.0.19
164
	 * @return void
165
	 */
166
	public function bulk_actions( $which = '' ) {
167
		return array();
0 ignored issues
show
Bug Best Practice introduced by
The expression return array() returns the type array which is incompatible with the documented return type void.
Loading history...
168
	}
169
170
	/**
171
	 *  Prepares the display query
172
	 */
173
	public function prepare_query() {
174
		global $wpdb;
175
176
		// Users with invoices.
177
    	$customers = $wpdb->get_col(
178
			$wpdb->prepare(
179
				"SELECT DISTINCT( post_author ) FROM $wpdb->posts WHERE post_type=%s LIMIT %d,%d",
180
				'wpi_invoice',
181
				$this->get_paged() * 10 - 10,
182
				$this->per_page
183
			)
184
		);
185
186
		$this->items = $customers;
187
		$this->total = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT( DISTINCT( post_author ) ) FROM $wpdb->posts WHERE post_type=%s", 'wpi_invoice' ) );
0 ignored issues
show
Bug Best Practice introduced by
The property total does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
188
189
	}
190
191
	/**
192
	 * Setup the final data for the table
193
	 *
194
	 * @since 1.0.19
195
	 * @return void
196
	 */
197
	public function prepare_items() {
198
		$columns               = $this->get_columns();
199
		$hidden                = array(); // No hidden columns
200
		$sortable              = $this->get_sortable_columns();
201
		$this->_column_headers = array( $columns, $hidden, $sortable );
202
		$this->prepare_query();
203
	}
204
}
205