Completed
Branch FET-9856-direct-instantiation (95869d)
by
unknown
112:23 queued 94:16
created
core/EE_Dependency_Map.core.php 2 patches
Spacing   +22 added lines, -22 removed lines patch added patch discarded remove patch
@@ -3,7 +3,7 @@  discard block
 block discarded – undo
3 3
 use EventEspresso\core\exceptions\InvalidInterfaceException;
4 4
 use EventEspresso\core\services\loaders\LoaderInterface;
5 5
 
6
-if (! defined('EVENT_ESPRESSO_VERSION')) {
6
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
7 7
     exit('No direct script access allowed');
8 8
 }
9 9
 
@@ -129,7 +129,7 @@  discard block
 block discarded – undo
129 129
     public static function instance(EE_Request $request = null, EE_Response $response = null)
130 130
     {
131 131
         // check if class object is instantiated, and instantiated properly
132
-        if (! self::$_instance instanceof EE_Dependency_Map) {
132
+        if ( ! self::$_instance instanceof EE_Dependency_Map) {
133 133
             self::$_instance = new EE_Dependency_Map($request, $response);
134 134
         }
135 135
         return self::$_instance;
@@ -183,16 +183,16 @@  discard block
 block discarded – undo
183 183
         $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
184 184
     ) {
185 185
         $registered = false;
186
-        if (empty(self::$_instance->_dependency_map[ $class ])) {
187
-            self::$_instance->_dependency_map[ $class ] = array();
186
+        if (empty(self::$_instance->_dependency_map[$class])) {
187
+            self::$_instance->_dependency_map[$class] = array();
188 188
         }
189 189
         // we need to make sure that any aliases used when registering a dependency
190 190
         // get resolved to the correct class name
191
-        foreach ((array)$dependencies as $dependency => $load_source) {
191
+        foreach ((array) $dependencies as $dependency => $load_source) {
192 192
             $alias = self::$_instance->get_alias($dependency);
193 193
             if (
194 194
                 $overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
195
-                || ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
195
+                || ! isset(self::$_instance->_dependency_map[$class][$alias])
196 196
             ) {
197 197
                 unset($dependencies[$dependency]);
198 198
                 $dependencies[$alias] = $load_source;
@@ -205,13 +205,13 @@  discard block
 block discarded – undo
205 205
         // ie: with A = B + C, entries in B take precedence over duplicate entries in C
206 206
         // Union is way faster than array_merge() but should be used with caution...
207 207
         // especially with numerically indexed arrays
208
-        $dependencies += self::$_instance->_dependency_map[ $class ];
208
+        $dependencies += self::$_instance->_dependency_map[$class];
209 209
         // now we need to ensure that the resulting dependencies
210 210
         // array only has the entries that are required for the class
211 211
         // so first count how many dependencies were originally registered for the class
212
-        $dependency_count = count(self::$_instance->_dependency_map[ $class ]);
212
+        $dependency_count = count(self::$_instance->_dependency_map[$class]);
213 213
         // if that count is non-zero (meaning dependencies were already registered)
214
-        self::$_instance->_dependency_map[ $class ] = $dependency_count
214
+        self::$_instance->_dependency_map[$class] = $dependency_count
215 215
             // then truncate the  final array to match that count
216 216
             ? array_slice($dependencies, 0, $dependency_count)
217 217
             // otherwise just take the incoming array because nothing previously existed
@@ -253,7 +253,7 @@  discard block
 block discarded – undo
253 253
             );
254 254
         }
255 255
         $class_name = self::$_instance->get_alias($class_name);
256
-        if (! isset(self::$_instance->_class_loaders[$class_name])) {
256
+        if ( ! isset(self::$_instance->_class_loaders[$class_name])) {
257 257
             self::$_instance->_class_loaders[$class_name] = $loader;
258 258
             return true;
259 259
         }
@@ -326,7 +326,7 @@  discard block
 block discarded – undo
326 326
     public function class_loader($class_name)
327 327
     {
328 328
         // don't use loaders for FQCNs
329
-        if(strpos($class_name, '\\') !== false){
329
+        if (strpos($class_name, '\\') !== false) {
330 330
             return '';
331 331
         }
332 332
         $class_name = $this->get_alias($class_name);
@@ -355,7 +355,7 @@  discard block
 block discarded – undo
355 355
     public function add_alias($class_name, $alias, $for_class = '')
356 356
     {
357 357
         if ($for_class !== '') {
358
-            if (! isset($this->_aliases[$for_class])) {
358
+            if ( ! isset($this->_aliases[$for_class])) {
359 359
                 $this->_aliases[$for_class] = array();
360 360
             }
361 361
             $this->_aliases[$for_class][$class_name] = $alias;
@@ -401,10 +401,10 @@  discard block
 block discarded – undo
401 401
      */
402 402
     public function get_alias($class_name = '', $for_class = '')
403 403
     {
404
-        if (! $this->has_alias($class_name, $for_class)) {
404
+        if ( ! $this->has_alias($class_name, $for_class)) {
405 405
             return $class_name;
406 406
         }
407
-        if ($for_class !== '' && isset($this->_aliases[ $for_class ][ $class_name ])) {
407
+        if ($for_class !== '' && isset($this->_aliases[$for_class][$class_name])) {
408 408
             return $this->get_alias($this->_aliases[$for_class][$class_name], $for_class);
409 409
         }
410 410
         return $this->get_alias($this->_aliases[$class_name]);
@@ -641,10 +641,10 @@  discard block
 block discarded – undo
641 641
             'EE_Front_Controller'                  => 'load_core',
642 642
             'EE_Module_Request_Router'             => 'load_core',
643 643
             'EE_Registry'                          => 'load_core',
644
-            'EE_Request'                           => function () use (&$request) {
644
+            'EE_Request'                           => function() use (&$request) {
645 645
                 return $request;
646 646
             },
647
-            'EE_Response'                          => function () use (&$response) {
647
+            'EE_Response'                          => function() use (&$response) {
648 648
                 return $response;
649 649
             },
650 650
             'EE_Request_Handler'                   => 'load_core',
@@ -663,7 +663,7 @@  discard block
 block discarded – undo
663 663
             'EE_Messages_Queue'                    => 'load_lib',
664 664
             'EE_Messages_Data_Handler_Collection'  => 'load_lib',
665 665
             'EE_Message_Template_Group_Collection' => 'load_lib',
666
-            'EE_Messages_Generator'                => function () {
666
+            'EE_Messages_Generator'                => function() {
667 667
                 return EE_Registry::instance()->load_lib(
668 668
                     'Messages_Generator',
669 669
                     array(),
@@ -671,7 +671,7 @@  discard block
 block discarded – undo
671 671
                     false
672 672
                 );
673 673
             },
674
-            'EE_Messages_Template_Defaults'        => function ($arguments = array()) {
674
+            'EE_Messages_Template_Defaults'        => function($arguments = array()) {
675 675
                 return EE_Registry::instance()->load_lib(
676 676
                     'Messages_Template_Defaults',
677 677
                     $arguments,
@@ -683,19 +683,19 @@  discard block
 block discarded – undo
683 683
             'EEM_Message_Template_Group'           => 'load_model',
684 684
             'EEM_Message_Template'                 => 'load_model',
685 685
             //load_helper
686
-            'EEH_Parse_Shortcodes'                 => function () {
686
+            'EEH_Parse_Shortcodes'                 => function() {
687 687
                 if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
688 688
                     return new EEH_Parse_Shortcodes();
689 689
                 }
690 690
                 return null;
691 691
             },
692
-            'EE_Template_Config'                   => function () {
692
+            'EE_Template_Config'                   => function() {
693 693
                 return EE_Config::instance()->template_settings;
694 694
             },
695
-            'EE_Currency_Config'                   => function () {
695
+            'EE_Currency_Config'                   => function() {
696 696
                 return EE_Config::instance()->currency;
697 697
             },
698
-            'EventEspresso\core\services\loaders\Loader' => function () use (&$loader) {
698
+            'EventEspresso\core\services\loaders\Loader' => function() use (&$loader) {
699 699
                 return $loader;
700 700
             },
701 701
         );
Please login to merge, or discard this patch.
Indentation   +726 added lines, -726 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
 use EventEspresso\core\services\loaders\LoaderInterface;
5 5
 
6 6
 if (! defined('EVENT_ESPRESSO_VERSION')) {
7
-    exit('No direct script access allowed');
7
+	exit('No direct script access allowed');
8 8
 }
9 9
 
10 10
 
@@ -21,731 +21,731 @@  discard block
 block discarded – undo
21 21
 class EE_Dependency_Map
22 22
 {
23 23
 
24
-    /**
25
-     * This means that the requested class dependency is not present in the dependency map
26
-     */
27
-    const not_registered = 0;
28
-
29
-    /**
30
-     * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
31
-     */
32
-    const load_new_object = 1;
33
-
34
-    /**
35
-     * This instructs class loaders to return a previously instantiated and cached object for the requested class.
36
-     * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
37
-     */
38
-    const load_from_cache = 2;
39
-
40
-    /**
41
-     * When registering a dependency,
42
-     * this indicates to keep any existing dependencies that already exist,
43
-     * and simply discard any new dependencies declared in the incoming data
44
-     */
45
-    const KEEP_EXISTING_DEPENDENCIES = 0;
46
-
47
-    /**
48
-     * When registering a dependency,
49
-     * this indicates to overwrite any existing dependencies that already exist using the incoming data
50
-     */
51
-    const OVERWRITE_DEPENDENCIES = 1;
52
-
53
-
54
-
55
-    /**
56
-     * @type EE_Dependency_Map $_instance
57
-     */
58
-    protected static $_instance;
59
-
60
-    /**
61
-     * @type EE_Request $request
62
-     */
63
-    protected $_request;
64
-
65
-    /**
66
-     * @type EE_Response $response
67
-     */
68
-    protected $_response;
69
-
70
-    /**
71
-     * @type LoaderInterface $loader
72
-     */
73
-    protected $loader;
74
-
75
-    /**
76
-     * @type array $_dependency_map
77
-     */
78
-    protected $_dependency_map = array();
79
-
80
-    /**
81
-     * @type array $_class_loaders
82
-     */
83
-    protected $_class_loaders = array();
84
-
85
-    /**
86
-     * @type array $_aliases
87
-     */
88
-    protected $_aliases = array();
89
-
90
-
91
-
92
-    /**
93
-     * EE_Dependency_Map constructor.
94
-     *
95
-     * @param EE_Request  $request
96
-     * @param EE_Response $response
97
-     */
98
-    protected function __construct(EE_Request $request, EE_Response $response)
99
-    {
100
-        $this->_request = $request;
101
-        $this->_response = $response;
102
-        add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
103
-        do_action('EE_Dependency_Map____construct');
104
-    }
105
-
106
-
107
-
108
-    /**
109
-     * @throws InvalidDataTypeException
110
-     * @throws InvalidInterfaceException
111
-     * @throws InvalidArgumentException
112
-     */
113
-    public function initialize()
114
-    {
115
-        $this->_register_core_dependencies();
116
-        $this->_register_core_class_loaders();
117
-        $this->_register_core_aliases();
118
-    }
119
-
120
-
121
-
122
-    /**
123
-     * @singleton method used to instantiate class object
124
-     * @access    public
125
-     * @param EE_Request  $request
126
-     * @param EE_Response $response
127
-     * @return EE_Dependency_Map
128
-     */
129
-    public static function instance(EE_Request $request = null, EE_Response $response = null)
130
-    {
131
-        // check if class object is instantiated, and instantiated properly
132
-        if (! self::$_instance instanceof EE_Dependency_Map) {
133
-            self::$_instance = new EE_Dependency_Map($request, $response);
134
-        }
135
-        return self::$_instance;
136
-    }
137
-
138
-
139
-
140
-    /**
141
-     * @param LoaderInterface $loader
142
-     */
143
-    public function setLoader(LoaderInterface $loader)
144
-    {
145
-        $this->loader = $loader;
146
-    }
147
-
148
-
149
-
150
-    /**
151
-     * @param string $class
152
-     * @param array  $dependencies
153
-     * @param int    $overwrite
154
-     * @return bool
155
-     */
156
-    public static function register_dependencies(
157
-        $class,
158
-        array $dependencies,
159
-        $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
160
-    ) {
161
-        return self::$_instance->registerDependencies($class, $dependencies, $overwrite);
162
-    }
163
-
164
-
165
-
166
-    /**
167
-     * Assigns an array of class names and corresponding load sources (new or cached)
168
-     * to the class specified by the first parameter.
169
-     * IMPORTANT !!!
170
-     * The order of elements in the incoming $dependencies array MUST match
171
-     * the order of the constructor parameters for the class in question.
172
-     * This is especially important when overriding any existing dependencies that are registered.
173
-     * the third parameter controls whether any duplicate dependencies are overwritten or not.
174
-     *
175
-     * @param string $class
176
-     * @param array  $dependencies
177
-     * @param int    $overwrite
178
-     * @return bool
179
-     */
180
-    public function registerDependencies(
181
-        $class,
182
-        array $dependencies,
183
-        $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
184
-    ) {
185
-        $registered = false;
186
-        if (empty(self::$_instance->_dependency_map[ $class ])) {
187
-            self::$_instance->_dependency_map[ $class ] = array();
188
-        }
189
-        // we need to make sure that any aliases used when registering a dependency
190
-        // get resolved to the correct class name
191
-        foreach ((array)$dependencies as $dependency => $load_source) {
192
-            $alias = self::$_instance->get_alias($dependency);
193
-            if (
194
-                $overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
195
-                || ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
196
-            ) {
197
-                unset($dependencies[$dependency]);
198
-                $dependencies[$alias] = $load_source;
199
-                $registered = true;
200
-            }
201
-        }
202
-        // now add our two lists of dependencies together.
203
-        // using Union (+=) favours the arrays in precedence from left to right,
204
-        // so $dependencies is NOT overwritten because it is listed first
205
-        // ie: with A = B + C, entries in B take precedence over duplicate entries in C
206
-        // Union is way faster than array_merge() but should be used with caution...
207
-        // especially with numerically indexed arrays
208
-        $dependencies += self::$_instance->_dependency_map[ $class ];
209
-        // now we need to ensure that the resulting dependencies
210
-        // array only has the entries that are required for the class
211
-        // so first count how many dependencies were originally registered for the class
212
-        $dependency_count = count(self::$_instance->_dependency_map[ $class ]);
213
-        // if that count is non-zero (meaning dependencies were already registered)
214
-        self::$_instance->_dependency_map[ $class ] = $dependency_count
215
-            // then truncate the  final array to match that count
216
-            ? array_slice($dependencies, 0, $dependency_count)
217
-            // otherwise just take the incoming array because nothing previously existed
218
-            : $dependencies;
219
-        return $registered;
220
-    }
221
-
222
-
223
-
224
-    /**
225
-     * @param string $class_name
226
-     * @param string $loader
227
-     * @return bool
228
-     * @throws DomainException
229
-     */
230
-    public static function register_class_loader($class_name, $loader = 'load_core')
231
-    {
232
-        if (strpos($class_name, '\\') !== false) {
233
-            throw new DomainException(
234
-                esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
235
-            );
236
-        }
237
-        // check that loader is callable or method starts with "load_" and exists in EE_Registry
238
-        if (
239
-            ! is_callable($loader)
240
-            && (
241
-                strpos($loader, 'load_') !== 0
242
-                || ! method_exists('EE_Registry', $loader)
243
-            )
244
-        ) {
245
-            throw new DomainException(
246
-                sprintf(
247
-                    esc_html__(
248
-                        '"%1$s" is not a valid loader method on EE_Registry.',
249
-                        'event_espresso'
250
-                    ),
251
-                    $loader
252
-                )
253
-            );
254
-        }
255
-        $class_name = self::$_instance->get_alias($class_name);
256
-        if (! isset(self::$_instance->_class_loaders[$class_name])) {
257
-            self::$_instance->_class_loaders[$class_name] = $loader;
258
-            return true;
259
-        }
260
-        return false;
261
-    }
262
-
263
-
264
-
265
-    /**
266
-     * @return array
267
-     */
268
-    public function dependency_map()
269
-    {
270
-        return $this->_dependency_map;
271
-    }
272
-
273
-
274
-
275
-    /**
276
-     * returns TRUE if dependency map contains a listing for the provided class name
277
-     *
278
-     * @param string $class_name
279
-     * @return boolean
280
-     */
281
-    public function has($class_name = '')
282
-    {
283
-        return isset($this->_dependency_map[$class_name]) ? true : false;
284
-    }
285
-
286
-
287
-
288
-    /**
289
-     * returns TRUE if dependency map contains a listing for the provided class name AND dependency
290
-     *
291
-     * @param string $class_name
292
-     * @param string $dependency
293
-     * @return bool
294
-     */
295
-    public function has_dependency_for_class($class_name = '', $dependency = '')
296
-    {
297
-        $dependency = $this->get_alias($dependency);
298
-        return isset($this->_dependency_map[$class_name], $this->_dependency_map[$class_name][$dependency])
299
-            ? true
300
-            : false;
301
-    }
302
-
303
-
304
-
305
-    /**
306
-     * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
307
-     *
308
-     * @param string $class_name
309
-     * @param string $dependency
310
-     * @return int
311
-     */
312
-    public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
313
-    {
314
-        $dependency = $this->get_alias($dependency);
315
-        return $this->has_dependency_for_class($class_name, $dependency)
316
-            ? $this->_dependency_map[$class_name][$dependency]
317
-            : EE_Dependency_Map::not_registered;
318
-    }
319
-
320
-
321
-
322
-    /**
323
-     * @param string $class_name
324
-     * @return string | Closure
325
-     */
326
-    public function class_loader($class_name)
327
-    {
328
-        // don't use loaders for FQCNs
329
-        if(strpos($class_name, '\\') !== false){
330
-            return '';
331
-        }
332
-        $class_name = $this->get_alias($class_name);
333
-        return isset($this->_class_loaders[$class_name]) ? $this->_class_loaders[$class_name] : '';
334
-    }
335
-
336
-
337
-
338
-    /**
339
-     * @return array
340
-     */
341
-    public function class_loaders()
342
-    {
343
-        return $this->_class_loaders;
344
-    }
345
-
346
-
347
-
348
-    /**
349
-     * adds an alias for a classname
350
-     *
351
-     * @param string $class_name the class name that should be used (concrete class to replace interface)
352
-     * @param string $alias      the class name that would be type hinted for (abstract parent or interface)
353
-     * @param string $for_class  the class that has the dependency (is type hinting for the interface)
354
-     */
355
-    public function add_alias($class_name, $alias, $for_class = '')
356
-    {
357
-        if ($for_class !== '') {
358
-            if (! isset($this->_aliases[$for_class])) {
359
-                $this->_aliases[$for_class] = array();
360
-            }
361
-            $this->_aliases[$for_class][$class_name] = $alias;
362
-        }
363
-        $this->_aliases[$class_name] = $alias;
364
-    }
365
-
366
-
367
-
368
-    /**
369
-     * returns TRUE if the provided class name has an alias
370
-     *
371
-     * @param string $class_name
372
-     * @param string $for_class
373
-     * @return bool
374
-     */
375
-    public function has_alias($class_name = '', $for_class = '')
376
-    {
377
-        return isset($this->_aliases[$for_class], $this->_aliases[$for_class][$class_name])
378
-               || (
379
-                   isset($this->_aliases[$class_name])
380
-                   && ! is_array($this->_aliases[$class_name])
381
-               );
382
-    }
383
-
384
-
385
-
386
-    /**
387
-     * returns alias for class name if one exists, otherwise returns the original classname
388
-     * functions recursively, so that multiple aliases can be used to drill down to a classname
389
-     *  for example:
390
-     *      if the following two entries were added to the _aliases array:
391
-     *          array(
392
-     *              'interface_alias'           => 'some\namespace\interface'
393
-     *              'some\namespace\interface'  => 'some\namespace\classname'
394
-     *          )
395
-     *      then one could use EE_Registry::instance()->create( 'interface_alias' )
396
-     *      to load an instance of 'some\namespace\classname'
397
-     *
398
-     * @param string $class_name
399
-     * @param string $for_class
400
-     * @return string
401
-     */
402
-    public function get_alias($class_name = '', $for_class = '')
403
-    {
404
-        if (! $this->has_alias($class_name, $for_class)) {
405
-            return $class_name;
406
-        }
407
-        if ($for_class !== '' && isset($this->_aliases[ $for_class ][ $class_name ])) {
408
-            return $this->get_alias($this->_aliases[$for_class][$class_name], $for_class);
409
-        }
410
-        return $this->get_alias($this->_aliases[$class_name]);
411
-    }
412
-
413
-
414
-
415
-    /**
416
-     * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
417
-     * if one exists, or whether a new object should be generated every time the requested class is loaded.
418
-     * This is done by using the following class constants:
419
-     *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
420
-     *        EE_Dependency_Map::load_new_object - generates a new object every time
421
-     */
422
-    protected function _register_core_dependencies()
423
-    {
424
-        $this->_dependency_map = array(
425
-            'EE_Request_Handler'                                                                                          => array(
426
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
427
-            ),
428
-            'EE_System'                                                                                                   => array(
429
-                'EE_Registry' => EE_Dependency_Map::load_from_cache,
430
-            ),
431
-            'EE_Session'                                                                                                  => array(
432
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
433
-                'EE_Encryption'                                           => EE_Dependency_Map::load_from_cache,
434
-            ),
435
-            'EE_Cart'                                                                                                     => array(
436
-                'EE_Session' => EE_Dependency_Map::load_from_cache,
437
-            ),
438
-            'EE_Front_Controller'                                                                                         => array(
439
-                'EE_Registry'              => EE_Dependency_Map::load_from_cache,
440
-                'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
441
-                'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
442
-            ),
443
-            'EE_Messenger_Collection_Loader'                                                                              => array(
444
-                'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
445
-            ),
446
-            'EE_Message_Type_Collection_Loader'                                                                           => array(
447
-                'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
448
-            ),
449
-            'EE_Message_Resource_Manager'                                                                                 => array(
450
-                'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
451
-                'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
452
-                'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
453
-            ),
454
-            'EE_Message_Factory'                                                                                          => array(
455
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
456
-            ),
457
-            'EE_messages'                                                                                                 => array(
458
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
459
-            ),
460
-            'EE_Messages_Generator'                                                                                       => array(
461
-                'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
462
-                'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
463
-                'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
464
-                'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
465
-            ),
466
-            'EE_Messages_Processor'                                                                                       => array(
467
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
468
-            ),
469
-            'EE_Messages_Queue'                                                                                           => array(
470
-                'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
471
-            ),
472
-            'EE_Messages_Template_Defaults'                                                                               => array(
473
-                'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
474
-                'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
475
-            ),
476
-            'EE_Message_To_Generate_From_Request'                                                                         => array(
477
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
478
-                'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
479
-            ),
480
-            'EventEspresso\core\services\commands\CommandBus'                                                             => array(
481
-                'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
482
-            ),
483
-            'EventEspresso\services\commands\CommandHandler'                                                              => array(
484
-                'EE_Registry'         => EE_Dependency_Map::load_from_cache,
485
-                'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
486
-            ),
487
-            'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
488
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
489
-            ),
490
-            'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
491
-                'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
492
-                'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
493
-            ),
494
-            'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
495
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
496
-            ),
497
-            'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
498
-                'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
499
-            ),
500
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
501
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
502
-            ),
503
-            'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
504
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
505
-            ),
506
-            'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
507
-                'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
508
-            ),
509
-            'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
510
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
511
-            ),
512
-            'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
513
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
514
-            ),
515
-            'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
516
-                'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
517
-            ),
518
-            'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
519
-                'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
520
-            ),
521
-            'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
522
-                'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
523
-            ),
524
-            'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
525
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
526
-            ),
527
-            'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
528
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
529
-            ),
530
-            'EventEspresso\core\services\database\TableManager'                                                           => array(
531
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
532
-            ),
533
-            'EE_Data_Migration_Class_Base'                                                                                => array(
534
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
535
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
536
-            ),
537
-            'EE_DMS_Core_4_1_0'                                                                                           => array(
538
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
539
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
540
-            ),
541
-            'EE_DMS_Core_4_2_0'                                                                                           => array(
542
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
543
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
544
-            ),
545
-            'EE_DMS_Core_4_3_0'                                                                                           => array(
546
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
547
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
548
-            ),
549
-            'EE_DMS_Core_4_4_0'                                                                                           => array(
550
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
551
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
552
-            ),
553
-            'EE_DMS_Core_4_5_0'                                                                                           => array(
554
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
555
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
556
-            ),
557
-            'EE_DMS_Core_4_6_0'                                                                                           => array(
558
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
559
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
560
-            ),
561
-            'EE_DMS_Core_4_7_0'                                                                                           => array(
562
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
563
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
564
-            ),
565
-            'EE_DMS_Core_4_8_0'                                                                                           => array(
566
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
567
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
568
-            ),
569
-            'EE_DMS_Core_4_9_0'                                                                                           => array(
570
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
571
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
572
-            ),
573
-            'EventEspresso\core\services\assets\Registry'                                                                 => array(
574
-                'EE_Template_Config' => EE_Dependency_Map::load_from_cache,
575
-                'EE_Currency_Config' => EE_Dependency_Map::load_from_cache,
576
-            ),
577
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
578
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
579
-            ),
580
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
581
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
582
-            ),
583
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
584
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
585
-            ),
586
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
587
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
588
-            ),
589
-            'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
590
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
591
-            ),
592
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
593
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
594
-            ),
595
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
596
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
597
-            ),
598
-            'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
599
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
600
-            ),
601
-            'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
602
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
603
-            ),
604
-        );
605
-    }
606
-
607
-
608
-
609
-    /**
610
-     * Registers how core classes are loaded.
611
-     * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
612
-     *        'EE_Request_Handler' => 'load_core'
613
-     *        'EE_Messages_Queue'  => 'load_lib'
614
-     *        'EEH_Debug_Tools'    => 'load_helper'
615
-     * or, if greater control is required, by providing a custom closure. For example:
616
-     *        'Some_Class' => function () {
617
-     *            return new Some_Class();
618
-     *        },
619
-     * This is required for instantiating dependencies
620
-     * where an interface has been type hinted in a class constructor. For example:
621
-     *        'Required_Interface' => function () {
622
-     *            return new A_Class_That_Implements_Required_Interface();
623
-     *        },
624
-     */
625
-    protected function _register_core_class_loaders()
626
-    {
627
-        //for PHP5.3 compat, we need to register any properties called here in a variable because `$this` cannot
628
-        //be used in a closure.
629
-        $request = &$this->_request;
630
-        $response = &$this->_response;
631
-        $loader = &$this->loader;
632
-        $this->_class_loaders = array(
633
-            //load_core
634
-            'EE_Capabilities'                      => 'load_core',
635
-            'EE_Encryption'                        => 'load_core',
636
-            'EE_Front_Controller'                  => 'load_core',
637
-            'EE_Module_Request_Router'             => 'load_core',
638
-            'EE_Registry'                          => 'load_core',
639
-            'EE_Request'                           => function () use (&$request) {
640
-                return $request;
641
-            },
642
-            'EE_Response'                          => function () use (&$response) {
643
-                return $response;
644
-            },
645
-            'EE_Request_Handler'                   => 'load_core',
646
-            'EE_Session'                           => 'load_core',
647
-            'EE_System'                            => 'load_core',
648
-            //load_lib
649
-            'EE_Message_Resource_Manager'          => 'load_lib',
650
-            'EE_Message_Type_Collection'           => 'load_lib',
651
-            'EE_Message_Type_Collection_Loader'    => 'load_lib',
652
-            'EE_Messenger_Collection'              => 'load_lib',
653
-            'EE_Messenger_Collection_Loader'       => 'load_lib',
654
-            'EE_Messages_Processor'                => 'load_lib',
655
-            'EE_Message_Repository'                => 'load_lib',
656
-            'EE_Messages_Queue'                    => 'load_lib',
657
-            'EE_Messages_Data_Handler_Collection'  => 'load_lib',
658
-            'EE_Message_Template_Group_Collection' => 'load_lib',
659
-            'EE_Messages_Generator'                => function () {
660
-                return EE_Registry::instance()->load_lib(
661
-                    'Messages_Generator',
662
-                    array(),
663
-                    false,
664
-                    false
665
-                );
666
-            },
667
-            'EE_Messages_Template_Defaults'        => function ($arguments = array()) {
668
-                return EE_Registry::instance()->load_lib(
669
-                    'Messages_Template_Defaults',
670
-                    $arguments,
671
-                    false,
672
-                    false
673
-                );
674
-            },
675
-            //load_model
676
-            'EEM_Message_Template_Group'           => 'load_model',
677
-            'EEM_Message_Template'                 => 'load_model',
678
-            //load_helper
679
-            'EEH_Parse_Shortcodes'                 => function () {
680
-                if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
681
-                    return new EEH_Parse_Shortcodes();
682
-                }
683
-                return null;
684
-            },
685
-            'EE_Template_Config'                   => function () {
686
-                return EE_Config::instance()->template_settings;
687
-            },
688
-            'EE_Currency_Config'                   => function () {
689
-                return EE_Config::instance()->currency;
690
-            },
691
-            'EventEspresso\core\services\loaders\Loader' => function () use (&$loader) {
692
-                return $loader;
693
-            },
694
-        );
695
-    }
696
-
697
-
698
-
699
-    /**
700
-     * can be used for supplying alternate names for classes,
701
-     * or for connecting interface names to instantiable classes
702
-     */
703
-    protected function _register_core_aliases()
704
-    {
705
-        $this->_aliases = array(
706
-            'CommandBusInterface'                                                 => 'EventEspresso\core\services\commands\CommandBusInterface',
707
-            'EventEspresso\core\services\commands\CommandBusInterface'            => 'EventEspresso\core\services\commands\CommandBus',
708
-            'CommandHandlerManagerInterface'                                      => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
709
-            'EventEspresso\core\services\commands\CommandHandlerManagerInterface' => 'EventEspresso\core\services\commands\CommandHandlerManager',
710
-            'CapChecker'                                                          => 'EventEspresso\core\services\commands\middleware\CapChecker',
711
-            'AddActionHook'                                                       => 'EventEspresso\core\services\commands\middleware\AddActionHook',
712
-            'CapabilitiesChecker'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
713
-            'CapabilitiesCheckerInterface'                                        => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
714
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
715
-            'CreateRegistrationService'                                           => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
716
-            'CreateRegCodeCommandHandler'                                         => 'EventEspresso\core\services\commands\registration\CreateRegCodeCommand',
717
-            'CreateRegUrlLinkCommandHandler'                                      => 'EventEspresso\core\services\commands\registration\CreateRegUrlLinkCommand',
718
-            'CreateRegistrationCommandHandler'                                    => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
719
-            'CopyRegistrationDetailsCommandHandler'                               => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
720
-            'CopyRegistrationPaymentsCommandHandler'                              => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
721
-            'CancelRegistrationAndTicketLineItemCommandHandler'                   => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
722
-            'UpdateRegistrationAndTransactionAfterChangeCommandHandler'           => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
723
-            'CreateTicketLineItemCommandHandler'                                  => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
724
-            'TableManager'                                                        => 'EventEspresso\core\services\database\TableManager',
725
-            'TableAnalysis'                                                       => 'EventEspresso\core\services\database\TableAnalysis',
726
-            'EspressoShortcode'                                                   => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
727
-            'ShortcodeInterface'                                                  => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
728
-            'EventEspresso\core\services\shortcodes\ShortcodeInterface'           => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
729
-            'EventEspresso\core\services\cache\CacheStorageInterface'             => 'EventEspresso\core\services\cache\TransientCacheStorage',
730
-            'LoaderInterface'                                                     => 'EventEspresso\core\services\loaders\LoaderInterface',
731
-            'EventEspresso\core\services\loaders\LoaderInterface'                 => 'EventEspresso\core\services\loaders\Loader',
732
-            'CommandFactoryInterface'                                             => 'EventEspresso\core\services\commands\CommandFactoryInterface',
733
-            'EventEspresso\core\services\commands\CommandFactoryInterface'        => 'EventEspresso\core\services\commands\CommandFactory',
734
-            'EventEspresso\core\domain\services\session\SessionIdentifierInterface' => 'EE_Session',
735
-        );
736
-    }
737
-
738
-
739
-
740
-    /**
741
-     * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
742
-     * request Primarily used by unit tests.
743
-     */
744
-    public function reset()
745
-    {
746
-        $this->_register_core_class_loaders();
747
-        $this->_register_core_dependencies();
748
-    }
24
+	/**
25
+	 * This means that the requested class dependency is not present in the dependency map
26
+	 */
27
+	const not_registered = 0;
28
+
29
+	/**
30
+	 * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
31
+	 */
32
+	const load_new_object = 1;
33
+
34
+	/**
35
+	 * This instructs class loaders to return a previously instantiated and cached object for the requested class.
36
+	 * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
37
+	 */
38
+	const load_from_cache = 2;
39
+
40
+	/**
41
+	 * When registering a dependency,
42
+	 * this indicates to keep any existing dependencies that already exist,
43
+	 * and simply discard any new dependencies declared in the incoming data
44
+	 */
45
+	const KEEP_EXISTING_DEPENDENCIES = 0;
46
+
47
+	/**
48
+	 * When registering a dependency,
49
+	 * this indicates to overwrite any existing dependencies that already exist using the incoming data
50
+	 */
51
+	const OVERWRITE_DEPENDENCIES = 1;
52
+
53
+
54
+
55
+	/**
56
+	 * @type EE_Dependency_Map $_instance
57
+	 */
58
+	protected static $_instance;
59
+
60
+	/**
61
+	 * @type EE_Request $request
62
+	 */
63
+	protected $_request;
64
+
65
+	/**
66
+	 * @type EE_Response $response
67
+	 */
68
+	protected $_response;
69
+
70
+	/**
71
+	 * @type LoaderInterface $loader
72
+	 */
73
+	protected $loader;
74
+
75
+	/**
76
+	 * @type array $_dependency_map
77
+	 */
78
+	protected $_dependency_map = array();
79
+
80
+	/**
81
+	 * @type array $_class_loaders
82
+	 */
83
+	protected $_class_loaders = array();
84
+
85
+	/**
86
+	 * @type array $_aliases
87
+	 */
88
+	protected $_aliases = array();
89
+
90
+
91
+
92
+	/**
93
+	 * EE_Dependency_Map constructor.
94
+	 *
95
+	 * @param EE_Request  $request
96
+	 * @param EE_Response $response
97
+	 */
98
+	protected function __construct(EE_Request $request, EE_Response $response)
99
+	{
100
+		$this->_request = $request;
101
+		$this->_response = $response;
102
+		add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
103
+		do_action('EE_Dependency_Map____construct');
104
+	}
105
+
106
+
107
+
108
+	/**
109
+	 * @throws InvalidDataTypeException
110
+	 * @throws InvalidInterfaceException
111
+	 * @throws InvalidArgumentException
112
+	 */
113
+	public function initialize()
114
+	{
115
+		$this->_register_core_dependencies();
116
+		$this->_register_core_class_loaders();
117
+		$this->_register_core_aliases();
118
+	}
119
+
120
+
121
+
122
+	/**
123
+	 * @singleton method used to instantiate class object
124
+	 * @access    public
125
+	 * @param EE_Request  $request
126
+	 * @param EE_Response $response
127
+	 * @return EE_Dependency_Map
128
+	 */
129
+	public static function instance(EE_Request $request = null, EE_Response $response = null)
130
+	{
131
+		// check if class object is instantiated, and instantiated properly
132
+		if (! self::$_instance instanceof EE_Dependency_Map) {
133
+			self::$_instance = new EE_Dependency_Map($request, $response);
134
+		}
135
+		return self::$_instance;
136
+	}
137
+
138
+
139
+
140
+	/**
141
+	 * @param LoaderInterface $loader
142
+	 */
143
+	public function setLoader(LoaderInterface $loader)
144
+	{
145
+		$this->loader = $loader;
146
+	}
147
+
148
+
149
+
150
+	/**
151
+	 * @param string $class
152
+	 * @param array  $dependencies
153
+	 * @param int    $overwrite
154
+	 * @return bool
155
+	 */
156
+	public static function register_dependencies(
157
+		$class,
158
+		array $dependencies,
159
+		$overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
160
+	) {
161
+		return self::$_instance->registerDependencies($class, $dependencies, $overwrite);
162
+	}
163
+
164
+
165
+
166
+	/**
167
+	 * Assigns an array of class names and corresponding load sources (new or cached)
168
+	 * to the class specified by the first parameter.
169
+	 * IMPORTANT !!!
170
+	 * The order of elements in the incoming $dependencies array MUST match
171
+	 * the order of the constructor parameters for the class in question.
172
+	 * This is especially important when overriding any existing dependencies that are registered.
173
+	 * the third parameter controls whether any duplicate dependencies are overwritten or not.
174
+	 *
175
+	 * @param string $class
176
+	 * @param array  $dependencies
177
+	 * @param int    $overwrite
178
+	 * @return bool
179
+	 */
180
+	public function registerDependencies(
181
+		$class,
182
+		array $dependencies,
183
+		$overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES
184
+	) {
185
+		$registered = false;
186
+		if (empty(self::$_instance->_dependency_map[ $class ])) {
187
+			self::$_instance->_dependency_map[ $class ] = array();
188
+		}
189
+		// we need to make sure that any aliases used when registering a dependency
190
+		// get resolved to the correct class name
191
+		foreach ((array)$dependencies as $dependency => $load_source) {
192
+			$alias = self::$_instance->get_alias($dependency);
193
+			if (
194
+				$overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES
195
+				|| ! isset(self::$_instance->_dependency_map[ $class ][ $alias ])
196
+			) {
197
+				unset($dependencies[$dependency]);
198
+				$dependencies[$alias] = $load_source;
199
+				$registered = true;
200
+			}
201
+		}
202
+		// now add our two lists of dependencies together.
203
+		// using Union (+=) favours the arrays in precedence from left to right,
204
+		// so $dependencies is NOT overwritten because it is listed first
205
+		// ie: with A = B + C, entries in B take precedence over duplicate entries in C
206
+		// Union is way faster than array_merge() but should be used with caution...
207
+		// especially with numerically indexed arrays
208
+		$dependencies += self::$_instance->_dependency_map[ $class ];
209
+		// now we need to ensure that the resulting dependencies
210
+		// array only has the entries that are required for the class
211
+		// so first count how many dependencies were originally registered for the class
212
+		$dependency_count = count(self::$_instance->_dependency_map[ $class ]);
213
+		// if that count is non-zero (meaning dependencies were already registered)
214
+		self::$_instance->_dependency_map[ $class ] = $dependency_count
215
+			// then truncate the  final array to match that count
216
+			? array_slice($dependencies, 0, $dependency_count)
217
+			// otherwise just take the incoming array because nothing previously existed
218
+			: $dependencies;
219
+		return $registered;
220
+	}
221
+
222
+
223
+
224
+	/**
225
+	 * @param string $class_name
226
+	 * @param string $loader
227
+	 * @return bool
228
+	 * @throws DomainException
229
+	 */
230
+	public static function register_class_loader($class_name, $loader = 'load_core')
231
+	{
232
+		if (strpos($class_name, '\\') !== false) {
233
+			throw new DomainException(
234
+				esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso')
235
+			);
236
+		}
237
+		// check that loader is callable or method starts with "load_" and exists in EE_Registry
238
+		if (
239
+			! is_callable($loader)
240
+			&& (
241
+				strpos($loader, 'load_') !== 0
242
+				|| ! method_exists('EE_Registry', $loader)
243
+			)
244
+		) {
245
+			throw new DomainException(
246
+				sprintf(
247
+					esc_html__(
248
+						'"%1$s" is not a valid loader method on EE_Registry.',
249
+						'event_espresso'
250
+					),
251
+					$loader
252
+				)
253
+			);
254
+		}
255
+		$class_name = self::$_instance->get_alias($class_name);
256
+		if (! isset(self::$_instance->_class_loaders[$class_name])) {
257
+			self::$_instance->_class_loaders[$class_name] = $loader;
258
+			return true;
259
+		}
260
+		return false;
261
+	}
262
+
263
+
264
+
265
+	/**
266
+	 * @return array
267
+	 */
268
+	public function dependency_map()
269
+	{
270
+		return $this->_dependency_map;
271
+	}
272
+
273
+
274
+
275
+	/**
276
+	 * returns TRUE if dependency map contains a listing for the provided class name
277
+	 *
278
+	 * @param string $class_name
279
+	 * @return boolean
280
+	 */
281
+	public function has($class_name = '')
282
+	{
283
+		return isset($this->_dependency_map[$class_name]) ? true : false;
284
+	}
285
+
286
+
287
+
288
+	/**
289
+	 * returns TRUE if dependency map contains a listing for the provided class name AND dependency
290
+	 *
291
+	 * @param string $class_name
292
+	 * @param string $dependency
293
+	 * @return bool
294
+	 */
295
+	public function has_dependency_for_class($class_name = '', $dependency = '')
296
+	{
297
+		$dependency = $this->get_alias($dependency);
298
+		return isset($this->_dependency_map[$class_name], $this->_dependency_map[$class_name][$dependency])
299
+			? true
300
+			: false;
301
+	}
302
+
303
+
304
+
305
+	/**
306
+	 * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
307
+	 *
308
+	 * @param string $class_name
309
+	 * @param string $dependency
310
+	 * @return int
311
+	 */
312
+	public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
313
+	{
314
+		$dependency = $this->get_alias($dependency);
315
+		return $this->has_dependency_for_class($class_name, $dependency)
316
+			? $this->_dependency_map[$class_name][$dependency]
317
+			: EE_Dependency_Map::not_registered;
318
+	}
319
+
320
+
321
+
322
+	/**
323
+	 * @param string $class_name
324
+	 * @return string | Closure
325
+	 */
326
+	public function class_loader($class_name)
327
+	{
328
+		// don't use loaders for FQCNs
329
+		if(strpos($class_name, '\\') !== false){
330
+			return '';
331
+		}
332
+		$class_name = $this->get_alias($class_name);
333
+		return isset($this->_class_loaders[$class_name]) ? $this->_class_loaders[$class_name] : '';
334
+	}
335
+
336
+
337
+
338
+	/**
339
+	 * @return array
340
+	 */
341
+	public function class_loaders()
342
+	{
343
+		return $this->_class_loaders;
344
+	}
345
+
346
+
347
+
348
+	/**
349
+	 * adds an alias for a classname
350
+	 *
351
+	 * @param string $class_name the class name that should be used (concrete class to replace interface)
352
+	 * @param string $alias      the class name that would be type hinted for (abstract parent or interface)
353
+	 * @param string $for_class  the class that has the dependency (is type hinting for the interface)
354
+	 */
355
+	public function add_alias($class_name, $alias, $for_class = '')
356
+	{
357
+		if ($for_class !== '') {
358
+			if (! isset($this->_aliases[$for_class])) {
359
+				$this->_aliases[$for_class] = array();
360
+			}
361
+			$this->_aliases[$for_class][$class_name] = $alias;
362
+		}
363
+		$this->_aliases[$class_name] = $alias;
364
+	}
365
+
366
+
367
+
368
+	/**
369
+	 * returns TRUE if the provided class name has an alias
370
+	 *
371
+	 * @param string $class_name
372
+	 * @param string $for_class
373
+	 * @return bool
374
+	 */
375
+	public function has_alias($class_name = '', $for_class = '')
376
+	{
377
+		return isset($this->_aliases[$for_class], $this->_aliases[$for_class][$class_name])
378
+			   || (
379
+				   isset($this->_aliases[$class_name])
380
+				   && ! is_array($this->_aliases[$class_name])
381
+			   );
382
+	}
383
+
384
+
385
+
386
+	/**
387
+	 * returns alias for class name if one exists, otherwise returns the original classname
388
+	 * functions recursively, so that multiple aliases can be used to drill down to a classname
389
+	 *  for example:
390
+	 *      if the following two entries were added to the _aliases array:
391
+	 *          array(
392
+	 *              'interface_alias'           => 'some\namespace\interface'
393
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
394
+	 *          )
395
+	 *      then one could use EE_Registry::instance()->create( 'interface_alias' )
396
+	 *      to load an instance of 'some\namespace\classname'
397
+	 *
398
+	 * @param string $class_name
399
+	 * @param string $for_class
400
+	 * @return string
401
+	 */
402
+	public function get_alias($class_name = '', $for_class = '')
403
+	{
404
+		if (! $this->has_alias($class_name, $for_class)) {
405
+			return $class_name;
406
+		}
407
+		if ($for_class !== '' && isset($this->_aliases[ $for_class ][ $class_name ])) {
408
+			return $this->get_alias($this->_aliases[$for_class][$class_name], $for_class);
409
+		}
410
+		return $this->get_alias($this->_aliases[$class_name]);
411
+	}
412
+
413
+
414
+
415
+	/**
416
+	 * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
417
+	 * if one exists, or whether a new object should be generated every time the requested class is loaded.
418
+	 * This is done by using the following class constants:
419
+	 *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
420
+	 *        EE_Dependency_Map::load_new_object - generates a new object every time
421
+	 */
422
+	protected function _register_core_dependencies()
423
+	{
424
+		$this->_dependency_map = array(
425
+			'EE_Request_Handler'                                                                                          => array(
426
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
427
+			),
428
+			'EE_System'                                                                                                   => array(
429
+				'EE_Registry' => EE_Dependency_Map::load_from_cache,
430
+			),
431
+			'EE_Session'                                                                                                  => array(
432
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
433
+				'EE_Encryption'                                           => EE_Dependency_Map::load_from_cache,
434
+			),
435
+			'EE_Cart'                                                                                                     => array(
436
+				'EE_Session' => EE_Dependency_Map::load_from_cache,
437
+			),
438
+			'EE_Front_Controller'                                                                                         => array(
439
+				'EE_Registry'              => EE_Dependency_Map::load_from_cache,
440
+				'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
441
+				'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
442
+			),
443
+			'EE_Messenger_Collection_Loader'                                                                              => array(
444
+				'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
445
+			),
446
+			'EE_Message_Type_Collection_Loader'                                                                           => array(
447
+				'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
448
+			),
449
+			'EE_Message_Resource_Manager'                                                                                 => array(
450
+				'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
451
+				'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
452
+				'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
453
+			),
454
+			'EE_Message_Factory'                                                                                          => array(
455
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
456
+			),
457
+			'EE_messages'                                                                                                 => array(
458
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
459
+			),
460
+			'EE_Messages_Generator'                                                                                       => array(
461
+				'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
462
+				'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
463
+				'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
464
+				'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
465
+			),
466
+			'EE_Messages_Processor'                                                                                       => array(
467
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
468
+			),
469
+			'EE_Messages_Queue'                                                                                           => array(
470
+				'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
471
+			),
472
+			'EE_Messages_Template_Defaults'                                                                               => array(
473
+				'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
474
+				'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
475
+			),
476
+			'EE_Message_To_Generate_From_Request'                                                                         => array(
477
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
478
+				'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
479
+			),
480
+			'EventEspresso\core\services\commands\CommandBus'                                                             => array(
481
+				'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
482
+			),
483
+			'EventEspresso\services\commands\CommandHandler'                                                              => array(
484
+				'EE_Registry'         => EE_Dependency_Map::load_from_cache,
485
+				'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
486
+			),
487
+			'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
488
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
489
+			),
490
+			'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
491
+				'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
492
+				'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
493
+			),
494
+			'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
495
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
496
+			),
497
+			'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
498
+				'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
499
+			),
500
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
501
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
502
+			),
503
+			'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
504
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
505
+			),
506
+			'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
507
+				'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
508
+			),
509
+			'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
510
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
511
+			),
512
+			'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
513
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
514
+			),
515
+			'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
516
+				'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
517
+			),
518
+			'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
519
+				'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
520
+			),
521
+			'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
522
+				'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
523
+			),
524
+			'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
525
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
526
+			),
527
+			'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
528
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
529
+			),
530
+			'EventEspresso\core\services\database\TableManager'                                                           => array(
531
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
532
+			),
533
+			'EE_Data_Migration_Class_Base'                                                                                => array(
534
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
535
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
536
+			),
537
+			'EE_DMS_Core_4_1_0'                                                                                           => array(
538
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
539
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
540
+			),
541
+			'EE_DMS_Core_4_2_0'                                                                                           => array(
542
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
543
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
544
+			),
545
+			'EE_DMS_Core_4_3_0'                                                                                           => array(
546
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
547
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
548
+			),
549
+			'EE_DMS_Core_4_4_0'                                                                                           => array(
550
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
551
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
552
+			),
553
+			'EE_DMS_Core_4_5_0'                                                                                           => array(
554
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
555
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
556
+			),
557
+			'EE_DMS_Core_4_6_0'                                                                                           => array(
558
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
559
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
560
+			),
561
+			'EE_DMS_Core_4_7_0'                                                                                           => array(
562
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
563
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
564
+			),
565
+			'EE_DMS_Core_4_8_0'                                                                                           => array(
566
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
567
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
568
+			),
569
+			'EE_DMS_Core_4_9_0'                                                                                           => array(
570
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
571
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
572
+			),
573
+			'EventEspresso\core\services\assets\Registry'                                                                 => array(
574
+				'EE_Template_Config' => EE_Dependency_Map::load_from_cache,
575
+				'EE_Currency_Config' => EE_Dependency_Map::load_from_cache,
576
+			),
577
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
578
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
579
+			),
580
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
581
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
582
+			),
583
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
584
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
585
+			),
586
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
587
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
588
+			),
589
+			'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
590
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
591
+			),
592
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
593
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
594
+			),
595
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
596
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
597
+			),
598
+			'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
599
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
600
+			),
601
+			'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
602
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
603
+			),
604
+		);
605
+	}
606
+
607
+
608
+
609
+	/**
610
+	 * Registers how core classes are loaded.
611
+	 * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
612
+	 *        'EE_Request_Handler' => 'load_core'
613
+	 *        'EE_Messages_Queue'  => 'load_lib'
614
+	 *        'EEH_Debug_Tools'    => 'load_helper'
615
+	 * or, if greater control is required, by providing a custom closure. For example:
616
+	 *        'Some_Class' => function () {
617
+	 *            return new Some_Class();
618
+	 *        },
619
+	 * This is required for instantiating dependencies
620
+	 * where an interface has been type hinted in a class constructor. For example:
621
+	 *        'Required_Interface' => function () {
622
+	 *            return new A_Class_That_Implements_Required_Interface();
623
+	 *        },
624
+	 */
625
+	protected function _register_core_class_loaders()
626
+	{
627
+		//for PHP5.3 compat, we need to register any properties called here in a variable because `$this` cannot
628
+		//be used in a closure.
629
+		$request = &$this->_request;
630
+		$response = &$this->_response;
631
+		$loader = &$this->loader;
632
+		$this->_class_loaders = array(
633
+			//load_core
634
+			'EE_Capabilities'                      => 'load_core',
635
+			'EE_Encryption'                        => 'load_core',
636
+			'EE_Front_Controller'                  => 'load_core',
637
+			'EE_Module_Request_Router'             => 'load_core',
638
+			'EE_Registry'                          => 'load_core',
639
+			'EE_Request'                           => function () use (&$request) {
640
+				return $request;
641
+			},
642
+			'EE_Response'                          => function () use (&$response) {
643
+				return $response;
644
+			},
645
+			'EE_Request_Handler'                   => 'load_core',
646
+			'EE_Session'                           => 'load_core',
647
+			'EE_System'                            => 'load_core',
648
+			//load_lib
649
+			'EE_Message_Resource_Manager'          => 'load_lib',
650
+			'EE_Message_Type_Collection'           => 'load_lib',
651
+			'EE_Message_Type_Collection_Loader'    => 'load_lib',
652
+			'EE_Messenger_Collection'              => 'load_lib',
653
+			'EE_Messenger_Collection_Loader'       => 'load_lib',
654
+			'EE_Messages_Processor'                => 'load_lib',
655
+			'EE_Message_Repository'                => 'load_lib',
656
+			'EE_Messages_Queue'                    => 'load_lib',
657
+			'EE_Messages_Data_Handler_Collection'  => 'load_lib',
658
+			'EE_Message_Template_Group_Collection' => 'load_lib',
659
+			'EE_Messages_Generator'                => function () {
660
+				return EE_Registry::instance()->load_lib(
661
+					'Messages_Generator',
662
+					array(),
663
+					false,
664
+					false
665
+				);
666
+			},
667
+			'EE_Messages_Template_Defaults'        => function ($arguments = array()) {
668
+				return EE_Registry::instance()->load_lib(
669
+					'Messages_Template_Defaults',
670
+					$arguments,
671
+					false,
672
+					false
673
+				);
674
+			},
675
+			//load_model
676
+			'EEM_Message_Template_Group'           => 'load_model',
677
+			'EEM_Message_Template'                 => 'load_model',
678
+			//load_helper
679
+			'EEH_Parse_Shortcodes'                 => function () {
680
+				if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
681
+					return new EEH_Parse_Shortcodes();
682
+				}
683
+				return null;
684
+			},
685
+			'EE_Template_Config'                   => function () {
686
+				return EE_Config::instance()->template_settings;
687
+			},
688
+			'EE_Currency_Config'                   => function () {
689
+				return EE_Config::instance()->currency;
690
+			},
691
+			'EventEspresso\core\services\loaders\Loader' => function () use (&$loader) {
692
+				return $loader;
693
+			},
694
+		);
695
+	}
696
+
697
+
698
+
699
+	/**
700
+	 * can be used for supplying alternate names for classes,
701
+	 * or for connecting interface names to instantiable classes
702
+	 */
703
+	protected function _register_core_aliases()
704
+	{
705
+		$this->_aliases = array(
706
+			'CommandBusInterface'                                                 => 'EventEspresso\core\services\commands\CommandBusInterface',
707
+			'EventEspresso\core\services\commands\CommandBusInterface'            => 'EventEspresso\core\services\commands\CommandBus',
708
+			'CommandHandlerManagerInterface'                                      => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
709
+			'EventEspresso\core\services\commands\CommandHandlerManagerInterface' => 'EventEspresso\core\services\commands\CommandHandlerManager',
710
+			'CapChecker'                                                          => 'EventEspresso\core\services\commands\middleware\CapChecker',
711
+			'AddActionHook'                                                       => 'EventEspresso\core\services\commands\middleware\AddActionHook',
712
+			'CapabilitiesChecker'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
713
+			'CapabilitiesCheckerInterface'                                        => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
714
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
715
+			'CreateRegistrationService'                                           => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
716
+			'CreateRegCodeCommandHandler'                                         => 'EventEspresso\core\services\commands\registration\CreateRegCodeCommand',
717
+			'CreateRegUrlLinkCommandHandler'                                      => 'EventEspresso\core\services\commands\registration\CreateRegUrlLinkCommand',
718
+			'CreateRegistrationCommandHandler'                                    => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
719
+			'CopyRegistrationDetailsCommandHandler'                               => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
720
+			'CopyRegistrationPaymentsCommandHandler'                              => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
721
+			'CancelRegistrationAndTicketLineItemCommandHandler'                   => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
722
+			'UpdateRegistrationAndTransactionAfterChangeCommandHandler'           => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
723
+			'CreateTicketLineItemCommandHandler'                                  => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
724
+			'TableManager'                                                        => 'EventEspresso\core\services\database\TableManager',
725
+			'TableAnalysis'                                                       => 'EventEspresso\core\services\database\TableAnalysis',
726
+			'EspressoShortcode'                                                   => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
727
+			'ShortcodeInterface'                                                  => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
728
+			'EventEspresso\core\services\shortcodes\ShortcodeInterface'           => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
729
+			'EventEspresso\core\services\cache\CacheStorageInterface'             => 'EventEspresso\core\services\cache\TransientCacheStorage',
730
+			'LoaderInterface'                                                     => 'EventEspresso\core\services\loaders\LoaderInterface',
731
+			'EventEspresso\core\services\loaders\LoaderInterface'                 => 'EventEspresso\core\services\loaders\Loader',
732
+			'CommandFactoryInterface'                                             => 'EventEspresso\core\services\commands\CommandFactoryInterface',
733
+			'EventEspresso\core\services\commands\CommandFactoryInterface'        => 'EventEspresso\core\services\commands\CommandFactory',
734
+			'EventEspresso\core\domain\services\session\SessionIdentifierInterface' => 'EE_Session',
735
+		);
736
+	}
737
+
738
+
739
+
740
+	/**
741
+	 * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
742
+	 * request Primarily used by unit tests.
743
+	 */
744
+	public function reset()
745
+	{
746
+		$this->_register_core_class_loaders();
747
+		$this->_register_core_dependencies();
748
+	}
749 749
 
750 750
 
751 751
 }
Please login to merge, or discard this patch.
core/domain/entities/shortcodes/EspressoEvents.php 1 patch
Indentation   +133 added lines, -133 removed lines patch added patch discarded remove patch
@@ -34,139 +34,139 @@
 block discarded – undo
34 34
 
35 35
 
36 36
 
37
-    /**
38
-     * the actual shortcode tag that gets registered with WordPress
39
-     *
40
-     * @return string
41
-     */
42
-    public function getTag()
43
-    {
44
-        return 'ESPRESSO_EVENTS';
45
-    }
46
-
47
-
48
-
49
-    /**
50
-     * the time in seconds to cache the results of the processShortcode() method
51
-     * 0 means the processShortcode() results will NOT be cached at all
52
-     *
53
-     * @return int
54
-     */
55
-    public function cacheExpiration()
56
-    {
57
-        return 0;
58
-    }
59
-
60
-
61
-
62
-    /**
63
-     * a place for adding any initialization code that needs to run prior to wp_header().
64
-     * this may be required for shortcodes that utilize a corresponding module,
65
-     * and need to enqueue assets for that module
66
-     *
67
-     * @return void
68
-     */
69
-    public function initializeShortcode()
70
-    {
71
-        EED_Events_Archive::instance()->event_list();
72
-        $this->shortcodeHasBeenInitialized();
73
-    }
74
-
75
-
76
-
77
-    /**
78
-     * callback that runs when the shortcode is encountered in post content.
79
-     * IMPORTANT !!!
80
-     * remember that shortcode content should be RETURNED and NOT echoed out
81
-     *
82
-     * @param array $attributes
83
-     * @return string
84
-     */
85
-    public function processShortcode($attributes = array())
86
-    {
87
-        // grab attributes and merge with defaults
88
-        $attributes = $this->getAttributes($attributes);
89
-        // make sure we use the_excerpt()
90
-        add_filter('FHEE__EES_Espresso_Events__process_shortcode__true', '__return_true');
91
-        // apply query filters
92
-        add_filter('FHEE__EEH_Event_Query__apply_query_filters', '__return_true');
93
-        // run the query
94
-        global $wp_query;
95
-        // yes we have to overwrite the main wp query, but it's ok...
96
-        // we're going to reset it again below, so everything will be Hunky Dory (amazing album)
97
-        $wp_query = new EventListQuery($attributes);
98
-        // check what template is loaded and load filters accordingly
99
-        EED_Events_Archive::instance()->template_include('loop-espresso_events.php');
100
-        // load our template
101
-        $event_list = EEH_Template::locate_template(
102
-            'loop-espresso_events.php',
103
-            array(),
104
-            true,
105
-            true
106
-        );
107
-        // now reset the query and post data
108
-        wp_reset_query();
109
-        wp_reset_postdata();
110
-        EED_Events_Archive::remove_all_events_archive_filters();
111
-        // remove query filters
112
-        remove_filter('FHEE__EEH_Event_Query__apply_query_filters', '__return_true');
113
-        // pull our content from the output buffer and return it
114
-        return $event_list;
115
-    }
116
-
117
-
118
-
119
-    /**
120
-     * merge incoming attributes with filtered defaults
121
-     *
122
-     * @param array $attributes
123
-     * @return array
124
-     */
125
-    private function getAttributes(array $attributes)
126
-    {
127
-        return array_merge(
128
-            (array)apply_filters(
129
-                'EES_Espresso_Events__process_shortcode__default_espresso_events_shortcode_atts',
130
-                array(
131
-                    'title'         => '',
132
-                    'limit'         => 10,
133
-                    'css_class'     => '',
134
-                    'show_expired'  => false,
135
-                    'month'         => '',
136
-                    'category_slug' => '',
137
-                    'order_by'      => 'start_date',
138
-                    'sort'          => 'ASC',
139
-                    'show_title'    => true,
140
-                )
141
-            ),
142
-            $attributes
143
-        );
144
-    }
145
-
146
-
147
-
148
-    /**
149
-     * array for defining custom attribute sanitization callbacks,
150
-     * where keys match keys in your attributes array,
151
-     * and values represent the sanitization function you wish to be applied to that attribute.
152
-     * So for example, if you had an integer attribute named "event_id"
153
-     * that you wanted to be sanitized using absint(),
154
-     * then you would pass the following for your $custom_sanitization array:
155
-     *      array('event_id' => 'absint')
156
-     *
157
-     * @return array
158
-     */
159
-    protected function customAttributeSanitizationMap()
160
-    {
161
-        // the following get sanitized/whitelisted in EEH_Event_Query
162
-        return array(
163
-            'category_slug' => 'skip_sanitization',
164
-            'show_expired'  => 'skip_sanitization',
165
-            'order_by'      => 'skip_sanitization',
166
-            'month'         => 'skip_sanitization',
167
-            'sort'          => 'skip_sanitization',
168
-        );
169
-    }
37
+	/**
38
+	 * the actual shortcode tag that gets registered with WordPress
39
+	 *
40
+	 * @return string
41
+	 */
42
+	public function getTag()
43
+	{
44
+		return 'ESPRESSO_EVENTS';
45
+	}
46
+
47
+
48
+
49
+	/**
50
+	 * the time in seconds to cache the results of the processShortcode() method
51
+	 * 0 means the processShortcode() results will NOT be cached at all
52
+	 *
53
+	 * @return int
54
+	 */
55
+	public function cacheExpiration()
56
+	{
57
+		return 0;
58
+	}
59
+
60
+
61
+
62
+	/**
63
+	 * a place for adding any initialization code that needs to run prior to wp_header().
64
+	 * this may be required for shortcodes that utilize a corresponding module,
65
+	 * and need to enqueue assets for that module
66
+	 *
67
+	 * @return void
68
+	 */
69
+	public function initializeShortcode()
70
+	{
71
+		EED_Events_Archive::instance()->event_list();
72
+		$this->shortcodeHasBeenInitialized();
73
+	}
74
+
75
+
76
+
77
+	/**
78
+	 * callback that runs when the shortcode is encountered in post content.
79
+	 * IMPORTANT !!!
80
+	 * remember that shortcode content should be RETURNED and NOT echoed out
81
+	 *
82
+	 * @param array $attributes
83
+	 * @return string
84
+	 */
85
+	public function processShortcode($attributes = array())
86
+	{
87
+		// grab attributes and merge with defaults
88
+		$attributes = $this->getAttributes($attributes);
89
+		// make sure we use the_excerpt()
90
+		add_filter('FHEE__EES_Espresso_Events__process_shortcode__true', '__return_true');
91
+		// apply query filters
92
+		add_filter('FHEE__EEH_Event_Query__apply_query_filters', '__return_true');
93
+		// run the query
94
+		global $wp_query;
95
+		// yes we have to overwrite the main wp query, but it's ok...
96
+		// we're going to reset it again below, so everything will be Hunky Dory (amazing album)
97
+		$wp_query = new EventListQuery($attributes);
98
+		// check what template is loaded and load filters accordingly
99
+		EED_Events_Archive::instance()->template_include('loop-espresso_events.php');
100
+		// load our template
101
+		$event_list = EEH_Template::locate_template(
102
+			'loop-espresso_events.php',
103
+			array(),
104
+			true,
105
+			true
106
+		);
107
+		// now reset the query and post data
108
+		wp_reset_query();
109
+		wp_reset_postdata();
110
+		EED_Events_Archive::remove_all_events_archive_filters();
111
+		// remove query filters
112
+		remove_filter('FHEE__EEH_Event_Query__apply_query_filters', '__return_true');
113
+		// pull our content from the output buffer and return it
114
+		return $event_list;
115
+	}
116
+
117
+
118
+
119
+	/**
120
+	 * merge incoming attributes with filtered defaults
121
+	 *
122
+	 * @param array $attributes
123
+	 * @return array
124
+	 */
125
+	private function getAttributes(array $attributes)
126
+	{
127
+		return array_merge(
128
+			(array)apply_filters(
129
+				'EES_Espresso_Events__process_shortcode__default_espresso_events_shortcode_atts',
130
+				array(
131
+					'title'         => '',
132
+					'limit'         => 10,
133
+					'css_class'     => '',
134
+					'show_expired'  => false,
135
+					'month'         => '',
136
+					'category_slug' => '',
137
+					'order_by'      => 'start_date',
138
+					'sort'          => 'ASC',
139
+					'show_title'    => true,
140
+				)
141
+			),
142
+			$attributes
143
+		);
144
+	}
145
+
146
+
147
+
148
+	/**
149
+	 * array for defining custom attribute sanitization callbacks,
150
+	 * where keys match keys in your attributes array,
151
+	 * and values represent the sanitization function you wish to be applied to that attribute.
152
+	 * So for example, if you had an integer attribute named "event_id"
153
+	 * that you wanted to be sanitized using absint(),
154
+	 * then you would pass the following for your $custom_sanitization array:
155
+	 *      array('event_id' => 'absint')
156
+	 *
157
+	 * @return array
158
+	 */
159
+	protected function customAttributeSanitizationMap()
160
+	{
161
+		// the following get sanitized/whitelisted in EEH_Event_Query
162
+		return array(
163
+			'category_slug' => 'skip_sanitization',
164
+			'show_expired'  => 'skip_sanitization',
165
+			'order_by'      => 'skip_sanitization',
166
+			'month'         => 'skip_sanitization',
167
+			'sort'          => 'skip_sanitization',
168
+		);
169
+	}
170 170
 
171 171
 
172 172
 
Please login to merge, or discard this patch.
core/libraries/messages/EE_Message_Template_Group_Collection.lib.php 2 patches
Indentation   +100 added lines, -100 removed lines patch added patch discarded remove patch
@@ -14,115 +14,115 @@
 block discarded – undo
14 14
 {
15 15
 
16 16
 
17
-    /**
18
-     * EE_Message_Template_Group_Collection constructor.
19
-     */
20
-    public function __construct()
21
-    {
22
-        $this->interface = 'EE_Message_Template_Group';
23
-    }
17
+	/**
18
+	 * EE_Message_Template_Group_Collection constructor.
19
+	 */
20
+	public function __construct()
21
+	{
22
+		$this->interface = 'EE_Message_Template_Group';
23
+	}
24 24
 
25 25
 
26
-    /**
27
-     * Adds the Message Template Group object to the repository.
28
-     *
29
-     * @param           $message_template_group
30
-     * @param array|int $EVT_ID    Some templates are specific to EVT, so this is provided as a way of
31
-     *                         indexing the template by key.  If this template is shared among multiple events then
32
-     *                         include the events as an array.
33
-     * @return bool
34
-     */
35
-    public function add($message_template_group, $EVT_ID = array())
36
-    {
37
-        $EVT_ID = is_array($EVT_ID) ? $EVT_ID : (array) $EVT_ID;
38
-        if ($message_template_group instanceof $this->interface) {
39
-            $data['key'] = $this->getKey(
40
-                $message_template_group->messenger(),
41
-                $message_template_group->message_type(),
42
-                $EVT_ID
43
-            );
44
-            return parent::add($message_template_group, $data);
45
-        }
46
-        return false;
47
-    }
26
+	/**
27
+	 * Adds the Message Template Group object to the repository.
28
+	 *
29
+	 * @param           $message_template_group
30
+	 * @param array|int $EVT_ID    Some templates are specific to EVT, so this is provided as a way of
31
+	 *                         indexing the template by key.  If this template is shared among multiple events then
32
+	 *                         include the events as an array.
33
+	 * @return bool
34
+	 */
35
+	public function add($message_template_group, $EVT_ID = array())
36
+	{
37
+		$EVT_ID = is_array($EVT_ID) ? $EVT_ID : (array) $EVT_ID;
38
+		if ($message_template_group instanceof $this->interface) {
39
+			$data['key'] = $this->getKey(
40
+				$message_template_group->messenger(),
41
+				$message_template_group->message_type(),
42
+				$EVT_ID
43
+			);
44
+			return parent::add($message_template_group, $data);
45
+		}
46
+		return false;
47
+	}
48 48
 
49 49
 
50
-    /**
51
-     * This retrieves any EE_Message_Template_Group in the repo by its ID.
52
-     *
53
-     * @param $GRP_ID
54
-     * @return EE_Message_Template_Group | null
55
-     */
56
-    public function get_by_ID($GRP_ID)
57
-    {
58
-        $this->rewind();
59
-        while ($this->valid()) {
60
-            if ($this->current()->ID() === $GRP_ID) {
61
-                /** @var EE_Message_Template_Group $message_template_group */
62
-                $message_template_group = $this->current();
63
-                $this->rewind();
64
-                return $message_template_group;
65
-            }
66
-            $this->next();
67
-        }
68
-        return null;
69
-    }
50
+	/**
51
+	 * This retrieves any EE_Message_Template_Group in the repo by its ID.
52
+	 *
53
+	 * @param $GRP_ID
54
+	 * @return EE_Message_Template_Group | null
55
+	 */
56
+	public function get_by_ID($GRP_ID)
57
+	{
58
+		$this->rewind();
59
+		while ($this->valid()) {
60
+			if ($this->current()->ID() === $GRP_ID) {
61
+				/** @var EE_Message_Template_Group $message_template_group */
62
+				$message_template_group = $this->current();
63
+				$this->rewind();
64
+				return $message_template_group;
65
+			}
66
+			$this->next();
67
+		}
68
+		return null;
69
+	}
70 70
 
71 71
 
72
-    /**
73
-     * Generates a hash used to identify a given Message Template Group.
74
-     *
75
-     * @param string $messenger    The EE_messenger->name
76
-     * @param string $message_type The EE_message_type->name
77
-     * @param int    $EVT_ID       Optional.  If the template is for a specific EVT then that should be included.
78
-     * @deprecated 4.9.40.rc.017  Use getKey instead.
79
-     * @return string
80
-     */
81
-    public function get_key($messenger, $message_type, $EVT_ID = 0)
82
-    {
83
-        $EVT_ID = (array) $EVT_ID;
84
-        return $this->getKey($messenger, $message_type, $EVT_ID);
85
-    }
72
+	/**
73
+	 * Generates a hash used to identify a given Message Template Group.
74
+	 *
75
+	 * @param string $messenger    The EE_messenger->name
76
+	 * @param string $message_type The EE_message_type->name
77
+	 * @param int    $EVT_ID       Optional.  If the template is for a specific EVT then that should be included.
78
+	 * @deprecated 4.9.40.rc.017  Use getKey instead.
79
+	 * @return string
80
+	 */
81
+	public function get_key($messenger, $message_type, $EVT_ID = 0)
82
+	{
83
+		$EVT_ID = (array) $EVT_ID;
84
+		return $this->getKey($messenger, $message_type, $EVT_ID);
85
+	}
86 86
 
87 87
 
88
-    /**
89
-     * Generates a hash used to identify a given Message Template Group
90
-     * @param string    $messenger      The EE_messenger->name
91
-     * @param string    $message_type   The EE_message_type->name
92
-     * @param array     $EVT_ID         Optional.  If the template is for a specific EVT_ID (or events) then that should
93
-     *                                  be included.
94
-     * @since 4.9.40.rc.017
95
-     * @return string
96
-     */
97
-    public function getKey($messenger, $message_type, array $EVT_ID = array())
98
-    {
99
-        sort($EVT_ID);
100
-        $EVT_ID = implode(',', array_unique($EVT_ID));
101
-        return md5($messenger . $message_type . $EVT_ID);
102
-    }
88
+	/**
89
+	 * Generates a hash used to identify a given Message Template Group
90
+	 * @param string    $messenger      The EE_messenger->name
91
+	 * @param string    $message_type   The EE_message_type->name
92
+	 * @param array     $EVT_ID         Optional.  If the template is for a specific EVT_ID (or events) then that should
93
+	 *                                  be included.
94
+	 * @since 4.9.40.rc.017
95
+	 * @return string
96
+	 */
97
+	public function getKey($messenger, $message_type, array $EVT_ID = array())
98
+	{
99
+		sort($EVT_ID);
100
+		$EVT_ID = implode(',', array_unique($EVT_ID));
101
+		return md5($messenger . $message_type . $EVT_ID);
102
+	}
103 103
 
104 104
 
105
-    /**
106
-     * This returns a saved EE_Message_Template_Group object if there is one in the repository indexed by a key matching
107
-     * the given string.
108
-     *
109
-     * @param string $key @see EE_Message_Template_Group::get_key() to setup a key formatted for searching.
110
-     * @return null|EE_Message_Template_Group
111
-     */
112
-    public function get_by_key($key)
113
-    {
114
-        $this->rewind();
115
-        while ($this->valid()) {
116
-            $data = $this->getInfo();
117
-            if (isset($data['key']) && $data['key'] === $key) {
118
-                /** @var EE_Message_Template_Group $message_template_group */
119
-                $message_template_group = $this->current();
120
-                $this->rewind();
121
-                return $message_template_group;
122
-            }
123
-            $this->next();
124
-        }
125
-        return null;
126
-    }
105
+	/**
106
+	 * This returns a saved EE_Message_Template_Group object if there is one in the repository indexed by a key matching
107
+	 * the given string.
108
+	 *
109
+	 * @param string $key @see EE_Message_Template_Group::get_key() to setup a key formatted for searching.
110
+	 * @return null|EE_Message_Template_Group
111
+	 */
112
+	public function get_by_key($key)
113
+	{
114
+		$this->rewind();
115
+		while ($this->valid()) {
116
+			$data = $this->getInfo();
117
+			if (isset($data['key']) && $data['key'] === $key) {
118
+				/** @var EE_Message_Template_Group $message_template_group */
119
+				$message_template_group = $this->current();
120
+				$this->rewind();
121
+				return $message_template_group;
122
+			}
123
+			$this->next();
124
+		}
125
+		return null;
126
+	}
127 127
 
128 128
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -98,7 +98,7 @@
 block discarded – undo
98 98
     {
99 99
         sort($EVT_ID);
100 100
         $EVT_ID = implode(',', array_unique($EVT_ID));
101
-        return md5($messenger . $message_type . $EVT_ID);
101
+        return md5($messenger.$message_type.$EVT_ID);
102 102
     }
103 103
 
104 104
 
Please login to merge, or discard this patch.
acceptance_tests/tests/b-TestRegistrationSummaryCept.php 1 patch
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -14,8 +14,8 @@  discard block
 block discarded – undo
14 14
 
15 15
 //need the MER plugin active for this test (we'll deactivate it after).
16 16
 $I->ensurePluginActive(
17
-    'event-espresso-mer-multi-event-registration',
18
-    'activated'
17
+	'event-espresso-mer-multi-event-registration',
18
+	'activated'
19 19
 );
20 20
 
21 21
 //k now we need to make sure the registration multi-status message type is active because it isn't by default
@@ -76,38 +76,38 @@  discard block
 block discarded – undo
76 76
 $I->loginAsAdmin();
77 77
 $I->amOnMessagesActivityListTablePage();
78 78
 $I->see(
79
-    '[email protected]',
80
-    MessagesAdmin::messagesActivityListTableCellSelectorFor(
81
-        'to',
82
-        'Registration Multi-status Summary',
83
-        MessagesAdmin::MESSAGE_STATUS_SENT,
84
-        '',
85
-        'Primary Registrant'
86
-    )
79
+	'[email protected]',
80
+	MessagesAdmin::messagesActivityListTableCellSelectorFor(
81
+		'to',
82
+		'Registration Multi-status Summary',
83
+		MessagesAdmin::MESSAGE_STATUS_SENT,
84
+		'',
85
+		'Primary Registrant'
86
+	)
87 87
 );
88 88
 $I->see(
89
-    '[email protected]',
90
-    MessagesAdmin::messagesActivityListTableCellSelectorFor(
91
-        'to',
92
-        'Registration Multi-status Summary',
93
-        MessagesAdmin::MESSAGE_STATUS_SENT
94
-    )
89
+	'[email protected]',
90
+	MessagesAdmin::messagesActivityListTableCellSelectorFor(
91
+		'to',
92
+		'Registration Multi-status Summary',
93
+		MessagesAdmin::MESSAGE_STATUS_SENT
94
+	)
95 95
 );
96 96
 //verify count
97 97
 $I->verifyMatchingCountofTextInMessageActivityListTableFor(
98
-    1,
99
-    '[email protected]',
100
-    'to',
101
-    'Registration Multi-status Summary',
102
-    MessagesAdmin::MESSAGE_STATUS_SENT,
103
-    'Email',
104
-    'Primary Registrant'
98
+	1,
99
+	'[email protected]',
100
+	'to',
101
+	'Registration Multi-status Summary',
102
+	MessagesAdmin::MESSAGE_STATUS_SENT,
103
+	'Email',
104
+	'Primary Registrant'
105 105
 );
106 106
 $I->verifyMatchingCountofTextInMessageActivityListTableFor(
107
-    1,
108
-    '[email protected]',
109
-    'to',
110
-    'Registration Multi-status Summary'
107
+	1,
108
+	'[email protected]',
109
+	'to',
110
+	'Registration Multi-status Summary'
111 111
 );
112 112
 
113 113
 //okay now let's do some registrations for just the first event and verify that registration multi-status summary is NOT
@@ -137,25 +137,25 @@  discard block
 block discarded – undo
137 137
 $I->loginAsAdmin();
138 138
 $I->amOnMessagesActivityListTablePage();
139 139
 $I->dontSee(
140
-    '[email protected]',
141
-    MessagesAdmin::messagesActivityListTableCellSelectorFor(
142
-        'to',
143
-        'Registration Multi-status Summary',
144
-        MessagesAdmin::MESSAGE_STATUS_SENT,
145
-        '',
146
-        'Primary Registrant'
147
-    )
140
+	'[email protected]',
141
+	MessagesAdmin::messagesActivityListTableCellSelectorFor(
142
+		'to',
143
+		'Registration Multi-status Summary',
144
+		MessagesAdmin::MESSAGE_STATUS_SENT,
145
+		'',
146
+		'Primary Registrant'
147
+	)
148 148
 );
149 149
 //there should still only be one admin multi-status summary thing.
150 150
 $I->verifyMatchingCountofTextInMessageActivityListTableFor(
151
-    1,
152
-    '[email protected]',
153
-    'to',
154
-    'Registration Multi-status Summary'
151
+	1,
152
+	'[email protected]',
153
+	'to',
154
+	'Registration Multi-status Summary'
155 155
 );
156 156
 
157 157
 //deactivate MER plugin so its not active for future tests
158 158
 $I->ensurePluginDeactivated(
159
-    'event-espresso-mer-multi-event-registration',
160
-    'Plugin deactivated'
159
+	'event-espresso-mer-multi-event-registration',
160
+	'Plugin deactivated'
161 161
 );
162 162
\ No newline at end of file
Please login to merge, or discard this patch.
modules/messages/EED_Messages.module.php 1 patch
Indentation   +1071 added lines, -1071 removed lines patch added patch discarded remove patch
@@ -13,1086 +13,1086 @@
 block discarded – undo
13 13
 class EED_Messages extends EED_Module
14 14
 {
15 15
 
16
-    /**
17
-     * This holds the EE_messages controller
18
-     *
19
-     * @deprecated 4.9.0
20
-     * @var EE_messages $_EEMSG
21
-     */
22
-    protected static $_EEMSG;
23
-
24
-    /**
25
-     * @type EE_Message_Resource_Manager $_message_resource_manager
26
-     */
27
-    protected static $_message_resource_manager;
28
-
29
-    /**
30
-     * This holds the EE_Messages_Processor business class.
31
-     *
32
-     * @type EE_Messages_Processor
33
-     */
34
-    protected static $_MSG_PROCESSOR;
35
-
36
-    /**
37
-     * holds all the paths for various messages components.
38
-     * Utilized by autoloader registry
39
-     *
40
-     * @var array
41
-     */
42
-    protected static $_MSG_PATHS;
43
-
44
-
45
-    /**
46
-     * This will hold an array of messages template packs that are registered in the messages system.
47
-     * Format is:
48
-     * array(
49
-     *    'template_pack_dbref' => EE_Messages_Template_Pack (instance)
50
-     * )
51
-     *
52
-     * @var EE_Messages_Template_Pack[]
53
-     */
54
-    protected static $_TMP_PACKS = array();
55
-
56
-
57
-    /**
58
-     * @return EED_Messages
59
-     */
60
-    public static function instance()
61
-    {
62
-        return parent::get_instance(__CLASS__);
63
-    }
64
-
65
-
66
-    /**
67
-     *  set_hooks - for hooking into EE Core, other modules, etc
68
-     *
69
-     * @since 4.5.0
70
-     * @return    void
71
-     */
72
-    public static function set_hooks()
73
-    {
74
-        //actions
75
-        add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
76
-        add_action('AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
77
-            array('EED_Messages', 'maybe_registration'), 10, 2);
78
-        //filters
79
-        add_filter('FHEE__EE_Registration__receipt_url__receipt_url',
80
-            array('EED_Messages', 'registration_message_trigger_url'), 10, 4);
81
-        add_filter('FHEE__EE_Registration__invoice_url__invoice_url',
82
-            array('EED_Messages', 'registration_message_trigger_url'), 10, 4);
83
-        //register routes
84
-        self::_register_routes();
85
-    }
86
-
87
-    /**
88
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
89
-     *
90
-     * @access    public
91
-     * @return    void
92
-     */
93
-    public static function set_hooks_admin()
94
-    {
95
-        //actions
96
-        add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
97
-        add_action('AHEE__Transactions_Admin_Page___send_payment_reminder__process_admin_payment_reminder',
98
-            array('EED_Messages', 'payment_reminder'), 10);
99
-        add_action('AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
100
-            array('EED_Messages', 'maybe_registration'), 10, 3);
101
-        add_action('AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
102
-            array('EED_Messages', 'send_newsletter_message'), 10, 2);
103
-        add_action('AHEE__EES_Espresso_Cancelled__process_shortcode__transaction',
104
-            array('EED_Messages', 'cancelled_registration'), 10);
105
-        add_action('AHEE__EE_Admin_Page___process_admin_payment_notification',
106
-            array('EED_Messages', 'process_admin_payment'), 10, 1);
107
-        //filters
108
-        add_filter('FHEE__EE_Admin_Page___process_resend_registration__success',
109
-            array('EED_Messages', 'process_resend'), 10, 2);
110
-        add_filter('FHEE__EE_Registration__receipt_url__receipt_url',
111
-            array('EED_Messages', 'registration_message_trigger_url'), 10, 4);
112
-        add_filter('FHEE__EE_Registration__invoice_url__invoice_url',
113
-            array('EED_Messages', 'registration_message_trigger_url'), 10, 4);
114
-    }
115
-
116
-
117
-    /**
118
-     * All the message triggers done by route go in here.
119
-     *
120
-     * @since 4.5.0
121
-     * @return void
122
-     */
123
-    protected static function _register_routes()
124
-    {
125
-        EE_Config::register_route('msg_url_trigger', 'Messages', 'run');
126
-        EE_Config::register_route('msg_cron_trigger', 'Messages', 'execute_batch_request');
127
-        EE_Config::register_route('msg_browser_trigger', 'Messages', 'browser_trigger');
128
-        EE_Config::register_route('msg_browser_error_trigger', 'Messages', 'browser_error_trigger');
129
-        do_action('AHEE__EED_Messages___register_routes');
130
-    }
131
-
132
-
133
-    /**
134
-     * This is called when a browser display trigger is executed.
135
-     * The browser display trigger is typically used when a already generated message is displayed directly in the
136
-     * browser.
137
-     *
138
-     * @since 4.9.0
139
-     * @param WP $WP
140
-     */
141
-    public function browser_trigger($WP)
142
-    {
143
-        //ensure controller is loaded
144
-        self::_load_controller();
145
-        $token = EE_Registry::instance()->REQ->get('token');
146
-        try {
147
-            $mtg = new EE_Message_Generated_From_Token($token, 'html', self::$_message_resource_manager);
148
-            self::$_MSG_PROCESSOR->generate_and_send_now($mtg);
149
-        } catch (EE_Error $e) {
150
-            $error_msg = __('Please note that a system message failed to send due to a technical issue.',
151
-                'event_espresso');
152
-            // add specific message for developers if WP_DEBUG in on
153
-            $error_msg .= '||' . $e->getMessage();
154
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
155
-        }
156
-    }
157
-
158
-
159
-    /**
160
-     * This is called when a browser error trigger is executed.
161
-     * When triggered this will grab the EE_Message matching the token in the request and use that to get the error
162
-     * message and display it.
163
-     *
164
-     * @since 4.9.0
165
-     * @param $WP
166
-     */
167
-    public function browser_error_trigger($WP)
168
-    {
169
-        $token = EE_Registry::instance()->REQ->get('token');
170
-        if ($token) {
171
-            $message = EEM_Message::instance()->get_one_by_token($token);
172
-            if ($message instanceof EE_Message) {
173
-                header('HTTP/1.1 200 OK');
174
-                $error_msg = nl2br($message->error_message());
175
-                ?>
16
+	/**
17
+	 * This holds the EE_messages controller
18
+	 *
19
+	 * @deprecated 4.9.0
20
+	 * @var EE_messages $_EEMSG
21
+	 */
22
+	protected static $_EEMSG;
23
+
24
+	/**
25
+	 * @type EE_Message_Resource_Manager $_message_resource_manager
26
+	 */
27
+	protected static $_message_resource_manager;
28
+
29
+	/**
30
+	 * This holds the EE_Messages_Processor business class.
31
+	 *
32
+	 * @type EE_Messages_Processor
33
+	 */
34
+	protected static $_MSG_PROCESSOR;
35
+
36
+	/**
37
+	 * holds all the paths for various messages components.
38
+	 * Utilized by autoloader registry
39
+	 *
40
+	 * @var array
41
+	 */
42
+	protected static $_MSG_PATHS;
43
+
44
+
45
+	/**
46
+	 * This will hold an array of messages template packs that are registered in the messages system.
47
+	 * Format is:
48
+	 * array(
49
+	 *    'template_pack_dbref' => EE_Messages_Template_Pack (instance)
50
+	 * )
51
+	 *
52
+	 * @var EE_Messages_Template_Pack[]
53
+	 */
54
+	protected static $_TMP_PACKS = array();
55
+
56
+
57
+	/**
58
+	 * @return EED_Messages
59
+	 */
60
+	public static function instance()
61
+	{
62
+		return parent::get_instance(__CLASS__);
63
+	}
64
+
65
+
66
+	/**
67
+	 *  set_hooks - for hooking into EE Core, other modules, etc
68
+	 *
69
+	 * @since 4.5.0
70
+	 * @return    void
71
+	 */
72
+	public static function set_hooks()
73
+	{
74
+		//actions
75
+		add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
76
+		add_action('AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
77
+			array('EED_Messages', 'maybe_registration'), 10, 2);
78
+		//filters
79
+		add_filter('FHEE__EE_Registration__receipt_url__receipt_url',
80
+			array('EED_Messages', 'registration_message_trigger_url'), 10, 4);
81
+		add_filter('FHEE__EE_Registration__invoice_url__invoice_url',
82
+			array('EED_Messages', 'registration_message_trigger_url'), 10, 4);
83
+		//register routes
84
+		self::_register_routes();
85
+	}
86
+
87
+	/**
88
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
89
+	 *
90
+	 * @access    public
91
+	 * @return    void
92
+	 */
93
+	public static function set_hooks_admin()
94
+	{
95
+		//actions
96
+		add_action('AHEE__EE_Payment_Processor__update_txn_based_on_payment', array('EED_Messages', 'payment'), 10, 2);
97
+		add_action('AHEE__Transactions_Admin_Page___send_payment_reminder__process_admin_payment_reminder',
98
+			array('EED_Messages', 'payment_reminder'), 10);
99
+		add_action('AHEE__EE_Registration_Processor__trigger_registration_update_notifications',
100
+			array('EED_Messages', 'maybe_registration'), 10, 3);
101
+		add_action('AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send__with_registrations',
102
+			array('EED_Messages', 'send_newsletter_message'), 10, 2);
103
+		add_action('AHEE__EES_Espresso_Cancelled__process_shortcode__transaction',
104
+			array('EED_Messages', 'cancelled_registration'), 10);
105
+		add_action('AHEE__EE_Admin_Page___process_admin_payment_notification',
106
+			array('EED_Messages', 'process_admin_payment'), 10, 1);
107
+		//filters
108
+		add_filter('FHEE__EE_Admin_Page___process_resend_registration__success',
109
+			array('EED_Messages', 'process_resend'), 10, 2);
110
+		add_filter('FHEE__EE_Registration__receipt_url__receipt_url',
111
+			array('EED_Messages', 'registration_message_trigger_url'), 10, 4);
112
+		add_filter('FHEE__EE_Registration__invoice_url__invoice_url',
113
+			array('EED_Messages', 'registration_message_trigger_url'), 10, 4);
114
+	}
115
+
116
+
117
+	/**
118
+	 * All the message triggers done by route go in here.
119
+	 *
120
+	 * @since 4.5.0
121
+	 * @return void
122
+	 */
123
+	protected static function _register_routes()
124
+	{
125
+		EE_Config::register_route('msg_url_trigger', 'Messages', 'run');
126
+		EE_Config::register_route('msg_cron_trigger', 'Messages', 'execute_batch_request');
127
+		EE_Config::register_route('msg_browser_trigger', 'Messages', 'browser_trigger');
128
+		EE_Config::register_route('msg_browser_error_trigger', 'Messages', 'browser_error_trigger');
129
+		do_action('AHEE__EED_Messages___register_routes');
130
+	}
131
+
132
+
133
+	/**
134
+	 * This is called when a browser display trigger is executed.
135
+	 * The browser display trigger is typically used when a already generated message is displayed directly in the
136
+	 * browser.
137
+	 *
138
+	 * @since 4.9.0
139
+	 * @param WP $WP
140
+	 */
141
+	public function browser_trigger($WP)
142
+	{
143
+		//ensure controller is loaded
144
+		self::_load_controller();
145
+		$token = EE_Registry::instance()->REQ->get('token');
146
+		try {
147
+			$mtg = new EE_Message_Generated_From_Token($token, 'html', self::$_message_resource_manager);
148
+			self::$_MSG_PROCESSOR->generate_and_send_now($mtg);
149
+		} catch (EE_Error $e) {
150
+			$error_msg = __('Please note that a system message failed to send due to a technical issue.',
151
+				'event_espresso');
152
+			// add specific message for developers if WP_DEBUG in on
153
+			$error_msg .= '||' . $e->getMessage();
154
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
155
+		}
156
+	}
157
+
158
+
159
+	/**
160
+	 * This is called when a browser error trigger is executed.
161
+	 * When triggered this will grab the EE_Message matching the token in the request and use that to get the error
162
+	 * message and display it.
163
+	 *
164
+	 * @since 4.9.0
165
+	 * @param $WP
166
+	 */
167
+	public function browser_error_trigger($WP)
168
+	{
169
+		$token = EE_Registry::instance()->REQ->get('token');
170
+		if ($token) {
171
+			$message = EEM_Message::instance()->get_one_by_token($token);
172
+			if ($message instanceof EE_Message) {
173
+				header('HTTP/1.1 200 OK');
174
+				$error_msg = nl2br($message->error_message());
175
+				?>
176 176
                 <!DOCTYPE html>
177 177
                 <html>
178 178
                 <head></head>
179 179
                 <body>
180 180
                 <?php echo empty($error_msg)
181
-                    ? esc_html__('Unfortunately, we were unable to capture the error message for this message.',
182
-                        'event_espresso')
183
-                    : wp_kses(
184
-                        $error_msg,
185
-                        array(
186
-                            'a'      => array(
187
-                                'href'  => array(),
188
-                                'title' => array(),
189
-                            ),
190
-                            'span'   => array(),
191
-                            'div'    => array(),
192
-                            'p'      => array(),
193
-                            'strong' => array(),
194
-                            'em'     => array(),
195
-                            'br'     => array(),
196
-                        )
197
-                    ); ?>
181
+					? esc_html__('Unfortunately, we were unable to capture the error message for this message.',
182
+						'event_espresso')
183
+					: wp_kses(
184
+						$error_msg,
185
+						array(
186
+							'a'      => array(
187
+								'href'  => array(),
188
+								'title' => array(),
189
+							),
190
+							'span'   => array(),
191
+							'div'    => array(),
192
+							'p'      => array(),
193
+							'strong' => array(),
194
+							'em'     => array(),
195
+							'br'     => array(),
196
+						)
197
+					); ?>
198 198
                 </body>
199 199
                 </html>
200 200
                 <?php
201
-                exit;
202
-            }
203
-        }
204
-        return;
205
-    }
206
-
207
-
208
-    /**
209
-     *  This runs when the msg_url_trigger route has initiated.
210
-     *
211
-     * @since 4.5.0
212
-     * @param WP $WP
213
-     * @throws EE_Error
214
-     * @return    void
215
-     */
216
-    public function run($WP)
217
-    {
218
-        //ensure controller is loaded
219
-        self::_load_controller();
220
-        // attempt to process message
221
-        try {
222
-            /** @type EE_Message_To_Generate_From_Request $message_to_generate */
223
-            $message_to_generate = EE_Registry::instance()->load_lib('Message_To_Generate_From_Request');
224
-            self::$_MSG_PROCESSOR->generate_and_send_now($message_to_generate);
225
-        } catch (EE_Error $e) {
226
-            $error_msg = __('Please note that a system message failed to send due to a technical issue.',
227
-                'event_espresso');
228
-            // add specific message for developers if WP_DEBUG in on
229
-            $error_msg .= '||' . $e->getMessage();
230
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
231
-        }
232
-    }
233
-
234
-
235
-    /**
236
-     * This is triggered by the 'msg_cron_trigger' route.
237
-     *
238
-     * @param WP $WP
239
-     */
240
-    public function execute_batch_request($WP)
241
-    {
242
-        $this->run_cron();
243
-        header('HTTP/1.1 200 OK');
244
-        exit();
245
-    }
246
-
247
-
248
-    /**
249
-     * This gets executed on wp_cron jobs or when a batch request is initiated on its own separate non regular wp
250
-     * request.
251
-     */
252
-    public function run_cron()
253
-    {
254
-        self::_load_controller();
255
-        //get required vars
256
-        $cron_type     = EE_Registry::instance()->REQ->get('type');
257
-        $transient_key = EE_Registry::instance()->REQ->get('key');
258
-
259
-        //now let's verify transient, if not valid exit immediately
260
-        if (! get_transient($transient_key)) {
261
-            /**
262
-             * trigger error so this gets in the error logs.  This is important because it happens on a non-user request.
263
-             */
264
-            trigger_error(esc_attr__('Invalid Request (Transient does not exist)', 'event_espresso'));
265
-        }
266
-
267
-        //if made it here, lets' delete the transient to keep the db clean
268
-        delete_transient($transient_key);
269
-
270
-        if (apply_filters('FHEE__EED_Messages__run_cron__use_wp_cron', true)) {
271
-
272
-            $method = 'batch_' . $cron_type . '_from_queue';
273
-            if (method_exists(self::$_MSG_PROCESSOR, $method)) {
274
-                self::$_MSG_PROCESSOR->$method();
275
-            } else {
276
-                //no matching task
277
-                /**
278
-                 * trigger error so this gets in the error logs.  This is important because it happens on a non user request.
279
-                 */
280
-                trigger_error(esc_attr(sprintf(__('There is no task corresponding to this route %s', 'event_espresso'),
281
-                    $cron_type)));
282
-            }
283
-        }
284
-
285
-        do_action('FHEE__EED_Messages__run_cron__end');
286
-    }
287
-
288
-
289
-    /**
290
-     * This is used to retrieve the template pack for the given name.
291
-     * Retrieved packs are cached on the static $_TMP_PACKS array.  If there is no class matching the given name then
292
-     * the default template pack is returned.
293
-     *
294
-     * @deprecated 4.9.0  @see EEH_MSG_Template::get_template_pack()
295
-     * @param string $template_pack_name This should correspond to the dbref of the template pack (which is also used
296
-     *                                   in generating the Pack class name).
297
-     * @return EE_Messages_Template_Pack
298
-     */
299
-    public static function get_template_pack($template_pack_name)
300
-    {
301
-        EE_Registry::instance()->load_helper('MSG_Template');
302
-        return EEH_MSG_Template::get_template_pack($template_pack_name);
303
-    }
304
-
305
-
306
-    /**
307
-     * Retrieves an array of all template packs.
308
-     * Array is in the format array( 'dbref' => EE_Messages_Template_Pack )
309
-     *
310
-     * @deprecated 4.9.0  @see EEH_MSG_Template_Pack::get_template_pack_collection
311
-     * @return EE_Messages_Template_Pack[]
312
-     */
313
-    public static function get_template_packs()
314
-    {
315
-        EE_Registry::instance()->load_helper('MSG_Template');
316
-
317
-        //for backward compat, let's make sure this returns in the same format as originally.
318
-        $template_pack_collection = EEH_MSG_Template::get_template_pack_collection();
319
-        $template_pack_collection->rewind();
320
-        $template_packs = array();
321
-        while ($template_pack_collection->valid()) {
322
-            $template_packs[$template_pack_collection->current()->dbref] = $template_pack_collection->current();
323
-            $template_pack_collection->next();
324
-        }
325
-        return $template_packs;
326
-    }
327
-
328
-
329
-    /**
330
-     * This simply makes sure the autoloaders are registered for the EE_messages system.
331
-     *
332
-     * @since 4.5.0
333
-     * @return void
334
-     */
335
-    public static function set_autoloaders()
336
-    {
337
-        if (empty(self::$_MSG_PATHS)) {
338
-            self::_set_messages_paths();
339
-            foreach (self::$_MSG_PATHS as $path) {
340
-                EEH_Autoloader::register_autoloaders_for_each_file_in_folder($path);
341
-            }
342
-            // add aliases
343
-            EEH_Autoloader::add_alias('EE_messages', 'EE_messages');
344
-            EEH_Autoloader::add_alias('EE_messenger', 'EE_messenger');
345
-        }
346
-    }
347
-
348
-
349
-    /**
350
-     * Take care of adding all the paths for the messages components to the $_MSG_PATHS property
351
-     * for use by the Messages Autoloaders
352
-     *
353
-     * @since 4.5.0
354
-     * @return void.
355
-     */
356
-    protected static function _set_messages_paths()
357
-    {
358
-        $dir_ref = array(
359
-            'messages/message_type',
360
-            'messages/messenger',
361
-            'messages/defaults',
362
-            'messages/defaults/email',
363
-            'messages/data_class',
364
-            'messages/validators',
365
-            'messages/validators/email',
366
-            'messages/validators/html',
367
-            'shortcodes',
368
-        );
369
-        $paths   = array();
370
-        foreach ($dir_ref as $index => $dir) {
371
-            $paths[$index] = EE_LIBRARIES . $dir;
372
-        }
373
-        self::$_MSG_PATHS = apply_filters('FHEE__EED_Messages___set_messages_paths___MSG_PATHS', $paths);
374
-    }
375
-
376
-
377
-    /**
378
-     * Takes care of loading dependencies
379
-     *
380
-     * @since 4.5.0
381
-     * @return void
382
-     */
383
-    protected static function _load_controller()
384
-    {
385
-        if (! self::$_MSG_PROCESSOR instanceof EE_Messages_Processor) {
386
-            EE_Registry::instance()->load_core('Request_Handler');
387
-            self::set_autoloaders();
388
-            self::$_EEMSG                    = EE_Registry::instance()->load_lib('messages');
389
-            self::$_MSG_PROCESSOR            = EE_Registry::instance()->load_lib('Messages_Processor');
390
-            self::$_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
391
-        }
392
-    }
393
-
394
-
395
-    /**
396
-     * @param EE_Transaction $transaction
397
-     */
398
-    public static function payment_reminder(EE_Transaction $transaction)
399
-    {
400
-        self::_load_controller();
401
-        $data = array($transaction, null);
402
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers('payment_reminder', $data);
403
-    }
404
-
405
-
406
-    /**
407
-     * Any messages triggers for after successful gateway payments should go in here.
408
-     *
409
-     * @param  EE_Transaction object
410
-     * @param  EE_Payment     object
411
-     * @return void
412
-     */
413
-    public static function payment(EE_Transaction $transaction, EE_Payment $payment)
414
-    {
415
-        self::_load_controller();
416
-        $data = array($transaction, $payment);
417
-        EE_Registry::instance()->load_helper('MSG_Template');
418
-        $message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
419
-        //if payment amount is less than 0 then switch to payment_refund message type.
420
-        $message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
421
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
422
-    }
423
-
424
-
425
-    /**
426
-     * @param EE_Transaction $transaction
427
-     */
428
-    public static function cancelled_registration(EE_Transaction $transaction)
429
-    {
430
-        self::_load_controller();
431
-        $data = array($transaction, null);
432
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers('cancelled_registration', $data);
433
-    }
434
-
435
-
436
-    /**
437
-     * Trigger for Registration messages
438
-     * Note that what registration message type is sent depends on what the reg status is for the registrations on the
439
-     * incoming transaction.
440
-     *
441
-     * @param EE_Registration $registration
442
-     * @param array           $extra_details
443
-     * @return void
444
-     */
445
-    public static function maybe_registration(EE_Registration $registration, $extra_details = array())
446
-    {
447
-
448
-        if (! self::_verify_registration_notification_send($registration, $extra_details)) {
449
-            //no messages please
450
-            return;
451
-        }
452
-
453
-
454
-        //get all registrations so we make sure we send messages for the right status.
455
-        $all_registrations = $registration->transaction()->registrations();
456
-
457
-        //cached array of statuses so we only trigger messages once per status.
458
-        $statuses_sent = array();
459
-        self::_load_controller();
460
-        $mtgs = array();
461
-
462
-        //loop through registrations and trigger messages once per status.
463
-        foreach ($all_registrations as $reg) {
464
-
465
-            //already triggered?
466
-            if (in_array($reg->status_ID(), $statuses_sent)) {
467
-                continue;
468
-            }
469
-
470
-            $message_type    = EEH_MSG_Template::convert_reg_status_to_message_type($reg->status_ID());
471
-            $mtgs            = array_merge(
472
-                    $mtgs,
473
-                    self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
474
-                            $message_type,
475
-                            array($registration->transaction(), null, $reg->status_ID())
476
-                    )
477
-            );
478
-            $statuses_sent[] = $reg->status_ID();
479
-        }
480
-
481
-        if (count($statuses_sent) > 1) {
482
-            $mtgs = array_merge(
483
-                $mtgs,
484
-                self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
485
-                    'registration_summary',
486
-                    array($registration->transaction(), null)
487
-                )
488
-            );
489
-        }
490
-
491
-        //batch queue and initiate request
492
-        self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($mtgs);
493
-        self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
494
-    }
495
-
496
-
497
-    /**
498
-     * This is a helper method used to very whether a registration notification should be sent or
499
-     * not.  Prevents duplicate notifications going out for registration context notifications.
500
-     *
501
-     * @param EE_Registration $registration  [description]
502
-     * @param array           $extra_details [description]
503
-     * @return bool          true = send away, false = nope halt the presses.
504
-     */
505
-    protected static function _verify_registration_notification_send(
506
-        EE_Registration $registration,
507
-        $extra_details = array()
508
-    ) {
509
-        //self::log(
510
-        //	__CLASS__, __FUNCTION__, __LINE__,
511
-        //	$registration->transaction(),
512
-        //	array( '$extra_details' => $extra_details )
513
-        //);
514
-        // currently only using this to send messages for the primary registrant
515
-        if (! $registration->is_primary_registrant()) {
516
-            return false;
517
-        }
518
-        // first we check if we're in admin and not doing front ajax
519
-        if (is_admin() && ! EE_FRONT_AJAX) {
520
-            //make sure appropriate admin params are set for sending messages
521
-            if (empty($_REQUEST['txn_reg_status_change']['send_notifications']) || ! absint($_REQUEST['txn_reg_status_change']['send_notifications'])) {
522
-                //no messages sent please.
523
-                return false;
524
-            }
525
-        } else {
526
-            // frontend request (either regular or via AJAX)
527
-            // TXN is NOT finalized ?
528
-            if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
529
-                return false;
530
-            }
531
-            // return visit but nothing changed ???
532
-            if (
533
-                isset($extra_details['revisit'], $extra_details['status_updates']) &&
534
-                $extra_details['revisit'] && ! $extra_details['status_updates']
535
-            ) {
536
-                return false;
537
-            }
538
-            // NOT sending messages && reg status is something other than "Not-Approved"
539
-            if (
540
-                ! apply_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications', false) &&
541
-                $registration->status_ID() !== EEM_Registration::status_id_not_approved
542
-            ) {
543
-                return false;
544
-            }
545
-        }
546
-        // release the kraken
547
-        return true;
548
-    }
549
-
550
-
551
-    /**
552
-     * Simply returns an array indexed by Registration Status ID and the related message_type name associated with that
553
-     * status id.
554
-     *
555
-     * @deprecated 4.9.0  Use EEH_MSG_Template::reg_status_to_message_type_array()
556
-     *                    or EEH_MSG_Template::convert_reg_status_to_message_type
557
-     * @param string $reg_status
558
-     * @return array
559
-     */
560
-    protected static function _get_reg_status_array($reg_status = '')
561
-    {
562
-        EE_Registry::instance()->load_helper('MSG_Template');
563
-        return EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
564
-            ? EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
565
-            : EEH_MSG_Template::reg_status_to_message_type_array();
566
-    }
567
-
568
-
569
-    /**
570
-     * Simply returns the payment message type for the given payment status.
571
-     *
572
-     * @deprecated 4.9.0 Use EEH_MSG_Template::payment_status_to_message_type_array
573
-     *                   or EEH_MSG_Template::convert_payment_status_to_message_type
574
-     * @param string $payment_status The payment status being matched.
575
-     * @return string|bool The payment message type slug matching the status or false if no match.
576
-     */
577
-    protected static function _get_payment_message_type($payment_status)
578
-    {
579
-        EE_Registry::instance()->load_helper('MSG_Template');
580
-        return EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
581
-            ? EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
582
-            : false;
583
-    }
584
-
585
-
586
-    /**
587
-     * Message triggers for a resending already sent message(s) (via EE_Message list table)
588
-     *
589
-     * @access public
590
-     * @param array $req_data This is the $_POST & $_GET data sent from EE_Admin Pages
591
-     * @return bool          success/fail
592
-     */
593
-    public static function process_resend($req_data)
594
-    {
595
-        self::_load_controller();
596
-
597
-        //if $msgID in this request then skip to the new resend_message
598
-        if (EE_Registry::instance()->REQ->get('MSG_ID')) {
599
-            return self::resend_message();
600
-        }
601
-
602
-        //make sure any incoming request data is set on the REQ so that it gets picked up later.
603
-        $req_data = (array)$req_data;
604
-        foreach ($req_data as $request_key => $request_value) {
605
-            EE_Registry::instance()->REQ->set($request_key, $request_value);
606
-        }
607
-
608
-        if (! $messages_to_send = self::$_MSG_PROCESSOR->setup_messages_to_generate_from_registration_ids_in_request()) {
609
-            return false;
610
-        }
611
-
612
-        try {
613
-            self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($messages_to_send);
614
-            self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
615
-        } catch (EE_Error $e) {
616
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
617
-            return false;
618
-        }
619
-        EE_Error::add_success(
620
-            __('Messages have been successfully queued for generation and sending.', 'event_espresso')
621
-        );
622
-        return true; //everything got queued.
623
-    }
624
-
625
-
626
-    /**
627
-     * Message triggers for a resending already sent message(s) (via EE_Message list table)
628
-     *
629
-     * @return bool
630
-     */
631
-    public static function resend_message()
632
-    {
633
-        self::_load_controller();
634
-
635
-        $msgID = EE_Registry::instance()->REQ->get('MSG_ID');
636
-        if (! $msgID) {
637
-            EE_Error::add_error(__('Something went wrong because there is no "MSG_ID" value in the request',
638
-                'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
639
-            return false;
640
-        }
641
-
642
-        self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send((array)$msgID);
643
-
644
-        //setup success message.
645
-        $count_ready_for_resend = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
646
-        EE_Error::add_success(sprintf(
647
-            _n(
648
-                'There was %d message queued for resending.',
649
-                'There were %d messages queued for resending.',
650
-                $count_ready_for_resend,
651
-                'event_espresso'
652
-            ),
653
-            $count_ready_for_resend
654
-        ));
655
-        return true;
656
-    }
657
-
658
-
659
-    /**
660
-     * Message triggers for manual payment applied by admin
661
-     *
662
-     * @param  EE_Payment $payment EE_payment object
663
-     * @return bool              success/fail
664
-     */
665
-    public static function process_admin_payment(EE_Payment $payment)
666
-    {
667
-        EE_Registry::instance()->load_helper('MSG_Template');
668
-        //we need to get the transaction object
669
-        $transaction = $payment->transaction();
670
-        if ($transaction instanceof EE_Transaction) {
671
-            $data         = array($transaction, $payment);
672
-            $message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
673
-
674
-            //if payment amount is less than 0 then switch to payment_refund message type.
675
-            $message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
676
-
677
-            //if payment_refund is selected, but the status is NOT accepted.  Then change message type to false so NO message notification goes out.
678
-            $message_type = $message_type == 'payment_refund' && $payment->STS_ID() != EEM_Payment::status_id_approved ? false : $message_type;
679
-
680
-            self::_load_controller();
681
-
682
-            self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
683
-
684
-            //get count of queued for generation
685
-            $count_to_generate = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(array(
686
-                EEM_Message::status_incomplete,
687
-                EEM_Message::status_idle,
688
-            ));
689
-
690
-            if ($count_to_generate > 0 && self::$_MSG_PROCESSOR->get_queue()->get_message_repository()->count() !== 0) {
691
-                add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
692
-                return true;
693
-            } else {
694
-                $count_failed = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::instance()->stati_indicating_failed_sending());
695
-                /**
696
-                 * Verify that there are actually errors.  If not then we return a success message because the queue might have been emptied due to successful
697
-                 * IMMEDIATE generation.
698
-                 */
699
-                if ($count_failed > 0) {
700
-                    EE_Error::add_error(sprintf(
701
-                        _n(
702
-                            'The payment notification generation failed.',
703
-                            '%d payment notifications failed being sent.',
704
-                            $count_failed,
705
-                            'event_espresso'
706
-                        ),
707
-                        $count_failed
708
-                    ), __FILE__, __FUNCTION__, __LINE__);
709
-
710
-                    return false;
711
-                } else {
712
-                    add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
713
-                    return true;
714
-                }
715
-            }
716
-        } else {
717
-            EE_Error::add_error(
718
-                'Unable to generate the payment notification because the given value for the transaction is invalid.',
719
-                'event_espresso'
720
-            );
721
-            return false;
722
-        }
723
-    }
724
-
725
-
726
-    /**
727
-     * Callback for AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send_with_registrations trigger
728
-     *
729
-     * @since   4.3.0
730
-     * @param  EE_Registration[] $registrations an array of EE_Registration objects
731
-     * @param  int               $grp_id        a specific message template group id.
732
-     * @return void
733
-     */
734
-    public static function send_newsletter_message($registrations, $grp_id)
735
-    {
736
-        //make sure mtp is id and set it in the EE_Request Handler later messages setup.
737
-        EE_Registry::instance()->REQ->set('GRP_ID', (int)$grp_id);
738
-        self::_load_controller();
739
-        self::$_MSG_PROCESSOR->generate_for_all_active_messengers('newsletter', $registrations);
740
-    }
741
-
742
-
743
-    /**
744
-     * Callback for FHEE__EE_Registration__invoice_url__invoice_url or FHEE__EE_Registration__receipt_url__receipt_url
745
-     *
746
-     * @since   4.3.0
747
-     * @param    string          $registration_message_trigger_url
748
-     * @param    EE_Registration $registration
749
-     * @param string             $messenger
750
-     * @param string             $message_type
751
-     * @return    string
752
-     */
753
-    public static function registration_message_trigger_url(
754
-        $registration_message_trigger_url,
755
-        EE_Registration $registration,
756
-        $messenger = 'html',
757
-        $message_type = 'invoice'
758
-    ) {
759
-        // whitelist $messenger
760
-        switch ($messenger) {
761
-            case 'pdf' :
762
-                $sending_messenger    = 'pdf';
763
-                $generating_messenger = 'html';
764
-                break;
765
-            case 'html' :
766
-            default :
767
-                $sending_messenger    = 'html';
768
-                $generating_messenger = 'html';
769
-                break;
770
-        }
771
-        // whitelist $message_type
772
-        switch ($message_type) {
773
-            case 'receipt' :
774
-                $message_type = 'receipt';
775
-                break;
776
-            case 'invoice' :
777
-            default :
778
-                $message_type = 'invoice';
779
-                break;
780
-        }
781
-        // verify that both the messenger AND the message type are active
782
-        if (EEH_MSG_Template::is_messenger_active($sending_messenger) && EEH_MSG_Template::is_mt_active($message_type)) {
783
-            //need to get the correct message template group for this (i.e. is there a custom invoice for the event this registration is registered for?)
784
-            $template_query_params = array(
785
-                'MTP_is_active'    => true,
786
-                'MTP_messenger'    => $generating_messenger,
787
-                'MTP_message_type' => $message_type,
788
-                'Event.EVT_ID'     => $registration->event_ID(),
789
-            );
790
-            //get the message template group.
791
-            $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
792
-            //if we don't have an EE_Message_Template_Group then return
793
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
794
-                // remove EVT_ID from query params so that global templates get picked up
795
-                unset($template_query_params['Event.EVT_ID']);
796
-                //get global template as the fallback
797
-                $msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
798
-            }
799
-            //if we don't have an EE_Message_Template_Group then return
800
-            if (! $msg_template_group instanceof EE_Message_Template_Group) {
801
-                return '';
802
-            }
803
-            // generate the URL
804
-            $registration_message_trigger_url = EEH_MSG_Template::generate_url_trigger(
805
-                $sending_messenger,
806
-                $generating_messenger,
807
-                'purchaser',
808
-                $message_type,
809
-                $registration,
810
-                $msg_template_group->ID(),
811
-                $registration->transaction_ID()
812
-            );
813
-
814
-        }
815
-        return $registration_message_trigger_url;
816
-    }
817
-
818
-
819
-    /**
820
-     * Use to generate and return a message preview!
821
-     *
822
-     * @param  string $type      This should correspond with a valid message type
823
-     * @param  string $context   This should correspond with a valid context for the message type
824
-     * @param  string $messenger This should correspond with a valid messenger.
825
-     * @param bool    $send      true we will do a test send using the messenger delivery, false we just do a regular
826
-     *                           preview
827
-     * @return string|bool          The body of the message or if send is requested, sends.
828
-     */
829
-    public static function preview_message($type, $context, $messenger, $send = false)
830
-    {
831
-        self::_load_controller();
832
-        $mtg                     = new EE_Message_To_Generate(
833
-            $messenger,
834
-            $type,
835
-            array(),
836
-            $context,
837
-            true
838
-        );
839
-        $generated_preview_queue = self::$_MSG_PROCESSOR->generate_for_preview($mtg, $send);
840
-        if ($generated_preview_queue instanceof EE_Messages_Queue) {
841
-            return $generated_preview_queue->get_message_repository()->current()->content();
842
-        } else {
843
-            return $generated_preview_queue;
844
-        }
845
-    }
846
-
847
-
848
-    /**
849
-     * This is a method that allows for sending a message using a messenger matching the string given and the provided
850
-     * EE_Message_Queue object.  The EE_Message_Queue object is used to create a single aggregate EE_Message via the
851
-     * content found in the EE_Message objects in the queue.
852
-     *
853
-     * @since 4.9.0
854
-     * @param string            $messenger            a string matching a valid active messenger in the system
855
-     * @param string            $message_type         Although it seems contrary to the name of the method, a message
856
-     *                                                type name is still required to send along the message type to the
857
-     *                                                messenger because this is used for determining what specific
858
-     *                                                variations might be loaded for the generated message.
859
-     * @param EE_Messages_Queue $queue
860
-     * @param string            $custom_subject       Can be used to set what the custom subject string will be on the
861
-     *                                                aggregate EE_Message object.
862
-     * @return bool          success or fail.
863
-     */
864
-    public static function send_message_with_messenger_only(
865
-        $messenger,
866
-        $message_type,
867
-        EE_Messages_Queue $queue,
868
-        $custom_subject = ''
869
-    ) {
870
-        self::_load_controller();
871
-        /** @type EE_Message_To_Generate_From_Queue $message_to_generate */
872
-        $message_to_generate = EE_Registry::instance()->load_lib(
873
-            'Message_To_Generate_From_Queue',
874
-            array(
875
-                $messenger,
876
-                $message_type,
877
-                $queue,
878
-                $custom_subject,
879
-            )
880
-        );
881
-        return self::$_MSG_PROCESSOR->queue_for_sending($message_to_generate);
882
-    }
883
-
884
-
885
-    /**
886
-     * Generates Messages immediately for EE_Message IDs (but only for the correct status for generation)
887
-     *
888
-     * @since 4.9.0
889
-     * @param array $message_ids An array of message ids
890
-     * @return bool | EE_Messages_Queue     false if nothing was generated, EE_Messages_Queue containing generated
891
-     *              messages.
892
-     */
893
-    public static function generate_now($message_ids)
894
-    {
895
-        self::_load_controller();
896
-        $messages        = EEM_Message::instance()->get_all(
897
-            array(
898
-                0 => array(
899
-                    'MSG_ID' => array('IN', $message_ids),
900
-                    'STS_ID' => EEM_Message::status_incomplete,
901
-                ),
902
-            )
903
-        );
904
-        $generated_queue = false;
905
-        if ($messages) {
906
-            $generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
907
-        }
908
-
909
-        if (! $generated_queue instanceof EE_Messages_Queue) {
910
-            EE_Error::add_error(
911
-                __('The messages were not generated. This could mean there is already a batch being generated on a separate request, or because the selected messages are not ready for generation. Please wait a minute or two and try again.',
912
-                    'event_espresso'),
913
-                __FILE__, __FUNCTION__, __LINE__
914
-            );
915
-        }
916
-        return $generated_queue;
917
-    }
918
-
919
-
920
-    /**
921
-     * Sends messages immediately for the incoming message_ids that have the status of EEM_Message::status_resend or,
922
-     * EEM_Message::status_idle
923
-     *
924
-     * @since 4.9.0
925
-     * @param $message_ids
926
-     * @return bool | EE_Messages_Queue  false if no messages sent.
927
-     */
928
-    public static function send_now($message_ids)
929
-    {
930
-        self::_load_controller();
931
-        $messages   = EEM_Message::instance()->get_all(
932
-            array(
933
-                0 => array(
934
-                    'MSG_ID' => array('IN', $message_ids),
935
-                    'STS_ID' => array(
936
-                        'IN',
937
-                        array(EEM_Message::status_idle, EEM_Message::status_resend, EEM_Message::status_retry),
938
-                    ),
939
-                ),
940
-            )
941
-        );
942
-        $sent_queue = false;
943
-        if ($messages) {
944
-            $sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
945
-        }
946
-
947
-        if (! $sent_queue instanceof EE_Messages_Queue) {
948
-            EE_Error::add_error(
949
-                __('The messages were not sent. This could mean there is already a batch being sent on a separate request, or because the selected messages are not sendable. Please wait a minute or two and try again.',
950
-                    'event_espresso'),
951
-                __FILE__, __FUNCTION__, __LINE__
952
-            );
953
-        } else {
954
-            //can count how many sent by using the messages in the queue
955
-            $sent_count = $sent_queue->count_STS_in_queue(EEM_Message::instance()->stati_indicating_sent());
956
-            if ($sent_count > 0) {
957
-                EE_Error::add_success(
958
-                    sprintf(
959
-                        _n(
960
-                            'There was %d message successfully sent.',
961
-                            'There were %d messages successfully sent.',
962
-                            $sent_count,
963
-                            'event_espresso'
964
-                        ),
965
-                        $sent_count
966
-                    )
967
-                );
968
-            } else {
969
-                EE_Error::overwrite_errors();
970
-                EE_Error::add_error(
971
-                    __('No message was sent because of problems with sending. Either all the messages you selected were not a sendable message, they were ALREADY sent on a different scheduled task, or there was an error.
201
+				exit;
202
+			}
203
+		}
204
+		return;
205
+	}
206
+
207
+
208
+	/**
209
+	 *  This runs when the msg_url_trigger route has initiated.
210
+	 *
211
+	 * @since 4.5.0
212
+	 * @param WP $WP
213
+	 * @throws EE_Error
214
+	 * @return    void
215
+	 */
216
+	public function run($WP)
217
+	{
218
+		//ensure controller is loaded
219
+		self::_load_controller();
220
+		// attempt to process message
221
+		try {
222
+			/** @type EE_Message_To_Generate_From_Request $message_to_generate */
223
+			$message_to_generate = EE_Registry::instance()->load_lib('Message_To_Generate_From_Request');
224
+			self::$_MSG_PROCESSOR->generate_and_send_now($message_to_generate);
225
+		} catch (EE_Error $e) {
226
+			$error_msg = __('Please note that a system message failed to send due to a technical issue.',
227
+				'event_espresso');
228
+			// add specific message for developers if WP_DEBUG in on
229
+			$error_msg .= '||' . $e->getMessage();
230
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
231
+		}
232
+	}
233
+
234
+
235
+	/**
236
+	 * This is triggered by the 'msg_cron_trigger' route.
237
+	 *
238
+	 * @param WP $WP
239
+	 */
240
+	public function execute_batch_request($WP)
241
+	{
242
+		$this->run_cron();
243
+		header('HTTP/1.1 200 OK');
244
+		exit();
245
+	}
246
+
247
+
248
+	/**
249
+	 * This gets executed on wp_cron jobs or when a batch request is initiated on its own separate non regular wp
250
+	 * request.
251
+	 */
252
+	public function run_cron()
253
+	{
254
+		self::_load_controller();
255
+		//get required vars
256
+		$cron_type     = EE_Registry::instance()->REQ->get('type');
257
+		$transient_key = EE_Registry::instance()->REQ->get('key');
258
+
259
+		//now let's verify transient, if not valid exit immediately
260
+		if (! get_transient($transient_key)) {
261
+			/**
262
+			 * trigger error so this gets in the error logs.  This is important because it happens on a non-user request.
263
+			 */
264
+			trigger_error(esc_attr__('Invalid Request (Transient does not exist)', 'event_espresso'));
265
+		}
266
+
267
+		//if made it here, lets' delete the transient to keep the db clean
268
+		delete_transient($transient_key);
269
+
270
+		if (apply_filters('FHEE__EED_Messages__run_cron__use_wp_cron', true)) {
271
+
272
+			$method = 'batch_' . $cron_type . '_from_queue';
273
+			if (method_exists(self::$_MSG_PROCESSOR, $method)) {
274
+				self::$_MSG_PROCESSOR->$method();
275
+			} else {
276
+				//no matching task
277
+				/**
278
+				 * trigger error so this gets in the error logs.  This is important because it happens on a non user request.
279
+				 */
280
+				trigger_error(esc_attr(sprintf(__('There is no task corresponding to this route %s', 'event_espresso'),
281
+					$cron_type)));
282
+			}
283
+		}
284
+
285
+		do_action('FHEE__EED_Messages__run_cron__end');
286
+	}
287
+
288
+
289
+	/**
290
+	 * This is used to retrieve the template pack for the given name.
291
+	 * Retrieved packs are cached on the static $_TMP_PACKS array.  If there is no class matching the given name then
292
+	 * the default template pack is returned.
293
+	 *
294
+	 * @deprecated 4.9.0  @see EEH_MSG_Template::get_template_pack()
295
+	 * @param string $template_pack_name This should correspond to the dbref of the template pack (which is also used
296
+	 *                                   in generating the Pack class name).
297
+	 * @return EE_Messages_Template_Pack
298
+	 */
299
+	public static function get_template_pack($template_pack_name)
300
+	{
301
+		EE_Registry::instance()->load_helper('MSG_Template');
302
+		return EEH_MSG_Template::get_template_pack($template_pack_name);
303
+	}
304
+
305
+
306
+	/**
307
+	 * Retrieves an array of all template packs.
308
+	 * Array is in the format array( 'dbref' => EE_Messages_Template_Pack )
309
+	 *
310
+	 * @deprecated 4.9.0  @see EEH_MSG_Template_Pack::get_template_pack_collection
311
+	 * @return EE_Messages_Template_Pack[]
312
+	 */
313
+	public static function get_template_packs()
314
+	{
315
+		EE_Registry::instance()->load_helper('MSG_Template');
316
+
317
+		//for backward compat, let's make sure this returns in the same format as originally.
318
+		$template_pack_collection = EEH_MSG_Template::get_template_pack_collection();
319
+		$template_pack_collection->rewind();
320
+		$template_packs = array();
321
+		while ($template_pack_collection->valid()) {
322
+			$template_packs[$template_pack_collection->current()->dbref] = $template_pack_collection->current();
323
+			$template_pack_collection->next();
324
+		}
325
+		return $template_packs;
326
+	}
327
+
328
+
329
+	/**
330
+	 * This simply makes sure the autoloaders are registered for the EE_messages system.
331
+	 *
332
+	 * @since 4.5.0
333
+	 * @return void
334
+	 */
335
+	public static function set_autoloaders()
336
+	{
337
+		if (empty(self::$_MSG_PATHS)) {
338
+			self::_set_messages_paths();
339
+			foreach (self::$_MSG_PATHS as $path) {
340
+				EEH_Autoloader::register_autoloaders_for_each_file_in_folder($path);
341
+			}
342
+			// add aliases
343
+			EEH_Autoloader::add_alias('EE_messages', 'EE_messages');
344
+			EEH_Autoloader::add_alias('EE_messenger', 'EE_messenger');
345
+		}
346
+	}
347
+
348
+
349
+	/**
350
+	 * Take care of adding all the paths for the messages components to the $_MSG_PATHS property
351
+	 * for use by the Messages Autoloaders
352
+	 *
353
+	 * @since 4.5.0
354
+	 * @return void.
355
+	 */
356
+	protected static function _set_messages_paths()
357
+	{
358
+		$dir_ref = array(
359
+			'messages/message_type',
360
+			'messages/messenger',
361
+			'messages/defaults',
362
+			'messages/defaults/email',
363
+			'messages/data_class',
364
+			'messages/validators',
365
+			'messages/validators/email',
366
+			'messages/validators/html',
367
+			'shortcodes',
368
+		);
369
+		$paths   = array();
370
+		foreach ($dir_ref as $index => $dir) {
371
+			$paths[$index] = EE_LIBRARIES . $dir;
372
+		}
373
+		self::$_MSG_PATHS = apply_filters('FHEE__EED_Messages___set_messages_paths___MSG_PATHS', $paths);
374
+	}
375
+
376
+
377
+	/**
378
+	 * Takes care of loading dependencies
379
+	 *
380
+	 * @since 4.5.0
381
+	 * @return void
382
+	 */
383
+	protected static function _load_controller()
384
+	{
385
+		if (! self::$_MSG_PROCESSOR instanceof EE_Messages_Processor) {
386
+			EE_Registry::instance()->load_core('Request_Handler');
387
+			self::set_autoloaders();
388
+			self::$_EEMSG                    = EE_Registry::instance()->load_lib('messages');
389
+			self::$_MSG_PROCESSOR            = EE_Registry::instance()->load_lib('Messages_Processor');
390
+			self::$_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
391
+		}
392
+	}
393
+
394
+
395
+	/**
396
+	 * @param EE_Transaction $transaction
397
+	 */
398
+	public static function payment_reminder(EE_Transaction $transaction)
399
+	{
400
+		self::_load_controller();
401
+		$data = array($transaction, null);
402
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers('payment_reminder', $data);
403
+	}
404
+
405
+
406
+	/**
407
+	 * Any messages triggers for after successful gateway payments should go in here.
408
+	 *
409
+	 * @param  EE_Transaction object
410
+	 * @param  EE_Payment     object
411
+	 * @return void
412
+	 */
413
+	public static function payment(EE_Transaction $transaction, EE_Payment $payment)
414
+	{
415
+		self::_load_controller();
416
+		$data = array($transaction, $payment);
417
+		EE_Registry::instance()->load_helper('MSG_Template');
418
+		$message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
419
+		//if payment amount is less than 0 then switch to payment_refund message type.
420
+		$message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
421
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
422
+	}
423
+
424
+
425
+	/**
426
+	 * @param EE_Transaction $transaction
427
+	 */
428
+	public static function cancelled_registration(EE_Transaction $transaction)
429
+	{
430
+		self::_load_controller();
431
+		$data = array($transaction, null);
432
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers('cancelled_registration', $data);
433
+	}
434
+
435
+
436
+	/**
437
+	 * Trigger for Registration messages
438
+	 * Note that what registration message type is sent depends on what the reg status is for the registrations on the
439
+	 * incoming transaction.
440
+	 *
441
+	 * @param EE_Registration $registration
442
+	 * @param array           $extra_details
443
+	 * @return void
444
+	 */
445
+	public static function maybe_registration(EE_Registration $registration, $extra_details = array())
446
+	{
447
+
448
+		if (! self::_verify_registration_notification_send($registration, $extra_details)) {
449
+			//no messages please
450
+			return;
451
+		}
452
+
453
+
454
+		//get all registrations so we make sure we send messages for the right status.
455
+		$all_registrations = $registration->transaction()->registrations();
456
+
457
+		//cached array of statuses so we only trigger messages once per status.
458
+		$statuses_sent = array();
459
+		self::_load_controller();
460
+		$mtgs = array();
461
+
462
+		//loop through registrations and trigger messages once per status.
463
+		foreach ($all_registrations as $reg) {
464
+
465
+			//already triggered?
466
+			if (in_array($reg->status_ID(), $statuses_sent)) {
467
+				continue;
468
+			}
469
+
470
+			$message_type    = EEH_MSG_Template::convert_reg_status_to_message_type($reg->status_ID());
471
+			$mtgs            = array_merge(
472
+					$mtgs,
473
+					self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
474
+							$message_type,
475
+							array($registration->transaction(), null, $reg->status_ID())
476
+					)
477
+			);
478
+			$statuses_sent[] = $reg->status_ID();
479
+		}
480
+
481
+		if (count($statuses_sent) > 1) {
482
+			$mtgs = array_merge(
483
+				$mtgs,
484
+				self::$_MSG_PROCESSOR->setup_mtgs_for_all_active_messengers(
485
+					'registration_summary',
486
+					array($registration->transaction(), null)
487
+				)
488
+			);
489
+		}
490
+
491
+		//batch queue and initiate request
492
+		self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($mtgs);
493
+		self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
494
+	}
495
+
496
+
497
+	/**
498
+	 * This is a helper method used to very whether a registration notification should be sent or
499
+	 * not.  Prevents duplicate notifications going out for registration context notifications.
500
+	 *
501
+	 * @param EE_Registration $registration  [description]
502
+	 * @param array           $extra_details [description]
503
+	 * @return bool          true = send away, false = nope halt the presses.
504
+	 */
505
+	protected static function _verify_registration_notification_send(
506
+		EE_Registration $registration,
507
+		$extra_details = array()
508
+	) {
509
+		//self::log(
510
+		//	__CLASS__, __FUNCTION__, __LINE__,
511
+		//	$registration->transaction(),
512
+		//	array( '$extra_details' => $extra_details )
513
+		//);
514
+		// currently only using this to send messages for the primary registrant
515
+		if (! $registration->is_primary_registrant()) {
516
+			return false;
517
+		}
518
+		// first we check if we're in admin and not doing front ajax
519
+		if (is_admin() && ! EE_FRONT_AJAX) {
520
+			//make sure appropriate admin params are set for sending messages
521
+			if (empty($_REQUEST['txn_reg_status_change']['send_notifications']) || ! absint($_REQUEST['txn_reg_status_change']['send_notifications'])) {
522
+				//no messages sent please.
523
+				return false;
524
+			}
525
+		} else {
526
+			// frontend request (either regular or via AJAX)
527
+			// TXN is NOT finalized ?
528
+			if (! isset($extra_details['finalized']) || $extra_details['finalized'] === false) {
529
+				return false;
530
+			}
531
+			// return visit but nothing changed ???
532
+			if (
533
+				isset($extra_details['revisit'], $extra_details['status_updates']) &&
534
+				$extra_details['revisit'] && ! $extra_details['status_updates']
535
+			) {
536
+				return false;
537
+			}
538
+			// NOT sending messages && reg status is something other than "Not-Approved"
539
+			if (
540
+				! apply_filters('FHEE__EED_Messages___maybe_registration__deliver_notifications', false) &&
541
+				$registration->status_ID() !== EEM_Registration::status_id_not_approved
542
+			) {
543
+				return false;
544
+			}
545
+		}
546
+		// release the kraken
547
+		return true;
548
+	}
549
+
550
+
551
+	/**
552
+	 * Simply returns an array indexed by Registration Status ID and the related message_type name associated with that
553
+	 * status id.
554
+	 *
555
+	 * @deprecated 4.9.0  Use EEH_MSG_Template::reg_status_to_message_type_array()
556
+	 *                    or EEH_MSG_Template::convert_reg_status_to_message_type
557
+	 * @param string $reg_status
558
+	 * @return array
559
+	 */
560
+	protected static function _get_reg_status_array($reg_status = '')
561
+	{
562
+		EE_Registry::instance()->load_helper('MSG_Template');
563
+		return EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
564
+			? EEH_MSG_Template::convert_reg_status_to_message_type($reg_status)
565
+			: EEH_MSG_Template::reg_status_to_message_type_array();
566
+	}
567
+
568
+
569
+	/**
570
+	 * Simply returns the payment message type for the given payment status.
571
+	 *
572
+	 * @deprecated 4.9.0 Use EEH_MSG_Template::payment_status_to_message_type_array
573
+	 *                   or EEH_MSG_Template::convert_payment_status_to_message_type
574
+	 * @param string $payment_status The payment status being matched.
575
+	 * @return string|bool The payment message type slug matching the status or false if no match.
576
+	 */
577
+	protected static function _get_payment_message_type($payment_status)
578
+	{
579
+		EE_Registry::instance()->load_helper('MSG_Template');
580
+		return EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
581
+			? EEH_MSG_Template::convert_payment_status_to_message_type($payment_status)
582
+			: false;
583
+	}
584
+
585
+
586
+	/**
587
+	 * Message triggers for a resending already sent message(s) (via EE_Message list table)
588
+	 *
589
+	 * @access public
590
+	 * @param array $req_data This is the $_POST & $_GET data sent from EE_Admin Pages
591
+	 * @return bool          success/fail
592
+	 */
593
+	public static function process_resend($req_data)
594
+	{
595
+		self::_load_controller();
596
+
597
+		//if $msgID in this request then skip to the new resend_message
598
+		if (EE_Registry::instance()->REQ->get('MSG_ID')) {
599
+			return self::resend_message();
600
+		}
601
+
602
+		//make sure any incoming request data is set on the REQ so that it gets picked up later.
603
+		$req_data = (array)$req_data;
604
+		foreach ($req_data as $request_key => $request_value) {
605
+			EE_Registry::instance()->REQ->set($request_key, $request_value);
606
+		}
607
+
608
+		if (! $messages_to_send = self::$_MSG_PROCESSOR->setup_messages_to_generate_from_registration_ids_in_request()) {
609
+			return false;
610
+		}
611
+
612
+		try {
613
+			self::$_MSG_PROCESSOR->batch_queue_for_generation_and_persist($messages_to_send);
614
+			self::$_MSG_PROCESSOR->get_queue()->initiate_request_by_priority();
615
+		} catch (EE_Error $e) {
616
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
617
+			return false;
618
+		}
619
+		EE_Error::add_success(
620
+			__('Messages have been successfully queued for generation and sending.', 'event_espresso')
621
+		);
622
+		return true; //everything got queued.
623
+	}
624
+
625
+
626
+	/**
627
+	 * Message triggers for a resending already sent message(s) (via EE_Message list table)
628
+	 *
629
+	 * @return bool
630
+	 */
631
+	public static function resend_message()
632
+	{
633
+		self::_load_controller();
634
+
635
+		$msgID = EE_Registry::instance()->REQ->get('MSG_ID');
636
+		if (! $msgID) {
637
+			EE_Error::add_error(__('Something went wrong because there is no "MSG_ID" value in the request',
638
+				'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
639
+			return false;
640
+		}
641
+
642
+		self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send((array)$msgID);
643
+
644
+		//setup success message.
645
+		$count_ready_for_resend = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
646
+		EE_Error::add_success(sprintf(
647
+			_n(
648
+				'There was %d message queued for resending.',
649
+				'There were %d messages queued for resending.',
650
+				$count_ready_for_resend,
651
+				'event_espresso'
652
+			),
653
+			$count_ready_for_resend
654
+		));
655
+		return true;
656
+	}
657
+
658
+
659
+	/**
660
+	 * Message triggers for manual payment applied by admin
661
+	 *
662
+	 * @param  EE_Payment $payment EE_payment object
663
+	 * @return bool              success/fail
664
+	 */
665
+	public static function process_admin_payment(EE_Payment $payment)
666
+	{
667
+		EE_Registry::instance()->load_helper('MSG_Template');
668
+		//we need to get the transaction object
669
+		$transaction = $payment->transaction();
670
+		if ($transaction instanceof EE_Transaction) {
671
+			$data         = array($transaction, $payment);
672
+			$message_type = EEH_MSG_Template::convert_payment_status_to_message_type($payment->STS_ID());
673
+
674
+			//if payment amount is less than 0 then switch to payment_refund message type.
675
+			$message_type = $payment->amount() < 0 ? 'payment_refund' : $message_type;
676
+
677
+			//if payment_refund is selected, but the status is NOT accepted.  Then change message type to false so NO message notification goes out.
678
+			$message_type = $message_type == 'payment_refund' && $payment->STS_ID() != EEM_Payment::status_id_approved ? false : $message_type;
679
+
680
+			self::_load_controller();
681
+
682
+			self::$_MSG_PROCESSOR->generate_for_all_active_messengers($message_type, $data);
683
+
684
+			//get count of queued for generation
685
+			$count_to_generate = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(array(
686
+				EEM_Message::status_incomplete,
687
+				EEM_Message::status_idle,
688
+			));
689
+
690
+			if ($count_to_generate > 0 && self::$_MSG_PROCESSOR->get_queue()->get_message_repository()->count() !== 0) {
691
+				add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
692
+				return true;
693
+			} else {
694
+				$count_failed = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::instance()->stati_indicating_failed_sending());
695
+				/**
696
+				 * Verify that there are actually errors.  If not then we return a success message because the queue might have been emptied due to successful
697
+				 * IMMEDIATE generation.
698
+				 */
699
+				if ($count_failed > 0) {
700
+					EE_Error::add_error(sprintf(
701
+						_n(
702
+							'The payment notification generation failed.',
703
+							'%d payment notifications failed being sent.',
704
+							$count_failed,
705
+							'event_espresso'
706
+						),
707
+						$count_failed
708
+					), __FILE__, __FUNCTION__, __LINE__);
709
+
710
+					return false;
711
+				} else {
712
+					add_filter('FHEE__EE_Admin_Page___process_admin_payment_notification__success', '__return_true');
713
+					return true;
714
+				}
715
+			}
716
+		} else {
717
+			EE_Error::add_error(
718
+				'Unable to generate the payment notification because the given value for the transaction is invalid.',
719
+				'event_espresso'
720
+			);
721
+			return false;
722
+		}
723
+	}
724
+
725
+
726
+	/**
727
+	 * Callback for AHEE__Extend_Registrations_Admin_Page___newsletter_selected_send_with_registrations trigger
728
+	 *
729
+	 * @since   4.3.0
730
+	 * @param  EE_Registration[] $registrations an array of EE_Registration objects
731
+	 * @param  int               $grp_id        a specific message template group id.
732
+	 * @return void
733
+	 */
734
+	public static function send_newsletter_message($registrations, $grp_id)
735
+	{
736
+		//make sure mtp is id and set it in the EE_Request Handler later messages setup.
737
+		EE_Registry::instance()->REQ->set('GRP_ID', (int)$grp_id);
738
+		self::_load_controller();
739
+		self::$_MSG_PROCESSOR->generate_for_all_active_messengers('newsletter', $registrations);
740
+	}
741
+
742
+
743
+	/**
744
+	 * Callback for FHEE__EE_Registration__invoice_url__invoice_url or FHEE__EE_Registration__receipt_url__receipt_url
745
+	 *
746
+	 * @since   4.3.0
747
+	 * @param    string          $registration_message_trigger_url
748
+	 * @param    EE_Registration $registration
749
+	 * @param string             $messenger
750
+	 * @param string             $message_type
751
+	 * @return    string
752
+	 */
753
+	public static function registration_message_trigger_url(
754
+		$registration_message_trigger_url,
755
+		EE_Registration $registration,
756
+		$messenger = 'html',
757
+		$message_type = 'invoice'
758
+	) {
759
+		// whitelist $messenger
760
+		switch ($messenger) {
761
+			case 'pdf' :
762
+				$sending_messenger    = 'pdf';
763
+				$generating_messenger = 'html';
764
+				break;
765
+			case 'html' :
766
+			default :
767
+				$sending_messenger    = 'html';
768
+				$generating_messenger = 'html';
769
+				break;
770
+		}
771
+		// whitelist $message_type
772
+		switch ($message_type) {
773
+			case 'receipt' :
774
+				$message_type = 'receipt';
775
+				break;
776
+			case 'invoice' :
777
+			default :
778
+				$message_type = 'invoice';
779
+				break;
780
+		}
781
+		// verify that both the messenger AND the message type are active
782
+		if (EEH_MSG_Template::is_messenger_active($sending_messenger) && EEH_MSG_Template::is_mt_active($message_type)) {
783
+			//need to get the correct message template group for this (i.e. is there a custom invoice for the event this registration is registered for?)
784
+			$template_query_params = array(
785
+				'MTP_is_active'    => true,
786
+				'MTP_messenger'    => $generating_messenger,
787
+				'MTP_message_type' => $message_type,
788
+				'Event.EVT_ID'     => $registration->event_ID(),
789
+			);
790
+			//get the message template group.
791
+			$msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
792
+			//if we don't have an EE_Message_Template_Group then return
793
+			if (! $msg_template_group instanceof EE_Message_Template_Group) {
794
+				// remove EVT_ID from query params so that global templates get picked up
795
+				unset($template_query_params['Event.EVT_ID']);
796
+				//get global template as the fallback
797
+				$msg_template_group = EEM_Message_Template_Group::instance()->get_one(array($template_query_params));
798
+			}
799
+			//if we don't have an EE_Message_Template_Group then return
800
+			if (! $msg_template_group instanceof EE_Message_Template_Group) {
801
+				return '';
802
+			}
803
+			// generate the URL
804
+			$registration_message_trigger_url = EEH_MSG_Template::generate_url_trigger(
805
+				$sending_messenger,
806
+				$generating_messenger,
807
+				'purchaser',
808
+				$message_type,
809
+				$registration,
810
+				$msg_template_group->ID(),
811
+				$registration->transaction_ID()
812
+			);
813
+
814
+		}
815
+		return $registration_message_trigger_url;
816
+	}
817
+
818
+
819
+	/**
820
+	 * Use to generate and return a message preview!
821
+	 *
822
+	 * @param  string $type      This should correspond with a valid message type
823
+	 * @param  string $context   This should correspond with a valid context for the message type
824
+	 * @param  string $messenger This should correspond with a valid messenger.
825
+	 * @param bool    $send      true we will do a test send using the messenger delivery, false we just do a regular
826
+	 *                           preview
827
+	 * @return string|bool          The body of the message or if send is requested, sends.
828
+	 */
829
+	public static function preview_message($type, $context, $messenger, $send = false)
830
+	{
831
+		self::_load_controller();
832
+		$mtg                     = new EE_Message_To_Generate(
833
+			$messenger,
834
+			$type,
835
+			array(),
836
+			$context,
837
+			true
838
+		);
839
+		$generated_preview_queue = self::$_MSG_PROCESSOR->generate_for_preview($mtg, $send);
840
+		if ($generated_preview_queue instanceof EE_Messages_Queue) {
841
+			return $generated_preview_queue->get_message_repository()->current()->content();
842
+		} else {
843
+			return $generated_preview_queue;
844
+		}
845
+	}
846
+
847
+
848
+	/**
849
+	 * This is a method that allows for sending a message using a messenger matching the string given and the provided
850
+	 * EE_Message_Queue object.  The EE_Message_Queue object is used to create a single aggregate EE_Message via the
851
+	 * content found in the EE_Message objects in the queue.
852
+	 *
853
+	 * @since 4.9.0
854
+	 * @param string            $messenger            a string matching a valid active messenger in the system
855
+	 * @param string            $message_type         Although it seems contrary to the name of the method, a message
856
+	 *                                                type name is still required to send along the message type to the
857
+	 *                                                messenger because this is used for determining what specific
858
+	 *                                                variations might be loaded for the generated message.
859
+	 * @param EE_Messages_Queue $queue
860
+	 * @param string            $custom_subject       Can be used to set what the custom subject string will be on the
861
+	 *                                                aggregate EE_Message object.
862
+	 * @return bool          success or fail.
863
+	 */
864
+	public static function send_message_with_messenger_only(
865
+		$messenger,
866
+		$message_type,
867
+		EE_Messages_Queue $queue,
868
+		$custom_subject = ''
869
+	) {
870
+		self::_load_controller();
871
+		/** @type EE_Message_To_Generate_From_Queue $message_to_generate */
872
+		$message_to_generate = EE_Registry::instance()->load_lib(
873
+			'Message_To_Generate_From_Queue',
874
+			array(
875
+				$messenger,
876
+				$message_type,
877
+				$queue,
878
+				$custom_subject,
879
+			)
880
+		);
881
+		return self::$_MSG_PROCESSOR->queue_for_sending($message_to_generate);
882
+	}
883
+
884
+
885
+	/**
886
+	 * Generates Messages immediately for EE_Message IDs (but only for the correct status for generation)
887
+	 *
888
+	 * @since 4.9.0
889
+	 * @param array $message_ids An array of message ids
890
+	 * @return bool | EE_Messages_Queue     false if nothing was generated, EE_Messages_Queue containing generated
891
+	 *              messages.
892
+	 */
893
+	public static function generate_now($message_ids)
894
+	{
895
+		self::_load_controller();
896
+		$messages        = EEM_Message::instance()->get_all(
897
+			array(
898
+				0 => array(
899
+					'MSG_ID' => array('IN', $message_ids),
900
+					'STS_ID' => EEM_Message::status_incomplete,
901
+				),
902
+			)
903
+		);
904
+		$generated_queue = false;
905
+		if ($messages) {
906
+			$generated_queue = self::$_MSG_PROCESSOR->batch_generate_from_queue($messages);
907
+		}
908
+
909
+		if (! $generated_queue instanceof EE_Messages_Queue) {
910
+			EE_Error::add_error(
911
+				__('The messages were not generated. This could mean there is already a batch being generated on a separate request, or because the selected messages are not ready for generation. Please wait a minute or two and try again.',
912
+					'event_espresso'),
913
+				__FILE__, __FUNCTION__, __LINE__
914
+			);
915
+		}
916
+		return $generated_queue;
917
+	}
918
+
919
+
920
+	/**
921
+	 * Sends messages immediately for the incoming message_ids that have the status of EEM_Message::status_resend or,
922
+	 * EEM_Message::status_idle
923
+	 *
924
+	 * @since 4.9.0
925
+	 * @param $message_ids
926
+	 * @return bool | EE_Messages_Queue  false if no messages sent.
927
+	 */
928
+	public static function send_now($message_ids)
929
+	{
930
+		self::_load_controller();
931
+		$messages   = EEM_Message::instance()->get_all(
932
+			array(
933
+				0 => array(
934
+					'MSG_ID' => array('IN', $message_ids),
935
+					'STS_ID' => array(
936
+						'IN',
937
+						array(EEM_Message::status_idle, EEM_Message::status_resend, EEM_Message::status_retry),
938
+					),
939
+				),
940
+			)
941
+		);
942
+		$sent_queue = false;
943
+		if ($messages) {
944
+			$sent_queue = self::$_MSG_PROCESSOR->batch_send_from_queue($messages);
945
+		}
946
+
947
+		if (! $sent_queue instanceof EE_Messages_Queue) {
948
+			EE_Error::add_error(
949
+				__('The messages were not sent. This could mean there is already a batch being sent on a separate request, or because the selected messages are not sendable. Please wait a minute or two and try again.',
950
+					'event_espresso'),
951
+				__FILE__, __FUNCTION__, __LINE__
952
+			);
953
+		} else {
954
+			//can count how many sent by using the messages in the queue
955
+			$sent_count = $sent_queue->count_STS_in_queue(EEM_Message::instance()->stati_indicating_sent());
956
+			if ($sent_count > 0) {
957
+				EE_Error::add_success(
958
+					sprintf(
959
+						_n(
960
+							'There was %d message successfully sent.',
961
+							'There were %d messages successfully sent.',
962
+							$sent_count,
963
+							'event_espresso'
964
+						),
965
+						$sent_count
966
+					)
967
+				);
968
+			} else {
969
+				EE_Error::overwrite_errors();
970
+				EE_Error::add_error(
971
+					__('No message was sent because of problems with sending. Either all the messages you selected were not a sendable message, they were ALREADY sent on a different scheduled task, or there was an error.
972 972
 					If there was an error, you can look at the messages in the message activity list table for any error messages.',
973
-                        'event_espresso'),
974
-                    __FILE__, __FUNCTION__, __LINE__
975
-                );
976
-            }
977
-        }
978
-        return $sent_queue;
979
-    }
980
-
981
-
982
-    /**
983
-     * This will queue the incoming message ids for resending.
984
-     * Note, only message_ids corresponding to messages with the status of EEM_Message::sent will be queued.
985
-     *
986
-     * @since 4.9.0
987
-     * @param array $message_ids An array of EE_Message IDs
988
-     * @return bool  true means messages were successfully queued for resending, false means none were queued for
989
-     *               resending.
990
-     */
991
-    public static function queue_for_resending($message_ids)
992
-    {
993
-        self::_load_controller();
994
-        self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send($message_ids);
995
-
996
-        //get queue and count
997
-        $queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
998
-
999
-        if (
1000
-            $queue_count > 0
1001
-        ) {
1002
-            EE_Error::add_success(
1003
-                sprintf(
1004
-                    _n(
1005
-                        '%d message successfully queued for resending.',
1006
-                        '%d messages successfully queued for resending.',
1007
-                        $queue_count,
1008
-                        'event_espresso'
1009
-                    ),
1010
-                    $queue_count
1011
-                )
1012
-            );
1013
-            /**
1014
-             * @see filter usage in EE_Messages_Queue::initiate_request_by_priority
1015
-             */
1016
-        } elseif (
1017
-            apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', true)
1018
-            || EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
1019
-        ) {
1020
-            $queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_sent);
1021
-            if ($queue_count > 0) {
1022
-                EE_Error::add_success(
1023
-                    sprintf(
1024
-                        _n(
1025
-                            '%d message successfully sent.',
1026
-                            '%d messages successfully sent.',
1027
-                            $queue_count,
1028
-                            'event_espresso'
1029
-                        ),
1030
-                        $queue_count
1031
-                    )
1032
-                );
1033
-            } else {
1034
-                EE_Error::add_error(
1035
-                    __('No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1036
-                        'event_espresso'),
1037
-                    __FILE__, __FUNCTION__, __LINE__
1038
-                );
1039
-            }
1040
-        } else {
1041
-            EE_Error::add_error(
1042
-                __('No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1043
-                    'event_espresso'),
1044
-                __FILE__, __FUNCTION__, __LINE__
1045
-            );
1046
-        }
1047
-        return (bool)$queue_count;
1048
-    }
1049
-
1050
-
1051
-    /**
1052
-     * debug
1053
-     *
1054
-     * @param string          $class
1055
-     * @param string          $func
1056
-     * @param string          $line
1057
-     * @param \EE_Transaction $transaction
1058
-     * @param array           $info
1059
-     * @param bool            $display_request
1060
-     */
1061
-    protected static function log(
1062
-        $class = '',
1063
-        $func = '',
1064
-        $line = '',
1065
-        EE_Transaction $transaction,
1066
-        $info = array(),
1067
-        $display_request = false
1068
-    ) {
1069
-        if (WP_DEBUG && false) {
1070
-            if ($transaction instanceof EE_Transaction) {
1071
-                // don't serialize objects
1072
-                $info                  = EEH_Debug_Tools::strip_objects($info);
1073
-                $info['TXN_status']    = $transaction->status_ID();
1074
-                $info['TXN_reg_steps'] = $transaction->reg_steps();
1075
-                if ($transaction->ID()) {
1076
-                    $index = 'EE_Transaction: ' . $transaction->ID();
1077
-                    EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1078
-                }
1079
-            }
1080
-        }
1081
-
1082
-    }
1083
-
1084
-
1085
-    /**
1086
-     *  Resets all the static properties in this class when called.
1087
-     */
1088
-    public static function reset()
1089
-    {
1090
-        self::$_EEMSG                    = null;
1091
-        self::$_message_resource_manager = null;
1092
-        self::$_MSG_PROCESSOR            = null;
1093
-        self::$_MSG_PATHS                = null;
1094
-        self::$_TMP_PACKS                = array();
1095
-    }
973
+						'event_espresso'),
974
+					__FILE__, __FUNCTION__, __LINE__
975
+				);
976
+			}
977
+		}
978
+		return $sent_queue;
979
+	}
980
+
981
+
982
+	/**
983
+	 * This will queue the incoming message ids for resending.
984
+	 * Note, only message_ids corresponding to messages with the status of EEM_Message::sent will be queued.
985
+	 *
986
+	 * @since 4.9.0
987
+	 * @param array $message_ids An array of EE_Message IDs
988
+	 * @return bool  true means messages were successfully queued for resending, false means none were queued for
989
+	 *               resending.
990
+	 */
991
+	public static function queue_for_resending($message_ids)
992
+	{
993
+		self::_load_controller();
994
+		self::$_MSG_PROCESSOR->setup_messages_from_ids_and_send($message_ids);
995
+
996
+		//get queue and count
997
+		$queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_resend);
998
+
999
+		if (
1000
+			$queue_count > 0
1001
+		) {
1002
+			EE_Error::add_success(
1003
+				sprintf(
1004
+					_n(
1005
+						'%d message successfully queued for resending.',
1006
+						'%d messages successfully queued for resending.',
1007
+						$queue_count,
1008
+						'event_espresso'
1009
+					),
1010
+					$queue_count
1011
+				)
1012
+			);
1013
+			/**
1014
+			 * @see filter usage in EE_Messages_Queue::initiate_request_by_priority
1015
+			 */
1016
+		} elseif (
1017
+			apply_filters('FHEE__EE_Messages_Processor__initiate_request_by_priority__do_immediate_processing', true)
1018
+			|| EE_Registry::instance()->NET_CFG->core->do_messages_on_same_request
1019
+		) {
1020
+			$queue_count = self::$_MSG_PROCESSOR->get_queue()->count_STS_in_queue(EEM_Message::status_sent);
1021
+			if ($queue_count > 0) {
1022
+				EE_Error::add_success(
1023
+					sprintf(
1024
+						_n(
1025
+							'%d message successfully sent.',
1026
+							'%d messages successfully sent.',
1027
+							$queue_count,
1028
+							'event_espresso'
1029
+						),
1030
+						$queue_count
1031
+					)
1032
+				);
1033
+			} else {
1034
+				EE_Error::add_error(
1035
+					__('No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1036
+						'event_espresso'),
1037
+					__FILE__, __FUNCTION__, __LINE__
1038
+				);
1039
+			}
1040
+		} else {
1041
+			EE_Error::add_error(
1042
+				__('No messages were queued for resending. This usually only happens when all the messages flagged for resending are not a status that can be resent.',
1043
+					'event_espresso'),
1044
+				__FILE__, __FUNCTION__, __LINE__
1045
+			);
1046
+		}
1047
+		return (bool)$queue_count;
1048
+	}
1049
+
1050
+
1051
+	/**
1052
+	 * debug
1053
+	 *
1054
+	 * @param string          $class
1055
+	 * @param string          $func
1056
+	 * @param string          $line
1057
+	 * @param \EE_Transaction $transaction
1058
+	 * @param array           $info
1059
+	 * @param bool            $display_request
1060
+	 */
1061
+	protected static function log(
1062
+		$class = '',
1063
+		$func = '',
1064
+		$line = '',
1065
+		EE_Transaction $transaction,
1066
+		$info = array(),
1067
+		$display_request = false
1068
+	) {
1069
+		if (WP_DEBUG && false) {
1070
+			if ($transaction instanceof EE_Transaction) {
1071
+				// don't serialize objects
1072
+				$info                  = EEH_Debug_Tools::strip_objects($info);
1073
+				$info['TXN_status']    = $transaction->status_ID();
1074
+				$info['TXN_reg_steps'] = $transaction->reg_steps();
1075
+				if ($transaction->ID()) {
1076
+					$index = 'EE_Transaction: ' . $transaction->ID();
1077
+					EEH_Debug_Tools::log($class, $func, $line, $info, $display_request, $index);
1078
+				}
1079
+			}
1080
+		}
1081
+
1082
+	}
1083
+
1084
+
1085
+	/**
1086
+	 *  Resets all the static properties in this class when called.
1087
+	 */
1088
+	public static function reset()
1089
+	{
1090
+		self::$_EEMSG                    = null;
1091
+		self::$_message_resource_manager = null;
1092
+		self::$_MSG_PROCESSOR            = null;
1093
+		self::$_MSG_PATHS                = null;
1094
+		self::$_TMP_PACKS                = array();
1095
+	}
1096 1096
 
1097 1097
 }
1098 1098
 // End of file EED_Messages.module.php
Please login to merge, or discard this patch.
core/services/database/TableManager.php 2 patches
Indentation   +245 added lines, -247 removed lines patch added patch discarded remove patch
@@ -17,254 +17,252 @@
 block discarded – undo
17 17
 class TableManager extends \EE_Base
18 18
 {
19 19
 
20
-    /**
21
-     * @var TableAnalysis $table_analysis
22
-     */
23
-    private $table_analysis;
24
-
25
-
26
-
27
-    /**
28
-     * TableManager constructor.
29
-     *
30
-     * @param TableAnalysis $TableAnalysis
31
-     */
32
-    public function __construct(TableAnalysis $TableAnalysis)
33
-    {
34
-        $this->table_analysis = $TableAnalysis;
35
-    }
36
-
37
-
38
-
39
-    /**
40
-     * Gets the injected table analyzer, or throws an exception
41
-     *
42
-     * @return TableAnalysis
43
-     * @throws \EE_Error
44
-     */
45
-    protected function getTableAnalysis()
46
-    {
47
-        if ($this->table_analysis instanceof TableAnalysis) {
48
-            return $this->table_analysis;
49
-        } else {
50
-            throw new \EE_Error(
51
-                sprintf(
52
-                    __('Table analysis class on class %1$s is not set properly.', 'event_espresso'),
53
-                    get_class($this)
54
-                )
55
-            );
56
-        }
57
-    }
58
-
59
-
60
-
61
-    /**
62
-     * @param string $table_name which can optionally start with $wpdb->prefix or not
63
-     * @param string $column_name
64
-     * @param string $column_info
65
-     * @return bool|false|int
66
-     */
67
-    public function addColumn($table_name, $column_name, $column_info = 'INT UNSIGNED NOT NULL')
68
-    {
69
-        if (apply_filters('FHEE__EEH_Activation__add_column_if_it_doesnt_exist__short_circuit', false)) {
70
-            return false;
71
-        }
72
-        global $wpdb;
73
-        $full_table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
74
-        $columns = $this->getTableColumns($table_name);
75
-        if ( ! in_array($column_name, $columns)) {
76
-            $alter_query = "ALTER TABLE {$full_table_name} ADD {$column_name} {$column_info}";
77
-            return $wpdb->query($alter_query);
78
-        }
79
-        return true;
80
-    }
81
-
82
-
83
-
84
-    /**
85
-     * Gets the name of all columns on the  table. $table_name can
86
-     * optionally start with $wpdb->prefix or not
87
-     *
88
-     * @global \wpdb $wpdb
89
-     * @param string $table_name
90
-     * @return array
91
-     */
92
-    public function getTableColumns($table_name)
93
-    {
94
-        global $wpdb;
95
-        $table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
96
-        $field_array = array();
97
-        if ( ! empty($table_name)) {
98
-            $columns = $wpdb->get_results("SHOW COLUMNS FROM {$table_name} ");
99
-            if ($columns !== false) {
100
-                foreach ($columns as $column) {
101
-                    $field_array[] = $column->Field;
102
-                }
103
-            }
104
-        }
105
-        return $field_array;
106
-    }
107
-
108
-
109
-
110
-    /**
111
-     * Drops the specified table from the database. $table_name can
112
-     * optionally start with $wpdb->prefix or not
113
-     *
114
-     * @global \wpdb $wpdb
115
-     * @param string $table_name
116
-     * @return int
117
-     */
118
-    public function dropTable($table_name)
119
-    {
120
-        global $wpdb;
121
-        if ($this->getTableAnalysis()->tableExists($table_name)) {
122
-            $table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
123
-            return $wpdb->query("DROP TABLE IF EXISTS {$table_name}");
124
-        }
125
-        return 0;
126
-    }
127
-
128
-
129
-
130
-    /**
131
-     * Drops all the tables mentioned in a single MYSQL query. Double-checks
132
-     * each table name provided has a wpdb prefix attached, and that it exists.
133
-     * Returns the list actually deleted
134
-     *
135
-     * @global WPDB $wpdb
136
-     * @param array $table_names
137
-     * @return array of table names which we deleted
138
-     */
139
-    public function dropTables($table_names)
140
-    {
141
-        $tables_to_delete = array();
142
-        foreach ($table_names as $table_name) {
143
-            $table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
144
-            if ($this->getTableAnalysis()->tableExists($table_name)) {
145
-                $tables_to_delete[$table_name] = $table_name;
146
-            }
147
-        }
148
-        if( ! empty( $tables_to_delete ) ) {
149
-            global $wpdb;
150
-            //make sure we only have a unique strings in the array.
151
-            $tables_to_delete = array_unique($tables_to_delete);
152
-            $wpdb->query('DROP TABLE ' . implode(', ', $tables_to_delete));
153
-        }
154
-        return $tables_to_delete;
155
-    }
156
-
157
-
158
-
159
-    /**
160
-     * Drops the specified index from the specified table. $table_name can
161
-     * optionally start with $wpdb->prefix or not
162
-
163
-     *
20
+	/**
21
+	 * @var TableAnalysis $table_analysis
22
+	 */
23
+	private $table_analysis;
24
+
25
+
26
+
27
+	/**
28
+	 * TableManager constructor.
29
+	 *
30
+	 * @param TableAnalysis $TableAnalysis
31
+	 */
32
+	public function __construct(TableAnalysis $TableAnalysis)
33
+	{
34
+		$this->table_analysis = $TableAnalysis;
35
+	}
36
+
37
+
38
+
39
+	/**
40
+	 * Gets the injected table analyzer, or throws an exception
41
+	 *
42
+	 * @return TableAnalysis
43
+	 * @throws \EE_Error
44
+	 */
45
+	protected function getTableAnalysis()
46
+	{
47
+		if ($this->table_analysis instanceof TableAnalysis) {
48
+			return $this->table_analysis;
49
+		} else {
50
+			throw new \EE_Error(
51
+				sprintf(
52
+					__('Table analysis class on class %1$s is not set properly.', 'event_espresso'),
53
+					get_class($this)
54
+				)
55
+			);
56
+		}
57
+	}
58
+
59
+
60
+
61
+	/**
62
+	 * @param string $table_name which can optionally start with $wpdb->prefix or not
63
+	 * @param string $column_name
64
+	 * @param string $column_info
65
+	 * @return bool|false|int
66
+	 */
67
+	public function addColumn($table_name, $column_name, $column_info = 'INT UNSIGNED NOT NULL')
68
+	{
69
+		if (apply_filters('FHEE__EEH_Activation__add_column_if_it_doesnt_exist__short_circuit', false)) {
70
+			return false;
71
+		}
72
+		global $wpdb;
73
+		$full_table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
74
+		$columns = $this->getTableColumns($table_name);
75
+		if ( ! in_array($column_name, $columns)) {
76
+			$alter_query = "ALTER TABLE {$full_table_name} ADD {$column_name} {$column_info}";
77
+			return $wpdb->query($alter_query);
78
+		}
79
+		return true;
80
+	}
81
+
82
+
83
+
84
+	/**
85
+	 * Gets the name of all columns on the  table. $table_name can
86
+	 * optionally start with $wpdb->prefix or not
87
+	 *
88
+	 * @global \wpdb $wpdb
89
+	 * @param string $table_name
90
+	 * @return array
91
+	 */
92
+	public function getTableColumns($table_name)
93
+	{
94
+		global $wpdb;
95
+		$table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
96
+		$field_array = array();
97
+		if ( ! empty($table_name)) {
98
+			$columns = $wpdb->get_results("SHOW COLUMNS FROM {$table_name} ");
99
+			if ($columns !== false) {
100
+				foreach ($columns as $column) {
101
+					$field_array[] = $column->Field;
102
+				}
103
+			}
104
+		}
105
+		return $field_array;
106
+	}
107
+
108
+
109
+
110
+	/**
111
+	 * Drops the specified table from the database. $table_name can
112
+	 * optionally start with $wpdb->prefix or not
113
+	 *
114
+	 * @global \wpdb $wpdb
115
+	 * @param string $table_name
116
+	 * @return int
117
+	 */
118
+	public function dropTable($table_name)
119
+	{
120
+		global $wpdb;
121
+		if ($this->getTableAnalysis()->tableExists($table_name)) {
122
+			$table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
123
+			return $wpdb->query("DROP TABLE IF EXISTS {$table_name}");
124
+		}
125
+		return 0;
126
+	}
127
+
128
+
129
+
130
+	/**
131
+	 * Drops all the tables mentioned in a single MYSQL query. Double-checks
132
+	 * each table name provided has a wpdb prefix attached, and that it exists.
133
+	 * Returns the list actually deleted
134
+	 *
135
+	 * @global WPDB $wpdb
136
+	 * @param array $table_names
137
+	 * @return array of table names which we deleted
138
+	 */
139
+	public function dropTables($table_names)
140
+	{
141
+		$tables_to_delete = array();
142
+		foreach ($table_names as $table_name) {
143
+			$table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
144
+			if ($this->getTableAnalysis()->tableExists($table_name)) {
145
+				$tables_to_delete[$table_name] = $table_name;
146
+			}
147
+		}
148
+		if( ! empty( $tables_to_delete ) ) {
149
+			global $wpdb;
150
+			//make sure we only have a unique strings in the array.
151
+			$tables_to_delete = array_unique($tables_to_delete);
152
+			$wpdb->query('DROP TABLE ' . implode(', ', $tables_to_delete));
153
+		}
154
+		return $tables_to_delete;
155
+	}
156
+
157
+
158
+
159
+	/**
160
+	 * Drops the specified index from the specified table. $table_name can
161
+	 * optionally start with $wpdb->prefix or not
162
+	 *
164 163
 *@global \wpdb       $wpdb
165
-     * @param string $table_name
166
-     * @param string $index_name
167
-     * @return int the number of indexes dropped. False if there was a datbase error
168
-     */
169
-    public function dropIndex($table_name, $index_name)
170
-    {
171
-        if (apply_filters('FHEE__EEH_Activation__drop_index__short_circuit', false)) {
172
-            return 0;
173
-        }
174
-        global $wpdb;
175
-        $table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
176
-        $index_exists_query = "SHOW INDEX FROM {$table_name} WHERE key_name = '{$index_name}'";
177
-        if (
178
-            $this->getTableAnalysis()->tableExists($table_name)
179
-            && $wpdb->get_var($index_exists_query)
180
-               === $table_name //using get_var with the $index_exists_query returns the table's name
181
-        ) {
182
-            return $wpdb->query("ALTER TABLE {$table_name} DROP INDEX {$index_name}");
183
-        }
184
-        return 0;
185
-    }
186
-
187
-
188
-
189
-    /**
190
-     * Just creates the requested table. $table_name can
191
-     * optionally start with $wpdb->prefix or not
192
-
193
-     *
164
+	 * @param string $table_name
165
+	 * @param string $index_name
166
+	 * @return int the number of indexes dropped. False if there was a datbase error
167
+	 */
168
+	public function dropIndex($table_name, $index_name)
169
+	{
170
+		if (apply_filters('FHEE__EEH_Activation__drop_index__short_circuit', false)) {
171
+			return 0;
172
+		}
173
+		global $wpdb;
174
+		$table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
175
+		$index_exists_query = "SHOW INDEX FROM {$table_name} WHERE key_name = '{$index_name}'";
176
+		if (
177
+			$this->getTableAnalysis()->tableExists($table_name)
178
+			&& $wpdb->get_var($index_exists_query)
179
+			   === $table_name //using get_var with the $index_exists_query returns the table's name
180
+		) {
181
+			return $wpdb->query("ALTER TABLE {$table_name} DROP INDEX {$index_name}");
182
+		}
183
+		return 0;
184
+	}
185
+
186
+
187
+
188
+	/**
189
+	 * Just creates the requested table. $table_name can
190
+	 * optionally start with $wpdb->prefix or not
191
+	 *
194 192
 *@param string       $table_name
195
-     * @param string $create_sql defining the table's columns and indexes
196
-     * @param string $engine     (no need to specify "ENGINE=", that's implied)
197
-     * @return void
198
-     * @throws \EE_Error
199
-     */
200
-    public function createTable($table_name, $create_sql, $engine = 'MyISAM')
201
-    {
202
-        // does $sql contain valid column information? ( LPT: https://regex101.com/ is great for working out regex patterns )
203
-        if (preg_match('((((.*?))(,\s))+)', $create_sql, $valid_column_data)) {
204
-            $table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
205
-            /** @var \wpdb $wpdb */
206
-            global $wpdb;
207
-            $SQL = "CREATE TABLE {$table_name} ( {$create_sql} ) ENGINE={$engine} " . $wpdb->get_charset_collate();
208
-
209
-            //get $wpdb to echo errors, but buffer them. This way at least WE know an error
210
-            //happened. And then we can choose to tell the end user
211
-            $old_show_errors_policy = $wpdb->show_errors(true);
212
-            $old_error_suppression_policy = $wpdb->suppress_errors(false);
213
-            ob_start();
214
-            dbDelta($SQL);
215
-            $output = ob_get_contents();
216
-            ob_end_clean();
217
-            $wpdb->show_errors($old_show_errors_policy);
218
-            $wpdb->suppress_errors($old_error_suppression_policy);
219
-            if ( ! empty($output)) {
220
-                throw new \EE_Error($output);
221
-            }
222
-        } else {
223
-            throw new \EE_Error(
224
-                sprintf(
225
-                    __('The following table creation SQL does not contain valid information about the table columns: %1$s %2$s',
226
-                        'event_espresso'),
227
-                    '<br />',
228
-                    $create_sql
229
-                )
230
-            );
231
-        }
232
-    }
233
-
234
-
235
-
236
-    /**
237
-     * Drops the specified index if it's size differs from $desired_index_size.
238
-     * WordPress' dbdelta method doesn't automatically change index sizes, so this
239
-     * method can be used to only drop the index if needed, and afterwards dbdelta can be used as normal.
240
-     * If the table doesn't exist, or it exists but the index does not, or returns false
241
-     *
242
-     * @param string $table_name
243
-     * @param string $index_name
244
-     * @param string $column_name if none is provided, we assume the column name matches the index (often true in EE)
245
-     * @param string|int $desired_index_size defaults to TableAnalysis::index_col_size, the max for utf8mb4.
246
-     * @return bool whether an index was dropped or not
247
-     * @throws /EE_Error if table analysis object isn't defined
248
-     */
249
-    public function dropIndexIfSizeNot($table_name, $index_name, $column_name = null, $desired_index_size = TableAnalysis::INDEX_COLUMN_SIZE)
250
-    {
251
-        if($column_name === null){
252
-            $column_name = $index_name;
253
-        }
254
-        if(!$this->getTableAnalysis()->tableExists($table_name)){
255
-            return false;
256
-        }
257
-        $index_entries = $this->getTableAnalysis()->showIndexes($table_name,$index_name);
258
-        if(empty($index_entries)){
259
-            return false;
260
-        }
261
-        foreach($index_entries as $index_entry){
262
-            if( $column_name === $index_entry->Column_name
263
-                && (string)$desired_index_size !== $index_entry->Sub_part){
264
-                return $this->dropIndex($table_name,$index_name);
265
-            }
266
-        }
267
-        return false;
268
-    }
193
+	 * @param string $create_sql defining the table's columns and indexes
194
+	 * @param string $engine     (no need to specify "ENGINE=", that's implied)
195
+	 * @return void
196
+	 * @throws \EE_Error
197
+	 */
198
+	public function createTable($table_name, $create_sql, $engine = 'MyISAM')
199
+	{
200
+		// does $sql contain valid column information? ( LPT: https://regex101.com/ is great for working out regex patterns )
201
+		if (preg_match('((((.*?))(,\s))+)', $create_sql, $valid_column_data)) {
202
+			$table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
203
+			/** @var \wpdb $wpdb */
204
+			global $wpdb;
205
+			$SQL = "CREATE TABLE {$table_name} ( {$create_sql} ) ENGINE={$engine} " . $wpdb->get_charset_collate();
206
+
207
+			//get $wpdb to echo errors, but buffer them. This way at least WE know an error
208
+			//happened. And then we can choose to tell the end user
209
+			$old_show_errors_policy = $wpdb->show_errors(true);
210
+			$old_error_suppression_policy = $wpdb->suppress_errors(false);
211
+			ob_start();
212
+			dbDelta($SQL);
213
+			$output = ob_get_contents();
214
+			ob_end_clean();
215
+			$wpdb->show_errors($old_show_errors_policy);
216
+			$wpdb->suppress_errors($old_error_suppression_policy);
217
+			if ( ! empty($output)) {
218
+				throw new \EE_Error($output);
219
+			}
220
+		} else {
221
+			throw new \EE_Error(
222
+				sprintf(
223
+					__('The following table creation SQL does not contain valid information about the table columns: %1$s %2$s',
224
+						'event_espresso'),
225
+					'<br />',
226
+					$create_sql
227
+				)
228
+			);
229
+		}
230
+	}
231
+
232
+
233
+
234
+	/**
235
+	 * Drops the specified index if it's size differs from $desired_index_size.
236
+	 * WordPress' dbdelta method doesn't automatically change index sizes, so this
237
+	 * method can be used to only drop the index if needed, and afterwards dbdelta can be used as normal.
238
+	 * If the table doesn't exist, or it exists but the index does not, or returns false
239
+	 *
240
+	 * @param string $table_name
241
+	 * @param string $index_name
242
+	 * @param string $column_name if none is provided, we assume the column name matches the index (often true in EE)
243
+	 * @param string|int $desired_index_size defaults to TableAnalysis::index_col_size, the max for utf8mb4.
244
+	 * @return bool whether an index was dropped or not
245
+	 * @throws /EE_Error if table analysis object isn't defined
246
+	 */
247
+	public function dropIndexIfSizeNot($table_name, $index_name, $column_name = null, $desired_index_size = TableAnalysis::INDEX_COLUMN_SIZE)
248
+	{
249
+		if($column_name === null){
250
+			$column_name = $index_name;
251
+		}
252
+		if(!$this->getTableAnalysis()->tableExists($table_name)){
253
+			return false;
254
+		}
255
+		$index_entries = $this->getTableAnalysis()->showIndexes($table_name,$index_name);
256
+		if(empty($index_entries)){
257
+			return false;
258
+		}
259
+		foreach($index_entries as $index_entry){
260
+			if( $column_name === $index_entry->Column_name
261
+				&& (string)$desired_index_size !== $index_entry->Sub_part){
262
+				return $this->dropIndex($table_name,$index_name);
263
+			}
264
+		}
265
+		return false;
266
+	}
269 267
 
270 268
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -145,11 +145,11 @@  discard block
 block discarded – undo
145 145
                 $tables_to_delete[$table_name] = $table_name;
146 146
             }
147 147
         }
148
-        if( ! empty( $tables_to_delete ) ) {
148
+        if ( ! empty($tables_to_delete)) {
149 149
             global $wpdb;
150 150
             //make sure we only have a unique strings in the array.
151 151
             $tables_to_delete = array_unique($tables_to_delete);
152
-            $wpdb->query('DROP TABLE ' . implode(', ', $tables_to_delete));
152
+            $wpdb->query('DROP TABLE '.implode(', ', $tables_to_delete));
153 153
         }
154 154
         return $tables_to_delete;
155 155
     }
@@ -204,7 +204,7 @@  discard block
 block discarded – undo
204 204
             $table_name = $this->getTableAnalysis()->ensureTableNameHasPrefix($table_name);
205 205
             /** @var \wpdb $wpdb */
206 206
             global $wpdb;
207
-            $SQL = "CREATE TABLE {$table_name} ( {$create_sql} ) ENGINE={$engine} " . $wpdb->get_charset_collate();
207
+            $SQL = "CREATE TABLE {$table_name} ( {$create_sql} ) ENGINE={$engine} ".$wpdb->get_charset_collate();
208 208
 
209 209
             //get $wpdb to echo errors, but buffer them. This way at least WE know an error
210 210
             //happened. And then we can choose to tell the end user
@@ -248,20 +248,20 @@  discard block
 block discarded – undo
248 248
      */
249 249
     public function dropIndexIfSizeNot($table_name, $index_name, $column_name = null, $desired_index_size = TableAnalysis::INDEX_COLUMN_SIZE)
250 250
     {
251
-        if($column_name === null){
251
+        if ($column_name === null) {
252 252
             $column_name = $index_name;
253 253
         }
254
-        if(!$this->getTableAnalysis()->tableExists($table_name)){
254
+        if ( ! $this->getTableAnalysis()->tableExists($table_name)) {
255 255
             return false;
256 256
         }
257
-        $index_entries = $this->getTableAnalysis()->showIndexes($table_name,$index_name);
258
-        if(empty($index_entries)){
257
+        $index_entries = $this->getTableAnalysis()->showIndexes($table_name, $index_name);
258
+        if (empty($index_entries)) {
259 259
             return false;
260 260
         }
261
-        foreach($index_entries as $index_entry){
262
-            if( $column_name === $index_entry->Column_name
263
-                && (string)$desired_index_size !== $index_entry->Sub_part){
264
-                return $this->dropIndex($table_name,$index_name);
261
+        foreach ($index_entries as $index_entry) {
262
+            if ($column_name === $index_entry->Column_name
263
+                && (string) $desired_index_size !== $index_entry->Sub_part) {
264
+                return $this->dropIndex($table_name, $index_name);
265 265
             }
266 266
         }
267 267
         return false;
Please login to merge, or discard this patch.
core/helpers/EEH_Activation.helper.php 1 patch
Indentation   +1653 added lines, -1653 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if ( ! defined('EVENT_ESPRESSO_VERSION')) {
2
-    exit('No direct script access allowed');
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 
5 5
 
@@ -14,244 +14,244 @@  discard block
 block discarded – undo
14 14
 class EEH_Activation
15 15
 {
16 16
 
17
-    /**
18
-     * constant used to indicate a cron task is no longer in use
19
-     */
20
-    const cron_task_no_longer_in_use = 'no_longer_in_use';
21
-
22
-    /**
23
-     * option name that will indicate whether or not we still
24
-     * need to create EE's folders in the uploads directory
25
-     * (because if EE was installed without file system access,
26
-     * we need to request credentials before we can create them)
27
-     */
28
-    const upload_directories_incomplete_option_name = 'ee_upload_directories_incomplete';
29
-
30
-    /**
31
-     * WP_User->ID
32
-     *
33
-     * @var int
34
-     */
35
-    private static $_default_creator_id;
36
-
37
-    /**
38
-     * indicates whether or not we've already verified core's default data during this request,
39
-     * because after migrations are done, any addons activated while in maintenance mode
40
-     * will want to setup their own default data, and they might hook into core's default data
41
-     * and trigger core to setup its default data. In which case they might all ask for core to init its default data.
42
-     * This prevents doing that for EVERY single addon.
43
-     *
44
-     * @var boolean
45
-     */
46
-    protected static $_initialized_db_content_already_in_this_request = false;
47
-
48
-    /**
49
-     * @var \EventEspresso\core\services\database\TableAnalysis $table_analysis
50
-     */
51
-    private static $table_analysis;
52
-
53
-    /**
54
-     * @var \EventEspresso\core\services\database\TableManager $table_manager
55
-     */
56
-    private static $table_manager;
57
-
58
-
59
-    /**
60
-     * @return \EventEspresso\core\services\database\TableAnalysis
61
-     */
62
-    public static function getTableAnalysis()
63
-    {
64
-        if (! self::$table_analysis instanceof \EventEspresso\core\services\database\TableAnalysis) {
65
-            self::$table_analysis = EE_Registry::instance()->create('TableAnalysis', array(), true);
66
-        }
67
-        return self::$table_analysis;
68
-    }
69
-
70
-
71
-    /**
72
-     * @return \EventEspresso\core\services\database\TableManager
73
-     */
74
-    public static function getTableManager()
75
-    {
76
-        if (! self::$table_manager instanceof \EventEspresso\core\services\database\TableManager) {
77
-            self::$table_manager = EE_Registry::instance()->create('TableManager', array(), true);
78
-        }
79
-        return self::$table_manager;
80
-    }
81
-
82
-
83
-    /**
84
-     *    _ensure_table_name_has_prefix
85
-     *
86
-     * @deprecated instead use TableAnalysis::ensureTableNameHasPrefix()
87
-     * @access     public
88
-     * @static
89
-     * @param $table_name
90
-     * @return string
91
-     */
92
-    public static function ensure_table_name_has_prefix($table_name)
93
-    {
94
-        return \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix($table_name);
95
-    }
96
-
97
-
98
-    /**
99
-     *    system_initialization
100
-     *    ensures the EE configuration settings are loaded with at least default options set
101
-     *    and that all critical EE pages have been generated with the appropriate shortcodes in place
102
-     *
103
-     * @access public
104
-     * @static
105
-     * @return void
106
-     */
107
-    public static function system_initialization()
108
-    {
109
-        EEH_Activation::reset_and_update_config();
110
-        //which is fired BEFORE activation of plugin anyways
111
-        EEH_Activation::verify_default_pages_exist();
112
-    }
113
-
114
-
115
-    /**
116
-     * Sets the database schema and creates folders. This should
117
-     * be called on plugin activation and reactivation
118
-     *
119
-     * @return boolean success, whether the database and folders are setup properly
120
-     * @throws \EE_Error
121
-     */
122
-    public static function initialize_db_and_folders()
123
-    {
124
-        $good_filesystem = EEH_Activation::create_upload_directories();
125
-        $good_db         = EEH_Activation::create_database_tables();
126
-        return $good_filesystem && $good_db;
127
-    }
128
-
129
-
130
-    /**
131
-     * assuming we have an up-to-date database schema, this will populate it
132
-     * with default and initial data. This should be called
133
-     * upon activation of a new plugin, reactivation, and at the end
134
-     * of running migration scripts
135
-     *
136
-     * @throws \EE_Error
137
-     */
138
-    public static function initialize_db_content()
139
-    {
140
-        //let's avoid doing all this logic repeatedly, especially when addons are requesting it
141
-        if (EEH_Activation::$_initialized_db_content_already_in_this_request) {
142
-            return;
143
-        }
144
-        EEH_Activation::$_initialized_db_content_already_in_this_request = true;
145
-
146
-        EEH_Activation::initialize_system_questions();
147
-        EEH_Activation::insert_default_status_codes();
148
-        EEH_Activation::generate_default_message_templates();
149
-        EEH_Activation::create_no_ticket_prices_array();
150
-        EE_Registry::instance()->CAP->init_caps();
151
-
152
-        EEH_Activation::validate_messages_system();
153
-        EEH_Activation::insert_default_payment_methods();
154
-        //in case we've
155
-        EEH_Activation::remove_cron_tasks();
156
-        EEH_Activation::create_cron_tasks();
157
-        // remove all TXN locks since that is being done via extra meta now
158
-        delete_option('ee_locked_transactions');
159
-        //also, check for CAF default db content
160
-        do_action('AHEE__EEH_Activation__initialize_db_content');
161
-        //also: EEM_Gateways::load_all_gateways() outputs a lot of success messages
162
-        //which users really won't care about on initial activation
163
-        EE_Error::overwrite_success();
164
-    }
165
-
166
-
167
-    /**
168
-     * Returns an array of cron tasks. Array values are the actions fired by the cron tasks (the "hooks"),
169
-     * values are the frequency (the "recurrence"). See http://codex.wordpress.org/Function_Reference/wp_schedule_event
170
-     * If the cron task should NO longer be used, it should have a value of EEH_Activation::cron_task_no_longer_in_use
171
-     * (null)
172
-     *
173
-     * @param string $which_to_include can be 'current' (ones that are currently in use),
174
-     *                                 'old' (only returns ones that should no longer be used),or 'all',
175
-     * @return array
176
-     * @throws \EE_Error
177
-     */
178
-    public static function get_cron_tasks($which_to_include)
179
-    {
180
-        $cron_tasks = apply_filters(
181
-            'FHEE__EEH_Activation__get_cron_tasks',
182
-            array(
183
-                'AHEE__EE_Cron_Tasks__clean_up_junk_transactions'      => 'hourly',
17
+	/**
18
+	 * constant used to indicate a cron task is no longer in use
19
+	 */
20
+	const cron_task_no_longer_in_use = 'no_longer_in_use';
21
+
22
+	/**
23
+	 * option name that will indicate whether or not we still
24
+	 * need to create EE's folders in the uploads directory
25
+	 * (because if EE was installed without file system access,
26
+	 * we need to request credentials before we can create them)
27
+	 */
28
+	const upload_directories_incomplete_option_name = 'ee_upload_directories_incomplete';
29
+
30
+	/**
31
+	 * WP_User->ID
32
+	 *
33
+	 * @var int
34
+	 */
35
+	private static $_default_creator_id;
36
+
37
+	/**
38
+	 * indicates whether or not we've already verified core's default data during this request,
39
+	 * because after migrations are done, any addons activated while in maintenance mode
40
+	 * will want to setup their own default data, and they might hook into core's default data
41
+	 * and trigger core to setup its default data. In which case they might all ask for core to init its default data.
42
+	 * This prevents doing that for EVERY single addon.
43
+	 *
44
+	 * @var boolean
45
+	 */
46
+	protected static $_initialized_db_content_already_in_this_request = false;
47
+
48
+	/**
49
+	 * @var \EventEspresso\core\services\database\TableAnalysis $table_analysis
50
+	 */
51
+	private static $table_analysis;
52
+
53
+	/**
54
+	 * @var \EventEspresso\core\services\database\TableManager $table_manager
55
+	 */
56
+	private static $table_manager;
57
+
58
+
59
+	/**
60
+	 * @return \EventEspresso\core\services\database\TableAnalysis
61
+	 */
62
+	public static function getTableAnalysis()
63
+	{
64
+		if (! self::$table_analysis instanceof \EventEspresso\core\services\database\TableAnalysis) {
65
+			self::$table_analysis = EE_Registry::instance()->create('TableAnalysis', array(), true);
66
+		}
67
+		return self::$table_analysis;
68
+	}
69
+
70
+
71
+	/**
72
+	 * @return \EventEspresso\core\services\database\TableManager
73
+	 */
74
+	public static function getTableManager()
75
+	{
76
+		if (! self::$table_manager instanceof \EventEspresso\core\services\database\TableManager) {
77
+			self::$table_manager = EE_Registry::instance()->create('TableManager', array(), true);
78
+		}
79
+		return self::$table_manager;
80
+	}
81
+
82
+
83
+	/**
84
+	 *    _ensure_table_name_has_prefix
85
+	 *
86
+	 * @deprecated instead use TableAnalysis::ensureTableNameHasPrefix()
87
+	 * @access     public
88
+	 * @static
89
+	 * @param $table_name
90
+	 * @return string
91
+	 */
92
+	public static function ensure_table_name_has_prefix($table_name)
93
+	{
94
+		return \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix($table_name);
95
+	}
96
+
97
+
98
+	/**
99
+	 *    system_initialization
100
+	 *    ensures the EE configuration settings are loaded with at least default options set
101
+	 *    and that all critical EE pages have been generated with the appropriate shortcodes in place
102
+	 *
103
+	 * @access public
104
+	 * @static
105
+	 * @return void
106
+	 */
107
+	public static function system_initialization()
108
+	{
109
+		EEH_Activation::reset_and_update_config();
110
+		//which is fired BEFORE activation of plugin anyways
111
+		EEH_Activation::verify_default_pages_exist();
112
+	}
113
+
114
+
115
+	/**
116
+	 * Sets the database schema and creates folders. This should
117
+	 * be called on plugin activation and reactivation
118
+	 *
119
+	 * @return boolean success, whether the database and folders are setup properly
120
+	 * @throws \EE_Error
121
+	 */
122
+	public static function initialize_db_and_folders()
123
+	{
124
+		$good_filesystem = EEH_Activation::create_upload_directories();
125
+		$good_db         = EEH_Activation::create_database_tables();
126
+		return $good_filesystem && $good_db;
127
+	}
128
+
129
+
130
+	/**
131
+	 * assuming we have an up-to-date database schema, this will populate it
132
+	 * with default and initial data. This should be called
133
+	 * upon activation of a new plugin, reactivation, and at the end
134
+	 * of running migration scripts
135
+	 *
136
+	 * @throws \EE_Error
137
+	 */
138
+	public static function initialize_db_content()
139
+	{
140
+		//let's avoid doing all this logic repeatedly, especially when addons are requesting it
141
+		if (EEH_Activation::$_initialized_db_content_already_in_this_request) {
142
+			return;
143
+		}
144
+		EEH_Activation::$_initialized_db_content_already_in_this_request = true;
145
+
146
+		EEH_Activation::initialize_system_questions();
147
+		EEH_Activation::insert_default_status_codes();
148
+		EEH_Activation::generate_default_message_templates();
149
+		EEH_Activation::create_no_ticket_prices_array();
150
+		EE_Registry::instance()->CAP->init_caps();
151
+
152
+		EEH_Activation::validate_messages_system();
153
+		EEH_Activation::insert_default_payment_methods();
154
+		//in case we've
155
+		EEH_Activation::remove_cron_tasks();
156
+		EEH_Activation::create_cron_tasks();
157
+		// remove all TXN locks since that is being done via extra meta now
158
+		delete_option('ee_locked_transactions');
159
+		//also, check for CAF default db content
160
+		do_action('AHEE__EEH_Activation__initialize_db_content');
161
+		//also: EEM_Gateways::load_all_gateways() outputs a lot of success messages
162
+		//which users really won't care about on initial activation
163
+		EE_Error::overwrite_success();
164
+	}
165
+
166
+
167
+	/**
168
+	 * Returns an array of cron tasks. Array values are the actions fired by the cron tasks (the "hooks"),
169
+	 * values are the frequency (the "recurrence"). See http://codex.wordpress.org/Function_Reference/wp_schedule_event
170
+	 * If the cron task should NO longer be used, it should have a value of EEH_Activation::cron_task_no_longer_in_use
171
+	 * (null)
172
+	 *
173
+	 * @param string $which_to_include can be 'current' (ones that are currently in use),
174
+	 *                                 'old' (only returns ones that should no longer be used),or 'all',
175
+	 * @return array
176
+	 * @throws \EE_Error
177
+	 */
178
+	public static function get_cron_tasks($which_to_include)
179
+	{
180
+		$cron_tasks = apply_filters(
181
+			'FHEE__EEH_Activation__get_cron_tasks',
182
+			array(
183
+				'AHEE__EE_Cron_Tasks__clean_up_junk_transactions'      => 'hourly',
184 184
 //				'AHEE__EE_Cron_Tasks__finalize_abandoned_transactions' => EEH_Activation::cron_task_no_longer_in_use, actually this is still in use
185
-                'AHEE__EE_Cron_Tasks__update_transaction_with_payment' => EEH_Activation::cron_task_no_longer_in_use,
186
-                //there may have been a bug which prevented from these cron tasks from getting unscheduled, so we might want to remove these for a few updates
187
-                'AHEE_EE_Cron_Tasks__clean_out_old_gateway_logs'       => 'daily',
188
-            )
189
-        );
190
-        if ($which_to_include === 'old') {
191
-            $cron_tasks = array_filter(
192
-                $cron_tasks,
193
-                function ($value) {
194
-                    return $value === EEH_Activation::cron_task_no_longer_in_use;
195
-                }
196
-            );
197
-        } elseif ($which_to_include === 'current') {
198
-            $cron_tasks = array_filter($cron_tasks);
199
-        } elseif (WP_DEBUG && $which_to_include !== 'all') {
200
-            throw new EE_Error(
201
-                sprintf(
202
-                    __(
203
-                        'Invalid argument of "%1$s" passed to EEH_Activation::get_cron_tasks. Valid values are "all", "old" and "current".',
204
-                        'event_espresso'
205
-                    ),
206
-                    $which_to_include
207
-                )
208
-            );
209
-        }
210
-        return $cron_tasks;
211
-    }
212
-
213
-
214
-    /**
215
-     * Ensure cron tasks are setup (the removal of crons should be done by remove_crons())
216
-     *
217
-     * @throws \EE_Error
218
-     */
219
-    public static function create_cron_tasks()
220
-    {
221
-
222
-        foreach (EEH_Activation::get_cron_tasks('current') as $hook_name => $frequency) {
223
-            if (! wp_next_scheduled($hook_name)) {
224
-                /**
225
-                 * This allows client code to define the initial start timestamp for this schedule.
226
-                 */
227
-                if (is_array($frequency)
228
-                    && count($frequency) === 2
229
-                    && isset($frequency[0], $frequency[1])
230
-                ) {
231
-                    $start_timestamp = $frequency[0];
232
-                    $frequency = $frequency[1];
233
-                } else {
234
-                    $start_timestamp = time();
235
-                }
236
-                wp_schedule_event($start_timestamp, $frequency, $hook_name);
237
-            }
238
-        }
239
-
240
-    }
241
-
242
-
243
-    /**
244
-     * Remove the currently-existing and now-removed cron tasks.
245
-     *
246
-     * @param boolean $remove_all whether to only remove the old ones, or remove absolutely ALL the EE ones
247
-     * @throws \EE_Error
248
-     */
249
-    public static function remove_cron_tasks($remove_all = true)
250
-    {
251
-        $cron_tasks_to_remove = $remove_all ? 'all' : 'old';
252
-        $crons                = _get_cron_array();
253
-        $crons                = is_array($crons) ? $crons : array();
254
-        /* reminder of what $crons look like:
185
+				'AHEE__EE_Cron_Tasks__update_transaction_with_payment' => EEH_Activation::cron_task_no_longer_in_use,
186
+				//there may have been a bug which prevented from these cron tasks from getting unscheduled, so we might want to remove these for a few updates
187
+				'AHEE_EE_Cron_Tasks__clean_out_old_gateway_logs'       => 'daily',
188
+			)
189
+		);
190
+		if ($which_to_include === 'old') {
191
+			$cron_tasks = array_filter(
192
+				$cron_tasks,
193
+				function ($value) {
194
+					return $value === EEH_Activation::cron_task_no_longer_in_use;
195
+				}
196
+			);
197
+		} elseif ($which_to_include === 'current') {
198
+			$cron_tasks = array_filter($cron_tasks);
199
+		} elseif (WP_DEBUG && $which_to_include !== 'all') {
200
+			throw new EE_Error(
201
+				sprintf(
202
+					__(
203
+						'Invalid argument of "%1$s" passed to EEH_Activation::get_cron_tasks. Valid values are "all", "old" and "current".',
204
+						'event_espresso'
205
+					),
206
+					$which_to_include
207
+				)
208
+			);
209
+		}
210
+		return $cron_tasks;
211
+	}
212
+
213
+
214
+	/**
215
+	 * Ensure cron tasks are setup (the removal of crons should be done by remove_crons())
216
+	 *
217
+	 * @throws \EE_Error
218
+	 */
219
+	public static function create_cron_tasks()
220
+	{
221
+
222
+		foreach (EEH_Activation::get_cron_tasks('current') as $hook_name => $frequency) {
223
+			if (! wp_next_scheduled($hook_name)) {
224
+				/**
225
+				 * This allows client code to define the initial start timestamp for this schedule.
226
+				 */
227
+				if (is_array($frequency)
228
+					&& count($frequency) === 2
229
+					&& isset($frequency[0], $frequency[1])
230
+				) {
231
+					$start_timestamp = $frequency[0];
232
+					$frequency = $frequency[1];
233
+				} else {
234
+					$start_timestamp = time();
235
+				}
236
+				wp_schedule_event($start_timestamp, $frequency, $hook_name);
237
+			}
238
+		}
239
+
240
+	}
241
+
242
+
243
+	/**
244
+	 * Remove the currently-existing and now-removed cron tasks.
245
+	 *
246
+	 * @param boolean $remove_all whether to only remove the old ones, or remove absolutely ALL the EE ones
247
+	 * @throws \EE_Error
248
+	 */
249
+	public static function remove_cron_tasks($remove_all = true)
250
+	{
251
+		$cron_tasks_to_remove = $remove_all ? 'all' : 'old';
252
+		$crons                = _get_cron_array();
253
+		$crons                = is_array($crons) ? $crons : array();
254
+		/* reminder of what $crons look like:
255 255
          * Top-level keys are timestamps, and their values are arrays.
256 256
          * The 2nd level arrays have keys with each of the cron task hook names to run at that time
257 257
          * and their values are arrays.
@@ -268,912 +268,912 @@  discard block
 block discarded – undo
268 268
          *					...
269 269
          *      ...
270 270
          */
271
-        $ee_cron_tasks_to_remove = EEH_Activation::get_cron_tasks($cron_tasks_to_remove);
272
-        foreach ($crons as $timestamp => $hooks_to_fire_at_time) {
273
-            if (is_array($hooks_to_fire_at_time)) {
274
-                foreach ($hooks_to_fire_at_time as $hook_name => $hook_actions) {
275
-                    if (isset($ee_cron_tasks_to_remove[$hook_name])
276
-                        && is_array($ee_cron_tasks_to_remove[$hook_name])
277
-                    ) {
278
-                        unset($crons[$timestamp][$hook_name]);
279
-                    }
280
-                }
281
-                //also take care of any empty cron timestamps.
282
-                if (empty($hooks_to_fire_at_time)) {
283
-                    unset($crons[$timestamp]);
284
-                }
285
-            }
286
-        }
287
-        _set_cron_array($crons);
288
-    }
289
-
290
-
291
-    /**
292
-     *    CPT_initialization
293
-     *    registers all EE CPTs ( Custom Post Types ) then flushes rewrite rules so that all endpoints exist
294
-     *
295
-     * @access public
296
-     * @static
297
-     * @return void
298
-     */
299
-    public static function CPT_initialization()
300
-    {
301
-        // register Custom Post Types
302
-        EE_Registry::instance()->load_core('Register_CPTs');
303
-        flush_rewrite_rules();
304
-    }
305
-
306
-
307
-
308
-    /**
309
-     *    reset_and_update_config
310
-     * The following code was moved over from EE_Config so that it will no longer run on every request.
311
-     * If there is old calendar config data saved, then it will get converted on activation.
312
-     * This was basically a DMS before we had DMS's, and will get removed after a few more versions.
313
-     *
314
-     * @access public
315
-     * @static
316
-     * @return void
317
-     */
318
-    public static function reset_and_update_config()
319
-    {
320
-        do_action('AHEE__EE_Config___load_core_config__start', array('EEH_Activation', 'load_calendar_config'));
321
-        add_filter(
322
-            'FHEE__EE_Config___load_core_config__config_settings',
323
-            array('EEH_Activation', 'migrate_old_config_data'),
324
-            10,
325
-            3
326
-        );
327
-        //EE_Config::reset();
328
-        if (! EE_Config::logging_enabled()) {
329
-            delete_option(EE_Config::LOG_NAME);
330
-        }
331
-    }
332
-
333
-
334
-    /**
335
-     *    load_calendar_config
336
-     *
337
-     * @access    public
338
-     * @return    void
339
-     */
340
-    public static function load_calendar_config()
341
-    {
342
-        // grab array of all plugin folders and loop thru it
343
-        $plugins = glob(WP_PLUGIN_DIR . DS . '*', GLOB_ONLYDIR);
344
-        if (empty($plugins)) {
345
-            return;
346
-        }
347
-        foreach ($plugins as $plugin_path) {
348
-            // grab plugin folder name from path
349
-            $plugin = basename($plugin_path);
350
-            // drill down to Espresso plugins
351
-            // then to calendar related plugins
352
-            if (
353
-                strpos($plugin, 'espresso') !== false
354
-                || strpos($plugin, 'Espresso') !== false
355
-                || strpos($plugin, 'ee4') !== false
356
-                || strpos($plugin, 'EE4') !== false
357
-                || strpos($plugin, 'calendar') !== false
358
-            ) {
359
-                // this is what we are looking for
360
-                $calendar_config = $plugin_path . DS . 'EE_Calendar_Config.php';
361
-                // does it exist in this folder ?
362
-                if (is_readable($calendar_config)) {
363
-                    // YEAH! let's load it
364
-                    require_once($calendar_config);
365
-                }
366
-            }
367
-        }
368
-    }
369
-
370
-
371
-
372
-    /**
373
-     *    _migrate_old_config_data
374
-     *
375
-     * @access    public
376
-     * @param array|stdClass $settings
377
-     * @param string         $config
378
-     * @param \EE_Config     $EE_Config
379
-     * @return \stdClass
380
-     */
381
-    public static function migrate_old_config_data($settings = array(), $config = '', EE_Config $EE_Config)
382
-    {
383
-        $convert_from_array = array('addons');
384
-        // in case old settings were saved as an array
385
-        if (is_array($settings) && in_array($config, $convert_from_array)) {
386
-            // convert existing settings to an object
387
-            $config_array = $settings;
388
-            $settings = new stdClass();
389
-            foreach ($config_array as $key => $value) {
390
-                if ($key === 'calendar' && class_exists('EE_Calendar_Config')) {
391
-                    $EE_Config->set_config('addons', 'EE_Calendar', 'EE_Calendar_Config', $value);
392
-                } else {
393
-                    $settings->{$key} = $value;
394
-                }
395
-            }
396
-            add_filter('FHEE__EE_Config___load_core_config__update_espresso_config', '__return_true');
397
-        }
398
-        return $settings;
399
-    }
400
-
401
-
402
-    /**
403
-     * deactivate_event_espresso
404
-     *
405
-     * @access public
406
-     * @static
407
-     * @return void
408
-     */
409
-    public static function deactivate_event_espresso()
410
-    {
411
-        // check permissions
412
-        if (current_user_can('activate_plugins')) {
413
-            deactivate_plugins(EE_PLUGIN_BASENAME, true);
414
-        }
415
-    }
416
-
417
-
418
-
419
-
420
-
421
-    /**
422
-     * verify_default_pages_exist
423
-     *
424
-     * @access public
425
-     * @static
426
-     * @return void
427
-     */
428
-    public static function verify_default_pages_exist()
429
-    {
430
-        $critical_page_problem = false;
431
-        $critical_pages = array(
432
-            array(
433
-                'id'   => 'reg_page_id',
434
-                'name' => __('Registration Checkout', 'event_espresso'),
435
-                'post' => null,
436
-                'code' => 'ESPRESSO_CHECKOUT',
437
-            ),
438
-            array(
439
-                'id'   => 'txn_page_id',
440
-                'name' => __('Transactions', 'event_espresso'),
441
-                'post' => null,
442
-                'code' => 'ESPRESSO_TXN_PAGE',
443
-            ),
444
-            array(
445
-                'id'   => 'thank_you_page_id',
446
-                'name' => __('Thank You', 'event_espresso'),
447
-                'post' => null,
448
-                'code' => 'ESPRESSO_THANK_YOU',
449
-            ),
450
-            array(
451
-                'id'   => 'cancel_page_id',
452
-                'name' => __('Registration Cancelled', 'event_espresso'),
453
-                'post' => null,
454
-                'code' => 'ESPRESSO_CANCELLED',
455
-            ),
456
-        );
457
-        $EE_Core_Config = EE_Registry::instance()->CFG->core;
458
-        foreach ($critical_pages as $critical_page) {
459
-            // is critical page ID set in config ?
460
-            if ($EE_Core_Config->{$critical_page['id']} !== false) {
461
-                // attempt to find post by ID
462
-                $critical_page['post'] = get_post($EE_Core_Config->{$critical_page['id']});
463
-            }
464
-            // no dice?
465
-            if ($critical_page['post'] === null) {
466
-                // attempt to find post by title
467
-                $critical_page['post'] = self::get_page_by_ee_shortcode($critical_page['code']);
468
-                // still nothing?
469
-                if ($critical_page['post'] === null) {
470
-                    $critical_page = EEH_Activation::create_critical_page($critical_page);
471
-                    // REALLY? Still nothing ??!?!?
472
-                    if ($critical_page['post'] === null) {
473
-                        $msg = __(
474
-                            'The Event Espresso critical page configuration settings could not be updated.',
475
-                            'event_espresso'
476
-                        );
477
-                        EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
478
-                        break;
479
-                    }
480
-                }
481
-            }
482
-            // check that Post ID matches critical page ID in config
483
-            if (
484
-                isset($critical_page['post']->ID)
485
-                && $critical_page['post']->ID !== $EE_Core_Config->{$critical_page['id']}
486
-            ) {
487
-                //update Config with post ID
488
-                $EE_Core_Config->{$critical_page['id']} = $critical_page['post']->ID;
489
-                if (! EE_Config::instance()->update_espresso_config(false, false)) {
490
-                    $msg = __(
491
-                        'The Event Espresso critical page configuration settings could not be updated.',
492
-                        'event_espresso'
493
-                    );
494
-                    EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
495
-                }
496
-            }
497
-            $critical_page_problem =
498
-                ! isset($critical_page['post']->post_status)
499
-                || $critical_page['post']->post_status !== 'publish'
500
-                || strpos($critical_page['post']->post_content, $critical_page['code']) === false
501
-                    ? true
502
-                    : $critical_page_problem;
503
-        }
504
-        if ($critical_page_problem) {
505
-            $msg = sprintf(
506
-                __(
507
-                    'A potential issue has been detected with one or more of your Event Espresso pages. Go to %s to view your Event Espresso pages.',
508
-                    'event_espresso'
509
-                ),
510
-                '<a href="'
511
-                . admin_url('admin.php?page=espresso_general_settings&action=critical_pages')
512
-                . '">'
513
-                . __('Event Espresso Critical Pages Settings', 'event_espresso')
514
-                . '</a>'
515
-            );
516
-            EE_Error::add_persistent_admin_notice('critical_page_problem', $msg);
517
-        }
518
-        if (EE_Error::has_notices()) {
519
-            EE_Error::get_notices(false, true, true);
520
-        }
521
-    }
522
-
523
-
524
-
525
-    /**
526
-     * Returns the first post which uses the specified shortcode
527
-     *
528
-     * @param string $ee_shortcode usually one of the critical pages shortcodes, eg
529
-     *                             ESPRESSO_THANK_YOU. So we will search fora post with the content
530
-     *                             "[ESPRESSO_THANK_YOU"
531
-     *                             (we don't search for the closing shortcode bracket because they might have added
532
-     *                             parameter to the shortcode
533
-     * @return WP_Post or NULl
534
-     */
535
-    public static function get_page_by_ee_shortcode($ee_shortcode)
536
-    {
537
-        global $wpdb;
538
-        $shortcode_and_opening_bracket = '[' . $ee_shortcode;
539
-        $post_id = $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE post_content LIKE '%$shortcode_and_opening_bracket%' LIMIT 1");
540
-        if ($post_id) {
541
-            return get_post($post_id);
542
-        } else {
543
-            return null;
544
-        }
545
-    }
546
-
547
-
548
-    /**
549
-     *    This function generates a post for critical espresso pages
550
-     *
551
-     * @access public
552
-     * @static
553
-     * @param array $critical_page
554
-     * @return array
555
-     */
556
-    public static function create_critical_page($critical_page)
557
-    {
558
-
559
-        $post_args = array(
560
-            'post_title'     => $critical_page['name'],
561
-            'post_status'    => 'publish',
562
-            'post_type'      => 'page',
563
-            'comment_status' => 'closed',
564
-            'post_content'   => '[' . $critical_page['code'] . ']',
565
-        );
566
-
567
-        $post_id = wp_insert_post($post_args);
568
-        if (! $post_id) {
569
-            $msg = sprintf(
570
-                __('The Event Espresso  critical page entitled "%s" could not be created.', 'event_espresso'),
571
-                $critical_page['name']
572
-            );
573
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
574
-            return $critical_page;
575
-        }
576
-        // get newly created post's details
577
-        if (! $critical_page['post'] = get_post($post_id)) {
578
-            $msg = sprintf(
579
-                __('The Event Espresso critical page entitled "%s" could not be retrieved.', 'event_espresso'),
580
-                $critical_page['name']
581
-            );
582
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
583
-        }
584
-
585
-        return $critical_page;
586
-
587
-    }
588
-
589
-
590
-
591
-
592
-    /**
593
-     * Tries to find the oldest admin for this site.  If there are no admins for this site then return NULL.
594
-     * The role being used to check is filterable.
595
-     *
596
-     * @since  4.6.0
597
-     * @global WPDB $wpdb
598
-     * @return mixed null|int WP_user ID or NULL
599
-     */
600
-    public static function get_default_creator_id()
601
-    {
602
-        global $wpdb;
603
-        if ( ! empty(self::$_default_creator_id)) {
604
-            return self::$_default_creator_id;
605
-        }/**/
606
-        $role_to_check = apply_filters('FHEE__EEH_Activation__get_default_creator_id__role_to_check', 'administrator');
607
-        //let's allow pre_filtering for early exits by alternative methods for getting id.  We check for truthy result and if so then exit early.
608
-        $pre_filtered_id = apply_filters(
609
-            'FHEE__EEH_Activation__get_default_creator_id__pre_filtered_id',
610
-            false,
611
-            $role_to_check
612
-        );
613
-        if ($pre_filtered_id !== false) {
614
-            return (int)$pre_filtered_id;
615
-        }
616
-        $capabilities_key = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('capabilities');
617
-        $query = $wpdb->prepare(
618
-            "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$capabilities_key' AND meta_value LIKE %s ORDER BY user_id ASC LIMIT 0,1",
619
-            '%' . $role_to_check . '%'
620
-        );
621
-        $user_id = $wpdb->get_var($query);
622
-        $user_id = apply_filters('FHEE__EEH_Activation_Helper__get_default_creator_id__user_id', $user_id);
623
-        if ($user_id && (int)$user_id) {
624
-            self::$_default_creator_id = (int)$user_id;
625
-            return self::$_default_creator_id;
626
-        } else {
627
-            return null;
628
-        }
629
-    }
630
-
631
-
632
-
633
-    /**
634
-     * used by EE and EE addons during plugin activation to create tables.
635
-     * Its a wrapper for EventEspresso\core\services\database\TableManager::createTable,
636
-     * but includes extra logic regarding activations.
637
-     *
638
-     * @access public
639
-     * @static
640
-     * @param string  $table_name              without the $wpdb->prefix
641
-     * @param string  $sql                     SQL for creating the table (contents between brackets in an SQL create
642
-     *                                         table query)
643
-     * @param string  $engine                  like 'ENGINE=MyISAM' or 'ENGINE=InnoDB'
644
-     * @param boolean $drop_pre_existing_table set to TRUE when you want to make SURE the table is completely empty
645
-     *                                         and new once this function is done (ie, you really do want to CREATE a
646
-     *                                         table, and expect it to be empty once you're done) leave as FALSE when
647
-     *                                         you just want to verify the table exists and matches this definition
648
-     *                                         (and if it HAS data in it you want to leave it be)
649
-     * @return void
650
-     * @throws EE_Error if there are database errors
651
-     */
652
-    public static function create_table($table_name, $sql, $engine = 'ENGINE=MyISAM ', $drop_pre_existing_table = false)
653
-    {
654
-        if (apply_filters('FHEE__EEH_Activation__create_table__short_circuit', false, $table_name, $sql)) {
655
-            return;
656
-        }
657
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
658
-        if ( ! function_exists('dbDelta')) {
659
-            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
660
-        }
661
-        $tableAnalysis = \EEH_Activation::getTableAnalysis();
662
-        $wp_table_name = $tableAnalysis->ensureTableNameHasPrefix($table_name);
663
-        // do we need to first delete an existing version of this table ?
664
-        if ($drop_pre_existing_table && $tableAnalysis->tableExists($wp_table_name)) {
665
-            // ok, delete the table... but ONLY if it's empty
666
-            $deleted_safely = EEH_Activation::delete_db_table_if_empty($wp_table_name);
667
-            // table is NOT empty, are you SURE you want to delete this table ???
668
-            if ( ! $deleted_safely && defined('EE_DROP_BAD_TABLES') && EE_DROP_BAD_TABLES) {
669
-                \EEH_Activation::getTableManager()->dropTable($wp_table_name);
670
-            } else if ( ! $deleted_safely) {
671
-                // so we should be more cautious rather than just dropping tables so easily
672
-                error_log(
673
-                    sprintf(
674
-                        __(
675
-                            'It appears that database table "%1$s" exists when it shouldn\'t, and therefore may contain erroneous data. If you have previously restored your database from a backup that didn\'t remove the old tables, then we recommend: %2$s 1. create a new COMPLETE backup of your database, %2$s 2. delete ALL tables from your database, %2$s 3. restore to your previous backup. %2$s If, however, you have not restored to a backup, then somehow your "%3$s" WordPress option could not be read. You can probably ignore this message, but should investigate why that option is being removed.',
676
-                            'event_espresso'
677
-                        ),
678
-                        $wp_table_name,
679
-                        '<br/>',
680
-                        'espresso_db_update'
681
-                    )
682
-                );
683
-            }
684
-        }
685
-        $engine = str_replace('ENGINE=', '', $engine);
686
-        \EEH_Activation::getTableManager()->createTable($table_name, $sql, $engine);
687
-    }
688
-
689
-
690
-
691
-    /**
692
-     *    add_column_if_it_doesn't_exist
693
-     *    Checks if this column already exists on the specified table. Handy for addons which want to add a column
694
-     *
695
-     * @access     public
696
-     * @static
697
-     * @deprecated instead use TableManager::addColumn()
698
-     * @param string $table_name  (without "wp_", eg "esp_attendee"
699
-     * @param string $column_name
700
-     * @param string $column_info if your SQL were 'ALTER TABLE table_name ADD price VARCHAR(10)', this would be
701
-     *                            'VARCHAR(10)'
702
-     * @return bool|int
703
-     */
704
-    public static function add_column_if_it_doesnt_exist(
705
-        $table_name,
706
-        $column_name,
707
-        $column_info = 'INT UNSIGNED NOT NULL'
708
-    ) {
709
-        return \EEH_Activation::getTableManager()->addColumn($table_name, $column_name, $column_info);
710
-    }
711
-
712
-
713
-    /**
714
-     * get_fields_on_table
715
-     * Gets all the fields on the database table.
716
-     *
717
-     * @access     public
718
-     * @deprecated instead use TableManager::getTableColumns()
719
-     * @static
720
-     * @param string $table_name , without prefixed $wpdb->prefix
721
-     * @return array of database column names
722
-     */
723
-    public static function get_fields_on_table($table_name = null)
724
-    {
725
-        return \EEH_Activation::getTableManager()->getTableColumns($table_name);
726
-    }
727
-
728
-
729
-    /**
730
-     * db_table_is_empty
731
-     *
732
-     * @access     public\
733
-     * @deprecated instead use TableAnalysis::tableIsEmpty()
734
-     * @static
735
-     * @param string $table_name
736
-     * @return bool
737
-     */
738
-    public static function db_table_is_empty($table_name)
739
-    {
740
-        return \EEH_Activation::getTableAnalysis()->tableIsEmpty($table_name);
741
-    }
742
-
743
-
744
-    /**
745
-     * delete_db_table_if_empty
746
-     *
747
-     * @access public
748
-     * @static
749
-     * @param string $table_name
750
-     * @return bool | int
751
-     */
752
-    public static function delete_db_table_if_empty($table_name)
753
-    {
754
-        if (\EEH_Activation::getTableAnalysis()->tableIsEmpty($table_name)) {
755
-            return \EEH_Activation::getTableManager()->dropTable($table_name);
756
-        }
757
-        return false;
758
-    }
759
-
760
-
761
-    /**
762
-     * delete_unused_db_table
763
-     *
764
-     * @access     public
765
-     * @static
766
-     * @deprecated instead use TableManager::dropTable()
767
-     * @param string $table_name
768
-     * @return bool | int
769
-     */
770
-    public static function delete_unused_db_table($table_name)
771
-    {
772
-        return \EEH_Activation::getTableManager()->dropTable($table_name);
773
-    }
774
-
775
-
776
-    /**
777
-     * drop_index
778
-     *
779
-     * @access     public
780
-     * @static
781
-     * @deprecated instead use TableManager::dropIndex()
782
-     * @param string $table_name
783
-     * @param string $index_name
784
-     * @return bool | int
785
-     */
786
-    public static function drop_index($table_name, $index_name)
787
-    {
788
-        return \EEH_Activation::getTableManager()->dropIndex($table_name, $index_name);
789
-    }
790
-
791
-
792
-
793
-    /**
794
-     * create_database_tables
795
-     *
796
-     * @access public
797
-     * @static
798
-     * @throws EE_Error
799
-     * @return boolean success (whether database is setup properly or not)
800
-     */
801
-    public static function create_database_tables()
802
-    {
803
-        EE_Registry::instance()->load_core('Data_Migration_Manager');
804
-        //find the migration script that sets the database to be compatible with the code
805
-        $dms_name = EE_Data_Migration_Manager::instance()->get_most_up_to_date_dms();
806
-        if ($dms_name) {
807
-            $current_data_migration_script = EE_Registry::instance()->load_dms($dms_name);
808
-            $current_data_migration_script->set_migrating(false);
809
-            $current_data_migration_script->schema_changes_before_migration();
810
-            $current_data_migration_script->schema_changes_after_migration();
811
-            if ($current_data_migration_script->get_errors()) {
812
-                if (WP_DEBUG) {
813
-                    foreach ($current_data_migration_script->get_errors() as $error) {
814
-                        EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__);
815
-                    }
816
-                } else {
817
-                    EE_Error::add_error(
818
-                        __(
819
-                            'There were errors creating the Event Espresso database tables and Event Espresso has been 
271
+		$ee_cron_tasks_to_remove = EEH_Activation::get_cron_tasks($cron_tasks_to_remove);
272
+		foreach ($crons as $timestamp => $hooks_to_fire_at_time) {
273
+			if (is_array($hooks_to_fire_at_time)) {
274
+				foreach ($hooks_to_fire_at_time as $hook_name => $hook_actions) {
275
+					if (isset($ee_cron_tasks_to_remove[$hook_name])
276
+						&& is_array($ee_cron_tasks_to_remove[$hook_name])
277
+					) {
278
+						unset($crons[$timestamp][$hook_name]);
279
+					}
280
+				}
281
+				//also take care of any empty cron timestamps.
282
+				if (empty($hooks_to_fire_at_time)) {
283
+					unset($crons[$timestamp]);
284
+				}
285
+			}
286
+		}
287
+		_set_cron_array($crons);
288
+	}
289
+
290
+
291
+	/**
292
+	 *    CPT_initialization
293
+	 *    registers all EE CPTs ( Custom Post Types ) then flushes rewrite rules so that all endpoints exist
294
+	 *
295
+	 * @access public
296
+	 * @static
297
+	 * @return void
298
+	 */
299
+	public static function CPT_initialization()
300
+	{
301
+		// register Custom Post Types
302
+		EE_Registry::instance()->load_core('Register_CPTs');
303
+		flush_rewrite_rules();
304
+	}
305
+
306
+
307
+
308
+	/**
309
+	 *    reset_and_update_config
310
+	 * The following code was moved over from EE_Config so that it will no longer run on every request.
311
+	 * If there is old calendar config data saved, then it will get converted on activation.
312
+	 * This was basically a DMS before we had DMS's, and will get removed after a few more versions.
313
+	 *
314
+	 * @access public
315
+	 * @static
316
+	 * @return void
317
+	 */
318
+	public static function reset_and_update_config()
319
+	{
320
+		do_action('AHEE__EE_Config___load_core_config__start', array('EEH_Activation', 'load_calendar_config'));
321
+		add_filter(
322
+			'FHEE__EE_Config___load_core_config__config_settings',
323
+			array('EEH_Activation', 'migrate_old_config_data'),
324
+			10,
325
+			3
326
+		);
327
+		//EE_Config::reset();
328
+		if (! EE_Config::logging_enabled()) {
329
+			delete_option(EE_Config::LOG_NAME);
330
+		}
331
+	}
332
+
333
+
334
+	/**
335
+	 *    load_calendar_config
336
+	 *
337
+	 * @access    public
338
+	 * @return    void
339
+	 */
340
+	public static function load_calendar_config()
341
+	{
342
+		// grab array of all plugin folders and loop thru it
343
+		$plugins = glob(WP_PLUGIN_DIR . DS . '*', GLOB_ONLYDIR);
344
+		if (empty($plugins)) {
345
+			return;
346
+		}
347
+		foreach ($plugins as $plugin_path) {
348
+			// grab plugin folder name from path
349
+			$plugin = basename($plugin_path);
350
+			// drill down to Espresso plugins
351
+			// then to calendar related plugins
352
+			if (
353
+				strpos($plugin, 'espresso') !== false
354
+				|| strpos($plugin, 'Espresso') !== false
355
+				|| strpos($plugin, 'ee4') !== false
356
+				|| strpos($plugin, 'EE4') !== false
357
+				|| strpos($plugin, 'calendar') !== false
358
+			) {
359
+				// this is what we are looking for
360
+				$calendar_config = $plugin_path . DS . 'EE_Calendar_Config.php';
361
+				// does it exist in this folder ?
362
+				if (is_readable($calendar_config)) {
363
+					// YEAH! let's load it
364
+					require_once($calendar_config);
365
+				}
366
+			}
367
+		}
368
+	}
369
+
370
+
371
+
372
+	/**
373
+	 *    _migrate_old_config_data
374
+	 *
375
+	 * @access    public
376
+	 * @param array|stdClass $settings
377
+	 * @param string         $config
378
+	 * @param \EE_Config     $EE_Config
379
+	 * @return \stdClass
380
+	 */
381
+	public static function migrate_old_config_data($settings = array(), $config = '', EE_Config $EE_Config)
382
+	{
383
+		$convert_from_array = array('addons');
384
+		// in case old settings were saved as an array
385
+		if (is_array($settings) && in_array($config, $convert_from_array)) {
386
+			// convert existing settings to an object
387
+			$config_array = $settings;
388
+			$settings = new stdClass();
389
+			foreach ($config_array as $key => $value) {
390
+				if ($key === 'calendar' && class_exists('EE_Calendar_Config')) {
391
+					$EE_Config->set_config('addons', 'EE_Calendar', 'EE_Calendar_Config', $value);
392
+				} else {
393
+					$settings->{$key} = $value;
394
+				}
395
+			}
396
+			add_filter('FHEE__EE_Config___load_core_config__update_espresso_config', '__return_true');
397
+		}
398
+		return $settings;
399
+	}
400
+
401
+
402
+	/**
403
+	 * deactivate_event_espresso
404
+	 *
405
+	 * @access public
406
+	 * @static
407
+	 * @return void
408
+	 */
409
+	public static function deactivate_event_espresso()
410
+	{
411
+		// check permissions
412
+		if (current_user_can('activate_plugins')) {
413
+			deactivate_plugins(EE_PLUGIN_BASENAME, true);
414
+		}
415
+	}
416
+
417
+
418
+
419
+
420
+
421
+	/**
422
+	 * verify_default_pages_exist
423
+	 *
424
+	 * @access public
425
+	 * @static
426
+	 * @return void
427
+	 */
428
+	public static function verify_default_pages_exist()
429
+	{
430
+		$critical_page_problem = false;
431
+		$critical_pages = array(
432
+			array(
433
+				'id'   => 'reg_page_id',
434
+				'name' => __('Registration Checkout', 'event_espresso'),
435
+				'post' => null,
436
+				'code' => 'ESPRESSO_CHECKOUT',
437
+			),
438
+			array(
439
+				'id'   => 'txn_page_id',
440
+				'name' => __('Transactions', 'event_espresso'),
441
+				'post' => null,
442
+				'code' => 'ESPRESSO_TXN_PAGE',
443
+			),
444
+			array(
445
+				'id'   => 'thank_you_page_id',
446
+				'name' => __('Thank You', 'event_espresso'),
447
+				'post' => null,
448
+				'code' => 'ESPRESSO_THANK_YOU',
449
+			),
450
+			array(
451
+				'id'   => 'cancel_page_id',
452
+				'name' => __('Registration Cancelled', 'event_espresso'),
453
+				'post' => null,
454
+				'code' => 'ESPRESSO_CANCELLED',
455
+			),
456
+		);
457
+		$EE_Core_Config = EE_Registry::instance()->CFG->core;
458
+		foreach ($critical_pages as $critical_page) {
459
+			// is critical page ID set in config ?
460
+			if ($EE_Core_Config->{$critical_page['id']} !== false) {
461
+				// attempt to find post by ID
462
+				$critical_page['post'] = get_post($EE_Core_Config->{$critical_page['id']});
463
+			}
464
+			// no dice?
465
+			if ($critical_page['post'] === null) {
466
+				// attempt to find post by title
467
+				$critical_page['post'] = self::get_page_by_ee_shortcode($critical_page['code']);
468
+				// still nothing?
469
+				if ($critical_page['post'] === null) {
470
+					$critical_page = EEH_Activation::create_critical_page($critical_page);
471
+					// REALLY? Still nothing ??!?!?
472
+					if ($critical_page['post'] === null) {
473
+						$msg = __(
474
+							'The Event Espresso critical page configuration settings could not be updated.',
475
+							'event_espresso'
476
+						);
477
+						EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
478
+						break;
479
+					}
480
+				}
481
+			}
482
+			// check that Post ID matches critical page ID in config
483
+			if (
484
+				isset($critical_page['post']->ID)
485
+				&& $critical_page['post']->ID !== $EE_Core_Config->{$critical_page['id']}
486
+			) {
487
+				//update Config with post ID
488
+				$EE_Core_Config->{$critical_page['id']} = $critical_page['post']->ID;
489
+				if (! EE_Config::instance()->update_espresso_config(false, false)) {
490
+					$msg = __(
491
+						'The Event Espresso critical page configuration settings could not be updated.',
492
+						'event_espresso'
493
+					);
494
+					EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
495
+				}
496
+			}
497
+			$critical_page_problem =
498
+				! isset($critical_page['post']->post_status)
499
+				|| $critical_page['post']->post_status !== 'publish'
500
+				|| strpos($critical_page['post']->post_content, $critical_page['code']) === false
501
+					? true
502
+					: $critical_page_problem;
503
+		}
504
+		if ($critical_page_problem) {
505
+			$msg = sprintf(
506
+				__(
507
+					'A potential issue has been detected with one or more of your Event Espresso pages. Go to %s to view your Event Espresso pages.',
508
+					'event_espresso'
509
+				),
510
+				'<a href="'
511
+				. admin_url('admin.php?page=espresso_general_settings&action=critical_pages')
512
+				. '">'
513
+				. __('Event Espresso Critical Pages Settings', 'event_espresso')
514
+				. '</a>'
515
+			);
516
+			EE_Error::add_persistent_admin_notice('critical_page_problem', $msg);
517
+		}
518
+		if (EE_Error::has_notices()) {
519
+			EE_Error::get_notices(false, true, true);
520
+		}
521
+	}
522
+
523
+
524
+
525
+	/**
526
+	 * Returns the first post which uses the specified shortcode
527
+	 *
528
+	 * @param string $ee_shortcode usually one of the critical pages shortcodes, eg
529
+	 *                             ESPRESSO_THANK_YOU. So we will search fora post with the content
530
+	 *                             "[ESPRESSO_THANK_YOU"
531
+	 *                             (we don't search for the closing shortcode bracket because they might have added
532
+	 *                             parameter to the shortcode
533
+	 * @return WP_Post or NULl
534
+	 */
535
+	public static function get_page_by_ee_shortcode($ee_shortcode)
536
+	{
537
+		global $wpdb;
538
+		$shortcode_and_opening_bracket = '[' . $ee_shortcode;
539
+		$post_id = $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE post_content LIKE '%$shortcode_and_opening_bracket%' LIMIT 1");
540
+		if ($post_id) {
541
+			return get_post($post_id);
542
+		} else {
543
+			return null;
544
+		}
545
+	}
546
+
547
+
548
+	/**
549
+	 *    This function generates a post for critical espresso pages
550
+	 *
551
+	 * @access public
552
+	 * @static
553
+	 * @param array $critical_page
554
+	 * @return array
555
+	 */
556
+	public static function create_critical_page($critical_page)
557
+	{
558
+
559
+		$post_args = array(
560
+			'post_title'     => $critical_page['name'],
561
+			'post_status'    => 'publish',
562
+			'post_type'      => 'page',
563
+			'comment_status' => 'closed',
564
+			'post_content'   => '[' . $critical_page['code'] . ']',
565
+		);
566
+
567
+		$post_id = wp_insert_post($post_args);
568
+		if (! $post_id) {
569
+			$msg = sprintf(
570
+				__('The Event Espresso  critical page entitled "%s" could not be created.', 'event_espresso'),
571
+				$critical_page['name']
572
+			);
573
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
574
+			return $critical_page;
575
+		}
576
+		// get newly created post's details
577
+		if (! $critical_page['post'] = get_post($post_id)) {
578
+			$msg = sprintf(
579
+				__('The Event Espresso critical page entitled "%s" could not be retrieved.', 'event_espresso'),
580
+				$critical_page['name']
581
+			);
582
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
583
+		}
584
+
585
+		return $critical_page;
586
+
587
+	}
588
+
589
+
590
+
591
+
592
+	/**
593
+	 * Tries to find the oldest admin for this site.  If there are no admins for this site then return NULL.
594
+	 * The role being used to check is filterable.
595
+	 *
596
+	 * @since  4.6.0
597
+	 * @global WPDB $wpdb
598
+	 * @return mixed null|int WP_user ID or NULL
599
+	 */
600
+	public static function get_default_creator_id()
601
+	{
602
+		global $wpdb;
603
+		if ( ! empty(self::$_default_creator_id)) {
604
+			return self::$_default_creator_id;
605
+		}/**/
606
+		$role_to_check = apply_filters('FHEE__EEH_Activation__get_default_creator_id__role_to_check', 'administrator');
607
+		//let's allow pre_filtering for early exits by alternative methods for getting id.  We check for truthy result and if so then exit early.
608
+		$pre_filtered_id = apply_filters(
609
+			'FHEE__EEH_Activation__get_default_creator_id__pre_filtered_id',
610
+			false,
611
+			$role_to_check
612
+		);
613
+		if ($pre_filtered_id !== false) {
614
+			return (int)$pre_filtered_id;
615
+		}
616
+		$capabilities_key = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('capabilities');
617
+		$query = $wpdb->prepare(
618
+			"SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$capabilities_key' AND meta_value LIKE %s ORDER BY user_id ASC LIMIT 0,1",
619
+			'%' . $role_to_check . '%'
620
+		);
621
+		$user_id = $wpdb->get_var($query);
622
+		$user_id = apply_filters('FHEE__EEH_Activation_Helper__get_default_creator_id__user_id', $user_id);
623
+		if ($user_id && (int)$user_id) {
624
+			self::$_default_creator_id = (int)$user_id;
625
+			return self::$_default_creator_id;
626
+		} else {
627
+			return null;
628
+		}
629
+	}
630
+
631
+
632
+
633
+	/**
634
+	 * used by EE and EE addons during plugin activation to create tables.
635
+	 * Its a wrapper for EventEspresso\core\services\database\TableManager::createTable,
636
+	 * but includes extra logic regarding activations.
637
+	 *
638
+	 * @access public
639
+	 * @static
640
+	 * @param string  $table_name              without the $wpdb->prefix
641
+	 * @param string  $sql                     SQL for creating the table (contents between brackets in an SQL create
642
+	 *                                         table query)
643
+	 * @param string  $engine                  like 'ENGINE=MyISAM' or 'ENGINE=InnoDB'
644
+	 * @param boolean $drop_pre_existing_table set to TRUE when you want to make SURE the table is completely empty
645
+	 *                                         and new once this function is done (ie, you really do want to CREATE a
646
+	 *                                         table, and expect it to be empty once you're done) leave as FALSE when
647
+	 *                                         you just want to verify the table exists and matches this definition
648
+	 *                                         (and if it HAS data in it you want to leave it be)
649
+	 * @return void
650
+	 * @throws EE_Error if there are database errors
651
+	 */
652
+	public static function create_table($table_name, $sql, $engine = 'ENGINE=MyISAM ', $drop_pre_existing_table = false)
653
+	{
654
+		if (apply_filters('FHEE__EEH_Activation__create_table__short_circuit', false, $table_name, $sql)) {
655
+			return;
656
+		}
657
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
658
+		if ( ! function_exists('dbDelta')) {
659
+			require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
660
+		}
661
+		$tableAnalysis = \EEH_Activation::getTableAnalysis();
662
+		$wp_table_name = $tableAnalysis->ensureTableNameHasPrefix($table_name);
663
+		// do we need to first delete an existing version of this table ?
664
+		if ($drop_pre_existing_table && $tableAnalysis->tableExists($wp_table_name)) {
665
+			// ok, delete the table... but ONLY if it's empty
666
+			$deleted_safely = EEH_Activation::delete_db_table_if_empty($wp_table_name);
667
+			// table is NOT empty, are you SURE you want to delete this table ???
668
+			if ( ! $deleted_safely && defined('EE_DROP_BAD_TABLES') && EE_DROP_BAD_TABLES) {
669
+				\EEH_Activation::getTableManager()->dropTable($wp_table_name);
670
+			} else if ( ! $deleted_safely) {
671
+				// so we should be more cautious rather than just dropping tables so easily
672
+				error_log(
673
+					sprintf(
674
+						__(
675
+							'It appears that database table "%1$s" exists when it shouldn\'t, and therefore may contain erroneous data. If you have previously restored your database from a backup that didn\'t remove the old tables, then we recommend: %2$s 1. create a new COMPLETE backup of your database, %2$s 2. delete ALL tables from your database, %2$s 3. restore to your previous backup. %2$s If, however, you have not restored to a backup, then somehow your "%3$s" WordPress option could not be read. You can probably ignore this message, but should investigate why that option is being removed.',
676
+							'event_espresso'
677
+						),
678
+						$wp_table_name,
679
+						'<br/>',
680
+						'espresso_db_update'
681
+					)
682
+				);
683
+			}
684
+		}
685
+		$engine = str_replace('ENGINE=', '', $engine);
686
+		\EEH_Activation::getTableManager()->createTable($table_name, $sql, $engine);
687
+	}
688
+
689
+
690
+
691
+	/**
692
+	 *    add_column_if_it_doesn't_exist
693
+	 *    Checks if this column already exists on the specified table. Handy for addons which want to add a column
694
+	 *
695
+	 * @access     public
696
+	 * @static
697
+	 * @deprecated instead use TableManager::addColumn()
698
+	 * @param string $table_name  (without "wp_", eg "esp_attendee"
699
+	 * @param string $column_name
700
+	 * @param string $column_info if your SQL were 'ALTER TABLE table_name ADD price VARCHAR(10)', this would be
701
+	 *                            'VARCHAR(10)'
702
+	 * @return bool|int
703
+	 */
704
+	public static function add_column_if_it_doesnt_exist(
705
+		$table_name,
706
+		$column_name,
707
+		$column_info = 'INT UNSIGNED NOT NULL'
708
+	) {
709
+		return \EEH_Activation::getTableManager()->addColumn($table_name, $column_name, $column_info);
710
+	}
711
+
712
+
713
+	/**
714
+	 * get_fields_on_table
715
+	 * Gets all the fields on the database table.
716
+	 *
717
+	 * @access     public
718
+	 * @deprecated instead use TableManager::getTableColumns()
719
+	 * @static
720
+	 * @param string $table_name , without prefixed $wpdb->prefix
721
+	 * @return array of database column names
722
+	 */
723
+	public static function get_fields_on_table($table_name = null)
724
+	{
725
+		return \EEH_Activation::getTableManager()->getTableColumns($table_name);
726
+	}
727
+
728
+
729
+	/**
730
+	 * db_table_is_empty
731
+	 *
732
+	 * @access     public\
733
+	 * @deprecated instead use TableAnalysis::tableIsEmpty()
734
+	 * @static
735
+	 * @param string $table_name
736
+	 * @return bool
737
+	 */
738
+	public static function db_table_is_empty($table_name)
739
+	{
740
+		return \EEH_Activation::getTableAnalysis()->tableIsEmpty($table_name);
741
+	}
742
+
743
+
744
+	/**
745
+	 * delete_db_table_if_empty
746
+	 *
747
+	 * @access public
748
+	 * @static
749
+	 * @param string $table_name
750
+	 * @return bool | int
751
+	 */
752
+	public static function delete_db_table_if_empty($table_name)
753
+	{
754
+		if (\EEH_Activation::getTableAnalysis()->tableIsEmpty($table_name)) {
755
+			return \EEH_Activation::getTableManager()->dropTable($table_name);
756
+		}
757
+		return false;
758
+	}
759
+
760
+
761
+	/**
762
+	 * delete_unused_db_table
763
+	 *
764
+	 * @access     public
765
+	 * @static
766
+	 * @deprecated instead use TableManager::dropTable()
767
+	 * @param string $table_name
768
+	 * @return bool | int
769
+	 */
770
+	public static function delete_unused_db_table($table_name)
771
+	{
772
+		return \EEH_Activation::getTableManager()->dropTable($table_name);
773
+	}
774
+
775
+
776
+	/**
777
+	 * drop_index
778
+	 *
779
+	 * @access     public
780
+	 * @static
781
+	 * @deprecated instead use TableManager::dropIndex()
782
+	 * @param string $table_name
783
+	 * @param string $index_name
784
+	 * @return bool | int
785
+	 */
786
+	public static function drop_index($table_name, $index_name)
787
+	{
788
+		return \EEH_Activation::getTableManager()->dropIndex($table_name, $index_name);
789
+	}
790
+
791
+
792
+
793
+	/**
794
+	 * create_database_tables
795
+	 *
796
+	 * @access public
797
+	 * @static
798
+	 * @throws EE_Error
799
+	 * @return boolean success (whether database is setup properly or not)
800
+	 */
801
+	public static function create_database_tables()
802
+	{
803
+		EE_Registry::instance()->load_core('Data_Migration_Manager');
804
+		//find the migration script that sets the database to be compatible with the code
805
+		$dms_name = EE_Data_Migration_Manager::instance()->get_most_up_to_date_dms();
806
+		if ($dms_name) {
807
+			$current_data_migration_script = EE_Registry::instance()->load_dms($dms_name);
808
+			$current_data_migration_script->set_migrating(false);
809
+			$current_data_migration_script->schema_changes_before_migration();
810
+			$current_data_migration_script->schema_changes_after_migration();
811
+			if ($current_data_migration_script->get_errors()) {
812
+				if (WP_DEBUG) {
813
+					foreach ($current_data_migration_script->get_errors() as $error) {
814
+						EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__);
815
+					}
816
+				} else {
817
+					EE_Error::add_error(
818
+						__(
819
+							'There were errors creating the Event Espresso database tables and Event Espresso has been 
820 820
                             deactivated. To view the errors, please enable WP_DEBUG in your wp-config.php file.',
821
-                            'event_espresso'
822
-                        )
823
-                    );
824
-                }
825
-                return false;
826
-            }
827
-            EE_Data_Migration_Manager::instance()->update_current_database_state_to();
828
-        } else {
829
-            EE_Error::add_error(
830
-                __(
831
-                    'Could not determine most up-to-date data migration script from which to pull database schema
821
+							'event_espresso'
822
+						)
823
+					);
824
+				}
825
+				return false;
826
+			}
827
+			EE_Data_Migration_Manager::instance()->update_current_database_state_to();
828
+		} else {
829
+			EE_Error::add_error(
830
+				__(
831
+					'Could not determine most up-to-date data migration script from which to pull database schema
832 832
                      structure. So database is probably not setup properly',
833
-                    'event_espresso'
834
-                ),
835
-                __FILE__,
836
-                __FUNCTION__,
837
-                __LINE__
838
-            );
839
-            return false;
840
-        }
841
-        return true;
842
-    }
843
-
844
-
845
-
846
-    /**
847
-     * initialize_system_questions
848
-     *
849
-     * @access public
850
-     * @static
851
-     * @return void
852
-     */
853
-    public static function initialize_system_questions()
854
-    {
855
-        // QUESTION GROUPS
856
-        global $wpdb;
857
-        $table_name = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question_group');
858
-        $SQL = "SELECT QSG_system FROM $table_name WHERE QSG_system != 0";
859
-        // what we have
860
-        $question_groups = $wpdb->get_col($SQL);
861
-        // check the response
862
-        $question_groups = is_array($question_groups) ? $question_groups : array();
863
-        // what we should have
864
-        $QSG_systems = array(1, 2);
865
-        // loop thru what we should have and compare to what we have
866
-        foreach ($QSG_systems as $QSG_system) {
867
-            // reset values array
868
-            $QSG_values = array();
869
-            // if we don't have what we should have (but use $QST_system as as string because that's what we got from the db)
870
-            if (! in_array("$QSG_system", $question_groups)) {
871
-                // add it
872
-                switch ($QSG_system) {
873
-                    case 1:
874
-                        $QSG_values = array(
875
-                            'QSG_name'            => __('Personal Information', 'event_espresso'),
876
-                            'QSG_identifier'      => 'personal-information-' . time(),
877
-                            'QSG_desc'            => '',
878
-                            'QSG_order'           => 1,
879
-                            'QSG_show_group_name' => 1,
880
-                            'QSG_show_group_desc' => 1,
881
-                            'QSG_system'          => EEM_Question_Group::system_personal,
882
-                            'QSG_deleted'         => 0,
883
-                        );
884
-                        break;
885
-                    case 2:
886
-                        $QSG_values = array(
887
-                            'QSG_name'            => __('Address Information', 'event_espresso'),
888
-                            'QSG_identifier'      => 'address-information-' . time(),
889
-                            'QSG_desc'            => '',
890
-                            'QSG_order'           => 2,
891
-                            'QSG_show_group_name' => 1,
892
-                            'QSG_show_group_desc' => 1,
893
-                            'QSG_system'          => EEM_Question_Group::system_address,
894
-                            'QSG_deleted'         => 0,
895
-                        );
896
-                        break;
897
-                }
898
-                // make sure we have some values before inserting them
899
-                if (! empty($QSG_values)) {
900
-                    // insert system question
901
-                    $wpdb->insert(
902
-                        $table_name,
903
-                        $QSG_values,
904
-                        array('%s', '%s', '%s', '%d', '%d', '%d', '%d', '%d')
905
-                    );
906
-                    $QSG_IDs[$QSG_system] = $wpdb->insert_id;
907
-                }
908
-            }
909
-        }
910
-        // QUESTIONS
911
-        global $wpdb;
912
-        $table_name = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question');
913
-        $SQL = "SELECT QST_system FROM $table_name WHERE QST_system != ''";
914
-        // what we have
915
-        $questions = $wpdb->get_col($SQL);
916
-        // what we should have
917
-        $QST_systems = array(
918
-            'fname',
919
-            'lname',
920
-            'email',
921
-            'address',
922
-            'address2',
923
-            'city',
924
-            'country',
925
-            'state',
926
-            'zip',
927
-            'phone',
928
-        );
929
-        $order_for_group_1 = 1;
930
-        $order_for_group_2 = 1;
931
-        // loop thru what we should have and compare to what we have
932
-        foreach ($QST_systems as $QST_system) {
933
-            // reset values array
934
-            $QST_values = array();
935
-            // if we don't have what we should have
936
-            if (! in_array($QST_system, $questions)) {
937
-                // add it
938
-                switch ($QST_system) {
939
-                    case 'fname':
940
-                        $QST_values = array(
941
-                            'QST_display_text'  => __('First Name', 'event_espresso'),
942
-                            'QST_admin_label'   => __('First Name - System Question', 'event_espresso'),
943
-                            'QST_system'        => 'fname',
944
-                            'QST_type'          => 'TEXT',
945
-                            'QST_required'      => 1,
946
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
947
-                            'QST_order'         => 1,
948
-                            'QST_admin_only'    => 0,
949
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
950
-                            'QST_wp_user'       => self::get_default_creator_id(),
951
-                            'QST_deleted'       => 0,
952
-                        );
953
-                        break;
954
-                    case 'lname':
955
-                        $QST_values = array(
956
-                            'QST_display_text'  => __('Last Name', 'event_espresso'),
957
-                            'QST_admin_label'   => __('Last Name - System Question', 'event_espresso'),
958
-                            'QST_system'        => 'lname',
959
-                            'QST_type'          => 'TEXT',
960
-                            'QST_required'      => 1,
961
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
962
-                            'QST_order'         => 2,
963
-                            'QST_admin_only'    => 0,
964
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
965
-                            'QST_wp_user'       => self::get_default_creator_id(),
966
-                            'QST_deleted'       => 0,
967
-                        );
968
-                        break;
969
-                    case 'email':
970
-                        $QST_values = array(
971
-                            'QST_display_text'  => __('Email Address', 'event_espresso'),
972
-                            'QST_admin_label'   => __('Email Address - System Question', 'event_espresso'),
973
-                            'QST_system'        => 'email',
974
-                            'QST_type'          => 'EMAIL',
975
-                            'QST_required'      => 1,
976
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
977
-                            'QST_order'         => 3,
978
-                            'QST_admin_only'    => 0,
979
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
980
-                            'QST_wp_user'       => self::get_default_creator_id(),
981
-                            'QST_deleted'       => 0,
982
-                        );
983
-                        break;
984
-                    case 'address':
985
-                        $QST_values = array(
986
-                            'QST_display_text'  => __('Address', 'event_espresso'),
987
-                            'QST_admin_label'   => __('Address - System Question', 'event_espresso'),
988
-                            'QST_system'        => 'address',
989
-                            'QST_type'          => 'TEXT',
990
-                            'QST_required'      => 0,
991
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
992
-                            'QST_order'         => 4,
993
-                            'QST_admin_only'    => 0,
994
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
995
-                            'QST_wp_user'       => self::get_default_creator_id(),
996
-                            'QST_deleted'       => 0,
997
-                        );
998
-                        break;
999
-                    case 'address2':
1000
-                        $QST_values = array(
1001
-                            'QST_display_text'  => __('Address2', 'event_espresso'),
1002
-                            'QST_admin_label'   => __('Address2 - System Question', 'event_espresso'),
1003
-                            'QST_system'        => 'address2',
1004
-                            'QST_type'          => 'TEXT',
1005
-                            'QST_required'      => 0,
1006
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1007
-                            'QST_order'         => 5,
1008
-                            'QST_admin_only'    => 0,
1009
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1010
-                            'QST_wp_user'       => self::get_default_creator_id(),
1011
-                            'QST_deleted'       => 0,
1012
-                        );
1013
-                        break;
1014
-                    case 'city':
1015
-                        $QST_values = array(
1016
-                            'QST_display_text'  => __('City', 'event_espresso'),
1017
-                            'QST_admin_label'   => __('City - System Question', 'event_espresso'),
1018
-                            'QST_system'        => 'city',
1019
-                            'QST_type'          => 'TEXT',
1020
-                            'QST_required'      => 0,
1021
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1022
-                            'QST_order'         => 6,
1023
-                            'QST_admin_only'    => 0,
1024
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1025
-                            'QST_wp_user'       => self::get_default_creator_id(),
1026
-                            'QST_deleted'       => 0,
1027
-                        );
1028
-                        break;
1029
-                    case 'country':
1030
-                        $QST_values = array(
1031
-                            'QST_display_text'  => __('Country', 'event_espresso'),
1032
-                            'QST_admin_label'   => __('Country - System Question', 'event_espresso'),
1033
-                            'QST_system'        => 'country',
1034
-                            'QST_type'          => 'COUNTRY',
1035
-                            'QST_required'      => 0,
1036
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1037
-                            'QST_order'         => 7,
1038
-                            'QST_admin_only'    => 0,
1039
-                            'QST_wp_user'       => self::get_default_creator_id(),
1040
-                            'QST_deleted'       => 0,
1041
-                        );
1042
-                        break;
1043
-                    case 'state':
1044
-                        $QST_values = array(
1045
-                            'QST_display_text'  => __('State/Province', 'event_espresso'),
1046
-                            'QST_admin_label'   => __('State/Province - System Question', 'event_espresso'),
1047
-                            'QST_system'        => 'state',
1048
-                            'QST_type'          => 'STATE',
1049
-                            'QST_required'      => 0,
1050
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1051
-                            'QST_order'         => 8,
1052
-                            'QST_admin_only'    => 0,
1053
-                            'QST_wp_user'       => self::get_default_creator_id(),
1054
-                            'QST_deleted'       => 0,
1055
-                        );
1056
-                        break;
1057
-                    case 'zip':
1058
-                        $QST_values = array(
1059
-                            'QST_display_text'  => __('Zip/Postal Code', 'event_espresso'),
1060
-                            'QST_admin_label'   => __('Zip/Postal Code - System Question', 'event_espresso'),
1061
-                            'QST_system'        => 'zip',
1062
-                            'QST_type'          => 'TEXT',
1063
-                            'QST_required'      => 0,
1064
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1065
-                            'QST_order'         => 9,
1066
-                            'QST_admin_only'    => 0,
1067
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1068
-                            'QST_wp_user'       => self::get_default_creator_id(),
1069
-                            'QST_deleted'       => 0,
1070
-                        );
1071
-                        break;
1072
-                    case 'phone':
1073
-                        $QST_values = array(
1074
-                            'QST_display_text'  => __('Phone Number', 'event_espresso'),
1075
-                            'QST_admin_label'   => __('Phone Number - System Question', 'event_espresso'),
1076
-                            'QST_system'        => 'phone',
1077
-                            'QST_type'          => 'TEXT',
1078
-                            'QST_required'      => 0,
1079
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1080
-                            'QST_order'         => 10,
1081
-                            'QST_admin_only'    => 0,
1082
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1083
-                            'QST_wp_user'       => self::get_default_creator_id(),
1084
-                            'QST_deleted'       => 0,
1085
-                        );
1086
-                        break;
1087
-                }
1088
-                if (! empty($QST_values)) {
1089
-                    // insert system question
1090
-                    $wpdb->insert(
1091
-                        $table_name,
1092
-                        $QST_values,
1093
-                        array('%s', '%s', '%s', '%s', '%d', '%s', '%d', '%d', '%d', '%d')
1094
-                    );
1095
-                    $QST_ID = $wpdb->insert_id;
1096
-                    // QUESTION GROUP QUESTIONS
1097
-                    if (in_array($QST_system, array('fname', 'lname', 'email'))) {
1098
-                        $system_question_we_want = EEM_Question_Group::system_personal;
1099
-                    } else {
1100
-                        $system_question_we_want = EEM_Question_Group::system_address;
1101
-                    }
1102
-                    if (isset($QSG_IDs[$system_question_we_want])) {
1103
-                        $QSG_ID = $QSG_IDs[$system_question_we_want];
1104
-                    } else {
1105
-                        $id_col = EEM_Question_Group::instance()
1106
-                                                    ->get_col(array(array('QSG_system' => $system_question_we_want)));
1107
-                        if (is_array($id_col)) {
1108
-                            $QSG_ID = reset($id_col);
1109
-                        } else {
1110
-                            //ok so we didn't find it in the db either?? that's weird because we should have inserted it at the start of this method
1111
-                            EE_Log::instance()->log(
1112
-                                __FILE__,
1113
-                                __FUNCTION__,
1114
-                                sprintf(
1115
-                                    __(
1116
-                                        'Could not associate question %1$s to a question group because no system question
833
+					'event_espresso'
834
+				),
835
+				__FILE__,
836
+				__FUNCTION__,
837
+				__LINE__
838
+			);
839
+			return false;
840
+		}
841
+		return true;
842
+	}
843
+
844
+
845
+
846
+	/**
847
+	 * initialize_system_questions
848
+	 *
849
+	 * @access public
850
+	 * @static
851
+	 * @return void
852
+	 */
853
+	public static function initialize_system_questions()
854
+	{
855
+		// QUESTION GROUPS
856
+		global $wpdb;
857
+		$table_name = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question_group');
858
+		$SQL = "SELECT QSG_system FROM $table_name WHERE QSG_system != 0";
859
+		// what we have
860
+		$question_groups = $wpdb->get_col($SQL);
861
+		// check the response
862
+		$question_groups = is_array($question_groups) ? $question_groups : array();
863
+		// what we should have
864
+		$QSG_systems = array(1, 2);
865
+		// loop thru what we should have and compare to what we have
866
+		foreach ($QSG_systems as $QSG_system) {
867
+			// reset values array
868
+			$QSG_values = array();
869
+			// if we don't have what we should have (but use $QST_system as as string because that's what we got from the db)
870
+			if (! in_array("$QSG_system", $question_groups)) {
871
+				// add it
872
+				switch ($QSG_system) {
873
+					case 1:
874
+						$QSG_values = array(
875
+							'QSG_name'            => __('Personal Information', 'event_espresso'),
876
+							'QSG_identifier'      => 'personal-information-' . time(),
877
+							'QSG_desc'            => '',
878
+							'QSG_order'           => 1,
879
+							'QSG_show_group_name' => 1,
880
+							'QSG_show_group_desc' => 1,
881
+							'QSG_system'          => EEM_Question_Group::system_personal,
882
+							'QSG_deleted'         => 0,
883
+						);
884
+						break;
885
+					case 2:
886
+						$QSG_values = array(
887
+							'QSG_name'            => __('Address Information', 'event_espresso'),
888
+							'QSG_identifier'      => 'address-information-' . time(),
889
+							'QSG_desc'            => '',
890
+							'QSG_order'           => 2,
891
+							'QSG_show_group_name' => 1,
892
+							'QSG_show_group_desc' => 1,
893
+							'QSG_system'          => EEM_Question_Group::system_address,
894
+							'QSG_deleted'         => 0,
895
+						);
896
+						break;
897
+				}
898
+				// make sure we have some values before inserting them
899
+				if (! empty($QSG_values)) {
900
+					// insert system question
901
+					$wpdb->insert(
902
+						$table_name,
903
+						$QSG_values,
904
+						array('%s', '%s', '%s', '%d', '%d', '%d', '%d', '%d')
905
+					);
906
+					$QSG_IDs[$QSG_system] = $wpdb->insert_id;
907
+				}
908
+			}
909
+		}
910
+		// QUESTIONS
911
+		global $wpdb;
912
+		$table_name = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question');
913
+		$SQL = "SELECT QST_system FROM $table_name WHERE QST_system != ''";
914
+		// what we have
915
+		$questions = $wpdb->get_col($SQL);
916
+		// what we should have
917
+		$QST_systems = array(
918
+			'fname',
919
+			'lname',
920
+			'email',
921
+			'address',
922
+			'address2',
923
+			'city',
924
+			'country',
925
+			'state',
926
+			'zip',
927
+			'phone',
928
+		);
929
+		$order_for_group_1 = 1;
930
+		$order_for_group_2 = 1;
931
+		// loop thru what we should have and compare to what we have
932
+		foreach ($QST_systems as $QST_system) {
933
+			// reset values array
934
+			$QST_values = array();
935
+			// if we don't have what we should have
936
+			if (! in_array($QST_system, $questions)) {
937
+				// add it
938
+				switch ($QST_system) {
939
+					case 'fname':
940
+						$QST_values = array(
941
+							'QST_display_text'  => __('First Name', 'event_espresso'),
942
+							'QST_admin_label'   => __('First Name - System Question', 'event_espresso'),
943
+							'QST_system'        => 'fname',
944
+							'QST_type'          => 'TEXT',
945
+							'QST_required'      => 1,
946
+							'QST_required_text' => __('This field is required', 'event_espresso'),
947
+							'QST_order'         => 1,
948
+							'QST_admin_only'    => 0,
949
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
950
+							'QST_wp_user'       => self::get_default_creator_id(),
951
+							'QST_deleted'       => 0,
952
+						);
953
+						break;
954
+					case 'lname':
955
+						$QST_values = array(
956
+							'QST_display_text'  => __('Last Name', 'event_espresso'),
957
+							'QST_admin_label'   => __('Last Name - System Question', 'event_espresso'),
958
+							'QST_system'        => 'lname',
959
+							'QST_type'          => 'TEXT',
960
+							'QST_required'      => 1,
961
+							'QST_required_text' => __('This field is required', 'event_espresso'),
962
+							'QST_order'         => 2,
963
+							'QST_admin_only'    => 0,
964
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
965
+							'QST_wp_user'       => self::get_default_creator_id(),
966
+							'QST_deleted'       => 0,
967
+						);
968
+						break;
969
+					case 'email':
970
+						$QST_values = array(
971
+							'QST_display_text'  => __('Email Address', 'event_espresso'),
972
+							'QST_admin_label'   => __('Email Address - System Question', 'event_espresso'),
973
+							'QST_system'        => 'email',
974
+							'QST_type'          => 'EMAIL',
975
+							'QST_required'      => 1,
976
+							'QST_required_text' => __('This field is required', 'event_espresso'),
977
+							'QST_order'         => 3,
978
+							'QST_admin_only'    => 0,
979
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
980
+							'QST_wp_user'       => self::get_default_creator_id(),
981
+							'QST_deleted'       => 0,
982
+						);
983
+						break;
984
+					case 'address':
985
+						$QST_values = array(
986
+							'QST_display_text'  => __('Address', 'event_espresso'),
987
+							'QST_admin_label'   => __('Address - System Question', 'event_espresso'),
988
+							'QST_system'        => 'address',
989
+							'QST_type'          => 'TEXT',
990
+							'QST_required'      => 0,
991
+							'QST_required_text' => __('This field is required', 'event_espresso'),
992
+							'QST_order'         => 4,
993
+							'QST_admin_only'    => 0,
994
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
995
+							'QST_wp_user'       => self::get_default_creator_id(),
996
+							'QST_deleted'       => 0,
997
+						);
998
+						break;
999
+					case 'address2':
1000
+						$QST_values = array(
1001
+							'QST_display_text'  => __('Address2', 'event_espresso'),
1002
+							'QST_admin_label'   => __('Address2 - System Question', 'event_espresso'),
1003
+							'QST_system'        => 'address2',
1004
+							'QST_type'          => 'TEXT',
1005
+							'QST_required'      => 0,
1006
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1007
+							'QST_order'         => 5,
1008
+							'QST_admin_only'    => 0,
1009
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1010
+							'QST_wp_user'       => self::get_default_creator_id(),
1011
+							'QST_deleted'       => 0,
1012
+						);
1013
+						break;
1014
+					case 'city':
1015
+						$QST_values = array(
1016
+							'QST_display_text'  => __('City', 'event_espresso'),
1017
+							'QST_admin_label'   => __('City - System Question', 'event_espresso'),
1018
+							'QST_system'        => 'city',
1019
+							'QST_type'          => 'TEXT',
1020
+							'QST_required'      => 0,
1021
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1022
+							'QST_order'         => 6,
1023
+							'QST_admin_only'    => 0,
1024
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1025
+							'QST_wp_user'       => self::get_default_creator_id(),
1026
+							'QST_deleted'       => 0,
1027
+						);
1028
+						break;
1029
+					case 'country':
1030
+						$QST_values = array(
1031
+							'QST_display_text'  => __('Country', 'event_espresso'),
1032
+							'QST_admin_label'   => __('Country - System Question', 'event_espresso'),
1033
+							'QST_system'        => 'country',
1034
+							'QST_type'          => 'COUNTRY',
1035
+							'QST_required'      => 0,
1036
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1037
+							'QST_order'         => 7,
1038
+							'QST_admin_only'    => 0,
1039
+							'QST_wp_user'       => self::get_default_creator_id(),
1040
+							'QST_deleted'       => 0,
1041
+						);
1042
+						break;
1043
+					case 'state':
1044
+						$QST_values = array(
1045
+							'QST_display_text'  => __('State/Province', 'event_espresso'),
1046
+							'QST_admin_label'   => __('State/Province - System Question', 'event_espresso'),
1047
+							'QST_system'        => 'state',
1048
+							'QST_type'          => 'STATE',
1049
+							'QST_required'      => 0,
1050
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1051
+							'QST_order'         => 8,
1052
+							'QST_admin_only'    => 0,
1053
+							'QST_wp_user'       => self::get_default_creator_id(),
1054
+							'QST_deleted'       => 0,
1055
+						);
1056
+						break;
1057
+					case 'zip':
1058
+						$QST_values = array(
1059
+							'QST_display_text'  => __('Zip/Postal Code', 'event_espresso'),
1060
+							'QST_admin_label'   => __('Zip/Postal Code - System Question', 'event_espresso'),
1061
+							'QST_system'        => 'zip',
1062
+							'QST_type'          => 'TEXT',
1063
+							'QST_required'      => 0,
1064
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1065
+							'QST_order'         => 9,
1066
+							'QST_admin_only'    => 0,
1067
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1068
+							'QST_wp_user'       => self::get_default_creator_id(),
1069
+							'QST_deleted'       => 0,
1070
+						);
1071
+						break;
1072
+					case 'phone':
1073
+						$QST_values = array(
1074
+							'QST_display_text'  => __('Phone Number', 'event_espresso'),
1075
+							'QST_admin_label'   => __('Phone Number - System Question', 'event_espresso'),
1076
+							'QST_system'        => 'phone',
1077
+							'QST_type'          => 'TEXT',
1078
+							'QST_required'      => 0,
1079
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1080
+							'QST_order'         => 10,
1081
+							'QST_admin_only'    => 0,
1082
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1083
+							'QST_wp_user'       => self::get_default_creator_id(),
1084
+							'QST_deleted'       => 0,
1085
+						);
1086
+						break;
1087
+				}
1088
+				if (! empty($QST_values)) {
1089
+					// insert system question
1090
+					$wpdb->insert(
1091
+						$table_name,
1092
+						$QST_values,
1093
+						array('%s', '%s', '%s', '%s', '%d', '%s', '%d', '%d', '%d', '%d')
1094
+					);
1095
+					$QST_ID = $wpdb->insert_id;
1096
+					// QUESTION GROUP QUESTIONS
1097
+					if (in_array($QST_system, array('fname', 'lname', 'email'))) {
1098
+						$system_question_we_want = EEM_Question_Group::system_personal;
1099
+					} else {
1100
+						$system_question_we_want = EEM_Question_Group::system_address;
1101
+					}
1102
+					if (isset($QSG_IDs[$system_question_we_want])) {
1103
+						$QSG_ID = $QSG_IDs[$system_question_we_want];
1104
+					} else {
1105
+						$id_col = EEM_Question_Group::instance()
1106
+													->get_col(array(array('QSG_system' => $system_question_we_want)));
1107
+						if (is_array($id_col)) {
1108
+							$QSG_ID = reset($id_col);
1109
+						} else {
1110
+							//ok so we didn't find it in the db either?? that's weird because we should have inserted it at the start of this method
1111
+							EE_Log::instance()->log(
1112
+								__FILE__,
1113
+								__FUNCTION__,
1114
+								sprintf(
1115
+									__(
1116
+										'Could not associate question %1$s to a question group because no system question
1117 1117
                                          group existed',
1118
-                                        'event_espresso'
1119
-                                    ),
1120
-                                    $QST_ID),
1121
-                                'error');
1122
-                            continue;
1123
-                        }
1124
-                    }
1125
-                    // add system questions to groups
1126
-                    $wpdb->insert(
1127
-                        \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question_group_question'),
1128
-                        array(
1129
-                            'QSG_ID'    => $QSG_ID,
1130
-                            'QST_ID'    => $QST_ID,
1131
-                            'QGQ_order' => ($QSG_ID === 1) ? $order_for_group_1++ : $order_for_group_2++,
1132
-                        ),
1133
-                        array('%d', '%d', '%d')
1134
-                    );
1135
-                }
1136
-            }
1137
-        }
1138
-    }
1139
-
1140
-
1141
-    /**
1142
-     * Makes sure the default payment method (Invoice) is active.
1143
-     * This used to be done automatically as part of constructing the old gateways config
1144
-     *
1145
-     * @throws \EE_Error
1146
-     */
1147
-    public static function insert_default_payment_methods()
1148
-    {
1149
-        if (! EEM_Payment_Method::instance()->count_active(EEM_Payment_Method::scope_cart)) {
1150
-            EE_Registry::instance()->load_lib('Payment_Method_Manager');
1151
-            EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
1152
-        } else {
1153
-            EEM_Payment_Method::instance()->verify_button_urls();
1154
-        }
1155
-    }
1156
-
1157
-    /**
1158
-     * insert_default_status_codes
1159
-     *
1160
-     * @access public
1161
-     * @static
1162
-     * @return void
1163
-     */
1164
-    public static function insert_default_status_codes()
1165
-    {
1166
-
1167
-        global $wpdb;
1168
-
1169
-        if (\EEH_Activation::getTableAnalysis()->tableExists(EEM_Status::instance()->table())) {
1170
-
1171
-            $table_name = EEM_Status::instance()->table();
1172
-
1173
-            $SQL = "DELETE FROM $table_name WHERE STS_ID IN ( 'ACT', 'NAC', 'NOP', 'OPN', 'CLS', 'PND', 'ONG', 'SEC', 'DRF', 'DEL', 'DEN', 'EXP', 'RPP', 'RCN', 'RDC', 'RAP', 'RNA', 'RWL', 'TAB', 'TIN', 'TFL', 'TCM', 'TOP', 'PAP', 'PCN', 'PFL', 'PDC', 'EDR', 'ESN', 'PPN', 'RIC', 'MSN', 'MFL', 'MID', 'MRS', 'MIC', 'MDO', 'MEX' );";
1174
-            $wpdb->query($SQL);
1175
-
1176
-            $SQL = "INSERT INTO $table_name
1118
+										'event_espresso'
1119
+									),
1120
+									$QST_ID),
1121
+								'error');
1122
+							continue;
1123
+						}
1124
+					}
1125
+					// add system questions to groups
1126
+					$wpdb->insert(
1127
+						\EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question_group_question'),
1128
+						array(
1129
+							'QSG_ID'    => $QSG_ID,
1130
+							'QST_ID'    => $QST_ID,
1131
+							'QGQ_order' => ($QSG_ID === 1) ? $order_for_group_1++ : $order_for_group_2++,
1132
+						),
1133
+						array('%d', '%d', '%d')
1134
+					);
1135
+				}
1136
+			}
1137
+		}
1138
+	}
1139
+
1140
+
1141
+	/**
1142
+	 * Makes sure the default payment method (Invoice) is active.
1143
+	 * This used to be done automatically as part of constructing the old gateways config
1144
+	 *
1145
+	 * @throws \EE_Error
1146
+	 */
1147
+	public static function insert_default_payment_methods()
1148
+	{
1149
+		if (! EEM_Payment_Method::instance()->count_active(EEM_Payment_Method::scope_cart)) {
1150
+			EE_Registry::instance()->load_lib('Payment_Method_Manager');
1151
+			EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
1152
+		} else {
1153
+			EEM_Payment_Method::instance()->verify_button_urls();
1154
+		}
1155
+	}
1156
+
1157
+	/**
1158
+	 * insert_default_status_codes
1159
+	 *
1160
+	 * @access public
1161
+	 * @static
1162
+	 * @return void
1163
+	 */
1164
+	public static function insert_default_status_codes()
1165
+	{
1166
+
1167
+		global $wpdb;
1168
+
1169
+		if (\EEH_Activation::getTableAnalysis()->tableExists(EEM_Status::instance()->table())) {
1170
+
1171
+			$table_name = EEM_Status::instance()->table();
1172
+
1173
+			$SQL = "DELETE FROM $table_name WHERE STS_ID IN ( 'ACT', 'NAC', 'NOP', 'OPN', 'CLS', 'PND', 'ONG', 'SEC', 'DRF', 'DEL', 'DEN', 'EXP', 'RPP', 'RCN', 'RDC', 'RAP', 'RNA', 'RWL', 'TAB', 'TIN', 'TFL', 'TCM', 'TOP', 'PAP', 'PCN', 'PFL', 'PDC', 'EDR', 'ESN', 'PPN', 'RIC', 'MSN', 'MFL', 'MID', 'MRS', 'MIC', 'MDO', 'MEX' );";
1174
+			$wpdb->query($SQL);
1175
+
1176
+			$SQL = "INSERT INTO $table_name
1177 1177
 					(STS_ID, STS_code, STS_type, STS_can_edit, STS_desc, STS_open) VALUES
1178 1178
 					('ACT', 'ACTIVE', 'event', 0, NULL, 1),
1179 1179
 					('NAC', 'NOT_ACTIVE', 'event', 0, NULL, 0),
@@ -1213,521 +1213,521 @@  discard block
 block discarded – undo
1213 1213
 					('MID', 'IDLE', 'message', 0, NULL, 1),
1214 1214
 					('MRS', 'RESEND', 'message', 0, NULL, 1),
1215 1215
 					('MIC', 'INCOMPLETE', 'message', 0, NULL, 0);";
1216
-            $wpdb->query($SQL);
1217
-
1218
-        }
1219
-
1220
-    }
1221
-
1222
-
1223
-    /**
1224
-     * create_upload_directories
1225
-     * Creates folders in the uploads directory to facilitate addons and templates
1226
-     *
1227
-     * @access public
1228
-     * @static
1229
-     * @return boolean success of verifying upload directories exist
1230
-     */
1231
-    public static function create_upload_directories()
1232
-    {
1233
-        // Create the required folders
1234
-        $folders = array(
1235
-            EVENT_ESPRESSO_TEMPLATE_DIR,
1236
-            EVENT_ESPRESSO_GATEWAY_DIR,
1237
-            EVENT_ESPRESSO_UPLOAD_DIR . 'logs/',
1238
-            EVENT_ESPRESSO_UPLOAD_DIR . 'css/',
1239
-            EVENT_ESPRESSO_UPLOAD_DIR . 'tickets/',
1240
-        );
1241
-        foreach ($folders as $folder) {
1242
-            try {
1243
-                EEH_File::ensure_folder_exists_and_is_writable($folder);
1244
-                @ chmod($folder, 0755);
1245
-            } catch (EE_Error $e) {
1246
-                EE_Error::add_error(
1247
-                    sprintf(
1248
-                        __('Could not create the folder at "%1$s" because: %2$s', 'event_espresso'),
1249
-                        $folder,
1250
-                        '<br />' . $e->getMessage()
1251
-                    ),
1252
-                    __FILE__, __FUNCTION__, __LINE__
1253
-                );
1254
-                //indicate we'll need to fix this later
1255
-                update_option(EEH_Activation::upload_directories_incomplete_option_name, true);
1256
-                return false;
1257
-            }
1258
-        }
1259
-        //just add the .htaccess file to the logs directory to begin with. Even if logging
1260
-        //is disabled, there might be activation errors recorded in there
1261
-        EEH_File::add_htaccess_deny_from_all(EVENT_ESPRESSO_UPLOAD_DIR . 'logs/');
1262
-        //remember EE's folders are all good
1263
-        delete_option(EEH_Activation::upload_directories_incomplete_option_name);
1264
-        return true;
1265
-    }
1266
-
1267
-    /**
1268
-     * Whether the upload directories need to be fixed or not.
1269
-     * If EE is installed but filesystem access isn't initially available,
1270
-     * we need to get the user's filesystem credentials and THEN create them,
1271
-     * so there might be period of time when EE is installed but its
1272
-     * upload directories aren't available. This indicates such a state
1273
-     *
1274
-     * @return boolean
1275
-     */
1276
-    public static function upload_directories_incomplete()
1277
-    {
1278
-        return get_option(EEH_Activation::upload_directories_incomplete_option_name, false);
1279
-    }
1280
-
1281
-
1282
-    /**
1283
-     * generate_default_message_templates
1284
-     *
1285
-     * @static
1286
-     * @throws EE_Error
1287
-     * @return bool     true means new templates were created.
1288
-     *                  false means no templates were created.
1289
-     *                  This is NOT an error flag. To check for errors you will want
1290
-     *                  to use either EE_Error or a try catch for an EE_Error exception.
1291
-     */
1292
-    public static function generate_default_message_templates()
1293
-    {
1294
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
1295
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1296
-        /*
1216
+			$wpdb->query($SQL);
1217
+
1218
+		}
1219
+
1220
+	}
1221
+
1222
+
1223
+	/**
1224
+	 * create_upload_directories
1225
+	 * Creates folders in the uploads directory to facilitate addons and templates
1226
+	 *
1227
+	 * @access public
1228
+	 * @static
1229
+	 * @return boolean success of verifying upload directories exist
1230
+	 */
1231
+	public static function create_upload_directories()
1232
+	{
1233
+		// Create the required folders
1234
+		$folders = array(
1235
+			EVENT_ESPRESSO_TEMPLATE_DIR,
1236
+			EVENT_ESPRESSO_GATEWAY_DIR,
1237
+			EVENT_ESPRESSO_UPLOAD_DIR . 'logs/',
1238
+			EVENT_ESPRESSO_UPLOAD_DIR . 'css/',
1239
+			EVENT_ESPRESSO_UPLOAD_DIR . 'tickets/',
1240
+		);
1241
+		foreach ($folders as $folder) {
1242
+			try {
1243
+				EEH_File::ensure_folder_exists_and_is_writable($folder);
1244
+				@ chmod($folder, 0755);
1245
+			} catch (EE_Error $e) {
1246
+				EE_Error::add_error(
1247
+					sprintf(
1248
+						__('Could not create the folder at "%1$s" because: %2$s', 'event_espresso'),
1249
+						$folder,
1250
+						'<br />' . $e->getMessage()
1251
+					),
1252
+					__FILE__, __FUNCTION__, __LINE__
1253
+				);
1254
+				//indicate we'll need to fix this later
1255
+				update_option(EEH_Activation::upload_directories_incomplete_option_name, true);
1256
+				return false;
1257
+			}
1258
+		}
1259
+		//just add the .htaccess file to the logs directory to begin with. Even if logging
1260
+		//is disabled, there might be activation errors recorded in there
1261
+		EEH_File::add_htaccess_deny_from_all(EVENT_ESPRESSO_UPLOAD_DIR . 'logs/');
1262
+		//remember EE's folders are all good
1263
+		delete_option(EEH_Activation::upload_directories_incomplete_option_name);
1264
+		return true;
1265
+	}
1266
+
1267
+	/**
1268
+	 * Whether the upload directories need to be fixed or not.
1269
+	 * If EE is installed but filesystem access isn't initially available,
1270
+	 * we need to get the user's filesystem credentials and THEN create them,
1271
+	 * so there might be period of time when EE is installed but its
1272
+	 * upload directories aren't available. This indicates such a state
1273
+	 *
1274
+	 * @return boolean
1275
+	 */
1276
+	public static function upload_directories_incomplete()
1277
+	{
1278
+		return get_option(EEH_Activation::upload_directories_incomplete_option_name, false);
1279
+	}
1280
+
1281
+
1282
+	/**
1283
+	 * generate_default_message_templates
1284
+	 *
1285
+	 * @static
1286
+	 * @throws EE_Error
1287
+	 * @return bool     true means new templates were created.
1288
+	 *                  false means no templates were created.
1289
+	 *                  This is NOT an error flag. To check for errors you will want
1290
+	 *                  to use either EE_Error or a try catch for an EE_Error exception.
1291
+	 */
1292
+	public static function generate_default_message_templates()
1293
+	{
1294
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
1295
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1296
+		/*
1297 1297
          * This first method is taking care of ensuring any default messengers
1298 1298
          * that should be made active and have templates generated are done.
1299 1299
          */
1300
-        $new_templates_created_for_messenger = self::_activate_and_generate_default_messengers_and_message_templates(
1301
-            $message_resource_manager
1302
-        );
1303
-        /**
1304
-         * This method is verifying there are no NEW default message types
1305
-         * for ACTIVE messengers that need activated (and corresponding templates setup).
1306
-         */
1307
-        $new_templates_created_for_message_type = self::_activate_new_message_types_for_active_messengers_and_generate_default_templates(
1308
-            $message_resource_manager
1309
-        );
1310
-        //after all is done, let's persist these changes to the db.
1311
-        $message_resource_manager->update_has_activated_messengers_option();
1312
-        $message_resource_manager->update_active_messengers_option();
1313
-        // will return true if either of these are true.  Otherwise will return false.
1314
-        return $new_templates_created_for_message_type || $new_templates_created_for_messenger;
1315
-    }
1316
-
1317
-
1318
-
1319
-    /**
1320
-     * @param \EE_Message_Resource_Manager $message_resource_manager
1321
-     * @return array|bool
1322
-     * @throws \EE_Error
1323
-     */
1324
-    protected static function _activate_new_message_types_for_active_messengers_and_generate_default_templates(
1325
-        EE_Message_Resource_Manager $message_resource_manager
1326
-    ) {
1327
-        /** @type EE_messenger[] $active_messengers */
1328
-        $active_messengers = $message_resource_manager->active_messengers();
1329
-        $installed_message_types = $message_resource_manager->installed_message_types();
1330
-        $templates_created = false;
1331
-        foreach ($active_messengers as $active_messenger) {
1332
-            $default_message_type_names_for_messenger = $active_messenger->get_default_message_types();
1333
-            $default_message_type_names_to_activate = array();
1334
-            // looping through each default message type reported by the messenger
1335
-            // and setup the actual message types to activate.
1336
-            foreach ($default_message_type_names_for_messenger as $default_message_type_name_for_messenger) {
1337
-                // if already active or has already been activated before we skip
1338
-                // (otherwise we might reactivate something user's intentionally deactivated.)
1339
-                // we also skip if the message type is not installed.
1340
-                if (
1341
-                    $message_resource_manager->has_message_type_been_activated_for_messenger(
1342
-                        $default_message_type_name_for_messenger,
1343
-                        $active_messenger->name
1344
-                    )
1345
-                    || $message_resource_manager->is_message_type_active_for_messenger(
1346
-                        $active_messenger->name,
1347
-                        $default_message_type_name_for_messenger
1348
-                    )
1349
-                    || ! isset($installed_message_types[$default_message_type_name_for_messenger])
1350
-                ) {
1351
-                    continue;
1352
-                }
1353
-                $default_message_type_names_to_activate[] = $default_message_type_name_for_messenger;
1354
-            }
1355
-            //let's activate!
1356
-            $message_resource_manager->ensure_message_types_are_active(
1357
-                $default_message_type_names_to_activate,
1358
-                $active_messenger->name,
1359
-                false
1360
-            );
1361
-            //activate the templates for these message types
1362
-            if ( ! empty($default_message_type_names_to_activate)) {
1363
-                $templates_created = EEH_MSG_Template::generate_new_templates(
1364
-                    $active_messenger->name,
1365
-                    $default_message_type_names_for_messenger,
1366
-                    '',
1367
-                    true
1368
-                );
1369
-            }
1370
-        }
1371
-        return $templates_created;
1372
-    }
1373
-
1374
-
1375
-
1376
-    /**
1377
-     * This will activate and generate default messengers and default message types for those messengers.
1378
-     *
1379
-     * @param EE_message_Resource_Manager $message_resource_manager
1380
-     * @return array|bool  True means there were default messengers and message type templates generated.
1381
-     *                     False means that there were no templates generated
1382
-     *                     (which could simply mean there are no default message types for a messenger).
1383
-     * @throws EE_Error
1384
-     */
1385
-    protected static function _activate_and_generate_default_messengers_and_message_templates(
1386
-        EE_Message_Resource_Manager $message_resource_manager
1387
-    ) {
1388
-        /** @type EE_messenger[] $messengers_to_generate */
1389
-        $messengers_to_generate = self::_get_default_messengers_to_generate_on_activation($message_resource_manager);
1390
-        $installed_message_types = $message_resource_manager->installed_message_types();
1391
-        $templates_generated = false;
1392
-        foreach ($messengers_to_generate as $messenger_to_generate) {
1393
-            $default_message_type_names_for_messenger = $messenger_to_generate->get_default_message_types();
1394
-            //verify the default message types match an installed message type.
1395
-            foreach ($default_message_type_names_for_messenger as $key => $name) {
1396
-                if (
1397
-                    ! isset($installed_message_types[$name])
1398
-                    || $message_resource_manager->has_message_type_been_activated_for_messenger(
1399
-                        $name,
1400
-                        $messenger_to_generate->name
1401
-                    )
1402
-                ) {
1403
-                    unset($default_message_type_names_for_messenger[$key]);
1404
-                }
1405
-            }
1406
-            // in previous iterations, the active_messengers option in the db
1407
-            // needed updated before calling create templates. however with the changes this may not be necessary.
1408
-            // This comment is left here just in case we discover that we _do_ need to update before
1409
-            // passing off to create templates (after the refactor is done).
1410
-            // @todo remove this comment when determined not necessary.
1411
-            $message_resource_manager->activate_messenger(
1412
-                $messenger_to_generate->name,
1413
-                $default_message_type_names_for_messenger,
1414
-                false
1415
-            );
1416
-            //create any templates needing created (or will reactivate templates already generated as necessary).
1417
-            if ( ! empty($default_message_type_names_for_messenger)) {
1418
-                $templates_generated = EEH_MSG_Template::generate_new_templates(
1419
-                    $messenger_to_generate->name,
1420
-                    $default_message_type_names_for_messenger,
1421
-                    '',
1422
-                    true
1423
-                );
1424
-            }
1425
-        }
1426
-        return $templates_generated;
1427
-    }
1428
-
1429
-
1430
-    /**
1431
-     * This returns the default messengers to generate templates for on activation of EE.
1432
-     * It considers:
1433
-     * - whether a messenger is already active in the db.
1434
-     * - whether a messenger has been made active at any time in the past.
1435
-     *
1436
-     * @static
1437
-     * @param  EE_Message_Resource_Manager $message_resource_manager
1438
-     * @return EE_messenger[]
1439
-     */
1440
-    protected static function _get_default_messengers_to_generate_on_activation(
1441
-        EE_Message_Resource_Manager $message_resource_manager
1442
-    ) {
1443
-        $active_messengers    = $message_resource_manager->active_messengers();
1444
-        $installed_messengers = $message_resource_manager->installed_messengers();
1445
-        $has_activated        = $message_resource_manager->get_has_activated_messengers_option();
1446
-
1447
-        $messengers_to_generate = array();
1448
-        foreach ($installed_messengers as $installed_messenger) {
1449
-            //if installed messenger is a messenger that should be activated on install
1450
-            //and is not already active
1451
-            //and has never been activated
1452
-            if (
1453
-                ! $installed_messenger->activate_on_install
1454
-                || isset($active_messengers[$installed_messenger->name])
1455
-                || isset($has_activated[$installed_messenger->name])
1456
-            ) {
1457
-                continue;
1458
-            }
1459
-            $messengers_to_generate[$installed_messenger->name] = $installed_messenger;
1460
-        }
1461
-        return $messengers_to_generate;
1462
-    }
1463
-
1464
-
1465
-    /**
1466
-     * This simply validates active message types to ensure they actually match installed
1467
-     * message types.  If there's a mismatch then we deactivate the message type and ensure all related db
1468
-     * rows are set inactive.
1469
-     * Note: Messengers are no longer validated here as of 4.9.0 because they get validated automatically whenever
1470
-     * EE_Messenger_Resource_Manager is constructed.  Message Types are a bit more resource heavy for validation so they
1471
-     * are still handled in here.
1472
-     *
1473
-     * @since 4.3.1
1474
-     * @return void
1475
-     */
1476
-    public static function validate_messages_system()
1477
-    {
1478
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
1479
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1480
-        $message_resource_manager->validate_active_message_types_are_installed();
1481
-        do_action('AHEE__EEH_Activation__validate_messages_system');
1482
-    }
1483
-
1484
-
1485
-    /**
1486
-     * create_no_ticket_prices_array
1487
-     *
1488
-     * @access public
1489
-     * @static
1490
-     * @return void
1491
-     */
1492
-    public static function create_no_ticket_prices_array()
1493
-    {
1494
-        // this creates an array for tracking events that have no active ticket prices created
1495
-        // this allows us to warn admins of the situation so that it can be corrected
1496
-        $espresso_no_ticket_prices = get_option('ee_no_ticket_prices', false);
1497
-        if (! $espresso_no_ticket_prices) {
1498
-            add_option('ee_no_ticket_prices', array(), '', false);
1499
-        }
1500
-    }
1501
-
1502
-
1503
-    /**
1504
-     * plugin_deactivation
1505
-     *
1506
-     * @access public
1507
-     * @static
1508
-     * @return void
1509
-     */
1510
-    public static function plugin_deactivation()
1511
-    {
1512
-    }
1513
-
1514
-
1515
-    /**
1516
-     * Finds all our EE4 custom post types, and deletes them and their associated data
1517
-     * (like post meta or term relations)
1518
-     *
1519
-     * @global wpdb $wpdb
1520
-     * @throws \EE_Error
1521
-     */
1522
-    public static function delete_all_espresso_cpt_data()
1523
-    {
1524
-        global $wpdb;
1525
-        //get all the CPT post_types
1526
-        $ee_post_types = array();
1527
-        foreach (EE_Registry::instance()->non_abstract_db_models as $model_name) {
1528
-            if (method_exists($model_name, 'instance')) {
1529
-                $model_obj = call_user_func(array($model_name, 'instance'));
1530
-                if ($model_obj instanceof EEM_CPT_Base) {
1531
-                    $ee_post_types[] = $wpdb->prepare("%s", $model_obj->post_type());
1532
-                }
1533
-            }
1534
-        }
1535
-        //get all our CPTs
1536
-        $query   = "SELECT ID FROM {$wpdb->posts} WHERE post_type IN (" . implode(",", $ee_post_types) . ")";
1537
-        $cpt_ids = $wpdb->get_col($query);
1538
-        //delete each post meta and term relations too
1539
-        foreach ($cpt_ids as $post_id) {
1540
-            wp_delete_post($post_id, true);
1541
-        }
1542
-    }
1543
-
1544
-    /**
1545
-     * Deletes all EE custom tables
1546
-     *
1547
-     * @return array
1548
-     */
1549
-    public static function drop_espresso_tables()
1550
-    {
1551
-        $tables = array();
1552
-        // load registry
1553
-        foreach (EE_Registry::instance()->non_abstract_db_models as $model_name) {
1554
-            if (method_exists($model_name, 'instance')) {
1555
-                $model_obj = call_user_func(array($model_name, 'instance'));
1556
-                if ($model_obj instanceof EEM_Base) {
1557
-                    foreach ($model_obj->get_tables() as $table) {
1558
-                        if (strpos($table->get_table_name(), 'esp_')
1559
-                            &&
1560
-                            (
1561
-                                is_main_site()//main site? nuke them all
1562
-                                || ! $table->is_global()//not main site,but not global either. nuke it
1563
-                            )
1564
-                        ) {
1565
-                            $tables[$table->get_table_name()] = $table->get_table_name();
1566
-                        }
1567
-                    }
1568
-                }
1569
-            }
1570
-        }
1571
-
1572
-        //there are some tables whose models were removed.
1573
-        //they should be removed when removing all EE core's data
1574
-        $tables_without_models = array(
1575
-            'esp_promotion',
1576
-            'esp_promotion_applied',
1577
-            'esp_promotion_object',
1578
-            'esp_promotion_rule',
1579
-            'esp_rule',
1580
-        );
1581
-        foreach ($tables_without_models as $table) {
1582
-            $tables[$table] = $table;
1583
-        }
1584
-        return \EEH_Activation::getTableManager()->dropTables($tables);
1585
-    }
1586
-
1587
-
1588
-
1589
-    /**
1590
-     * Drops all the tables mentioned in a single MYSQL query. Double-checks
1591
-     * each table name provided has a wpdb prefix attached, and that it exists.
1592
-     * Returns the list actually deleted
1593
-     *
1594
-     * @deprecated in 4.9.13. Instead use TableManager::dropTables()
1595
-     * @global WPDB $wpdb
1596
-     * @param array $table_names
1597
-     * @return array of table names which we deleted
1598
-     */
1599
-    public static function drop_tables($table_names)
1600
-    {
1601
-        return \EEH_Activation::getTableManager()->dropTables($table_names);
1602
-    }
1603
-
1604
-
1605
-
1606
-    /**
1607
-     * plugin_uninstall
1608
-     *
1609
-     * @access public
1610
-     * @static
1611
-     * @param bool $remove_all
1612
-     * @return void
1613
-     */
1614
-    public static function delete_all_espresso_tables_and_data($remove_all = true)
1615
-    {
1616
-        global $wpdb;
1617
-        self::drop_espresso_tables();
1618
-        $wp_options_to_delete = array(
1619
-            'ee_no_ticket_prices'                => true,
1620
-            'ee_active_messengers'               => true,
1621
-            'ee_has_activated_messenger'         => true,
1622
-            'ee_flush_rewrite_rules'             => true,
1623
-            'ee_config'                          => false,
1624
-            'ee_data_migration_current_db_state' => true,
1625
-            'ee_data_migration_mapping_'         => false,
1626
-            'ee_data_migration_script_'          => false,
1627
-            'ee_data_migrations'                 => true,
1628
-            'ee_dms_map'                         => false,
1629
-            'ee_notices'                         => true,
1630
-            'lang_file_check_'                   => false,
1631
-            'ee_maintenance_mode'                => true,
1632
-            'ee_ueip_optin'                      => true,
1633
-            'ee_ueip_has_notified'               => true,
1634
-            'ee_plugin_activation_errors'        => true,
1635
-            'ee_id_mapping_from'                 => false,
1636
-            'espresso_persistent_admin_notices'  => true,
1637
-            'ee_encryption_key'                  => true,
1638
-            'pue_force_upgrade_'                 => false,
1639
-            'pue_json_error_'                    => false,
1640
-            'pue_install_key_'                   => false,
1641
-            'pue_verification_error_'            => false,
1642
-            'pu_dismissed_upgrade_'              => false,
1643
-            'external_updates-'                  => false,
1644
-            'ee_extra_data'                      => true,
1645
-            'ee_ssn_'                            => false,
1646
-            'ee_rss_'                            => false,
1647
-            'ee_rte_n_tx_'                       => false,
1648
-            'ee_pers_admin_notices'              => true,
1649
-            'ee_job_parameters_'                 => false,
1650
-            'ee_upload_directories_incomplete'   => true,
1651
-            'ee_verified_db_collations'          => true,
1652
-        );
1653
-        if (is_main_site()) {
1654
-            $wp_options_to_delete['ee_network_config'] = true;
1655
-        }
1656
-        $undeleted_options = array();
1657
-        foreach ($wp_options_to_delete as $option_name => $no_wildcard) {
1658
-            if ($no_wildcard) {
1659
-                if ( ! delete_option($option_name)) {
1660
-                    $undeleted_options[] = $option_name;
1661
-                }
1662
-            } else {
1663
-                $option_names_to_delete_from_wildcard = $wpdb->get_col("SELECT option_name FROM $wpdb->options WHERE option_name LIKE '%$option_name%'");
1664
-                foreach ($option_names_to_delete_from_wildcard as $option_name_from_wildcard) {
1665
-                    if ( ! delete_option($option_name_from_wildcard)) {
1666
-                        $undeleted_options[] = $option_name_from_wildcard;
1667
-                    }
1668
-                }
1669
-            }
1670
-        }
1671
-        //also, let's make sure the "ee_config_option_names" wp option stays out by removing the action that adds it
1672
-        remove_action('shutdown', array(EE_Config::instance(), 'shutdown'), 10);
1673
-        if ($remove_all && $espresso_db_update = get_option('espresso_db_update')) {
1674
-            $db_update_sans_ee4 = array();
1675
-            foreach ($espresso_db_update as $version => $times_activated) {
1676
-                if ((string)$version[0] === '3') {//if its NON EE4
1677
-                    $db_update_sans_ee4[$version] = $times_activated;
1678
-                }
1679
-            }
1680
-            update_option('espresso_db_update', $db_update_sans_ee4);
1681
-        }
1682
-        $errors = '';
1683
-        if ( ! empty($undeleted_options)) {
1684
-            $errors .= sprintf(
1685
-                __('The following wp-options could not be deleted: %s%s', 'event_espresso'),
1686
-                '<br/>',
1687
-                implode(',<br/>', $undeleted_options)
1688
-            );
1689
-        }
1690
-        if ( ! empty($errors)) {
1691
-            EE_Error::add_attention($errors, __FILE__, __FUNCTION__, __LINE__);
1692
-        }
1693
-    }
1694
-
1695
-    /**
1696
-     * Gets the mysql error code from the last used query by wpdb
1697
-     *
1698
-     * @return int mysql error code, see https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html
1699
-     */
1700
-    public static function last_wpdb_error_code()
1701
-    {
1702
-        global $wpdb;
1703
-        if ($wpdb->use_mysqli) {
1704
-            return mysqli_errno($wpdb->dbh);
1705
-        } else {
1706
-            return mysql_errno($wpdb->dbh);
1707
-        }
1708
-    }
1709
-
1710
-    /**
1711
-     * Checks that the database table exists. Also works on temporary tables (for unit tests mostly).
1712
-     *
1713
-     * @global wpdb  $wpdb
1714
-     * @deprecated instead use TableAnalysis::tableExists()
1715
-     * @param string $table_name with or without $wpdb->prefix
1716
-     * @return boolean
1717
-     */
1718
-    public static function table_exists($table_name)
1719
-    {
1720
-        return \EEH_Activation::getTableAnalysis()->tableExists($table_name);
1721
-    }
1722
-
1723
-    /**
1724
-     * Resets the cache on EEH_Activation
1725
-     */
1726
-    public static function reset()
1727
-    {
1728
-        self::$_default_creator_id                             = null;
1729
-        self::$_initialized_db_content_already_in_this_request = false;
1730
-    }
1300
+		$new_templates_created_for_messenger = self::_activate_and_generate_default_messengers_and_message_templates(
1301
+			$message_resource_manager
1302
+		);
1303
+		/**
1304
+		 * This method is verifying there are no NEW default message types
1305
+		 * for ACTIVE messengers that need activated (and corresponding templates setup).
1306
+		 */
1307
+		$new_templates_created_for_message_type = self::_activate_new_message_types_for_active_messengers_and_generate_default_templates(
1308
+			$message_resource_manager
1309
+		);
1310
+		//after all is done, let's persist these changes to the db.
1311
+		$message_resource_manager->update_has_activated_messengers_option();
1312
+		$message_resource_manager->update_active_messengers_option();
1313
+		// will return true if either of these are true.  Otherwise will return false.
1314
+		return $new_templates_created_for_message_type || $new_templates_created_for_messenger;
1315
+	}
1316
+
1317
+
1318
+
1319
+	/**
1320
+	 * @param \EE_Message_Resource_Manager $message_resource_manager
1321
+	 * @return array|bool
1322
+	 * @throws \EE_Error
1323
+	 */
1324
+	protected static function _activate_new_message_types_for_active_messengers_and_generate_default_templates(
1325
+		EE_Message_Resource_Manager $message_resource_manager
1326
+	) {
1327
+		/** @type EE_messenger[] $active_messengers */
1328
+		$active_messengers = $message_resource_manager->active_messengers();
1329
+		$installed_message_types = $message_resource_manager->installed_message_types();
1330
+		$templates_created = false;
1331
+		foreach ($active_messengers as $active_messenger) {
1332
+			$default_message_type_names_for_messenger = $active_messenger->get_default_message_types();
1333
+			$default_message_type_names_to_activate = array();
1334
+			// looping through each default message type reported by the messenger
1335
+			// and setup the actual message types to activate.
1336
+			foreach ($default_message_type_names_for_messenger as $default_message_type_name_for_messenger) {
1337
+				// if already active or has already been activated before we skip
1338
+				// (otherwise we might reactivate something user's intentionally deactivated.)
1339
+				// we also skip if the message type is not installed.
1340
+				if (
1341
+					$message_resource_manager->has_message_type_been_activated_for_messenger(
1342
+						$default_message_type_name_for_messenger,
1343
+						$active_messenger->name
1344
+					)
1345
+					|| $message_resource_manager->is_message_type_active_for_messenger(
1346
+						$active_messenger->name,
1347
+						$default_message_type_name_for_messenger
1348
+					)
1349
+					|| ! isset($installed_message_types[$default_message_type_name_for_messenger])
1350
+				) {
1351
+					continue;
1352
+				}
1353
+				$default_message_type_names_to_activate[] = $default_message_type_name_for_messenger;
1354
+			}
1355
+			//let's activate!
1356
+			$message_resource_manager->ensure_message_types_are_active(
1357
+				$default_message_type_names_to_activate,
1358
+				$active_messenger->name,
1359
+				false
1360
+			);
1361
+			//activate the templates for these message types
1362
+			if ( ! empty($default_message_type_names_to_activate)) {
1363
+				$templates_created = EEH_MSG_Template::generate_new_templates(
1364
+					$active_messenger->name,
1365
+					$default_message_type_names_for_messenger,
1366
+					'',
1367
+					true
1368
+				);
1369
+			}
1370
+		}
1371
+		return $templates_created;
1372
+	}
1373
+
1374
+
1375
+
1376
+	/**
1377
+	 * This will activate and generate default messengers and default message types for those messengers.
1378
+	 *
1379
+	 * @param EE_message_Resource_Manager $message_resource_manager
1380
+	 * @return array|bool  True means there were default messengers and message type templates generated.
1381
+	 *                     False means that there were no templates generated
1382
+	 *                     (which could simply mean there are no default message types for a messenger).
1383
+	 * @throws EE_Error
1384
+	 */
1385
+	protected static function _activate_and_generate_default_messengers_and_message_templates(
1386
+		EE_Message_Resource_Manager $message_resource_manager
1387
+	) {
1388
+		/** @type EE_messenger[] $messengers_to_generate */
1389
+		$messengers_to_generate = self::_get_default_messengers_to_generate_on_activation($message_resource_manager);
1390
+		$installed_message_types = $message_resource_manager->installed_message_types();
1391
+		$templates_generated = false;
1392
+		foreach ($messengers_to_generate as $messenger_to_generate) {
1393
+			$default_message_type_names_for_messenger = $messenger_to_generate->get_default_message_types();
1394
+			//verify the default message types match an installed message type.
1395
+			foreach ($default_message_type_names_for_messenger as $key => $name) {
1396
+				if (
1397
+					! isset($installed_message_types[$name])
1398
+					|| $message_resource_manager->has_message_type_been_activated_for_messenger(
1399
+						$name,
1400
+						$messenger_to_generate->name
1401
+					)
1402
+				) {
1403
+					unset($default_message_type_names_for_messenger[$key]);
1404
+				}
1405
+			}
1406
+			// in previous iterations, the active_messengers option in the db
1407
+			// needed updated before calling create templates. however with the changes this may not be necessary.
1408
+			// This comment is left here just in case we discover that we _do_ need to update before
1409
+			// passing off to create templates (after the refactor is done).
1410
+			// @todo remove this comment when determined not necessary.
1411
+			$message_resource_manager->activate_messenger(
1412
+				$messenger_to_generate->name,
1413
+				$default_message_type_names_for_messenger,
1414
+				false
1415
+			);
1416
+			//create any templates needing created (or will reactivate templates already generated as necessary).
1417
+			if ( ! empty($default_message_type_names_for_messenger)) {
1418
+				$templates_generated = EEH_MSG_Template::generate_new_templates(
1419
+					$messenger_to_generate->name,
1420
+					$default_message_type_names_for_messenger,
1421
+					'',
1422
+					true
1423
+				);
1424
+			}
1425
+		}
1426
+		return $templates_generated;
1427
+	}
1428
+
1429
+
1430
+	/**
1431
+	 * This returns the default messengers to generate templates for on activation of EE.
1432
+	 * It considers:
1433
+	 * - whether a messenger is already active in the db.
1434
+	 * - whether a messenger has been made active at any time in the past.
1435
+	 *
1436
+	 * @static
1437
+	 * @param  EE_Message_Resource_Manager $message_resource_manager
1438
+	 * @return EE_messenger[]
1439
+	 */
1440
+	protected static function _get_default_messengers_to_generate_on_activation(
1441
+		EE_Message_Resource_Manager $message_resource_manager
1442
+	) {
1443
+		$active_messengers    = $message_resource_manager->active_messengers();
1444
+		$installed_messengers = $message_resource_manager->installed_messengers();
1445
+		$has_activated        = $message_resource_manager->get_has_activated_messengers_option();
1446
+
1447
+		$messengers_to_generate = array();
1448
+		foreach ($installed_messengers as $installed_messenger) {
1449
+			//if installed messenger is a messenger that should be activated on install
1450
+			//and is not already active
1451
+			//and has never been activated
1452
+			if (
1453
+				! $installed_messenger->activate_on_install
1454
+				|| isset($active_messengers[$installed_messenger->name])
1455
+				|| isset($has_activated[$installed_messenger->name])
1456
+			) {
1457
+				continue;
1458
+			}
1459
+			$messengers_to_generate[$installed_messenger->name] = $installed_messenger;
1460
+		}
1461
+		return $messengers_to_generate;
1462
+	}
1463
+
1464
+
1465
+	/**
1466
+	 * This simply validates active message types to ensure they actually match installed
1467
+	 * message types.  If there's a mismatch then we deactivate the message type and ensure all related db
1468
+	 * rows are set inactive.
1469
+	 * Note: Messengers are no longer validated here as of 4.9.0 because they get validated automatically whenever
1470
+	 * EE_Messenger_Resource_Manager is constructed.  Message Types are a bit more resource heavy for validation so they
1471
+	 * are still handled in here.
1472
+	 *
1473
+	 * @since 4.3.1
1474
+	 * @return void
1475
+	 */
1476
+	public static function validate_messages_system()
1477
+	{
1478
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
1479
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1480
+		$message_resource_manager->validate_active_message_types_are_installed();
1481
+		do_action('AHEE__EEH_Activation__validate_messages_system');
1482
+	}
1483
+
1484
+
1485
+	/**
1486
+	 * create_no_ticket_prices_array
1487
+	 *
1488
+	 * @access public
1489
+	 * @static
1490
+	 * @return void
1491
+	 */
1492
+	public static function create_no_ticket_prices_array()
1493
+	{
1494
+		// this creates an array for tracking events that have no active ticket prices created
1495
+		// this allows us to warn admins of the situation so that it can be corrected
1496
+		$espresso_no_ticket_prices = get_option('ee_no_ticket_prices', false);
1497
+		if (! $espresso_no_ticket_prices) {
1498
+			add_option('ee_no_ticket_prices', array(), '', false);
1499
+		}
1500
+	}
1501
+
1502
+
1503
+	/**
1504
+	 * plugin_deactivation
1505
+	 *
1506
+	 * @access public
1507
+	 * @static
1508
+	 * @return void
1509
+	 */
1510
+	public static function plugin_deactivation()
1511
+	{
1512
+	}
1513
+
1514
+
1515
+	/**
1516
+	 * Finds all our EE4 custom post types, and deletes them and their associated data
1517
+	 * (like post meta or term relations)
1518
+	 *
1519
+	 * @global wpdb $wpdb
1520
+	 * @throws \EE_Error
1521
+	 */
1522
+	public static function delete_all_espresso_cpt_data()
1523
+	{
1524
+		global $wpdb;
1525
+		//get all the CPT post_types
1526
+		$ee_post_types = array();
1527
+		foreach (EE_Registry::instance()->non_abstract_db_models as $model_name) {
1528
+			if (method_exists($model_name, 'instance')) {
1529
+				$model_obj = call_user_func(array($model_name, 'instance'));
1530
+				if ($model_obj instanceof EEM_CPT_Base) {
1531
+					$ee_post_types[] = $wpdb->prepare("%s", $model_obj->post_type());
1532
+				}
1533
+			}
1534
+		}
1535
+		//get all our CPTs
1536
+		$query   = "SELECT ID FROM {$wpdb->posts} WHERE post_type IN (" . implode(",", $ee_post_types) . ")";
1537
+		$cpt_ids = $wpdb->get_col($query);
1538
+		//delete each post meta and term relations too
1539
+		foreach ($cpt_ids as $post_id) {
1540
+			wp_delete_post($post_id, true);
1541
+		}
1542
+	}
1543
+
1544
+	/**
1545
+	 * Deletes all EE custom tables
1546
+	 *
1547
+	 * @return array
1548
+	 */
1549
+	public static function drop_espresso_tables()
1550
+	{
1551
+		$tables = array();
1552
+		// load registry
1553
+		foreach (EE_Registry::instance()->non_abstract_db_models as $model_name) {
1554
+			if (method_exists($model_name, 'instance')) {
1555
+				$model_obj = call_user_func(array($model_name, 'instance'));
1556
+				if ($model_obj instanceof EEM_Base) {
1557
+					foreach ($model_obj->get_tables() as $table) {
1558
+						if (strpos($table->get_table_name(), 'esp_')
1559
+							&&
1560
+							(
1561
+								is_main_site()//main site? nuke them all
1562
+								|| ! $table->is_global()//not main site,but not global either. nuke it
1563
+							)
1564
+						) {
1565
+							$tables[$table->get_table_name()] = $table->get_table_name();
1566
+						}
1567
+					}
1568
+				}
1569
+			}
1570
+		}
1571
+
1572
+		//there are some tables whose models were removed.
1573
+		//they should be removed when removing all EE core's data
1574
+		$tables_without_models = array(
1575
+			'esp_promotion',
1576
+			'esp_promotion_applied',
1577
+			'esp_promotion_object',
1578
+			'esp_promotion_rule',
1579
+			'esp_rule',
1580
+		);
1581
+		foreach ($tables_without_models as $table) {
1582
+			$tables[$table] = $table;
1583
+		}
1584
+		return \EEH_Activation::getTableManager()->dropTables($tables);
1585
+	}
1586
+
1587
+
1588
+
1589
+	/**
1590
+	 * Drops all the tables mentioned in a single MYSQL query. Double-checks
1591
+	 * each table name provided has a wpdb prefix attached, and that it exists.
1592
+	 * Returns the list actually deleted
1593
+	 *
1594
+	 * @deprecated in 4.9.13. Instead use TableManager::dropTables()
1595
+	 * @global WPDB $wpdb
1596
+	 * @param array $table_names
1597
+	 * @return array of table names which we deleted
1598
+	 */
1599
+	public static function drop_tables($table_names)
1600
+	{
1601
+		return \EEH_Activation::getTableManager()->dropTables($table_names);
1602
+	}
1603
+
1604
+
1605
+
1606
+	/**
1607
+	 * plugin_uninstall
1608
+	 *
1609
+	 * @access public
1610
+	 * @static
1611
+	 * @param bool $remove_all
1612
+	 * @return void
1613
+	 */
1614
+	public static function delete_all_espresso_tables_and_data($remove_all = true)
1615
+	{
1616
+		global $wpdb;
1617
+		self::drop_espresso_tables();
1618
+		$wp_options_to_delete = array(
1619
+			'ee_no_ticket_prices'                => true,
1620
+			'ee_active_messengers'               => true,
1621
+			'ee_has_activated_messenger'         => true,
1622
+			'ee_flush_rewrite_rules'             => true,
1623
+			'ee_config'                          => false,
1624
+			'ee_data_migration_current_db_state' => true,
1625
+			'ee_data_migration_mapping_'         => false,
1626
+			'ee_data_migration_script_'          => false,
1627
+			'ee_data_migrations'                 => true,
1628
+			'ee_dms_map'                         => false,
1629
+			'ee_notices'                         => true,
1630
+			'lang_file_check_'                   => false,
1631
+			'ee_maintenance_mode'                => true,
1632
+			'ee_ueip_optin'                      => true,
1633
+			'ee_ueip_has_notified'               => true,
1634
+			'ee_plugin_activation_errors'        => true,
1635
+			'ee_id_mapping_from'                 => false,
1636
+			'espresso_persistent_admin_notices'  => true,
1637
+			'ee_encryption_key'                  => true,
1638
+			'pue_force_upgrade_'                 => false,
1639
+			'pue_json_error_'                    => false,
1640
+			'pue_install_key_'                   => false,
1641
+			'pue_verification_error_'            => false,
1642
+			'pu_dismissed_upgrade_'              => false,
1643
+			'external_updates-'                  => false,
1644
+			'ee_extra_data'                      => true,
1645
+			'ee_ssn_'                            => false,
1646
+			'ee_rss_'                            => false,
1647
+			'ee_rte_n_tx_'                       => false,
1648
+			'ee_pers_admin_notices'              => true,
1649
+			'ee_job_parameters_'                 => false,
1650
+			'ee_upload_directories_incomplete'   => true,
1651
+			'ee_verified_db_collations'          => true,
1652
+		);
1653
+		if (is_main_site()) {
1654
+			$wp_options_to_delete['ee_network_config'] = true;
1655
+		}
1656
+		$undeleted_options = array();
1657
+		foreach ($wp_options_to_delete as $option_name => $no_wildcard) {
1658
+			if ($no_wildcard) {
1659
+				if ( ! delete_option($option_name)) {
1660
+					$undeleted_options[] = $option_name;
1661
+				}
1662
+			} else {
1663
+				$option_names_to_delete_from_wildcard = $wpdb->get_col("SELECT option_name FROM $wpdb->options WHERE option_name LIKE '%$option_name%'");
1664
+				foreach ($option_names_to_delete_from_wildcard as $option_name_from_wildcard) {
1665
+					if ( ! delete_option($option_name_from_wildcard)) {
1666
+						$undeleted_options[] = $option_name_from_wildcard;
1667
+					}
1668
+				}
1669
+			}
1670
+		}
1671
+		//also, let's make sure the "ee_config_option_names" wp option stays out by removing the action that adds it
1672
+		remove_action('shutdown', array(EE_Config::instance(), 'shutdown'), 10);
1673
+		if ($remove_all && $espresso_db_update = get_option('espresso_db_update')) {
1674
+			$db_update_sans_ee4 = array();
1675
+			foreach ($espresso_db_update as $version => $times_activated) {
1676
+				if ((string)$version[0] === '3') {//if its NON EE4
1677
+					$db_update_sans_ee4[$version] = $times_activated;
1678
+				}
1679
+			}
1680
+			update_option('espresso_db_update', $db_update_sans_ee4);
1681
+		}
1682
+		$errors = '';
1683
+		if ( ! empty($undeleted_options)) {
1684
+			$errors .= sprintf(
1685
+				__('The following wp-options could not be deleted: %s%s', 'event_espresso'),
1686
+				'<br/>',
1687
+				implode(',<br/>', $undeleted_options)
1688
+			);
1689
+		}
1690
+		if ( ! empty($errors)) {
1691
+			EE_Error::add_attention($errors, __FILE__, __FUNCTION__, __LINE__);
1692
+		}
1693
+	}
1694
+
1695
+	/**
1696
+	 * Gets the mysql error code from the last used query by wpdb
1697
+	 *
1698
+	 * @return int mysql error code, see https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html
1699
+	 */
1700
+	public static function last_wpdb_error_code()
1701
+	{
1702
+		global $wpdb;
1703
+		if ($wpdb->use_mysqli) {
1704
+			return mysqli_errno($wpdb->dbh);
1705
+		} else {
1706
+			return mysql_errno($wpdb->dbh);
1707
+		}
1708
+	}
1709
+
1710
+	/**
1711
+	 * Checks that the database table exists. Also works on temporary tables (for unit tests mostly).
1712
+	 *
1713
+	 * @global wpdb  $wpdb
1714
+	 * @deprecated instead use TableAnalysis::tableExists()
1715
+	 * @param string $table_name with or without $wpdb->prefix
1716
+	 * @return boolean
1717
+	 */
1718
+	public static function table_exists($table_name)
1719
+	{
1720
+		return \EEH_Activation::getTableAnalysis()->tableExists($table_name);
1721
+	}
1722
+
1723
+	/**
1724
+	 * Resets the cache on EEH_Activation
1725
+	 */
1726
+	public static function reset()
1727
+	{
1728
+		self::$_default_creator_id                             = null;
1729
+		self::$_initialized_db_content_already_in_this_request = false;
1730
+	}
1731 1731
 }
1732 1732
 // End of file EEH_Activation.helper.php
1733 1733
 // Location: /helpers/EEH_Activation.core.php
Please login to merge, or discard this patch.
admin_pages/registrations/Registrations_Admin_Page.core.php 2 patches
Spacing   +85 added lines, -85 removed lines patch added patch discarded remove patch
@@ -69,7 +69,7 @@  discard block
 block discarded – undo
69 69
         // when adding a new registration...
70 70
         if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71 71
             EE_System::do_not_cache();
72
-            if (! isset($this->_req_data['processing_registration'])
72
+            if ( ! isset($this->_req_data['processing_registration'])
73 73
                  || absint($this->_req_data['processing_registration']) !== 1
74 74
             ) {
75 75
                 // and it's NOT the attendee information reg step
@@ -577,7 +577,7 @@  discard block
 block discarded – undo
577 577
         //style
578 578
         wp_register_style(
579 579
             'espresso_reg',
580
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
580
+            REG_ASSETS_URL.'espresso_registrations_admin.css',
581 581
             array('ee-admin-css'),
582 582
             EVENT_ESPRESSO_VERSION
583 583
         );
@@ -585,7 +585,7 @@  discard block
 block discarded – undo
585 585
         //script
586 586
         wp_register_script(
587 587
             'espresso_reg',
588
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
588
+            REG_ASSETS_URL.'espresso_registrations_admin.js',
589 589
             array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
590 590
             EVENT_ESPRESSO_VERSION,
591 591
             true
@@ -623,7 +623,7 @@  discard block
 block discarded – undo
623 623
         wp_deregister_style('espresso_reg');
624 624
         wp_register_style(
625 625
             'espresso_att',
626
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
626
+            REG_ASSETS_URL.'espresso_attendees_admin.css',
627 627
             array('ee-admin-css'),
628 628
             EVENT_ESPRESSO_VERSION
629 629
         );
@@ -635,7 +635,7 @@  discard block
 block discarded – undo
635 635
     {
636 636
         wp_register_script(
637 637
             'ee-spco-for-admin',
638
-            REG_ASSETS_URL . 'spco_for_admin.js',
638
+            REG_ASSETS_URL.'spco_for_admin.js',
639 639
             array('underscore', 'jquery'),
640 640
             EVENT_ESPRESSO_VERSION,
641 641
             true
@@ -768,7 +768,7 @@  discard block
 block discarded – undo
768 768
                     'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
769 769
                 ),
770 770
             );
771
-            $this->_views['trash']      = array(
771
+            $this->_views['trash'] = array(
772 772
                 'slug'        => 'trash',
773 773
                 'label'       => esc_html__('Trash', 'event_espresso'),
774 774
                 'count'       => 0,
@@ -857,7 +857,7 @@  discard block
 block discarded – undo
857 857
         }
858 858
         $sc_items = array(
859 859
             'approved_status'   => array(
860
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
860
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
861 861
                 'desc'  => EEH_Template::pretty_status(
862 862
                     EEM_Registration::status_id_approved,
863 863
                     false,
@@ -865,7 +865,7 @@  discard block
 block discarded – undo
865 865
                 ),
866 866
             ),
867 867
             'pending_status'    => array(
868
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
868
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
869 869
                 'desc'  => EEH_Template::pretty_status(
870 870
                     EEM_Registration::status_id_pending_payment,
871 871
                     false,
@@ -873,7 +873,7 @@  discard block
 block discarded – undo
873 873
                 ),
874 874
             ),
875 875
             'wait_list'         => array(
876
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
876
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
877 877
                 'desc'  => EEH_Template::pretty_status(
878 878
                     EEM_Registration::status_id_wait_list,
879 879
                     false,
@@ -881,7 +881,7 @@  discard block
 block discarded – undo
881 881
                 ),
882 882
             ),
883 883
             'incomplete_status' => array(
884
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
884
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_incomplete,
885 885
                 'desc'  => EEH_Template::pretty_status(
886 886
                     EEM_Registration::status_id_incomplete,
887 887
                     false,
@@ -889,7 +889,7 @@  discard block
 block discarded – undo
889 889
                 ),
890 890
             ),
891 891
             'not_approved'      => array(
892
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
892
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
893 893
                 'desc'  => EEH_Template::pretty_status(
894 894
                     EEM_Registration::status_id_not_approved,
895 895
                     false,
@@ -897,7 +897,7 @@  discard block
 block discarded – undo
897 897
                 ),
898 898
             ),
899 899
             'declined_status'   => array(
900
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
900
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
901 901
                 'desc'  => EEH_Template::pretty_status(
902 902
                     EEM_Registration::status_id_declined,
903 903
                     false,
@@ -905,7 +905,7 @@  discard block
 block discarded – undo
905 905
                 ),
906 906
             ),
907 907
             'cancelled_status'  => array(
908
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
908
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
909 909
                 'desc'  => EEH_Template::pretty_status(
910 910
                     EEM_Registration::status_id_cancelled,
911 911
                     false,
@@ -934,7 +934,7 @@  discard block
 block discarded – undo
934 934
                 'espresso_registrations_new_registration',
935 935
                 $EVT_ID
936 936
             )) {
937
-                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
937
+                $this->_admin_page_title .= ' '.$this->get_action_link_or_button(
938 938
                     'new_registration',
939 939
                     'add-registrant',
940 940
                     array('event_id' => $EVT_ID),
@@ -974,7 +974,7 @@  discard block
 block discarded – undo
974 974
                 $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
975 975
                 $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
976 976
                 $this->_template_args['admin_page_header'] .= $datetime->name();
977
-                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
977
+                $this->_template_args['admin_page_header'] .= ' ( '.$datetime->start_date().' )';
978 978
                 $this->_template_args['admin_page_header'] .= '</span></h3>';
979 979
             }
980 980
         }
@@ -1074,7 +1074,7 @@  discard block
 block discarded – undo
1074 1074
             'caps'                     => EEM_Registration::caps_read_admin,
1075 1075
             'default_where_conditions' => 'this_model_only',
1076 1076
         );
1077
-        if (! $count) {
1077
+        if ( ! $count) {
1078 1078
             $query_params = array_merge(
1079 1079
                 $query_params,
1080 1080
                 $this->_get_orderby_for_registrations_query(),
@@ -1095,7 +1095,7 @@  discard block
 block discarded – undo
1095 1095
     protected function _add_event_id_to_where_conditions(array $request)
1096 1096
     {
1097 1097
         $where = array();
1098
-        if (! empty($request['event_id'])) {
1098
+        if ( ! empty($request['event_id'])) {
1099 1099
             $where['EVT_ID'] = absint($request['event_id']);
1100 1100
         }
1101 1101
         return $where;
@@ -1111,7 +1111,7 @@  discard block
 block discarded – undo
1111 1111
     protected function _add_category_id_to_where_conditions(array $request)
1112 1112
     {
1113 1113
         $where = array();
1114
-        if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1114
+        if ( ! empty($request['EVT_CAT']) && (int) $request['EVT_CAT'] !== -1) {
1115 1115
             $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1116 1116
         }
1117 1117
         return $where;
@@ -1127,10 +1127,10 @@  discard block
 block discarded – undo
1127 1127
     protected function _add_datetime_id_to_where_conditions(array $request)
1128 1128
     {
1129 1129
         $where = array();
1130
-        if (! empty($request['datetime_id'])) {
1130
+        if ( ! empty($request['datetime_id'])) {
1131 1131
             $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1132 1132
         }
1133
-        if (! empty($request['DTT_ID'])) {
1133
+        if ( ! empty($request['DTT_ID'])) {
1134 1134
             $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1135 1135
         }
1136 1136
         return $where;
@@ -1156,7 +1156,7 @@  discard block
 block discarded – undo
1156 1156
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1157 1157
          * UNLESS viewing trashed registrations.
1158 1158
          */
1159
-        if (! empty($registration_status)) {
1159
+        if ( ! empty($registration_status)) {
1160 1160
             $where['STS_ID'] = $registration_status;
1161 1161
         } else {
1162 1162
             //make sure we exclude incomplete registrations, but only if not trashed.
@@ -1196,12 +1196,12 @@  discard block
 block discarded – undo
1196 1196
                 array(
1197 1197
                     EEM_Registration::instance()->convert_datetime_for_query(
1198 1198
                         'REG_date',
1199
-                        $now . ' 00:00:00',
1199
+                        $now.' 00:00:00',
1200 1200
                         'Y-m-d H:i:s'
1201 1201
                     ),
1202 1202
                     EEM_Registration::instance()->convert_datetime_for_query(
1203 1203
                         'REG_date',
1204
-                        $now . ' 23:59:59',
1204
+                        $now.' 23:59:59',
1205 1205
                         'Y-m-d H:i:s'
1206 1206
                     ),
1207 1207
                 ),
@@ -1214,12 +1214,12 @@  discard block
 block discarded – undo
1214 1214
                 array(
1215 1215
                     EEM_Registration::instance()->convert_datetime_for_query(
1216 1216
                         'REG_date',
1217
-                        $current_year_and_month . '-01 00:00:00',
1217
+                        $current_year_and_month.'-01 00:00:00',
1218 1218
                         'Y-m-d H:i:s'
1219 1219
                     ),
1220 1220
                     EEM_Registration::instance()->convert_datetime_for_query(
1221 1221
                         'REG_date',
1222
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1222
+                        $current_year_and_month.'-'.$days_this_month.' 23:59:59',
1223 1223
                         'Y-m-d H:i:s'
1224 1224
                     ),
1225 1225
                 ),
@@ -1234,18 +1234,18 @@  discard block
 block discarded – undo
1234 1234
                 : '';
1235 1235
             //if there is not a month or year then we can't go further
1236 1236
             if ($month_requested && $year_requested) {
1237
-                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1237
+                $days_in_month     = date('t', strtotime($year_requested.'-'.$month_requested.'-'.'01'));
1238 1238
                 $where['REG_date'] = array(
1239 1239
                     'BETWEEN',
1240 1240
                     array(
1241 1241
                         EEM_Registration::instance()->convert_datetime_for_query(
1242 1242
                             'REG_date',
1243
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1243
+                            $year_requested.'-'.$month_requested.'-01 00:00:00',
1244 1244
                             'Y-m-d H:i:s'
1245 1245
                         ),
1246 1246
                         EEM_Registration::instance()->convert_datetime_for_query(
1247 1247
                             'REG_date',
1248
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1248
+                            $year_requested.'-'.$month_requested.'-'.$days_in_month.' 23:59:59',
1249 1249
                             'Y-m-d H:i:s'
1250 1250
                         ),
1251 1251
                     ),
@@ -1265,8 +1265,8 @@  discard block
 block discarded – undo
1265 1265
     protected function _add_search_to_where_conditions(array $request)
1266 1266
     {
1267 1267
         $where = array();
1268
-        if (! empty($request['s'])) {
1269
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1268
+        if ( ! empty($request['s'])) {
1269
+            $search_string = '%'.sanitize_text_field($request['s']).'%';
1270 1270
             $where['OR*search_conditions'] = array(
1271 1271
                 'Event.EVT_name'                          => array('LIKE', $search_string),
1272 1272
                 'Event.EVT_desc'                          => array('LIKE', $search_string),
@@ -1379,7 +1379,7 @@  discard block
 block discarded – undo
1379 1379
             : $per_page;
1380 1380
 
1381 1381
         //-1 means return all results so get out if that's set.
1382
-        if ((int)$per_page === -1) {
1382
+        if ((int) $per_page === -1) {
1383 1383
             return array();
1384 1384
         }
1385 1385
         $per_page = absint($per_page);
@@ -1432,7 +1432,7 @@  discard block
 block discarded – undo
1432 1432
                 ),
1433 1433
                 REG_ADMIN_URL
1434 1434
             );
1435
-            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1435
+            $this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(
1436 1436
                 array(
1437 1437
                     'action' => 'default',
1438 1438
                     'EVT_ID' => $event_id,
@@ -1440,7 +1440,7 @@  discard block
 block discarded – undo
1440 1440
                 ),
1441 1441
                 admin_url('admin.php')
1442 1442
             );
1443
-            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1443
+            $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(
1444 1444
                 array(
1445 1445
                     'page'   => 'espresso_events',
1446 1446
                     'action' => 'edit',
@@ -1449,12 +1449,12 @@  discard block
 block discarded – undo
1449 1449
                 admin_url('admin.php')
1450 1450
             );
1451 1451
             //next and previous links
1452
-            $next_reg                                      = $this->_registration->next(
1452
+            $next_reg = $this->_registration->next(
1453 1453
                 null,
1454 1454
                 array(),
1455 1455
                 'REG_ID'
1456 1456
             );
1457
-            $this->_template_args['next_registration']     = $next_reg
1457
+            $this->_template_args['next_registration'] = $next_reg
1458 1458
                 ? $this->_next_link(
1459 1459
                     EE_Admin_Page::add_query_args_and_nonce(
1460 1460
                         array(
@@ -1466,7 +1466,7 @@  discard block
 block discarded – undo
1466 1466
                     'dashicons dashicons-arrow-right ee-icon-size-22'
1467 1467
                 )
1468 1468
                 : '';
1469
-            $previous_reg                                  = $this->_registration->previous(
1469
+            $previous_reg = $this->_registration->previous(
1470 1470
                 null,
1471 1471
                 array(),
1472 1472
                 'REG_ID'
@@ -1484,7 +1484,7 @@  discard block
 block discarded – undo
1484 1484
                 )
1485 1485
                 : '';
1486 1486
             // grab header
1487
-            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1487
+            $template_path                             = REG_TEMPLATE_PATH.'reg_admin_details_header.template.php';
1488 1488
             $this->_template_args['REG_ID']            = $this->_registration->ID();
1489 1489
             $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1490 1490
                 $template_path,
@@ -1599,7 +1599,7 @@  discard block
 block discarded – undo
1599 1599
                             EEH_HTML::strong(
1600 1600
                                 $this->_registration->pretty_status(),
1601 1601
                                 '',
1602
-                                'status-' . $this->_registration->status_ID(),
1602
+                                'status-'.$this->_registration->status_ID(),
1603 1603
                                 'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1604 1604
                             )
1605 1605
                         )
@@ -1669,9 +1669,9 @@  discard block
 block discarded – undo
1669 1669
     {
1670 1670
         if (isset($this->_req_data['reg_status_change_form'])) {
1671 1671
             $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1672
-                ? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1672
+                ? (array) $this->_req_data['reg_status_change_form']['REG_ID'] : array();
1673 1673
         } else {
1674
-            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1674
+            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array) $this->_req_data['_REG_ID'] : array();
1675 1675
         }
1676 1676
         $success = $this->_set_registration_status($REG_IDs, $status);
1677 1677
         //notify?
@@ -1703,7 +1703,7 @@  discard block
 block discarded – undo
1703 1703
     {
1704 1704
         $success = false;
1705 1705
         // typecast $REG_IDs
1706
-        $REG_IDs = (array)$REG_IDs;
1706
+        $REG_IDs = (array) $REG_IDs;
1707 1707
         if ( ! empty($REG_IDs)) {
1708 1708
             $success = true;
1709 1709
             // set default status if none is passed
@@ -1933,7 +1933,7 @@  discard block
 block discarded – undo
1933 1933
             $filtered_line_item_tree,
1934 1934
             array('EE_Registration' => $this->_registration)
1935 1935
         );
1936
-        $attendee                                = $this->_registration->attendee();
1936
+        $attendee = $this->_registration->attendee();
1937 1937
         if (EE_Registry::instance()->CAP->current_user_can(
1938 1938
             'ee_read_transaction',
1939 1939
             'espresso_transactions_view_transaction'
@@ -2012,7 +2012,7 @@  discard block
 block discarded – undo
2012 2012
                 'Payment method response',
2013 2013
                 'event_espresso'
2014 2014
             );
2015
-            $this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2015
+            $this->_template_args['reg_details']['response_msg']['class'] = 'regular-text';
2016 2016
         }
2017 2017
         $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2018 2018
         $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
@@ -2040,7 +2040,7 @@  discard block
 block discarded – undo
2040 2040
         $this->_template_args['REG_ID']                                       = $this->_registration->ID();
2041 2041
         $this->_template_args['event_id']                                     = $this->_registration->event_ID();
2042 2042
         $template_path                                                        =
2043
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2043
+            REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_details.template.php';
2044 2044
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2045 2045
     }
2046 2046
 
@@ -2069,7 +2069,7 @@  discard block
 block discarded – undo
2069 2069
             $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2070 2070
             $this->_template_args['REG_ID']                    = $this->_registration->ID();
2071 2071
             $template_path                                     =
2072
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2072
+                REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_questions.template.php';
2073 2073
             echo EEH_Template::display_template($template_path, $this->_template_args, true);
2074 2074
         }
2075 2075
     }
@@ -2086,7 +2086,7 @@  discard block
 block discarded – undo
2086 2086
     public function form_before_question_group($output)
2087 2087
     {
2088 2088
         EE_Error::doing_it_wrong(
2089
-            __CLASS__ . '::' . __FUNCTION__,
2089
+            __CLASS__.'::'.__FUNCTION__,
2090 2090
             esc_html__(
2091 2091
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2092 2092
                 'event_espresso'
@@ -2111,7 +2111,7 @@  discard block
 block discarded – undo
2111 2111
     public function form_after_question_group($output)
2112 2112
     {
2113 2113
         EE_Error::doing_it_wrong(
2114
-            __CLASS__ . '::' . __FUNCTION__,
2114
+            __CLASS__.'::'.__FUNCTION__,
2115 2115
             esc_html__(
2116 2116
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2117 2117
                 'event_espresso'
@@ -2149,7 +2149,7 @@  discard block
 block discarded – undo
2149 2149
     public function form_form_field_label_wrap($label)
2150 2150
     {
2151 2151
         EE_Error::doing_it_wrong(
2152
-            __CLASS__ . '::' . __FUNCTION__,
2152
+            __CLASS__.'::'.__FUNCTION__,
2153 2153
             esc_html__(
2154 2154
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2155 2155
                 'event_espresso'
@@ -2159,7 +2159,7 @@  discard block
 block discarded – undo
2159 2159
         return '
2160 2160
 			<tr>
2161 2161
 				<th>
2162
-					' . $label . '
2162
+					' . $label.'
2163 2163
 				</th>';
2164 2164
     }
2165 2165
 
@@ -2175,7 +2175,7 @@  discard block
 block discarded – undo
2175 2175
     public function form_form_field_input__wrap($input)
2176 2176
     {
2177 2177
         EE_Error::doing_it_wrong(
2178
-            __CLASS__ . '::' . __FUNCTION__,
2178
+            __CLASS__.'::'.__FUNCTION__,
2179 2179
             esc_html__(
2180 2180
                 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2181 2181
                 'event_espresso'
@@ -2184,7 +2184,7 @@  discard block
 block discarded – undo
2184 2184
         );
2185 2185
         return '
2186 2186
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2187
-					' . $input . '
2187
+					' . $input.'
2188 2188
 				</td>
2189 2189
 			</tr>';
2190 2190
     }
@@ -2226,7 +2226,7 @@  discard block
 block discarded – undo
2226 2226
     protected function _get_reg_custom_questions_form($REG_ID)
2227 2227
     {
2228 2228
         if ( ! $this->_reg_custom_questions_form) {
2229
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2229
+            require_once(REG_ADMIN.'form_sections'.DS.'EE_Registration_Custom_Questions_Form.form.php');
2230 2230
             $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2231 2231
                 EEM_Registration::instance()->get_one_by_ID($REG_ID)
2232 2232
             );
@@ -2259,7 +2259,7 @@  discard block
 block discarded – undo
2259 2259
         if ($form->is_valid()) {
2260 2260
             foreach ($form->subforms() as $question_group_id => $question_group_form) {
2261 2261
                 foreach ($question_group_form->inputs() as $question_id => $input) {
2262
-                    $where_conditions    = array(
2262
+                    $where_conditions = array(
2263 2263
                         'QST_ID' => $question_id,
2264 2264
                         'REG_ID' => $REG_ID,
2265 2265
                     );
@@ -2297,7 +2297,7 @@  discard block
 block discarded – undo
2297 2297
         $REG = EEM_Registration::instance();
2298 2298
         //get all other registrations on this transaction, and cache
2299 2299
         //the attendees for them so we don't have to run another query using force_join
2300
-        $registrations                           = $REG->get_all(array(
2300
+        $registrations = $REG->get_all(array(
2301 2301
             array(
2302 2302
                 'TXN_ID' => $this->_registration->transaction_ID(),
2303 2303
                 'REG_ID' => array('!=', $this->_registration->ID()),
@@ -2321,7 +2321,7 @@  discard block
 block discarded – undo
2321 2321
             $att_nmbr = 1;
2322 2322
             foreach ($registrations as $registration) {
2323 2323
                 /* @var $registration EE_Registration */
2324
-                $attendee                                                    = $registration->attendee()
2324
+                $attendee = $registration->attendee()
2325 2325
                     ? $registration->attendee()
2326 2326
                     : EEM_Attendee::instance()
2327 2327
                                   ->create_default_object();
@@ -2334,19 +2334,19 @@  discard block
 block discarded – undo
2334 2334
                     ', ',
2335 2335
                     $attendee->full_address_as_array()
2336 2336
                 );
2337
-                $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2337
+                $this->_template_args['attendees'][$att_nmbr]['att_link'] = self::add_query_args_and_nonce(
2338 2338
                     array(
2339 2339
                         'action' => 'edit_attendee',
2340 2340
                         'post'   => $attendee->ID(),
2341 2341
                     ),
2342 2342
                     REG_ADMIN_URL
2343 2343
                 );
2344
-                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2344
+                $this->_template_args['attendees'][$att_nmbr]['event_name'] = $registration->event_obj()->name();
2345 2345
                 $att_nmbr++;
2346 2346
             }
2347 2347
             $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2348 2348
         }
2349
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2349
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_attendees.template.php';
2350 2350
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2351 2351
     }
2352 2352
 
@@ -2386,20 +2386,20 @@  discard block
 block discarded – undo
2386 2386
         $this->_template_args['phone']             = $attendee->phone();
2387 2387
         $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2388 2388
         //edit link
2389
-        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2389
+        $this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(array(
2390 2390
             'action' => 'edit_attendee',
2391 2391
             'post'   => $attendee->ID(),
2392 2392
         ), REG_ADMIN_URL);
2393 2393
         $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2394 2394
         //create link
2395
-        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2395
+        $this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2396 2396
             ? EE_Admin_Page::add_query_args_and_nonce(array(
2397 2397
                 'action'  => 'duplicate_attendee',
2398 2398
                 '_REG_ID' => $this->_registration->ID(),
2399 2399
             ), REG_ADMIN_URL) : '';
2400 2400
         $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2401 2401
         $this->_template_args['att_check']    = $att_check;
2402
-        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2402
+        $template_path                        = REG_TEMPLATE_PATH.'reg_admin_details_side_meta_box_registrant.template.php';
2403 2403
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2404 2404
     }
2405 2405
 
@@ -2441,7 +2441,7 @@  discard block
 block discarded – undo
2441 2441
             /** @var EE_Registration $REG */
2442 2442
             $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2443 2443
             $payments = $REG->registration_payments();
2444
-            if (! empty($payments)) {
2444
+            if ( ! empty($payments)) {
2445 2445
                 $name = $REG->attendee() instanceof EE_Attendee
2446 2446
                     ? $REG->attendee()->full_name()
2447 2447
                     : esc_html__('Unknown Attendee', 'event_espresso');
@@ -2634,7 +2634,7 @@  discard block
 block discarded – undo
2634 2634
                 'action' => 'edit',
2635 2635
                 'post'   => $this->_reg_event->ID(),
2636 2636
             ), EVENTS_ADMIN_URL);
2637
-            $edit_event_lnk                     = '<a href="'
2637
+            $edit_event_lnk = '<a href="'
2638 2638
                                                   . $edit_event_url
2639 2639
                                                   . '" title="'
2640 2640
                                                   . esc_attr__('Edit ', 'event_espresso')
@@ -2652,7 +2652,7 @@  discard block
 block discarded – undo
2652 2652
         }
2653 2653
         // grab header
2654 2654
         $template_path                              =
2655
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2655
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee.template.php';
2656 2656
         $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2657 2657
             $this->_template_args, true);
2658 2658
         //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
@@ -2687,7 +2687,7 @@  discard block
 block discarded – undo
2687 2687
                 '</b>'
2688 2688
             );
2689 2689
             return '
2690
-	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2690
+	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg.'</p></div>
2691 2691
 	<script >
2692 2692
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
2693 2693
 		// after just adding a new registration... we gotta try to put a stop to that !!!
@@ -2755,7 +2755,7 @@  discard block
 block discarded – undo
2755 2755
         //we come back to the process_registration_step route.
2756 2756
         $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2757 2757
         return EEH_Template::display_template(
2758
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2758
+            REG_TEMPLATE_PATH.'reg_admin_register_new_attendee_step_content.template.php',
2759 2759
             $template_args,
2760 2760
             true
2761 2761
         );
@@ -2774,7 +2774,7 @@  discard block
 block discarded – undo
2774 2774
         if (is_object($this->_reg_event)) {
2775 2775
             return true;
2776 2776
         }
2777
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2777
+        $EVT_ID = ( ! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2778 2778
         if ( ! $EVT_ID) {
2779 2779
             return false;
2780 2780
         }
@@ -2840,7 +2840,7 @@  discard block
 block discarded – undo
2840 2840
                 }
2841 2841
                 break;
2842 2842
             case 'questions' :
2843
-                if (! isset(
2843
+                if ( ! isset(
2844 2844
                     $this->_req_data['txn_reg_status_change'],
2845 2845
                     $this->_req_data['txn_reg_status_change']['send_notifications'])
2846 2846
                 ) {
@@ -2954,7 +2954,7 @@  discard block
 block discarded – undo
2954 2954
     public function get_attendees($per_page, $count = false, $trash = false)
2955 2955
     {
2956 2956
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2957
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
2957
+        require_once(REG_ADMIN.'EE_Attendee_Contact_List_Table.class.php');
2958 2958
         $ATT_MDL                    = EEM_Attendee::instance();
2959 2959
         $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
2960 2960
         switch ($this->_req_data['orderby']) {
@@ -2991,7 +2991,7 @@  discard block
 block discarded – undo
2991 2991
             : $per_page;
2992 2992
         $_where       = array();
2993 2993
         if ( ! empty($this->_req_data['s'])) {
2994
-            $sstr         = '%' . $this->_req_data['s'] . '%';
2994
+            $sstr         = '%'.$this->_req_data['s'].'%';
2995 2995
             $_where['OR'] = array(
2996 2996
                 'Registration.Event.EVT_name'       => array('LIKE', $sstr),
2997 2997
                 'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
@@ -3067,9 +3067,9 @@  discard block
 block discarded – undo
3067 3067
      *                                                     the query parameters from the request
3068 3068
      * @return void ends the request with a redirect or download
3069 3069
      */
3070
-    public function _registrations_report_base( $method_name_for_getting_query_params )
3070
+    public function _registrations_report_base($method_name_for_getting_query_params)
3071 3071
     {
3072
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3072
+        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3073 3073
             wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3074 3074
                 array(
3075 3075
                     'page'        => 'espresso_batch',
@@ -3078,7 +3078,7 @@  discard block
 block discarded – undo
3078 3078
                     'filters'     => urlencode(
3079 3079
                         serialize(
3080 3080
                             call_user_func(
3081
-                                array( $this, $method_name_for_getting_query_params ),
3081
+                                array($this, $method_name_for_getting_query_params),
3082 3082
                                 EEH_Array::is_set(
3083 3083
                                     $this->_req_data,
3084 3084
                                     'filters',
@@ -3098,8 +3098,8 @@  discard block
 block discarded – undo
3098 3098
                 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3099 3099
             );
3100 3100
             $this->_req_data = array_merge($this->_req_data, $new_request_args);
3101
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3102
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3101
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3102
+                require_once(EE_CLASSES.'EE_Export.class.php');
3103 3103
                 $EE_Export = EE_Export::instance($this->_req_data);
3104 3104
                 $EE_Export->export();
3105 3105
             }
@@ -3120,8 +3120,8 @@  discard block
 block discarded – undo
3120 3120
 
3121 3121
     public function _contact_list_export()
3122 3122
     {
3123
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3124
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3123
+        if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3124
+            require_once(EE_CLASSES.'EE_Export.class.php');
3125 3125
             $EE_Export = EE_Export::instance($this->_req_data);
3126 3126
             $EE_Export->export_attendees();
3127 3127
         }
@@ -3138,8 +3138,8 @@  discard block
 block discarded – undo
3138 3138
                 'return_url'  => urlencode($this->_req_data['return_url']),
3139 3139
             )));
3140 3140
         } else {
3141
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3142
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3141
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
3142
+                require_once(EE_CLASSES.'EE_Export.class.php');
3143 3143
                 $EE_Export = EE_Export::instance($this->_req_data);
3144 3144
                 $EE_Export->report_attendees();
3145 3145
             }
@@ -3205,7 +3205,7 @@  discard block
 block discarded – undo
3205 3205
             $updated_fields = array(
3206 3206
                 'ATT_fname'     => $this->_req_data['ATT_fname'],
3207 3207
                 'ATT_lname'     => $this->_req_data['ATT_lname'],
3208
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3208
+                'ATT_full_name' => $this->_req_data['ATT_fname'].' '.$this->_req_data['ATT_lname'],
3209 3209
                 'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3210 3210
                 'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3211 3211
                 'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
@@ -3338,7 +3338,7 @@  discard block
 block discarded – undo
3338 3338
     {
3339 3339
         //get attendee object ( should already have it )
3340 3340
         $this->_template_args['attendee'] = $this->_cpt_model_obj;
3341
-        $template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
3341
+        $template                         = REG_TEMPLATE_PATH.'attendee_contact_info_metabox_content.template.php';
3342 3342
         EEH_Template::display_template($template, $this->_template_args);
3343 3343
     }
3344 3344
 
@@ -3400,8 +3400,8 @@  discard block
 block discarded – undo
3400 3400
                 )
3401 3401
             )
3402 3402
         );
3403
-        $template                             =
3404
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3403
+        $template =
3404
+            REG_TEMPLATE_PATH.'attendee_address_details_metabox_content.template.php';
3405 3405
         EEH_Template::display_template($template, $this->_template_args);
3406 3406
     }
3407 3407
 
@@ -3420,7 +3420,7 @@  discard block
 block discarded – undo
3420 3420
         $this->_template_args['attendee']      = $this->_cpt_model_obj;
3421 3421
         $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3422 3422
         $template                              =
3423
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3423
+            REG_TEMPLATE_PATH.'attendee_registrations_main_meta_box.template.php';
3424 3424
         EEH_Template::display_template($template, $this->_template_args);
3425 3425
     }
3426 3426
 
@@ -3435,7 +3435,7 @@  discard block
 block discarded – undo
3435 3435
     public function after_title_form_fields($post)
3436 3436
     {
3437 3437
         if ($post->post_type == 'espresso_attendees') {
3438
-            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3438
+            $template                  = REG_TEMPLATE_PATH.'attendee_details_after_title_form_fields.template.php';
3439 3439
             $template_args['attendee'] = $this->_cpt_model_obj;
3440 3440
             EEH_Template::display_template($template, $template_args);
3441 3441
         }
Please login to merge, or discard this patch.
Indentation   +3425 added lines, -3425 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if ( ! defined('EVENT_ESPRESSO_VERSION')) {
2
-    exit('No direct script access allowed');
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 
5 5
 
@@ -23,2111 +23,2111 @@  discard block
 block discarded – undo
23 23
 class Registrations_Admin_Page extends EE_Admin_Page_CPT
24 24
 {
25 25
 
26
-    /**
27
-     * @var EE_Registration
28
-     */
29
-    private $_registration;
30
-
31
-    /**
32
-     * @var EE_Event
33
-     */
34
-    private $_reg_event;
35
-
36
-    /**
37
-     * @var EE_Session
38
-     */
39
-    private $_session;
40
-
41
-    private static $_reg_status;
42
-
43
-    /**
44
-     * Form for displaying the custom questions for this registration.
45
-     * This gets used a few times throughout the request so its best to cache it
46
-     *
47
-     * @var EE_Registration_Custom_Questions_Form
48
-     */
49
-    protected $_reg_custom_questions_form = null;
50
-
51
-
52
-    /**
53
-     *        constructor
54
-     *
55
-     * @Constructor
56
-     * @access public
57
-     * @param bool $routing
58
-     * @return Registrations_Admin_Page
59
-     */
60
-    public function __construct($routing = true)
61
-    {
62
-        parent::__construct($routing);
63
-        add_action('wp_loaded', array($this, 'wp_loaded'));
64
-    }
65
-
66
-
67
-    public function wp_loaded()
68
-    {
69
-        // when adding a new registration...
70
-        if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71
-            EE_System::do_not_cache();
72
-            if (! isset($this->_req_data['processing_registration'])
73
-                 || absint($this->_req_data['processing_registration']) !== 1
74
-            ) {
75
-                // and it's NOT the attendee information reg step
76
-                // force cookie expiration by setting time to last week
77
-                setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
78
-                // and update the global
79
-                $_COOKIE['ee_registration_added'] = 0;
80
-            }
81
-        }
82
-    }
83
-
84
-
85
-    protected function _init_page_props()
86
-    {
87
-        $this->page_slug        = REG_PG_SLUG;
88
-        $this->_admin_base_url  = REG_ADMIN_URL;
89
-        $this->_admin_base_path = REG_ADMIN;
90
-        $this->page_label       = esc_html__('Registrations', 'event_espresso');
91
-        $this->_cpt_routes      = array(
92
-            'add_new_attendee' => 'espresso_attendees',
93
-            'edit_attendee'    => 'espresso_attendees',
94
-            'insert_attendee'  => 'espresso_attendees',
95
-            'update_attendee'  => 'espresso_attendees',
96
-        );
97
-        $this->_cpt_model_names = array(
98
-            'add_new_attendee' => 'EEM_Attendee',
99
-            'edit_attendee'    => 'EEM_Attendee',
100
-        );
101
-        $this->_cpt_edit_routes = array(
102
-            'espresso_attendees' => 'edit_attendee',
103
-        );
104
-        $this->_pagenow_map     = array(
105
-            'add_new_attendee' => 'post-new.php',
106
-            'edit_attendee'    => 'post.php',
107
-            'trash'            => 'post.php',
108
-        );
109
-        add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
110
-        //add filters so that the comment urls don't take users to a confusing 404 page
111
-        add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
112
-    }
113
-
114
-
115
-    public function clear_comment_link($link, $comment, $args)
116
-    {
117
-        //gotta make sure this only happens on this route
118
-        $post_type = get_post_type($comment->comment_post_ID);
119
-        if ($post_type === 'espresso_attendees') {
120
-            return '#commentsdiv';
121
-        }
122
-        return $link;
123
-    }
124
-
125
-
126
-    protected function _ajax_hooks()
127
-    {
128
-        //todo: all hooks for registrations ajax goes in here
129
-        add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
130
-    }
131
-
132
-
133
-    protected function _define_page_props()
134
-    {
135
-        $this->_admin_page_title = $this->page_label;
136
-        $this->_labels           = array(
137
-            'buttons'                      => array(
138
-                'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
139
-                'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
140
-                'edit'                => esc_html__('Edit Contact', 'event_espresso'),
141
-                'report'              => esc_html__("Event Registrations CSV Report", "event_espresso"),
142
-                'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
143
-                'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
144
-                'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
145
-                'contact_list_export' => esc_html__("Export Data", "event_espresso"),
146
-            ),
147
-            'publishbox'                   => array(
148
-                'add_new_attendee' => esc_html__("Add Contact Record", 'event_espresso'),
149
-                'edit_attendee'    => esc_html__("Update Contact Record", 'event_espresso'),
150
-            ),
151
-            'hide_add_button_on_cpt_route' => array(
152
-                'edit_attendee' => true,
153
-            ),
154
-        );
155
-    }
156
-
157
-
158
-    /**
159
-     *        grab url requests and route them
160
-     *
161
-     * @access private
162
-     * @return void
163
-     */
164
-    public function _set_page_routes()
165
-    {
166
-        $this->_get_registration_status_array();
167
-        $reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
168
-            ? $this->_req_data['_REG_ID'] : 0;
169
-        $att_id             = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
170
-            ? $this->_req_data['ATT_ID'] : 0;
171
-        $att_id             = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
172
-            ? $this->_req_data['post']
173
-            : $att_id;
174
-        $this->_page_routes = array(
175
-            'default'                            => array(
176
-                'func'       => '_registrations_overview_list_table',
177
-                'capability' => 'ee_read_registrations',
178
-            ),
179
-            'view_registration'                  => array(
180
-                'func'       => '_registration_details',
181
-                'capability' => 'ee_read_registration',
182
-                'obj_id'     => $reg_id,
183
-            ),
184
-            'edit_registration'                  => array(
185
-                'func'               => '_update_attendee_registration_form',
186
-                'noheader'           => true,
187
-                'headers_sent_route' => 'view_registration',
188
-                'capability'         => 'ee_edit_registration',
189
-                'obj_id'             => $reg_id,
190
-                '_REG_ID'            => $reg_id,
191
-            ),
192
-            'trash_registrations'                => array(
193
-                'func'       => '_trash_or_restore_registrations',
194
-                'args'       => array('trash' => true),
195
-                'noheader'   => true,
196
-                'capability' => 'ee_delete_registrations',
197
-            ),
198
-            'restore_registrations'              => array(
199
-                'func'       => '_trash_or_restore_registrations',
200
-                'args'       => array('trash' => false),
201
-                'noheader'   => true,
202
-                'capability' => 'ee_delete_registrations',
203
-            ),
204
-            'delete_registrations'               => array(
205
-                'func'       => '_delete_registrations',
206
-                'noheader'   => true,
207
-                'capability' => 'ee_delete_registrations',
208
-            ),
209
-            'new_registration'                   => array(
210
-                'func'       => 'new_registration',
211
-                'capability' => 'ee_edit_registrations',
212
-            ),
213
-            'process_reg_step'                   => array(
214
-                'func'       => 'process_reg_step',
215
-                'noheader'   => true,
216
-                'capability' => 'ee_edit_registrations',
217
-            ),
218
-            'redirect_to_txn'                    => array(
219
-                'func'       => 'redirect_to_txn',
220
-                'noheader'   => true,
221
-                'capability' => 'ee_edit_registrations',
222
-            ),
223
-            'change_reg_status'                  => array(
224
-                'func'       => '_change_reg_status',
225
-                'noheader'   => true,
226
-                'capability' => 'ee_edit_registration',
227
-                'obj_id'     => $reg_id,
228
-            ),
229
-            'approve_registration'               => array(
230
-                'func'       => 'approve_registration',
231
-                'noheader'   => true,
232
-                'capability' => 'ee_edit_registration',
233
-                'obj_id'     => $reg_id,
234
-            ),
235
-            'approve_and_notify_registration'    => array(
236
-                'func'       => 'approve_registration',
237
-                'noheader'   => true,
238
-                'args'       => array(true),
239
-                'capability' => 'ee_edit_registration',
240
-                'obj_id'     => $reg_id,
241
-            ),
242
-            'decline_registration'               => array(
243
-                'func'       => 'decline_registration',
244
-                'noheader'   => true,
245
-                'capability' => 'ee_edit_registration',
246
-                'obj_id'     => $reg_id,
247
-            ),
248
-            'decline_and_notify_registration'    => array(
249
-                'func'       => 'decline_registration',
250
-                'noheader'   => true,
251
-                'args'       => array(true),
252
-                'capability' => 'ee_edit_registration',
253
-                'obj_id'     => $reg_id,
254
-            ),
255
-            'pending_registration'               => array(
256
-                'func'       => 'pending_registration',
257
-                'noheader'   => true,
258
-                'capability' => 'ee_edit_registration',
259
-                'obj_id'     => $reg_id,
260
-            ),
261
-            'pending_and_notify_registration'    => array(
262
-                'func'       => 'pending_registration',
263
-                'noheader'   => true,
264
-                'args'       => array(true),
265
-                'capability' => 'ee_edit_registration',
266
-                'obj_id'     => $reg_id,
267
-            ),
268
-            'no_approve_registration'            => array(
269
-                'func'       => 'not_approve_registration',
270
-                'noheader'   => true,
271
-                'capability' => 'ee_edit_registration',
272
-                'obj_id'     => $reg_id,
273
-            ),
274
-            'no_approve_and_notify_registration' => array(
275
-                'func'       => 'not_approve_registration',
276
-                'noheader'   => true,
277
-                'args'       => array(true),
278
-                'capability' => 'ee_edit_registration',
279
-                'obj_id'     => $reg_id,
280
-            ),
281
-            'cancel_registration'                => array(
282
-                'func'       => 'cancel_registration',
283
-                'noheader'   => true,
284
-                'capability' => 'ee_edit_registration',
285
-                'obj_id'     => $reg_id,
286
-            ),
287
-            'cancel_and_notify_registration'     => array(
288
-                'func'       => 'cancel_registration',
289
-                'noheader'   => true,
290
-                'args'       => array(true),
291
-                'capability' => 'ee_edit_registration',
292
-                'obj_id'     => $reg_id,
293
-            ),
294
-            'contact_list'                       => array(
295
-                'func'       => '_attendee_contact_list_table',
296
-                'capability' => 'ee_read_contacts',
297
-            ),
298
-            'add_new_attendee'                   => array(
299
-                'func' => '_create_new_cpt_item',
300
-                'args' => array(
301
-                    'new_attendee' => true,
302
-                    'capability'   => 'ee_edit_contacts',
303
-                ),
304
-            ),
305
-            'edit_attendee'                      => array(
306
-                'func'       => '_edit_cpt_item',
307
-                'capability' => 'ee_edit_contacts',
308
-                'obj_id'     => $att_id,
309
-            ),
310
-            'duplicate_attendee'                 => array(
311
-                'func'       => '_duplicate_attendee',
312
-                'noheader'   => true,
313
-                'capability' => 'ee_edit_contacts',
314
-                'obj_id'     => $att_id,
315
-            ),
316
-            'insert_attendee'                    => array(
317
-                'func'       => '_insert_or_update_attendee',
318
-                'args'       => array(
319
-                    'new_attendee' => true,
320
-                ),
321
-                'noheader'   => true,
322
-                'capability' => 'ee_edit_contacts',
323
-            ),
324
-            'update_attendee'                    => array(
325
-                'func'       => '_insert_or_update_attendee',
326
-                'args'       => array(
327
-                    'new_attendee' => false,
328
-                ),
329
-                'noheader'   => true,
330
-                'capability' => 'ee_edit_contacts',
331
-                'obj_id'     => $att_id,
332
-            ),
333
-            'trash_attendee'                    => array(
334
-                'func'       => '_trash_or_restore_attendees',
335
-                'args'       => array(
336
-                    'trash' => true,
337
-                ),
338
-                'noheader'   => true,
339
-                'capability' => 'ee_delete_contacts',
340
-                'obj_id'     => $att_id,
341
-            ),
342
-            'restore_attendees'                  => array(
343
-                'func'       => '_trash_or_restore_attendees',
344
-                'args'       => array(
345
-                    'trash' => false,
346
-                ),
347
-                'noheader'   => true,
348
-                'capability' => 'ee_delete_contacts',
349
-                'obj_id'     => $att_id,
350
-            ),
351
-            'resend_registration'                => array(
352
-                'func'       => '_resend_registration',
353
-                'noheader'   => true,
354
-                'capability' => 'ee_send_message',
355
-            ),
356
-            'registrations_report'               => array(
357
-                'func'       => '_registrations_report',
358
-                'noheader'   => true,
359
-                'capability' => 'ee_read_registrations',
360
-            ),
361
-            'contact_list_export'                => array(
362
-                'func'       => '_contact_list_export',
363
-                'noheader'   => true,
364
-                'capability' => 'export',
365
-            ),
366
-            'contact_list_report'                => array(
367
-                'func'       => '_contact_list_report',
368
-                'noheader'   => true,
369
-                'capability' => 'ee_read_contacts',
370
-            ),
371
-        );
372
-    }
373
-
374
-
375
-    protected function _set_page_config()
376
-    {
377
-        $this->_page_config = array(
378
-            'default'           => array(
379
-                'nav'           => array(
380
-                    'label' => esc_html__('Overview', 'event_espresso'),
381
-                    'order' => 5,
382
-                ),
383
-                'help_tabs'     => array(
384
-                    'registrations_overview_help_tab'                       => array(
385
-                        'title'    => esc_html__('Registrations Overview', 'event_espresso'),
386
-                        'filename' => 'registrations_overview',
387
-                    ),
388
-                    'registrations_overview_table_column_headings_help_tab' => array(
389
-                        'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
390
-                        'filename' => 'registrations_overview_table_column_headings',
391
-                    ),
392
-                    'registrations_overview_filters_help_tab'               => array(
393
-                        'title'    => esc_html__('Registration Filters', 'event_espresso'),
394
-                        'filename' => 'registrations_overview_filters',
395
-                    ),
396
-                    'registrations_overview_views_help_tab'                 => array(
397
-                        'title'    => esc_html__('Registration Views', 'event_espresso'),
398
-                        'filename' => 'registrations_overview_views',
399
-                    ),
400
-                    'registrations_regoverview_other_help_tab'              => array(
401
-                        'title'    => esc_html__('Registrations Other', 'event_espresso'),
402
-                        'filename' => 'registrations_overview_other',
403
-                    ),
404
-                ),
405
-                'help_tour'     => array('Registration_Overview_Help_Tour'),
406
-                'qtips'         => array('Registration_List_Table_Tips'),
407
-                'list_table'    => 'EE_Registrations_List_Table',
408
-                'require_nonce' => false,
409
-            ),
410
-            'view_registration' => array(
411
-                'nav'           => array(
412
-                    'label'      => esc_html__('REG Details', 'event_espresso'),
413
-                    'order'      => 15,
414
-                    'url'        => isset($this->_req_data['_REG_ID'])
415
-                        ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
416
-                        : $this->_admin_base_url,
417
-                    'persistent' => false,
418
-                ),
419
-                'help_tabs'     => array(
420
-                    'registrations_details_help_tab'                    => array(
421
-                        'title'    => esc_html__('Registration Details', 'event_espresso'),
422
-                        'filename' => 'registrations_details',
423
-                    ),
424
-                    'registrations_details_table_help_tab'              => array(
425
-                        'title'    => esc_html__('Registration Details Table', 'event_espresso'),
426
-                        'filename' => 'registrations_details_table',
427
-                    ),
428
-                    'registrations_details_form_answers_help_tab'       => array(
429
-                        'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
430
-                        'filename' => 'registrations_details_form_answers',
431
-                    ),
432
-                    'registrations_details_registrant_details_help_tab' => array(
433
-                        'title'    => esc_html__('Contact Details', 'event_espresso'),
434
-                        'filename' => 'registrations_details_registrant_details',
435
-                    ),
436
-                ),
437
-                'help_tour'     => array('Registration_Details_Help_Tour'),
438
-                'metaboxes'     => array_merge(
439
-                    $this->_default_espresso_metaboxes,
440
-                    array('_registration_details_metaboxes')
441
-                ),
442
-                'require_nonce' => false,
443
-            ),
444
-            'new_registration'  => array(
445
-                'nav'           => array(
446
-                    'label'      => esc_html__('Add New Registration', 'event_espresso'),
447
-                    'url'        => '#',
448
-                    'order'      => 15,
449
-                    'persistent' => false,
450
-                ),
451
-                'metaboxes'     => $this->_default_espresso_metaboxes,
452
-                'labels'        => array(
453
-                    'publishbox' => esc_html__('Save Registration', 'event_espresso'),
454
-                ),
455
-                'require_nonce' => false,
456
-            ),
457
-            'add_new_attendee'  => array(
458
-                'nav'           => array(
459
-                    'label'      => esc_html__('Add Contact', 'event_espresso'),
460
-                    'order'      => 15,
461
-                    'persistent' => false,
462
-                ),
463
-                'metaboxes'     => array_merge(
464
-                    $this->_default_espresso_metaboxes,
465
-                    array('_publish_post_box', 'attendee_editor_metaboxes')
466
-                ),
467
-                'require_nonce' => false,
468
-            ),
469
-            'edit_attendee'     => array(
470
-                'nav'           => array(
471
-                    'label'      => esc_html__('Edit Contact', 'event_espresso'),
472
-                    'order'      => 15,
473
-                    'persistent' => false,
474
-                    'url'        => isset($this->_req_data['ATT_ID'])
475
-                        ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
476
-                        : $this->_admin_base_url,
477
-                ),
478
-                'metaboxes'     => array('attendee_editor_metaboxes'),
479
-                'require_nonce' => false,
480
-            ),
481
-            'contact_list'      => array(
482
-                'nav'           => array(
483
-                    'label' => esc_html__('Contact List', 'event_espresso'),
484
-                    'order' => 20,
485
-                ),
486
-                'list_table'    => 'EE_Attendee_Contact_List_Table',
487
-                'help_tabs'     => array(
488
-                    'registrations_contact_list_help_tab'                       => array(
489
-                        'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
490
-                        'filename' => 'registrations_contact_list',
491
-                    ),
492
-                    'registrations_contact-list_table_column_headings_help_tab' => array(
493
-                        'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
494
-                        'filename' => 'registrations_contact_list_table_column_headings',
495
-                    ),
496
-                    'registrations_contact_list_views_help_tab'                 => array(
497
-                        'title'    => esc_html__('Contact List Views', 'event_espresso'),
498
-                        'filename' => 'registrations_contact_list_views',
499
-                    ),
500
-                    'registrations_contact_list_other_help_tab'                 => array(
501
-                        'title'    => esc_html__('Contact List Other', 'event_espresso'),
502
-                        'filename' => 'registrations_contact_list_other',
503
-                    ),
504
-                ),
505
-                'help_tour'     => array('Contact_List_Help_Tour'),
506
-                'metaboxes'     => array(),
507
-                'require_nonce' => false,
508
-            ),
509
-            //override default cpt routes
510
-            'create_new'        => '',
511
-            'edit'              => '',
512
-        );
513
-    }
514
-
515
-
516
-    /**
517
-     * The below methods aren't used by this class currently
518
-     */
519
-    protected function _add_screen_options()
520
-    {
521
-    }
522
-
523
-
524
-    protected function _add_feature_pointers()
525
-    {
526
-    }
527
-
528
-
529
-    public function admin_init()
530
-    {
531
-        EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
532
-            'click "Update Registration Questions" to save your changes',
533
-            'event_espresso'
534
-        );
535
-    }
536
-
537
-
538
-    public function admin_notices()
539
-    {
540
-    }
541
-
542
-
543
-    public function admin_footer_scripts()
544
-    {
545
-    }
546
-
547
-
548
-    /**
549
-     *        get list of registration statuses
550
-     *
551
-     * @access private
552
-     * @return void
553
-     */
554
-    private function _get_registration_status_array()
555
-    {
556
-        self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
557
-    }
558
-
559
-
560
-    protected function _add_screen_options_default()
561
-    {
562
-        $this->_per_page_screen_option();
563
-    }
564
-
565
-
566
-    protected function _add_screen_options_contact_list()
567
-    {
568
-        $page_title              = $this->_admin_page_title;
569
-        $this->_admin_page_title = esc_html__("Contacts", 'event_espresso');
570
-        $this->_per_page_screen_option();
571
-        $this->_admin_page_title = $page_title;
572
-    }
573
-
574
-
575
-    public function load_scripts_styles()
576
-    {
577
-        //style
578
-        wp_register_style(
579
-            'espresso_reg',
580
-            REG_ASSETS_URL . 'espresso_registrations_admin.css',
581
-            array('ee-admin-css'),
582
-            EVENT_ESPRESSO_VERSION
583
-        );
584
-        wp_enqueue_style('espresso_reg');
585
-        //script
586
-        wp_register_script(
587
-            'espresso_reg',
588
-            REG_ASSETS_URL . 'espresso_registrations_admin.js',
589
-            array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
590
-            EVENT_ESPRESSO_VERSION,
591
-            true
592
-        );
593
-        wp_enqueue_script('espresso_reg');
594
-    }
595
-
596
-
597
-    public function load_scripts_styles_edit_attendee()
598
-    {
599
-        //stuff to only show up on our attendee edit details page.
600
-        $attendee_details_translations = array(
601
-            'att_publish_text' => sprintf(
602
-                esc_html__('Created on: <b>%1$s</b>', 'event_espresso'),
603
-                $this->_cpt_model_obj->get_datetime('ATT_created')
604
-            ),
605
-        );
606
-        wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
607
-        wp_enqueue_script('jquery-validate');
608
-    }
609
-
610
-
611
-    public function load_scripts_styles_view_registration()
612
-    {
613
-        //styles
614
-        wp_enqueue_style('espresso-ui-theme');
615
-        //scripts
616
-        $this->_get_reg_custom_questions_form($this->_registration->ID());
617
-        $this->_reg_custom_questions_form->wp_enqueue_scripts(true);
618
-    }
619
-
620
-
621
-    public function load_scripts_styles_contact_list()
622
-    {
623
-        wp_deregister_style('espresso_reg');
624
-        wp_register_style(
625
-            'espresso_att',
626
-            REG_ASSETS_URL . 'espresso_attendees_admin.css',
627
-            array('ee-admin-css'),
628
-            EVENT_ESPRESSO_VERSION
629
-        );
630
-        wp_enqueue_style('espresso_att');
631
-    }
632
-
633
-
634
-    public function load_scripts_styles_new_registration()
635
-    {
636
-        wp_register_script(
637
-            'ee-spco-for-admin',
638
-            REG_ASSETS_URL . 'spco_for_admin.js',
639
-            array('underscore', 'jquery'),
640
-            EVENT_ESPRESSO_VERSION,
641
-            true
642
-        );
643
-        wp_enqueue_script('ee-spco-for-admin');
644
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
645
-        EE_Form_Section_Proper::wp_enqueue_scripts();
646
-        EED_Ticket_Selector::load_tckt_slctr_assets();
647
-        EE_Datepicker_Input::enqueue_styles_and_scripts();
648
-    }
649
-
650
-
651
-    public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
652
-    {
653
-        add_filter('FHEE_load_EE_messages', '__return_true');
654
-    }
655
-
656
-
657
-    public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
658
-    {
659
-        add_filter('FHEE_load_EE_messages', '__return_true');
660
-    }
661
-
662
-
663
-    protected function _set_list_table_views_default()
664
-    {
665
-        //for notification related bulk actions we need to make sure only active messengers have an option.
666
-        EED_Messages::set_autoloaders();
667
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
668
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
669
-        $active_mts               = $message_resource_manager->list_of_active_message_types();
670
-        //key= bulk_action_slug, value= message type.
671
-        $match_array = array(
672
-            'approve_registration'    => 'registration',
673
-            'decline_registration'    => 'declined_registration',
674
-            'pending_registration'    => 'pending_approval',
675
-            'no_approve_registration' => 'not_approved_registration',
676
-            'cancel_registration'     => 'cancelled_registration',
677
-        );
678
-        /** setup reg status bulk actions **/
679
-        $def_reg_status_actions['approve_registration'] = esc_html__('Approve Registrations', 'event_espresso');
680
-        if (in_array($match_array['approve_registration'], $active_mts)
681
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
682
-        ) {
683
-            $def_reg_status_actions['approve_and_notify_registration'] = esc_html__(
684
-                'Approve and Notify Registrations',
685
-                'event_espresso'
686
-            );
687
-        }
688
-        $def_reg_status_actions['decline_registration'] = esc_html__('Decline Registrations', 'event_espresso');
689
-        if (in_array($match_array['decline_registration'], $active_mts)
690
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
691
-        ) {
692
-            $def_reg_status_actions['decline_and_notify_registration'] = esc_html__(
693
-                'Decline and Notify Registrations',
694
-                'event_espresso'
695
-            );
696
-        }
697
-        $def_reg_status_actions['pending_registration'] = esc_html__(
698
-            'Set Registrations to Pending Payment',
699
-            'event_espresso'
700
-        );
701
-        if (in_array($match_array['pending_registration'], $active_mts)
702
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
703
-        ) {
704
-            $def_reg_status_actions['pending_and_notify_registration'] = esc_html__(
705
-                'Set Registrations to Pending Payment and Notify',
706
-                'event_espresso'
707
-            );
708
-        }
709
-        $def_reg_status_actions['no_approve_registration'] = esc_html__(
710
-            'Set Registrations to Not Approved',
711
-            'event_espresso'
712
-        );
713
-        if (in_array($match_array['no_approve_registration'], $active_mts)
714
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
715
-        ) {
716
-            $def_reg_status_actions['no_approve_and_notify_registration'] = esc_html__(
717
-                'Set Registrations to Not Approved and Notify',
718
-                'event_espresso'
719
-            );
720
-        }
721
-        $def_reg_status_actions['cancel_registration'] = esc_html__('Cancel Registrations', 'event_espresso');
722
-        if (in_array($match_array['cancel_registration'], $active_mts)
723
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
724
-        ) {
725
-            $def_reg_status_actions['cancel_and_notify_registration'] = esc_html__(
726
-                'Cancel Registrations and Notify',
727
-                'event_espresso'
728
-            );
729
-        }
730
-        $this->_views = array(
731
-            'all'   => array(
732
-                'slug'        => 'all',
733
-                'label'       => esc_html__('View All Registrations', 'event_espresso'),
734
-                'count'       => 0,
735
-                'bulk_action' => array_merge($def_reg_status_actions, array(
736
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
737
-                )),
738
-            ),
739
-            'month' => array(
740
-                'slug'        => 'month',
741
-                'label'       => esc_html__('This Month', 'event_espresso'),
742
-                'count'       => 0,
743
-                'bulk_action' => array_merge($def_reg_status_actions, array(
744
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
745
-                )),
746
-            ),
747
-            'today' => array(
748
-                'slug'        => 'today',
749
-                'label'       => sprintf(
750
-                    esc_html__('Today - %s', 'event_espresso'),
751
-                    date('M d, Y', current_time('timestamp'))
752
-                ),
753
-                'count'       => 0,
754
-                'bulk_action' => array_merge($def_reg_status_actions, array(
755
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
756
-                )),
757
-            ),
758
-        );
759
-        if (EE_Registry::instance()->CAP->current_user_can(
760
-            'ee_delete_registrations',
761
-            'espresso_registrations_delete_registration'
762
-        )) {
763
-            $this->_views['incomplete'] = array(
764
-                'slug'        => 'incomplete',
765
-                'label'       => esc_html__('Incomplete', 'event_espresso'),
766
-                'count'       => 0,
767
-                'bulk_action' => array(
768
-                    'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
769
-                ),
770
-            );
771
-            $this->_views['trash']      = array(
772
-                'slug'        => 'trash',
773
-                'label'       => esc_html__('Trash', 'event_espresso'),
774
-                'count'       => 0,
775
-                'bulk_action' => array(
776
-                    'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
777
-                    'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
778
-                ),
779
-            );
780
-        }
781
-    }
782
-
783
-
784
-    protected function _set_list_table_views_contact_list()
785
-    {
786
-        $this->_views = array(
787
-            'in_use' => array(
788
-                'slug'        => 'in_use',
789
-                'label'       => esc_html__('In Use', 'event_espresso'),
790
-                'count'       => 0,
791
-                'bulk_action' => array(
792
-                    'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
793
-                ),
794
-            ),
795
-        );
796
-        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts',
797
-            'espresso_registrations_trash_attendees')
798
-        ) {
799
-            $this->_views['trash'] = array(
800
-                'slug'        => 'trash',
801
-                'label'       => esc_html__('Trash', 'event_espresso'),
802
-                'count'       => 0,
803
-                'bulk_action' => array(
804
-                    'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
805
-                ),
806
-            );
807
-        }
808
-    }
809
-
810
-
811
-    protected function _registration_legend_items()
812
-    {
813
-        $fc_items = array(
814
-            'star-icon'        => array(
815
-                'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
816
-                'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
817
-            ),
818
-            'view_details'     => array(
819
-                'class' => 'dashicons dashicons-clipboard',
820
-                'desc'  => esc_html__('View Registration Details', 'event_espresso'),
821
-            ),
822
-            'edit_attendee'    => array(
823
-                'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
824
-                'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
825
-            ),
826
-            'view_transaction' => array(
827
-                'class' => 'dashicons dashicons-cart',
828
-                'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
829
-            ),
830
-            'view_invoice'     => array(
831
-                'class' => 'dashicons dashicons-media-spreadsheet',
832
-                'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
833
-            ),
834
-        );
835
-        if (EE_Registry::instance()->CAP->current_user_can(
836
-            'ee_send_message',
837
-            'espresso_registrations_resend_registration'
838
-        )) {
839
-            $fc_items['resend_registration'] = array(
840
-                'class' => 'dashicons dashicons-email-alt',
841
-                'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
842
-            );
843
-        } else {
844
-            $fc_items['blank'] = array('class' => 'blank', 'desc' => '');
845
-        }
846
-        if (EE_Registry::instance()->CAP->current_user_can(
847
-            'ee_read_global_messages',
848
-            'view_filtered_messages'
849
-        )) {
850
-            $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
851
-            if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
852
-                $fc_items['view_related_messages'] = array(
853
-                    'class' => $related_for_icon['css_class'],
854
-                    'desc'  => $related_for_icon['label'],
855
-                );
856
-            }
857
-        }
858
-        $sc_items = array(
859
-            'approved_status'   => array(
860
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
861
-                'desc'  => EEH_Template::pretty_status(
862
-                    EEM_Registration::status_id_approved,
863
-                    false,
864
-                    'sentence'
865
-                ),
866
-            ),
867
-            'pending_status'    => array(
868
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
869
-                'desc'  => EEH_Template::pretty_status(
870
-                    EEM_Registration::status_id_pending_payment,
871
-                    false,
872
-                    'sentence'
873
-                ),
874
-            ),
875
-            'wait_list'         => array(
876
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
877
-                'desc'  => EEH_Template::pretty_status(
878
-                    EEM_Registration::status_id_wait_list,
879
-                    false,
880
-                    'sentence'
881
-                ),
882
-            ),
883
-            'incomplete_status' => array(
884
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
885
-                'desc'  => EEH_Template::pretty_status(
886
-                    EEM_Registration::status_id_incomplete,
887
-                    false,
888
-                    'sentence'
889
-                ),
890
-            ),
891
-            'not_approved'      => array(
892
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
893
-                'desc'  => EEH_Template::pretty_status(
894
-                    EEM_Registration::status_id_not_approved,
895
-                    false,
896
-                    'sentence'
897
-                ),
898
-            ),
899
-            'declined_status'   => array(
900
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
901
-                'desc'  => EEH_Template::pretty_status(
902
-                    EEM_Registration::status_id_declined,
903
-                    false,
904
-                    'sentence'
905
-                ),
906
-            ),
907
-            'cancelled_status'  => array(
908
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
909
-                'desc'  => EEH_Template::pretty_status(
910
-                    EEM_Registration::status_id_cancelled,
911
-                    false,
912
-                    'sentence'
913
-                ),
914
-            ),
915
-        );
916
-        return array_merge($fc_items, $sc_items);
917
-    }
918
-
919
-
920
-
921
-    /***************************************        REGISTRATION OVERVIEW        **************************************/
922
-    /**
923
-     * @throws \EE_Error
924
-     */
925
-    protected function _registrations_overview_list_table()
926
-    {
927
-        $this->_template_args['admin_page_header'] = '';
928
-        $EVT_ID                                    = ! empty($this->_req_data['event_id'])
929
-            ? absint($this->_req_data['event_id'])
930
-            : 0;
931
-        if ($EVT_ID) {
932
-            if (EE_Registry::instance()->CAP->current_user_can(
933
-                'ee_edit_registrations',
934
-                'espresso_registrations_new_registration',
935
-                $EVT_ID
936
-            )) {
937
-                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
938
-                    'new_registration',
939
-                    'add-registrant',
940
-                    array('event_id' => $EVT_ID),
941
-                    'add-new-h2'
942
-                );
943
-            }
944
-            $event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
945
-            if ($event instanceof EE_Event) {
946
-                $this->_template_args['admin_page_header'] = sprintf(
947
-                    esc_html__(
948
-                        '%s Viewing registrations for the event: %s%s',
949
-                        'event_espresso'
950
-                    ),
951
-                    '<h3 style="line-height:1.5em;">',
952
-                    '<br /><a href="'
953
-                        . EE_Admin_Page::add_query_args_and_nonce(
954
-                            array(
955
-                                'action' => 'edit',
956
-                                'post'   => $event->ID(),
957
-                            ),
958
-                            EVENTS_ADMIN_URL
959
-                        )
960
-                        . '">&nbsp;'
961
-                        . $event->get('EVT_name')
962
-                        . '&nbsp;</a>&nbsp;',
963
-                    '</h3>'
964
-                );
965
-            }
966
-            $DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
967
-            $datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
968
-            if ($datetime instanceof EE_Datetime && $this->_template_args['admin_page_header'] !== '') {
969
-                $this->_template_args['admin_page_header'] = substr(
970
-                    $this->_template_args['admin_page_header'],
971
-                    0,
972
-                    -5
973
-                );
974
-                $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
975
-                $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
976
-                $this->_template_args['admin_page_header'] .= $datetime->name();
977
-                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
978
-                $this->_template_args['admin_page_header'] .= '</span></h3>';
979
-            }
980
-        }
981
-        $this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
982
-        $this->display_admin_list_table_page_with_no_sidebar();
983
-    }
984
-
985
-
986
-    /**
987
-     * This sets the _registration property for the registration details screen
988
-     *
989
-     * @access private
990
-     * @return bool
991
-     */
992
-    private function _set_registration_object()
993
-    {
994
-        //get out if we've already set the object
995
-        if (is_object($this->_registration)) {
996
-            return true;
997
-        }
998
-        $REG    = EEM_Registration::instance();
999
-        $REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1000
-        if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
1001
-            return true;
1002
-        } else {
1003
-            $error_msg = sprintf(
1004
-                esc_html__(
1005
-                    'An error occurred and the details for Registration ID #%s could not be retrieved.',
1006
-                    'event_espresso'
1007
-                ),
1008
-                $REG_ID
1009
-            );
1010
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1011
-            $this->_registration = null;
1012
-            return false;
1013
-        }
1014
-    }
1015
-
1016
-
1017
-    /**
1018
-     * Used to retrieve registrations for the list table.
1019
-     *
1020
-     * @param int  $per_page
1021
-     * @param bool $count
1022
-     * @param bool $this_month
1023
-     * @param bool $today
1024
-     * @return EE_Registration[]|int
1025
-     * @throws EE_Error
1026
-     */
1027
-    public function get_registrations(
1028
-        $per_page = 10,
1029
-        $count = false,
1030
-        $this_month = false,
1031
-        $today = false
1032
-    ) {
1033
-        if ($this_month) {
1034
-            $this->_req_data['status'] = 'month';
1035
-        }
1036
-        if ($today) {
1037
-            $this->_req_data['status'] = 'today';
1038
-        }
1039
-        $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1040
-        /**
1041
-         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1042
-         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1043
-         * @see EEM_Base::get_all()
1044
-         */
1045
-        $query_params['group_by'] = '';
1046
-
1047
-        return $count
1048
-            ? EEM_Registration::instance()->count($query_params)
1049
-            /** @type EE_Registration[] */
1050
-            : EEM_Registration::instance()->get_all($query_params);
1051
-    }
1052
-
1053
-
1054
-
1055
-    /**
1056
-     * Retrieves the query parameters to be used by the Registration model for getting registrations.
1057
-     * Note: this listens to values on the request for some of the query parameters.
1058
-     *
1059
-     * @param array $request
1060
-     * @param int    $per_page
1061
-     * @param bool   $count
1062
-     * @return array
1063
-     */
1064
-    protected function _get_registration_query_parameters(
1065
-        $request = array(),
1066
-        $per_page = 10,
1067
-        $count = false
1068
-    ) {
1069
-
1070
-        $query_params = array(
1071
-            0                          => $this->_get_where_conditions_for_registrations_query(
1072
-                $request
1073
-            ),
1074
-            'caps'                     => EEM_Registration::caps_read_admin,
1075
-            'default_where_conditions' => 'this_model_only',
1076
-        );
1077
-        if (! $count) {
1078
-            $query_params = array_merge(
1079
-                $query_params,
1080
-                $this->_get_orderby_for_registrations_query(),
1081
-                $this->_get_limit($per_page)
1082
-            );
1083
-        }
1084
-
1085
-        return $query_params;
1086
-    }
1087
-
1088
-
1089
-    /**
1090
-     * This will add EVT_ID to the provided $where array for EE model query parameters.
1091
-     *
1092
-     * @param array $request usually the same as $this->_req_data but not necessarily
1093
-     * @return array
1094
-     */
1095
-    protected function _add_event_id_to_where_conditions(array $request)
1096
-    {
1097
-        $where = array();
1098
-        if (! empty($request['event_id'])) {
1099
-            $where['EVT_ID'] = absint($request['event_id']);
1100
-        }
1101
-        return $where;
1102
-    }
1103
-
1104
-
1105
-    /**
1106
-     * Adds category ID if it exists in the request to the where conditions for the registrations query.
1107
-     *
1108
-     * @param array $request usually the same as $this->_req_data but not necessarily
1109
-     * @return array
1110
-     */
1111
-    protected function _add_category_id_to_where_conditions(array $request)
1112
-    {
1113
-        $where = array();
1114
-        if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1115
-            $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1116
-        }
1117
-        return $where;
1118
-    }
1119
-
1120
-
1121
-    /**
1122
-     * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1123
-     *
1124
-     * @param array $request usually the same as $this->_req_data but not necessarily
1125
-     * @return array
1126
-     */
1127
-    protected function _add_datetime_id_to_where_conditions(array $request)
1128
-    {
1129
-        $where = array();
1130
-        if (! empty($request['datetime_id'])) {
1131
-            $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1132
-        }
1133
-        if (! empty($request['DTT_ID'])) {
1134
-            $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1135
-        }
1136
-        return $where;
1137
-    }
1138
-
1139
-
1140
-    /**
1141
-     * Adds the correct registration status to the where conditions for the registrations query.
1142
-     *
1143
-     * @param array $request usually the same as $this->_req_data but not necessarily
1144
-     * @return array
1145
-     */
1146
-    protected function _add_registration_status_to_where_conditions(array $request)
1147
-    {
1148
-        $where = array();
1149
-        $view = EEH_Array::is_set($request, 'status', '');
1150
-        $registration_status = ! empty($request['_reg_status'])
1151
-            ? sanitize_text_field($request['_reg_status'])
1152
-            : '';
1153
-
1154
-        /*
26
+	/**
27
+	 * @var EE_Registration
28
+	 */
29
+	private $_registration;
30
+
31
+	/**
32
+	 * @var EE_Event
33
+	 */
34
+	private $_reg_event;
35
+
36
+	/**
37
+	 * @var EE_Session
38
+	 */
39
+	private $_session;
40
+
41
+	private static $_reg_status;
42
+
43
+	/**
44
+	 * Form for displaying the custom questions for this registration.
45
+	 * This gets used a few times throughout the request so its best to cache it
46
+	 *
47
+	 * @var EE_Registration_Custom_Questions_Form
48
+	 */
49
+	protected $_reg_custom_questions_form = null;
50
+
51
+
52
+	/**
53
+	 *        constructor
54
+	 *
55
+	 * @Constructor
56
+	 * @access public
57
+	 * @param bool $routing
58
+	 * @return Registrations_Admin_Page
59
+	 */
60
+	public function __construct($routing = true)
61
+	{
62
+		parent::__construct($routing);
63
+		add_action('wp_loaded', array($this, 'wp_loaded'));
64
+	}
65
+
66
+
67
+	public function wp_loaded()
68
+	{
69
+		// when adding a new registration...
70
+		if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71
+			EE_System::do_not_cache();
72
+			if (! isset($this->_req_data['processing_registration'])
73
+				 || absint($this->_req_data['processing_registration']) !== 1
74
+			) {
75
+				// and it's NOT the attendee information reg step
76
+				// force cookie expiration by setting time to last week
77
+				setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
78
+				// and update the global
79
+				$_COOKIE['ee_registration_added'] = 0;
80
+			}
81
+		}
82
+	}
83
+
84
+
85
+	protected function _init_page_props()
86
+	{
87
+		$this->page_slug        = REG_PG_SLUG;
88
+		$this->_admin_base_url  = REG_ADMIN_URL;
89
+		$this->_admin_base_path = REG_ADMIN;
90
+		$this->page_label       = esc_html__('Registrations', 'event_espresso');
91
+		$this->_cpt_routes      = array(
92
+			'add_new_attendee' => 'espresso_attendees',
93
+			'edit_attendee'    => 'espresso_attendees',
94
+			'insert_attendee'  => 'espresso_attendees',
95
+			'update_attendee'  => 'espresso_attendees',
96
+		);
97
+		$this->_cpt_model_names = array(
98
+			'add_new_attendee' => 'EEM_Attendee',
99
+			'edit_attendee'    => 'EEM_Attendee',
100
+		);
101
+		$this->_cpt_edit_routes = array(
102
+			'espresso_attendees' => 'edit_attendee',
103
+		);
104
+		$this->_pagenow_map     = array(
105
+			'add_new_attendee' => 'post-new.php',
106
+			'edit_attendee'    => 'post.php',
107
+			'trash'            => 'post.php',
108
+		);
109
+		add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
110
+		//add filters so that the comment urls don't take users to a confusing 404 page
111
+		add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
112
+	}
113
+
114
+
115
+	public function clear_comment_link($link, $comment, $args)
116
+	{
117
+		//gotta make sure this only happens on this route
118
+		$post_type = get_post_type($comment->comment_post_ID);
119
+		if ($post_type === 'espresso_attendees') {
120
+			return '#commentsdiv';
121
+		}
122
+		return $link;
123
+	}
124
+
125
+
126
+	protected function _ajax_hooks()
127
+	{
128
+		//todo: all hooks for registrations ajax goes in here
129
+		add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
130
+	}
131
+
132
+
133
+	protected function _define_page_props()
134
+	{
135
+		$this->_admin_page_title = $this->page_label;
136
+		$this->_labels           = array(
137
+			'buttons'                      => array(
138
+				'add-registrant'      => esc_html__('Add New Registration', 'event_espresso'),
139
+				'add-attendee'        => esc_html__('Add Contact', 'event_espresso'),
140
+				'edit'                => esc_html__('Edit Contact', 'event_espresso'),
141
+				'report'              => esc_html__("Event Registrations CSV Report", "event_espresso"),
142
+				'report_all'          => esc_html__('All Registrations CSV Report', 'event_espresso'),
143
+				'report_filtered'     => esc_html__('Filtered CSV Report', 'event_espresso'),
144
+				'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'),
145
+				'contact_list_export' => esc_html__("Export Data", "event_espresso"),
146
+			),
147
+			'publishbox'                   => array(
148
+				'add_new_attendee' => esc_html__("Add Contact Record", 'event_espresso'),
149
+				'edit_attendee'    => esc_html__("Update Contact Record", 'event_espresso'),
150
+			),
151
+			'hide_add_button_on_cpt_route' => array(
152
+				'edit_attendee' => true,
153
+			),
154
+		);
155
+	}
156
+
157
+
158
+	/**
159
+	 *        grab url requests and route them
160
+	 *
161
+	 * @access private
162
+	 * @return void
163
+	 */
164
+	public function _set_page_routes()
165
+	{
166
+		$this->_get_registration_status_array();
167
+		$reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
168
+			? $this->_req_data['_REG_ID'] : 0;
169
+		$att_id             = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
170
+			? $this->_req_data['ATT_ID'] : 0;
171
+		$att_id             = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post'])
172
+			? $this->_req_data['post']
173
+			: $att_id;
174
+		$this->_page_routes = array(
175
+			'default'                            => array(
176
+				'func'       => '_registrations_overview_list_table',
177
+				'capability' => 'ee_read_registrations',
178
+			),
179
+			'view_registration'                  => array(
180
+				'func'       => '_registration_details',
181
+				'capability' => 'ee_read_registration',
182
+				'obj_id'     => $reg_id,
183
+			),
184
+			'edit_registration'                  => array(
185
+				'func'               => '_update_attendee_registration_form',
186
+				'noheader'           => true,
187
+				'headers_sent_route' => 'view_registration',
188
+				'capability'         => 'ee_edit_registration',
189
+				'obj_id'             => $reg_id,
190
+				'_REG_ID'            => $reg_id,
191
+			),
192
+			'trash_registrations'                => array(
193
+				'func'       => '_trash_or_restore_registrations',
194
+				'args'       => array('trash' => true),
195
+				'noheader'   => true,
196
+				'capability' => 'ee_delete_registrations',
197
+			),
198
+			'restore_registrations'              => array(
199
+				'func'       => '_trash_or_restore_registrations',
200
+				'args'       => array('trash' => false),
201
+				'noheader'   => true,
202
+				'capability' => 'ee_delete_registrations',
203
+			),
204
+			'delete_registrations'               => array(
205
+				'func'       => '_delete_registrations',
206
+				'noheader'   => true,
207
+				'capability' => 'ee_delete_registrations',
208
+			),
209
+			'new_registration'                   => array(
210
+				'func'       => 'new_registration',
211
+				'capability' => 'ee_edit_registrations',
212
+			),
213
+			'process_reg_step'                   => array(
214
+				'func'       => 'process_reg_step',
215
+				'noheader'   => true,
216
+				'capability' => 'ee_edit_registrations',
217
+			),
218
+			'redirect_to_txn'                    => array(
219
+				'func'       => 'redirect_to_txn',
220
+				'noheader'   => true,
221
+				'capability' => 'ee_edit_registrations',
222
+			),
223
+			'change_reg_status'                  => array(
224
+				'func'       => '_change_reg_status',
225
+				'noheader'   => true,
226
+				'capability' => 'ee_edit_registration',
227
+				'obj_id'     => $reg_id,
228
+			),
229
+			'approve_registration'               => array(
230
+				'func'       => 'approve_registration',
231
+				'noheader'   => true,
232
+				'capability' => 'ee_edit_registration',
233
+				'obj_id'     => $reg_id,
234
+			),
235
+			'approve_and_notify_registration'    => array(
236
+				'func'       => 'approve_registration',
237
+				'noheader'   => true,
238
+				'args'       => array(true),
239
+				'capability' => 'ee_edit_registration',
240
+				'obj_id'     => $reg_id,
241
+			),
242
+			'decline_registration'               => array(
243
+				'func'       => 'decline_registration',
244
+				'noheader'   => true,
245
+				'capability' => 'ee_edit_registration',
246
+				'obj_id'     => $reg_id,
247
+			),
248
+			'decline_and_notify_registration'    => array(
249
+				'func'       => 'decline_registration',
250
+				'noheader'   => true,
251
+				'args'       => array(true),
252
+				'capability' => 'ee_edit_registration',
253
+				'obj_id'     => $reg_id,
254
+			),
255
+			'pending_registration'               => array(
256
+				'func'       => 'pending_registration',
257
+				'noheader'   => true,
258
+				'capability' => 'ee_edit_registration',
259
+				'obj_id'     => $reg_id,
260
+			),
261
+			'pending_and_notify_registration'    => array(
262
+				'func'       => 'pending_registration',
263
+				'noheader'   => true,
264
+				'args'       => array(true),
265
+				'capability' => 'ee_edit_registration',
266
+				'obj_id'     => $reg_id,
267
+			),
268
+			'no_approve_registration'            => array(
269
+				'func'       => 'not_approve_registration',
270
+				'noheader'   => true,
271
+				'capability' => 'ee_edit_registration',
272
+				'obj_id'     => $reg_id,
273
+			),
274
+			'no_approve_and_notify_registration' => array(
275
+				'func'       => 'not_approve_registration',
276
+				'noheader'   => true,
277
+				'args'       => array(true),
278
+				'capability' => 'ee_edit_registration',
279
+				'obj_id'     => $reg_id,
280
+			),
281
+			'cancel_registration'                => array(
282
+				'func'       => 'cancel_registration',
283
+				'noheader'   => true,
284
+				'capability' => 'ee_edit_registration',
285
+				'obj_id'     => $reg_id,
286
+			),
287
+			'cancel_and_notify_registration'     => array(
288
+				'func'       => 'cancel_registration',
289
+				'noheader'   => true,
290
+				'args'       => array(true),
291
+				'capability' => 'ee_edit_registration',
292
+				'obj_id'     => $reg_id,
293
+			),
294
+			'contact_list'                       => array(
295
+				'func'       => '_attendee_contact_list_table',
296
+				'capability' => 'ee_read_contacts',
297
+			),
298
+			'add_new_attendee'                   => array(
299
+				'func' => '_create_new_cpt_item',
300
+				'args' => array(
301
+					'new_attendee' => true,
302
+					'capability'   => 'ee_edit_contacts',
303
+				),
304
+			),
305
+			'edit_attendee'                      => array(
306
+				'func'       => '_edit_cpt_item',
307
+				'capability' => 'ee_edit_contacts',
308
+				'obj_id'     => $att_id,
309
+			),
310
+			'duplicate_attendee'                 => array(
311
+				'func'       => '_duplicate_attendee',
312
+				'noheader'   => true,
313
+				'capability' => 'ee_edit_contacts',
314
+				'obj_id'     => $att_id,
315
+			),
316
+			'insert_attendee'                    => array(
317
+				'func'       => '_insert_or_update_attendee',
318
+				'args'       => array(
319
+					'new_attendee' => true,
320
+				),
321
+				'noheader'   => true,
322
+				'capability' => 'ee_edit_contacts',
323
+			),
324
+			'update_attendee'                    => array(
325
+				'func'       => '_insert_or_update_attendee',
326
+				'args'       => array(
327
+					'new_attendee' => false,
328
+				),
329
+				'noheader'   => true,
330
+				'capability' => 'ee_edit_contacts',
331
+				'obj_id'     => $att_id,
332
+			),
333
+			'trash_attendee'                    => array(
334
+				'func'       => '_trash_or_restore_attendees',
335
+				'args'       => array(
336
+					'trash' => true,
337
+				),
338
+				'noheader'   => true,
339
+				'capability' => 'ee_delete_contacts',
340
+				'obj_id'     => $att_id,
341
+			),
342
+			'restore_attendees'                  => array(
343
+				'func'       => '_trash_or_restore_attendees',
344
+				'args'       => array(
345
+					'trash' => false,
346
+				),
347
+				'noheader'   => true,
348
+				'capability' => 'ee_delete_contacts',
349
+				'obj_id'     => $att_id,
350
+			),
351
+			'resend_registration'                => array(
352
+				'func'       => '_resend_registration',
353
+				'noheader'   => true,
354
+				'capability' => 'ee_send_message',
355
+			),
356
+			'registrations_report'               => array(
357
+				'func'       => '_registrations_report',
358
+				'noheader'   => true,
359
+				'capability' => 'ee_read_registrations',
360
+			),
361
+			'contact_list_export'                => array(
362
+				'func'       => '_contact_list_export',
363
+				'noheader'   => true,
364
+				'capability' => 'export',
365
+			),
366
+			'contact_list_report'                => array(
367
+				'func'       => '_contact_list_report',
368
+				'noheader'   => true,
369
+				'capability' => 'ee_read_contacts',
370
+			),
371
+		);
372
+	}
373
+
374
+
375
+	protected function _set_page_config()
376
+	{
377
+		$this->_page_config = array(
378
+			'default'           => array(
379
+				'nav'           => array(
380
+					'label' => esc_html__('Overview', 'event_espresso'),
381
+					'order' => 5,
382
+				),
383
+				'help_tabs'     => array(
384
+					'registrations_overview_help_tab'                       => array(
385
+						'title'    => esc_html__('Registrations Overview', 'event_espresso'),
386
+						'filename' => 'registrations_overview',
387
+					),
388
+					'registrations_overview_table_column_headings_help_tab' => array(
389
+						'title'    => esc_html__('Registrations Table Column Headings', 'event_espresso'),
390
+						'filename' => 'registrations_overview_table_column_headings',
391
+					),
392
+					'registrations_overview_filters_help_tab'               => array(
393
+						'title'    => esc_html__('Registration Filters', 'event_espresso'),
394
+						'filename' => 'registrations_overview_filters',
395
+					),
396
+					'registrations_overview_views_help_tab'                 => array(
397
+						'title'    => esc_html__('Registration Views', 'event_espresso'),
398
+						'filename' => 'registrations_overview_views',
399
+					),
400
+					'registrations_regoverview_other_help_tab'              => array(
401
+						'title'    => esc_html__('Registrations Other', 'event_espresso'),
402
+						'filename' => 'registrations_overview_other',
403
+					),
404
+				),
405
+				'help_tour'     => array('Registration_Overview_Help_Tour'),
406
+				'qtips'         => array('Registration_List_Table_Tips'),
407
+				'list_table'    => 'EE_Registrations_List_Table',
408
+				'require_nonce' => false,
409
+			),
410
+			'view_registration' => array(
411
+				'nav'           => array(
412
+					'label'      => esc_html__('REG Details', 'event_espresso'),
413
+					'order'      => 15,
414
+					'url'        => isset($this->_req_data['_REG_ID'])
415
+						? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
416
+						: $this->_admin_base_url,
417
+					'persistent' => false,
418
+				),
419
+				'help_tabs'     => array(
420
+					'registrations_details_help_tab'                    => array(
421
+						'title'    => esc_html__('Registration Details', 'event_espresso'),
422
+						'filename' => 'registrations_details',
423
+					),
424
+					'registrations_details_table_help_tab'              => array(
425
+						'title'    => esc_html__('Registration Details Table', 'event_espresso'),
426
+						'filename' => 'registrations_details_table',
427
+					),
428
+					'registrations_details_form_answers_help_tab'       => array(
429
+						'title'    => esc_html__('Registration Form Answers', 'event_espresso'),
430
+						'filename' => 'registrations_details_form_answers',
431
+					),
432
+					'registrations_details_registrant_details_help_tab' => array(
433
+						'title'    => esc_html__('Contact Details', 'event_espresso'),
434
+						'filename' => 'registrations_details_registrant_details',
435
+					),
436
+				),
437
+				'help_tour'     => array('Registration_Details_Help_Tour'),
438
+				'metaboxes'     => array_merge(
439
+					$this->_default_espresso_metaboxes,
440
+					array('_registration_details_metaboxes')
441
+				),
442
+				'require_nonce' => false,
443
+			),
444
+			'new_registration'  => array(
445
+				'nav'           => array(
446
+					'label'      => esc_html__('Add New Registration', 'event_espresso'),
447
+					'url'        => '#',
448
+					'order'      => 15,
449
+					'persistent' => false,
450
+				),
451
+				'metaboxes'     => $this->_default_espresso_metaboxes,
452
+				'labels'        => array(
453
+					'publishbox' => esc_html__('Save Registration', 'event_espresso'),
454
+				),
455
+				'require_nonce' => false,
456
+			),
457
+			'add_new_attendee'  => array(
458
+				'nav'           => array(
459
+					'label'      => esc_html__('Add Contact', 'event_espresso'),
460
+					'order'      => 15,
461
+					'persistent' => false,
462
+				),
463
+				'metaboxes'     => array_merge(
464
+					$this->_default_espresso_metaboxes,
465
+					array('_publish_post_box', 'attendee_editor_metaboxes')
466
+				),
467
+				'require_nonce' => false,
468
+			),
469
+			'edit_attendee'     => array(
470
+				'nav'           => array(
471
+					'label'      => esc_html__('Edit Contact', 'event_espresso'),
472
+					'order'      => 15,
473
+					'persistent' => false,
474
+					'url'        => isset($this->_req_data['ATT_ID'])
475
+						? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
476
+						: $this->_admin_base_url,
477
+				),
478
+				'metaboxes'     => array('attendee_editor_metaboxes'),
479
+				'require_nonce' => false,
480
+			),
481
+			'contact_list'      => array(
482
+				'nav'           => array(
483
+					'label' => esc_html__('Contact List', 'event_espresso'),
484
+					'order' => 20,
485
+				),
486
+				'list_table'    => 'EE_Attendee_Contact_List_Table',
487
+				'help_tabs'     => array(
488
+					'registrations_contact_list_help_tab'                       => array(
489
+						'title'    => esc_html__('Registrations Contact List', 'event_espresso'),
490
+						'filename' => 'registrations_contact_list',
491
+					),
492
+					'registrations_contact-list_table_column_headings_help_tab' => array(
493
+						'title'    => esc_html__('Contact List Table Column Headings', 'event_espresso'),
494
+						'filename' => 'registrations_contact_list_table_column_headings',
495
+					),
496
+					'registrations_contact_list_views_help_tab'                 => array(
497
+						'title'    => esc_html__('Contact List Views', 'event_espresso'),
498
+						'filename' => 'registrations_contact_list_views',
499
+					),
500
+					'registrations_contact_list_other_help_tab'                 => array(
501
+						'title'    => esc_html__('Contact List Other', 'event_espresso'),
502
+						'filename' => 'registrations_contact_list_other',
503
+					),
504
+				),
505
+				'help_tour'     => array('Contact_List_Help_Tour'),
506
+				'metaboxes'     => array(),
507
+				'require_nonce' => false,
508
+			),
509
+			//override default cpt routes
510
+			'create_new'        => '',
511
+			'edit'              => '',
512
+		);
513
+	}
514
+
515
+
516
+	/**
517
+	 * The below methods aren't used by this class currently
518
+	 */
519
+	protected function _add_screen_options()
520
+	{
521
+	}
522
+
523
+
524
+	protected function _add_feature_pointers()
525
+	{
526
+	}
527
+
528
+
529
+	public function admin_init()
530
+	{
531
+		EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__(
532
+			'click "Update Registration Questions" to save your changes',
533
+			'event_espresso'
534
+		);
535
+	}
536
+
537
+
538
+	public function admin_notices()
539
+	{
540
+	}
541
+
542
+
543
+	public function admin_footer_scripts()
544
+	{
545
+	}
546
+
547
+
548
+	/**
549
+	 *        get list of registration statuses
550
+	 *
551
+	 * @access private
552
+	 * @return void
553
+	 */
554
+	private function _get_registration_status_array()
555
+	{
556
+		self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
557
+	}
558
+
559
+
560
+	protected function _add_screen_options_default()
561
+	{
562
+		$this->_per_page_screen_option();
563
+	}
564
+
565
+
566
+	protected function _add_screen_options_contact_list()
567
+	{
568
+		$page_title              = $this->_admin_page_title;
569
+		$this->_admin_page_title = esc_html__("Contacts", 'event_espresso');
570
+		$this->_per_page_screen_option();
571
+		$this->_admin_page_title = $page_title;
572
+	}
573
+
574
+
575
+	public function load_scripts_styles()
576
+	{
577
+		//style
578
+		wp_register_style(
579
+			'espresso_reg',
580
+			REG_ASSETS_URL . 'espresso_registrations_admin.css',
581
+			array('ee-admin-css'),
582
+			EVENT_ESPRESSO_VERSION
583
+		);
584
+		wp_enqueue_style('espresso_reg');
585
+		//script
586
+		wp_register_script(
587
+			'espresso_reg',
588
+			REG_ASSETS_URL . 'espresso_registrations_admin.js',
589
+			array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'),
590
+			EVENT_ESPRESSO_VERSION,
591
+			true
592
+		);
593
+		wp_enqueue_script('espresso_reg');
594
+	}
595
+
596
+
597
+	public function load_scripts_styles_edit_attendee()
598
+	{
599
+		//stuff to only show up on our attendee edit details page.
600
+		$attendee_details_translations = array(
601
+			'att_publish_text' => sprintf(
602
+				esc_html__('Created on: <b>%1$s</b>', 'event_espresso'),
603
+				$this->_cpt_model_obj->get_datetime('ATT_created')
604
+			),
605
+		);
606
+		wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
607
+		wp_enqueue_script('jquery-validate');
608
+	}
609
+
610
+
611
+	public function load_scripts_styles_view_registration()
612
+	{
613
+		//styles
614
+		wp_enqueue_style('espresso-ui-theme');
615
+		//scripts
616
+		$this->_get_reg_custom_questions_form($this->_registration->ID());
617
+		$this->_reg_custom_questions_form->wp_enqueue_scripts(true);
618
+	}
619
+
620
+
621
+	public function load_scripts_styles_contact_list()
622
+	{
623
+		wp_deregister_style('espresso_reg');
624
+		wp_register_style(
625
+			'espresso_att',
626
+			REG_ASSETS_URL . 'espresso_attendees_admin.css',
627
+			array('ee-admin-css'),
628
+			EVENT_ESPRESSO_VERSION
629
+		);
630
+		wp_enqueue_style('espresso_att');
631
+	}
632
+
633
+
634
+	public function load_scripts_styles_new_registration()
635
+	{
636
+		wp_register_script(
637
+			'ee-spco-for-admin',
638
+			REG_ASSETS_URL . 'spco_for_admin.js',
639
+			array('underscore', 'jquery'),
640
+			EVENT_ESPRESSO_VERSION,
641
+			true
642
+		);
643
+		wp_enqueue_script('ee-spco-for-admin');
644
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
645
+		EE_Form_Section_Proper::wp_enqueue_scripts();
646
+		EED_Ticket_Selector::load_tckt_slctr_assets();
647
+		EE_Datepicker_Input::enqueue_styles_and_scripts();
648
+	}
649
+
650
+
651
+	public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
652
+	{
653
+		add_filter('FHEE_load_EE_messages', '__return_true');
654
+	}
655
+
656
+
657
+	public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
658
+	{
659
+		add_filter('FHEE_load_EE_messages', '__return_true');
660
+	}
661
+
662
+
663
+	protected function _set_list_table_views_default()
664
+	{
665
+		//for notification related bulk actions we need to make sure only active messengers have an option.
666
+		EED_Messages::set_autoloaders();
667
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
668
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
669
+		$active_mts               = $message_resource_manager->list_of_active_message_types();
670
+		//key= bulk_action_slug, value= message type.
671
+		$match_array = array(
672
+			'approve_registration'    => 'registration',
673
+			'decline_registration'    => 'declined_registration',
674
+			'pending_registration'    => 'pending_approval',
675
+			'no_approve_registration' => 'not_approved_registration',
676
+			'cancel_registration'     => 'cancelled_registration',
677
+		);
678
+		/** setup reg status bulk actions **/
679
+		$def_reg_status_actions['approve_registration'] = esc_html__('Approve Registrations', 'event_espresso');
680
+		if (in_array($match_array['approve_registration'], $active_mts)
681
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
682
+		) {
683
+			$def_reg_status_actions['approve_and_notify_registration'] = esc_html__(
684
+				'Approve and Notify Registrations',
685
+				'event_espresso'
686
+			);
687
+		}
688
+		$def_reg_status_actions['decline_registration'] = esc_html__('Decline Registrations', 'event_espresso');
689
+		if (in_array($match_array['decline_registration'], $active_mts)
690
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
691
+		) {
692
+			$def_reg_status_actions['decline_and_notify_registration'] = esc_html__(
693
+				'Decline and Notify Registrations',
694
+				'event_espresso'
695
+			);
696
+		}
697
+		$def_reg_status_actions['pending_registration'] = esc_html__(
698
+			'Set Registrations to Pending Payment',
699
+			'event_espresso'
700
+		);
701
+		if (in_array($match_array['pending_registration'], $active_mts)
702
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
703
+		) {
704
+			$def_reg_status_actions['pending_and_notify_registration'] = esc_html__(
705
+				'Set Registrations to Pending Payment and Notify',
706
+				'event_espresso'
707
+			);
708
+		}
709
+		$def_reg_status_actions['no_approve_registration'] = esc_html__(
710
+			'Set Registrations to Not Approved',
711
+			'event_espresso'
712
+		);
713
+		if (in_array($match_array['no_approve_registration'], $active_mts)
714
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
715
+		) {
716
+			$def_reg_status_actions['no_approve_and_notify_registration'] = esc_html__(
717
+				'Set Registrations to Not Approved and Notify',
718
+				'event_espresso'
719
+			);
720
+		}
721
+		$def_reg_status_actions['cancel_registration'] = esc_html__('Cancel Registrations', 'event_espresso');
722
+		if (in_array($match_array['cancel_registration'], $active_mts)
723
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
724
+		) {
725
+			$def_reg_status_actions['cancel_and_notify_registration'] = esc_html__(
726
+				'Cancel Registrations and Notify',
727
+				'event_espresso'
728
+			);
729
+		}
730
+		$this->_views = array(
731
+			'all'   => array(
732
+				'slug'        => 'all',
733
+				'label'       => esc_html__('View All Registrations', 'event_espresso'),
734
+				'count'       => 0,
735
+				'bulk_action' => array_merge($def_reg_status_actions, array(
736
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
737
+				)),
738
+			),
739
+			'month' => array(
740
+				'slug'        => 'month',
741
+				'label'       => esc_html__('This Month', 'event_espresso'),
742
+				'count'       => 0,
743
+				'bulk_action' => array_merge($def_reg_status_actions, array(
744
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
745
+				)),
746
+			),
747
+			'today' => array(
748
+				'slug'        => 'today',
749
+				'label'       => sprintf(
750
+					esc_html__('Today - %s', 'event_espresso'),
751
+					date('M d, Y', current_time('timestamp'))
752
+				),
753
+				'count'       => 0,
754
+				'bulk_action' => array_merge($def_reg_status_actions, array(
755
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
756
+				)),
757
+			),
758
+		);
759
+		if (EE_Registry::instance()->CAP->current_user_can(
760
+			'ee_delete_registrations',
761
+			'espresso_registrations_delete_registration'
762
+		)) {
763
+			$this->_views['incomplete'] = array(
764
+				'slug'        => 'incomplete',
765
+				'label'       => esc_html__('Incomplete', 'event_espresso'),
766
+				'count'       => 0,
767
+				'bulk_action' => array(
768
+					'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'),
769
+				),
770
+			);
771
+			$this->_views['trash']      = array(
772
+				'slug'        => 'trash',
773
+				'label'       => esc_html__('Trash', 'event_espresso'),
774
+				'count'       => 0,
775
+				'bulk_action' => array(
776
+					'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'),
777
+					'delete_registrations'  => esc_html__('Delete Registrations Permanently', 'event_espresso'),
778
+				),
779
+			);
780
+		}
781
+	}
782
+
783
+
784
+	protected function _set_list_table_views_contact_list()
785
+	{
786
+		$this->_views = array(
787
+			'in_use' => array(
788
+				'slug'        => 'in_use',
789
+				'label'       => esc_html__('In Use', 'event_espresso'),
790
+				'count'       => 0,
791
+				'bulk_action' => array(
792
+					'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'),
793
+				),
794
+			),
795
+		);
796
+		if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts',
797
+			'espresso_registrations_trash_attendees')
798
+		) {
799
+			$this->_views['trash'] = array(
800
+				'slug'        => 'trash',
801
+				'label'       => esc_html__('Trash', 'event_espresso'),
802
+				'count'       => 0,
803
+				'bulk_action' => array(
804
+					'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'),
805
+				),
806
+			);
807
+		}
808
+	}
809
+
810
+
811
+	protected function _registration_legend_items()
812
+	{
813
+		$fc_items = array(
814
+			'star-icon'        => array(
815
+				'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
816
+				'desc'  => esc_html__('This is the Primary Registrant', 'event_espresso'),
817
+			),
818
+			'view_details'     => array(
819
+				'class' => 'dashicons dashicons-clipboard',
820
+				'desc'  => esc_html__('View Registration Details', 'event_espresso'),
821
+			),
822
+			'edit_attendee'    => array(
823
+				'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
824
+				'desc'  => esc_html__('Edit Contact Details', 'event_espresso'),
825
+			),
826
+			'view_transaction' => array(
827
+				'class' => 'dashicons dashicons-cart',
828
+				'desc'  => esc_html__('View Transaction Details', 'event_espresso'),
829
+			),
830
+			'view_invoice'     => array(
831
+				'class' => 'dashicons dashicons-media-spreadsheet',
832
+				'desc'  => esc_html__('View Transaction Invoice', 'event_espresso'),
833
+			),
834
+		);
835
+		if (EE_Registry::instance()->CAP->current_user_can(
836
+			'ee_send_message',
837
+			'espresso_registrations_resend_registration'
838
+		)) {
839
+			$fc_items['resend_registration'] = array(
840
+				'class' => 'dashicons dashicons-email-alt',
841
+				'desc'  => esc_html__('Resend Registration Details', 'event_espresso'),
842
+			);
843
+		} else {
844
+			$fc_items['blank'] = array('class' => 'blank', 'desc' => '');
845
+		}
846
+		if (EE_Registry::instance()->CAP->current_user_can(
847
+			'ee_read_global_messages',
848
+			'view_filtered_messages'
849
+		)) {
850
+			$related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
851
+			if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
852
+				$fc_items['view_related_messages'] = array(
853
+					'class' => $related_for_icon['css_class'],
854
+					'desc'  => $related_for_icon['label'],
855
+				);
856
+			}
857
+		}
858
+		$sc_items = array(
859
+			'approved_status'   => array(
860
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
861
+				'desc'  => EEH_Template::pretty_status(
862
+					EEM_Registration::status_id_approved,
863
+					false,
864
+					'sentence'
865
+				),
866
+			),
867
+			'pending_status'    => array(
868
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
869
+				'desc'  => EEH_Template::pretty_status(
870
+					EEM_Registration::status_id_pending_payment,
871
+					false,
872
+					'sentence'
873
+				),
874
+			),
875
+			'wait_list'         => array(
876
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
877
+				'desc'  => EEH_Template::pretty_status(
878
+					EEM_Registration::status_id_wait_list,
879
+					false,
880
+					'sentence'
881
+				),
882
+			),
883
+			'incomplete_status' => array(
884
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
885
+				'desc'  => EEH_Template::pretty_status(
886
+					EEM_Registration::status_id_incomplete,
887
+					false,
888
+					'sentence'
889
+				),
890
+			),
891
+			'not_approved'      => array(
892
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
893
+				'desc'  => EEH_Template::pretty_status(
894
+					EEM_Registration::status_id_not_approved,
895
+					false,
896
+					'sentence'
897
+				),
898
+			),
899
+			'declined_status'   => array(
900
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
901
+				'desc'  => EEH_Template::pretty_status(
902
+					EEM_Registration::status_id_declined,
903
+					false,
904
+					'sentence'
905
+				),
906
+			),
907
+			'cancelled_status'  => array(
908
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
909
+				'desc'  => EEH_Template::pretty_status(
910
+					EEM_Registration::status_id_cancelled,
911
+					false,
912
+					'sentence'
913
+				),
914
+			),
915
+		);
916
+		return array_merge($fc_items, $sc_items);
917
+	}
918
+
919
+
920
+
921
+	/***************************************        REGISTRATION OVERVIEW        **************************************/
922
+	/**
923
+	 * @throws \EE_Error
924
+	 */
925
+	protected function _registrations_overview_list_table()
926
+	{
927
+		$this->_template_args['admin_page_header'] = '';
928
+		$EVT_ID                                    = ! empty($this->_req_data['event_id'])
929
+			? absint($this->_req_data['event_id'])
930
+			: 0;
931
+		if ($EVT_ID) {
932
+			if (EE_Registry::instance()->CAP->current_user_can(
933
+				'ee_edit_registrations',
934
+				'espresso_registrations_new_registration',
935
+				$EVT_ID
936
+			)) {
937
+				$this->_admin_page_title .= ' ' . $this->get_action_link_or_button(
938
+					'new_registration',
939
+					'add-registrant',
940
+					array('event_id' => $EVT_ID),
941
+					'add-new-h2'
942
+				);
943
+			}
944
+			$event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
945
+			if ($event instanceof EE_Event) {
946
+				$this->_template_args['admin_page_header'] = sprintf(
947
+					esc_html__(
948
+						'%s Viewing registrations for the event: %s%s',
949
+						'event_espresso'
950
+					),
951
+					'<h3 style="line-height:1.5em;">',
952
+					'<br /><a href="'
953
+						. EE_Admin_Page::add_query_args_and_nonce(
954
+							array(
955
+								'action' => 'edit',
956
+								'post'   => $event->ID(),
957
+							),
958
+							EVENTS_ADMIN_URL
959
+						)
960
+						. '">&nbsp;'
961
+						. $event->get('EVT_name')
962
+						. '&nbsp;</a>&nbsp;',
963
+					'</h3>'
964
+				);
965
+			}
966
+			$DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
967
+			$datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
968
+			if ($datetime instanceof EE_Datetime && $this->_template_args['admin_page_header'] !== '') {
969
+				$this->_template_args['admin_page_header'] = substr(
970
+					$this->_template_args['admin_page_header'],
971
+					0,
972
+					-5
973
+				);
974
+				$this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
975
+				$this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
976
+				$this->_template_args['admin_page_header'] .= $datetime->name();
977
+				$this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
978
+				$this->_template_args['admin_page_header'] .= '</span></h3>';
979
+			}
980
+		}
981
+		$this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
982
+		$this->display_admin_list_table_page_with_no_sidebar();
983
+	}
984
+
985
+
986
+	/**
987
+	 * This sets the _registration property for the registration details screen
988
+	 *
989
+	 * @access private
990
+	 * @return bool
991
+	 */
992
+	private function _set_registration_object()
993
+	{
994
+		//get out if we've already set the object
995
+		if (is_object($this->_registration)) {
996
+			return true;
997
+		}
998
+		$REG    = EEM_Registration::instance();
999
+		$REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
1000
+		if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
1001
+			return true;
1002
+		} else {
1003
+			$error_msg = sprintf(
1004
+				esc_html__(
1005
+					'An error occurred and the details for Registration ID #%s could not be retrieved.',
1006
+					'event_espresso'
1007
+				),
1008
+				$REG_ID
1009
+			);
1010
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
1011
+			$this->_registration = null;
1012
+			return false;
1013
+		}
1014
+	}
1015
+
1016
+
1017
+	/**
1018
+	 * Used to retrieve registrations for the list table.
1019
+	 *
1020
+	 * @param int  $per_page
1021
+	 * @param bool $count
1022
+	 * @param bool $this_month
1023
+	 * @param bool $today
1024
+	 * @return EE_Registration[]|int
1025
+	 * @throws EE_Error
1026
+	 */
1027
+	public function get_registrations(
1028
+		$per_page = 10,
1029
+		$count = false,
1030
+		$this_month = false,
1031
+		$today = false
1032
+	) {
1033
+		if ($this_month) {
1034
+			$this->_req_data['status'] = 'month';
1035
+		}
1036
+		if ($today) {
1037
+			$this->_req_data['status'] = 'today';
1038
+		}
1039
+		$query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
1040
+		/**
1041
+		 * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
1042
+		 * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
1043
+		 * @see EEM_Base::get_all()
1044
+		 */
1045
+		$query_params['group_by'] = '';
1046
+
1047
+		return $count
1048
+			? EEM_Registration::instance()->count($query_params)
1049
+			/** @type EE_Registration[] */
1050
+			: EEM_Registration::instance()->get_all($query_params);
1051
+	}
1052
+
1053
+
1054
+
1055
+	/**
1056
+	 * Retrieves the query parameters to be used by the Registration model for getting registrations.
1057
+	 * Note: this listens to values on the request for some of the query parameters.
1058
+	 *
1059
+	 * @param array $request
1060
+	 * @param int    $per_page
1061
+	 * @param bool   $count
1062
+	 * @return array
1063
+	 */
1064
+	protected function _get_registration_query_parameters(
1065
+		$request = array(),
1066
+		$per_page = 10,
1067
+		$count = false
1068
+	) {
1069
+
1070
+		$query_params = array(
1071
+			0                          => $this->_get_where_conditions_for_registrations_query(
1072
+				$request
1073
+			),
1074
+			'caps'                     => EEM_Registration::caps_read_admin,
1075
+			'default_where_conditions' => 'this_model_only',
1076
+		);
1077
+		if (! $count) {
1078
+			$query_params = array_merge(
1079
+				$query_params,
1080
+				$this->_get_orderby_for_registrations_query(),
1081
+				$this->_get_limit($per_page)
1082
+			);
1083
+		}
1084
+
1085
+		return $query_params;
1086
+	}
1087
+
1088
+
1089
+	/**
1090
+	 * This will add EVT_ID to the provided $where array for EE model query parameters.
1091
+	 *
1092
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1093
+	 * @return array
1094
+	 */
1095
+	protected function _add_event_id_to_where_conditions(array $request)
1096
+	{
1097
+		$where = array();
1098
+		if (! empty($request['event_id'])) {
1099
+			$where['EVT_ID'] = absint($request['event_id']);
1100
+		}
1101
+		return $where;
1102
+	}
1103
+
1104
+
1105
+	/**
1106
+	 * Adds category ID if it exists in the request to the where conditions for the registrations query.
1107
+	 *
1108
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1109
+	 * @return array
1110
+	 */
1111
+	protected function _add_category_id_to_where_conditions(array $request)
1112
+	{
1113
+		$where = array();
1114
+		if (! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1115
+			$where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1116
+		}
1117
+		return $where;
1118
+	}
1119
+
1120
+
1121
+	/**
1122
+	 * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1123
+	 *
1124
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1125
+	 * @return array
1126
+	 */
1127
+	protected function _add_datetime_id_to_where_conditions(array $request)
1128
+	{
1129
+		$where = array();
1130
+		if (! empty($request['datetime_id'])) {
1131
+			$where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1132
+		}
1133
+		if (! empty($request['DTT_ID'])) {
1134
+			$where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1135
+		}
1136
+		return $where;
1137
+	}
1138
+
1139
+
1140
+	/**
1141
+	 * Adds the correct registration status to the where conditions for the registrations query.
1142
+	 *
1143
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1144
+	 * @return array
1145
+	 */
1146
+	protected function _add_registration_status_to_where_conditions(array $request)
1147
+	{
1148
+		$where = array();
1149
+		$view = EEH_Array::is_set($request, 'status', '');
1150
+		$registration_status = ! empty($request['_reg_status'])
1151
+			? sanitize_text_field($request['_reg_status'])
1152
+			: '';
1153
+
1154
+		/*
1155 1155
          * If filtering by registration status, then we show registrations matching that status.
1156 1156
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations
1157 1157
          * UNLESS viewing trashed registrations.
1158 1158
          */
1159
-        if (! empty($registration_status)) {
1160
-            $where['STS_ID'] = $registration_status;
1161
-        } else {
1162
-            //make sure we exclude incomplete registrations, but only if not trashed.
1163
-            if ($view === 'trash') {
1164
-                $where['REG_deleted'] = true;
1165
-            } elseif ($view === 'incomplete') {
1166
-                $where['STS_ID'] = EEM_Registration::status_id_incomplete;
1167
-            } else {
1168
-                $where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1169
-            }
1170
-        }
1171
-        return $where;
1172
-    }
1173
-
1174
-
1175
-    /**
1176
-     * Adds any provided date restraints to the where conditions for the registrations query.
1177
-     *
1178
-     * @param array $request usually the same as $this->_req_data but not necessarily
1179
-     * @return array
1180
-     * @throws EE_Error
1181
-     */
1182
-    protected function _add_date_to_where_conditions(array $request)
1183
-    {
1184
-        $where = array();
1185
-        $view = EEH_Array::is_set($request, 'status', '');
1186
-        $month_range             = ! empty($request['month_range'])
1187
-            ? sanitize_text_field($request['month_range'])
1188
-            : '';
1189
-        $retrieve_for_today      = $view === 'today';
1190
-        $retrieve_for_this_month = $view === 'month';
1191
-
1192
-        if ($retrieve_for_today) {
1193
-            $now               = date('Y-m-d', current_time('timestamp'));
1194
-            $where['REG_date'] = array(
1195
-                'BETWEEN',
1196
-                array(
1197
-                    EEM_Registration::instance()->convert_datetime_for_query(
1198
-                        'REG_date',
1199
-                        $now . ' 00:00:00',
1200
-                        'Y-m-d H:i:s'
1201
-                    ),
1202
-                    EEM_Registration::instance()->convert_datetime_for_query(
1203
-                        'REG_date',
1204
-                        $now . ' 23:59:59',
1205
-                        'Y-m-d H:i:s'
1206
-                    ),
1207
-                ),
1208
-            );
1209
-        } elseif ($retrieve_for_this_month) {
1210
-            $current_year_and_month = date('Y-m', current_time('timestamp'));
1211
-            $days_this_month        = date('t', current_time('timestamp'));
1212
-            $where['REG_date']      = array(
1213
-                'BETWEEN',
1214
-                array(
1215
-                    EEM_Registration::instance()->convert_datetime_for_query(
1216
-                        'REG_date',
1217
-                        $current_year_and_month . '-01 00:00:00',
1218
-                        'Y-m-d H:i:s'
1219
-                    ),
1220
-                    EEM_Registration::instance()->convert_datetime_for_query(
1221
-                        'REG_date',
1222
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1223
-                        'Y-m-d H:i:s'
1224
-                    ),
1225
-                ),
1226
-            );
1227
-        } elseif ($month_range) {
1228
-            $pieces          = explode(' ', $month_range, 3);
1229
-            $month_requested = ! empty($pieces[0])
1230
-                ? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1231
-                : '';
1232
-            $year_requested  = ! empty($pieces[1])
1233
-                ? $pieces[1]
1234
-                : '';
1235
-            //if there is not a month or year then we can't go further
1236
-            if ($month_requested && $year_requested) {
1237
-                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1238
-                $where['REG_date'] = array(
1239
-                    'BETWEEN',
1240
-                    array(
1241
-                        EEM_Registration::instance()->convert_datetime_for_query(
1242
-                            'REG_date',
1243
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1244
-                            'Y-m-d H:i:s'
1245
-                        ),
1246
-                        EEM_Registration::instance()->convert_datetime_for_query(
1247
-                            'REG_date',
1248
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1249
-                            'Y-m-d H:i:s'
1250
-                        ),
1251
-                    ),
1252
-                );
1253
-            }
1254
-        }
1255
-        return $where;
1256
-    }
1257
-
1258
-
1259
-    /**
1260
-     * Adds any provided search restraints to the where conditions for the registrations query
1261
-     *
1262
-     * @param array $request usually the same as $this->_req_data but not necessarily
1263
-     * @return array
1264
-     */
1265
-    protected function _add_search_to_where_conditions(array $request)
1266
-    {
1267
-        $where = array();
1268
-        if (! empty($request['s'])) {
1269
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1270
-            $where['OR*search_conditions'] = array(
1271
-                'Event.EVT_name'                          => array('LIKE', $search_string),
1272
-                'Event.EVT_desc'                          => array('LIKE', $search_string),
1273
-                'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1274
-                'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1275
-                'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1276
-                'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1277
-                'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1278
-                'Attendee.ATT_email'                      => array('LIKE', $search_string),
1279
-                'Attendee.ATT_address'                    => array('LIKE', $search_string),
1280
-                'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1281
-                'Attendee.ATT_city'                       => array('LIKE', $search_string),
1282
-                'REG_final_price'                         => array('LIKE', $search_string),
1283
-                'REG_code'                                => array('LIKE', $search_string),
1284
-                'REG_count'                               => array('LIKE', $search_string),
1285
-                'REG_group_size'                          => array('LIKE', $search_string),
1286
-                'Ticket.TKT_name'                         => array('LIKE', $search_string),
1287
-                'Ticket.TKT_description'                  => array('LIKE', $search_string),
1288
-                'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1289
-            );
1290
-        }
1291
-        return $where;
1292
-    }
1293
-
1294
-
1295
-    /**
1296
-     * Sets up the where conditions for the registrations query.
1297
-     *
1298
-     * @param array $request
1299
-     * @return array
1300
-     * @throws EE_Error
1301
-     */
1302
-    protected function _get_where_conditions_for_registrations_query($request)
1303
-    {
1304
-        return apply_filters(
1305
-            'FHEE__Registrations_Admin_Page___get_where_conditions_for_registrations_query',
1306
-            array_merge(
1307
-                $this->_add_event_id_to_where_conditions($request),
1308
-                $this->_add_category_id_to_where_conditions($request),
1309
-                $this->_add_datetime_id_to_where_conditions($request),
1310
-                $this->_add_registration_status_to_where_conditions($request),
1311
-                $this->_add_date_to_where_conditions($request),
1312
-                $this->_add_search_to_where_conditions($request)
1313
-            ),
1314
-            $request
1315
-        );
1316
-    }
1317
-
1318
-
1319
-    /**
1320
-     * Sets up the orderby for the registrations query.
1321
-     *
1322
-     * @return array
1323
-     */
1324
-    protected function _get_orderby_for_registrations_query()
1325
-    {
1326
-        $orderby_field = ! empty($this->_req_data['orderby'])
1327
-            ? sanitize_text_field($this->_req_data['orderby'])
1328
-            : '';
1329
-        switch ($orderby_field) {
1330
-            case '_REG_ID':
1331
-                $orderby_field = 'REG_ID';
1332
-                break;
1333
-            case '_Reg_status':
1334
-                $orderby_field = 'STS_ID';
1335
-                break;
1336
-            case 'ATT_fname':
1337
-                $orderby_field = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1338
-                break;
1339
-            case 'ATT_lname':
1340
-                $orderby_field = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1341
-                break;
1342
-            case 'event_name':
1343
-                $orderby_field = 'Event.EVT_name';
1344
-                break;
1345
-            case 'DTT_EVT_start':
1346
-                $orderby_field = 'Event.Datetime.DTT_EVT_start';
1347
-                break;
1348
-            default: //'REG_date'
1349
-                $orderby_field = 'REG_date';
1350
-        }
1351
-
1352
-        //order
1353
-        $order = ! empty($this->_req_data['order'])
1354
-            ? sanitize_text_field($this->_req_data['order'])
1355
-            : 'DESC';
1356
-
1357
-        //mutate orderby_field
1358
-        $orderby_field = array_combine(
1359
-            (array) $orderby_field,
1360
-            array_fill(0, count($orderby_field), $order)
1361
-        );
1362
-        return array('order_by' => $orderby_field);
1363
-    }
1364
-
1365
-
1366
-    /**
1367
-     * Sets up the limit for the registrations query.
1368
-     *
1369
-     * @param $per_page
1370
-     * @return array
1371
-     */
1372
-    protected function _get_limit($per_page)
1373
-    {
1374
-        $current_page = ! empty($this->_req_data['paged'])
1375
-            ? absint($this->_req_data['paged'])
1376
-            : 1;
1377
-        $per_page     = ! empty($this->_req_data['perpage'])
1378
-            ? $this->_req_data['perpage']
1379
-            : $per_page;
1380
-
1381
-        //-1 means return all results so get out if that's set.
1382
-        if ((int)$per_page === -1) {
1383
-            return array();
1384
-        }
1385
-        $per_page = absint($per_page);
1386
-        $offset   = ($current_page - 1) * $per_page;
1387
-        return array('limit' => array($offset, $per_page));
1388
-    }
1389
-
1390
-
1391
-    public function get_registration_status_array()
1392
-    {
1393
-        return self::$_reg_status;
1394
-    }
1395
-
1396
-
1397
-
1398
-
1399
-    /***************************************        REGISTRATION DETAILS        ***************************************/
1400
-    /**
1401
-     *        generates HTML for the View Registration Details Admin page
1402
-     *
1403
-     * @access protected
1404
-     * @return void
1405
-     * @throws DomainException
1406
-     * @throws EE_Error
1407
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1408
-     */
1409
-    protected function _registration_details()
1410
-    {
1411
-        $this->_template_args = array();
1412
-        $this->_set_registration_object();
1413
-        if (is_object($this->_registration)) {
1414
-            $transaction                                   = $this->_registration->transaction()
1415
-                ? $this->_registration->transaction()
1416
-                : EE_Transaction::new_instance();
1417
-            $this->_session                                = $transaction->session_data();
1418
-            $event_id                                      = $this->_registration->event_ID();
1419
-            $this->_template_args['reg_nmbr']['value']     = $this->_registration->ID();
1420
-            $this->_template_args['reg_nmbr']['label']     = esc_html__('Registration Number', 'event_espresso');
1421
-            $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1422
-            $this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1423
-            $this->_template_args['grand_total']           = $transaction->total();
1424
-            $this->_template_args['currency_sign']         = EE_Registry::instance()->CFG->currency->sign;
1425
-            // link back to overview
1426
-            $this->_template_args['reg_overview_url']            = REG_ADMIN_URL;
1427
-            $this->_template_args['registration']                = $this->_registration;
1428
-            $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1429
-                array(
1430
-                    'action'   => 'default',
1431
-                    'event_id' => $event_id,
1432
-                ),
1433
-                REG_ADMIN_URL
1434
-            );
1435
-            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1436
-                array(
1437
-                    'action' => 'default',
1438
-                    'EVT_ID' => $event_id,
1439
-                    'page'   => 'espresso_transactions',
1440
-                ),
1441
-                admin_url('admin.php')
1442
-            );
1443
-            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1444
-                array(
1445
-                    'page'   => 'espresso_events',
1446
-                    'action' => 'edit',
1447
-                    'post'   => $event_id,
1448
-                ),
1449
-                admin_url('admin.php')
1450
-            );
1451
-            //next and previous links
1452
-            $next_reg                                      = $this->_registration->next(
1453
-                null,
1454
-                array(),
1455
-                'REG_ID'
1456
-            );
1457
-            $this->_template_args['next_registration']     = $next_reg
1458
-                ? $this->_next_link(
1459
-                    EE_Admin_Page::add_query_args_and_nonce(
1460
-                        array(
1461
-                            'action'  => 'view_registration',
1462
-                            '_REG_ID' => $next_reg['REG_ID'],
1463
-                        ),
1464
-                        REG_ADMIN_URL
1465
-                    ),
1466
-                    'dashicons dashicons-arrow-right ee-icon-size-22'
1467
-                )
1468
-                : '';
1469
-            $previous_reg                                  = $this->_registration->previous(
1470
-                null,
1471
-                array(),
1472
-                'REG_ID'
1473
-            );
1474
-            $this->_template_args['previous_registration'] = $previous_reg
1475
-                ? $this->_previous_link(
1476
-                    EE_Admin_Page::add_query_args_and_nonce(
1477
-                        array(
1478
-                            'action'  => 'view_registration',
1479
-                            '_REG_ID' => $previous_reg['REG_ID'],
1480
-                        ),
1481
-                        REG_ADMIN_URL
1482
-                    ),
1483
-                    'dashicons dashicons-arrow-left ee-icon-size-22'
1484
-                )
1485
-                : '';
1486
-            // grab header
1487
-            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1488
-            $this->_template_args['REG_ID']            = $this->_registration->ID();
1489
-            $this->_template_args['admin_page_header'] = EEH_Template::display_template(
1490
-                $template_path,
1491
-                $this->_template_args,
1492
-                true
1493
-            );
1494
-        } else {
1495
-            $this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1496
-        }
1497
-        // the details template wrapper
1498
-        $this->display_admin_page_with_sidebar();
1499
-    }
1500
-
1501
-
1502
-    protected function _registration_details_metaboxes()
1503
-    {
1504
-        do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1505
-        $this->_set_registration_object();
1506
-        $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1507
-        add_meta_box('edit-reg-status-mbox', esc_html__('Registration Status', 'event_espresso'),
1508
-            array($this, 'set_reg_status_buttons_metabox'), $this->wp_page_slug, 'normal', 'high');
1509
-        add_meta_box('edit-reg-details-mbox', esc_html__('Registration Details', 'event_espresso'),
1510
-            array($this, '_reg_details_meta_box'), $this->wp_page_slug, 'normal', 'high');
1511
-        if ($attendee instanceof EE_Attendee
1512
-            && EE_Registry::instance()->CAP->current_user_can(
1513
-                'ee_edit_registration',
1514
-                'edit-reg-questions-mbox'
1515
-            )
1516
-        ) {
1517
-            add_meta_box(
1518
-                'edit-reg-questions-mbox',
1519
-                esc_html__('Registration Form Answers', 'event_espresso'),
1520
-                array($this, '_reg_questions_meta_box'),
1521
-                $this->wp_page_slug,
1522
-                'normal',
1523
-                'high'
1524
-            );
1525
-        }
1526
-        add_meta_box(
1527
-            'edit-reg-registrant-mbox',
1528
-            esc_html__('Contact Details', 'event_espresso'),
1529
-            array($this, '_reg_registrant_side_meta_box'),
1530
-            $this->wp_page_slug,
1531
-            'side',
1532
-            'high'
1533
-        );
1534
-        if ($this->_registration->group_size() > 1) {
1535
-            add_meta_box(
1536
-                'edit-reg-attendees-mbox',
1537
-                esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1538
-                array($this, '_reg_attendees_meta_box'),
1539
-                $this->wp_page_slug,
1540
-                'normal',
1541
-                'high'
1542
-            );
1543
-        }
1544
-    }
1545
-
1546
-
1547
-    /**
1548
-     * set_reg_status_buttons_metabox
1549
-     *
1550
-     * @access protected
1551
-     * @return string
1552
-     * @throws \EE_Error
1553
-     */
1554
-    public function set_reg_status_buttons_metabox()
1555
-    {
1556
-        $this->_set_registration_object();
1557
-        $change_reg_status_form = $this->_generate_reg_status_change_form();
1558
-        echo $change_reg_status_form->form_open(
1559
-            self::add_query_args_and_nonce(
1560
-                array(
1561
-                    'action' => 'change_reg_status',
1562
-                ),
1563
-                REG_ADMIN_URL
1564
-            )
1565
-        );
1566
-        echo $change_reg_status_form->get_html();
1567
-        echo $change_reg_status_form->form_close();
1568
-    }
1569
-
1570
-
1571
-    /**
1572
-     * @return EE_Form_Section_Proper
1573
-     * @throws EE_Error
1574
-     */
1575
-    protected function _generate_reg_status_change_form()
1576
-    {
1577
-        return new EE_Form_Section_Proper(array(
1578
-            'name'            => 'reg_status_change_form',
1579
-            'html_id'         => 'reg-status-change-form',
1580
-            'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1581
-            'subsections'     => array(
1582
-                'return'             => new EE_Hidden_Input(array(
1583
-                    'name'    => 'return',
1584
-                    'default' => 'view_registration',
1585
-                )),
1586
-                'REG_ID'             => new EE_Hidden_Input(array(
1587
-                    'name'    => 'REG_ID',
1588
-                    'default' => $this->_registration->ID(),
1589
-                )),
1590
-                'current_status'     => new EE_Form_Section_HTML(
1591
-                    EEH_HTML::tr(
1592
-                        EEH_HTML::th(
1593
-                            EEH_HTML::label(
1594
-                                EEH_HTML::strong(esc_html__('Current Registration Status', 'event_espresso')
1595
-                                )
1596
-                            )
1597
-                        )
1598
-                        . EEH_HTML::td(
1599
-                            EEH_HTML::strong(
1600
-                                $this->_registration->pretty_status(),
1601
-                                '',
1602
-                                'status-' . $this->_registration->status_ID(),
1603
-                                'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1604
-                            )
1605
-                        )
1606
-                    )
1607
-                ),
1608
-                'reg_status'         => new EE_Select_Input(
1609
-                    $this->_get_reg_statuses(),
1610
-                    array(
1611
-                        'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1612
-                        'default'         => $this->_registration->status_ID(),
1613
-                    )
1614
-                ),
1615
-                'send_notifications' => new EE_Yes_No_Input(
1616
-                    array(
1617
-                        'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1618
-                        'default'         => false,
1619
-                        'html_help_text'  => esc_html__(
1620
-                            'If set to "Yes", then the related messages will be sent to the registrant.',
1621
-                            'event_espresso'
1622
-                        ),
1623
-                    )
1624
-                ),
1625
-                'submit'             => new EE_Submit_Input(
1626
-                    array(
1627
-                        'html_class'      => 'button-primary',
1628
-                        'html_label_text' => '&nbsp;',
1629
-                        'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1630
-                    )
1631
-                ),
1632
-            ),
1633
-        ));
1634
-    }
1635
-
1636
-
1637
-    /**
1638
-     * Returns an array of all the buttons for the various statuses and switch status actions
1639
-     *
1640
-     * @return array
1641
-     * @throws EE_Error
1642
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1643
-     */
1644
-    protected function _get_reg_statuses()
1645
-    {
1646
-        $reg_status_array = EEM_Registration::instance()->reg_status_array();
1647
-        unset ($reg_status_array[EEM_Registration::status_id_incomplete]);
1648
-        // get current reg status
1649
-        $current_status = $this->_registration->status_ID();
1650
-        // is registration for free event? This will determine whether to display the pending payment option
1651
-        if ($current_status != EEM_Registration::status_id_pending_payment
1652
-            && $this->_registration->transaction()
1653
-                                   ->is_free()
1654
-        ) {
1655
-            unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1656
-        }
1657
-        return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1658
-    }
1659
-
1660
-
1661
-    /**
1662
-     * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1663
-     *
1664
-     * @param bool $status REG status given for changing registrations to.
1665
-     * @param bool $notify Whether to send messages notifications or not.
1666
-     * @return array  (array with reg_id(s) updated and whether update was successful.
1667
-     */
1668
-    protected function _set_registration_status_from_request($status = false, $notify = false)
1669
-    {
1670
-        if (isset($this->_req_data['reg_status_change_form'])) {
1671
-            $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1672
-                ? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1673
-        } else {
1674
-            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1675
-        }
1676
-        $success = $this->_set_registration_status($REG_IDs, $status);
1677
-        //notify?
1678
-        if ($success
1679
-            && $notify
1680
-            && EE_Registry::instance()->CAP->current_user_can(
1681
-                'ee_send_message',
1682
-                'espresso_registrations_resend_registration'
1683
-            )
1684
-        ) {
1685
-            $this->_process_resend_registration();
1686
-        }
1687
-        return $success;
1688
-    }
1689
-
1690
-
1691
-    /**
1692
-     * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1693
-     * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1694
-     *
1695
-     * @param array $REG_IDs
1696
-     * @param bool  $status
1697
-     * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1698
-     *               the array of updated registrations).
1699
-     * @throws EE_Error
1700
-     * @throws RuntimeException
1701
-     */
1702
-    protected function _set_registration_status($REG_IDs = array(), $status = false)
1703
-    {
1704
-        $success = false;
1705
-        // typecast $REG_IDs
1706
-        $REG_IDs = (array)$REG_IDs;
1707
-        if ( ! empty($REG_IDs)) {
1708
-            $success = true;
1709
-            // set default status if none is passed
1710
-            $status = $status ? $status : EEM_Registration::status_id_pending_payment;
1711
-            // sanitize $REG_IDs
1712
-            $REG_IDs = array_filter($REG_IDs, 'absint');
1713
-            //loop through REG_ID's and change status
1714
-            foreach ($REG_IDs as $REG_ID) {
1715
-                $registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1716
-                if ($registration instanceof EE_Registration) {
1717
-                    $registration->set_status($status);
1718
-                    $result = $registration->save();
1719
-                    // verifying explicit fails because update *may* just return 0 for 0 rows affected
1720
-                    $success = $result !== false ? $success : false;
1721
-                }
1722
-            }
1723
-        }
1724
-        //reset _req_data['_REG_ID'] for any potential future messages notifications
1725
-        $this->_req_data['_REG_ID'] = $REG_IDs;
1726
-        //return $success and processed registrations
1727
-        return array('REG_ID' => $REG_IDs, 'success' => $success);
1728
-    }
1729
-
1730
-
1731
-    /**
1732
-     * Common logic for setting up success message and redirecting to appropriate route
1733
-     *
1734
-     * @param  string $STS_ID status id for the registration changed to
1735
-     * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1736
-     * @return void
1737
-     */
1738
-    protected function _reg_status_change_return($STS_ID, $notify = false)
1739
-    {
1740
-        $result  = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1741
-            : array('success' => false);
1742
-        $success = isset($result['success']) && $result['success'];
1743
-        //setup success message
1744
-        if ($success) {
1745
-            if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1746
-                $msg = sprintf(esc_html__('Registration status has been set to %s', 'event_espresso'),
1747
-                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1748
-            } else {
1749
-                $msg = sprintf(esc_html__('Registrations have been set to %s.', 'event_espresso'),
1750
-                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1751
-            }
1752
-            EE_Error::add_success($msg);
1753
-        } else {
1754
-            EE_Error::add_error(
1755
-                esc_html__(
1756
-                    'Something went wrong, and the status was not changed',
1757
-                    'event_espresso'
1758
-                ), __FILE__, __LINE__, __FUNCTION__
1759
-            );
1760
-        }
1761
-        if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
1762
-            $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1763
-        } else {
1764
-            $route = array('action' => 'default');
1765
-        }
1766
-        //unset nonces
1767
-        foreach ($this->_req_data as $ref => $value) {
1768
-            if (strpos($ref, 'nonce') !== false) {
1769
-                unset($this->_req_data[$ref]);
1770
-                continue;
1771
-            }
1772
-            $value                 = is_array($value) ? array_map('urlencode', $value) : urlencode($value);
1773
-            $this->_req_data[$ref] = $value;
1774
-        }
1775
-        //merge request vars so that the reloaded list table contains any existing filter query params
1776
-        $route = array_merge($this->_req_data, $route);
1777
-        $this->_redirect_after_action($success, '', '', $route, true);
1778
-    }
1779
-
1780
-
1781
-    /**
1782
-     * incoming reg status change from reg details page.
1783
-     *
1784
-     * @return void
1785
-     */
1786
-    protected function _change_reg_status()
1787
-    {
1788
-        $this->_req_data['return'] = 'view_registration';
1789
-        //set notify based on whether the send notifications toggle is set or not
1790
-        $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1791
-        //$notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1792
-        $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1793
-            ? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1794
-        switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1795
-            case EEM_Registration::status_id_approved :
1796
-            case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence') :
1797
-                $this->approve_registration($notify);
1798
-                break;
1799
-            case EEM_Registration::status_id_pending_payment :
1800
-            case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence') :
1801
-                $this->pending_registration($notify);
1802
-                break;
1803
-            case EEM_Registration::status_id_not_approved :
1804
-            case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence') :
1805
-                $this->not_approve_registration($notify);
1806
-                break;
1807
-            case EEM_Registration::status_id_declined :
1808
-            case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence') :
1809
-                $this->decline_registration($notify);
1810
-                break;
1811
-            case EEM_Registration::status_id_cancelled :
1812
-            case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence') :
1813
-                $this->cancel_registration($notify);
1814
-                break;
1815
-            case EEM_Registration::status_id_wait_list :
1816
-            case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence') :
1817
-                $this->waitlist_registration($notify);
1818
-                break;
1819
-            case EEM_Registration::status_id_incomplete :
1820
-            default :
1821
-                $result['success'] = false;
1822
-                unset($this->_req_data['return']);
1823
-                $this->_reg_status_change_return('', false);
1824
-                break;
1825
-        }
1826
-    }
1827
-
1828
-
1829
-    /**
1830
-     * approve_registration
1831
-     *
1832
-     * @access protected
1833
-     * @param bool $notify whether or not to notify the registrant about their approval.
1834
-     * @return void
1835
-     */
1836
-    protected function approve_registration($notify = false)
1837
-    {
1838
-        $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1839
-    }
1840
-
1841
-
1842
-    /**
1843
-     *        decline_registration
1844
-     *
1845
-     * @access protected
1846
-     * @param bool $notify whether or not to notify the registrant about their status change.
1847
-     * @return void
1848
-     */
1849
-    protected function decline_registration($notify = false)
1850
-    {
1851
-        $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1852
-    }
1853
-
1854
-
1855
-    /**
1856
-     *        cancel_registration
1857
-     *
1858
-     * @access protected
1859
-     * @param bool $notify whether or not to notify the registrant about their status change.
1860
-     * @return void
1861
-     */
1862
-    protected function cancel_registration($notify = false)
1863
-    {
1864
-        $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1865
-    }
1866
-
1867
-
1868
-    /**
1869
-     *        not_approve_registration
1870
-     *
1871
-     * @access protected
1872
-     * @param bool $notify whether or not to notify the registrant about their status change.
1873
-     * @return void
1874
-     */
1875
-    protected function not_approve_registration($notify = false)
1876
-    {
1877
-        $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1878
-    }
1879
-
1880
-
1881
-    /**
1882
-     *        decline_registration
1883
-     *
1884
-     * @access protected
1885
-     * @param bool $notify whether or not to notify the registrant about their status change.
1886
-     * @return void
1887
-     */
1888
-    protected function pending_registration($notify = false)
1889
-    {
1890
-        $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1891
-    }
1892
-
1893
-
1894
-    /**
1895
-     * waitlist_registration
1896
-     *
1897
-     * @access protected
1898
-     * @param bool $notify whether or not to notify the registrant about their status change.
1899
-     * @return void
1900
-     */
1901
-    protected function waitlist_registration($notify = false)
1902
-    {
1903
-        $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
1904
-    }
1905
-
1906
-
1907
-    /**
1908
-     *        generates HTML for the Registration main meta box
1909
-     *
1910
-     * @access public
1911
-     * @return void
1912
-     * @throws DomainException
1913
-     * @throws EE_Error
1914
-     * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1915
-     */
1916
-    public function _reg_details_meta_box()
1917
-    {
1918
-        EEH_Autoloader::register_line_item_display_autoloaders();
1919
-        EEH_Autoloader::register_line_item_filter_autoloaders();
1920
-        EE_Registry::instance()->load_helper('Line_Item');
1921
-        $transaction    = $this->_registration->transaction() ? $this->_registration->transaction()
1922
-            : EE_Transaction::new_instance();
1923
-        $this->_session = $transaction->session_data();
1924
-        $filters        = new EE_Line_Item_Filter_Collection();
1925
-        //$filters->add( new EE_Non_Zero_Line_Item_Filter() );
1926
-        $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
1927
-        $line_item_filter_processor              = new EE_Line_Item_Filter_Processor($filters,
1928
-            $transaction->total_line_item());
1929
-        $filtered_line_item_tree                 = $line_item_filter_processor->process();
1930
-        $line_item_display                       = new EE_Line_Item_Display('reg_admin_table',
1931
-            'EE_Admin_Table_Registration_Line_Item_Display_Strategy');
1932
-        $this->_template_args['line_item_table'] = $line_item_display->display_line_item(
1933
-            $filtered_line_item_tree,
1934
-            array('EE_Registration' => $this->_registration)
1935
-        );
1936
-        $attendee                                = $this->_registration->attendee();
1937
-        if (EE_Registry::instance()->CAP->current_user_can(
1938
-            'ee_read_transaction',
1939
-            'espresso_transactions_view_transaction'
1940
-        )) {
1941
-            $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
1942
-                EE_Admin_Page::add_query_args_and_nonce(
1943
-                    array(
1944
-                        'action' => 'view_transaction',
1945
-                        'TXN_ID' => $transaction->ID(),
1946
-                    ),
1947
-                    TXN_ADMIN_URL
1948
-                ),
1949
-                esc_html__(' View Transaction', 'event_espresso'),
1950
-                'button secondary-button right',
1951
-                'dashicons dashicons-cart'
1952
-            );
1953
-        } else {
1954
-            $this->_template_args['view_transaction_button'] = '';
1955
-        }
1956
-        if ($attendee instanceof EE_Attendee
1957
-            && EE_Registry::instance()->CAP->current_user_can(
1958
-                'ee_send_message',
1959
-                'espresso_registrations_resend_registration'
1960
-            )
1961
-        ) {
1962
-            $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
1963
-                EE_Admin_Page::add_query_args_and_nonce(
1964
-                    array(
1965
-                        'action'      => 'resend_registration',
1966
-                        '_REG_ID'     => $this->_registration->ID(),
1967
-                        'redirect_to' => 'view_registration',
1968
-                    ),
1969
-                    REG_ADMIN_URL
1970
-                ),
1971
-                esc_html__(' Resend Registration', 'event_espresso'),
1972
-                'button secondary-button right',
1973
-                'dashicons dashicons-email-alt'
1974
-            );
1975
-        } else {
1976
-            $this->_template_args['resend_registration_button'] = '';
1977
-        }
1978
-        $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1979
-        $payment                               = $transaction->get_first_related('Payment');
1980
-        $payment                               = ! $payment instanceof EE_Payment
1981
-            ? EE_Payment::new_instance()
1982
-            : $payment;
1983
-        $payment_method                        = $payment->get_first_related('Payment_Method');
1984
-        $payment_method                        = ! $payment_method instanceof EE_Payment_Method
1985
-            ? EE_Payment_Method::new_instance()
1986
-            : $payment_method;
1987
-        $reg_details                           = array(
1988
-            'payment_method'       => $payment_method->name(),
1989
-            'response_msg'         => $payment->gateway_response(),
1990
-            'registration_id'      => $this->_registration->get('REG_code'),
1991
-            'registration_session' => $this->_registration->session_ID(),
1992
-            'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
1993
-            'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
1994
-        );
1995
-        if (isset($reg_details['registration_id'])) {
1996
-            $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
1997
-            $this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
1998
-                'Registration ID',
1999
-                'event_espresso'
2000
-            );
2001
-            $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2002
-        }
2003
-        if (isset($reg_details['payment_method'])) {
2004
-            $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2005
-            $this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2006
-                'Most Recent Payment Method',
2007
-                'event_espresso'
2008
-            );
2009
-            $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2010
-            $this->_template_args['reg_details']['response_msg']['value']   = $reg_details['response_msg'];
2011
-            $this->_template_args['reg_details']['response_msg']['label']   = esc_html__(
2012
-                'Payment method response',
2013
-                'event_espresso'
2014
-            );
2015
-            $this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2016
-        }
2017
-        $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2018
-        $this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2019
-            'Registration Session',
2020
-            'event_espresso'
2021
-        );
2022
-        $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2023
-        $this->_template_args['reg_details']['ip_address']['value']           = $reg_details['ip_address'];
2024
-        $this->_template_args['reg_details']['ip_address']['label']           = esc_html__(
2025
-            'Registration placed from IP',
2026
-            'event_espresso'
2027
-        );
2028
-        $this->_template_args['reg_details']['ip_address']['class']           = 'regular-text';
2029
-        $this->_template_args['reg_details']['user_agent']['value']           = $reg_details['user_agent'];
2030
-        $this->_template_args['reg_details']['user_agent']['label']           = esc_html__('Registrant User Agent',
2031
-            'event_espresso');
2032
-        $this->_template_args['reg_details']['user_agent']['class']           = 'large-text';
2033
-        $this->_template_args['event_link']                                   = EE_Admin_Page::add_query_args_and_nonce(
2034
-            array(
2035
-                'action'   => 'default',
2036
-                'event_id' => $this->_registration->event_ID(),
2037
-            ),
2038
-            REG_ADMIN_URL
2039
-        );
2040
-        $this->_template_args['REG_ID']                                       = $this->_registration->ID();
2041
-        $this->_template_args['event_id']                                     = $this->_registration->event_ID();
2042
-        $template_path                                                        =
2043
-            REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2044
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2045
-    }
2046
-
2047
-
2048
-    /**
2049
-     * generates HTML for the Registration Questions meta box.
2050
-     * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2051
-     * otherwise uses new forms system
2052
-     *
2053
-     * @access public
2054
-     * @return void
2055
-     * @throws DomainException
2056
-     * @throws EE_Error
2057
-     */
2058
-    public function _reg_questions_meta_box()
2059
-    {
2060
-        //allow someone to override this method entirely
2061
-        if (apply_filters('FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', true, $this,
2062
-            $this->_registration)) {
2063
-            $form                                              = $this->_get_reg_custom_questions_form(
2064
-                $this->_registration->ID()
2065
-            );
2066
-            $this->_template_args['att_questions']             = count($form->subforms()) > 0
2067
-                ? $form->get_html_and_js()
2068
-                : '';
2069
-            $this->_template_args['reg_questions_form_action'] = 'edit_registration';
2070
-            $this->_template_args['REG_ID']                    = $this->_registration->ID();
2071
-            $template_path                                     =
2072
-                REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2073
-            echo EEH_Template::display_template($template_path, $this->_template_args, true);
2074
-        }
2075
-    }
2076
-
2077
-
2078
-    /**
2079
-     * form_before_question_group
2080
-     *
2081
-     * @deprecated    as of 4.8.32.rc.000
2082
-     * @access        public
2083
-     * @param        string $output
2084
-     * @return        string
2085
-     */
2086
-    public function form_before_question_group($output)
2087
-    {
2088
-        EE_Error::doing_it_wrong(
2089
-            __CLASS__ . '::' . __FUNCTION__,
2090
-            esc_html__(
2091
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2092
-                'event_espresso'
2093
-            ),
2094
-            '4.8.32.rc.000'
2095
-        );
2096
-        return '
1159
+		if (! empty($registration_status)) {
1160
+			$where['STS_ID'] = $registration_status;
1161
+		} else {
1162
+			//make sure we exclude incomplete registrations, but only if not trashed.
1163
+			if ($view === 'trash') {
1164
+				$where['REG_deleted'] = true;
1165
+			} elseif ($view === 'incomplete') {
1166
+				$where['STS_ID'] = EEM_Registration::status_id_incomplete;
1167
+			} else {
1168
+				$where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1169
+			}
1170
+		}
1171
+		return $where;
1172
+	}
1173
+
1174
+
1175
+	/**
1176
+	 * Adds any provided date restraints to the where conditions for the registrations query.
1177
+	 *
1178
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1179
+	 * @return array
1180
+	 * @throws EE_Error
1181
+	 */
1182
+	protected function _add_date_to_where_conditions(array $request)
1183
+	{
1184
+		$where = array();
1185
+		$view = EEH_Array::is_set($request, 'status', '');
1186
+		$month_range             = ! empty($request['month_range'])
1187
+			? sanitize_text_field($request['month_range'])
1188
+			: '';
1189
+		$retrieve_for_today      = $view === 'today';
1190
+		$retrieve_for_this_month = $view === 'month';
1191
+
1192
+		if ($retrieve_for_today) {
1193
+			$now               = date('Y-m-d', current_time('timestamp'));
1194
+			$where['REG_date'] = array(
1195
+				'BETWEEN',
1196
+				array(
1197
+					EEM_Registration::instance()->convert_datetime_for_query(
1198
+						'REG_date',
1199
+						$now . ' 00:00:00',
1200
+						'Y-m-d H:i:s'
1201
+					),
1202
+					EEM_Registration::instance()->convert_datetime_for_query(
1203
+						'REG_date',
1204
+						$now . ' 23:59:59',
1205
+						'Y-m-d H:i:s'
1206
+					),
1207
+				),
1208
+			);
1209
+		} elseif ($retrieve_for_this_month) {
1210
+			$current_year_and_month = date('Y-m', current_time('timestamp'));
1211
+			$days_this_month        = date('t', current_time('timestamp'));
1212
+			$where['REG_date']      = array(
1213
+				'BETWEEN',
1214
+				array(
1215
+					EEM_Registration::instance()->convert_datetime_for_query(
1216
+						'REG_date',
1217
+						$current_year_and_month . '-01 00:00:00',
1218
+						'Y-m-d H:i:s'
1219
+					),
1220
+					EEM_Registration::instance()->convert_datetime_for_query(
1221
+						'REG_date',
1222
+						$current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1223
+						'Y-m-d H:i:s'
1224
+					),
1225
+				),
1226
+			);
1227
+		} elseif ($month_range) {
1228
+			$pieces          = explode(' ', $month_range, 3);
1229
+			$month_requested = ! empty($pieces[0])
1230
+				? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1231
+				: '';
1232
+			$year_requested  = ! empty($pieces[1])
1233
+				? $pieces[1]
1234
+				: '';
1235
+			//if there is not a month or year then we can't go further
1236
+			if ($month_requested && $year_requested) {
1237
+				$days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1238
+				$where['REG_date'] = array(
1239
+					'BETWEEN',
1240
+					array(
1241
+						EEM_Registration::instance()->convert_datetime_for_query(
1242
+							'REG_date',
1243
+							$year_requested . '-' . $month_requested . '-01 00:00:00',
1244
+							'Y-m-d H:i:s'
1245
+						),
1246
+						EEM_Registration::instance()->convert_datetime_for_query(
1247
+							'REG_date',
1248
+							$year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1249
+							'Y-m-d H:i:s'
1250
+						),
1251
+					),
1252
+				);
1253
+			}
1254
+		}
1255
+		return $where;
1256
+	}
1257
+
1258
+
1259
+	/**
1260
+	 * Adds any provided search restraints to the where conditions for the registrations query
1261
+	 *
1262
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1263
+	 * @return array
1264
+	 */
1265
+	protected function _add_search_to_where_conditions(array $request)
1266
+	{
1267
+		$where = array();
1268
+		if (! empty($request['s'])) {
1269
+			$search_string = '%' . sanitize_text_field($request['s']) . '%';
1270
+			$where['OR*search_conditions'] = array(
1271
+				'Event.EVT_name'                          => array('LIKE', $search_string),
1272
+				'Event.EVT_desc'                          => array('LIKE', $search_string),
1273
+				'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1274
+				'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1275
+				'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1276
+				'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1277
+				'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1278
+				'Attendee.ATT_email'                      => array('LIKE', $search_string),
1279
+				'Attendee.ATT_address'                    => array('LIKE', $search_string),
1280
+				'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1281
+				'Attendee.ATT_city'                       => array('LIKE', $search_string),
1282
+				'REG_final_price'                         => array('LIKE', $search_string),
1283
+				'REG_code'                                => array('LIKE', $search_string),
1284
+				'REG_count'                               => array('LIKE', $search_string),
1285
+				'REG_group_size'                          => array('LIKE', $search_string),
1286
+				'Ticket.TKT_name'                         => array('LIKE', $search_string),
1287
+				'Ticket.TKT_description'                  => array('LIKE', $search_string),
1288
+				'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1289
+			);
1290
+		}
1291
+		return $where;
1292
+	}
1293
+
1294
+
1295
+	/**
1296
+	 * Sets up the where conditions for the registrations query.
1297
+	 *
1298
+	 * @param array $request
1299
+	 * @return array
1300
+	 * @throws EE_Error
1301
+	 */
1302
+	protected function _get_where_conditions_for_registrations_query($request)
1303
+	{
1304
+		return apply_filters(
1305
+			'FHEE__Registrations_Admin_Page___get_where_conditions_for_registrations_query',
1306
+			array_merge(
1307
+				$this->_add_event_id_to_where_conditions($request),
1308
+				$this->_add_category_id_to_where_conditions($request),
1309
+				$this->_add_datetime_id_to_where_conditions($request),
1310
+				$this->_add_registration_status_to_where_conditions($request),
1311
+				$this->_add_date_to_where_conditions($request),
1312
+				$this->_add_search_to_where_conditions($request)
1313
+			),
1314
+			$request
1315
+		);
1316
+	}
1317
+
1318
+
1319
+	/**
1320
+	 * Sets up the orderby for the registrations query.
1321
+	 *
1322
+	 * @return array
1323
+	 */
1324
+	protected function _get_orderby_for_registrations_query()
1325
+	{
1326
+		$orderby_field = ! empty($this->_req_data['orderby'])
1327
+			? sanitize_text_field($this->_req_data['orderby'])
1328
+			: '';
1329
+		switch ($orderby_field) {
1330
+			case '_REG_ID':
1331
+				$orderby_field = 'REG_ID';
1332
+				break;
1333
+			case '_Reg_status':
1334
+				$orderby_field = 'STS_ID';
1335
+				break;
1336
+			case 'ATT_fname':
1337
+				$orderby_field = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1338
+				break;
1339
+			case 'ATT_lname':
1340
+				$orderby_field = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1341
+				break;
1342
+			case 'event_name':
1343
+				$orderby_field = 'Event.EVT_name';
1344
+				break;
1345
+			case 'DTT_EVT_start':
1346
+				$orderby_field = 'Event.Datetime.DTT_EVT_start';
1347
+				break;
1348
+			default: //'REG_date'
1349
+				$orderby_field = 'REG_date';
1350
+		}
1351
+
1352
+		//order
1353
+		$order = ! empty($this->_req_data['order'])
1354
+			? sanitize_text_field($this->_req_data['order'])
1355
+			: 'DESC';
1356
+
1357
+		//mutate orderby_field
1358
+		$orderby_field = array_combine(
1359
+			(array) $orderby_field,
1360
+			array_fill(0, count($orderby_field), $order)
1361
+		);
1362
+		return array('order_by' => $orderby_field);
1363
+	}
1364
+
1365
+
1366
+	/**
1367
+	 * Sets up the limit for the registrations query.
1368
+	 *
1369
+	 * @param $per_page
1370
+	 * @return array
1371
+	 */
1372
+	protected function _get_limit($per_page)
1373
+	{
1374
+		$current_page = ! empty($this->_req_data['paged'])
1375
+			? absint($this->_req_data['paged'])
1376
+			: 1;
1377
+		$per_page     = ! empty($this->_req_data['perpage'])
1378
+			? $this->_req_data['perpage']
1379
+			: $per_page;
1380
+
1381
+		//-1 means return all results so get out if that's set.
1382
+		if ((int)$per_page === -1) {
1383
+			return array();
1384
+		}
1385
+		$per_page = absint($per_page);
1386
+		$offset   = ($current_page - 1) * $per_page;
1387
+		return array('limit' => array($offset, $per_page));
1388
+	}
1389
+
1390
+
1391
+	public function get_registration_status_array()
1392
+	{
1393
+		return self::$_reg_status;
1394
+	}
1395
+
1396
+
1397
+
1398
+
1399
+	/***************************************        REGISTRATION DETAILS        ***************************************/
1400
+	/**
1401
+	 *        generates HTML for the View Registration Details Admin page
1402
+	 *
1403
+	 * @access protected
1404
+	 * @return void
1405
+	 * @throws DomainException
1406
+	 * @throws EE_Error
1407
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1408
+	 */
1409
+	protected function _registration_details()
1410
+	{
1411
+		$this->_template_args = array();
1412
+		$this->_set_registration_object();
1413
+		if (is_object($this->_registration)) {
1414
+			$transaction                                   = $this->_registration->transaction()
1415
+				? $this->_registration->transaction()
1416
+				: EE_Transaction::new_instance();
1417
+			$this->_session                                = $transaction->session_data();
1418
+			$event_id                                      = $this->_registration->event_ID();
1419
+			$this->_template_args['reg_nmbr']['value']     = $this->_registration->ID();
1420
+			$this->_template_args['reg_nmbr']['label']     = esc_html__('Registration Number', 'event_espresso');
1421
+			$this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1422
+			$this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso');
1423
+			$this->_template_args['grand_total']           = $transaction->total();
1424
+			$this->_template_args['currency_sign']         = EE_Registry::instance()->CFG->currency->sign;
1425
+			// link back to overview
1426
+			$this->_template_args['reg_overview_url']            = REG_ADMIN_URL;
1427
+			$this->_template_args['registration']                = $this->_registration;
1428
+			$this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(
1429
+				array(
1430
+					'action'   => 'default',
1431
+					'event_id' => $event_id,
1432
+				),
1433
+				REG_ADMIN_URL
1434
+			);
1435
+			$this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(
1436
+				array(
1437
+					'action' => 'default',
1438
+					'EVT_ID' => $event_id,
1439
+					'page'   => 'espresso_transactions',
1440
+				),
1441
+				admin_url('admin.php')
1442
+			);
1443
+			$this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(
1444
+				array(
1445
+					'page'   => 'espresso_events',
1446
+					'action' => 'edit',
1447
+					'post'   => $event_id,
1448
+				),
1449
+				admin_url('admin.php')
1450
+			);
1451
+			//next and previous links
1452
+			$next_reg                                      = $this->_registration->next(
1453
+				null,
1454
+				array(),
1455
+				'REG_ID'
1456
+			);
1457
+			$this->_template_args['next_registration']     = $next_reg
1458
+				? $this->_next_link(
1459
+					EE_Admin_Page::add_query_args_and_nonce(
1460
+						array(
1461
+							'action'  => 'view_registration',
1462
+							'_REG_ID' => $next_reg['REG_ID'],
1463
+						),
1464
+						REG_ADMIN_URL
1465
+					),
1466
+					'dashicons dashicons-arrow-right ee-icon-size-22'
1467
+				)
1468
+				: '';
1469
+			$previous_reg                                  = $this->_registration->previous(
1470
+				null,
1471
+				array(),
1472
+				'REG_ID'
1473
+			);
1474
+			$this->_template_args['previous_registration'] = $previous_reg
1475
+				? $this->_previous_link(
1476
+					EE_Admin_Page::add_query_args_and_nonce(
1477
+						array(
1478
+							'action'  => 'view_registration',
1479
+							'_REG_ID' => $previous_reg['REG_ID'],
1480
+						),
1481
+						REG_ADMIN_URL
1482
+					),
1483
+					'dashicons dashicons-arrow-left ee-icon-size-22'
1484
+				)
1485
+				: '';
1486
+			// grab header
1487
+			$template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1488
+			$this->_template_args['REG_ID']            = $this->_registration->ID();
1489
+			$this->_template_args['admin_page_header'] = EEH_Template::display_template(
1490
+				$template_path,
1491
+				$this->_template_args,
1492
+				true
1493
+			);
1494
+		} else {
1495
+			$this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1496
+		}
1497
+		// the details template wrapper
1498
+		$this->display_admin_page_with_sidebar();
1499
+	}
1500
+
1501
+
1502
+	protected function _registration_details_metaboxes()
1503
+	{
1504
+		do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1505
+		$this->_set_registration_object();
1506
+		$attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1507
+		add_meta_box('edit-reg-status-mbox', esc_html__('Registration Status', 'event_espresso'),
1508
+			array($this, 'set_reg_status_buttons_metabox'), $this->wp_page_slug, 'normal', 'high');
1509
+		add_meta_box('edit-reg-details-mbox', esc_html__('Registration Details', 'event_espresso'),
1510
+			array($this, '_reg_details_meta_box'), $this->wp_page_slug, 'normal', 'high');
1511
+		if ($attendee instanceof EE_Attendee
1512
+			&& EE_Registry::instance()->CAP->current_user_can(
1513
+				'ee_edit_registration',
1514
+				'edit-reg-questions-mbox'
1515
+			)
1516
+		) {
1517
+			add_meta_box(
1518
+				'edit-reg-questions-mbox',
1519
+				esc_html__('Registration Form Answers', 'event_espresso'),
1520
+				array($this, '_reg_questions_meta_box'),
1521
+				$this->wp_page_slug,
1522
+				'normal',
1523
+				'high'
1524
+			);
1525
+		}
1526
+		add_meta_box(
1527
+			'edit-reg-registrant-mbox',
1528
+			esc_html__('Contact Details', 'event_espresso'),
1529
+			array($this, '_reg_registrant_side_meta_box'),
1530
+			$this->wp_page_slug,
1531
+			'side',
1532
+			'high'
1533
+		);
1534
+		if ($this->_registration->group_size() > 1) {
1535
+			add_meta_box(
1536
+				'edit-reg-attendees-mbox',
1537
+				esc_html__('Other Registrations in this Transaction', 'event_espresso'),
1538
+				array($this, '_reg_attendees_meta_box'),
1539
+				$this->wp_page_slug,
1540
+				'normal',
1541
+				'high'
1542
+			);
1543
+		}
1544
+	}
1545
+
1546
+
1547
+	/**
1548
+	 * set_reg_status_buttons_metabox
1549
+	 *
1550
+	 * @access protected
1551
+	 * @return string
1552
+	 * @throws \EE_Error
1553
+	 */
1554
+	public function set_reg_status_buttons_metabox()
1555
+	{
1556
+		$this->_set_registration_object();
1557
+		$change_reg_status_form = $this->_generate_reg_status_change_form();
1558
+		echo $change_reg_status_form->form_open(
1559
+			self::add_query_args_and_nonce(
1560
+				array(
1561
+					'action' => 'change_reg_status',
1562
+				),
1563
+				REG_ADMIN_URL
1564
+			)
1565
+		);
1566
+		echo $change_reg_status_form->get_html();
1567
+		echo $change_reg_status_form->form_close();
1568
+	}
1569
+
1570
+
1571
+	/**
1572
+	 * @return EE_Form_Section_Proper
1573
+	 * @throws EE_Error
1574
+	 */
1575
+	protected function _generate_reg_status_change_form()
1576
+	{
1577
+		return new EE_Form_Section_Proper(array(
1578
+			'name'            => 'reg_status_change_form',
1579
+			'html_id'         => 'reg-status-change-form',
1580
+			'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1581
+			'subsections'     => array(
1582
+				'return'             => new EE_Hidden_Input(array(
1583
+					'name'    => 'return',
1584
+					'default' => 'view_registration',
1585
+				)),
1586
+				'REG_ID'             => new EE_Hidden_Input(array(
1587
+					'name'    => 'REG_ID',
1588
+					'default' => $this->_registration->ID(),
1589
+				)),
1590
+				'current_status'     => new EE_Form_Section_HTML(
1591
+					EEH_HTML::tr(
1592
+						EEH_HTML::th(
1593
+							EEH_HTML::label(
1594
+								EEH_HTML::strong(esc_html__('Current Registration Status', 'event_espresso')
1595
+								)
1596
+							)
1597
+						)
1598
+						. EEH_HTML::td(
1599
+							EEH_HTML::strong(
1600
+								$this->_registration->pretty_status(),
1601
+								'',
1602
+								'status-' . $this->_registration->status_ID(),
1603
+								'line-height: 1em; font-size: 1.5em; font-weight: bold;'
1604
+							)
1605
+						)
1606
+					)
1607
+				),
1608
+				'reg_status'         => new EE_Select_Input(
1609
+					$this->_get_reg_statuses(),
1610
+					array(
1611
+						'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'),
1612
+						'default'         => $this->_registration->status_ID(),
1613
+					)
1614
+				),
1615
+				'send_notifications' => new EE_Yes_No_Input(
1616
+					array(
1617
+						'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'),
1618
+						'default'         => false,
1619
+						'html_help_text'  => esc_html__(
1620
+							'If set to "Yes", then the related messages will be sent to the registrant.',
1621
+							'event_espresso'
1622
+						),
1623
+					)
1624
+				),
1625
+				'submit'             => new EE_Submit_Input(
1626
+					array(
1627
+						'html_class'      => 'button-primary',
1628
+						'html_label_text' => '&nbsp;',
1629
+						'default'         => esc_html__('Update Registration Status', 'event_espresso'),
1630
+					)
1631
+				),
1632
+			),
1633
+		));
1634
+	}
1635
+
1636
+
1637
+	/**
1638
+	 * Returns an array of all the buttons for the various statuses and switch status actions
1639
+	 *
1640
+	 * @return array
1641
+	 * @throws EE_Error
1642
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1643
+	 */
1644
+	protected function _get_reg_statuses()
1645
+	{
1646
+		$reg_status_array = EEM_Registration::instance()->reg_status_array();
1647
+		unset ($reg_status_array[EEM_Registration::status_id_incomplete]);
1648
+		// get current reg status
1649
+		$current_status = $this->_registration->status_ID();
1650
+		// is registration for free event? This will determine whether to display the pending payment option
1651
+		if ($current_status != EEM_Registration::status_id_pending_payment
1652
+			&& $this->_registration->transaction()
1653
+								   ->is_free()
1654
+		) {
1655
+			unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1656
+		}
1657
+		return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1658
+	}
1659
+
1660
+
1661
+	/**
1662
+	 * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1663
+	 *
1664
+	 * @param bool $status REG status given for changing registrations to.
1665
+	 * @param bool $notify Whether to send messages notifications or not.
1666
+	 * @return array  (array with reg_id(s) updated and whether update was successful.
1667
+	 */
1668
+	protected function _set_registration_status_from_request($status = false, $notify = false)
1669
+	{
1670
+		if (isset($this->_req_data['reg_status_change_form'])) {
1671
+			$REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1672
+				? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1673
+		} else {
1674
+			$REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1675
+		}
1676
+		$success = $this->_set_registration_status($REG_IDs, $status);
1677
+		//notify?
1678
+		if ($success
1679
+			&& $notify
1680
+			&& EE_Registry::instance()->CAP->current_user_can(
1681
+				'ee_send_message',
1682
+				'espresso_registrations_resend_registration'
1683
+			)
1684
+		) {
1685
+			$this->_process_resend_registration();
1686
+		}
1687
+		return $success;
1688
+	}
1689
+
1690
+
1691
+	/**
1692
+	 * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1693
+	 * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1694
+	 *
1695
+	 * @param array $REG_IDs
1696
+	 * @param bool  $status
1697
+	 * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1698
+	 *               the array of updated registrations).
1699
+	 * @throws EE_Error
1700
+	 * @throws RuntimeException
1701
+	 */
1702
+	protected function _set_registration_status($REG_IDs = array(), $status = false)
1703
+	{
1704
+		$success = false;
1705
+		// typecast $REG_IDs
1706
+		$REG_IDs = (array)$REG_IDs;
1707
+		if ( ! empty($REG_IDs)) {
1708
+			$success = true;
1709
+			// set default status if none is passed
1710
+			$status = $status ? $status : EEM_Registration::status_id_pending_payment;
1711
+			// sanitize $REG_IDs
1712
+			$REG_IDs = array_filter($REG_IDs, 'absint');
1713
+			//loop through REG_ID's and change status
1714
+			foreach ($REG_IDs as $REG_ID) {
1715
+				$registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1716
+				if ($registration instanceof EE_Registration) {
1717
+					$registration->set_status($status);
1718
+					$result = $registration->save();
1719
+					// verifying explicit fails because update *may* just return 0 for 0 rows affected
1720
+					$success = $result !== false ? $success : false;
1721
+				}
1722
+			}
1723
+		}
1724
+		//reset _req_data['_REG_ID'] for any potential future messages notifications
1725
+		$this->_req_data['_REG_ID'] = $REG_IDs;
1726
+		//return $success and processed registrations
1727
+		return array('REG_ID' => $REG_IDs, 'success' => $success);
1728
+	}
1729
+
1730
+
1731
+	/**
1732
+	 * Common logic for setting up success message and redirecting to appropriate route
1733
+	 *
1734
+	 * @param  string $STS_ID status id for the registration changed to
1735
+	 * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1736
+	 * @return void
1737
+	 */
1738
+	protected function _reg_status_change_return($STS_ID, $notify = false)
1739
+	{
1740
+		$result  = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1741
+			: array('success' => false);
1742
+		$success = isset($result['success']) && $result['success'];
1743
+		//setup success message
1744
+		if ($success) {
1745
+			if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1746
+				$msg = sprintf(esc_html__('Registration status has been set to %s', 'event_espresso'),
1747
+					EEH_Template::pretty_status($STS_ID, false, 'lower'));
1748
+			} else {
1749
+				$msg = sprintf(esc_html__('Registrations have been set to %s.', 'event_espresso'),
1750
+					EEH_Template::pretty_status($STS_ID, false, 'lower'));
1751
+			}
1752
+			EE_Error::add_success($msg);
1753
+		} else {
1754
+			EE_Error::add_error(
1755
+				esc_html__(
1756
+					'Something went wrong, and the status was not changed',
1757
+					'event_espresso'
1758
+				), __FILE__, __LINE__, __FUNCTION__
1759
+			);
1760
+		}
1761
+		if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
1762
+			$route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1763
+		} else {
1764
+			$route = array('action' => 'default');
1765
+		}
1766
+		//unset nonces
1767
+		foreach ($this->_req_data as $ref => $value) {
1768
+			if (strpos($ref, 'nonce') !== false) {
1769
+				unset($this->_req_data[$ref]);
1770
+				continue;
1771
+			}
1772
+			$value                 = is_array($value) ? array_map('urlencode', $value) : urlencode($value);
1773
+			$this->_req_data[$ref] = $value;
1774
+		}
1775
+		//merge request vars so that the reloaded list table contains any existing filter query params
1776
+		$route = array_merge($this->_req_data, $route);
1777
+		$this->_redirect_after_action($success, '', '', $route, true);
1778
+	}
1779
+
1780
+
1781
+	/**
1782
+	 * incoming reg status change from reg details page.
1783
+	 *
1784
+	 * @return void
1785
+	 */
1786
+	protected function _change_reg_status()
1787
+	{
1788
+		$this->_req_data['return'] = 'view_registration';
1789
+		//set notify based on whether the send notifications toggle is set or not
1790
+		$notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1791
+		//$notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1792
+		$this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1793
+			? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1794
+		switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1795
+			case EEM_Registration::status_id_approved :
1796
+			case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence') :
1797
+				$this->approve_registration($notify);
1798
+				break;
1799
+			case EEM_Registration::status_id_pending_payment :
1800
+			case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence') :
1801
+				$this->pending_registration($notify);
1802
+				break;
1803
+			case EEM_Registration::status_id_not_approved :
1804
+			case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence') :
1805
+				$this->not_approve_registration($notify);
1806
+				break;
1807
+			case EEM_Registration::status_id_declined :
1808
+			case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence') :
1809
+				$this->decline_registration($notify);
1810
+				break;
1811
+			case EEM_Registration::status_id_cancelled :
1812
+			case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence') :
1813
+				$this->cancel_registration($notify);
1814
+				break;
1815
+			case EEM_Registration::status_id_wait_list :
1816
+			case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence') :
1817
+				$this->waitlist_registration($notify);
1818
+				break;
1819
+			case EEM_Registration::status_id_incomplete :
1820
+			default :
1821
+				$result['success'] = false;
1822
+				unset($this->_req_data['return']);
1823
+				$this->_reg_status_change_return('', false);
1824
+				break;
1825
+		}
1826
+	}
1827
+
1828
+
1829
+	/**
1830
+	 * approve_registration
1831
+	 *
1832
+	 * @access protected
1833
+	 * @param bool $notify whether or not to notify the registrant about their approval.
1834
+	 * @return void
1835
+	 */
1836
+	protected function approve_registration($notify = false)
1837
+	{
1838
+		$this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1839
+	}
1840
+
1841
+
1842
+	/**
1843
+	 *        decline_registration
1844
+	 *
1845
+	 * @access protected
1846
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1847
+	 * @return void
1848
+	 */
1849
+	protected function decline_registration($notify = false)
1850
+	{
1851
+		$this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1852
+	}
1853
+
1854
+
1855
+	/**
1856
+	 *        cancel_registration
1857
+	 *
1858
+	 * @access protected
1859
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1860
+	 * @return void
1861
+	 */
1862
+	protected function cancel_registration($notify = false)
1863
+	{
1864
+		$this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1865
+	}
1866
+
1867
+
1868
+	/**
1869
+	 *        not_approve_registration
1870
+	 *
1871
+	 * @access protected
1872
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1873
+	 * @return void
1874
+	 */
1875
+	protected function not_approve_registration($notify = false)
1876
+	{
1877
+		$this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1878
+	}
1879
+
1880
+
1881
+	/**
1882
+	 *        decline_registration
1883
+	 *
1884
+	 * @access protected
1885
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1886
+	 * @return void
1887
+	 */
1888
+	protected function pending_registration($notify = false)
1889
+	{
1890
+		$this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1891
+	}
1892
+
1893
+
1894
+	/**
1895
+	 * waitlist_registration
1896
+	 *
1897
+	 * @access protected
1898
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1899
+	 * @return void
1900
+	 */
1901
+	protected function waitlist_registration($notify = false)
1902
+	{
1903
+		$this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
1904
+	}
1905
+
1906
+
1907
+	/**
1908
+	 *        generates HTML for the Registration main meta box
1909
+	 *
1910
+	 * @access public
1911
+	 * @return void
1912
+	 * @throws DomainException
1913
+	 * @throws EE_Error
1914
+	 * @throws \EventEspresso\core\exceptions\EntityNotFoundException
1915
+	 */
1916
+	public function _reg_details_meta_box()
1917
+	{
1918
+		EEH_Autoloader::register_line_item_display_autoloaders();
1919
+		EEH_Autoloader::register_line_item_filter_autoloaders();
1920
+		EE_Registry::instance()->load_helper('Line_Item');
1921
+		$transaction    = $this->_registration->transaction() ? $this->_registration->transaction()
1922
+			: EE_Transaction::new_instance();
1923
+		$this->_session = $transaction->session_data();
1924
+		$filters        = new EE_Line_Item_Filter_Collection();
1925
+		//$filters->add( new EE_Non_Zero_Line_Item_Filter() );
1926
+		$filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
1927
+		$line_item_filter_processor              = new EE_Line_Item_Filter_Processor($filters,
1928
+			$transaction->total_line_item());
1929
+		$filtered_line_item_tree                 = $line_item_filter_processor->process();
1930
+		$line_item_display                       = new EE_Line_Item_Display('reg_admin_table',
1931
+			'EE_Admin_Table_Registration_Line_Item_Display_Strategy');
1932
+		$this->_template_args['line_item_table'] = $line_item_display->display_line_item(
1933
+			$filtered_line_item_tree,
1934
+			array('EE_Registration' => $this->_registration)
1935
+		);
1936
+		$attendee                                = $this->_registration->attendee();
1937
+		if (EE_Registry::instance()->CAP->current_user_can(
1938
+			'ee_read_transaction',
1939
+			'espresso_transactions_view_transaction'
1940
+		)) {
1941
+			$this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(
1942
+				EE_Admin_Page::add_query_args_and_nonce(
1943
+					array(
1944
+						'action' => 'view_transaction',
1945
+						'TXN_ID' => $transaction->ID(),
1946
+					),
1947
+					TXN_ADMIN_URL
1948
+				),
1949
+				esc_html__(' View Transaction', 'event_espresso'),
1950
+				'button secondary-button right',
1951
+				'dashicons dashicons-cart'
1952
+			);
1953
+		} else {
1954
+			$this->_template_args['view_transaction_button'] = '';
1955
+		}
1956
+		if ($attendee instanceof EE_Attendee
1957
+			&& EE_Registry::instance()->CAP->current_user_can(
1958
+				'ee_send_message',
1959
+				'espresso_registrations_resend_registration'
1960
+			)
1961
+		) {
1962
+			$this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(
1963
+				EE_Admin_Page::add_query_args_and_nonce(
1964
+					array(
1965
+						'action'      => 'resend_registration',
1966
+						'_REG_ID'     => $this->_registration->ID(),
1967
+						'redirect_to' => 'view_registration',
1968
+					),
1969
+					REG_ADMIN_URL
1970
+				),
1971
+				esc_html__(' Resend Registration', 'event_espresso'),
1972
+				'button secondary-button right',
1973
+				'dashicons dashicons-email-alt'
1974
+			);
1975
+		} else {
1976
+			$this->_template_args['resend_registration_button'] = '';
1977
+		}
1978
+		$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1979
+		$payment                               = $transaction->get_first_related('Payment');
1980
+		$payment                               = ! $payment instanceof EE_Payment
1981
+			? EE_Payment::new_instance()
1982
+			: $payment;
1983
+		$payment_method                        = $payment->get_first_related('Payment_Method');
1984
+		$payment_method                        = ! $payment_method instanceof EE_Payment_Method
1985
+			? EE_Payment_Method::new_instance()
1986
+			: $payment_method;
1987
+		$reg_details                           = array(
1988
+			'payment_method'       => $payment_method->name(),
1989
+			'response_msg'         => $payment->gateway_response(),
1990
+			'registration_id'      => $this->_registration->get('REG_code'),
1991
+			'registration_session' => $this->_registration->session_ID(),
1992
+			'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
1993
+			'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
1994
+		);
1995
+		if (isset($reg_details['registration_id'])) {
1996
+			$this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
1997
+			$this->_template_args['reg_details']['registration_id']['label'] = esc_html__(
1998
+				'Registration ID',
1999
+				'event_espresso'
2000
+			);
2001
+			$this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
2002
+		}
2003
+		if (isset($reg_details['payment_method'])) {
2004
+			$this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
2005
+			$this->_template_args['reg_details']['payment_method']['label'] = esc_html__(
2006
+				'Most Recent Payment Method',
2007
+				'event_espresso'
2008
+			);
2009
+			$this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
2010
+			$this->_template_args['reg_details']['response_msg']['value']   = $reg_details['response_msg'];
2011
+			$this->_template_args['reg_details']['response_msg']['label']   = esc_html__(
2012
+				'Payment method response',
2013
+				'event_espresso'
2014
+			);
2015
+			$this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
2016
+		}
2017
+		$this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
2018
+		$this->_template_args['reg_details']['registration_session']['label'] = esc_html__(
2019
+			'Registration Session',
2020
+			'event_espresso'
2021
+		);
2022
+		$this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
2023
+		$this->_template_args['reg_details']['ip_address']['value']           = $reg_details['ip_address'];
2024
+		$this->_template_args['reg_details']['ip_address']['label']           = esc_html__(
2025
+			'Registration placed from IP',
2026
+			'event_espresso'
2027
+		);
2028
+		$this->_template_args['reg_details']['ip_address']['class']           = 'regular-text';
2029
+		$this->_template_args['reg_details']['user_agent']['value']           = $reg_details['user_agent'];
2030
+		$this->_template_args['reg_details']['user_agent']['label']           = esc_html__('Registrant User Agent',
2031
+			'event_espresso');
2032
+		$this->_template_args['reg_details']['user_agent']['class']           = 'large-text';
2033
+		$this->_template_args['event_link']                                   = EE_Admin_Page::add_query_args_and_nonce(
2034
+			array(
2035
+				'action'   => 'default',
2036
+				'event_id' => $this->_registration->event_ID(),
2037
+			),
2038
+			REG_ADMIN_URL
2039
+		);
2040
+		$this->_template_args['REG_ID']                                       = $this->_registration->ID();
2041
+		$this->_template_args['event_id']                                     = $this->_registration->event_ID();
2042
+		$template_path                                                        =
2043
+			REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
2044
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2045
+	}
2046
+
2047
+
2048
+	/**
2049
+	 * generates HTML for the Registration Questions meta box.
2050
+	 * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
2051
+	 * otherwise uses new forms system
2052
+	 *
2053
+	 * @access public
2054
+	 * @return void
2055
+	 * @throws DomainException
2056
+	 * @throws EE_Error
2057
+	 */
2058
+	public function _reg_questions_meta_box()
2059
+	{
2060
+		//allow someone to override this method entirely
2061
+		if (apply_filters('FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', true, $this,
2062
+			$this->_registration)) {
2063
+			$form                                              = $this->_get_reg_custom_questions_form(
2064
+				$this->_registration->ID()
2065
+			);
2066
+			$this->_template_args['att_questions']             = count($form->subforms()) > 0
2067
+				? $form->get_html_and_js()
2068
+				: '';
2069
+			$this->_template_args['reg_questions_form_action'] = 'edit_registration';
2070
+			$this->_template_args['REG_ID']                    = $this->_registration->ID();
2071
+			$template_path                                     =
2072
+				REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
2073
+			echo EEH_Template::display_template($template_path, $this->_template_args, true);
2074
+		}
2075
+	}
2076
+
2077
+
2078
+	/**
2079
+	 * form_before_question_group
2080
+	 *
2081
+	 * @deprecated    as of 4.8.32.rc.000
2082
+	 * @access        public
2083
+	 * @param        string $output
2084
+	 * @return        string
2085
+	 */
2086
+	public function form_before_question_group($output)
2087
+	{
2088
+		EE_Error::doing_it_wrong(
2089
+			__CLASS__ . '::' . __FUNCTION__,
2090
+			esc_html__(
2091
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2092
+				'event_espresso'
2093
+			),
2094
+			'4.8.32.rc.000'
2095
+		);
2096
+		return '
2097 2097
 	<table class="form-table ee-width-100">
2098 2098
 		<tbody>
2099 2099
 			';
2100
-    }
2101
-
2102
-
2103
-    /**
2104
-     * form_after_question_group
2105
-     *
2106
-     * @deprecated    as of 4.8.32.rc.000
2107
-     * @access        public
2108
-     * @param        string $output
2109
-     * @return        string
2110
-     */
2111
-    public function form_after_question_group($output)
2112
-    {
2113
-        EE_Error::doing_it_wrong(
2114
-            __CLASS__ . '::' . __FUNCTION__,
2115
-            esc_html__(
2116
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2117
-                'event_espresso'
2118
-            ),
2119
-            '4.8.32.rc.000'
2120
-        );
2121
-        return '
2100
+	}
2101
+
2102
+
2103
+	/**
2104
+	 * form_after_question_group
2105
+	 *
2106
+	 * @deprecated    as of 4.8.32.rc.000
2107
+	 * @access        public
2108
+	 * @param        string $output
2109
+	 * @return        string
2110
+	 */
2111
+	public function form_after_question_group($output)
2112
+	{
2113
+		EE_Error::doing_it_wrong(
2114
+			__CLASS__ . '::' . __FUNCTION__,
2115
+			esc_html__(
2116
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2117
+				'event_espresso'
2118
+			),
2119
+			'4.8.32.rc.000'
2120
+		);
2121
+		return '
2122 2122
 			<tr class="hide-if-no-js">
2123 2123
 				<th> </th>
2124 2124
 				<td class="reg-admin-edit-attendee-question-td">
2125 2125
 					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
2126
-               . esc_attr__('click to edit question', 'event_espresso')
2127
-               . '">
2126
+			   . esc_attr__('click to edit question', 'event_espresso')
2127
+			   . '">
2128 2128
 						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
2129
-               . esc_html__('edit the above question group', 'event_espresso')
2130
-               . '</span>
2129
+			   . esc_html__('edit the above question group', 'event_espresso')
2130
+			   . '</span>
2131 2131
 						<div class="dashicons dashicons-edit"></div>
2132 2132
 					</a>
2133 2133
 				</td>
@@ -2135,558 +2135,558 @@  discard block
 block discarded – undo
2135 2135
 		</tbody>
2136 2136
 	</table>
2137 2137
 ';
2138
-    }
2139
-
2140
-
2141
-    /**
2142
-     * form_form_field_label_wrap
2143
-     *
2144
-     * @deprecated    as of 4.8.32.rc.000
2145
-     * @access        public
2146
-     * @param        string $label
2147
-     * @return        string
2148
-     */
2149
-    public function form_form_field_label_wrap($label)
2150
-    {
2151
-        EE_Error::doing_it_wrong(
2152
-            __CLASS__ . '::' . __FUNCTION__,
2153
-            esc_html__(
2154
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2155
-                'event_espresso'
2156
-            ),
2157
-            '4.8.32.rc.000'
2158
-        );
2159
-        return '
2138
+	}
2139
+
2140
+
2141
+	/**
2142
+	 * form_form_field_label_wrap
2143
+	 *
2144
+	 * @deprecated    as of 4.8.32.rc.000
2145
+	 * @access        public
2146
+	 * @param        string $label
2147
+	 * @return        string
2148
+	 */
2149
+	public function form_form_field_label_wrap($label)
2150
+	{
2151
+		EE_Error::doing_it_wrong(
2152
+			__CLASS__ . '::' . __FUNCTION__,
2153
+			esc_html__(
2154
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2155
+				'event_espresso'
2156
+			),
2157
+			'4.8.32.rc.000'
2158
+		);
2159
+		return '
2160 2160
 			<tr>
2161 2161
 				<th>
2162 2162
 					' . $label . '
2163 2163
 				</th>';
2164
-    }
2165
-
2166
-
2167
-    /**
2168
-     * form_form_field_input__wrap
2169
-     *
2170
-     * @deprecated    as of 4.8.32.rc.000
2171
-     * @access        public
2172
-     * @param        string $input
2173
-     * @return        string
2174
-     */
2175
-    public function form_form_field_input__wrap($input)
2176
-    {
2177
-        EE_Error::doing_it_wrong(
2178
-            __CLASS__ . '::' . __FUNCTION__,
2179
-            esc_html__(
2180
-                'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2181
-                'event_espresso'
2182
-            ),
2183
-            '4.8.32.rc.000'
2184
-        );
2185
-        return '
2164
+	}
2165
+
2166
+
2167
+	/**
2168
+	 * form_form_field_input__wrap
2169
+	 *
2170
+	 * @deprecated    as of 4.8.32.rc.000
2171
+	 * @access        public
2172
+	 * @param        string $input
2173
+	 * @return        string
2174
+	 */
2175
+	public function form_form_field_input__wrap($input)
2176
+	{
2177
+		EE_Error::doing_it_wrong(
2178
+			__CLASS__ . '::' . __FUNCTION__,
2179
+			esc_html__(
2180
+				'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.',
2181
+				'event_espresso'
2182
+			),
2183
+			'4.8.32.rc.000'
2184
+		);
2185
+		return '
2186 2186
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
2187 2187
 					' . $input . '
2188 2188
 				</td>
2189 2189
 			</tr>';
2190
-    }
2191
-
2192
-
2193
-    /**
2194
-     * Updates the registration's custom questions according to the form info, if the form is submitted.
2195
-     * If it's not a post, the "view_registrations" route will be called next on the SAME request
2196
-     * to display the page
2197
-     *
2198
-     * @access protected
2199
-     * @return void
2200
-     * @throws EE_Error
2201
-     */
2202
-    protected function _update_attendee_registration_form()
2203
-    {
2204
-        do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2205
-        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2206
-            $REG_ID  = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2207
-            $success = $this->_save_reg_custom_questions_form($REG_ID);
2208
-            if ($success) {
2209
-                $what  = esc_html__('Registration Form', 'event_espresso');
2210
-                $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2211
-                    : array('action' => 'default');
2212
-                $this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2213
-            }
2214
-        }
2215
-    }
2216
-
2217
-
2218
-    /**
2219
-     * Gets the form for saving registrations custom questions (if done
2220
-     * previously retrieves the cached form object, which may have validation errors in it)
2221
-     *
2222
-     * @param int $REG_ID
2223
-     * @return EE_Registration_Custom_Questions_Form
2224
-     * @throws EE_Error
2225
-     */
2226
-    protected function _get_reg_custom_questions_form($REG_ID)
2227
-    {
2228
-        if ( ! $this->_reg_custom_questions_form) {
2229
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2230
-            $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2231
-                EEM_Registration::instance()->get_one_by_ID($REG_ID)
2232
-            );
2233
-            $this->_reg_custom_questions_form->_construct_finalize(null, null);
2234
-        }
2235
-        return $this->_reg_custom_questions_form;
2236
-    }
2237
-
2238
-
2239
-    /**
2240
-     * Saves
2241
-     *
2242
-     * @access private
2243
-     * @param bool $REG_ID
2244
-     * @return bool
2245
-     * @throws EE_Error
2246
-     */
2247
-    private function _save_reg_custom_questions_form($REG_ID = false)
2248
-    {
2249
-        if ( ! $REG_ID) {
2250
-            EE_Error::add_error(
2251
-                esc_html__(
2252
-                    'An error occurred. No registration ID was received.', 'event_espresso'),
2253
-                __FILE__, __FUNCTION__, __LINE__
2254
-            );
2255
-        }
2256
-        $form = $this->_get_reg_custom_questions_form($REG_ID);
2257
-        $form->receive_form_submission($this->_req_data);
2258
-        $success = false;
2259
-        if ($form->is_valid()) {
2260
-            foreach ($form->subforms() as $question_group_id => $question_group_form) {
2261
-                foreach ($question_group_form->inputs() as $question_id => $input) {
2262
-                    $where_conditions    = array(
2263
-                        'QST_ID' => $question_id,
2264
-                        'REG_ID' => $REG_ID,
2265
-                    );
2266
-                    $possibly_new_values = array(
2267
-                        'ANS_value' => $input->normalized_value(),
2268
-                    );
2269
-                    $answer              = EEM_Answer::instance()->get_one(array($where_conditions));
2270
-                    if ($answer instanceof EE_Answer) {
2271
-                        $success = $answer->save($possibly_new_values);
2272
-                    } else {
2273
-                        //insert it then
2274
-                        $cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2275
-                        $answer      = EE_Answer::new_instance($cols_n_vals);
2276
-                        $success     = $answer->save();
2277
-                    }
2278
-                }
2279
-            }
2280
-        } else {
2281
-            EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2282
-        }
2283
-        return $success;
2284
-    }
2285
-
2286
-
2287
-    /**
2288
-     *        generates HTML for the Registration main meta box
2289
-     *
2290
-     * @access public
2291
-     * @return void
2292
-     * @throws DomainException
2293
-     * @throws EE_Error
2294
-     */
2295
-    public function _reg_attendees_meta_box()
2296
-    {
2297
-        $REG = EEM_Registration::instance();
2298
-        //get all other registrations on this transaction, and cache
2299
-        //the attendees for them so we don't have to run another query using force_join
2300
-        $registrations                           = $REG->get_all(array(
2301
-            array(
2302
-                'TXN_ID' => $this->_registration->transaction_ID(),
2303
-                'REG_ID' => array('!=', $this->_registration->ID()),
2304
-            ),
2305
-            'force_join' => array('Attendee'),
2306
-        ));
2307
-        $this->_template_args['attendees']       = array();
2308
-        $this->_template_args['attendee_notice'] = '';
2309
-        if (empty($registrations)
2310
-            || (is_array($registrations)
2311
-                && ! EEH_Array::get_one_item_from_array($registrations))
2312
-        ) {
2313
-            EE_Error::add_error(
2314
-                esc_html__(
2315
-                    'There are no records attached to this registration. Something may have gone wrong with the registration',
2316
-                    'event_espresso'
2317
-                ), __FILE__, __FUNCTION__, __LINE__
2318
-            );
2319
-            $this->_template_args['attendee_notice'] = EE_Error::get_notices();
2320
-        } else {
2321
-            $att_nmbr = 1;
2322
-            foreach ($registrations as $registration) {
2323
-                /* @var $registration EE_Registration */
2324
-                $attendee                                                    = $registration->attendee()
2325
-                    ? $registration->attendee()
2326
-                    : EEM_Attendee::instance()
2327
-                                  ->create_default_object();
2328
-                $this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2329
-                $this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();
2330
-                $this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();
2331
-                $this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();
2332
-                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2333
-                $this->_template_args['attendees'][$att_nmbr]['address']     = implode(
2334
-                    ', ',
2335
-                    $attendee->full_address_as_array()
2336
-                );
2337
-                $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2338
-                    array(
2339
-                        'action' => 'edit_attendee',
2340
-                        'post'   => $attendee->ID(),
2341
-                    ),
2342
-                    REG_ADMIN_URL
2343
-                );
2344
-                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2345
-                $att_nmbr++;
2346
-            }
2347
-            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2348
-        }
2349
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2350
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2351
-    }
2352
-
2353
-
2354
-    /**
2355
-     *        generates HTML for the Edit Registration side meta box
2356
-     *
2357
-     * @access public
2358
-     * @return void
2359
-     * @throws DomainException
2360
-     * @throws EE_Error
2361
-     */
2362
-    public function _reg_registrant_side_meta_box()
2363
-    {
2364
-        /*@var $attendee EE_Attendee */
2365
-        $att_check = $this->_registration->attendee();
2366
-        $attendee  = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2367
-        //now let's determine if this is not the primary registration.  If it isn't then we set the
2368
-        //primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2369
-        //primary registration object (that way we know if we need to show create button or not)
2370
-        if ( ! $this->_registration->is_primary_registrant()) {
2371
-            $primary_registration = $this->_registration->get_primary_registration();
2372
-            $primary_attendee     = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2373
-                : null;
2374
-            if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2375
-                //in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2376
-                //custom attendee object so let's not worry about the primary reg.
2377
-                $primary_registration = null;
2378
-            }
2379
-        } else {
2380
-            $primary_registration = null;
2381
-        }
2382
-        $this->_template_args['ATT_ID']            = $attendee->ID();
2383
-        $this->_template_args['fname']             = $attendee->fname();
2384
-        $this->_template_args['lname']             = $attendee->lname();
2385
-        $this->_template_args['email']             = $attendee->email();
2386
-        $this->_template_args['phone']             = $attendee->phone();
2387
-        $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2388
-        //edit link
2389
-        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2390
-            'action' => 'edit_attendee',
2391
-            'post'   => $attendee->ID(),
2392
-        ), REG_ADMIN_URL);
2393
-        $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2394
-        //create link
2395
-        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2396
-            ? EE_Admin_Page::add_query_args_and_nonce(array(
2397
-                'action'  => 'duplicate_attendee',
2398
-                '_REG_ID' => $this->_registration->ID(),
2399
-            ), REG_ADMIN_URL) : '';
2400
-        $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2401
-        $this->_template_args['att_check']    = $att_check;
2402
-        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2403
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2404
-    }
2405
-
2406
-
2407
-    /**
2408
-     * trash or restore registrations
2409
-     *
2410
-     * @param  boolean $trash whether to archive or restore
2411
-     * @return void
2412
-     * @throws EE_Error
2413
-     * @throws RuntimeException
2414
-     * @access protected
2415
-     */
2416
-    protected function _trash_or_restore_registrations($trash = true)
2417
-    {
2418
-        //if empty _REG_ID then get out because there's nothing to do
2419
-        if (empty($this->_req_data['_REG_ID'])) {
2420
-            EE_Error::add_error(
2421
-                sprintf(
2422
-                    esc_html__(
2423
-                        'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2424
-                        'event_espresso'
2425
-                    ),
2426
-                    $trash ? 'trash' : 'restore'
2427
-                ),
2428
-                __FILE__, __LINE__, __FUNCTION__
2429
-            );
2430
-            $this->_redirect_after_action(false, '', '', array(), true);
2431
-        }
2432
-        $success = 0;
2433
-        $overwrite_msgs = false;
2434
-        //Checkboxes
2435
-        if ( ! is_array($this->_req_data['_REG_ID'])) {
2436
-            $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2437
-        }
2438
-        $reg_count = count($this->_req_data['_REG_ID']);
2439
-        // cycle thru checkboxes
2440
-        foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2441
-            /** @var EE_Registration $REG */
2442
-            $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2443
-            $payments = $REG->registration_payments();
2444
-            if (! empty($payments)) {
2445
-                $name = $REG->attendee() instanceof EE_Attendee
2446
-                    ? $REG->attendee()->full_name()
2447
-                    : esc_html__('Unknown Attendee', 'event_espresso');
2448
-                $overwrite_msgs = true;
2449
-                EE_Error::add_error(
2450
-                    sprintf(
2451
-                        esc_html__(
2452
-                            'The registration for %s could not be trashed because it has payments attached to the related transaction.  If you wish to trash this registration you must first delete the payments on the related transaction.',
2453
-                            'event_espresso'
2454
-                        ),
2455
-                        $name
2456
-                    ),
2457
-                    __FILE__, __FUNCTION__, __LINE__
2458
-                );
2459
-                //can't trash this registration because it has payments.
2460
-                continue;
2461
-            }
2462
-            $updated = $trash ? $REG->delete() : $REG->restore();
2463
-            if ($updated) {
2464
-                $success++;
2465
-            }
2466
-        }
2467
-        $this->_redirect_after_action(
2468
-            $success === $reg_count, // were ALL registrations affected?
2469
-            $success > 1
2470
-                ? esc_html__('Registrations', 'event_espresso')
2471
-                : esc_html__('Registration', 'event_espresso'),
2472
-            $trash
2473
-                ? esc_html__('moved to the trash', 'event_espresso')
2474
-                : esc_html__('restored', 'event_espresso'),
2475
-            array('action' => 'default'),
2476
-            $overwrite_msgs
2477
-        );
2478
-    }
2479
-
2480
-
2481
-    /**
2482
-     * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2483
-     * registration but also.
2484
-     * 1. Removing relations to EE_Attendee
2485
-     * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2486
-     * ALSO trashed.
2487
-     * 3. Deleting permanently any related Line items but only if the above conditions are met.
2488
-     * 4. Removing relationships between all tickets and the related registrations
2489
-     * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2490
-     * 6. Deleting permanently any related Checkins.
2491
-     *
2492
-     * @return void
2493
-     * @throws EE_Error
2494
-     */
2495
-    protected function _delete_registrations()
2496
-    {
2497
-        $REG_MDL = EEM_Registration::instance();
2498
-        $success = 1;
2499
-        //Checkboxes
2500
-        if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2501
-            // if array has more than one element than success message should be plural
2502
-            $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2503
-            // cycle thru checkboxes
2504
-            while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2505
-                $REG = $REG_MDL->get_one_by_ID($REG_ID);
2506
-                if ( ! $REG instanceof EE_Registration) {
2507
-                    continue;
2508
-                }
2509
-                $deleted = $this->_delete_registration($REG);
2510
-                if ( ! $deleted) {
2511
-                    $success = 0;
2512
-                }
2513
-            }
2514
-        } else {
2515
-            // grab single id and delete
2516
-            $REG_ID  = $this->_req_data['_REG_ID'];
2517
-            $REG     = $REG_MDL->get_one_by_ID($REG_ID);
2518
-            $deleted = $this->_delete_registration($REG);
2519
-            if ( ! $deleted) {
2520
-                $success = 0;
2521
-            }
2522
-        }
2523
-        $what        = $success > 1
2524
-            ? esc_html__('Registrations', 'event_espresso')
2525
-            : esc_html__('Registration', 'event_espresso');
2526
-        $action_desc = esc_html__('permanently deleted.', 'event_espresso');
2527
-        $this->_redirect_after_action(
2528
-            $success,
2529
-            $what,
2530
-            $action_desc,
2531
-            array('action' => 'default'),
2532
-            true
2533
-        );
2534
-    }
2535
-
2536
-
2537
-    /**
2538
-     * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2539
-     * models get affected.
2540
-     *
2541
-     * @param  EE_Registration $REG registration to be deleted permenantly
2542
-     * @return bool true = successful deletion, false = fail.
2543
-     * @throws EE_Error
2544
-     */
2545
-    protected function _delete_registration(EE_Registration $REG)
2546
-    {
2547
-        //first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2548
-        //registrations on the transaction that are NOT trashed.
2549
-        $TXN         = $REG->get_first_related('Transaction');
2550
-        $REGS        = $TXN->get_many_related('Registration');
2551
-        $all_trashed = true;
2552
-        foreach ($REGS as $registration) {
2553
-            if ( ! $registration->get('REG_deleted')) {
2554
-                $all_trashed = false;
2555
-            }
2556
-        }
2557
-        if ( ! $all_trashed) {
2558
-            EE_Error::add_error(
2559
-                esc_html__(
2560
-                    'Unable to permanently delete this registration. Before this registration can be permanently deleted, all registrations made in the same transaction must be trashed as well.  These registrations will be permanently deleted in the same action.',
2561
-                    'event_espresso'
2562
-                ),
2563
-                __FILE__, __FUNCTION__, __LINE__
2564
-            );
2565
-            return false;
2566
-        }
2567
-        //k made it here so that means we can delete all the related transactions and their answers (but let's do them
2568
-        //separately from THIS one).
2569
-        foreach ($REGS as $registration) {
2570
-            //delete related answers
2571
-            $registration->delete_related_permanently('Answer');
2572
-            //remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2573
-            $attendee = $registration->get_first_related('Attendee');
2574
-            if ($attendee instanceof EE_Attendee) {
2575
-                $registration->_remove_relation_to($attendee, 'Attendee');
2576
-            }
2577
-            //now remove relationships to tickets on this registration.
2578
-            $registration->_remove_relations('Ticket');
2579
-            //now delete permanently the checkins related to this registration.
2580
-            $registration->delete_related_permanently('Checkin');
2581
-            if ($registration->ID() === $REG->ID()) {
2582
-                continue;
2583
-            } //we don't want to delete permanently the existing registration just yet.
2584
-            //remove relation to transaction for these registrations if NOT the existing registrations
2585
-            $registration->_remove_relations('Transaction');
2586
-            //delete permanently any related messages.
2587
-            $registration->delete_related_permanently('Message');
2588
-            //now delete this registration permanently
2589
-            $registration->delete_permanently();
2590
-        }
2591
-        //now all related registrations on the transaction are handled.  So let's just handle this registration itself
2592
-        // (the transaction and line items should be all that's left).
2593
-        // delete the line items related to the transaction for this registration.
2594
-        $TXN->delete_related_permanently('Line_Item');
2595
-        //we need to remove all the relationships on the transaction
2596
-        $TXN->delete_related_permanently('Payment');
2597
-        $TXN->delete_related_permanently('Extra_Meta');
2598
-        $TXN->delete_related_permanently('Message');
2599
-        //now we can delete this REG permanently (and the transaction of course)
2600
-        $REG->delete_related_permanently('Transaction');
2601
-        return $REG->delete_permanently();
2602
-    }
2603
-
2604
-
2605
-    /**
2606
-     *    generates HTML for the Register New Attendee Admin page
2607
-     *
2608
-     * @access private
2609
-     * @throws DomainException
2610
-     * @throws EE_Error
2611
-     */
2612
-    public function new_registration()
2613
-    {
2614
-        if ( ! $this->_set_reg_event()) {
2615
-            throw new EE_Error(
2616
-                esc_html__(
2617
-                    'Unable to continue with registering because there is no Event ID in the request',
2618
-                    'event_espresso'
2619
-                )
2620
-            );
2621
-        }
2622
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2623
-        // gotta start with a clean slate if we're not coming here via ajax
2624
-        if ( ! defined('DOING_AJAX')
2625
-             && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2626
-        ) {
2627
-            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2628
-        }
2629
-        $this->_template_args['event_name'] = '';
2630
-        // event name
2631
-        if ($this->_reg_event) {
2632
-            $this->_template_args['event_name'] = $this->_reg_event->name();
2633
-            $edit_event_url                     = self::add_query_args_and_nonce(array(
2634
-                'action' => 'edit',
2635
-                'post'   => $this->_reg_event->ID(),
2636
-            ), EVENTS_ADMIN_URL);
2637
-            $edit_event_lnk                     = '<a href="'
2638
-                                                  . $edit_event_url
2639
-                                                  . '" title="'
2640
-                                                  . esc_attr__('Edit ', 'event_espresso')
2641
-                                                  . $this->_reg_event->name()
2642
-                                                  . '">'
2643
-                                                  . esc_html__('Edit Event', 'event_espresso')
2644
-                                                  . '</a>';
2645
-            $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2646
-                                                   . $edit_event_lnk
2647
-                                                   . '</span>';
2648
-        }
2649
-        $this->_template_args['step_content'] = $this->_get_registration_step_content();
2650
-        if (defined('DOING_AJAX')) {
2651
-            $this->_return_json();
2652
-        }
2653
-        // grab header
2654
-        $template_path                              =
2655
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2656
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2657
-            $this->_template_args, true);
2658
-        //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2659
-        // the details template wrapper
2660
-        $this->display_admin_page_with_sidebar();
2661
-    }
2662
-
2663
-
2664
-    /**
2665
-     * This returns the content for a registration step
2666
-     *
2667
-     * @access protected
2668
-     * @return string html
2669
-     * @throws DomainException
2670
-     * @throws EE_Error
2671
-     */
2672
-    protected function _get_registration_step_content()
2673
-    {
2674
-        if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2675
-            $warning_msg = sprintf(
2676
-                esc_html__(
2677
-                    '%2$sWARNING!!!%3$s%1$sPlease do not use the back button to return to this page for the purpose of adding another registration.%1$sThis can result in lost and/or corrupted data.%1$sIf you wish to add another registration, then please click the%1$s%7$s"Add Another New Registration to Event"%8$s button%1$son the Transaction details page, after you are redirected.%1$s%1$s%4$s redirecting in %5$s seconds %6$s',
2678
-                    'event_espresso'
2679
-                ),
2680
-                '<br />',
2681
-                '<h3 class="important-notice">',
2682
-                '</h3>',
2683
-                '<div class="float-right">',
2684
-                '<span id="redirect_timer" class="important-notice">30</span>',
2685
-                '</div>',
2686
-                '<b>',
2687
-                '</b>'
2688
-            );
2689
-            return '
2190
+	}
2191
+
2192
+
2193
+	/**
2194
+	 * Updates the registration's custom questions according to the form info, if the form is submitted.
2195
+	 * If it's not a post, the "view_registrations" route will be called next on the SAME request
2196
+	 * to display the page
2197
+	 *
2198
+	 * @access protected
2199
+	 * @return void
2200
+	 * @throws EE_Error
2201
+	 */
2202
+	protected function _update_attendee_registration_form()
2203
+	{
2204
+		do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
2205
+		if ($_SERVER['REQUEST_METHOD'] == 'POST') {
2206
+			$REG_ID  = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
2207
+			$success = $this->_save_reg_custom_questions_form($REG_ID);
2208
+			if ($success) {
2209
+				$what  = esc_html__('Registration Form', 'event_espresso');
2210
+				$route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
2211
+					: array('action' => 'default');
2212
+				$this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route);
2213
+			}
2214
+		}
2215
+	}
2216
+
2217
+
2218
+	/**
2219
+	 * Gets the form for saving registrations custom questions (if done
2220
+	 * previously retrieves the cached form object, which may have validation errors in it)
2221
+	 *
2222
+	 * @param int $REG_ID
2223
+	 * @return EE_Registration_Custom_Questions_Form
2224
+	 * @throws EE_Error
2225
+	 */
2226
+	protected function _get_reg_custom_questions_form($REG_ID)
2227
+	{
2228
+		if ( ! $this->_reg_custom_questions_form) {
2229
+			require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
2230
+			$this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
2231
+				EEM_Registration::instance()->get_one_by_ID($REG_ID)
2232
+			);
2233
+			$this->_reg_custom_questions_form->_construct_finalize(null, null);
2234
+		}
2235
+		return $this->_reg_custom_questions_form;
2236
+	}
2237
+
2238
+
2239
+	/**
2240
+	 * Saves
2241
+	 *
2242
+	 * @access private
2243
+	 * @param bool $REG_ID
2244
+	 * @return bool
2245
+	 * @throws EE_Error
2246
+	 */
2247
+	private function _save_reg_custom_questions_form($REG_ID = false)
2248
+	{
2249
+		if ( ! $REG_ID) {
2250
+			EE_Error::add_error(
2251
+				esc_html__(
2252
+					'An error occurred. No registration ID was received.', 'event_espresso'),
2253
+				__FILE__, __FUNCTION__, __LINE__
2254
+			);
2255
+		}
2256
+		$form = $this->_get_reg_custom_questions_form($REG_ID);
2257
+		$form->receive_form_submission($this->_req_data);
2258
+		$success = false;
2259
+		if ($form->is_valid()) {
2260
+			foreach ($form->subforms() as $question_group_id => $question_group_form) {
2261
+				foreach ($question_group_form->inputs() as $question_id => $input) {
2262
+					$where_conditions    = array(
2263
+						'QST_ID' => $question_id,
2264
+						'REG_ID' => $REG_ID,
2265
+					);
2266
+					$possibly_new_values = array(
2267
+						'ANS_value' => $input->normalized_value(),
2268
+					);
2269
+					$answer              = EEM_Answer::instance()->get_one(array($where_conditions));
2270
+					if ($answer instanceof EE_Answer) {
2271
+						$success = $answer->save($possibly_new_values);
2272
+					} else {
2273
+						//insert it then
2274
+						$cols_n_vals = array_merge($where_conditions, $possibly_new_values);
2275
+						$answer      = EE_Answer::new_instance($cols_n_vals);
2276
+						$success     = $answer->save();
2277
+					}
2278
+				}
2279
+			}
2280
+		} else {
2281
+			EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2282
+		}
2283
+		return $success;
2284
+	}
2285
+
2286
+
2287
+	/**
2288
+	 *        generates HTML for the Registration main meta box
2289
+	 *
2290
+	 * @access public
2291
+	 * @return void
2292
+	 * @throws DomainException
2293
+	 * @throws EE_Error
2294
+	 */
2295
+	public function _reg_attendees_meta_box()
2296
+	{
2297
+		$REG = EEM_Registration::instance();
2298
+		//get all other registrations on this transaction, and cache
2299
+		//the attendees for them so we don't have to run another query using force_join
2300
+		$registrations                           = $REG->get_all(array(
2301
+			array(
2302
+				'TXN_ID' => $this->_registration->transaction_ID(),
2303
+				'REG_ID' => array('!=', $this->_registration->ID()),
2304
+			),
2305
+			'force_join' => array('Attendee'),
2306
+		));
2307
+		$this->_template_args['attendees']       = array();
2308
+		$this->_template_args['attendee_notice'] = '';
2309
+		if (empty($registrations)
2310
+			|| (is_array($registrations)
2311
+				&& ! EEH_Array::get_one_item_from_array($registrations))
2312
+		) {
2313
+			EE_Error::add_error(
2314
+				esc_html__(
2315
+					'There are no records attached to this registration. Something may have gone wrong with the registration',
2316
+					'event_espresso'
2317
+				), __FILE__, __FUNCTION__, __LINE__
2318
+			);
2319
+			$this->_template_args['attendee_notice'] = EE_Error::get_notices();
2320
+		} else {
2321
+			$att_nmbr = 1;
2322
+			foreach ($registrations as $registration) {
2323
+				/* @var $registration EE_Registration */
2324
+				$attendee                                                    = $registration->attendee()
2325
+					? $registration->attendee()
2326
+					: EEM_Attendee::instance()
2327
+								  ->create_default_object();
2328
+				$this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2329
+				$this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();
2330
+				$this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();
2331
+				$this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();
2332
+				$this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();
2333
+				$this->_template_args['attendees'][$att_nmbr]['address']     = implode(
2334
+					', ',
2335
+					$attendee->full_address_as_array()
2336
+				);
2337
+				$this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(
2338
+					array(
2339
+						'action' => 'edit_attendee',
2340
+						'post'   => $attendee->ID(),
2341
+					),
2342
+					REG_ADMIN_URL
2343
+				);
2344
+				$this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2345
+				$att_nmbr++;
2346
+			}
2347
+			$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2348
+		}
2349
+		$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2350
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2351
+	}
2352
+
2353
+
2354
+	/**
2355
+	 *        generates HTML for the Edit Registration side meta box
2356
+	 *
2357
+	 * @access public
2358
+	 * @return void
2359
+	 * @throws DomainException
2360
+	 * @throws EE_Error
2361
+	 */
2362
+	public function _reg_registrant_side_meta_box()
2363
+	{
2364
+		/*@var $attendee EE_Attendee */
2365
+		$att_check = $this->_registration->attendee();
2366
+		$attendee  = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2367
+		//now let's determine if this is not the primary registration.  If it isn't then we set the
2368
+		//primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the
2369
+		//primary registration object (that way we know if we need to show create button or not)
2370
+		if ( ! $this->_registration->is_primary_registrant()) {
2371
+			$primary_registration = $this->_registration->get_primary_registration();
2372
+			$primary_attendee     = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2373
+				: null;
2374
+			if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2375
+				//in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own
2376
+				//custom attendee object so let's not worry about the primary reg.
2377
+				$primary_registration = null;
2378
+			}
2379
+		} else {
2380
+			$primary_registration = null;
2381
+		}
2382
+		$this->_template_args['ATT_ID']            = $attendee->ID();
2383
+		$this->_template_args['fname']             = $attendee->fname();
2384
+		$this->_template_args['lname']             = $attendee->lname();
2385
+		$this->_template_args['email']             = $attendee->email();
2386
+		$this->_template_args['phone']             = $attendee->phone();
2387
+		$this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2388
+		//edit link
2389
+		$this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2390
+			'action' => 'edit_attendee',
2391
+			'post'   => $attendee->ID(),
2392
+		), REG_ADMIN_URL);
2393
+		$this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso');
2394
+		//create link
2395
+		$this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2396
+			? EE_Admin_Page::add_query_args_and_nonce(array(
2397
+				'action'  => 'duplicate_attendee',
2398
+				'_REG_ID' => $this->_registration->ID(),
2399
+			), REG_ADMIN_URL) : '';
2400
+		$this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso');
2401
+		$this->_template_args['att_check']    = $att_check;
2402
+		$template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2403
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2404
+	}
2405
+
2406
+
2407
+	/**
2408
+	 * trash or restore registrations
2409
+	 *
2410
+	 * @param  boolean $trash whether to archive or restore
2411
+	 * @return void
2412
+	 * @throws EE_Error
2413
+	 * @throws RuntimeException
2414
+	 * @access protected
2415
+	 */
2416
+	protected function _trash_or_restore_registrations($trash = true)
2417
+	{
2418
+		//if empty _REG_ID then get out because there's nothing to do
2419
+		if (empty($this->_req_data['_REG_ID'])) {
2420
+			EE_Error::add_error(
2421
+				sprintf(
2422
+					esc_html__(
2423
+						'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2424
+						'event_espresso'
2425
+					),
2426
+					$trash ? 'trash' : 'restore'
2427
+				),
2428
+				__FILE__, __LINE__, __FUNCTION__
2429
+			);
2430
+			$this->_redirect_after_action(false, '', '', array(), true);
2431
+		}
2432
+		$success = 0;
2433
+		$overwrite_msgs = false;
2434
+		//Checkboxes
2435
+		if ( ! is_array($this->_req_data['_REG_ID'])) {
2436
+			$this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2437
+		}
2438
+		$reg_count = count($this->_req_data['_REG_ID']);
2439
+		// cycle thru checkboxes
2440
+		foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2441
+			/** @var EE_Registration $REG */
2442
+			$REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2443
+			$payments = $REG->registration_payments();
2444
+			if (! empty($payments)) {
2445
+				$name = $REG->attendee() instanceof EE_Attendee
2446
+					? $REG->attendee()->full_name()
2447
+					: esc_html__('Unknown Attendee', 'event_espresso');
2448
+				$overwrite_msgs = true;
2449
+				EE_Error::add_error(
2450
+					sprintf(
2451
+						esc_html__(
2452
+							'The registration for %s could not be trashed because it has payments attached to the related transaction.  If you wish to trash this registration you must first delete the payments on the related transaction.',
2453
+							'event_espresso'
2454
+						),
2455
+						$name
2456
+					),
2457
+					__FILE__, __FUNCTION__, __LINE__
2458
+				);
2459
+				//can't trash this registration because it has payments.
2460
+				continue;
2461
+			}
2462
+			$updated = $trash ? $REG->delete() : $REG->restore();
2463
+			if ($updated) {
2464
+				$success++;
2465
+			}
2466
+		}
2467
+		$this->_redirect_after_action(
2468
+			$success === $reg_count, // were ALL registrations affected?
2469
+			$success > 1
2470
+				? esc_html__('Registrations', 'event_espresso')
2471
+				: esc_html__('Registration', 'event_espresso'),
2472
+			$trash
2473
+				? esc_html__('moved to the trash', 'event_espresso')
2474
+				: esc_html__('restored', 'event_espresso'),
2475
+			array('action' => 'default'),
2476
+			$overwrite_msgs
2477
+		);
2478
+	}
2479
+
2480
+
2481
+	/**
2482
+	 * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2483
+	 * registration but also.
2484
+	 * 1. Removing relations to EE_Attendee
2485
+	 * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2486
+	 * ALSO trashed.
2487
+	 * 3. Deleting permanently any related Line items but only if the above conditions are met.
2488
+	 * 4. Removing relationships between all tickets and the related registrations
2489
+	 * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2490
+	 * 6. Deleting permanently any related Checkins.
2491
+	 *
2492
+	 * @return void
2493
+	 * @throws EE_Error
2494
+	 */
2495
+	protected function _delete_registrations()
2496
+	{
2497
+		$REG_MDL = EEM_Registration::instance();
2498
+		$success = 1;
2499
+		//Checkboxes
2500
+		if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2501
+			// if array has more than one element than success message should be plural
2502
+			$success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2503
+			// cycle thru checkboxes
2504
+			while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2505
+				$REG = $REG_MDL->get_one_by_ID($REG_ID);
2506
+				if ( ! $REG instanceof EE_Registration) {
2507
+					continue;
2508
+				}
2509
+				$deleted = $this->_delete_registration($REG);
2510
+				if ( ! $deleted) {
2511
+					$success = 0;
2512
+				}
2513
+			}
2514
+		} else {
2515
+			// grab single id and delete
2516
+			$REG_ID  = $this->_req_data['_REG_ID'];
2517
+			$REG     = $REG_MDL->get_one_by_ID($REG_ID);
2518
+			$deleted = $this->_delete_registration($REG);
2519
+			if ( ! $deleted) {
2520
+				$success = 0;
2521
+			}
2522
+		}
2523
+		$what        = $success > 1
2524
+			? esc_html__('Registrations', 'event_espresso')
2525
+			: esc_html__('Registration', 'event_espresso');
2526
+		$action_desc = esc_html__('permanently deleted.', 'event_espresso');
2527
+		$this->_redirect_after_action(
2528
+			$success,
2529
+			$what,
2530
+			$action_desc,
2531
+			array('action' => 'default'),
2532
+			true
2533
+		);
2534
+	}
2535
+
2536
+
2537
+	/**
2538
+	 * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2539
+	 * models get affected.
2540
+	 *
2541
+	 * @param  EE_Registration $REG registration to be deleted permenantly
2542
+	 * @return bool true = successful deletion, false = fail.
2543
+	 * @throws EE_Error
2544
+	 */
2545
+	protected function _delete_registration(EE_Registration $REG)
2546
+	{
2547
+		//first we start with the transaction... ultimately, we WILL not delete permanently if there are any related
2548
+		//registrations on the transaction that are NOT trashed.
2549
+		$TXN         = $REG->get_first_related('Transaction');
2550
+		$REGS        = $TXN->get_many_related('Registration');
2551
+		$all_trashed = true;
2552
+		foreach ($REGS as $registration) {
2553
+			if ( ! $registration->get('REG_deleted')) {
2554
+				$all_trashed = false;
2555
+			}
2556
+		}
2557
+		if ( ! $all_trashed) {
2558
+			EE_Error::add_error(
2559
+				esc_html__(
2560
+					'Unable to permanently delete this registration. Before this registration can be permanently deleted, all registrations made in the same transaction must be trashed as well.  These registrations will be permanently deleted in the same action.',
2561
+					'event_espresso'
2562
+				),
2563
+				__FILE__, __FUNCTION__, __LINE__
2564
+			);
2565
+			return false;
2566
+		}
2567
+		//k made it here so that means we can delete all the related transactions and their answers (but let's do them
2568
+		//separately from THIS one).
2569
+		foreach ($REGS as $registration) {
2570
+			//delete related answers
2571
+			$registration->delete_related_permanently('Answer');
2572
+			//remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2573
+			$attendee = $registration->get_first_related('Attendee');
2574
+			if ($attendee instanceof EE_Attendee) {
2575
+				$registration->_remove_relation_to($attendee, 'Attendee');
2576
+			}
2577
+			//now remove relationships to tickets on this registration.
2578
+			$registration->_remove_relations('Ticket');
2579
+			//now delete permanently the checkins related to this registration.
2580
+			$registration->delete_related_permanently('Checkin');
2581
+			if ($registration->ID() === $REG->ID()) {
2582
+				continue;
2583
+			} //we don't want to delete permanently the existing registration just yet.
2584
+			//remove relation to transaction for these registrations if NOT the existing registrations
2585
+			$registration->_remove_relations('Transaction');
2586
+			//delete permanently any related messages.
2587
+			$registration->delete_related_permanently('Message');
2588
+			//now delete this registration permanently
2589
+			$registration->delete_permanently();
2590
+		}
2591
+		//now all related registrations on the transaction are handled.  So let's just handle this registration itself
2592
+		// (the transaction and line items should be all that's left).
2593
+		// delete the line items related to the transaction for this registration.
2594
+		$TXN->delete_related_permanently('Line_Item');
2595
+		//we need to remove all the relationships on the transaction
2596
+		$TXN->delete_related_permanently('Payment');
2597
+		$TXN->delete_related_permanently('Extra_Meta');
2598
+		$TXN->delete_related_permanently('Message');
2599
+		//now we can delete this REG permanently (and the transaction of course)
2600
+		$REG->delete_related_permanently('Transaction');
2601
+		return $REG->delete_permanently();
2602
+	}
2603
+
2604
+
2605
+	/**
2606
+	 *    generates HTML for the Register New Attendee Admin page
2607
+	 *
2608
+	 * @access private
2609
+	 * @throws DomainException
2610
+	 * @throws EE_Error
2611
+	 */
2612
+	public function new_registration()
2613
+	{
2614
+		if ( ! $this->_set_reg_event()) {
2615
+			throw new EE_Error(
2616
+				esc_html__(
2617
+					'Unable to continue with registering because there is no Event ID in the request',
2618
+					'event_espresso'
2619
+				)
2620
+			);
2621
+		}
2622
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2623
+		// gotta start with a clean slate if we're not coming here via ajax
2624
+		if ( ! defined('DOING_AJAX')
2625
+			 && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2626
+		) {
2627
+			EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2628
+		}
2629
+		$this->_template_args['event_name'] = '';
2630
+		// event name
2631
+		if ($this->_reg_event) {
2632
+			$this->_template_args['event_name'] = $this->_reg_event->name();
2633
+			$edit_event_url                     = self::add_query_args_and_nonce(array(
2634
+				'action' => 'edit',
2635
+				'post'   => $this->_reg_event->ID(),
2636
+			), EVENTS_ADMIN_URL);
2637
+			$edit_event_lnk                     = '<a href="'
2638
+												  . $edit_event_url
2639
+												  . '" title="'
2640
+												  . esc_attr__('Edit ', 'event_espresso')
2641
+												  . $this->_reg_event->name()
2642
+												  . '">'
2643
+												  . esc_html__('Edit Event', 'event_espresso')
2644
+												  . '</a>';
2645
+			$this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2646
+												   . $edit_event_lnk
2647
+												   . '</span>';
2648
+		}
2649
+		$this->_template_args['step_content'] = $this->_get_registration_step_content();
2650
+		if (defined('DOING_AJAX')) {
2651
+			$this->_return_json();
2652
+		}
2653
+		// grab header
2654
+		$template_path                              =
2655
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2656
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2657
+			$this->_template_args, true);
2658
+		//$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2659
+		// the details template wrapper
2660
+		$this->display_admin_page_with_sidebar();
2661
+	}
2662
+
2663
+
2664
+	/**
2665
+	 * This returns the content for a registration step
2666
+	 *
2667
+	 * @access protected
2668
+	 * @return string html
2669
+	 * @throws DomainException
2670
+	 * @throws EE_Error
2671
+	 */
2672
+	protected function _get_registration_step_content()
2673
+	{
2674
+		if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2675
+			$warning_msg = sprintf(
2676
+				esc_html__(
2677
+					'%2$sWARNING!!!%3$s%1$sPlease do not use the back button to return to this page for the purpose of adding another registration.%1$sThis can result in lost and/or corrupted data.%1$sIf you wish to add another registration, then please click the%1$s%7$s"Add Another New Registration to Event"%8$s button%1$son the Transaction details page, after you are redirected.%1$s%1$s%4$s redirecting in %5$s seconds %6$s',
2678
+					'event_espresso'
2679
+				),
2680
+				'<br />',
2681
+				'<h3 class="important-notice">',
2682
+				'</h3>',
2683
+				'<div class="float-right">',
2684
+				'<span id="redirect_timer" class="important-notice">30</span>',
2685
+				'</div>',
2686
+				'<b>',
2687
+				'</b>'
2688
+			);
2689
+			return '
2690 2690
 	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2691 2691
 	<script >
2692 2692
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
@@ -2699,792 +2699,792 @@  discard block
 block discarded – undo
2699 2699
 	        }
2700 2700
 	    }, 800 );
2701 2701
 	</script >';
2702
-        }
2703
-        $template_args = array(
2704
-            'title'                    => '',
2705
-            'content'                  => '',
2706
-            'step_button_text'         => '',
2707
-            'show_notification_toggle' => false,
2708
-        );
2709
-        //to indicate we're processing a new registration
2710
-        $hidden_fields = array(
2711
-            'processing_registration' => array(
2712
-                'type'  => 'hidden',
2713
-                'value' => 0,
2714
-            ),
2715
-            'event_id'                => array(
2716
-                'type'  => 'hidden',
2717
-                'value' => $this->_reg_event->ID(),
2718
-            ),
2719
-        );
2720
-        //if the cart is empty then we know we're at step one so we'll display ticket selector
2721
-        $cart = EE_Registry::instance()->SSN->cart();
2722
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2723
-        switch ($step) {
2724
-            case 'ticket' :
2725
-                $hidden_fields['processing_registration']['value'] = 1;
2726
-                $template_args['title']                            = esc_html__(
2727
-                    'Step One: Select the Ticket for this registration',
2728
-                    'event_espresso'
2729
-                );
2730
-                $template_args['content']                          =
2731
-                    EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2732
-                $template_args['step_button_text']                 = esc_html__(
2733
-                    'Add Tickets and Continue to Registrant Details',
2734
-                    'event_espresso'
2735
-                );
2736
-                $template_args['show_notification_toggle']         = false;
2737
-                break;
2738
-            case 'questions' :
2739
-                $hidden_fields['processing_registration']['value'] = 2;
2740
-                $template_args['title']                            = esc_html__(
2741
-                    'Step Two: Add Registrant Details for this Registration',
2742
-                    'event_espresso'
2743
-                );
2744
-                //in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2745
-                // properly by the first process_reg_step run.
2746
-                $template_args['content']                  =
2747
-                    EED_Single_Page_Checkout::registration_checkout_for_admin();
2748
-                $template_args['step_button_text']         = esc_html__(
2749
-                    'Save Registration and Continue to Details',
2750
-                    'event_espresso'
2751
-                );
2752
-                $template_args['show_notification_toggle'] = true;
2753
-                break;
2754
-        }
2755
-        //we come back to the process_registration_step route.
2756
-        $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2757
-        return EEH_Template::display_template(
2758
-            REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2759
-            $template_args,
2760
-            true
2761
-        );
2762
-    }
2763
-
2764
-
2765
-    /**
2766
-     *        set_reg_event
2767
-     *
2768
-     * @access private
2769
-     * @return bool
2770
-     * @throws EE_Error
2771
-     */
2772
-    private function _set_reg_event()
2773
-    {
2774
-        if (is_object($this->_reg_event)) {
2775
-            return true;
2776
-        }
2777
-        $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2778
-        if ( ! $EVT_ID) {
2779
-            return false;
2780
-        }
2781
-        $this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2782
-        return true;
2783
-    }
2784
-
2785
-
2786
-    /**
2787
-     * process_reg_step
2788
-     *
2789
-     * @access        public
2790
-     * @return string
2791
-     * @throws DomainException
2792
-     * @throws EE_Error
2793
-     * @throws RuntimeException
2794
-     */
2795
-    public function process_reg_step()
2796
-    {
2797
-        EE_System::do_not_cache();
2798
-        $this->_set_reg_event();
2799
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2800
-        EE_Registry::instance()->REQ->set('uts', time());
2801
-        //what step are we on?
2802
-        $cart = EE_Registry::instance()->SSN->cart();
2803
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2804
-        //if doing ajax then we need to verify the nonce
2805
-        if (defined('DOING_AJAX')) {
2806
-            $nonce = isset($this->_req_data[$this->_req_nonce])
2807
-                ? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
2808
-            $this->_verify_nonce($nonce, $this->_req_nonce);
2809
-        }
2810
-        switch ($step) {
2811
-            case 'ticket' :
2812
-                //process ticket selection
2813
-                $success = EED_Ticket_Selector::instance()->process_ticket_selections();
2814
-                if ($success) {
2815
-                    EE_Error::add_success(
2816
-                        esc_html__(
2817
-                            'Tickets Selected. Now complete the registration.',
2818
-                            'event_espresso'
2819
-                        )
2820
-                    );
2821
-                } else {
2822
-                    $query_args['step_error'] = $this->_req_data['step_error'] = true;
2823
-                }
2824
-                if (defined('DOING_AJAX')) {
2825
-                    $this->new_registration(); //display next step
2826
-                } else {
2827
-                    $query_args = array(
2828
-                        'action'                  => 'new_registration',
2829
-                        'processing_registration' => 1,
2830
-                        'event_id'                => $this->_reg_event->ID(),
2831
-                        'uts'                     => time(),
2832
-                    );
2833
-                    $this->_redirect_after_action(
2834
-                        false,
2835
-                        '',
2836
-                        '',
2837
-                        $query_args,
2838
-                        true
2839
-                    );
2840
-                }
2841
-                break;
2842
-            case 'questions' :
2843
-                if (! isset(
2844
-                    $this->_req_data['txn_reg_status_change'],
2845
-                    $this->_req_data['txn_reg_status_change']['send_notifications'])
2846
-                ) {
2847
-                    add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
2848
-                }
2849
-                //process registration
2850
-                $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
2851
-                if ($cart instanceof EE_Cart) {
2852
-                    $grand_total = $cart->get_cart_grand_total();
2853
-                    if ($grand_total instanceof EE_Line_Item) {
2854
-                        $grand_total->save_this_and_descendants_to_txn();
2855
-                    }
2856
-                }
2857
-                if ( ! $transaction instanceof EE_Transaction) {
2858
-                    $query_args = array(
2859
-                        'action'                  => 'new_registration',
2860
-                        'processing_registration' => 2,
2861
-                        'event_id'                => $this->_reg_event->ID(),
2862
-                        'uts'                     => time(),
2863
-                    );
2864
-                    if (defined('DOING_AJAX')) {
2865
-                        //display registration form again because there are errors (maybe validation?)
2866
-                        $this->new_registration();
2867
-                        return;
2868
-                    } else {
2869
-                        $this->_redirect_after_action(
2870
-                            false,
2871
-                            '',
2872
-                            '',
2873
-                            $query_args,
2874
-                            true
2875
-                        );
2876
-                        return;
2877
-                    }
2878
-                }
2879
-                // maybe update status, and make sure to save transaction if not done already
2880
-                if ( ! $transaction->update_status_based_on_total_paid()) {
2881
-                    $transaction->save();
2882
-                }
2883
-                EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2884
-                $this->_req_data = array();
2885
-                $query_args      = array(
2886
-                    'action'        => 'redirect_to_txn',
2887
-                    'TXN_ID'        => $transaction->ID(),
2888
-                    'EVT_ID'        => $this->_reg_event->ID(),
2889
-                    'event_name'    => urlencode($this->_reg_event->name()),
2890
-                    'redirect_from' => 'new_registration',
2891
-                );
2892
-                $this->_redirect_after_action(false, '', '', $query_args, true);
2893
-                break;
2894
-        }
2895
-        //what are you looking here for?  Should be nothing to do at this point.
2896
-    }
2897
-
2898
-
2899
-    /**
2900
-     * redirect_to_txn
2901
-     *
2902
-     * @access public
2903
-     * @return void
2904
-     * @throws EE_Error
2905
-     */
2906
-    public function redirect_to_txn()
2907
-    {
2908
-        EE_System::do_not_cache();
2909
-        EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2910
-        $query_args = array(
2911
-            'action' => 'view_transaction',
2912
-            'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
2913
-            'page'   => 'espresso_transactions',
2914
-        );
2915
-        if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
2916
-            $query_args['EVT_ID']        = $this->_req_data['EVT_ID'];
2917
-            $query_args['event_name']    = urlencode($this->_req_data['event_name']);
2918
-            $query_args['redirect_from'] = $this->_req_data['redirect_from'];
2919
-        }
2920
-        EE_Error::add_success(
2921
-            esc_html__(
2922
-                'Registration Created.  Please review the transaction and add any payments as necessary',
2923
-                'event_espresso'
2924
-            )
2925
-        );
2926
-        $this->_redirect_after_action(false, '', '', $query_args, true);
2927
-    }
2928
-
2929
-
2930
-    /**
2931
-     *        generates HTML for the Attendee Contact List
2932
-     *
2933
-     * @access protected
2934
-     * @return void
2935
-     */
2936
-    protected function _attendee_contact_list_table()
2937
-    {
2938
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2939
-        $this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
2940
-        $this->display_admin_list_table_page_with_no_sidebar();
2941
-    }
2942
-
2943
-
2944
-    /**
2945
-     *        get_attendees
2946
-     *
2947
-     * @param      $per_page
2948
-     * @param bool $count whether to return count or data.
2949
-     * @param bool $trash
2950
-     * @return array
2951
-     * @throws EE_Error
2952
-     * @access public
2953
-     */
2954
-    public function get_attendees($per_page, $count = false, $trash = false)
2955
-    {
2956
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2957
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
2958
-        $ATT_MDL                    = EEM_Attendee::instance();
2959
-        $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
2960
-        switch ($this->_req_data['orderby']) {
2961
-            case 'ATT_ID':
2962
-                $orderby = 'ATT_ID';
2963
-                break;
2964
-            case 'ATT_fname':
2965
-                $orderby = 'ATT_fname';
2966
-                break;
2967
-            case 'ATT_email':
2968
-                $orderby = 'ATT_email';
2969
-                break;
2970
-            case 'ATT_city':
2971
-                $orderby = 'ATT_city';
2972
-                break;
2973
-            case 'STA_ID':
2974
-                $orderby = 'STA_ID';
2975
-                break;
2976
-            case 'CNT_ID':
2977
-                $orderby = 'CNT_ID';
2978
-                break;
2979
-            default:
2980
-                $orderby = 'ATT_lname';
2981
-        }
2982
-        $sort         = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
2983
-            ? $this->_req_data['order']
2984
-            : 'ASC';
2985
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
2986
-            ? $this->_req_data['paged']
2987
-            : 1;
2988
-        $per_page     = isset($per_page) && ! empty($per_page) ? $per_page : 10;
2989
-        $per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
2990
-            ? $this->_req_data['perpage']
2991
-            : $per_page;
2992
-        $_where       = array();
2993
-        if ( ! empty($this->_req_data['s'])) {
2994
-            $sstr         = '%' . $this->_req_data['s'] . '%';
2995
-            $_where['OR'] = array(
2996
-                'Registration.Event.EVT_name'       => array('LIKE', $sstr),
2997
-                'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
2998
-                'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
2999
-                'ATT_fname'                         => array('LIKE', $sstr),
3000
-                'ATT_lname'                         => array('LIKE', $sstr),
3001
-                'ATT_short_bio'                     => array('LIKE', $sstr),
3002
-                'ATT_email'                         => array('LIKE', $sstr),
3003
-                'ATT_address'                       => array('LIKE', $sstr),
3004
-                'ATT_address2'                      => array('LIKE', $sstr),
3005
-                'ATT_city'                          => array('LIKE', $sstr),
3006
-                'Country.CNT_name'                  => array('LIKE', $sstr),
3007
-                'State.STA_name'                    => array('LIKE', $sstr),
3008
-                'ATT_phone'                         => array('LIKE', $sstr),
3009
-                'Registration.REG_final_price'      => array('LIKE', $sstr),
3010
-                'Registration.REG_code'             => array('LIKE', $sstr),
3011
-                'Registration.REG_count'            => array('LIKE', $sstr),
3012
-                'Registration.REG_group_size'       => array('LIKE', $sstr),
3013
-            );
3014
-        }
3015
-        $offset = ($current_page - 1) * $per_page;
3016
-        $limit  = $count ? null : array($offset, $per_page);
3017
-        if ($trash) {
3018
-            $_where['status'] = array('!=', 'publish');
3019
-            $all_attendees    = $count
3020
-                ? $ATT_MDL->count(array(
3021
-                    $_where,
3022
-                    'order_by' => array($orderby => $sort),
3023
-                    'limit'    => $limit,
3024
-                ), 'ATT_ID', true)
3025
-                : $ATT_MDL->get_all(array(
3026
-                    $_where,
3027
-                    'order_by' => array($orderby => $sort),
3028
-                    'limit'    => $limit,
3029
-                ));
3030
-        } else {
3031
-            $_where['status'] = array('IN', array('publish'));
3032
-            $all_attendees    = $count
3033
-                ? $ATT_MDL->count(array(
3034
-                    $_where,
3035
-                    'order_by' => array($orderby => $sort),
3036
-                    'limit'    => $limit,
3037
-                ), 'ATT_ID', true)
3038
-                : $ATT_MDL->get_all(array(
3039
-                    $_where,
3040
-                    'order_by' => array($orderby => $sort),
3041
-                    'limit'    => $limit,
3042
-                ));
3043
-        }
3044
-        return $all_attendees;
3045
-    }
3046
-
3047
-
3048
-    /**
3049
-     * This is just taking care of resending the registration confirmation
3050
-     *
3051
-     * @access protected
3052
-     * @return void
3053
-     */
3054
-    protected function _resend_registration()
3055
-    {
3056
-        $this->_process_resend_registration();
3057
-        $query_args = isset($this->_req_data['redirect_to'])
3058
-            ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3059
-            : array('action' => 'default');
3060
-        $this->_redirect_after_action(false, '', '', $query_args, true);
3061
-    }
3062
-
3063
-    /**
3064
-     * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3065
-     * to use when selecting registrations
3066
-     * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3067
-     *                                                     the query parameters from the request
3068
-     * @return void ends the request with a redirect or download
3069
-     */
3070
-    public function _registrations_report_base( $method_name_for_getting_query_params )
3071
-    {
3072
-        if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3073
-            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3074
-                array(
3075
-                    'page'        => 'espresso_batch',
3076
-                    'batch'       => 'file',
3077
-                    'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3078
-                    'filters'     => urlencode(
3079
-                        serialize(
3080
-                            call_user_func(
3081
-                                array( $this, $method_name_for_getting_query_params ),
3082
-                                EEH_Array::is_set(
3083
-                                    $this->_req_data,
3084
-                                    'filters',
3085
-                                    array()
3086
-                                )
3087
-                            )
3088
-                        )
3089
-                ),
3090
-                'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3091
-                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3092
-                'return_url'  => urlencode($this->_req_data['return_url']),
3093
-            )));
3094
-        } else {
3095
-            $new_request_args = array(
3096
-                'export' => 'report',
3097
-                'action' => 'registrations_report_for_event',
3098
-                'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3099
-            );
3100
-            $this->_req_data = array_merge($this->_req_data, $new_request_args);
3101
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3102
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3103
-                $EE_Export = EE_Export::instance($this->_req_data);
3104
-                $EE_Export->export();
3105
-            }
3106
-        }
3107
-    }
3108
-
3109
-
3110
-
3111
-    /**
3112
-     * Creates a registration report using only query parameters in the request
3113
-     * @return void
3114
-     */
3115
-    public function _registrations_report()
3116
-    {
3117
-        $this->_registrations_report_base('_get_registration_query_parameters');
3118
-    }
3119
-
3120
-
3121
-    public function _contact_list_export()
3122
-    {
3123
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3124
-            require_once(EE_CLASSES . 'EE_Export.class.php');
3125
-            $EE_Export = EE_Export::instance($this->_req_data);
3126
-            $EE_Export->export_attendees();
3127
-        }
3128
-    }
3129
-
3130
-
3131
-    public function _contact_list_report()
3132
-    {
3133
-        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3134
-            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
3135
-                'page'        => 'espresso_batch',
3136
-                'batch'       => 'file',
3137
-                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3138
-                'return_url'  => urlencode($this->_req_data['return_url']),
3139
-            )));
3140
-        } else {
3141
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3142
-                require_once(EE_CLASSES . 'EE_Export.class.php');
3143
-                $EE_Export = EE_Export::instance($this->_req_data);
3144
-                $EE_Export->report_attendees();
3145
-            }
3146
-        }
3147
-    }
3148
-
3149
-
3150
-
3151
-
3152
-
3153
-    /***************************************        ATTENDEE DETAILS        ***************************************/
3154
-    /**
3155
-     * This duplicates the attendee object for the given incoming registration id and attendee_id.
3156
-     *
3157
-     * @return void
3158
-     * @throws EE_Error
3159
-     */
3160
-    protected function _duplicate_attendee()
3161
-    {
3162
-        $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3163
-        //verify we have necessary info
3164
-        if (empty($this->_req_data['_REG_ID'])) {
3165
-            EE_Error::add_error(
3166
-                esc_html__(
3167
-                    'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3168
-                    'event_espresso'
3169
-                ), __FILE__, __LINE__, __FUNCTION__
3170
-            );
3171
-            $query_args = array('action' => $action);
3172
-            $this->_redirect_after_action('', '', '', $query_args, true);
3173
-        }
3174
-        //okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3175
-        $registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
3176
-        $attendee     = $registration->attendee();
3177
-        //remove relation of existing attendee on registration
3178
-        $registration->_remove_relation_to($attendee, 'Attendee');
3179
-        //new attendee
3180
-        $new_attendee = clone $attendee;
3181
-        $new_attendee->set('ATT_ID', 0);
3182
-        $new_attendee->save();
3183
-        //add new attendee to reg
3184
-        $registration->_add_relation_to($new_attendee, 'Attendee');
3185
-        EE_Error::add_success(
3186
-            esc_html__(
3187
-                'New Contact record created.  Now make any edits you wish to make for this contact.',
3188
-                'event_espresso'
3189
-            )
3190
-        );
3191
-        //redirect to edit page for attendee
3192
-        $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3193
-        $this->_redirect_after_action('', '', '', $query_args, true);
3194
-    }
3195
-
3196
-
3197
-    //related to cpt routes
3198
-    protected function _insert_update_cpt_item($post_id, $post)
3199
-    {
3200
-        $success  = true;
3201
-        $attendee = EEM_Attendee::instance()->get_one_by_ID($post_id);
3202
-        //for attendee updates
3203
-        if ($post->post_type = 'espresso_attendees' && ! empty($attendee)) {
3204
-            //note we should only be UPDATING attendees at this point.
3205
-            $updated_fields = array(
3206
-                'ATT_fname'     => $this->_req_data['ATT_fname'],
3207
-                'ATT_lname'     => $this->_req_data['ATT_lname'],
3208
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3209
-                'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3210
-                'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3211
-                'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3212
-                'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3213
-                'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3214
-                'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3215
-                'ATT_email'     => isset($this->_req_data['ATT_email']) ? $this->_req_data['ATT_email'] : '',
3216
-                'ATT_phone'     => isset($this->_req_data['ATT_phone']) ? $this->_req_data['ATT_phone'] : '',
3217
-            );
3218
-            foreach ($updated_fields as $field => $value) {
3219
-                $attendee->set($field, $value);
3220
-            }
3221
-            $success                   = $attendee->save();
3222
-            $attendee_update_callbacks = apply_filters(
3223
-                'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3224
-                array()
3225
-            );
3226
-            foreach ($attendee_update_callbacks as $a_callback) {
3227
-                if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3228
-                    throw new EE_Error(
3229
-                        sprintf(
3230
-                            esc_html__(
3231
-                                'The %s callback given for the "FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update" filter is not a valid callback.  Please check the spelling.',
3232
-                                'event_espresso'
3233
-                            ),
3234
-                            $a_callback
3235
-                        )
3236
-                    );
3237
-                }
3238
-            }
3239
-        }
3240
-        if ($success === false) {
3241
-            EE_Error::add_error(
3242
-                esc_html__(
3243
-                    'Something went wrong with updating the meta table data for the registration.',
3244
-                    'event_espresso'
3245
-                ),
3246
-                __FILE__, __FUNCTION__, __LINE__
3247
-            );
3248
-        }
3249
-    }
3250
-
3251
-
3252
-    public function trash_cpt_item($post_id)
3253
-    {
3254
-    }
3255
-
3256
-
3257
-    public function delete_cpt_item($post_id)
3258
-    {
3259
-    }
3260
-
3261
-
3262
-    public function restore_cpt_item($post_id)
3263
-    {
3264
-    }
3265
-
3266
-
3267
-    protected function _restore_cpt_item($post_id, $revision_id)
3268
-    {
3269
-    }
3270
-
3271
-
3272
-    public function attendee_editor_metaboxes()
3273
-    {
3274
-        $this->verify_cpt_object();
3275
-        remove_meta_box(
3276
-            'postexcerpt',
3277
-            esc_html__('Excerpt', 'event_espresso'),
3278
-            'post_excerpt_meta_box',
3279
-            $this->_cpt_routes[$this->_req_action],
3280
-            'normal',
3281
-            'core'
3282
-        );
3283
-        remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3284
-        if (post_type_supports('espresso_attendees', 'excerpt')) {
3285
-            add_meta_box(
3286
-                'postexcerpt',
3287
-                esc_html__('Short Biography', 'event_espresso'),
3288
-                'post_excerpt_meta_box',
3289
-                $this->_cpt_routes[$this->_req_action],
3290
-                'normal'
3291
-            );
3292
-        }
3293
-        if (post_type_supports('espresso_attendees', 'comments')) {
3294
-            add_meta_box(
3295
-                'commentsdiv',
3296
-                esc_html__('Notes on the Contact', 'event_espresso'),
3297
-                'post_comment_meta_box',
3298
-                $this->_cpt_routes[$this->_req_action],
3299
-                'normal',
3300
-                'core'
3301
-            );
3302
-        }
3303
-        add_meta_box(
3304
-            'attendee_contact_info',
3305
-            esc_html__('Contact Info', 'event_espresso'),
3306
-            array($this, 'attendee_contact_info'),
3307
-            $this->_cpt_routes[$this->_req_action],
3308
-            'side',
3309
-            'core'
3310
-        );
3311
-        add_meta_box(
3312
-            'attendee_details_address',
3313
-            esc_html__('Address Details', 'event_espresso'),
3314
-            array($this, 'attendee_address_details'),
3315
-            $this->_cpt_routes[$this->_req_action],
3316
-            'normal',
3317
-            'core'
3318
-        );
3319
-        add_meta_box(
3320
-            'attendee_registrations',
3321
-            esc_html__('Registrations for this Contact', 'event_espresso'),
3322
-            array($this, 'attendee_registrations_meta_box'),
3323
-            $this->_cpt_routes[$this->_req_action],
3324
-            'normal',
3325
-            'high'
3326
-        );
3327
-    }
3328
-
3329
-
3330
-    /**
3331
-     * Metabox for attendee contact info
3332
-     *
3333
-     * @param  WP_Post $post wp post object
3334
-     * @return string attendee contact info ( and form )
3335
-     * @throws DomainException
3336
-     */
3337
-    public function attendee_contact_info($post)
3338
-    {
3339
-        //get attendee object ( should already have it )
3340
-        $this->_template_args['attendee'] = $this->_cpt_model_obj;
3341
-        $template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
3342
-        EEH_Template::display_template($template, $this->_template_args);
3343
-    }
3344
-
3345
-
3346
-    /**
3347
-     * Metabox for attendee details
3348
-     *
3349
-     * @param  WP_Post $post wp post object
3350
-     * @return string attendee address details (and form)
3351
-     * @throws DomainException
3352
-     */
3353
-    public function attendee_address_details($post)
3354
-    {
3355
-        //get attendee object (should already have it)
3356
-        $this->_template_args['attendee']     = $this->_cpt_model_obj;
3357
-        $this->_template_args['state_html']   = EEH_Form_Fields::generate_form_input(
3358
-            new EE_Question_Form_Input(
3359
-                EE_Question::new_instance(
3360
-                    array(
3361
-                        'QST_ID'           => 0,
3362
-                        'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3363
-                        'QST_system'       => 'admin-state',
3364
-                    )
3365
-                ),
3366
-                EE_Answer::new_instance(
3367
-                    array(
3368
-                        'ANS_ID'    => 0,
3369
-                        'ANS_value' => $this->_cpt_model_obj->state_ID(),
3370
-                    )
3371
-                ),
3372
-                array(
3373
-                    'input_id'       => 'STA_ID',
3374
-                    'input_name'     => 'STA_ID',
3375
-                    'input_prefix'   => '',
3376
-                    'append_qstn_id' => false,
3377
-                )
3378
-            )
3379
-        );
3380
-        $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3381
-            new EE_Question_Form_Input(
3382
-                EE_Question::new_instance(
3383
-                    array(
3384
-                        'QST_ID'           => 0,
3385
-                        'QST_display_text' => esc_html__('Country', 'event_espresso'),
3386
-                        'QST_system'       => 'admin-country',
3387
-                    )
3388
-                ),
3389
-                EE_Answer::new_instance(
3390
-                    array(
3391
-                        'ANS_ID'    => 0,
3392
-                        'ANS_value' => $this->_cpt_model_obj->country_ID(),
3393
-                    )
3394
-                ),
3395
-                array(
3396
-                    'input_id'       => 'CNT_ISO',
3397
-                    'input_name'     => 'CNT_ISO',
3398
-                    'input_prefix'   => '',
3399
-                    'append_qstn_id' => false,
3400
-                )
3401
-            )
3402
-        );
3403
-        $template                             =
3404
-            REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3405
-        EEH_Template::display_template($template, $this->_template_args);
3406
-    }
3407
-
3408
-
3409
-    /**
3410
-     *        _attendee_details
3411
-     *
3412
-     * @access protected
3413
-     * @param $post
3414
-     * @return void
3415
-     * @throws DomainException
3416
-     * @throws EE_Error
3417
-     */
3418
-    public function attendee_registrations_meta_box($post)
3419
-    {
3420
-        $this->_template_args['attendee']      = $this->_cpt_model_obj;
3421
-        $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3422
-        $template                              =
3423
-            REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3424
-        EEH_Template::display_template($template, $this->_template_args);
3425
-    }
3426
-
3427
-
3428
-    /**
3429
-     * add in the form fields for the attendee edit
3430
-     *
3431
-     * @param  WP_Post $post wp post object
3432
-     * @return string html for new form.
3433
-     * @throws DomainException
3434
-     */
3435
-    public function after_title_form_fields($post)
3436
-    {
3437
-        if ($post->post_type == 'espresso_attendees') {
3438
-            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3439
-            $template_args['attendee'] = $this->_cpt_model_obj;
3440
-            EEH_Template::display_template($template, $template_args);
3441
-        }
3442
-    }
3443
-
3444
-
3445
-    /**
3446
-     *        _trash_or_restore_attendee
3447
-     *
3448
-     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3449
-     * @return void
3450
-     * @throws EE_Error
3451
-     * @access protected
3452
-     */
3453
-    protected function _trash_or_restore_attendees($trash = true)
3454
-    {
3455
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3456
-        $ATT_MDL = EEM_Attendee::instance();
3457
-        $success = 1;
3458
-        //Checkboxes
3459
-        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3460
-            // if array has more than one element than success message should be plural
3461
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3462
-            // cycle thru checkboxes
3463
-            while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
3464
-                $updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3465
-                    : $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3466
-                if ( ! $updated) {
3467
-                    $success = 0;
3468
-                }
3469
-            }
3470
-        } else {
3471
-            // grab single id and delete
3472
-            $ATT_ID = absint($this->_req_data['ATT_ID']);
3473
-            //get attendee
3474
-            $att     = $ATT_MDL->get_one_by_ID($ATT_ID);
3475
-            $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3476
-            $updated = $att->save();
3477
-            if ( ! $updated) {
3478
-                $success = 0;
3479
-            }
3480
-        }
3481
-        $what        = $success > 1
3482
-            ? esc_html__('Contacts', 'event_espresso')
3483
-            : esc_html__('Contact', 'event_espresso');
3484
-        $action_desc = $trash
3485
-            ? esc_html__('moved to the trash', 'event_espresso')
3486
-            : esc_html__('restored', 'event_espresso');
3487
-        $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3488
-    }
2702
+		}
2703
+		$template_args = array(
2704
+			'title'                    => '',
2705
+			'content'                  => '',
2706
+			'step_button_text'         => '',
2707
+			'show_notification_toggle' => false,
2708
+		);
2709
+		//to indicate we're processing a new registration
2710
+		$hidden_fields = array(
2711
+			'processing_registration' => array(
2712
+				'type'  => 'hidden',
2713
+				'value' => 0,
2714
+			),
2715
+			'event_id'                => array(
2716
+				'type'  => 'hidden',
2717
+				'value' => $this->_reg_event->ID(),
2718
+			),
2719
+		);
2720
+		//if the cart is empty then we know we're at step one so we'll display ticket selector
2721
+		$cart = EE_Registry::instance()->SSN->cart();
2722
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2723
+		switch ($step) {
2724
+			case 'ticket' :
2725
+				$hidden_fields['processing_registration']['value'] = 1;
2726
+				$template_args['title']                            = esc_html__(
2727
+					'Step One: Select the Ticket for this registration',
2728
+					'event_espresso'
2729
+				);
2730
+				$template_args['content']                          =
2731
+					EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2732
+				$template_args['step_button_text']                 = esc_html__(
2733
+					'Add Tickets and Continue to Registrant Details',
2734
+					'event_espresso'
2735
+				);
2736
+				$template_args['show_notification_toggle']         = false;
2737
+				break;
2738
+			case 'questions' :
2739
+				$hidden_fields['processing_registration']['value'] = 2;
2740
+				$template_args['title']                            = esc_html__(
2741
+					'Step Two: Add Registrant Details for this Registration',
2742
+					'event_espresso'
2743
+				);
2744
+				//in theory we should be able to run EED_SPCO at this point because the cart should have been setup
2745
+				// properly by the first process_reg_step run.
2746
+				$template_args['content']                  =
2747
+					EED_Single_Page_Checkout::registration_checkout_for_admin();
2748
+				$template_args['step_button_text']         = esc_html__(
2749
+					'Save Registration and Continue to Details',
2750
+					'event_espresso'
2751
+				);
2752
+				$template_args['show_notification_toggle'] = true;
2753
+				break;
2754
+		}
2755
+		//we come back to the process_registration_step route.
2756
+		$this->_set_add_edit_form_tags('process_reg_step', $hidden_fields);
2757
+		return EEH_Template::display_template(
2758
+			REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php',
2759
+			$template_args,
2760
+			true
2761
+		);
2762
+	}
2763
+
2764
+
2765
+	/**
2766
+	 *        set_reg_event
2767
+	 *
2768
+	 * @access private
2769
+	 * @return bool
2770
+	 * @throws EE_Error
2771
+	 */
2772
+	private function _set_reg_event()
2773
+	{
2774
+		if (is_object($this->_reg_event)) {
2775
+			return true;
2776
+		}
2777
+		$EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2778
+		if ( ! $EVT_ID) {
2779
+			return false;
2780
+		}
2781
+		$this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2782
+		return true;
2783
+	}
2784
+
2785
+
2786
+	/**
2787
+	 * process_reg_step
2788
+	 *
2789
+	 * @access        public
2790
+	 * @return string
2791
+	 * @throws DomainException
2792
+	 * @throws EE_Error
2793
+	 * @throws RuntimeException
2794
+	 */
2795
+	public function process_reg_step()
2796
+	{
2797
+		EE_System::do_not_cache();
2798
+		$this->_set_reg_event();
2799
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2800
+		EE_Registry::instance()->REQ->set('uts', time());
2801
+		//what step are we on?
2802
+		$cart = EE_Registry::instance()->SSN->cart();
2803
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2804
+		//if doing ajax then we need to verify the nonce
2805
+		if (defined('DOING_AJAX')) {
2806
+			$nonce = isset($this->_req_data[$this->_req_nonce])
2807
+				? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
2808
+			$this->_verify_nonce($nonce, $this->_req_nonce);
2809
+		}
2810
+		switch ($step) {
2811
+			case 'ticket' :
2812
+				//process ticket selection
2813
+				$success = EED_Ticket_Selector::instance()->process_ticket_selections();
2814
+				if ($success) {
2815
+					EE_Error::add_success(
2816
+						esc_html__(
2817
+							'Tickets Selected. Now complete the registration.',
2818
+							'event_espresso'
2819
+						)
2820
+					);
2821
+				} else {
2822
+					$query_args['step_error'] = $this->_req_data['step_error'] = true;
2823
+				}
2824
+				if (defined('DOING_AJAX')) {
2825
+					$this->new_registration(); //display next step
2826
+				} else {
2827
+					$query_args = array(
2828
+						'action'                  => 'new_registration',
2829
+						'processing_registration' => 1,
2830
+						'event_id'                => $this->_reg_event->ID(),
2831
+						'uts'                     => time(),
2832
+					);
2833
+					$this->_redirect_after_action(
2834
+						false,
2835
+						'',
2836
+						'',
2837
+						$query_args,
2838
+						true
2839
+					);
2840
+				}
2841
+				break;
2842
+			case 'questions' :
2843
+				if (! isset(
2844
+					$this->_req_data['txn_reg_status_change'],
2845
+					$this->_req_data['txn_reg_status_change']['send_notifications'])
2846
+				) {
2847
+					add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
2848
+				}
2849
+				//process registration
2850
+				$transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
2851
+				if ($cart instanceof EE_Cart) {
2852
+					$grand_total = $cart->get_cart_grand_total();
2853
+					if ($grand_total instanceof EE_Line_Item) {
2854
+						$grand_total->save_this_and_descendants_to_txn();
2855
+					}
2856
+				}
2857
+				if ( ! $transaction instanceof EE_Transaction) {
2858
+					$query_args = array(
2859
+						'action'                  => 'new_registration',
2860
+						'processing_registration' => 2,
2861
+						'event_id'                => $this->_reg_event->ID(),
2862
+						'uts'                     => time(),
2863
+					);
2864
+					if (defined('DOING_AJAX')) {
2865
+						//display registration form again because there are errors (maybe validation?)
2866
+						$this->new_registration();
2867
+						return;
2868
+					} else {
2869
+						$this->_redirect_after_action(
2870
+							false,
2871
+							'',
2872
+							'',
2873
+							$query_args,
2874
+							true
2875
+						);
2876
+						return;
2877
+					}
2878
+				}
2879
+				// maybe update status, and make sure to save transaction if not done already
2880
+				if ( ! $transaction->update_status_based_on_total_paid()) {
2881
+					$transaction->save();
2882
+				}
2883
+				EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2884
+				$this->_req_data = array();
2885
+				$query_args      = array(
2886
+					'action'        => 'redirect_to_txn',
2887
+					'TXN_ID'        => $transaction->ID(),
2888
+					'EVT_ID'        => $this->_reg_event->ID(),
2889
+					'event_name'    => urlencode($this->_reg_event->name()),
2890
+					'redirect_from' => 'new_registration',
2891
+				);
2892
+				$this->_redirect_after_action(false, '', '', $query_args, true);
2893
+				break;
2894
+		}
2895
+		//what are you looking here for?  Should be nothing to do at this point.
2896
+	}
2897
+
2898
+
2899
+	/**
2900
+	 * redirect_to_txn
2901
+	 *
2902
+	 * @access public
2903
+	 * @return void
2904
+	 * @throws EE_Error
2905
+	 */
2906
+	public function redirect_to_txn()
2907
+	{
2908
+		EE_System::do_not_cache();
2909
+		EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2910
+		$query_args = array(
2911
+			'action' => 'view_transaction',
2912
+			'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
2913
+			'page'   => 'espresso_transactions',
2914
+		);
2915
+		if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
2916
+			$query_args['EVT_ID']        = $this->_req_data['EVT_ID'];
2917
+			$query_args['event_name']    = urlencode($this->_req_data['event_name']);
2918
+			$query_args['redirect_from'] = $this->_req_data['redirect_from'];
2919
+		}
2920
+		EE_Error::add_success(
2921
+			esc_html__(
2922
+				'Registration Created.  Please review the transaction and add any payments as necessary',
2923
+				'event_espresso'
2924
+			)
2925
+		);
2926
+		$this->_redirect_after_action(false, '', '', $query_args, true);
2927
+	}
2928
+
2929
+
2930
+	/**
2931
+	 *        generates HTML for the Attendee Contact List
2932
+	 *
2933
+	 * @access protected
2934
+	 * @return void
2935
+	 */
2936
+	protected function _attendee_contact_list_table()
2937
+	{
2938
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2939
+		$this->_search_btn_label = esc_html__('Contacts', 'event_espresso');
2940
+		$this->display_admin_list_table_page_with_no_sidebar();
2941
+	}
2942
+
2943
+
2944
+	/**
2945
+	 *        get_attendees
2946
+	 *
2947
+	 * @param      $per_page
2948
+	 * @param bool $count whether to return count or data.
2949
+	 * @param bool $trash
2950
+	 * @return array
2951
+	 * @throws EE_Error
2952
+	 * @access public
2953
+	 */
2954
+	public function get_attendees($per_page, $count = false, $trash = false)
2955
+	{
2956
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2957
+		require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
2958
+		$ATT_MDL                    = EEM_Attendee::instance();
2959
+		$this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
2960
+		switch ($this->_req_data['orderby']) {
2961
+			case 'ATT_ID':
2962
+				$orderby = 'ATT_ID';
2963
+				break;
2964
+			case 'ATT_fname':
2965
+				$orderby = 'ATT_fname';
2966
+				break;
2967
+			case 'ATT_email':
2968
+				$orderby = 'ATT_email';
2969
+				break;
2970
+			case 'ATT_city':
2971
+				$orderby = 'ATT_city';
2972
+				break;
2973
+			case 'STA_ID':
2974
+				$orderby = 'STA_ID';
2975
+				break;
2976
+			case 'CNT_ID':
2977
+				$orderby = 'CNT_ID';
2978
+				break;
2979
+			default:
2980
+				$orderby = 'ATT_lname';
2981
+		}
2982
+		$sort         = (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
2983
+			? $this->_req_data['order']
2984
+			: 'ASC';
2985
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
2986
+			? $this->_req_data['paged']
2987
+			: 1;
2988
+		$per_page     = isset($per_page) && ! empty($per_page) ? $per_page : 10;
2989
+		$per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
2990
+			? $this->_req_data['perpage']
2991
+			: $per_page;
2992
+		$_where       = array();
2993
+		if ( ! empty($this->_req_data['s'])) {
2994
+			$sstr         = '%' . $this->_req_data['s'] . '%';
2995
+			$_where['OR'] = array(
2996
+				'Registration.Event.EVT_name'       => array('LIKE', $sstr),
2997
+				'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
2998
+				'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
2999
+				'ATT_fname'                         => array('LIKE', $sstr),
3000
+				'ATT_lname'                         => array('LIKE', $sstr),
3001
+				'ATT_short_bio'                     => array('LIKE', $sstr),
3002
+				'ATT_email'                         => array('LIKE', $sstr),
3003
+				'ATT_address'                       => array('LIKE', $sstr),
3004
+				'ATT_address2'                      => array('LIKE', $sstr),
3005
+				'ATT_city'                          => array('LIKE', $sstr),
3006
+				'Country.CNT_name'                  => array('LIKE', $sstr),
3007
+				'State.STA_name'                    => array('LIKE', $sstr),
3008
+				'ATT_phone'                         => array('LIKE', $sstr),
3009
+				'Registration.REG_final_price'      => array('LIKE', $sstr),
3010
+				'Registration.REG_code'             => array('LIKE', $sstr),
3011
+				'Registration.REG_count'            => array('LIKE', $sstr),
3012
+				'Registration.REG_group_size'       => array('LIKE', $sstr),
3013
+			);
3014
+		}
3015
+		$offset = ($current_page - 1) * $per_page;
3016
+		$limit  = $count ? null : array($offset, $per_page);
3017
+		if ($trash) {
3018
+			$_where['status'] = array('!=', 'publish');
3019
+			$all_attendees    = $count
3020
+				? $ATT_MDL->count(array(
3021
+					$_where,
3022
+					'order_by' => array($orderby => $sort),
3023
+					'limit'    => $limit,
3024
+				), 'ATT_ID', true)
3025
+				: $ATT_MDL->get_all(array(
3026
+					$_where,
3027
+					'order_by' => array($orderby => $sort),
3028
+					'limit'    => $limit,
3029
+				));
3030
+		} else {
3031
+			$_where['status'] = array('IN', array('publish'));
3032
+			$all_attendees    = $count
3033
+				? $ATT_MDL->count(array(
3034
+					$_where,
3035
+					'order_by' => array($orderby => $sort),
3036
+					'limit'    => $limit,
3037
+				), 'ATT_ID', true)
3038
+				: $ATT_MDL->get_all(array(
3039
+					$_where,
3040
+					'order_by' => array($orderby => $sort),
3041
+					'limit'    => $limit,
3042
+				));
3043
+		}
3044
+		return $all_attendees;
3045
+	}
3046
+
3047
+
3048
+	/**
3049
+	 * This is just taking care of resending the registration confirmation
3050
+	 *
3051
+	 * @access protected
3052
+	 * @return void
3053
+	 */
3054
+	protected function _resend_registration()
3055
+	{
3056
+		$this->_process_resend_registration();
3057
+		$query_args = isset($this->_req_data['redirect_to'])
3058
+			? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
3059
+			: array('action' => 'default');
3060
+		$this->_redirect_after_action(false, '', '', $query_args, true);
3061
+	}
3062
+
3063
+	/**
3064
+	 * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
3065
+	 * to use when selecting registrations
3066
+	 * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
3067
+	 *                                                     the query parameters from the request
3068
+	 * @return void ends the request with a redirect or download
3069
+	 */
3070
+	public function _registrations_report_base( $method_name_for_getting_query_params )
3071
+	{
3072
+		if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3073
+			wp_redirect(EE_Admin_Page::add_query_args_and_nonce(
3074
+				array(
3075
+					'page'        => 'espresso_batch',
3076
+					'batch'       => 'file',
3077
+					'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3078
+					'filters'     => urlencode(
3079
+						serialize(
3080
+							call_user_func(
3081
+								array( $this, $method_name_for_getting_query_params ),
3082
+								EEH_Array::is_set(
3083
+									$this->_req_data,
3084
+									'filters',
3085
+									array()
3086
+								)
3087
+							)
3088
+						)
3089
+				),
3090
+				'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
3091
+				'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
3092
+				'return_url'  => urlencode($this->_req_data['return_url']),
3093
+			)));
3094
+		} else {
3095
+			$new_request_args = array(
3096
+				'export' => 'report',
3097
+				'action' => 'registrations_report_for_event',
3098
+				'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
3099
+			);
3100
+			$this->_req_data = array_merge($this->_req_data, $new_request_args);
3101
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3102
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3103
+				$EE_Export = EE_Export::instance($this->_req_data);
3104
+				$EE_Export->export();
3105
+			}
3106
+		}
3107
+	}
3108
+
3109
+
3110
+
3111
+	/**
3112
+	 * Creates a registration report using only query parameters in the request
3113
+	 * @return void
3114
+	 */
3115
+	public function _registrations_report()
3116
+	{
3117
+		$this->_registrations_report_base('_get_registration_query_parameters');
3118
+	}
3119
+
3120
+
3121
+	public function _contact_list_export()
3122
+	{
3123
+		if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3124
+			require_once(EE_CLASSES . 'EE_Export.class.php');
3125
+			$EE_Export = EE_Export::instance($this->_req_data);
3126
+			$EE_Export->export_attendees();
3127
+		}
3128
+	}
3129
+
3130
+
3131
+	public function _contact_list_report()
3132
+	{
3133
+		if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
3134
+			wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
3135
+				'page'        => 'espresso_batch',
3136
+				'batch'       => 'file',
3137
+				'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
3138
+				'return_url'  => urlencode($this->_req_data['return_url']),
3139
+			)));
3140
+		} else {
3141
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
3142
+				require_once(EE_CLASSES . 'EE_Export.class.php');
3143
+				$EE_Export = EE_Export::instance($this->_req_data);
3144
+				$EE_Export->report_attendees();
3145
+			}
3146
+		}
3147
+	}
3148
+
3149
+
3150
+
3151
+
3152
+
3153
+	/***************************************        ATTENDEE DETAILS        ***************************************/
3154
+	/**
3155
+	 * This duplicates the attendee object for the given incoming registration id and attendee_id.
3156
+	 *
3157
+	 * @return void
3158
+	 * @throws EE_Error
3159
+	 */
3160
+	protected function _duplicate_attendee()
3161
+	{
3162
+		$action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
3163
+		//verify we have necessary info
3164
+		if (empty($this->_req_data['_REG_ID'])) {
3165
+			EE_Error::add_error(
3166
+				esc_html__(
3167
+					'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
3168
+					'event_espresso'
3169
+				), __FILE__, __LINE__, __FUNCTION__
3170
+			);
3171
+			$query_args = array('action' => $action);
3172
+			$this->_redirect_after_action('', '', '', $query_args, true);
3173
+		}
3174
+		//okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
3175
+		$registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
3176
+		$attendee     = $registration->attendee();
3177
+		//remove relation of existing attendee on registration
3178
+		$registration->_remove_relation_to($attendee, 'Attendee');
3179
+		//new attendee
3180
+		$new_attendee = clone $attendee;
3181
+		$new_attendee->set('ATT_ID', 0);
3182
+		$new_attendee->save();
3183
+		//add new attendee to reg
3184
+		$registration->_add_relation_to($new_attendee, 'Attendee');
3185
+		EE_Error::add_success(
3186
+			esc_html__(
3187
+				'New Contact record created.  Now make any edits you wish to make for this contact.',
3188
+				'event_espresso'
3189
+			)
3190
+		);
3191
+		//redirect to edit page for attendee
3192
+		$query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
3193
+		$this->_redirect_after_action('', '', '', $query_args, true);
3194
+	}
3195
+
3196
+
3197
+	//related to cpt routes
3198
+	protected function _insert_update_cpt_item($post_id, $post)
3199
+	{
3200
+		$success  = true;
3201
+		$attendee = EEM_Attendee::instance()->get_one_by_ID($post_id);
3202
+		//for attendee updates
3203
+		if ($post->post_type = 'espresso_attendees' && ! empty($attendee)) {
3204
+			//note we should only be UPDATING attendees at this point.
3205
+			$updated_fields = array(
3206
+				'ATT_fname'     => $this->_req_data['ATT_fname'],
3207
+				'ATT_lname'     => $this->_req_data['ATT_lname'],
3208
+				'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
3209
+				'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
3210
+				'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
3211
+				'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
3212
+				'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
3213
+				'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
3214
+				'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
3215
+				'ATT_email'     => isset($this->_req_data['ATT_email']) ? $this->_req_data['ATT_email'] : '',
3216
+				'ATT_phone'     => isset($this->_req_data['ATT_phone']) ? $this->_req_data['ATT_phone'] : '',
3217
+			);
3218
+			foreach ($updated_fields as $field => $value) {
3219
+				$attendee->set($field, $value);
3220
+			}
3221
+			$success                   = $attendee->save();
3222
+			$attendee_update_callbacks = apply_filters(
3223
+				'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
3224
+				array()
3225
+			);
3226
+			foreach ($attendee_update_callbacks as $a_callback) {
3227
+				if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
3228
+					throw new EE_Error(
3229
+						sprintf(
3230
+							esc_html__(
3231
+								'The %s callback given for the "FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update" filter is not a valid callback.  Please check the spelling.',
3232
+								'event_espresso'
3233
+							),
3234
+							$a_callback
3235
+						)
3236
+					);
3237
+				}
3238
+			}
3239
+		}
3240
+		if ($success === false) {
3241
+			EE_Error::add_error(
3242
+				esc_html__(
3243
+					'Something went wrong with updating the meta table data for the registration.',
3244
+					'event_espresso'
3245
+				),
3246
+				__FILE__, __FUNCTION__, __LINE__
3247
+			);
3248
+		}
3249
+	}
3250
+
3251
+
3252
+	public function trash_cpt_item($post_id)
3253
+	{
3254
+	}
3255
+
3256
+
3257
+	public function delete_cpt_item($post_id)
3258
+	{
3259
+	}
3260
+
3261
+
3262
+	public function restore_cpt_item($post_id)
3263
+	{
3264
+	}
3265
+
3266
+
3267
+	protected function _restore_cpt_item($post_id, $revision_id)
3268
+	{
3269
+	}
3270
+
3271
+
3272
+	public function attendee_editor_metaboxes()
3273
+	{
3274
+		$this->verify_cpt_object();
3275
+		remove_meta_box(
3276
+			'postexcerpt',
3277
+			esc_html__('Excerpt', 'event_espresso'),
3278
+			'post_excerpt_meta_box',
3279
+			$this->_cpt_routes[$this->_req_action],
3280
+			'normal',
3281
+			'core'
3282
+		);
3283
+		remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
3284
+		if (post_type_supports('espresso_attendees', 'excerpt')) {
3285
+			add_meta_box(
3286
+				'postexcerpt',
3287
+				esc_html__('Short Biography', 'event_espresso'),
3288
+				'post_excerpt_meta_box',
3289
+				$this->_cpt_routes[$this->_req_action],
3290
+				'normal'
3291
+			);
3292
+		}
3293
+		if (post_type_supports('espresso_attendees', 'comments')) {
3294
+			add_meta_box(
3295
+				'commentsdiv',
3296
+				esc_html__('Notes on the Contact', 'event_espresso'),
3297
+				'post_comment_meta_box',
3298
+				$this->_cpt_routes[$this->_req_action],
3299
+				'normal',
3300
+				'core'
3301
+			);
3302
+		}
3303
+		add_meta_box(
3304
+			'attendee_contact_info',
3305
+			esc_html__('Contact Info', 'event_espresso'),
3306
+			array($this, 'attendee_contact_info'),
3307
+			$this->_cpt_routes[$this->_req_action],
3308
+			'side',
3309
+			'core'
3310
+		);
3311
+		add_meta_box(
3312
+			'attendee_details_address',
3313
+			esc_html__('Address Details', 'event_espresso'),
3314
+			array($this, 'attendee_address_details'),
3315
+			$this->_cpt_routes[$this->_req_action],
3316
+			'normal',
3317
+			'core'
3318
+		);
3319
+		add_meta_box(
3320
+			'attendee_registrations',
3321
+			esc_html__('Registrations for this Contact', 'event_espresso'),
3322
+			array($this, 'attendee_registrations_meta_box'),
3323
+			$this->_cpt_routes[$this->_req_action],
3324
+			'normal',
3325
+			'high'
3326
+		);
3327
+	}
3328
+
3329
+
3330
+	/**
3331
+	 * Metabox for attendee contact info
3332
+	 *
3333
+	 * @param  WP_Post $post wp post object
3334
+	 * @return string attendee contact info ( and form )
3335
+	 * @throws DomainException
3336
+	 */
3337
+	public function attendee_contact_info($post)
3338
+	{
3339
+		//get attendee object ( should already have it )
3340
+		$this->_template_args['attendee'] = $this->_cpt_model_obj;
3341
+		$template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
3342
+		EEH_Template::display_template($template, $this->_template_args);
3343
+	}
3344
+
3345
+
3346
+	/**
3347
+	 * Metabox for attendee details
3348
+	 *
3349
+	 * @param  WP_Post $post wp post object
3350
+	 * @return string attendee address details (and form)
3351
+	 * @throws DomainException
3352
+	 */
3353
+	public function attendee_address_details($post)
3354
+	{
3355
+		//get attendee object (should already have it)
3356
+		$this->_template_args['attendee']     = $this->_cpt_model_obj;
3357
+		$this->_template_args['state_html']   = EEH_Form_Fields::generate_form_input(
3358
+			new EE_Question_Form_Input(
3359
+				EE_Question::new_instance(
3360
+					array(
3361
+						'QST_ID'           => 0,
3362
+						'QST_display_text' => esc_html__('State/Province', 'event_espresso'),
3363
+						'QST_system'       => 'admin-state',
3364
+					)
3365
+				),
3366
+				EE_Answer::new_instance(
3367
+					array(
3368
+						'ANS_ID'    => 0,
3369
+						'ANS_value' => $this->_cpt_model_obj->state_ID(),
3370
+					)
3371
+				),
3372
+				array(
3373
+					'input_id'       => 'STA_ID',
3374
+					'input_name'     => 'STA_ID',
3375
+					'input_prefix'   => '',
3376
+					'append_qstn_id' => false,
3377
+				)
3378
+			)
3379
+		);
3380
+		$this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(
3381
+			new EE_Question_Form_Input(
3382
+				EE_Question::new_instance(
3383
+					array(
3384
+						'QST_ID'           => 0,
3385
+						'QST_display_text' => esc_html__('Country', 'event_espresso'),
3386
+						'QST_system'       => 'admin-country',
3387
+					)
3388
+				),
3389
+				EE_Answer::new_instance(
3390
+					array(
3391
+						'ANS_ID'    => 0,
3392
+						'ANS_value' => $this->_cpt_model_obj->country_ID(),
3393
+					)
3394
+				),
3395
+				array(
3396
+					'input_id'       => 'CNT_ISO',
3397
+					'input_name'     => 'CNT_ISO',
3398
+					'input_prefix'   => '',
3399
+					'append_qstn_id' => false,
3400
+				)
3401
+			)
3402
+		);
3403
+		$template                             =
3404
+			REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
3405
+		EEH_Template::display_template($template, $this->_template_args);
3406
+	}
3407
+
3408
+
3409
+	/**
3410
+	 *        _attendee_details
3411
+	 *
3412
+	 * @access protected
3413
+	 * @param $post
3414
+	 * @return void
3415
+	 * @throws DomainException
3416
+	 * @throws EE_Error
3417
+	 */
3418
+	public function attendee_registrations_meta_box($post)
3419
+	{
3420
+		$this->_template_args['attendee']      = $this->_cpt_model_obj;
3421
+		$this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
3422
+		$template                              =
3423
+			REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
3424
+		EEH_Template::display_template($template, $this->_template_args);
3425
+	}
3426
+
3427
+
3428
+	/**
3429
+	 * add in the form fields for the attendee edit
3430
+	 *
3431
+	 * @param  WP_Post $post wp post object
3432
+	 * @return string html for new form.
3433
+	 * @throws DomainException
3434
+	 */
3435
+	public function after_title_form_fields($post)
3436
+	{
3437
+		if ($post->post_type == 'espresso_attendees') {
3438
+			$template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
3439
+			$template_args['attendee'] = $this->_cpt_model_obj;
3440
+			EEH_Template::display_template($template, $template_args);
3441
+		}
3442
+	}
3443
+
3444
+
3445
+	/**
3446
+	 *        _trash_or_restore_attendee
3447
+	 *
3448
+	 * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
3449
+	 * @return void
3450
+	 * @throws EE_Error
3451
+	 * @access protected
3452
+	 */
3453
+	protected function _trash_or_restore_attendees($trash = true)
3454
+	{
3455
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
3456
+		$ATT_MDL = EEM_Attendee::instance();
3457
+		$success = 1;
3458
+		//Checkboxes
3459
+		if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
3460
+			// if array has more than one element than success message should be plural
3461
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
3462
+			// cycle thru checkboxes
3463
+			while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
3464
+				$updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
3465
+					: $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3466
+				if ( ! $updated) {
3467
+					$success = 0;
3468
+				}
3469
+			}
3470
+		} else {
3471
+			// grab single id and delete
3472
+			$ATT_ID = absint($this->_req_data['ATT_ID']);
3473
+			//get attendee
3474
+			$att     = $ATT_MDL->get_one_by_ID($ATT_ID);
3475
+			$updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3476
+			$updated = $att->save();
3477
+			if ( ! $updated) {
3478
+				$success = 0;
3479
+			}
3480
+		}
3481
+		$what        = $success > 1
3482
+			? esc_html__('Contacts', 'event_espresso')
3483
+			: esc_html__('Contact', 'event_espresso');
3484
+		$action_desc = $trash
3485
+			? esc_html__('moved to the trash', 'event_espresso')
3486
+			: esc_html__('restored', 'event_espresso');
3487
+		$this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3488
+	}
3489 3489
 
3490 3490
 }
Please login to merge, or discard this patch.
admin_pages/registrations/EE_Attendee_Contact_List_Table.class.php 1 patch
Spacing   +36 added lines, -36 removed lines patch added patch discarded remove patch
@@ -4,7 +4,7 @@  discard block
 block discarded – undo
4 4
 class EE_Attendee_Contact_List_Table extends EE_Admin_List_Table {
5 5
 
6 6
 
7
-	public function __construct( $admin_page ) {
7
+	public function __construct($admin_page) {
8 8
 		parent::__construct($admin_page);
9 9
 	}
10 10
 
@@ -12,8 +12,8 @@  discard block
 block discarded – undo
12 12
 
13 13
 
14 14
 	protected function _setup_data() {
15
-		$this->_data = $this->_view != 'trash' ? $this->_admin_page->get_attendees( $this->_per_page ) : $this->_admin_page->get_attendees( $this->_per_page, FALSE, TRUE );
16
-		$this->_all_data_count = $this->_view != 'trash' ? $this->_admin_page->get_attendees( $this->_per_page, TRUE ) : $this->_admin_page->get_attendees( $this->_per_page,TRUE, TRUE );
15
+		$this->_data = $this->_view != 'trash' ? $this->_admin_page->get_attendees($this->_per_page) : $this->_admin_page->get_attendees($this->_per_page, FALSE, TRUE);
16
+		$this->_all_data_count = $this->_view != 'trash' ? $this->_admin_page->get_attendees($this->_per_page, TRUE) : $this->_admin_page->get_attendees($this->_per_page, TRUE, TRUE);
17 17
 	}
18 18
 
19 19
 
@@ -41,13 +41,13 @@  discard block
 block discarded – undo
41 41
 			);
42 42
 
43 43
 		$this->_sortable_columns = array(
44
-			'ATT_ID' => array( 'ATT_ID' => FALSE ),
45
-			'ATT_lname' => array( 'ATT_lname' => TRUE ), //true means its already sorted
46
-			'ATT_fname' => array( 'ATT_fname' => FALSE ),
47
-			'ATT_email' => array( 'ATT_email' => FALSE ),
48
-			'ATT_city' => array( 'ATT_city' => FALSE ),
49
-			'STA_ID' => array( 'STA_ID' => FALSE ),
50
-			'CNT_ISO' => array( 'CNT_ISO' => FALSE )
44
+			'ATT_ID' => array('ATT_ID' => FALSE),
45
+			'ATT_lname' => array('ATT_lname' => TRUE), //true means its already sorted
46
+			'ATT_fname' => array('ATT_fname' => FALSE),
47
+			'ATT_email' => array('ATT_email' => FALSE),
48
+			'ATT_city' => array('ATT_city' => FALSE),
49
+			'STA_ID' => array('STA_ID' => FALSE),
50
+			'CNT_ISO' => array('CNT_ISO' => FALSE)
51 51
 		);
52 52
 
53 53
 		$this->_hidden_columns = array();
@@ -64,9 +64,9 @@  discard block
 block discarded – undo
64 64
 
65 65
 
66 66
 	protected function _add_view_counts() {
67
-		$this->_views['in_use']['count'] = $this->_admin_page->get_attendees( $this->_per_page, TRUE );
68
-		if ( EE_Registry::instance()->CAP->current_user_can( 'ee_delete_contacts', 'espresso_registrations_delete_registration' ) ) {
69
-			$this->_views['trash']['count'] = $this->_admin_page->get_attendees( $this->_per_page,TRUE, TRUE );
67
+		$this->_views['in_use']['count'] = $this->_admin_page->get_attendees($this->_per_page, TRUE);
68
+		if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts', 'espresso_registrations_delete_registration')) {
69
+			$this->_views['trash']['count'] = $this->_admin_page->get_attendees($this->_per_page, TRUE, TRUE);
70 70
 		}
71 71
 	}
72 72
 
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
 
90 90
 
91 91
 	function column_cb($item) {
92
-		return sprintf( '<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />', /* $1%s */ $item->ID() );
92
+		return sprintf('<input type="checkbox" name="checkbox[%1$s]" value="%1$s" />', /* $1%s */ $item->ID());
93 93
 	}
94 94
 
95 95
 
@@ -97,9 +97,9 @@  discard block
 block discarded – undo
97 97
 
98 98
 
99 99
 	function column_ATT_ID($item) {
100
-		$content =  $item->ID();
100
+		$content = $item->ID();
101 101
 		$attendee_name = $item instanceof EE_Attendee ? $item->full_name() : '';
102
-		$content .= '  <span class="show-on-mobile-view-only">' . $attendee_name . '</span>';
102
+		$content .= '  <span class="show-on-mobile-view-only">'.$attendee_name.'</span>';
103 103
 		return $content;
104 104
 	}
105 105
 
@@ -110,8 +110,8 @@  discard block
 block discarded – undo
110 110
 	function column_ATT_lname($item) {
111 111
 
112 112
 		// edit attendee link
113
-		$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce( array( 'action'=>'edit_attendee', 'post'=>$item->ID() ), REG_ADMIN_URL );
114
-		$name_link = EE_Registry::instance()->CAP->current_user_can( 'ee_edit_contacts', 'espresso_registrations_edit_attendee' ) ?  '<a href="'.$edit_lnk_url.'" title="' . esc_attr__( 'Edit Contact', 'event_espresso' ) . '">' . $item->lname() . '</a>' : $item->lname();
113
+		$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array('action'=>'edit_attendee', 'post'=>$item->ID()), REG_ADMIN_URL);
114
+		$name_link = EE_Registry::instance()->CAP->current_user_can('ee_edit_contacts', 'espresso_registrations_edit_attendee') ? '<a href="'.$edit_lnk_url.'" title="'.esc_attr__('Edit Contact', 'event_espresso').'">'.$item->lname().'</a>' : $item->lname();
115 115
 		return $name_link;
116 116
 
117 117
 	}
@@ -124,30 +124,30 @@  discard block
 block discarded – undo
124 124
 		//Build row actions
125 125
 		$actions = array();
126 126
 		// edit attendee link
127
-		if ( EE_Registry::instance()->CAP->current_user_can( 'ee_edit_contacts', 'espresso_registrations_edit_attendee' ) ) {
128
-			$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce( array( 'action'=>'edit_attendee', 'post'=>$item->ID() ), REG_ADMIN_URL );
129
-			$actions['edit'] = '<a href="'.$edit_lnk_url.'" title="' . esc_attr__( 'Edit Contact', 'event_espresso' ) . '">' . __( 'Edit', 'event_espresso' ) . '</a>';
127
+		if (EE_Registry::instance()->CAP->current_user_can('ee_edit_contacts', 'espresso_registrations_edit_attendee')) {
128
+			$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array('action'=>'edit_attendee', 'post'=>$item->ID()), REG_ADMIN_URL);
129
+			$actions['edit'] = '<a href="'.$edit_lnk_url.'" title="'.esc_attr__('Edit Contact', 'event_espresso').'">'.__('Edit', 'event_espresso').'</a>';
130 130
 		}
131 131
 
132
-		if ( $this->_view == 'in_use' ) {
132
+		if ($this->_view == 'in_use') {
133 133
 			// trash attendee link
134
-			if ( EE_Registry::instance()->CAP->current_user_can( 'ee_delete_contacts', 'espresso_registrations_trash_attendees' ) ) {
135
-				$trash_lnk_url = EE_Admin_Page::add_query_args_and_nonce( array( 'action'=>'trash_attendee', 'ATT_ID'=>$item->ID() ), REG_ADMIN_URL );
136
-				$actions['trash'] = '<a href="'.$trash_lnk_url.'" title="' . esc_attr__( 'Move Contact to Trash', 'event_espresso' ) . '">' . __( 'Trash', 'event_espresso' ) . '</a>';
134
+			if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts', 'espresso_registrations_trash_attendees')) {
135
+				$trash_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array('action'=>'trash_attendee', 'ATT_ID'=>$item->ID()), REG_ADMIN_URL);
136
+				$actions['trash'] = '<a href="'.$trash_lnk_url.'" title="'.esc_attr__('Move Contact to Trash', 'event_espresso').'">'.__('Trash', 'event_espresso').'</a>';
137 137
 			}
138 138
 		} else {
139
-			if ( EE_Registry::instance()->CAP->current_user_can( 'ee_delete_contacts', 'espresso_registrations_restore_attendees' ) ) {
139
+			if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts', 'espresso_registrations_restore_attendees')) {
140 140
 				// restore attendee link
141
-				$restore_lnk_url = EE_Admin_Page::add_query_args_and_nonce( array( 'action'=>'restore_attendees', 'ATT_ID'=>$item->ID() ), REG_ADMIN_URL );
142
-				$actions['restore'] = '<a href="'.$restore_lnk_url.'" title="' . esc_attr__( 'Restore Contact', 'event_espresso' ) . '">' . __( 'Restore', 'event_espresso' ) . '</a>';
141
+				$restore_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array('action'=>'restore_attendees', 'ATT_ID'=>$item->ID()), REG_ADMIN_URL);
142
+				$actions['restore'] = '<a href="'.$restore_lnk_url.'" title="'.esc_attr__('Restore Contact', 'event_espresso').'">'.__('Restore', 'event_espresso').'</a>';
143 143
 			}
144 144
 		}
145 145
 
146
-		$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce( array( 'action'=>'edit_attendee', 'post'=>$item->ID() ), REG_ADMIN_URL );
147
-		$name_link = EE_Registry::instance()->CAP->current_user_can( 'ee_edit_contacts', 'espresso_registrations_edit_attendee' ) ?  '<a href="'.$edit_lnk_url.'" title="' . esc_attr__( 'Edit Contact', 'event_espresso' ) . '">' . $item->fname() . '</a>' : $item->fname();
146
+		$edit_lnk_url = EE_Admin_Page::add_query_args_and_nonce(array('action'=>'edit_attendee', 'post'=>$item->ID()), REG_ADMIN_URL);
147
+		$name_link = EE_Registry::instance()->CAP->current_user_can('ee_edit_contacts', 'espresso_registrations_edit_attendee') ? '<a href="'.$edit_lnk_url.'" title="'.esc_attr__('Edit Contact', 'event_espresso').'">'.$item->fname().'</a>' : $item->fname();
148 148
 
149 149
 		//Return the name contents
150
-		return sprintf('%1$s %2$s', $name_link, $this->row_actions($actions) );
150
+		return sprintf('%1$s %2$s', $name_link, $this->row_actions($actions));
151 151
 	}
152 152
 
153 153
 
@@ -155,7 +155,7 @@  discard block
 block discarded – undo
155 155
 
156 156
 
157 157
 	function column_ATT_email($item) {
158
-		return '<a href="mailto:' . $item->email() . '">' . $item->email() . '</a>';
158
+		return '<a href="mailto:'.$item->email().'">'.$item->email().'</a>';
159 159
 	}
160 160
 
161 161
 
@@ -175,8 +175,8 @@  discard block
 block discarded – undo
175 175
 
176 176
 	function column_STA_ID($item) {
177 177
 		$states = EEM_State::instance()->get_all_states();
178
-		$state = isset( $states[ $item->state_ID() ] ) ? $states[ $item->state_ID() ]->get( 'STA_name' ) : $item->state_ID();
179
-		return ! is_numeric( $state ) ? $state : '';
178
+		$state = isset($states[$item->state_ID()]) ? $states[$item->state_ID()]->get('STA_name') : $item->state_ID();
179
+		return ! is_numeric($state) ? $state : '';
180 180
 	}
181 181
 
182 182
 
@@ -184,8 +184,8 @@  discard block
 block discarded – undo
184 184
 	function column_CNT_ISO($item) {
185 185
 		$countries = EEM_Country::instance()->get_all_countries();
186 186
 		//EEH_Debug_Tools::printr( $countries, '$countries  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
187
-		$country = isset( $countries[ $item->country_ID() ] ) ? $countries[ $item->country_ID() ]->get( 'CNT_name' ) : $item->country_ID();
188
-		return ! is_numeric( $country ) ? $country : '';
187
+		$country = isset($countries[$item->country_ID()]) ? $countries[$item->country_ID()]->get('CNT_name') : $item->country_ID();
188
+		return ! is_numeric($country) ? $country : '';
189 189
 	}
190 190
 
191 191
 
Please login to merge, or discard this patch.