Completed
Branch dev (5b2722)
by
unknown
05:49 queued 10s
created
core/libraries/batch/JobHandlers/DatetimeOffsetFix.php 2 patches
Indentation   +467 added lines, -467 removed lines patch added patch discarded remove patch
@@ -24,471 +24,471 @@
 block discarded – undo
24 24
 class DatetimeOffsetFix extends JobHandler
25 25
 {
26 26
 
27
-    /**
28
-     * Key for the option used to track which models have been processed when doing the batches.
29
-     */
30
-    const MODELS_TO_PROCESS_OPTION_KEY = 'ee_models_processed_for_datetime_offset_fix';
31
-
32
-
33
-    const COUNT_OF_MODELS_PROCESSED = 'ee_count_of_ee_models_processed_for_datetime_offset_fixed';
34
-
35
-    /**
36
-     * Key for the option used to track what the current offset is that will be applied when this tool is executed.
37
-     */
38
-    const OFFSET_TO_APPLY_OPTION_KEY = 'ee_datetime_offset_fix_offset_to_apply';
39
-
40
-
41
-    const OPTION_KEY_OFFSET_RANGE_START_DATE = 'ee_datetime_offset_start_date_range';
42
-
43
-
44
-    const OPTION_KEY_OFFSET_RANGE_END_DATE = 'ee_datetime_offset_end_date_range';
45
-
46
-
47
-    /**
48
-     * String labelling the datetime offset fix type for change-log entries.
49
-     */
50
-    const DATETIME_OFFSET_FIX_CHANGELOG_TYPE = 'datetime_offset_fix';
51
-
52
-
53
-    /**
54
-     * String labelling a datetime offset fix error for change-log entries.
55
-     */
56
-    const DATETIME_OFFSET_FIX_CHANGELOG_ERROR_TYPE = 'datetime_offset_fix_error';
57
-
58
-    /**
59
-     * @var EEM_Base[]
60
-     */
61
-    protected $models_with_datetime_fields = array();
62
-
63
-    // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
64
-
65
-    /**
66
-     * Performs any necessary setup for starting the job. This is also a good
67
-     * place to setup the $job_arguments which will be used for subsequent HTTP requests
68
-     * when continue_job will be called
69
-     *
70
-     * @param JobParameters $job_parameters
71
-     * @return JobStepResponse
72
-     * @throws EE_Error
73
-     * @throws InvalidArgumentException
74
-     * @throws InvalidDataTypeException
75
-     * @throws InvalidInterfaceException
76
-     */
77
-    public function create_job(JobParameters $job_parameters)
78
-    {
79
-        $models_with_datetime_fields = $this->getModelsWithDatetimeFields();
80
-        // we'll be doing each model as a batch.
81
-        $job_parameters->set_job_size(count($models_with_datetime_fields));
82
-        return new JobStepResponse(
83
-            $job_parameters,
84
-            esc_html__('Starting Datetime Offset Fix', 'event_espresso')
85
-        );
86
-    }
87
-
88
-    /**
89
-     * Performs another step of the job
90
-     *
91
-     * @param JobParameters $job_parameters
92
-     * @param int           $batch_size
93
-     * @return JobStepResponse
94
-     * @throws EE_Error
95
-     * @throws InvalidArgumentException
96
-     * @throws InvalidDataTypeException
97
-     * @throws InvalidInterfaceException
98
-     */
99
-    public function continue_job(JobParameters $job_parameters, $batch_size = 50)
100
-    {
101
-        $models_to_process = $this->getModelsWithDatetimeFields();
102
-        // let's pop off the a model and do the query to apply the offset.
103
-        $model_to_process = array_pop($models_to_process);
104
-        // update our record
105
-        $this->setModelsToProcess($models_to_process);
106
-        $this->processModel($model_to_process);
107
-        $this->updateCountOfModelsProcessed();
108
-        $job_parameters->set_units_processed($this->getCountOfModelsProcessed());
109
-        if (count($models_to_process) > 0) {
110
-            $job_parameters->set_status(JobParameters::status_continue);
111
-        } else {
112
-            $job_parameters->set_status(JobParameters::status_complete);
113
-        }
114
-        return new JobStepResponse(
115
-            $job_parameters,
116
-            sprintf(
117
-                esc_html__('Updated the offset for all datetime fields on the %s model.', 'event_espresso'),
118
-                $model_to_process
119
-            )
120
-        );
121
-    }
122
-
123
-    /**
124
-     * Performs any clean-up logic when we know the job is completed
125
-     *
126
-     * @param JobParameters $job_parameters
127
-     * @return JobStepResponse
128
-     * @throws BatchRequestException
129
-     */
130
-    public function cleanup_job(JobParameters $job_parameters)
131
-    {
132
-        // delete important saved options.
133
-        delete_option(self::MODELS_TO_PROCESS_OPTION_KEY);
134
-        delete_option(self::COUNT_OF_MODELS_PROCESSED);
135
-        delete_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE);
136
-        delete_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE);
137
-        return new JobStepResponse($job_parameters, esc_html__(
138
-            'Offset has been applied to all affected fields.',
139
-            'event_espresso'
140
-        ));
141
-    }
142
-
143
-
144
-    /**
145
-     * Contains the logic for processing a model and applying the datetime offset to affected fields on that model.
146
-     *
147
-     * @param string $model_class_name
148
-     * @throws EE_Error
149
-     */
150
-    protected function processModel($model_class_name)
151
-    {
152
-        global $wpdb;
153
-        /** @var EEM_Base $model */
154
-        $model = $model_class_name::instance();
155
-        $original_offset = self::getOffset();
156
-        $start_date_range = self::getStartDateRange();
157
-        $end_date_range = self::getEndDateRange();
158
-        $sql_date_function = $original_offset > 0 ? 'DATE_ADD' : 'DATE_SUB';
159
-        $offset = abs($original_offset) * 60;
160
-        $date_ranges = array();
161
-        // since some affected models might have two tables, we have to get our tables and set up a query for each table.
162
-        foreach ($model->get_tables() as $table) {
163
-            $query = 'UPDATE ' . $table->get_table_name();
164
-            $fields_affected = array();
165
-            $inner_query = array();
166
-            foreach ($model->_get_fields_for_table($table->get_table_alias()) as $model_field) {
167
-                if ($model_field instanceof EE_Datetime_Field) {
168
-                    $inner_query[ $model_field->get_table_column() ] = $model_field->get_table_column() . ' = '
169
-                                                                       . $sql_date_function . '('
170
-                                                                       . $model_field->get_table_column()
171
-                                                                       . ", INTERVAL {$offset} MINUTE)";
172
-                    $fields_affected[] = $model_field;
173
-                }
174
-            }
175
-            if (! $fields_affected) {
176
-                continue;
177
-            }
178
-            // do we do one query per column/field or one query for all fields on the model? It all depends on whether
179
-            // there is a date range applied or not.
180
-            if ($start_date_range instanceof DbSafeDateTime || $end_date_range instanceof DbSafeDateTime) {
181
-                $result = $this->doQueryForEachField($query, $inner_query, $start_date_range, $end_date_range);
182
-            } else {
183
-                $result = $this->doQueryForAllFields($query, $inner_query);
184
-            }
185
-
186
-            // record appropriate logs for the query
187
-            switch (true) {
188
-                case $result === false:
189
-                    // record error.
190
-                    $error_message = $wpdb->last_error;
191
-                    // handle the edgecases where last_error might be empty.
192
-                    if (! $error_message) {
193
-                        $error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
194
-                    }
195
-                    $this->recordChangeLog($model, $original_offset, $table, $fields_affected, $error_message);
196
-                    break;
197
-                case is_array($result) && ! empty($result):
198
-                    foreach ($result as $field_name => $error_message) {
199
-                        $this->recordChangeLog($model, $original_offset, $table, array($field_name), $error_message);
200
-                    }
201
-                    break;
202
-                default:
203
-                    $this->recordChangeLog($model, $original_offset, $table, $fields_affected);
204
-            }
205
-        }
206
-    }
207
-
208
-
209
-    /**
210
-     * Does the query on each $inner_query individually.
211
-     *
212
-     * @param string              $query
213
-     * @param array               $inner_query
214
-     * @param DbSafeDateTime|null $start_date_range
215
-     * @param DbSafeDateTime|null $end_date_range
216
-     * @return array  An array of any errors encountered and the fields they were for.
217
-     */
218
-    private function doQueryForEachField($query, array $inner_query, $start_date_range, $end_date_range)
219
-    {
220
-        global $wpdb;
221
-        $errors = array();
222
-        foreach ($inner_query as $field_name => $field_query) {
223
-            $query_to_run = $query;
224
-            $where_conditions = array();
225
-            $query_to_run .= ' SET ' . $field_query;
226
-            if ($start_date_range instanceof DbSafeDateTime) {
227
-                $start_date = $start_date_range->format(EE_Datetime_Field::mysql_timestamp_format);
228
-                $where_conditions[] = "{$field_name} > '{$start_date}'";
229
-            }
230
-            if ($end_date_range instanceof DbSafeDateTime) {
231
-                $end_date = $end_date_range->format(EE_Datetime_Field::mysql_timestamp_format);
232
-                $where_conditions[] = "{$field_name} < '{$end_date}'";
233
-            }
234
-            if ($where_conditions) {
235
-                $query_to_run .= ' WHERE ' . implode(' AND ', $where_conditions);
236
-            }
237
-            $result = $wpdb->query($query_to_run);
238
-            if ($result === false) {
239
-                // record error.
240
-                $error_message = $wpdb->last_error;
241
-                // handle the edgecases where last_error might be empty.
242
-                if (! $error_message) {
243
-                    $error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
244
-                }
245
-                $errors[ $field_name ] = $error_message;
246
-            }
247
-        }
248
-        return $errors;
249
-    }
250
-
251
-
252
-    /**
253
-     * Performs the query for all fields within the inner_query
254
-     *
255
-     * @param string $query
256
-     * @param array  $inner_query
257
-     * @return false|int
258
-     */
259
-    private function doQueryForAllFields($query, array $inner_query)
260
-    {
261
-        global $wpdb;
262
-        $query .= ' SET ' . implode(',', $inner_query);
263
-        return $wpdb->query($query);
264
-    }
265
-
266
-
267
-    /**
268
-     * Records a changelog entry using the given information.
269
-     *
270
-     * @param EEM_Base              $model
271
-     * @param float                 $offset
272
-     * @param EE_Table_Base         $table
273
-     * @param EE_Model_Field_Base[] $model_fields_affected
274
-     * @param string                $error_message If present then there was an error so let's record that instead.
275
-     * @throws EE_Error
276
-     */
277
-    private function recordChangeLog(
278
-        EEM_Base $model,
279
-        $offset,
280
-        EE_Table_Base $table,
281
-        $model_fields_affected,
282
-        $error_message = ''
283
-    ) {
284
-        // setup $fields list.
285
-        $fields = array();
286
-        /** @var EE_Datetime_Field $model_field */
287
-        foreach ($model_fields_affected as $model_field) {
288
-            if (! $model_field instanceof EE_Datetime_Field) {
289
-                continue;
290
-            }
291
-            $fields[] = $model_field->get_name();
292
-        }
293
-        // setup the message for the changelog entry.
294
-        $message = $error_message
295
-            ? sprintf(
296
-                esc_html__(
297
-                    'The %1$s table for the %2$s model did not have the offset of %3$f applied to its fields (%4$s), because of the following error:%5$s',
298
-                    'event_espresso'
299
-                ),
300
-                $table->get_table_name(),
301
-                $model->get_this_model_name(),
302
-                $offset,
303
-                implode(',', $fields),
304
-                $error_message
305
-            )
306
-            : sprintf(
307
-                esc_html__(
308
-                    'The %1$s table for the %2$s model has had the offset of %3$f applied to its following fields: %4$s',
309
-                    'event_espresso'
310
-                ),
311
-                $table->get_table_name(),
312
-                $model->get_this_model_name(),
313
-                $offset,
314
-                implode(',', $fields)
315
-            );
316
-        // write to the log
317
-        $changelog = EE_Change_Log::new_instance(array(
318
-            'LOG_type'    => $error_message
319
-                ? self::DATETIME_OFFSET_FIX_CHANGELOG_ERROR_TYPE
320
-                : self::DATETIME_OFFSET_FIX_CHANGELOG_TYPE,
321
-            'LOG_message' => $message,
322
-        ));
323
-        $changelog->save();
324
-    }
325
-
326
-
327
-    /**
328
-     * Returns an array of models that have datetime fields.
329
-     * This array is added to a short lived transient cache to keep having to build this list to a minimum.
330
-     *
331
-     * @return array an array of model class names.
332
-     * @throws EE_Error
333
-     * @throws InvalidDataTypeException
334
-     * @throws InvalidInterfaceException
335
-     * @throws InvalidArgumentException
336
-     */
337
-    private function getModelsWithDatetimeFields()
338
-    {
339
-        $this->getModelsToProcess();
340
-        if (! empty($this->models_with_datetime_fields)) {
341
-            return $this->models_with_datetime_fields;
342
-        }
343
-
344
-        $all_non_abstract_models = EE_Registry::instance()->non_abstract_db_models;
345
-        foreach ($all_non_abstract_models as $non_abstract_model) {
346
-            // get model instance
347
-            /** @var EEM_Base $non_abstract_model */
348
-            $non_abstract_model = $non_abstract_model::instance();
349
-            if ($non_abstract_model->get_a_field_of_type('EE_Datetime_Field') instanceof EE_Datetime_Field) {
350
-                $this->models_with_datetime_fields[] = get_class($non_abstract_model);
351
-            }
352
-        }
353
-        $this->setModelsToProcess($this->models_with_datetime_fields);
354
-        return $this->models_with_datetime_fields;
355
-    }
356
-
357
-
358
-    /**
359
-     * This simply records the models that have been processed with our tracking option.
360
-     *
361
-     * @param array $models_to_set array of model class names.
362
-     */
363
-    private function setModelsToProcess($models_to_set)
364
-    {
365
-        update_option(self::MODELS_TO_PROCESS_OPTION_KEY, $models_to_set);
366
-    }
367
-
368
-
369
-    /**
370
-     * Used to keep track of how many models have been processed for the batch
371
-     *
372
-     * @param $count
373
-     */
374
-    private function updateCountOfModelsProcessed($count = 1)
375
-    {
376
-        $count = $this->getCountOfModelsProcessed() + (int) $count;
377
-        update_option(self::COUNT_OF_MODELS_PROCESSED, $count);
378
-    }
379
-
380
-
381
-    /**
382
-     * Retrieve the tracked number of models processed between requests.
383
-     *
384
-     * @return int
385
-     */
386
-    private function getCountOfModelsProcessed()
387
-    {
388
-        return (int) get_option(self::COUNT_OF_MODELS_PROCESSED, 0);
389
-    }
390
-
391
-
392
-    /**
393
-     * Returns the models that are left to process.
394
-     *
395
-     * @return array  an array of model class names.
396
-     */
397
-    private function getModelsToProcess()
398
-    {
399
-        if (empty($this->models_with_datetime_fields)) {
400
-            $this->models_with_datetime_fields = get_option(self::MODELS_TO_PROCESS_OPTION_KEY, array());
401
-        }
402
-        return $this->models_with_datetime_fields;
403
-    }
404
-
405
-
406
-    /**
407
-     * Used to record the offset that will be applied to dates and times for EE_Datetime_Field columns.
408
-     *
409
-     * @param float $offset
410
-     */
411
-    public static function updateOffset($offset)
412
-    {
413
-        update_option(self::OFFSET_TO_APPLY_OPTION_KEY, $offset);
414
-    }
415
-
416
-
417
-    /**
418
-     * Used to retrieve the saved offset that will be applied to dates and times for EE_Datetime_Field columns.
419
-     *
420
-     * @return float
421
-     */
422
-    public static function getOffset()
423
-    {
424
-        return (float) get_option(self::OFFSET_TO_APPLY_OPTION_KEY, 0);
425
-    }
426
-
427
-
428
-    /**
429
-     * Used to set the saved offset range start date.
430
-     *
431
-     * @param DbSafeDateTime|null $start_date
432
-     */
433
-    public static function updateStartDateRange(DbSafeDateTime $start_date = null)
434
-    {
435
-        $date_to_save = $start_date instanceof DbSafeDateTime
436
-            ? $start_date->format('U')
437
-            : '';
438
-        update_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE, $date_to_save);
439
-    }
440
-
441
-
442
-    /**
443
-     * Used to get the saved offset range start date.
444
-     *
445
-     * @return DbSafeDateTime|null
446
-     */
447
-    public static function getStartDateRange()
448
-    {
449
-        $start_date = get_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE, null);
450
-        try {
451
-            $datetime = DateTime::createFromFormat('U', $start_date, new DateTimeZone('UTC'));
452
-            $start_date = $datetime instanceof DateTime
453
-                ? DbSafeDateTime::createFromDateTime($datetime)
454
-                : null;
455
-        } catch (Exception $e) {
456
-            $start_date = null;
457
-        }
458
-        return $start_date;
459
-    }
460
-
461
-
462
-    /**
463
-     * Used to set the saved offset range end date.
464
-     *
465
-     * @param DbSafeDateTime|null $end_date
466
-     */
467
-    public static function updateEndDateRange(DbSafeDateTime $end_date = null)
468
-    {
469
-        $date_to_save = $end_date instanceof DbSafeDateTime
470
-            ? $end_date->format('U')
471
-            : '';
472
-        update_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE, $date_to_save);
473
-    }
474
-
475
-
476
-    /**
477
-     * Used to get the saved offset range end date.
478
-     *
479
-     * @return DbSafeDateTime|null
480
-     */
481
-    public static function getEndDateRange()
482
-    {
483
-        $end_date = get_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE, null);
484
-        try {
485
-            $datetime = DateTime::createFromFormat('U', $end_date, new DateTimeZone('UTC'));
486
-            $end_date = $datetime instanceof Datetime
487
-                ? DbSafeDateTime::createFromDateTime($datetime)
488
-                : null;
489
-        } catch (Exception $e) {
490
-            $end_date = null;
491
-        }
492
-        return $end_date;
493
-    }
27
+	/**
28
+	 * Key for the option used to track which models have been processed when doing the batches.
29
+	 */
30
+	const MODELS_TO_PROCESS_OPTION_KEY = 'ee_models_processed_for_datetime_offset_fix';
31
+
32
+
33
+	const COUNT_OF_MODELS_PROCESSED = 'ee_count_of_ee_models_processed_for_datetime_offset_fixed';
34
+
35
+	/**
36
+	 * Key for the option used to track what the current offset is that will be applied when this tool is executed.
37
+	 */
38
+	const OFFSET_TO_APPLY_OPTION_KEY = 'ee_datetime_offset_fix_offset_to_apply';
39
+
40
+
41
+	const OPTION_KEY_OFFSET_RANGE_START_DATE = 'ee_datetime_offset_start_date_range';
42
+
43
+
44
+	const OPTION_KEY_OFFSET_RANGE_END_DATE = 'ee_datetime_offset_end_date_range';
45
+
46
+
47
+	/**
48
+	 * String labelling the datetime offset fix type for change-log entries.
49
+	 */
50
+	const DATETIME_OFFSET_FIX_CHANGELOG_TYPE = 'datetime_offset_fix';
51
+
52
+
53
+	/**
54
+	 * String labelling a datetime offset fix error for change-log entries.
55
+	 */
56
+	const DATETIME_OFFSET_FIX_CHANGELOG_ERROR_TYPE = 'datetime_offset_fix_error';
57
+
58
+	/**
59
+	 * @var EEM_Base[]
60
+	 */
61
+	protected $models_with_datetime_fields = array();
62
+
63
+	// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
64
+
65
+	/**
66
+	 * Performs any necessary setup for starting the job. This is also a good
67
+	 * place to setup the $job_arguments which will be used for subsequent HTTP requests
68
+	 * when continue_job will be called
69
+	 *
70
+	 * @param JobParameters $job_parameters
71
+	 * @return JobStepResponse
72
+	 * @throws EE_Error
73
+	 * @throws InvalidArgumentException
74
+	 * @throws InvalidDataTypeException
75
+	 * @throws InvalidInterfaceException
76
+	 */
77
+	public function create_job(JobParameters $job_parameters)
78
+	{
79
+		$models_with_datetime_fields = $this->getModelsWithDatetimeFields();
80
+		// we'll be doing each model as a batch.
81
+		$job_parameters->set_job_size(count($models_with_datetime_fields));
82
+		return new JobStepResponse(
83
+			$job_parameters,
84
+			esc_html__('Starting Datetime Offset Fix', 'event_espresso')
85
+		);
86
+	}
87
+
88
+	/**
89
+	 * Performs another step of the job
90
+	 *
91
+	 * @param JobParameters $job_parameters
92
+	 * @param int           $batch_size
93
+	 * @return JobStepResponse
94
+	 * @throws EE_Error
95
+	 * @throws InvalidArgumentException
96
+	 * @throws InvalidDataTypeException
97
+	 * @throws InvalidInterfaceException
98
+	 */
99
+	public function continue_job(JobParameters $job_parameters, $batch_size = 50)
100
+	{
101
+		$models_to_process = $this->getModelsWithDatetimeFields();
102
+		// let's pop off the a model and do the query to apply the offset.
103
+		$model_to_process = array_pop($models_to_process);
104
+		// update our record
105
+		$this->setModelsToProcess($models_to_process);
106
+		$this->processModel($model_to_process);
107
+		$this->updateCountOfModelsProcessed();
108
+		$job_parameters->set_units_processed($this->getCountOfModelsProcessed());
109
+		if (count($models_to_process) > 0) {
110
+			$job_parameters->set_status(JobParameters::status_continue);
111
+		} else {
112
+			$job_parameters->set_status(JobParameters::status_complete);
113
+		}
114
+		return new JobStepResponse(
115
+			$job_parameters,
116
+			sprintf(
117
+				esc_html__('Updated the offset for all datetime fields on the %s model.', 'event_espresso'),
118
+				$model_to_process
119
+			)
120
+		);
121
+	}
122
+
123
+	/**
124
+	 * Performs any clean-up logic when we know the job is completed
125
+	 *
126
+	 * @param JobParameters $job_parameters
127
+	 * @return JobStepResponse
128
+	 * @throws BatchRequestException
129
+	 */
130
+	public function cleanup_job(JobParameters $job_parameters)
131
+	{
132
+		// delete important saved options.
133
+		delete_option(self::MODELS_TO_PROCESS_OPTION_KEY);
134
+		delete_option(self::COUNT_OF_MODELS_PROCESSED);
135
+		delete_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE);
136
+		delete_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE);
137
+		return new JobStepResponse($job_parameters, esc_html__(
138
+			'Offset has been applied to all affected fields.',
139
+			'event_espresso'
140
+		));
141
+	}
142
+
143
+
144
+	/**
145
+	 * Contains the logic for processing a model and applying the datetime offset to affected fields on that model.
146
+	 *
147
+	 * @param string $model_class_name
148
+	 * @throws EE_Error
149
+	 */
150
+	protected function processModel($model_class_name)
151
+	{
152
+		global $wpdb;
153
+		/** @var EEM_Base $model */
154
+		$model = $model_class_name::instance();
155
+		$original_offset = self::getOffset();
156
+		$start_date_range = self::getStartDateRange();
157
+		$end_date_range = self::getEndDateRange();
158
+		$sql_date_function = $original_offset > 0 ? 'DATE_ADD' : 'DATE_SUB';
159
+		$offset = abs($original_offset) * 60;
160
+		$date_ranges = array();
161
+		// since some affected models might have two tables, we have to get our tables and set up a query for each table.
162
+		foreach ($model->get_tables() as $table) {
163
+			$query = 'UPDATE ' . $table->get_table_name();
164
+			$fields_affected = array();
165
+			$inner_query = array();
166
+			foreach ($model->_get_fields_for_table($table->get_table_alias()) as $model_field) {
167
+				if ($model_field instanceof EE_Datetime_Field) {
168
+					$inner_query[ $model_field->get_table_column() ] = $model_field->get_table_column() . ' = '
169
+																	   . $sql_date_function . '('
170
+																	   . $model_field->get_table_column()
171
+																	   . ", INTERVAL {$offset} MINUTE)";
172
+					$fields_affected[] = $model_field;
173
+				}
174
+			}
175
+			if (! $fields_affected) {
176
+				continue;
177
+			}
178
+			// do we do one query per column/field or one query for all fields on the model? It all depends on whether
179
+			// there is a date range applied or not.
180
+			if ($start_date_range instanceof DbSafeDateTime || $end_date_range instanceof DbSafeDateTime) {
181
+				$result = $this->doQueryForEachField($query, $inner_query, $start_date_range, $end_date_range);
182
+			} else {
183
+				$result = $this->doQueryForAllFields($query, $inner_query);
184
+			}
185
+
186
+			// record appropriate logs for the query
187
+			switch (true) {
188
+				case $result === false:
189
+					// record error.
190
+					$error_message = $wpdb->last_error;
191
+					// handle the edgecases where last_error might be empty.
192
+					if (! $error_message) {
193
+						$error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
194
+					}
195
+					$this->recordChangeLog($model, $original_offset, $table, $fields_affected, $error_message);
196
+					break;
197
+				case is_array($result) && ! empty($result):
198
+					foreach ($result as $field_name => $error_message) {
199
+						$this->recordChangeLog($model, $original_offset, $table, array($field_name), $error_message);
200
+					}
201
+					break;
202
+				default:
203
+					$this->recordChangeLog($model, $original_offset, $table, $fields_affected);
204
+			}
205
+		}
206
+	}
207
+
208
+
209
+	/**
210
+	 * Does the query on each $inner_query individually.
211
+	 *
212
+	 * @param string              $query
213
+	 * @param array               $inner_query
214
+	 * @param DbSafeDateTime|null $start_date_range
215
+	 * @param DbSafeDateTime|null $end_date_range
216
+	 * @return array  An array of any errors encountered and the fields they were for.
217
+	 */
218
+	private function doQueryForEachField($query, array $inner_query, $start_date_range, $end_date_range)
219
+	{
220
+		global $wpdb;
221
+		$errors = array();
222
+		foreach ($inner_query as $field_name => $field_query) {
223
+			$query_to_run = $query;
224
+			$where_conditions = array();
225
+			$query_to_run .= ' SET ' . $field_query;
226
+			if ($start_date_range instanceof DbSafeDateTime) {
227
+				$start_date = $start_date_range->format(EE_Datetime_Field::mysql_timestamp_format);
228
+				$where_conditions[] = "{$field_name} > '{$start_date}'";
229
+			}
230
+			if ($end_date_range instanceof DbSafeDateTime) {
231
+				$end_date = $end_date_range->format(EE_Datetime_Field::mysql_timestamp_format);
232
+				$where_conditions[] = "{$field_name} < '{$end_date}'";
233
+			}
234
+			if ($where_conditions) {
235
+				$query_to_run .= ' WHERE ' . implode(' AND ', $where_conditions);
236
+			}
237
+			$result = $wpdb->query($query_to_run);
238
+			if ($result === false) {
239
+				// record error.
240
+				$error_message = $wpdb->last_error;
241
+				// handle the edgecases where last_error might be empty.
242
+				if (! $error_message) {
243
+					$error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
244
+				}
245
+				$errors[ $field_name ] = $error_message;
246
+			}
247
+		}
248
+		return $errors;
249
+	}
250
+
251
+
252
+	/**
253
+	 * Performs the query for all fields within the inner_query
254
+	 *
255
+	 * @param string $query
256
+	 * @param array  $inner_query
257
+	 * @return false|int
258
+	 */
259
+	private function doQueryForAllFields($query, array $inner_query)
260
+	{
261
+		global $wpdb;
262
+		$query .= ' SET ' . implode(',', $inner_query);
263
+		return $wpdb->query($query);
264
+	}
265
+
266
+
267
+	/**
268
+	 * Records a changelog entry using the given information.
269
+	 *
270
+	 * @param EEM_Base              $model
271
+	 * @param float                 $offset
272
+	 * @param EE_Table_Base         $table
273
+	 * @param EE_Model_Field_Base[] $model_fields_affected
274
+	 * @param string                $error_message If present then there was an error so let's record that instead.
275
+	 * @throws EE_Error
276
+	 */
277
+	private function recordChangeLog(
278
+		EEM_Base $model,
279
+		$offset,
280
+		EE_Table_Base $table,
281
+		$model_fields_affected,
282
+		$error_message = ''
283
+	) {
284
+		// setup $fields list.
285
+		$fields = array();
286
+		/** @var EE_Datetime_Field $model_field */
287
+		foreach ($model_fields_affected as $model_field) {
288
+			if (! $model_field instanceof EE_Datetime_Field) {
289
+				continue;
290
+			}
291
+			$fields[] = $model_field->get_name();
292
+		}
293
+		// setup the message for the changelog entry.
294
+		$message = $error_message
295
+			? sprintf(
296
+				esc_html__(
297
+					'The %1$s table for the %2$s model did not have the offset of %3$f applied to its fields (%4$s), because of the following error:%5$s',
298
+					'event_espresso'
299
+				),
300
+				$table->get_table_name(),
301
+				$model->get_this_model_name(),
302
+				$offset,
303
+				implode(',', $fields),
304
+				$error_message
305
+			)
306
+			: sprintf(
307
+				esc_html__(
308
+					'The %1$s table for the %2$s model has had the offset of %3$f applied to its following fields: %4$s',
309
+					'event_espresso'
310
+				),
311
+				$table->get_table_name(),
312
+				$model->get_this_model_name(),
313
+				$offset,
314
+				implode(',', $fields)
315
+			);
316
+		// write to the log
317
+		$changelog = EE_Change_Log::new_instance(array(
318
+			'LOG_type'    => $error_message
319
+				? self::DATETIME_OFFSET_FIX_CHANGELOG_ERROR_TYPE
320
+				: self::DATETIME_OFFSET_FIX_CHANGELOG_TYPE,
321
+			'LOG_message' => $message,
322
+		));
323
+		$changelog->save();
324
+	}
325
+
326
+
327
+	/**
328
+	 * Returns an array of models that have datetime fields.
329
+	 * This array is added to a short lived transient cache to keep having to build this list to a minimum.
330
+	 *
331
+	 * @return array an array of model class names.
332
+	 * @throws EE_Error
333
+	 * @throws InvalidDataTypeException
334
+	 * @throws InvalidInterfaceException
335
+	 * @throws InvalidArgumentException
336
+	 */
337
+	private function getModelsWithDatetimeFields()
338
+	{
339
+		$this->getModelsToProcess();
340
+		if (! empty($this->models_with_datetime_fields)) {
341
+			return $this->models_with_datetime_fields;
342
+		}
343
+
344
+		$all_non_abstract_models = EE_Registry::instance()->non_abstract_db_models;
345
+		foreach ($all_non_abstract_models as $non_abstract_model) {
346
+			// get model instance
347
+			/** @var EEM_Base $non_abstract_model */
348
+			$non_abstract_model = $non_abstract_model::instance();
349
+			if ($non_abstract_model->get_a_field_of_type('EE_Datetime_Field') instanceof EE_Datetime_Field) {
350
+				$this->models_with_datetime_fields[] = get_class($non_abstract_model);
351
+			}
352
+		}
353
+		$this->setModelsToProcess($this->models_with_datetime_fields);
354
+		return $this->models_with_datetime_fields;
355
+	}
356
+
357
+
358
+	/**
359
+	 * This simply records the models that have been processed with our tracking option.
360
+	 *
361
+	 * @param array $models_to_set array of model class names.
362
+	 */
363
+	private function setModelsToProcess($models_to_set)
364
+	{
365
+		update_option(self::MODELS_TO_PROCESS_OPTION_KEY, $models_to_set);
366
+	}
367
+
368
+
369
+	/**
370
+	 * Used to keep track of how many models have been processed for the batch
371
+	 *
372
+	 * @param $count
373
+	 */
374
+	private function updateCountOfModelsProcessed($count = 1)
375
+	{
376
+		$count = $this->getCountOfModelsProcessed() + (int) $count;
377
+		update_option(self::COUNT_OF_MODELS_PROCESSED, $count);
378
+	}
379
+
380
+
381
+	/**
382
+	 * Retrieve the tracked number of models processed between requests.
383
+	 *
384
+	 * @return int
385
+	 */
386
+	private function getCountOfModelsProcessed()
387
+	{
388
+		return (int) get_option(self::COUNT_OF_MODELS_PROCESSED, 0);
389
+	}
390
+
391
+
392
+	/**
393
+	 * Returns the models that are left to process.
394
+	 *
395
+	 * @return array  an array of model class names.
396
+	 */
397
+	private function getModelsToProcess()
398
+	{
399
+		if (empty($this->models_with_datetime_fields)) {
400
+			$this->models_with_datetime_fields = get_option(self::MODELS_TO_PROCESS_OPTION_KEY, array());
401
+		}
402
+		return $this->models_with_datetime_fields;
403
+	}
404
+
405
+
406
+	/**
407
+	 * Used to record the offset that will be applied to dates and times for EE_Datetime_Field columns.
408
+	 *
409
+	 * @param float $offset
410
+	 */
411
+	public static function updateOffset($offset)
412
+	{
413
+		update_option(self::OFFSET_TO_APPLY_OPTION_KEY, $offset);
414
+	}
415
+
416
+
417
+	/**
418
+	 * Used to retrieve the saved offset that will be applied to dates and times for EE_Datetime_Field columns.
419
+	 *
420
+	 * @return float
421
+	 */
422
+	public static function getOffset()
423
+	{
424
+		return (float) get_option(self::OFFSET_TO_APPLY_OPTION_KEY, 0);
425
+	}
426
+
427
+
428
+	/**
429
+	 * Used to set the saved offset range start date.
430
+	 *
431
+	 * @param DbSafeDateTime|null $start_date
432
+	 */
433
+	public static function updateStartDateRange(DbSafeDateTime $start_date = null)
434
+	{
435
+		$date_to_save = $start_date instanceof DbSafeDateTime
436
+			? $start_date->format('U')
437
+			: '';
438
+		update_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE, $date_to_save);
439
+	}
440
+
441
+
442
+	/**
443
+	 * Used to get the saved offset range start date.
444
+	 *
445
+	 * @return DbSafeDateTime|null
446
+	 */
447
+	public static function getStartDateRange()
448
+	{
449
+		$start_date = get_option(self::OPTION_KEY_OFFSET_RANGE_START_DATE, null);
450
+		try {
451
+			$datetime = DateTime::createFromFormat('U', $start_date, new DateTimeZone('UTC'));
452
+			$start_date = $datetime instanceof DateTime
453
+				? DbSafeDateTime::createFromDateTime($datetime)
454
+				: null;
455
+		} catch (Exception $e) {
456
+			$start_date = null;
457
+		}
458
+		return $start_date;
459
+	}
460
+
461
+
462
+	/**
463
+	 * Used to set the saved offset range end date.
464
+	 *
465
+	 * @param DbSafeDateTime|null $end_date
466
+	 */
467
+	public static function updateEndDateRange(DbSafeDateTime $end_date = null)
468
+	{
469
+		$date_to_save = $end_date instanceof DbSafeDateTime
470
+			? $end_date->format('U')
471
+			: '';
472
+		update_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE, $date_to_save);
473
+	}
474
+
475
+
476
+	/**
477
+	 * Used to get the saved offset range end date.
478
+	 *
479
+	 * @return DbSafeDateTime|null
480
+	 */
481
+	public static function getEndDateRange()
482
+	{
483
+		$end_date = get_option(self::OPTION_KEY_OFFSET_RANGE_END_DATE, null);
484
+		try {
485
+			$datetime = DateTime::createFromFormat('U', $end_date, new DateTimeZone('UTC'));
486
+			$end_date = $datetime instanceof Datetime
487
+				? DbSafeDateTime::createFromDateTime($datetime)
488
+				: null;
489
+		} catch (Exception $e) {
490
+			$end_date = null;
491
+		}
492
+		return $end_date;
493
+	}
494 494
 }
