-
Notifications
You must be signed in to change notification settings - Fork 475
/
class-batch-import.php
271 lines (216 loc) · 4.78 KB
/
class-batch-import.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
<?php
/**
* Batch Import Class
*
* This is the base class for all batch import methods. Each data import type (customers, payments, etc) extend this class
*
* @package EDD
* @subpackage Admin/Import
* @copyright Copyright (c) 2015, Pippin Williamson
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
* @since 2.6
*/
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) exit;
/**
* EDD_Batch_Import Class
*
* @since 2.6
*/
class EDD_Batch_Import {
/**
* The file being imported
*
* @since 2.6
*/
public $file;
/**
* The parsed CSV file being imported
*
* @since 2.6
*/
public $csv;
/**
* Total rows in the CSV file
*
* @since 2.6
*/
public $total;
/**
* The current step being processed
*
* @since 2.6
*/
public $step;
/**
* The number of items to process per step
*
* @since 2.6
*/
public $per_step = 20;
/**
* The capability required to import data
*
* @since 2.6
*/
public $capability_type = 'manage_shop_settings';
/**
* Is the import file empty
*
* @since 2.6
*/
public $is_empty = false;
/**
* Map of CSV columns > database fields
*
* @since 2.6
*/
public $field_mapping = array();
/**
* Get things started
*
* @param $_step int The step to process
* @since 2.6
*/
public function __construct( $_file = '', $_step = 1 ) {
if( ! class_exists( 'parseCSV' ) ) {
require_once EDD_PLUGIN_DIR . 'includes/libraries/parsecsv.lib.php';
}
$this->step = $_step;
$this->file = $_file;
$this->done = false;
$this->csv = new parseCSV();
$this->csv->auto( $this->file );
$this->total = count( $this->csv->data );
$this->init();
}
/**
* Initialize the updater. Runs after import file is loaded but before any processing is done.
*
* @since 2.6
* @return void
*/
public function init() {}
/**
* Can we import?
*
* @access public
* @since 2.6
* @return bool Whether we can iport or not
*/
public function can_import() {
return (bool) apply_filters( 'edd_import_capability', current_user_can( $this->capability_type ) );
}
/**
* Get the CSV columns
*
* @access public
* @since 2.6
* @return array The columns in the CSV
*/
public function get_columns() {
return $this->csv->titles;
}
/**
* Get the first row of the CSV
*
* This is used for showing an example of what the import will look like
*
* @access public
* @since 2.6
* @return array The first row after the header of the CSV
*/
public function get_first_row() {
return array_map( array( $this, 'trim_preview' ), current( $this->csv->data ) );
}
/**
* Process a step
*
* @since 2.6
* @return bool
*/
public function process_step() {
$more = false;
if ( ! $this->can_import() ) {
wp_die( __( 'You do not have permission to import data.', 'easy-digital-downloads' ), __( 'Error', 'easy-digital-downloads' ), array( 'response' => 403 ) );
}
return $more;
}
/**
* Return the calculated completion percentage
*
* @since 2.6
* @return int
*/
public function get_percentage_complete() {
return 100;
}
/**
* Map CSV columns to import fields
*
* @since 2.6
* @return void
*/
public function map_fields( $import_fields = array() ) {
// Probably add some sanitization here later
$this->field_mapping = $import_fields;
}
/**
* Retrieve the URL to the list table for the import data type
*
* @since 2.6
* @return string
*/
public function get_list_table_url() {}
/**
* Retrieve the label for the import type. Example: Payments
*
* @since 2.6
* @return string
*/
public function get_import_type_label() {}
/**
* Convert a string containing delimiters to an array
*
* @since 2.6
* @param $str Input string to convert to an array
* @return array
*/
public function str_to_array( $str = '' ) {
$array = array();
if( is_array( $str ) ) {
return array_map( 'trim', $str );
}
// Look for standard delimiters
if( false !== strpos( $str, '|' ) ) {
$delimiter = '|';
} elseif( false !== strpos( $str, ',' ) ) {
$delimiter = ',';
} elseif( false !== strpos( $str, ';' ) ) {
$delimiter = ';';
} elseif( false !== strpos( $str, '/' ) && ! filter_var( str_replace( ' ', '%20', $str ), FILTER_VALIDATE_URL ) && '/' !== substr( $str, 0, 1 ) ) {
$delimiter = '/';
}
if( ! empty( $delimiter ) ) {
$array = (array) explode( $delimiter, $str );
} else {
$array[] = $str;
}
return array_map( 'trim', $array );
}
/**
* Trims a column value for preview
*
* @since 2.6
* @param $str Input string to trim down
* @return string
*/
public function trim_preview( $str = '' ) {
if( ! is_numeric( $str ) ) {
$long = strlen( $str ) >= 30;
$str = substr( $str, 0, 30 );
$str = $long ? $str . '...' : $str;
}
return $str;
}
}