Please login to merge, or discard this patch.
Spacing   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -160,19 +160,19 @@  discard block
 block discarded – undo
160 160
         $date_ranges = array();
161 161
         // since some affected models might have two tables, we have to get our tables and set up a query for each table.
162 162
         foreach ($model->get_tables() as $table) {
163
-            $query = 'UPDATE ' . $table->get_table_name();
163
+            $query = 'UPDATE '.$table->get_table_name();
164 164
             $fields_affected = array();
165 165
             $inner_query = array();
166 166
             foreach ($model->_get_fields_for_table($table->get_table_alias()) as $model_field) {
167 167
                 if ($model_field instanceof EE_Datetime_Field) {
168
-                    $inner_query[ $model_field->get_table_column() ] = $model_field->get_table_column() . ' = '
169
-                                                                       . $sql_date_function . '('
168
+                    $inner_query[$model_field->get_table_column()] = $model_field->get_table_column().' = '
169
+                                                                       . $sql_date_function.'('
170 170
                                                                        . $model_field->get_table_column()
171 171
                                                                        . ", INTERVAL {$offset} MINUTE)";
172 172
                     $fields_affected[] = $model_field;
173 173
                 }
174 174
             }
175
-            if (! $fields_affected) {
175
+            if ( ! $fields_affected) {
176 176
                 continue;
177 177
             }
178 178
             // do we do one query per column/field or one query for all fields on the model? It all depends on whether
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
                     // record error.
190 190
                     $error_message = $wpdb->last_error;
191 191
                     // handle the edgecases where last_error might be empty.
192
-                    if (! $error_message) {
192
+                    if ( ! $error_message) {
193 193
                         $error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
194 194
                     }
195 195
                     $this->recordChangeLog($model, $original_offset, $table, $fields_affected, $error_message);
@@ -222,7 +222,7 @@  discard block
 block discarded – undo
222 222
         foreach ($inner_query as $field_name => $field_query) {
223 223
             $query_to_run = $query;
224 224
             $where_conditions = array();
225
-            $query_to_run .= ' SET ' . $field_query;
225
+            $query_to_run .= ' SET '.$field_query;
226 226
             if ($start_date_range instanceof DbSafeDateTime) {
227 227
                 $start_date = $start_date_range->format(EE_Datetime_Field::mysql_timestamp_format);
228 228
                 $where_conditions[] = "{$field_name} > '{$start_date}'";
@@ -232,17 +232,17 @@  discard block
 block discarded – undo
232 232
                 $where_conditions[] = "{$field_name} < '{$end_date}'";
233 233
             }
234 234
             if ($where_conditions) {
235
-                $query_to_run .= ' WHERE ' . implode(' AND ', $where_conditions);
235
+                $query_to_run .= ' WHERE '.implode(' AND ', $where_conditions);
236 236
             }
237 237
             $result = $wpdb->query($query_to_run);
238 238
             if ($result === false) {
239 239
                 // record error.
240 240
                 $error_message = $wpdb->last_error;
241 241
                 // handle the edgecases where last_error might be empty.
242
-                if (! $error_message) {
242
+                if ( ! $error_message) {
243 243
                     $error_message = esc_html__('Unknown mysql error occured.', 'event_espresso');
244 244
                 }
245
-                $errors[ $field_name ] = $error_message;
245
+                $errors[$field_name] = $error_message;
246 246
             }
247 247
         }
248 248
         return $errors;
@@ -259,7 +259,7 @@  discard block
 block discarded – undo
259 259
     private function doQueryForAllFields($query, array $inner_query)
260 260
     {
261 261
         global $wpdb;
262
-        $query .= ' SET ' . implode(',', $inner_query);
262
+        $query .= ' SET '.implode(',', $inner_query);
263 263
         return $wpdb->query($query);
264 264
     }
265 265
 
@@ -285,7 +285,7 @@  discard block
 block discarded – undo
285 285
         $fields = array();
286 286
         /** @var EE_Datetime_Field $model_field */
287 287
         foreach ($model_fields_affected as $model_field) {
288
-            if (! $model_field instanceof EE_Datetime_Field) {
288
+            if ( ! $model_field instanceof EE_Datetime_Field) {
289 289
                 continue;
290 290
             }
291 291
             $fields[] = $model_field->get_name();
@@ -337,7 +337,7 @@  discard block
 block discarded – undo
337 337
     private function getModelsWithDatetimeFields()
338 338
     {
339 339
         $this->getModelsToProcess();
340
-        if (! empty($this->models_with_datetime_fields)) {
340
+        if ( ! empty($this->models_with_datetime_fields)) {
341 341
             return $this->models_with_datetime_fields;
342 342
         }
343 343
 
Please login to merge, or discard this patch.
core/libraries/batch/Helpers/JobStepResponse.php 1 patch
Indentation   +84 added lines, -84 removed lines patch added patch discarded remove patch
@@ -13,99 +13,99 @@
 block discarded – undo
13 13
  */
14 14
 class JobStepResponse
15 15
 {
16
-    // phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore
17
-    /**
18
-     * Description fo what happened during this step
19
-     *
20
-     * @var string
21
-     */
22
-    protected $_update_text;
16
+	// phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore
17
+	/**
18
+	 * Description fo what happened during this step
19
+	 *
20
+	 * @var string
21
+	 */
22
+	protected $_update_text;
23 23
 
24
-    /**
25
-     * @var JobParameters
26
-     */
27
-    protected $_job_parameters;
24
+	/**
25
+	 * @var JobParameters
26
+	 */
27
+	protected $_job_parameters;
28 28
 
29
-    /**
30
-     * Extra data to include as part of the response.
31
-     *
32
-     * @var array
33
-     */
34
-    protected $_extra_data = array();
35
-    // phpcs:enable
29
+	/**
30
+	 * Extra data to include as part of the response.
31
+	 *
32
+	 * @var array
33
+	 */
34
+	protected $_extra_data = array();
35
+	// phpcs:enable
36 36
 
37
-    // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
38
-    /**
39
-     * @param \EventEspressoBatchRequest\Helpers\JobParameters $job_parameters
40
-     * @param string                                           $update_text
41
-     * @param array                                            $extra_data
42
-     */
43
-    public function __construct(JobParameters $job_parameters, $update_text, $extra_data = array())
44
-    {
45
-        $this->_job_parameters = $job_parameters;
46
-        $this->_update_text = $update_text;
47
-        $this->_extra_data = (array) $extra_data;
48
-    }
37
+	// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
38
+	/**
39
+	 * @param \EventEspressoBatchRequest\Helpers\JobParameters $job_parameters
40
+	 * @param string                                           $update_text
41
+	 * @param array                                            $extra_data
42
+	 */
43
+	public function __construct(JobParameters $job_parameters, $update_text, $extra_data = array())
44
+	{
45
+		$this->_job_parameters = $job_parameters;
46
+		$this->_update_text = $update_text;
47
+		$this->_extra_data = (array) $extra_data;
48
+	}
49 49
 
50 50
 
51
-    /**
52
-     * @return JobParameters
53
-     */
54
-    public function job_parameters()
55
-    {
56
-        return $this->_job_parameters;
57
-    }
51
+	/**
52
+	 * @return JobParameters
53
+	 */
54
+	public function job_parameters()
55
+	{
56
+		return $this->_job_parameters;
57
+	}
58 58
 
59 59
 
60
-    /**
61
-     * Gets the update_text of what happened in this job during the current step
62
-     *
63
-     * @return string
64
-     */
65
-    public function update_text()
66
-    {
67
-        return $this->_update_text;
68
-    }
60
+	/**
61
+	 * Gets the update_text of what happened in this job during the current step
62
+	 *
63
+	 * @return string
64
+	 */
65
+	public function update_text()
66
+	{
67
+		return $this->_update_text;
68
+	}
69 69
 
70 70
 
71
-    /**
72
-     * Returns any extra data we may want to include with this response
73
-     *
74
-     * @return array
75
-     */
76
-    public function extra_data()
77
-    {
78
-        return $this->_extra_data;
79
-    }
71
+	/**
72
+	 * Returns any extra data we may want to include with this response
73
+	 *
74
+	 * @return array
75
+	 */
76
+	public function extra_data()
77
+	{
78
+		return $this->_extra_data;
79
+	}
80 80
 
81 81
 
82
-    /**
83
-     * Converts this response into an array that can be easily serialized.
84
-     * This is most useful for serializing or json encoding
85
-     *
86
-     * @return array {
87
-     * @type string $status          , one of JobParameters::valid_stati()
88
-     * @type int    $units_processed count of units processed
89
-     * @type int    $job_size        total number of units TO process
90
-     * @type string $job_id          unique string identifying the job
91
-     * @type string $update_text     string describing what happened during this step
92
-     * } and any other items from $this->extra_data()
93
-     */
94
-    public function to_array()
95
-    {
96
-        return apply_filters(
97
-            'FHEE__EventEspressoBatchRequest\Helpers\JobStepResponse__to_array__return',
98
-            array_merge(
99
-                $this->extra_data(),
100
-                array(
101
-                    'status'          => $this->job_parameters()->status(),
102
-                    'units_processed' => $this->job_parameters()->units_processed(),
103
-                    'job_size'        => $this->job_parameters()->job_size(),
104
-                    'job_id'          => $this->job_parameters()->job_id(),
105
-                    'update_text'     => $this->update_text(),
106
-                )
107
-            ),
108
-            $this
109
-        );
110
-    }
82
+	/**
83
+	 * Converts this response into an array that can be easily serialized.
84
+	 * This is most useful for serializing or json encoding
85
+	 *
86
+	 * @return array {
87
+	 * @type string $status          , one of JobParameters::valid_stati()
88
+	 * @type int    $units_processed count of units processed
89
+	 * @type int    $job_size        total number of units TO process
90
+	 * @type string $job_id          unique string identifying the job
91
+	 * @type string $update_text     string describing what happened during this step
92
+	 * } and any other items from $this->extra_data()
93
+	 */
94
+	public function to_array()
95
+	{
96
+		return apply_filters(
97
+			'FHEE__EventEspressoBatchRequest\Helpers\JobStepResponse__to_array__return',
98
+			array_merge(
99
+				$this->extra_data(),
100
+				array(
101
+					'status'          => $this->job_parameters()->status(),
102
+					'units_processed' => $this->job_parameters()->units_processed(),
103
+					'job_size'        => $this->job_parameters()->job_size(),
104
+					'job_id'          => $this->job_parameters()->job_id(),
105
+					'update_text'     => $this->update_text(),
106
+				)
107
+			),
108
+			$this
109
+		);
110
+	}
111 111
 }
Please login to merge, or discard this patch.
core/domain/entities/RegUrlLink.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -72,7 +72,7 @@  discard block
 block discarded – undo
72 72
         $base_code = '',
73 73
         $reg_url_link = ''
74 74
     ) {
75
-        if (! empty($reg_url_link) && is_string($reg_url_link)) {
75
+        if ( ! empty($reg_url_link) && is_string($reg_url_link)) {
76 76
             $this->reg_url_link = apply_filters(
77 77
                 'FHEE__\EventEspresso\core\domain\entities\RegUrlLink__construct__reg_url_link',
78 78
                 $reg_url_link,
@@ -94,7 +94,7 @@  discard block
 block discarded – undo
94 94
         }
95 95
         $this->reg_url_link = (string) apply_filters(
96 96
             'FHEE__\EventEspresso\core\domain\entities\RegUrlLink__construct__reg_url_link',
97
-            $reg_count . '-' . md5($base_code . microtime()),
97
+            $reg_count.'-'.md5($base_code.microtime()),
98 98
             $reg_count,
99 99
             $base_code,
100 100
             $reg_url_link
Please login to merge, or discard this patch.
Indentation   +83 added lines, -83 removed lines patch added patch discarded remove patch
@@ -17,97 +17,97 @@
 block discarded – undo
17 17
  */
18 18
 class RegUrlLink
19 19
 {
20
-    /*
20
+	/*
21 21
      * @var string $reg_url_link
22 22
      */
23
-    private $reg_url_link;
23
+	private $reg_url_link;
24 24
 
25 25
 
26
-    /**
27
-     * @param string $reg_url_link
28
-     * @return RegUrlLink
29
-     * @throws InvalidArgumentException
30
-     */
31
-    public static function fromRegUrlLinkString($reg_url_link)
32
-    {
33
-        if (empty($reg_url_link) || ! is_string($reg_url_link)) {
34
-            throw new InvalidArgumentException(
35
-                esc_html__(
36
-                    'You must supply a valid non-empty string to generate a reg_url_link.',
37
-                    'event_espresso'
38
-                )
39
-            );
40
-        }
41
-        return new RegUrlLink(1, '', $reg_url_link);
42
-    }
26
+	/**
27
+	 * @param string $reg_url_link
28
+	 * @return RegUrlLink
29
+	 * @throws InvalidArgumentException
30
+	 */
31
+	public static function fromRegUrlLinkString($reg_url_link)
32
+	{
33
+		if (empty($reg_url_link) || ! is_string($reg_url_link)) {
34
+			throw new InvalidArgumentException(
35
+				esc_html__(
36
+					'You must supply a valid non-empty string to generate a reg_url_link.',
37
+					'event_espresso'
38
+				)
39
+			);
40
+		}
41
+		return new RegUrlLink(1, '', $reg_url_link);
42
+	}
43 43
 
44 44
 
45
-    /**
46
-     * @param EE_Registration $registration
47
-     * @return RegUrlLink
48
-     * @throws EntityNotFoundException
49
-     * @throws EE_Error
50
-     * @throws InvalidArgumentException
51
-     */
52
-    public static function fromRegistration(EE_Registration $registration)
53
-    {
54
-        return new RegUrlLink(
55
-            $registration->count(),
56
-            $registration->ticket_line_item()
57
-        );
58
-    }
45
+	/**
46
+	 * @param EE_Registration $registration
47
+	 * @return RegUrlLink
48
+	 * @throws EntityNotFoundException
49
+	 * @throws EE_Error
50
+	 * @throws InvalidArgumentException
51
+	 */
52
+	public static function fromRegistration(EE_Registration $registration)
53
+	{
54
+		return new RegUrlLink(
55
+			$registration->count(),
56
+			$registration->ticket_line_item()
57
+		);
58
+	}
59 59
 
60 60
 
61
-    /**
62
-     * CreateRegUrlLinkCommand constructor.
63
-     *
64
-     * @param int    $reg_count
65
-     * @param mixed  $base_code
66
-     * @param string $reg_url_link
67
-     * @throws InvalidArgumentException
68
-     */
69
-    public function __construct(
70
-        $reg_count = 1,
71
-        $base_code = '',
72
-        $reg_url_link = ''
73
-    ) {
74
-        if (! empty($reg_url_link) && is_string($reg_url_link)) {
75
-            $this->reg_url_link = apply_filters(
76
-                'FHEE__\EventEspresso\core\domain\entities\RegUrlLink__construct__reg_url_link',
77
-                $reg_url_link,
78
-                $reg_count,
79
-                $base_code,
80
-                $reg_url_link
81
-            );
82
-            return;
83
-        }
84
-        $reg_count = max(1, absint($reg_count));
85
-        $base_code = $base_code instanceof \EE_Line_Item ? $base_code->code() : $base_code;
86
-        if (empty($base_code) || ! is_string($base_code)) {
87
-            throw new InvalidArgumentException(
88
-                esc_html__(
89
-                    'You must supply a valid EE_Line_Item or a non-empty string to generate a reg_url_link.',
90
-                    'event_espresso'
91
-                )
92
-            );
93
-        }
94
-        $this->reg_url_link = (string) apply_filters(
95
-            'FHEE__\EventEspresso\core\domain\entities\RegUrlLink__construct__reg_url_link',
96
-            $reg_count . '-' . md5($base_code . microtime()),
97
-            $reg_count,
98
-            $base_code,
99
-            $reg_url_link
100
-        );
101
-    }
61
+	/**
62
+	 * CreateRegUrlLinkCommand constructor.
63
+	 *
64
+	 * @param int    $reg_count
65
+	 * @param mixed  $base_code
66
+	 * @param string $reg_url_link
67
+	 * @throws InvalidArgumentException
68
+	 */
69
+	public function __construct(
70
+		$reg_count = 1,
71
+		$base_code = '',
72
+		$reg_url_link = ''
73
+	) {
74
+		if (! empty($reg_url_link) && is_string($reg_url_link)) {
75
+			$this->reg_url_link = apply_filters(
76
+				'FHEE__\EventEspresso\core\domain\entities\RegUrlLink__construct__reg_url_link',
77
+				$reg_url_link,
78
+				$reg_count,
79
+				$base_code,
80
+				$reg_url_link
81
+			);
82
+			return;
83
+		}
84
+		$reg_count = max(1, absint($reg_count));
85
+		$base_code = $base_code instanceof \EE_Line_Item ? $base_code->code() : $base_code;
86
+		if (empty($base_code) || ! is_string($base_code)) {
87
+			throw new InvalidArgumentException(
88
+				esc_html__(
89
+					'You must supply a valid EE_Line_Item or a non-empty string to generate a reg_url_link.',
90
+					'event_espresso'
91
+				)
92
+			);
93
+		}
94
+		$this->reg_url_link = (string) apply_filters(
95
+			'FHEE__\EventEspresso\core\domain\entities\RegUrlLink__construct__reg_url_link',
96
+			$reg_count . '-' . md5($base_code . microtime()),
97
+			$reg_count,
98
+			$base_code,
99
+			$reg_url_link
100
+		);
101
+	}
102 102
 
103 103
 
104
-    /**
105
-     * Return the object as a string
106
-     *
107
-     * @return string
108
-     */
109
-    public function __toString()
110
-    {
111
-        return $this->reg_url_link;
112
-    }
104
+	/**
105
+	 * Return the object as a string
106
+	 *
107
+	 * @return string
108
+	 */
109
+	public function __toString()
110
+	{
111
+		return $this->reg_url_link;
112
+	}
113 113
 }
Please login to merge, or discard this patch.
core/domain/entities/GenericAddress.php 1 patch
Indentation   +201 added lines, -201 removed lines patch added patch discarded remove patch
@@ -12,205 +12,205 @@
 block discarded – undo
12 12
  */
13 13
 class GenericAddress implements \EEI_Address
14 14
 {
15
-    // phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore
16
-    private $_address = '';
17
-
18
-    private $_address2 = '';
19
-
20
-    private $_city = '';
21
-
22
-    private $_state_ID = '';
23
-
24
-    private $_state_obj = '';
25
-
26
-    private $_zip = '';
27
-
28
-    private $_country_ID = '';
29
-
30
-    private $_country_obj = '';
31
-    // phpcs:enable
32
-
33
-    // phpcs:disable PSR2.Methods.MethodDeclaration.Underscore
34
-    /**
35
-     * @param string               $address
36
-     * @param string               $address2
37
-     * @param string               $city
38
-     * @param \EE_State | string   $state
39
-     * @param string               $zip
40
-     * @param \EE_Country | string $country
41
-     * @return GenericAddress
42
-     */
43
-    public function __construct($address, $address2, $city, $state, $zip, $country)
44
-    {
45
-        $this->_address = $address;
46
-        $this->_address2 = $address2;
47
-        $this->_city = $city;
48
-        if ($state instanceof \EE_State) {
49
-            $this->_state_obj = $state;
50
-        } else {
51
-            $this->_state_ID = $state;
52
-            $this->_state_obj = $this->_get_state_obj();
53
-        }
54
-        $this->_zip = $zip;
55
-        if ($country instanceof \EE_Country) {
56
-            $this->_country_obj = $country;
57
-        } else {
58
-            $this->_country_ID = $country;
59
-            $this->_country_obj = $this->_get_country_obj();
60
-        }
61
-    }
62
-
63
-
64
-    /**
65
-     * @return string
66
-     */
67
-    public function address()
68
-    {
69
-        return $this->_address;
70
-    }
71
-
72
-
73
-    /**
74
-     * @return string
75
-     */
76
-    public function address2()
77
-    {
78
-        return $this->_address2;
79
-    }
80
-
81
-
82
-    /**
83
-     * @return string
84
-     */
85
-    public function city()
86
-    {
87
-        return $this->_city;
88
-    }
89
-
90
-    // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
91
-
92
-    /**
93
-     * @return \EE_State
94
-     */
95
-    private function _get_state_obj()
96
-    {
97
-        return $this->_state_obj instanceof \EE_State
98
-            ? $this->_state_obj
99
-            : \EE_Registry::instance()->load_model('State')->get_one_by_ID($this->_state_ID);
100
-    }
101
-
102
-
103
-    /**
104
-     * @return string
105
-     */
106
-    public function state_ID()
107
-    {
108
-        return $this->_state_ID;
109
-    }
110
-
111
-
112
-    /**
113
-     * @return string
114
-     */
115
-    public function state_abbrev()
116
-    {
117
-        return $this->state_obj() instanceof \EE_State
118
-            ? $this->state_obj()->abbrev()
119
-            : '';
120
-    }
121
-
122
-
123
-    /**
124
-     * @return string
125
-     */
126
-    public function state_name()
127
-    {
128
-        return $this->state_obj() instanceof \EE_State
129
-            ? $this->state_obj()->name()
130
-            : '';
131
-    }
132
-
133
-
134
-    /**
135
-     * @return \EE_State
136
-     */
137
-    public function state_obj()
138
-    {
139
-        return $this->_state_obj;
140
-    }
141
-
142
-
143
-    /**
144
-     * @return string
145
-     */
146
-    public function state()
147
-    {
148
-        if (apply_filters('FHEE__EEI_Address__state__use_abbreviation', true, $this->state_obj())) {
149
-            return $this->state_obj()->abbrev();
150
-        } else {
151
-            return $this->state_name();
152
-        }
153
-    }
154
-
155
-
156
-    /**
157
-     * @return \EE_Country
158
-     */
159
-    private function _get_country_obj()
160
-    {
161
-        return $this->_country_obj instanceof \EE_Country
162
-            ? $this->_country_obj
163
-            : \EE_Registry::instance()->load_model('Country')->get_one_by_ID($this->_country_ID);
164
-    }
165
-
166
-
167
-    /**
168
-     * @return string
169
-     */
170
-    public function country_ID()
171
-    {
172
-        return $this->_country_ID;
173
-    }
174
-
175
-
176
-    /**
177
-     * @return string
178
-     */
179
-    public function country_name()
180
-    {
181
-        return $this->country_obj() instanceof \EE_Country
182
-            ? $this->country_obj()->name()
183
-            : '';
184
-    }
185
-
186
-
187
-    /**
188
-     * @return \EE_Country
189
-     */
190
-    public function country_obj()
191
-    {
192
-        return $this->_country_obj;
193
-    }
194
-
195
-
196
-    /**
197
-     * @return string
198
-     */
199
-    public function country()
200
-    {
201
-        if (apply_filters('FHEE__EEI_Address__country__use_abbreviation', true, $this->country_obj())) {
202
-            return $this->country_ID();
203
-        } else {
204
-            return $this->country_name();
205
-        }
206
-    }
207
-
208
-
209
-    /**
210
-     * @return string
211
-     */
212
-    public function zip()
213
-    {
214
-        return $this->_zip;
215
-    }
15
+	// phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore
16
+	private $_address = '';
17
+
18
+	private $_address2 = '';
19
+
20
+	private $_city = '';
21
+
22
+	private $_state_ID = '';
23
+
24
+	private $_state_obj = '';
25
+
26
+	private $_zip = '';
27
+
28
+	private $_country_ID = '';
29
+
30
+	private $_country_obj = '';
31
+	// phpcs:enable
32
+
33
+	// phpcs:disable PSR2.Methods.MethodDeclaration.Underscore
34
+	/**
35
+	 * @param string               $address
36
+	 * @param string               $address2
37
+	 * @param string               $city
38
+	 * @param \EE_State | string   $state
39
+	 * @param string               $zip
40
+	 * @param \EE_Country | string $country
41
+	 * @return GenericAddress
42
+	 */
43
+	public function __construct($address, $address2, $city, $state, $zip, $country)
44
+	{
45
+		$this->_address = $address;
46
+		$this->_address2 = $address2;
47
+		$this->_city = $city;
48
+		if ($state instanceof \EE_State) {
49
+			$this->_state_obj = $state;
50
+		} else {
51
+			$this->_state_ID = $state;
52
+			$this->_state_obj = $this->_get_state_obj();
53
+		}
54
+		$this->_zip = $zip;
55
+		if ($country instanceof \EE_Country) {
56
+			$this->_country_obj = $country;
57
+		} else {
58
+			$this->_country_ID = $country;
59
+			$this->_country_obj = $this->_get_country_obj();
60
+		}
61
+	}
62
+
63
+
64
+	/**
65
+	 * @return string
66
+	 */
67
+	public function address()
68
+	{
69
+		return $this->_address;
70
+	}
71
+
72
+
73
+	/**
74
+	 * @return string
75
+	 */
76
+	public function address2()
77
+	{
78
+		return $this->_address2;
79
+	}
80
+
81
+
82
+	/**
83
+	 * @return string
84
+	 */
85
+	public function city()
86
+	{
87
+		return $this->_city;
88
+	}
89
+
90
+	// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
91
+
92
+	/**
93
+	 * @return \EE_State
94
+	 */
95
+	private function _get_state_obj()
96
+	{
97
+		return $this->_state_obj instanceof \EE_State
98
+			? $this->_state_obj
99
+			: \EE_Registry::instance()->load_model('State')->get_one_by_ID($this->_state_ID);
100
+	}
101
+
102
+
103
+	/**
104
+	 * @return string
105
+	 */
106
+	public function state_ID()
107
+	{
108
+		return $this->_state_ID;
109
+	}
110
+
111
+
112
+	/**
113
+	 * @return string
114
+	 */
115
+	public function state_abbrev()
116
+	{
117
+		return $this->state_obj() instanceof \EE_State
118
+			? $this->state_obj()->abbrev()
119
+			: '';
120
+	}
121
+
122
+
123
+	/**
124
+	 * @return string
125
+	 */
126
+	public function state_name()
127
+	{
128
+		return $this->state_obj() instanceof \EE_State
129
+			? $this->state_obj()->name()
130
+			: '';
131
+	}
132
+
133
+
134
+	/**
135
+	 * @return \EE_State
136
+	 */
137
+	public function state_obj()
138
+	{
139
+		return $this->_state_obj;
140
+	}
141
+
142
+
143
+	/**
144
+	 * @return string
145
+	 */
146
+	public function state()
147
+	{
148
+		if (apply_filters('FHEE__EEI_Address__state__use_abbreviation', true, $this->state_obj())) {
149
+			return $this->state_obj()->abbrev();
150
+		} else {
151
+			return $this->state_name();
152
+		}
153
+	}
154
+
155
+
156
+	/**
157
+	 * @return \EE_Country
158
+	 */
159
+	private function _get_country_obj()
160
+	{
161
+		return $this->_country_obj instanceof \EE_Country
162
+			? $this->_country_obj
163
+			: \EE_Registry::instance()->load_model('Country')->get_one_by_ID($this->_country_ID);
164
+	}
165
+
166
+
167
+	/**
168
+	 * @return string
169
+	 */
170
+	public function country_ID()
171
+	{
172
+		return $this->_country_ID;
173
+	}
174
+
175
+
176
+	/**
177
+	 * @return string
178
+	 */
179
+	public function country_name()
180
+	{
181
+		return $this->country_obj() instanceof \EE_Country
182
+			? $this->country_obj()->name()
183
+			: '';
184
+	}
185
+
186
+
187
+	/**
188
+	 * @return \EE_Country
189
+	 */
190
+	public function country_obj()
191
+	{
192
+		return $this->_country_obj;
193
+	}
194
+
195
+
196
+	/**
197
+	 * @return string
198
+	 */
199
+	public function country()
200
+	{
201
+		if (apply_filters('FHEE__EEI_Address__country__use_abbreviation', true, $this->country_obj())) {
202
+			return $this->country_ID();
203
+		} else {
204
+			return $this->country_name();
205
+		}
206
+	}
207
+
208
+
209
+	/**
210
+	 * @return string
211
+	 */
212
+	public function zip()
213
+	{
214
+		return $this->_zip;
215
+	}
216 216
 }
Please login to merge, or discard this patch.
core/domain/services/wp_queries/EventListQuery.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -91,7 +91,7 @@  discard block
 block discarded – undo
91 91
                 // set the property value
92 92
                 $this->{$property} = $value;
93 93
                 // then remove it from the array of args that will later be passed to WP_Query()
94
-                unset($args[ $property ]);
94
+                unset($args[$property]);
95 95
             }
96 96
         }
97 97
         return $args;
@@ -188,7 +188,7 @@  discard block
 block discarded – undo
188 188
      */
189 189
     public function event_list_title($event_list_title = '')
190 190
     {
191
-        if (! empty($this->title)) {
191
+        if ( ! empty($this->title)) {
192 192
             return $this->title;
193 193
         }
194 194
         return $event_list_title;
Please login to merge, or discard this patch.
Indentation   +194 added lines, -194 removed lines patch added patch discarded remove patch
@@ -15,198 +15,198 @@
 block discarded – undo
15 15
  */
16 16
 class EventListQuery extends WP_Query
17 17
 {
18
-    /**
19
-     * @var string $title
20
-     */
21
-    private $title;
22
-
23
-    /**
24
-     * @var integer $limit
25
-     */
26
-    private $limit = 10;
27
-
28
-    /**
29
-     * @var string $css_class
30
-     */
31
-    private $css_class;
32
-
33
-    /**
34
-     * @var boolean $show_expired
35
-     */
36
-    private $show_expired = false;
37
-
38
-    /**
39
-     * @var string $month
40
-     */
41
-    private $month;
42
-
43
-    /**
44
-     * @var string $category_slug
45
-     */
46
-    private $category_slug;
47
-
48
-    /**
49
-     * @var string $order_by
50
-     */
51
-    private $order_by;
52
-
53
-    /**
54
-     * @var string $sort
55
-     */
56
-    private $sort;
57
-
58
-    /**
59
-     * @var boolean $show_title
60
-     */
61
-    private $show_title = true;
62
-
63
-
64
-    /**
65
-     * EE_Event_List_Query Constructor     *
66
-     *
67
-     * @param array $args
68
-     */
69
-    public function __construct($args = array())
70
-    {
71
-        $args = $this->parseArgs((array) $args);
72
-        $this->setupEventQueryHelper();
73
-        $this->setupFilters();
74
-        $args = $this->getQueryArgs($args);
75
-        // run the query
76
-        parent::__construct($args);
77
-    }
78
-
79
-
80
-    /**
81
-     * @param array $args
82
-     * @return array
83
-     */
84
-    private function parseArgs(array $args)
85
-    {
86
-        // incoming args could be a mix of WP query args + EE shortcode args
87
-        foreach ($args as $property => $value) {
88
-            // if the arg is a property of this class, then it's an EE shortcode arg
89
-            if (property_exists($this, $property) && ! property_exists('WP_Query', $property)) {
90
-                // set the property value
91
-                $this->{$property} = $value;
92
-                // then remove it from the array of args that will later be passed to WP_Query()
93
-                unset($args[ $property ]);
94
-            }
95
-        }
96
-        return $args;
97
-    }
98
-
99
-
100
-    private function setupEventQueryHelper()
101
-    {
102
-        // add query filters
103
-        EEH_Event_Query::add_query_filters();
104
-        // set params that will get used by the filters
105
-        EEH_Event_Query::set_query_params(
106
-            $this->month,
107
-            $this->category_slug,
108
-            $this->show_expired,
109
-            $this->order_by,
110
-            $this->sort
111
-        );
112
-    }
113
-
114
-
115
-    private function setupFilters()
116
-    {
117
-        // first off, let's remove any filters from previous queries
118
-        remove_filter(
119
-            'FHEE__archive_espresso_events_template__show_header',
120
-            array($this, 'show_event_list_title')
121
-        );
122
-        remove_filter(
123
-            'FHEE__archive_espresso_events_template__upcoming_events_h1',
124
-            array($this, 'event_list_title')
125
-        );
126
-        remove_all_filters('FHEE__content_espresso_events__event_class');
127
-        // Event List Title ?
128
-        add_filter(
129
-            'FHEE__archive_espresso_events_template__show_header',
130
-            array($this, 'show_event_list_title')
131
-        );
132
-        add_filter(
133
-            'FHEE__archive_espresso_events_template__upcoming_events_h1',
134
-            array($this, 'event_list_title'),
135
-            10,
136
-            1
137
-        );
138
-        // add the css class
139
-        add_filter(
140
-            'FHEE__content_espresso_events__event_class',
141
-            array($this, 'event_list_css'),
142
-            10,
143
-            1
144
-        );
145
-    }
146
-
147
-
148
-    private function getQueryArgs(array $args)
149
-    {
150
-        // the current "page" we are viewing
151
-        $paged = max(1, get_query_var('paged'));
152
-        // Force these args
153
-        return array_merge(
154
-            $args,
155
-            array(
156
-                'post_type'              => 'espresso_events',
157
-                'posts_per_page'         => $this->limit,
158
-                'update_post_term_cache' => false,
159
-                'update_post_meta_cache' => false,
160
-                'paged'                  => $paged,
161
-                'offset'                 => ($paged - 1) * $this->limit,
162
-            )
163
-        );
164
-    }
165
-
166
-    // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
167
-
168
-    /**
169
-     * show_event_list_title
170
-     *
171
-     * @return boolean
172
-     */
173
-    public function show_event_list_title()
174
-    {
175
-        return filter_var(
176
-            $this->show_title,
177
-            FILTER_VALIDATE_BOOLEAN
178
-        );
179
-    }
180
-
181
-
182
-    /**
183
-     * callback for FHEE__archive_espresso_events_template__upcoming_events_h1 filter
184
-     *
185
-     * @param string $event_list_title
186
-     * @return    string
187
-     */
188
-    public function event_list_title($event_list_title = '')
189
-    {
190
-        if (! empty($this->title)) {
191
-            return $this->title;
192
-        }
193
-        return $event_list_title;
194
-    }
195
-
196
-
197
-    /**
198
-     * callback for FHEE__content_espresso_events__event_class filter
199
-     *
200
-     * @param string $event_list_css
201
-     * @return string
202
-     */
203
-    public function event_list_css($event_list_css = '')
204
-    {
205
-        $event_list_css .= ! empty($event_list_css) ? ' ' : '';
206
-        $event_list_css .= ! empty($this->css_class) ? $this->css_class : '';
207
-        $event_list_css .= ! empty($event_list_css) ? ' ' : '';
208
-        $event_list_css .= ! empty($this->category_slug) ? $this->category_slug : '';
209
-        return $event_list_css;
210
-    }
211
-    // phpcs:enable
18
+	/**
19
+	 * @var string $title
20
+	 */
21
+	private $title;
22
+
23
+	/**
24
+	 * @var integer $limit
25
+	 */
26
+	private $limit = 10;
27
+
28
+	/**
29
+	 * @var string $css_class
30
+	 */
31
+	private $css_class;
32
+
33
+	/**
34
+	 * @var boolean $show_expired
35
+	 */
36
+	private $show_expired = false;
37
+
38
+	/**
39
+	 * @var string $month
40
+	 */
41
+	private $month;
42
+
43
+	/**
44
+	 * @var string $category_slug
45
+	 */
46
+	private $category_slug;
47
+
48
+	/**
49
+	 * @var string $order_by
50
+	 */
51
+	private $order_by;
52
+
53
+	/**
54
+	 * @var string $sort
55
+	 */
56
+	private $sort;
57
+
58
+	/**
59
+	 * @var boolean $show_title
60
+	 */
61
+	private $show_title = true;
62
+
63
+
64
+	/**
65
+	 * EE_Event_List_Query Constructor     *
66
+	 *
67
+	 * @param array $args
68
+	 */
69
+	public function __construct($args = array())
70
+	{
71
+		$args = $this->parseArgs((array) $args);
72
+		$this->setupEventQueryHelper();
73
+		$this->setupFilters();
74
+		$args = $this->getQueryArgs($args);
75
+		// run the query
76
+		parent::__construct($args);
77
+	}
78
+
79
+
80
+	/**
81
+	 * @param array $args
82
+	 * @return array
83
+	 */
84
+	private function parseArgs(array $args)
85
+	{
86
+		// incoming args could be a mix of WP query args + EE shortcode args
87
+		foreach ($args as $property => $value) {
88
+			// if the arg is a property of this class, then it's an EE shortcode arg
89
+			if (property_exists($this, $property) && ! property_exists('WP_Query', $property)) {
90
+				// set the property value
91
+				$this->{$property} = $value;
92
+				// then remove it from the array of args that will later be passed to WP_Query()
93
+				unset($args[ $property ]);
94
+			}
95
+		}
96
+		return $args;
97
+	}
98
+
99
+
100
+	private function setupEventQueryHelper()
101
+	{
102
+		// add query filters
103
+		EEH_Event_Query::add_query_filters();
104
+		// set params that will get used by the filters
105
+		EEH_Event_Query::set_query_params(
106
+			$this->month,
107
+			$this->category_slug,
108
+			$this->show_expired,
109
+			$this->order_by,
110
+			$this->sort
111
+		);
112
+	}
113
+
114
+
115
+	private function setupFilters()
116
+	{
117
+		// first off, let's remove any filters from previous queries
118
+		remove_filter(
119
+			'FHEE__archive_espresso_events_template__show_header',
120
+			array($this, 'show_event_list_title')
121
+		);
122
+		remove_filter(
123
+			'FHEE__archive_espresso_events_template__upcoming_events_h1',
124
+			array($this, 'event_list_title')
125
+		);
126
+		remove_all_filters('FHEE__content_espresso_events__event_class');
127
+		// Event List Title ?
128
+		add_filter(
129
+			'FHEE__archive_espresso_events_template__show_header',
130
+			array($this, 'show_event_list_title')
131
+		);
132
+		add_filter(
133
+			'FHEE__archive_espresso_events_template__upcoming_events_h1',
134
+			array($this, 'event_list_title'),
135
+			10,
136
+			1
137
+		);
138
+		// add the css class
139
+		add_filter(
140
+			'FHEE__content_espresso_events__event_class',
141
+			array($this, 'event_list_css'),
142
+			10,
143
+			1
144
+		);
145
+	}
146
+
147
+
148
+	private function getQueryArgs(array $args)
149
+	{
150
+		// the current "page" we are viewing
151
+		$paged = max(1, get_query_var('paged'));
152
+		// Force these args
153
+		return array_merge(
154
+			$args,
155
+			array(
156
+				'post_type'              => 'espresso_events',
157
+				'posts_per_page'         => $this->limit,
158
+				'update_post_term_cache' => false,
159
+				'update_post_meta_cache' => false,
160
+				'paged'                  => $paged,
161
+				'offset'                 => ($paged - 1) * $this->limit,
162
+			)
163
+		);
164
+	}
165
+
166
+	// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
167
+
168
+	/**
169
+	 * show_event_list_title
170
+	 *
171
+	 * @return boolean
172
+	 */
173
+	public function show_event_list_title()
174
+	{
175
+		return filter_var(
176
+			$this->show_title,
177
+			FILTER_VALIDATE_BOOLEAN
178
+		);
179
+	}
180
+
181
+
182
+	/**
183
+	 * callback for FHEE__archive_espresso_events_template__upcoming_events_h1 filter
184
+	 *
185
+	 * @param string $event_list_title
186
+	 * @return    string
187
+	 */
188
+	public function event_list_title($event_list_title = '')
189
+	{
190
+		if (! empty($this->title)) {
191
+			return $this->title;
192
+		}
193
+		return $event_list_title;
194
+	}
195
+
196
+
197
+	/**
198
+	 * callback for FHEE__content_espresso_events__event_class filter
199
+	 *
200
+	 * @param string $event_list_css
201
+	 * @return string
202
+	 */
203
+	public function event_list_css($event_list_css = '')
204
+	{
205
+		$event_list_css .= ! empty($event_list_css) ? ' ' : '';
206
+		$event_list_css .= ! empty($this->css_class) ? $this->css_class : '';
207
+		$event_list_css .= ! empty($event_list_css) ? ' ' : '';
208
+		$event_list_css .= ! empty($this->category_slug) ? $this->category_slug : '';
209
+		return $event_list_css;
210
+	}
211
+	// phpcs:enable
212 212
 }
Please login to merge, or discard this patch.
core/domain/services/validation/email/strategies/Basic.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -22,7 +22,7 @@  discard block
 block discarded – undo
22 22
      */
23 23
     public function validate($email_address)
24 24
     {
25
-        if (! preg_match('/^.+\@\S+$/', $email_address)) {
25
+        if ( ! preg_match('/^.+\@\S+$/', $email_address)) {
26 26
             // email not in correct {string}@{string} format
27 27
             throw new EmailValidationException(
28 28
                 esc_html__('Email does not have the required @ sign.', 'event_espresso')
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
                 esc_html__('Email local-part (before the @) must not begin with a period.', 'event_espresso')
50 50
             );
51 51
         }
52
-        if ($local[ $localLen - 1 ] === '.') {
52
+        if ($local[$localLen - 1] === '.') {
53 53
             // local part starts or ends with '.'
54 54
             throw new EmailValidationException(
55 55
                 esc_html__('Email local-part (before the @) must not end with a period.', 'event_espresso')
Please login to merge, or discard this patch.
Indentation   +102 added lines, -102 removed lines patch added patch discarded remove patch
@@ -14,112 +14,112 @@
 block discarded – undo
14 14
  */
15 15
 class Basic implements EmailValidatorInterface
16 16
 {
17
-    /**
18
-     * @param string $email_address
19
-     * @return bool
20
-     * @throws EmailValidationException
21
-     */
22
-    public function validate($email_address)
23
-    {
24
-        if (! preg_match('/^.+\@\S+$/', $email_address)) {
25
-            // email not in correct {string}@{string} format
26
-            throw new EmailValidationException(
27
-                esc_html__('Email does not have the required @ sign.', 'event_espresso')
28
-            );
29
-        }
30
-        $atIndex = $this->getAtIndex($email_address);
31
-        $local = $this->getLocalPartOfEmail($email_address, $atIndex);
32
-        $localLen = strlen($local);
33
-        if ($localLen < 1) {
34
-            // no local part
35
-            throw new EmailValidationException(
36
-                esc_html__('Email local-part (before the @) is required.', 'event_espresso')
37
-            );
38
-        }
39
-        if ($localLen > 64) {
40
-            // local part length exceeded
41
-            throw new EmailValidationException(
42
-                esc_html__('Email local-part (before the @) is too long.', 'event_espresso')
43
-            );
44
-        }
45
-        if ($local[0] === '.') {
46
-            // local part starts with '.'
47
-            throw new EmailValidationException(
48
-                esc_html__('Email local-part (before the @) must not begin with a period.', 'event_espresso')
49
-            );
50
-        }
51
-        if ($local[ $localLen - 1 ] === '.') {
52
-            // local part starts or ends with '.'
53
-            throw new EmailValidationException(
54
-                esc_html__('Email local-part (before the @) must not end with a period.', 'event_espresso')
55
-            );
56
-        }
57
-        if (preg_match('/\\.\\./', $local)) {
58
-            // local part has two consecutive dots
59
-            throw new EmailValidationException(
60
-                esc_html__(
61
-                    'Email local-part (before the @) must not have two consecutive periods.',
62
-                    'event_espresso'
63
-                )
64
-            );
65
-        }
66
-        $domain = $this->getDomainPartOfEmail($email_address, $atIndex);
67
-        $domainLen = strlen($domain);
68
-        if ($domainLen < 1) {
69
-            throw new EmailValidationException(
70
-                esc_html__('Email domain (after the @) is required.', 'event_espresso')
71
-            );
72
-        }
73
-        if ($domainLen > 255) {
74
-            // domain part length exceeded
75
-            throw new EmailValidationException(
76
-                esc_html__('Email domain (after the @) is too long.', 'event_espresso')
77
-            );
78
-        }
79
-        if (preg_match('/\\.\\./', $domain)) {
80
-            // domain part has two consecutive dots
81
-            throw new EmailValidationException(
82
-                esc_html__('Email domain (after the @) must not have two consecutive periods.', 'event_espresso')
83
-            );
84
-        }
85
-        return true;
86
-    }
17
+	/**
18
+	 * @param string $email_address
19
+	 * @return bool
20
+	 * @throws EmailValidationException
21
+	 */
22
+	public function validate($email_address)
23
+	{
24
+		if (! preg_match('/^.+\@\S+$/', $email_address)) {
25
+			// email not in correct {string}@{string} format
26
+			throw new EmailValidationException(
27
+				esc_html__('Email does not have the required @ sign.', 'event_espresso')
28
+			);
29
+		}
30
+		$atIndex = $this->getAtIndex($email_address);
31
+		$local = $this->getLocalPartOfEmail($email_address, $atIndex);
32
+		$localLen = strlen($local);
33
+		if ($localLen < 1) {
34
+			// no local part
35
+			throw new EmailValidationException(
36
+				esc_html__('Email local-part (before the @) is required.', 'event_espresso')
37
+			);
38
+		}
39
+		if ($localLen > 64) {
40
+			// local part length exceeded
41
+			throw new EmailValidationException(
42
+				esc_html__('Email local-part (before the @) is too long.', 'event_espresso')
43
+			);
44
+		}
45
+		if ($local[0] === '.') {
46
+			// local part starts with '.'
47
+			throw new EmailValidationException(
48
+				esc_html__('Email local-part (before the @) must not begin with a period.', 'event_espresso')
49
+			);
50
+		}
51
+		if ($local[ $localLen - 1 ] === '.') {
52
+			// local part starts or ends with '.'
53
+			throw new EmailValidationException(
54
+				esc_html__('Email local-part (before the @) must not end with a period.', 'event_espresso')
55
+			);
56
+		}
57
+		if (preg_match('/\\.\\./', $local)) {
58
+			// local part has two consecutive dots
59
+			throw new EmailValidationException(
60
+				esc_html__(
61
+					'Email local-part (before the @) must not have two consecutive periods.',
62
+					'event_espresso'
63
+				)
64
+			);
65
+		}
66
+		$domain = $this->getDomainPartOfEmail($email_address, $atIndex);
67
+		$domainLen = strlen($domain);
68
+		if ($domainLen < 1) {
69
+			throw new EmailValidationException(
70
+				esc_html__('Email domain (after the @) is required.', 'event_espresso')
71
+			);
72
+		}
73
+		if ($domainLen > 255) {
74
+			// domain part length exceeded
75
+			throw new EmailValidationException(
76
+				esc_html__('Email domain (after the @) is too long.', 'event_espresso')
77
+			);
78
+		}
79
+		if (preg_match('/\\.\\./', $domain)) {
80
+			// domain part has two consecutive dots
81
+			throw new EmailValidationException(
82
+				esc_html__('Email domain (after the @) must not have two consecutive periods.', 'event_espresso')
83
+			);
84
+		}
85
+		return true;
86
+	}
87 87
 
88 88
 
89
-    /**
90
-     * returns the location of the @ symbol
91
-     *
92
-     * @param string $email_address
93
-     * @return bool|string
94
-     */
95
-    protected function getAtIndex($email_address)
96
-    {
97
-        return strrpos($email_address, '@');
98
-    }
89
+	/**
90
+	 * returns the location of the @ symbol
91
+	 *
92
+	 * @param string $email_address
93
+	 * @return bool|string
94
+	 */
95
+	protected function getAtIndex($email_address)
96
+	{
97
+		return strrpos($email_address, '@');
98
+	}
99 99
 
100 100
 
101
-    /**
102
-     * Gets the local part of the email
103
-     *
104
-     * @param string   $email_address
105
-     * @param bool|int $atIndex
106
-     * @return bool|string
107
-     */
108
-    protected function getLocalPartOfEmail($email_address, $atIndex)
109
-    {
110
-        return substr($email_address, 0, $atIndex);
111
-    }
101
+	/**
102
+	 * Gets the local part of the email
103
+	 *
104
+	 * @param string   $email_address
105
+	 * @param bool|int $atIndex
106
+	 * @return bool|string
107
+	 */
108
+	protected function getLocalPartOfEmail($email_address, $atIndex)
109
+	{
110
+		return substr($email_address, 0, $atIndex);
111
+	}
112 112
 
113 113
 
114
-    /**
115
-     * Gets the domain part of the email
116
-     *
117
-     * @param string   $email_address
118
-     * @param bool|int $atIndex
119
-     * @return bool|string
120
-     */
121
-    protected function getDomainPartOfEmail($email_address, $atIndex)
122
-    {
123
-        return substr($email_address, $atIndex + 1);
124
-    }
114
+	/**
115
+	 * Gets the domain part of the email
116
+	 *
117
+	 * @param string   $email_address
118
+	 * @param bool|int $atIndex
119
+	 * @return bool|string
120
+	 */
121
+	protected function getDomainPartOfEmail($email_address, $atIndex)
122
+	{
123
+		return substr($email_address, $atIndex + 1);
124
+	}
125 125
 }
Please login to merge, or discard this patch.
core/domain/services/registration/CreateRegistrationService.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -70,14 +70,14 @@
 block discarded – undo
70 70
                 'REG_code'        => $reg_code,
71 71
             )
72 72
         );
73
-        if (! $registration instanceof EE_Registration) {
73
+        if ( ! $registration instanceof EE_Registration) {
74 74
             throw new UnexpectedEntityException($registration, 'EE_Registration');
75 75
         }
76 76
         // save registration so that we have an ID
77 77
         $registration->save();
78 78
         // track reservation on reg but don't adjust ticket and datetime reserved counts
79 79
         // because that is done as soon as the tickets are added/removed from the cart
80
-        $registration->reserve_ticket(false, 'CreateRegistrationService:' . __LINE__);
80
+        $registration->reserve_ticket(false, 'CreateRegistrationService:'.__LINE__);
81 81
         $registration->_add_relation_to($event, 'Event', array(), $event->ID());
82 82
         $registration->_add_relation_to($ticket, 'Ticket', array(), $ticket->ID());
83 83
         $transaction->_add_relation_to($registration, 'Registration', array(), $registration->ID());
Please login to merge, or discard this patch.
Indentation   +94 added lines, -94 removed lines patch added patch discarded remove patch
@@ -27,102 +27,102 @@
 block discarded – undo
27 27
  */
28 28
 class CreateRegistrationService extends DomainService
29 29
 {
30
-    /**
31
-     * @param EE_Event        $event
32
-     * @param EE_Transaction  $transaction
33
-     * @param EE_Ticket       $ticket
34
-     * @param EE_Line_Item    $ticket_line_item
35
-     * @param                 $reg_count
36
-     * @param                 $reg_group_size
37
-     * @param string          $reg_status
38
-     * @return EE_Registration
39
-     * @throws OutOfRangeException
40
-     * @throws EE_Error
41
-     * @throws UnexpectedEntityException
42
-     */
43
-    public function create(
44
-        EE_Event $event,
45
-        EE_Transaction $transaction,
46
-        EE_Ticket $ticket,
47
-        EE_Line_Item $ticket_line_item,
48
-        $reg_count,
49
-        $reg_group_size,
50
-        $reg_status = EEM_Registration::status_id_incomplete
51
-    ) {
52
-        $registrations = $transaction->registrations();
53
-        $reg_count = $reg_count ? $reg_count : count($registrations) + 1;
54
-        $reg_url_link = new RegUrlLink($reg_count, $ticket_line_item);
55
-        $reg_code = new RegCode($reg_url_link, $transaction, $ticket);
56
-        // generate new EE_Registration
57
-        $registration = EE_Registration::new_instance(
58
-            array(
59
-                'EVT_ID'          => $event->ID(),
60
-                'TXN_ID'          => $transaction->ID(),
61
-                'TKT_ID'          => $ticket->ID(),
62
-                'STS_ID'          => $reg_status,
63
-                'REG_final_price' => $this->resolveFinalPrice($transaction, $ticket, $ticket_line_item),
64
-                'REG_session'     => EE_Registry::instance()->SSN->id(),
65
-                'REG_count'       => $reg_count,
66
-                'REG_group_size'  => $reg_group_size ? $reg_group_size : $this->incrementRegGroupSize($registrations),
67
-                'REG_url_link'    => $reg_url_link,
68
-                'REG_code'        => $reg_code,
69
-            )
70
-        );
71
-        if (! $registration instanceof EE_Registration) {
72
-            throw new UnexpectedEntityException($registration, 'EE_Registration');
73
-        }
74
-        // save registration so that we have an ID
75
-        $registration->save();
76
-        // track reservation on reg but don't adjust ticket and datetime reserved counts
77
-        // because that is done as soon as the tickets are added/removed from the cart
78
-        $registration->reserve_ticket(false, 'CreateRegistrationService:' . __LINE__);
79
-        $registration->_add_relation_to($event, 'Event', array(), $event->ID());
80
-        $registration->_add_relation_to($ticket, 'Ticket', array(), $ticket->ID());
81
-        $transaction->_add_relation_to($registration, 'Registration', array(), $registration->ID());
82
-        $registration->save();
83
-        return $registration;
84
-    }
30
+	/**
31
+	 * @param EE_Event        $event
32
+	 * @param EE_Transaction  $transaction
33
+	 * @param EE_Ticket       $ticket
34
+	 * @param EE_Line_Item    $ticket_line_item
35
+	 * @param                 $reg_count
36
+	 * @param                 $reg_group_size
37
+	 * @param string          $reg_status
38
+	 * @return EE_Registration
39
+	 * @throws OutOfRangeException
40
+	 * @throws EE_Error
41
+	 * @throws UnexpectedEntityException
42
+	 */
43
+	public function create(
44
+		EE_Event $event,
45
+		EE_Transaction $transaction,
46
+		EE_Ticket $ticket,
47
+		EE_Line_Item $ticket_line_item,
48
+		$reg_count,
49
+		$reg_group_size,
50
+		$reg_status = EEM_Registration::status_id_incomplete
51
+	) {
52
+		$registrations = $transaction->registrations();
53
+		$reg_count = $reg_count ? $reg_count : count($registrations) + 1;
54
+		$reg_url_link = new RegUrlLink($reg_count, $ticket_line_item);
55
+		$reg_code = new RegCode($reg_url_link, $transaction, $ticket);
56
+		// generate new EE_Registration
57
+		$registration = EE_Registration::new_instance(
58
+			array(
59
+				'EVT_ID'          => $event->ID(),
60
+				'TXN_ID'          => $transaction->ID(),
61
+				'TKT_ID'          => $ticket->ID(),
62
+				'STS_ID'          => $reg_status,
63
+				'REG_final_price' => $this->resolveFinalPrice($transaction, $ticket, $ticket_line_item),
64
+				'REG_session'     => EE_Registry::instance()->SSN->id(),
65
+				'REG_count'       => $reg_count,
66
+				'REG_group_size'  => $reg_group_size ? $reg_group_size : $this->incrementRegGroupSize($registrations),
67
+				'REG_url_link'    => $reg_url_link,
68
+				'REG_code'        => $reg_code,
69
+			)
70
+		);
71
+		if (! $registration instanceof EE_Registration) {
72
+			throw new UnexpectedEntityException($registration, 'EE_Registration');
73
+		}
74
+		// save registration so that we have an ID
75
+		$registration->save();
76
+		// track reservation on reg but don't adjust ticket and datetime reserved counts
77
+		// because that is done as soon as the tickets are added/removed from the cart
78
+		$registration->reserve_ticket(false, 'CreateRegistrationService:' . __LINE__);
79
+		$registration->_add_relation_to($event, 'Event', array(), $event->ID());
80
+		$registration->_add_relation_to($ticket, 'Ticket', array(), $ticket->ID());
81
+		$transaction->_add_relation_to($registration, 'Registration', array(), $registration->ID());
82
+		$registration->save();
83
+		return $registration;
84
+	}
85 85
 
86 86
 
87
-    /**
88
-     * @param EE_Transaction $transaction
89
-     * @param EE_Ticket      $ticket
90
-     * @param EE_Line_Item   $ticket_line_item
91
-     * @return float
92
-     * @throws EE_Error
93
-     * @throws OutOfRangeException
94
-     */
95
-    protected function resolveFinalPrice(
96
-        EE_Transaction $transaction,
97
-        EE_Ticket $ticket,
98
-        EE_Line_Item $ticket_line_item
99
-    ) {
100
-        $final_price = EEH_Line_Item::calculate_final_price_for_ticket_line_item(
101
-            $transaction->total_line_item(),
102
-            $ticket_line_item
103
-        );
104
-        $final_price = $final_price !== null ? $final_price : $ticket->get_ticket_total_with_taxes();
105
-        return (float) $final_price;
106
-    }
87
+	/**
88
+	 * @param EE_Transaction $transaction
89
+	 * @param EE_Ticket      $ticket
90
+	 * @param EE_Line_Item   $ticket_line_item
91
+	 * @return float
92
+	 * @throws EE_Error
93
+	 * @throws OutOfRangeException
94
+	 */
95
+	protected function resolveFinalPrice(
96
+		EE_Transaction $transaction,
97
+		EE_Ticket $ticket,
98
+		EE_Line_Item $ticket_line_item
99
+	) {
100
+		$final_price = EEH_Line_Item::calculate_final_price_for_ticket_line_item(
101
+			$transaction->total_line_item(),
102
+			$ticket_line_item
103
+		);
104
+		$final_price = $final_price !== null ? $final_price : $ticket->get_ticket_total_with_taxes();
105
+		return (float) $final_price;
106
+	}
107 107
 
108 108
 
109
-    /**
110
-     * @param  EE_Registration[] $registrations
111
-     * @param  boolean           $update_existing_registrations
112
-     * @return int
113
-     * @throws EE_Error
114
-     */
115
-    protected function incrementRegGroupSize(array $registrations, $update_existing_registrations = true)
116
-    {
117
-        $new_reg_group_size = count($registrations) + 1;
118
-        if ($update_existing_registrations) {
119
-            foreach ($registrations as $registration) {
120
-                if ($registration instanceof EE_Registration) {
121
-                    $registration->set_group_size($new_reg_group_size);
122
-                    $registration->save();
123
-                }
124
-            }
125
-        }
126
-        return $new_reg_group_size;
127
-    }
109
+	/**
110
+	 * @param  EE_Registration[] $registrations
111
+	 * @param  boolean           $update_existing_registrations
112
+	 * @return int
113
+	 * @throws EE_Error
114
+	 */
115
+	protected function incrementRegGroupSize(array $registrations, $update_existing_registrations = true)
116
+	{
117
+		$new_reg_group_size = count($registrations) + 1;
118
+		if ($update_existing_registrations) {
119
+			foreach ($registrations as $registration) {
120
+				if ($registration instanceof EE_Registration) {
121
+					$registration->set_group_size($new_reg_group_size);
122
+					$registration->save();
123
+				}
124
+			}
125
+		}
126
+		return $new_reg_group_size;
127
+	}
128 128
 }
Please login to merge, or discard this patch.
core/domain/services/registration/CopyRegistrationService.php 2 patches
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -83,7 +83,7 @@  discard block
 block discarded – undo
83 83
         $reindexed_answers = array();
84 84
         foreach ($answers as $answer) {
85 85
             if ($answer instanceof EE_Answer) {
86
-                $reindexed_answers[ $answer->question_ID() ] = $answer->value();
86
+                $reindexed_answers[$answer->question_ID()] = $answer->value();
87 87
             }
88 88
         }
89 89
         return $reindexed_answers;
@@ -103,8 +103,8 @@  discard block
 block discarded – undo
103 103
         EE_Registration $registration,
104 104
         $previous_answers
105 105
     ) {
106
-        $old_answer_value = isset($previous_answers[ $question->ID() ])
107
-            ? $previous_answers[ $question->ID() ]
106
+        $old_answer_value = isset($previous_answers[$question->ID()])
107
+            ? $previous_answers[$question->ID()]
108 108
             : '';
109 109
         $new_answer = EE_Answer::new_instance(
110 110
             array(
@@ -113,7 +113,7 @@  discard block
 block discarded – undo
113 113
                 'ANS_value' => $old_answer_value,
114 114
             )
115 115
         );
116
-        if (! $new_answer instanceof EE_Answer) {
116
+        if ( ! $new_answer instanceof EE_Answer) {
117 117
             throw new UnexpectedEntityException($new_answer, 'EE_Answer');
118 118
         }
119 119
         $new_answer->save();
@@ -150,7 +150,7 @@  discard block
 block discarded – undo
150 150
                         'RPY_amount' => $payment_amount,
151 151
                     )
152 152
                 );
153
-                if (! $new_registration_payment instanceof EE_Registration_Payment) {
153
+                if ( ! $new_registration_payment instanceof EE_Registration_Payment) {
154 154
                     throw new UnexpectedEntityException($new_registration_payment, 'EE_Registration_Payment');
155 155
                 }
156 156
                 $new_registration_payment->save();
Please login to merge, or discard this patch.
Indentation   +142 added lines, -142 removed lines patch added patch discarded remove patch
@@ -25,152 +25,152 @@
 block discarded – undo
25 25
  */
26 26
 class CopyRegistrationService extends DomainService
27 27
 {
28
-    /**
29
-     * @param EE_Registration $target_registration
30
-     * @param EE_Registration $registration_to_copy
31
-     * @return bool
32
-     * @throws UnexpectedEntityException
33
-     * @throws EntityNotFoundException
34
-     * @throws RuntimeException
35
-     * @throws EE_Error
36
-     */
37
-    public function copyRegistrationDetails(
38
-        EE_Registration $target_registration,
39
-        EE_Registration $registration_to_copy
40
-    ) {
41
-        // copy attendee
42
-        $target_registration->set_attendee_id($registration_to_copy->attendee_ID());
43
-        $target_registration->updateStatusBasedOnTotalPaid(false);
44
-        $target_registration->save();
45
-        // get answers to previous reg questions
46
-        $answers = $this->reindexAnswersByQuestionId($registration_to_copy->answers());
47
-        // get questions to new event reg form
48
-        $new_event = $target_registration->event();
49
-        $field_name = 'Event_Question_Group.'
50
-            . EEM_Event_Question_Group::instance()->fieldNameForContext(
51
-                $registration_to_copy->is_primary_registrant()
52
-            );
53
-        $question_groups = $new_event->question_groups([
54
-                [
55
-                    'Event.EVT_ID' => $new_event->ID(),
56
-                    $field_name => true,
57
-                ],
58
-                'order_by' => ['QSG_order' => 'ASC'],
59
-            ]);
60
-        foreach ($question_groups as $question_group) {
61
-            if ($question_group instanceof \EE_Question_Group) {
62
-                foreach ($question_group->questions() as $question) {
63
-                    if ($question instanceof EE_Question) {
64
-                        $this->generateNewAnswer(
65
-                            $question,
66
-                            $target_registration,
67
-                            $answers
68
-                        );
69
-                    }
70
-                }
71
-            }
72
-        }
73
-        return true;
74
-    }
28
+	/**
29
+	 * @param EE_Registration $target_registration
30
+	 * @param EE_Registration $registration_to_copy
31
+	 * @return bool
32
+	 * @throws UnexpectedEntityException
33
+	 * @throws EntityNotFoundException
34
+	 * @throws RuntimeException
35
+	 * @throws EE_Error
36
+	 */
37
+	public function copyRegistrationDetails(
38
+		EE_Registration $target_registration,
39
+		EE_Registration $registration_to_copy
40
+	) {
41
+		// copy attendee
42
+		$target_registration->set_attendee_id($registration_to_copy->attendee_ID());
43
+		$target_registration->updateStatusBasedOnTotalPaid(false);
44
+		$target_registration->save();
45
+		// get answers to previous reg questions
46
+		$answers = $this->reindexAnswersByQuestionId($registration_to_copy->answers());
47
+		// get questions to new event reg form
48
+		$new_event = $target_registration->event();
49
+		$field_name = 'Event_Question_Group.'
50
+			. EEM_Event_Question_Group::instance()->fieldNameForContext(
51
+				$registration_to_copy->is_primary_registrant()
52
+			);
53
+		$question_groups = $new_event->question_groups([
54
+				[
55
+					'Event.EVT_ID' => $new_event->ID(),
56
+					$field_name => true,
57
+				],
58
+				'order_by' => ['QSG_order' => 'ASC'],
59
+			]);
60
+		foreach ($question_groups as $question_group) {
61
+			if ($question_group instanceof \EE_Question_Group) {
62
+				foreach ($question_group->questions() as $question) {
63
+					if ($question instanceof EE_Question) {
64
+						$this->generateNewAnswer(
65
+							$question,
66
+							$target_registration,
67
+							$answers
68
+						);
69
+					}
70
+				}
71
+			}
72
+		}
73
+		return true;
74
+	}
75 75
 
76 76
 
77
-    /**
78
-     * @param EE_Answer[] $answers
79
-     * @return array
80
-     * @throws EE_Error
81
-     */
82
-    protected function reindexAnswersByQuestionId(array $answers)
83
-    {
84
-        $reindexed_answers = array();
85
-        foreach ($answers as $answer) {
86
-            if ($answer instanceof EE_Answer) {
87
-                $reindexed_answers[ $answer->question_ID() ] = $answer->value();
88
-            }
89
-        }
90
-        return $reindexed_answers;
91
-    }
77
+	/**
78
+	 * @param EE_Answer[] $answers
79
+	 * @return array
80
+	 * @throws EE_Error
81
+	 */
82
+	protected function reindexAnswersByQuestionId(array $answers)
83
+	{
84
+		$reindexed_answers = array();
85
+		foreach ($answers as $answer) {
86
+			if ($answer instanceof EE_Answer) {
87
+				$reindexed_answers[ $answer->question_ID() ] = $answer->value();
88
+			}
89
+		}
90
+		return $reindexed_answers;
91
+	}
92 92
 
93 93
 
94
-    /**
95
-     * @param EE_Question      $question
96
-     * @param EE_Registration  $registration
97
-     * @param                  $previous_answers
98
-     * @return EE_Answer
99
-     * @throws UnexpectedEntityException
100
-     * @throws EE_Error
101
-     */
102
-    protected function generateNewAnswer(
103
-        EE_Question $question,
104
-        EE_Registration $registration,
105
-        $previous_answers
106
-    ) {
107
-        $old_answer_value = isset($previous_answers[ $question->ID() ])
108
-            ? $previous_answers[ $question->ID() ]
109
-            : '';
110
-        $new_answer = EE_Answer::new_instance(
111
-            array(
112
-                'QST_ID'    => $question->ID(),
113
-                'REG_ID'    => $registration->ID(),
114
-                'ANS_value' => $old_answer_value,
115
-            )
116
-        );
117
-        if (! $new_answer instanceof EE_Answer) {
118
-            throw new UnexpectedEntityException($new_answer, 'EE_Answer');
119
-        }
120
-        $new_answer->save();
121
-        return $new_answer;
122
-    }
94
+	/**
95
+	 * @param EE_Question      $question
96
+	 * @param EE_Registration  $registration
97
+	 * @param                  $previous_answers
98
+	 * @return EE_Answer
99
+	 * @throws UnexpectedEntityException
100
+	 * @throws EE_Error
101
+	 */
102
+	protected function generateNewAnswer(
103
+		EE_Question $question,
104
+		EE_Registration $registration,
105
+		$previous_answers
106
+	) {
107
+		$old_answer_value = isset($previous_answers[ $question->ID() ])
108
+			? $previous_answers[ $question->ID() ]
109
+			: '';
110
+		$new_answer = EE_Answer::new_instance(
111
+			array(
112
+				'QST_ID'    => $question->ID(),
113
+				'REG_ID'    => $registration->ID(),
114
+				'ANS_value' => $old_answer_value,
115
+			)
116
+		);
117
+		if (! $new_answer instanceof EE_Answer) {
118
+			throw new UnexpectedEntityException($new_answer, 'EE_Answer');
119
+		}
120
+		$new_answer->save();
121
+		return $new_answer;
122
+	}
123 123
 
124 124
 
125
-    /**
126
-     * @param EE_Registration $target_registration
127
-     * @param EE_Registration $registration_to_copy
128
-     * @return bool
129
-     * @throws RuntimeException
130
-     * @throws UnexpectedEntityException
131
-     * @throws EE_Error
132
-     */
133
-    public function copyPaymentDetails(
134
-        EE_Registration $target_registration,
135
-        EE_Registration $registration_to_copy
136
-    ) {
137
-        $save = false;
138
-        $previous_registration_payments = $registration_to_copy->registration_payments();
139
-        $new_registration_payment_total = 0;
140
-        $registration_to_copy_total = $registration_to_copy->paid();
141
-        foreach ($previous_registration_payments as $previous_registration_payment) {
142
-            if (
143
-                $previous_registration_payment instanceof EE_Registration_Payment
144
-                && $previous_registration_payment->payment() instanceof EE_Payment
145
-                && $previous_registration_payment->payment()->is_approved()
146
-            ) {
147
-                $payment_amount = $previous_registration_payment->amount();
148
-                $new_registration_payment = EE_Registration_Payment::new_instance(
149
-                    array(
150
-                        'REG_ID'     => $target_registration->ID(),
151
-                        'PAY_ID'     => $previous_registration_payment->payment()->ID(),
152
-                        'RPY_amount' => $payment_amount,
153
-                    )
154
-                );
155
-                if (! $new_registration_payment instanceof EE_Registration_Payment) {
156
-                    throw new UnexpectedEntityException($new_registration_payment, 'EE_Registration_Payment');
157
-                }
158
-                $new_registration_payment->save();
159
-                // if new reg payment is good, then set old reg payment amount to zero
160
-                $previous_registration_payment->set_amount(0);
161
-                $previous_registration_payment->save();
162
-                // now  increment/decrement payment amounts
163
-                $new_registration_payment_total += $payment_amount;
164
-                $registration_to_copy_total -= $payment_amount;
165
-                $save = true;
166
-            }
167
-        }
168
-        if ($save) {
169
-            $target_registration->set_paid($new_registration_payment_total);
170
-            $target_registration->save();
171
-            $registration_to_copy->set_paid($registration_to_copy_total);
172
-            $registration_to_copy->save();
173
-        }
174
-        return true;
175
-    }
125
+	/**
126
+	 * @param EE_Registration $target_registration
127
+	 * @param EE_Registration $registration_to_copy
128
+	 * @return bool
129
+	 * @throws RuntimeException
130
+	 * @throws UnexpectedEntityException
131
+	 * @throws EE_Error
132
+	 */
133
+	public function copyPaymentDetails(
134
+		EE_Registration $target_registration,
135
+		EE_Registration $registration_to_copy
136
+	) {
137
+		$save = false;
138
+		$previous_registration_payments = $registration_to_copy->registration_payments();
139
+		$new_registration_payment_total = 0;
140
+		$registration_to_copy_total = $registration_to_copy->paid();
141
+		foreach ($previous_registration_payments as $previous_registration_payment) {
142
+			if (
143
+				$previous_registration_payment instanceof EE_Registration_Payment
144
+				&& $previous_registration_payment->payment() instanceof EE_Payment
145
+				&& $previous_registration_payment->payment()->is_approved()
146
+			) {
147
+				$payment_amount = $previous_registration_payment->amount();
148
+				$new_registration_payment = EE_Registration_Payment::new_instance(
149
+					array(
150
+						'REG_ID'     => $target_registration->ID(),
151
+						'PAY_ID'     => $previous_registration_payment->payment()->ID(),
152
+						'RPY_amount' => $payment_amount,
153
+					)
154
+				);
155
+				if (! $new_registration_payment instanceof EE_Registration_Payment) {
156
+					throw new UnexpectedEntityException($new_registration_payment, 'EE_Registration_Payment');
157
+				}
158
+				$new_registration_payment->save();
159
+				// if new reg payment is good, then set old reg payment amount to zero
160
+				$previous_registration_payment->set_amount(0);
161
+				$previous_registration_payment->save();
162
+				// now  increment/decrement payment amounts
163
+				$new_registration_payment_total += $payment_amount;
164
+				$registration_to_copy_total -= $payment_amount;
165
+				$save = true;
166
+			}
167
+		}
168
+		if ($save) {
169
+			$target_registration->set_paid($new_registration_payment_total);
170
+			$target_registration->save();
171
+			$registration_to_copy->set_paid($registration_to_copy_total);
172
+			$registration_to_copy->save();
173
+		}
174
+		return true;
175
+	}
176 176
 }
Please login to merge, or discard this patch.
vendor/squizlabs/php_codesniffer/src/Util/Standards.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -71,8 +71,8 @@  discard block
 block discarded – undo
71 71
      * @see    getInstalledStandardPaths()
72 72
      */
73 73
     public static function getInstalledStandardDetails(
74
-        $includeGeneric=false,
75
-        $standardsDir=''
74
+        $includeGeneric = false,
75
+        $standardsDir = ''
76 76
     ) {
77 77
         $rulesets = [];
78 78
 
@@ -156,8 +156,8 @@  discard block
 block discarded – undo
156 156
      * @see    isInstalledStandard()
157 157
      */
158 158
     public static function getInstalledStandards(
159
-        $includeGeneric=false,
160
-        $standardsDir=''
159
+        $includeGeneric = false,
160
+        $standardsDir = ''
161 161
     ) {
162 162
         $installedStandards = [];
163 163
 
Please login to merge, or discard this patch.
Indentation   +314 added lines, -314 removed lines patch added patch discarded remove patch
@@ -15,320 +15,320 @@
 block discarded – undo
15 15
 {
16 16
 
17 17
 
18
-    /**
19
-     * Get a list of paths where standards are installed.
20
-     *
21
-     * Unresolvable relative paths will be excluded from the results.
22
-     *
23
-     * @return array
24
-     */
25
-    public static function getInstalledStandardPaths()
26
-    {
27
-        $ds = DIRECTORY_SEPARATOR;
28
-
29
-        $installedPaths = [dirname(dirname(__DIR__)).$ds.'src'.$ds.'Standards'];
30
-        $configPaths    = Config::getConfigData('installed_paths');
31
-        if ($configPaths !== null) {
32
-            $installedPaths = array_merge($installedPaths, explode(',', $configPaths));
33
-        }
34
-
35
-        $resolvedInstalledPaths = [];
36
-        foreach ($installedPaths as $installedPath) {
37
-            if (substr($installedPath, 0, 1) === '.') {
38
-                $installedPath = Common::realPath(__DIR__.$ds.'..'.$ds.'..'.$ds.$installedPath);
39
-                if ($installedPath === false) {
40
-                    continue;
41
-                }
42
-            }
43
-
44
-            $resolvedInstalledPaths[] = $installedPath;
45
-        }
46
-
47
-        return $resolvedInstalledPaths;
48
-
49
-    }//end getInstalledStandardPaths()
50
-
51
-
52
-    /**
53
-     * Get the details of all coding standards installed.
54
-     *
55
-     * Coding standards are directories located in the
56
-     * CodeSniffer/Standards directory. Valid coding standards
57
-     * include a Sniffs subdirectory.
58
-     *
59
-     * The details returned for each standard are:
60
-     * - path:      the path to the coding standard's main directory
61
-     * - name:      the name of the coding standard, as sourced from the ruleset.xml file
62
-     * - namespace: the namespace used by the coding standard, as sourced from the ruleset.xml file
63
-     *
64
-     * If you only need the paths to the installed standards,
65
-     * use getInstalledStandardPaths() instead as it performs less work to
66
-     * retrieve coding standard names.
67
-     *
68
-     * @param boolean $includeGeneric If true, the special "Generic"
69
-     *                                coding standard will be included
70
-     *                                if installed.
71
-     * @param string  $standardsDir   A specific directory to look for standards
72
-     *                                in. If not specified, PHP_CodeSniffer will
73
-     *                                look in its default locations.
74
-     *
75
-     * @return array
76
-     * @see    getInstalledStandardPaths()
77
-     */
78
-    public static function getInstalledStandardDetails(
79
-        $includeGeneric=false,
80
-        $standardsDir=''
81
-    ) {
82
-        $rulesets = [];
83
-
84
-        if ($standardsDir === '') {
85
-            $installedPaths = self::getInstalledStandardPaths();
86
-        } else {
87
-            $installedPaths = [$standardsDir];
88
-        }
89
-
90
-        foreach ($installedPaths as $standardsDir) {
91
-            // Check if the installed dir is actually a standard itself.
92
-            $csFile = $standardsDir.'/ruleset.xml';
93
-            if (is_file($csFile) === true) {
94
-                $rulesets[] = $csFile;
95
-                continue;
96
-            }
97
-
98
-            if (is_dir($standardsDir) === false) {
99
-                continue;
100
-            }
101
-
102
-            $di = new \DirectoryIterator($standardsDir);
103
-            foreach ($di as $file) {
104
-                if ($file->isDir() === true && $file->isDot() === false) {
105
-                    $filename = $file->getFilename();
106
-
107
-                    // Ignore the special "Generic" standard.
108
-                    if ($includeGeneric === false && $filename === 'Generic') {
109
-                        continue;
110
-                    }
111
-
112
-                    // Valid coding standard dirs include a ruleset.
113
-                    $csFile = $file->getPathname().'/ruleset.xml';
114
-                    if (is_file($csFile) === true) {
115
-                        $rulesets[] = $csFile;
116
-                    }
117
-                }
118
-            }
119
-        }//end foreach
120
-
121
-        $installedStandards = [];
122
-
123
-        foreach ($rulesets as $rulesetPath) {
124
-            $ruleset = @simplexml_load_string(file_get_contents($rulesetPath));
125
-            if ($ruleset === false) {
126
-                continue;
127
-            }
128
-
129
-            $standardName = (string) $ruleset['name'];
130
-            $dirname      = basename(dirname($rulesetPath));
131
-
132
-            if (isset($ruleset['namespace']) === true) {
133
-                $namespace = (string) $ruleset['namespace'];
134
-            } else {
135
-                $namespace = $dirname;
136
-            }
137
-
138
-            $installedStandards[$dirname] = [
139
-                'path'      => dirname($rulesetPath),
140
-                'name'      => $standardName,
141
-                'namespace' => $namespace,
142
-            ];
143
-        }//end foreach
144
-
145
-        return $installedStandards;
146
-
147
-    }//end getInstalledStandardDetails()
148
-
149
-
150
-    /**
151
-     * Get a list of all coding standards installed.
152
-     *
153
-     * Coding standards are directories located in the
154
-     * CodeSniffer/Standards directory. Valid coding standards
155
-     * include a Sniffs subdirectory.
156
-     *
157
-     * @param boolean $includeGeneric If true, the special "Generic"
158
-     *                                coding standard will be included
159
-     *                                if installed.
160
-     * @param string  $standardsDir   A specific directory to look for standards
161
-     *                                in. If not specified, PHP_CodeSniffer will
162
-     *                                look in its default locations.
163
-     *
164
-     * @return array
165
-     * @see    isInstalledStandard()
166
-     */
167
-    public static function getInstalledStandards(
168
-        $includeGeneric=false,
169
-        $standardsDir=''
170
-    ) {
171
-        $installedStandards = [];
172
-
173
-        if ($standardsDir === '') {
174
-            $installedPaths = self::getInstalledStandardPaths();
175
-        } else {
176
-            $installedPaths = [$standardsDir];
177
-        }
178
-
179
-        foreach ($installedPaths as $standardsDir) {
180
-            // Check if the installed dir is actually a standard itself.
181
-            $csFile = $standardsDir.'/ruleset.xml';
182
-            if (is_file($csFile) === true) {
183
-                $installedStandards[] = basename($standardsDir);
184
-                continue;
185
-            }
186
-
187
-            if (is_dir($standardsDir) === false) {
188
-                // Doesn't exist.
189
-                continue;
190
-            }
191
-
192
-            $di = new \DirectoryIterator($standardsDir);
193
-            foreach ($di as $file) {
194
-                if ($file->isDir() === true && $file->isDot() === false) {
195
-                    $filename = $file->getFilename();
196
-
197
-                    // Ignore the special "Generic" standard.
198
-                    if ($includeGeneric === false && $filename === 'Generic') {
199
-                        continue;
200
-                    }
201
-
202
-                    // Valid coding standard dirs include a ruleset.
203
-                    $csFile = $file->getPathname().'/ruleset.xml';
204
-                    if (is_file($csFile) === true) {
205
-                        $installedStandards[] = $filename;
206
-                    }
207
-                }
208
-            }
209
-        }//end foreach
210
-
211
-        return $installedStandards;
212
-
213
-    }//end getInstalledStandards()
214
-
215
-
216
-    /**
217
-     * Determine if a standard is installed.
218
-     *
219
-     * Coding standards are directories located in the
220
-     * CodeSniffer/Standards directory. Valid coding standards
221
-     * include a ruleset.xml file.
222
-     *
223
-     * @param string $standard The name of the coding standard.
224
-     *
225
-     * @return boolean
226
-     * @see    getInstalledStandards()
227
-     */
228
-    public static function isInstalledStandard($standard)
229
-    {
230
-        $path = self::getInstalledStandardPath($standard);
231
-        if ($path !== null && strpos($path, 'ruleset.xml') !== false) {
232
-            return true;
233
-        } else {
234
-            // This could be a custom standard, installed outside our
235
-            // standards directory.
236
-            $standard = Common::realPath($standard);
237
-            if ($standard === false) {
238
-                return false;
239
-            }
240
-
241
-            // Might be an actual ruleset file itUtil.
242
-            // If it has an XML extension, let's at least try it.
243
-            if (is_file($standard) === true
244
-                && (substr(strtolower($standard), -4) === '.xml'
245
-                || substr(strtolower($standard), -9) === '.xml.dist')
246
-            ) {
247
-                return true;
248
-            }
249
-
250
-            // If it is a directory with a ruleset.xml file in it,
251
-            // it is a standard.
252
-            $ruleset = rtrim($standard, ' /\\').DIRECTORY_SEPARATOR.'ruleset.xml';
253
-            if (is_file($ruleset) === true) {
254
-                return true;
255
-            }
256
-        }//end if
257
-
258
-        return false;
259
-
260
-    }//end isInstalledStandard()
261
-
262
-
263
-    /**
264
-     * Return the path of an installed coding standard.
265
-     *
266
-     * Coding standards are directories located in the
267
-     * CodeSniffer/Standards directory. Valid coding standards
268
-     * include a ruleset.xml file.
269
-     *
270
-     * @param string $standard The name of the coding standard.
271
-     *
272
-     * @return string|null
273
-     */
274
-    public static function getInstalledStandardPath($standard)
275
-    {
276
-        if (strpos($standard, '.') !== false) {
277
-            return null;
278
-        }
279
-
280
-        $installedPaths = self::getInstalledStandardPaths();
281
-        foreach ($installedPaths as $installedPath) {
282
-            $standardPath = $installedPath.DIRECTORY_SEPARATOR.$standard;
283
-            if (file_exists($standardPath) === false) {
284
-                if (basename($installedPath) !== $standard) {
285
-                    continue;
286
-                }
287
-
288
-                $standardPath = $installedPath;
289
-            }
290
-
291
-            $path = Common::realpath($standardPath.DIRECTORY_SEPARATOR.'ruleset.xml');
292
-
293
-            if ($path !== false && is_file($path) === true) {
294
-                return $path;
295
-            } else if (Common::isPharFile($standardPath) === true) {
296
-                $path = Common::realpath($standardPath);
297
-                if ($path !== false) {
298
-                    return $path;
299
-                }
300
-            }
301
-        }//end foreach
302
-
303
-        return null;
304
-
305
-    }//end getInstalledStandardPath()
306
-
307
-
308
-    /**
309
-     * Prints out a list of installed coding standards.
310
-     *
311
-     * @return void
312
-     */
313
-    public static function printInstalledStandards()
314
-    {
315
-        $installedStandards = self::getInstalledStandards();
316
-        $numStandards       = count($installedStandards);
317
-
318
-        if ($numStandards === 0) {
319
-            echo 'No coding standards are installed.'.PHP_EOL;
320
-        } else {
321
-            $lastStandard = array_pop($installedStandards);
322
-            if ($numStandards === 1) {
323
-                echo "The only coding standard installed is $lastStandard".PHP_EOL;
324
-            } else {
325
-                $standardList  = implode(', ', $installedStandards);
326
-                $standardList .= ' and '.$lastStandard;
327
-                echo 'The installed coding standards are '.$standardList.PHP_EOL;
328
-            }
329
-        }
330
-
331
-    }//end printInstalledStandards()
18
+	/**
19
+	 * Get a list of paths where standards are installed.
20
+	 *
21
+	 * Unresolvable relative paths will be excluded from the results.
22
+	 *
23
+	 * @return array
24
+	 */
25
+	public static function getInstalledStandardPaths()
26
+	{
27
+		$ds = DIRECTORY_SEPARATOR;
28
+
29
+		$installedPaths = [dirname(dirname(__DIR__)).$ds.'src'.$ds.'Standards'];
30
+		$configPaths    = Config::getConfigData('installed_paths');
31
+		if ($configPaths !== null) {
32
+			$installedPaths = array_merge($installedPaths, explode(',', $configPaths));
33
+		}
34
+
35
+		$resolvedInstalledPaths = [];
36
+		foreach ($installedPaths as $installedPath) {
37
+			if (substr($installedPath, 0, 1) === '.') {
38
+				$installedPath = Common::realPath(__DIR__.$ds.'..'.$ds.'..'.$ds.$installedPath);
39
+				if ($installedPath === false) {
40
+					continue;
41
+				}
42
+			}
43
+
44
+			$resolvedInstalledPaths[] = $installedPath;
45
+		}
46
+
47
+		return $resolvedInstalledPaths;
48
+
49
+	}//end getInstalledStandardPaths()
50
+
51
+
52
+	/**
53
+	 * Get the details of all coding standards installed.
54
+	 *
55
+	 * Coding standards are directories located in the
56
+	 * CodeSniffer/Standards directory. Valid coding standards
57
+	 * include a Sniffs subdirectory.
58
+	 *
59
+	 * The details returned for each standard are:
60
+	 * - path:      the path to the coding standard's main directory
61
+	 * - name:      the name of the coding standard, as sourced from the ruleset.xml file
62
+	 * - namespace: the namespace used by the coding standard, as sourced from the ruleset.xml file
63
+	 *
64
+	 * If you only need the paths to the installed standards,
65
+	 * use getInstalledStandardPaths() instead as it performs less work to
66
+	 * retrieve coding standard names.
67
+	 *
68
+	 * @param boolean $includeGeneric If true, the special "Generic"
69
+	 *                                coding standard will be included
70
+	 *                                if installed.
71
+	 * @param string  $standardsDir   A specific directory to look for standards
72
+	 *                                in. If not specified, PHP_CodeSniffer will
73
+	 *                                look in its default locations.
74
+	 *
75
+	 * @return array
76
+	 * @see    getInstalledStandardPaths()
77
+	 */
78
+	public static function getInstalledStandardDetails(
79
+		$includeGeneric=false,
80
+		$standardsDir=''
81
+	) {
82
+		$rulesets = [];
83
+
84
+		if ($standardsDir === '') {
85
+			$installedPaths = self::getInstalledStandardPaths();
86
+		} else {
87
+			$installedPaths = [$standardsDir];
88
+		}
89
+
90
+		foreach ($installedPaths as $standardsDir) {
91
+			// Check if the installed dir is actually a standard itself.
92
+			$csFile = $standardsDir.'/ruleset.xml';
93
+			if (is_file($csFile) === true) {
94
+				$rulesets[] = $csFile;
95
+				continue;
96
+			}
97
+
98
+			if (is_dir($standardsDir) === false) {
99
+				continue;
100
+			}
101
+
102
+			$di = new \DirectoryIterator($standardsDir);
103
+			foreach ($di as $file) {
104
+				if ($file->isDir() === true && $file->isDot() === false) {
105
+					$filename = $file->getFilename();
106
+
107
+					// Ignore the special "Generic" standard.
108
+					if ($includeGeneric === false && $filename === 'Generic') {
109
+						continue;
110
+					}
111
+
112
+					// Valid coding standard dirs include a ruleset.
113
+					$csFile = $file->getPathname().'/ruleset.xml';
114
+					if (is_file($csFile) === true) {
115
+						$rulesets[] = $csFile;
116
+					}
117
+				}
118
+			}
119
+		}//end foreach
120
+
121
+		$installedStandards = [];
122
+
123
+		foreach ($rulesets as $rulesetPath) {
124
+			$ruleset = @simplexml_load_string(file_get_contents($rulesetPath));
125
+			if ($ruleset === false) {
126
+				continue;
127
+			}
128
+
129
+			$standardName = (string) $ruleset['name'];
130
+			$dirname      = basename(dirname($rulesetPath));
131
+
132
+			if (isset($ruleset['namespace']) === true) {
133
+				$namespace = (string) $ruleset['namespace'];
134
+			} else {
135
+				$namespace = $dirname;
136
+			}
137
+
138
+			$installedStandards[$dirname] = [
139
+				'path'      => dirname($rulesetPath),
140
+				'name'      => $standardName,
141
+				'namespace' => $namespace,
142
+			];
143
+		}//end foreach
144
+
145
+		return $installedStandards;
146
+
147
+	}//end getInstalledStandardDetails()
148
+
149
+
150
+	/**
151
+	 * Get a list of all coding standards installed.
152
+	 *
153
+	 * Coding standards are directories located in the
154
+	 * CodeSniffer/Standards directory. Valid coding standards
155
+	 * include a Sniffs subdirectory.
156
+	 *
157
+	 * @param boolean $includeGeneric If true, the special "Generic"
158
+	 *                                coding standard will be included
159
+	 *                                if installed.
160
+	 * @param string  $standardsDir   A specific directory to look for standards
161
+	 *                                in. If not specified, PHP_CodeSniffer will
162
+	 *                                look in its default locations.
163
+	 *
164
+	 * @return array
165
+	 * @see    isInstalledStandard()
166
+	 */
167
+	public static function getInstalledStandards(
168
+		$includeGeneric=false,
169
+		$standardsDir=''
170
+	) {
171
+		$installedStandards = [];
172
+
173
+		if ($standardsDir === '') {
174
+			$installedPaths = self::getInstalledStandardPaths();
175
+		} else {
176
+			$installedPaths = [$standardsDir];
177
+		}
178
+
179
+		foreach ($installedPaths as $standardsDir) {
180
+			// Check if the installed dir is actually a standard itself.
181
+			$csFile = $standardsDir.'/ruleset.xml';
182
+			if (is_file($csFile) === true) {
183
+				$installedStandards[] = basename($standardsDir);
184
+				continue;
185
+			}
186
+
187
+			if (is_dir($standardsDir) === false) {
188
+				// Doesn't exist.
189
+				continue;
190
+			}
191
+
192
+			$di = new \DirectoryIterator($standardsDir);
193
+			foreach ($di as $file) {
194
+				if ($file->isDir() === true && $file->isDot() === false) {
195
+					$filename = $file->getFilename();
196
+
197
+					// Ignore the special "Generic" standard.
198
+					if ($includeGeneric === false && $filename === 'Generic') {
199
+						continue;
200
+					}
201
+
202
+					// Valid coding standard dirs include a ruleset.
203
+					$csFile = $file->getPathname().'/ruleset.xml';
204
+					if (is_file($csFile) === true) {
205
+						$installedStandards[] = $filename;
206
+					}
207
+				}
208
+			}
209
+		}//end foreach
210
+
211
+		return $installedStandards;
212
+
213
+	}//end getInstalledStandards()
214
+
215
+
216
+	/**
217
+	 * Determine if a standard is installed.
218
+	 *
219
+	 * Coding standards are directories located in the
220
+	 * CodeSniffer/Standards directory. Valid coding standards
221
+	 * include a ruleset.xml file.
222
+	 *
223
+	 * @param string $standard The name of the coding standard.
224
+	 *
225
+	 * @return boolean
226
+	 * @see    getInstalledStandards()
227
+	 */
228
+	public static function isInstalledStandard($standard)
229
+	{
230
+		$path = self::getInstalledStandardPath($standard);
231
+		if ($path !== null && strpos($path, 'ruleset.xml') !== false) {
232
+			return true;
233
+		} else {
234
+			// This could be a custom standard, installed outside our
235
+			// standards directory.
236
+			$standard = Common::realPath($standard);
237
+			if ($standard === false) {
238
+				return false;
239
+			}
240
+
241
+			// Might be an actual ruleset file itUtil.
242
+			// If it has an XML extension, let's at least try it.
243
+			if (is_file($standard) === true
244
+				&& (substr(strtolower($standard), -4) === '.xml'
245
+				|| substr(strtolower($standard), -9) === '.xml.dist')
246
+			) {
247
+				return true;
248
+			}
249
+
250
+			// If it is a directory with a ruleset.xml file in it,
251
+			// it is a standard.
252
+			$ruleset = rtrim($standard, ' /\\').DIRECTORY_SEPARATOR.'ruleset.xml';
253
+			if (is_file($ruleset) === true) {
254
+				return true;
255
+			}
256
+		}//end if
257
+
258
+		return false;
259
+
260
+	}//end isInstalledStandard()
261
+
262
+
263
+	/**
264
+	 * Return the path of an installed coding standard.
265
+	 *
266
+	 * Coding standards are directories located in the
267
+	 * CodeSniffer/Standards directory. Valid coding standards
268
+	 * include a ruleset.xml file.
269
+	 *
270
+	 * @param string $standard The name of the coding standard.
271
+	 *
272
+	 * @return string|null
273
+	 */
274
+	public static function getInstalledStandardPath($standard)
275
+	{
276
+		if (strpos($standard, '.') !== false) {
277
+			return null;
278
+		}
279
+
280
+		$installedPaths = self::getInstalledStandardPaths();
281
+		foreach ($installedPaths as $installedPath) {
282
+			$standardPath = $installedPath.DIRECTORY_SEPARATOR.$standard;
283
+			if (file_exists($standardPath) === false) {
284
+				if (basename($installedPath) !== $standard) {
285
+					continue;
286
+				}
287
+
288
+				$standardPath = $installedPath;
289
+			}
290
+
291
+			$path = Common::realpath($standardPath.DIRECTORY_SEPARATOR.'ruleset.xml');
292
+
293
+			if ($path !== false && is_file($path) === true) {
294
+				return $path;
295
+			} else if (Common::isPharFile($standardPath) === true) {
296
+				$path = Common::realpath($standardPath);
297
+				if ($path !== false) {
298
+					return $path;
299
+				}
300
+			}
301
+		}//end foreach
302
+
303
+		return null;
304
+
305
+	}//end getInstalledStandardPath()
306
+
307
+
308
+	/**
309
+	 * Prints out a list of installed coding standards.
310
+	 *
311
+	 * @return void
312
+	 */
313
+	public static function printInstalledStandards()
314
+	{
315
+		$installedStandards = self::getInstalledStandards();
316
+		$numStandards       = count($installedStandards);
317
+
318
+		if ($numStandards === 0) {
319
+			echo 'No coding standards are installed.'.PHP_EOL;
320
+		} else {
321
+			$lastStandard = array_pop($installedStandards);
322
+			if ($numStandards === 1) {
323
+				echo "The only coding standard installed is $lastStandard".PHP_EOL;
324
+			} else {
325
+				$standardList  = implode(', ', $installedStandards);
326
+				$standardList .= ' and '.$lastStandard;
327
+				echo 'The installed coding standards are '.$standardList.PHP_EOL;
328
+			}
329
+		}
330
+
331
+	}//end printInstalledStandards()
332 332
 
333 333
 
334 334
 }//end class
Please login to merge, or discard this patch.