Completed
Branch BUG-10725-paypal-express-dupli... (d2dd3a)
by
unknown
12:24 queued 12s
created
core/EE_Front_Controller.core.php 2 patches
Indentation   +467 added lines, -467 removed lines patch added patch discarded remove patch
@@ -3,7 +3,7 @@  discard block
 block discarded – undo
3 3
 use EventEspresso\widgets\EspressoWidget;
4 4
 
5 5
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
6
-    exit('No direct script access allowed');
6
+	exit('No direct script access allowed');
7 7
 }
8 8
 
9 9
 /**
@@ -26,379 +26,379 @@  discard block
 block discarded – undo
26 26
 final class EE_Front_Controller
27 27
 {
28 28
 
29
-    /**
30
-     * @var string $_template_path
31
-     */
32
-    private $_template_path;
33
-
34
-    /**
35
-     * @var string $_template
36
-     */
37
-    private $_template;
38
-
39
-    /**
40
-     * @type EE_Registry $Registry
41
-     */
42
-    protected $Registry;
43
-
44
-    /**
45
-     * @type EE_Request_Handler $Request_Handler
46
-     */
47
-    protected $Request_Handler;
48
-
49
-    /**
50
-     * @type EE_Module_Request_Router $Module_Request_Router
51
-     */
52
-    protected $Module_Request_Router;
53
-
54
-
55
-    /**
56
-     *    class constructor
57
-     *    should fire after shortcode, module, addon, or other plugin's default priority init phases have run
58
-     *
59
-     * @access    public
60
-     * @param \EE_Registry              $Registry
61
-     * @param \EE_Request_Handler       $Request_Handler
62
-     * @param \EE_Module_Request_Router $Module_Request_Router
63
-     */
64
-    public function __construct(
65
-        EE_Registry $Registry,
66
-        EE_Request_Handler $Request_Handler,
67
-        EE_Module_Request_Router $Module_Request_Router
68
-    ) {
69
-        $this->Registry              = $Registry;
70
-        $this->Request_Handler       = $Request_Handler;
71
-        $this->Module_Request_Router = $Module_Request_Router;
72
-        // determine how to integrate WP_Query with the EE models
73
-        add_action('AHEE__EE_System__initialize', array($this, 'employ_CPT_Strategy'));
74
-        // load other resources and begin to actually run shortcodes and modules
75
-        add_action('wp_loaded', array($this, 'wp_loaded'), 5);
76
-        // analyse the incoming WP request
77
-        add_action('parse_request', array($this, 'get_request'), 1, 1);
78
-        // process request with module factory
79
-        add_action('pre_get_posts', array($this, 'pre_get_posts'), 10, 1);
80
-        // before headers sent
81
-        add_action('wp', array($this, 'wp'), 5);
82
-        // after headers sent but before any markup is output,
83
-        // primarily used to process any content shortcodes
84
-        add_action('get_header', array($this, 'get_header'));
85
-        // header
86
-        add_action('wp_head', array($this, 'header_meta_tag'), 5);
87
-        add_action('wp_print_scripts', array($this, 'wp_print_scripts'), 10);
88
-        add_filter('template_include', array($this, 'template_include'), 1);
89
-        // display errors
90
-        add_action('loop_start', array($this, 'display_errors'), 2);
91
-        // the content
92
-        // add_filter( 'the_content', array( $this, 'the_content' ), 5, 1 );
93
-        //exclude our private cpt comments
94
-        add_filter('comments_clauses', array($this, 'filter_wp_comments'), 10, 1);
95
-        //make sure any ajax requests will respect the url schema when requests are made against admin-ajax.php (http:// or https://)
96
-        add_filter('admin_url', array($this, 'maybe_force_admin_ajax_ssl'), 200, 1);
97
-        // action hook EE
98
-        do_action('AHEE__EE_Front_Controller__construct__done', $this);
99
-        // for checking that browser cookies are enabled
100
-        if (apply_filters('FHEE__EE_Front_Controller____construct__set_test_cookie', true)) {
101
-            setcookie('ee_cookie_test', uniqid('ect',true), time() + DAY_IN_SECONDS, '/');
102
-        }
103
-    }
104
-
105
-
106
-    /**
107
-     * @return EE_Request_Handler
108
-     */
109
-    public function Request_Handler()
110
-    {
111
-        return $this->Request_Handler;
112
-    }
113
-
114
-
115
-    /**
116
-     * @return EE_Module_Request_Router
117
-     */
118
-    public function Module_Request_Router()
119
-    {
120
-        return $this->Module_Request_Router;
121
-    }
122
-
123
-
124
-
125
-    /**
126
-     * @return LegacyShortcodesManager
127
-     */
128
-    public function getLegacyShortcodesManager()
129
-    {
130
-        return EE_Config::getLegacyShortcodesManager();
131
-    }
132
-
133
-
134
-
135
-
136
-
137
-    /***********************************************        INIT ACTION HOOK         ***********************************************/
138
-
139
-
140
-
141
-    /**
142
-     * filter_wp_comments
143
-     * This simply makes sure that any "private" EE CPTs do not have their comments show up in any wp comment
144
-     * widgets/queries done on frontend
145
-     *
146
-     * @param  array $clauses array of comment clauses setup by WP_Comment_Query
147
-     * @return array array of comment clauses with modifications.
148
-     */
149
-    public function filter_wp_comments($clauses)
150
-    {
151
-        global $wpdb;
152
-        if (strpos($clauses['join'], $wpdb->posts) !== false) {
153
-            $cpts = EE_Register_CPTs::get_private_CPTs();
154
-            foreach ($cpts as $cpt => $details) {
155
-                $clauses['where'] .= $wpdb->prepare(" AND $wpdb->posts.post_type != %s", $cpt);
156
-            }
157
-        }
158
-        return $clauses;
159
-    }
160
-
161
-
162
-    /**
163
-     *    employ_CPT_Strategy
164
-     *
165
-     * @access    public
166
-     * @return    void
167
-     */
168
-    public function employ_CPT_Strategy()
169
-    {
170
-        if (apply_filters('FHEE__EE_Front_Controller__employ_CPT_Strategy', true)) {
171
-            $this->Registry->load_core('CPT_Strategy');
172
-        }
173
-    }
174
-
175
-
176
-    /**
177
-     * this just makes sure that if the site is using ssl that we force that for any admin ajax calls from frontend
178
-     *
179
-     * @param  string $url incoming url
180
-     * @return string         final assembled url
181
-     */
182
-    public function maybe_force_admin_ajax_ssl($url)
183
-    {
184
-        if (is_ssl() && preg_match('/admin-ajax.php/', $url)) {
185
-            $url = str_replace('http://', 'https://', $url);
186
-        }
187
-        return $url;
188
-    }
189
-
190
-
191
-
192
-
193
-
194
-
195
-    /***********************************************        WP_LOADED ACTION HOOK         ***********************************************/
196
-
197
-
198
-    /**
199
-     *    wp_loaded - should fire after shortcode, module, addon, or other plugin's have been registered and their
200
-     *    default priority init phases have run
201
-     *
202
-     * @access    public
203
-     * @return    void
204
-     */
205
-    public function wp_loaded()
206
-    {
207
-    }
208
-
209
-
210
-
211
-
212
-
213
-    /***********************************************        PARSE_REQUEST HOOK         ***********************************************/
214
-    /**
215
-     *    _get_request
216
-     *
217
-     * @access public
218
-     * @param WP $WP
219
-     * @return void
220
-     */
221
-    public function get_request(WP $WP)
222
-    {
223
-        do_action('AHEE__EE_Front_Controller__get_request__start');
224
-        $this->Request_Handler->parse_request($WP);
225
-        do_action('AHEE__EE_Front_Controller__get_request__complete');
226
-    }
227
-
228
-
229
-
230
-    /**
231
-     *    pre_get_posts - basically a module factory for instantiating modules and selecting the final view template
232
-     *
233
-     * @access    public
234
-     * @param   WP_Query $WP_Query
235
-     * @return    void
236
-     */
237
-    public function pre_get_posts($WP_Query)
238
-    {
239
-        // only load Module_Request_Router if this is the main query
240
-        if (
241
-            $this->Module_Request_Router instanceof EE_Module_Request_Router
242
-            && $WP_Query->is_main_query()
243
-        ) {
244
-            // cycle thru module routes
245
-            while ($route = $this->Module_Request_Router->get_route($WP_Query)) {
246
-                // determine module and method for route
247
-                $module = $this->Module_Request_Router->resolve_route($route[0], $route[1]);
248
-                if ($module instanceof EED_Module) {
249
-                    // get registered view for route
250
-                    $this->_template_path = $this->Module_Request_Router->get_view($route);
251
-                    // grab module name
252
-                    $module_name = $module->module_name();
253
-                    // map the module to the module objects
254
-                    $this->Registry->modules->{$module_name} = $module;
255
-                }
256
-            }
257
-        }
258
-    }
259
-
260
-
261
-
262
-
263
-
264
-    /***********************************************        WP HOOK         ***********************************************/
265
-
266
-
267
-    /**
268
-     *    wp - basically last chance to do stuff before headers sent
269
-     *
270
-     * @access    public
271
-     * @return    void
272
-     */
273
-    public function wp()
274
-    {
275
-    }
276
-
277
-
278
-
279
-    /***********************     GET_HEADER && WP_HEAD HOOK     ***********************/
280
-
281
-
282
-
283
-    /**
284
-     * callback for the WP "get_header" hook point
285
-     * checks sidebars for EE widgets
286
-     * loads resources and assets accordingly
287
-     *
288
-     * @return void
289
-     */
290
-    public function get_header()
291
-    {
292
-        global $wp_query;
293
-        if (empty($wp_query->posts)){
294
-            return;
295
-        }
296
-        // if we already know this is an espresso page, then load assets
297
-        $load_assets = $this->Request_Handler->is_espresso_page();
298
-        // if we are already loading assets then just move along, otherwise check for widgets
299
-        $load_assets = $load_assets ? $load_assets : $this->espresso_widgets_in_active_sidebars();
300
-        if ( $load_assets){
301
-            wp_enqueue_style('espresso_default');
302
-            wp_enqueue_style('espresso_custom_css');
303
-            wp_enqueue_script('espresso_core');
304
-        }
305
-    }
306
-
307
-
308
-
309
-    /**
310
-     * builds list of active widgets then scans active sidebars looking for them
311
-     * returns true is an EE widget is found in an active sidebar
312
-     * Please Note: this does NOT mean that the sidebar or widget
313
-     * is actually in use in a given template, as that is unfortunately not known
314
-     * until a sidebar and it's widgets are actually loaded
315
-     *
316
-     * @return boolean
317
-     */
318
-    private function espresso_widgets_in_active_sidebars()
319
-    {
320
-        $espresso_widgets = array();
321
-        foreach ($this->Registry->widgets as $widget_class => $widget) {
322
-            $id_base = EspressoWidget::getIdBase($widget_class);
323
-            if (is_active_widget(false, false, $id_base)) {
324
-                $espresso_widgets[] = $id_base;
325
-            }
326
-        }
327
-        $all_sidebar_widgets = wp_get_sidebars_widgets();
328
-        foreach ($all_sidebar_widgets as $sidebar_name => $sidebar_widgets) {
329
-            if (is_array($sidebar_widgets) && ! empty($sidebar_widgets)) {
330
-                foreach ($sidebar_widgets as $sidebar_widget) {
331
-                    foreach ($espresso_widgets as $espresso_widget) {
332
-                        if (strpos($sidebar_widget, $espresso_widget) !== false) {
333
-                            return true;
334
-                        }
335
-                    }
336
-                }
337
-            }
338
-        }
339
-        return false;
340
-    }
341
-
342
-
343
-
344
-
345
-    /**
346
-     *    header_meta_tag
347
-     *
348
-     * @access    public
349
-     * @return    void
350
-     */
351
-    public function header_meta_tag()
352
-    {
353
-        print(
354
-            apply_filters(
355
-                'FHEE__EE_Front_Controller__header_meta_tag',
356
-                '<meta name="generator" content="Event Espresso Version ' . EVENT_ESPRESSO_VERSION . "\" />\n")
357
-        );
358
-
359
-        //let's exclude all event type taxonomy term archive pages from search engine indexing
360
-        //@see https://events.codebasehq.com/projects/event-espresso/tickets/10249
361
-        //also exclude all critical pages from indexing
362
-        if (
363
-            (
364
-                is_tax('espresso_event_type')
365
-                && get_option( 'blog_public' ) !== '0'
366
-            )
367
-            || is_page(EE_Registry::instance()->CFG->core->get_critical_pages_array())
368
-        ) {
369
-            print(
370
-                apply_filters(
371
-                    'FHEE__EE_Front_Controller__header_meta_tag__noindex_for_event_type',
372
-                    '<meta name="robots" content="noindex,follow" />' . "\n"
373
-                )
374
-            );
375
-        }
376
-    }
377
-
378
-
379
-
380
-    /**
381
-     * wp_print_scripts
382
-     *
383
-     * @return void
384
-     */
385
-    public function wp_print_scripts()
386
-    {
387
-        global $post;
388
-        if (
389
-            isset($post->EE_Event)
390
-            && $post->EE_Event instanceof EE_Event
391
-            && get_post_type() === 'espresso_events'
392
-            && is_singular()
393
-        ) {
394
-            \EEH_Schema::add_json_linked_data_for_event($post->EE_Event);
395
-        }
396
-    }
397
-
398
-
399
-
400
-
401
-    /***********************************************        THE_CONTENT FILTER HOOK         **********************************************
29
+	/**
30
+	 * @var string $_template_path
31
+	 */
32
+	private $_template_path;
33
+
34
+	/**
35
+	 * @var string $_template
36
+	 */
37
+	private $_template;
38
+
39
+	/**
40
+	 * @type EE_Registry $Registry
41
+	 */
42
+	protected $Registry;
43
+
44
+	/**
45
+	 * @type EE_Request_Handler $Request_Handler
46
+	 */
47
+	protected $Request_Handler;
48
+
49
+	/**
50
+	 * @type EE_Module_Request_Router $Module_Request_Router
51
+	 */
52
+	protected $Module_Request_Router;
53
+
54
+
55
+	/**
56
+	 *    class constructor
57
+	 *    should fire after shortcode, module, addon, or other plugin's default priority init phases have run
58
+	 *
59
+	 * @access    public
60
+	 * @param \EE_Registry              $Registry
61
+	 * @param \EE_Request_Handler       $Request_Handler
62
+	 * @param \EE_Module_Request_Router $Module_Request_Router
63
+	 */
64
+	public function __construct(
65
+		EE_Registry $Registry,
66
+		EE_Request_Handler $Request_Handler,
67
+		EE_Module_Request_Router $Module_Request_Router
68
+	) {
69
+		$this->Registry              = $Registry;
70
+		$this->Request_Handler       = $Request_Handler;
71
+		$this->Module_Request_Router = $Module_Request_Router;
72
+		// determine how to integrate WP_Query with the EE models
73
+		add_action('AHEE__EE_System__initialize', array($this, 'employ_CPT_Strategy'));
74
+		// load other resources and begin to actually run shortcodes and modules
75
+		add_action('wp_loaded', array($this, 'wp_loaded'), 5);
76
+		// analyse the incoming WP request
77
+		add_action('parse_request', array($this, 'get_request'), 1, 1);
78
+		// process request with module factory
79
+		add_action('pre_get_posts', array($this, 'pre_get_posts'), 10, 1);
80
+		// before headers sent
81
+		add_action('wp', array($this, 'wp'), 5);
82
+		// after headers sent but before any markup is output,
83
+		// primarily used to process any content shortcodes
84
+		add_action('get_header', array($this, 'get_header'));
85
+		// header
86
+		add_action('wp_head', array($this, 'header_meta_tag'), 5);
87
+		add_action('wp_print_scripts', array($this, 'wp_print_scripts'), 10);
88
+		add_filter('template_include', array($this, 'template_include'), 1);
89
+		// display errors
90
+		add_action('loop_start', array($this, 'display_errors'), 2);
91
+		// the content
92
+		// add_filter( 'the_content', array( $this, 'the_content' ), 5, 1 );
93
+		//exclude our private cpt comments
94
+		add_filter('comments_clauses', array($this, 'filter_wp_comments'), 10, 1);
95
+		//make sure any ajax requests will respect the url schema when requests are made against admin-ajax.php (http:// or https://)
96
+		add_filter('admin_url', array($this, 'maybe_force_admin_ajax_ssl'), 200, 1);
97
+		// action hook EE
98
+		do_action('AHEE__EE_Front_Controller__construct__done', $this);
99
+		// for checking that browser cookies are enabled
100
+		if (apply_filters('FHEE__EE_Front_Controller____construct__set_test_cookie', true)) {
101
+			setcookie('ee_cookie_test', uniqid('ect',true), time() + DAY_IN_SECONDS, '/');
102
+		}
103
+	}
104
+
105
+
106
+	/**
107
+	 * @return EE_Request_Handler
108
+	 */
109
+	public function Request_Handler()
110
+	{
111
+		return $this->Request_Handler;
112
+	}
113
+
114
+
115
+	/**
116
+	 * @return EE_Module_Request_Router
117
+	 */
118
+	public function Module_Request_Router()
119
+	{
120
+		return $this->Module_Request_Router;
121
+	}
122
+
123
+
124
+
125
+	/**
126
+	 * @return LegacyShortcodesManager
127
+	 */
128
+	public function getLegacyShortcodesManager()
129
+	{
130
+		return EE_Config::getLegacyShortcodesManager();
131
+	}
132
+
133
+
134
+
135
+
136
+
137
+	/***********************************************        INIT ACTION HOOK         ***********************************************/
138
+
139
+
140
+
141
+	/**
142
+	 * filter_wp_comments
143
+	 * This simply makes sure that any "private" EE CPTs do not have their comments show up in any wp comment
144
+	 * widgets/queries done on frontend
145
+	 *
146
+	 * @param  array $clauses array of comment clauses setup by WP_Comment_Query
147
+	 * @return array array of comment clauses with modifications.
148
+	 */
149
+	public function filter_wp_comments($clauses)
150
+	{
151
+		global $wpdb;
152
+		if (strpos($clauses['join'], $wpdb->posts) !== false) {
153
+			$cpts = EE_Register_CPTs::get_private_CPTs();
154
+			foreach ($cpts as $cpt => $details) {
155
+				$clauses['where'] .= $wpdb->prepare(" AND $wpdb->posts.post_type != %s", $cpt);
156
+			}
157
+		}
158
+		return $clauses;
159
+	}
160
+
161
+
162
+	/**
163
+	 *    employ_CPT_Strategy
164
+	 *
165
+	 * @access    public
166
+	 * @return    void
167
+	 */
168
+	public function employ_CPT_Strategy()
169
+	{
170
+		if (apply_filters('FHEE__EE_Front_Controller__employ_CPT_Strategy', true)) {
171
+			$this->Registry->load_core('CPT_Strategy');
172
+		}
173
+	}
174
+
175
+
176
+	/**
177
+	 * this just makes sure that if the site is using ssl that we force that for any admin ajax calls from frontend
178
+	 *
179
+	 * @param  string $url incoming url
180
+	 * @return string         final assembled url
181
+	 */
182
+	public function maybe_force_admin_ajax_ssl($url)
183
+	{
184
+		if (is_ssl() && preg_match('/admin-ajax.php/', $url)) {
185
+			$url = str_replace('http://', 'https://', $url);
186
+		}
187
+		return $url;
188
+	}
189
+
190
+
191
+
192
+
193
+
194
+
195
+	/***********************************************        WP_LOADED ACTION HOOK         ***********************************************/
196
+
197
+
198
+	/**
199
+	 *    wp_loaded - should fire after shortcode, module, addon, or other plugin's have been registered and their
200
+	 *    default priority init phases have run
201
+	 *
202
+	 * @access    public
203
+	 * @return    void
204
+	 */
205
+	public function wp_loaded()
206
+	{
207
+	}
208
+
209
+
210
+
211
+
212
+
213
+	/***********************************************        PARSE_REQUEST HOOK         ***********************************************/
214
+	/**
215
+	 *    _get_request
216
+	 *
217
+	 * @access public
218
+	 * @param WP $WP
219
+	 * @return void
220
+	 */
221
+	public function get_request(WP $WP)
222
+	{
223
+		do_action('AHEE__EE_Front_Controller__get_request__start');
224
+		$this->Request_Handler->parse_request($WP);
225
+		do_action('AHEE__EE_Front_Controller__get_request__complete');
226
+	}
227
+
228
+
229
+
230
+	/**
231
+	 *    pre_get_posts - basically a module factory for instantiating modules and selecting the final view template
232
+	 *
233
+	 * @access    public
234
+	 * @param   WP_Query $WP_Query
235
+	 * @return    void
236
+	 */
237
+	public function pre_get_posts($WP_Query)
238
+	{
239
+		// only load Module_Request_Router if this is the main query
240
+		if (
241
+			$this->Module_Request_Router instanceof EE_Module_Request_Router
242
+			&& $WP_Query->is_main_query()
243
+		) {
244
+			// cycle thru module routes
245
+			while ($route = $this->Module_Request_Router->get_route($WP_Query)) {
246
+				// determine module and method for route
247
+				$module = $this->Module_Request_Router->resolve_route($route[0], $route[1]);
248
+				if ($module instanceof EED_Module) {
249
+					// get registered view for route
250
+					$this->_template_path = $this->Module_Request_Router->get_view($route);
251
+					// grab module name
252
+					$module_name = $module->module_name();
253
+					// map the module to the module objects
254
+					$this->Registry->modules->{$module_name} = $module;
255
+				}
256
+			}
257
+		}
258
+	}
259
+
260
+
261
+
262
+
263
+
264
+	/***********************************************        WP HOOK         ***********************************************/
265
+
266
+
267
+	/**
268
+	 *    wp - basically last chance to do stuff before headers sent
269
+	 *
270
+	 * @access    public
271
+	 * @return    void
272
+	 */
273
+	public function wp()
274
+	{
275
+	}
276
+
277
+
278
+
279
+	/***********************     GET_HEADER && WP_HEAD HOOK     ***********************/
280
+
281
+
282
+
283
+	/**
284
+	 * callback for the WP "get_header" hook point
285
+	 * checks sidebars for EE widgets
286
+	 * loads resources and assets accordingly
287
+	 *
288
+	 * @return void
289
+	 */
290
+	public function get_header()
291
+	{
292
+		global $wp_query;
293
+		if (empty($wp_query->posts)){
294
+			return;
295
+		}
296
+		// if we already know this is an espresso page, then load assets
297
+		$load_assets = $this->Request_Handler->is_espresso_page();
298
+		// if we are already loading assets then just move along, otherwise check for widgets
299
+		$load_assets = $load_assets ? $load_assets : $this->espresso_widgets_in_active_sidebars();
300
+		if ( $load_assets){
301
+			wp_enqueue_style('espresso_default');
302
+			wp_enqueue_style('espresso_custom_css');
303
+			wp_enqueue_script('espresso_core');
304
+		}
305
+	}
306
+
307
+
308
+
309
+	/**
310
+	 * builds list of active widgets then scans active sidebars looking for them
311
+	 * returns true is an EE widget is found in an active sidebar
312
+	 * Please Note: this does NOT mean that the sidebar or widget
313
+	 * is actually in use in a given template, as that is unfortunately not known
314
+	 * until a sidebar and it's widgets are actually loaded
315
+	 *
316
+	 * @return boolean
317
+	 */
318
+	private function espresso_widgets_in_active_sidebars()
319
+	{
320
+		$espresso_widgets = array();
321
+		foreach ($this->Registry->widgets as $widget_class => $widget) {
322
+			$id_base = EspressoWidget::getIdBase($widget_class);
323
+			if (is_active_widget(false, false, $id_base)) {
324
+				$espresso_widgets[] = $id_base;
325
+			}
326
+		}
327
+		$all_sidebar_widgets = wp_get_sidebars_widgets();
328
+		foreach ($all_sidebar_widgets as $sidebar_name => $sidebar_widgets) {
329
+			if (is_array($sidebar_widgets) && ! empty($sidebar_widgets)) {
330
+				foreach ($sidebar_widgets as $sidebar_widget) {
331
+					foreach ($espresso_widgets as $espresso_widget) {
332
+						if (strpos($sidebar_widget, $espresso_widget) !== false) {
333
+							return true;
334
+						}
335
+					}
336
+				}
337
+			}
338
+		}
339
+		return false;
340
+	}
341
+
342
+
343
+
344
+
345
+	/**
346
+	 *    header_meta_tag
347
+	 *
348
+	 * @access    public
349
+	 * @return    void
350
+	 */
351
+	public function header_meta_tag()
352
+	{
353
+		print(
354
+			apply_filters(
355
+				'FHEE__EE_Front_Controller__header_meta_tag',
356
+				'<meta name="generator" content="Event Espresso Version ' . EVENT_ESPRESSO_VERSION . "\" />\n")
357
+		);
358
+
359
+		//let's exclude all event type taxonomy term archive pages from search engine indexing
360
+		//@see https://events.codebasehq.com/projects/event-espresso/tickets/10249
361
+		//also exclude all critical pages from indexing
362
+		if (
363
+			(
364
+				is_tax('espresso_event_type')
365
+				&& get_option( 'blog_public' ) !== '0'
366
+			)
367
+			|| is_page(EE_Registry::instance()->CFG->core->get_critical_pages_array())
368
+		) {
369
+			print(
370
+				apply_filters(
371
+					'FHEE__EE_Front_Controller__header_meta_tag__noindex_for_event_type',
372
+					'<meta name="robots" content="noindex,follow" />' . "\n"
373
+				)
374
+			);
375
+		}
376
+	}
377
+
378
+
379
+
380
+	/**
381
+	 * wp_print_scripts
382
+	 *
383
+	 * @return void
384
+	 */
385
+	public function wp_print_scripts()
386
+	{
387
+		global $post;
388
+		if (
389
+			isset($post->EE_Event)
390
+			&& $post->EE_Event instanceof EE_Event
391
+			&& get_post_type() === 'espresso_events'
392
+			&& is_singular()
393
+		) {
394
+			\EEH_Schema::add_json_linked_data_for_event($post->EE_Event);
395
+		}
396
+	}
397
+
398
+
399
+
400
+
401
+	/***********************************************        THE_CONTENT FILTER HOOK         **********************************************
402 402
 
403 403
 
404 404
 
@@ -409,99 +409,99 @@  discard block
 block discarded – undo
409 409
     //  * @param   $the_content
410 410
     //  * @return    string
411 411
     //  */
412
-    // public function the_content( $the_content ) {
413
-    // 	// nothing gets loaded at this point unless other systems turn this hookpoint on by using:  add_filter( 'FHEE_run_EE_the_content', '__return_true' );
414
-    // 	if ( apply_filters( 'FHEE_run_EE_the_content', FALSE ) ) {
415
-    // 	}
416
-    // 	return $the_content;
417
-    // }
418
-
419
-
420
-
421
-    /***********************************************        WP_FOOTER         ***********************************************/
422
-
423
-
424
-    /**
425
-     * display_errors
426
-     *
427
-     * @access public
428
-     * @return void
429
-     */
430
-    public function display_errors()
431
-    {
432
-        static $shown_already = false;
433
-        do_action('AHEE__EE_Front_Controller__display_errors__begin');
434
-        if (
435
-            ! $shown_already
436
-            && apply_filters('FHEE__EE_Front_Controller__display_errors', true)
437
-            && is_main_query()
438
-            && ! is_feed()
439
-            && in_the_loop()
440
-            && $this->Request_Handler->is_espresso_page()
441
-        ) {
442
-            echo EE_Error::get_notices();
443
-            $shown_already = true;
444
-            EEH_Template::display_template(EE_TEMPLATES . 'espresso-ajax-notices.template.php');
445
-        }
446
-        do_action('AHEE__EE_Front_Controller__display_errors__end');
447
-    }
448
-
449
-
450
-
451
-
452
-
453
-    /***********************************************        UTILITIES         ***********************************************/
454
-    /**
455
-     *    template_include
456
-     *
457
-     * @access    public
458
-     * @param   string $template_include_path
459
-     * @return    string
460
-     */
461
-    public function template_include($template_include_path = null)
462
-    {
463
-        if ($this->Request_Handler->is_espresso_page()) {
464
-            $this->_template_path = ! empty($this->_template_path) ? basename($this->_template_path) : basename($template_include_path);
465
-            $template_path        = EEH_Template::locate_template($this->_template_path, array(), false);
466
-            $this->_template_path = ! empty($template_path) ? $template_path : $template_include_path;
467
-            $this->_template      = basename($this->_template_path);
468
-            return $this->_template_path;
469
-        }
470
-        return $template_include_path;
471
-    }
472
-
473
-
474
-    /**
475
-     *    get_selected_template
476
-     *
477
-     * @access    public
478
-     * @param bool $with_path
479
-     * @return    string
480
-     */
481
-    public function get_selected_template($with_path = false)
482
-    {
483
-        return $with_path ? $this->_template_path : $this->_template;
484
-    }
485
-
486
-
487
-
488
-    /**
489
-     * @deprecated 4.9.26
490
-     * @param string $shortcode_class
491
-     * @param \WP    $wp
492
-     */
493
-    public function initialize_shortcode($shortcode_class = '', WP $wp = null)
494
-    {
495
-        \EE_Error::doing_it_wrong(
496
-            __METHOD__,
497
-            __(
498
-                'Usage is deprecated. Please use \EventEspresso\core\services\shortcodes\LegacyShortcodesManager::initializeShortcode() instead.',
499
-                'event_espresso'
500
-            ),
501
-            '4.9.26'
502
-        );
503
-        $this->getLegacyShortcodesManager()->initializeShortcode($shortcode_class, $wp);
504
-    }
412
+	// public function the_content( $the_content ) {
413
+	// 	// nothing gets loaded at this point unless other systems turn this hookpoint on by using:  add_filter( 'FHEE_run_EE_the_content', '__return_true' );
414
+	// 	if ( apply_filters( 'FHEE_run_EE_the_content', FALSE ) ) {
415
+	// 	}
416
+	// 	return $the_content;
417
+	// }
418
+
419
+
420
+
421
+	/***********************************************        WP_FOOTER         ***********************************************/
422
+
423
+
424
+	/**
425
+	 * display_errors
426
+	 *
427
+	 * @access public
428
+	 * @return void
429
+	 */
430
+	public function display_errors()
431
+	{
432
+		static $shown_already = false;
433
+		do_action('AHEE__EE_Front_Controller__display_errors__begin');
434
+		if (
435
+			! $shown_already
436
+			&& apply_filters('FHEE__EE_Front_Controller__display_errors', true)
437
+			&& is_main_query()
438
+			&& ! is_feed()
439
+			&& in_the_loop()
440
+			&& $this->Request_Handler->is_espresso_page()
441
+		) {
442
+			echo EE_Error::get_notices();
443
+			$shown_already = true;
444
+			EEH_Template::display_template(EE_TEMPLATES . 'espresso-ajax-notices.template.php');
445
+		}
446
+		do_action('AHEE__EE_Front_Controller__display_errors__end');
447
+	}
448
+
449
+
450
+
451
+
452
+
453
+	/***********************************************        UTILITIES         ***********************************************/
454
+	/**
455
+	 *    template_include
456
+	 *
457
+	 * @access    public
458
+	 * @param   string $template_include_path
459
+	 * @return    string
460
+	 */
461
+	public function template_include($template_include_path = null)
462
+	{
463
+		if ($this->Request_Handler->is_espresso_page()) {
464
+			$this->_template_path = ! empty($this->_template_path) ? basename($this->_template_path) : basename($template_include_path);
465
+			$template_path        = EEH_Template::locate_template($this->_template_path, array(), false);
466
+			$this->_template_path = ! empty($template_path) ? $template_path : $template_include_path;
467
+			$this->_template      = basename($this->_template_path);
468
+			return $this->_template_path;
469
+		}
470
+		return $template_include_path;
471
+	}
472
+
473
+
474
+	/**
475
+	 *    get_selected_template
476
+	 *
477
+	 * @access    public
478
+	 * @param bool $with_path
479
+	 * @return    string
480
+	 */
481
+	public function get_selected_template($with_path = false)
482
+	{
483
+		return $with_path ? $this->_template_path : $this->_template;
484
+	}
485
+
486
+
487
+
488
+	/**
489
+	 * @deprecated 4.9.26
490
+	 * @param string $shortcode_class
491
+	 * @param \WP    $wp
492
+	 */
493
+	public function initialize_shortcode($shortcode_class = '', WP $wp = null)
494
+	{
495
+		\EE_Error::doing_it_wrong(
496
+			__METHOD__,
497
+			__(
498
+				'Usage is deprecated. Please use \EventEspresso\core\services\shortcodes\LegacyShortcodesManager::initializeShortcode() instead.',
499
+				'event_espresso'
500
+			),
501
+			'4.9.26'
502
+		);
503
+		$this->getLegacyShortcodesManager()->initializeShortcode($shortcode_class, $wp);
504
+	}
505 505
 
506 506
 }
507 507
 // End of file EE_Front_Controller.core.php
Please login to merge, or discard this patch.
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -98,7 +98,7 @@  discard block
 block discarded – undo
98 98
         do_action('AHEE__EE_Front_Controller__construct__done', $this);
99 99
         // for checking that browser cookies are enabled
100 100
         if (apply_filters('FHEE__EE_Front_Controller____construct__set_test_cookie', true)) {
101
-            setcookie('ee_cookie_test', uniqid('ect',true), time() + DAY_IN_SECONDS, '/');
101
+            setcookie('ee_cookie_test', uniqid('ect', true), time() + DAY_IN_SECONDS, '/');
102 102
         }
103 103
     }
104 104
 
@@ -290,14 +290,14 @@  discard block
 block discarded – undo
290 290
     public function get_header()
291 291
     {
292 292
         global $wp_query;
293
-        if (empty($wp_query->posts)){
293
+        if (empty($wp_query->posts)) {
294 294
             return;
295 295
         }
296 296
         // if we already know this is an espresso page, then load assets
297 297
         $load_assets = $this->Request_Handler->is_espresso_page();
298 298
         // if we are already loading assets then just move along, otherwise check for widgets
299 299
         $load_assets = $load_assets ? $load_assets : $this->espresso_widgets_in_active_sidebars();
300
-        if ( $load_assets){
300
+        if ($load_assets) {
301 301
             wp_enqueue_style('espresso_default');
302 302
             wp_enqueue_style('espresso_custom_css');
303 303
             wp_enqueue_script('espresso_core');
@@ -353,7 +353,7 @@  discard block
 block discarded – undo
353 353
         print(
354 354
             apply_filters(
355 355
                 'FHEE__EE_Front_Controller__header_meta_tag',
356
-                '<meta name="generator" content="Event Espresso Version ' . EVENT_ESPRESSO_VERSION . "\" />\n")
356
+                '<meta name="generator" content="Event Espresso Version '.EVENT_ESPRESSO_VERSION."\" />\n")
357 357
         );
358 358
 
359 359
         //let's exclude all event type taxonomy term archive pages from search engine indexing
@@ -362,14 +362,14 @@  discard block
 block discarded – undo
362 362
         if (
363 363
             (
364 364
                 is_tax('espresso_event_type')
365
-                && get_option( 'blog_public' ) !== '0'
365
+                && get_option('blog_public') !== '0'
366 366
             )
367 367
             || is_page(EE_Registry::instance()->CFG->core->get_critical_pages_array())
368 368
         ) {
369 369
             print(
370 370
                 apply_filters(
371 371
                     'FHEE__EE_Front_Controller__header_meta_tag__noindex_for_event_type',
372
-                    '<meta name="robots" content="noindex,follow" />' . "\n"
372
+                    '<meta name="robots" content="noindex,follow" />'."\n"
373 373
                 )
374 374
             );
375 375
         }
@@ -441,7 +441,7 @@  discard block
 block discarded – undo
441 441
         ) {
442 442
             echo EE_Error::get_notices();
443 443
             $shown_already = true;
444
-            EEH_Template::display_template(EE_TEMPLATES . 'espresso-ajax-notices.template.php');
444
+            EEH_Template::display_template(EE_TEMPLATES.'espresso-ajax-notices.template.php');
445 445
         }
446 446
         do_action('AHEE__EE_Front_Controller__display_errors__end');
447 447
     }
Please login to merge, or discard this patch.
core/EE_Registry.core.php 1 patch
Indentation   +1340 added lines, -1340 removed lines patch added patch discarded remove patch
@@ -16,1376 +16,1376 @@
 block discarded – undo
16 16
 class EE_Registry
17 17
 {
18 18
 
19
-    /**
20
-     *    EE_Registry Object
21
-     *
22
-     * @var EE_Registry $_instance
23
-     * @access    private
24
-     */
25
-    private static $_instance = null;
26
-
27
-    /**
28
-     * @var EE_Dependency_Map $_dependency_map
29
-     * @access    protected
30
-     */
31
-    protected $_dependency_map = null;
32
-
33
-    /**
34
-     * @var array $_class_abbreviations
35
-     * @access    protected
36
-     */
37
-    protected $_class_abbreviations = array();
38
-
39
-    /**
40
-     * @access public
41
-     * @var \EventEspresso\core\services\commands\CommandBusInterface $BUS
42
-     */
43
-    public $BUS;
44
-
45
-    /**
46
-     *    EE_Cart Object
47
-     *
48
-     * @access    public
49
-     * @var    EE_Cart $CART
50
-     */
51
-    public $CART = null;
52
-
53
-    /**
54
-     *    EE_Config Object
55
-     *
56
-     * @access    public
57
-     * @var    EE_Config $CFG
58
-     */
59
-    public $CFG = null;
60
-
61
-    /**
62
-     * EE_Network_Config Object
63
-     *
64
-     * @access public
65
-     * @var EE_Network_Config $NET_CFG
66
-     */
67
-    public $NET_CFG = null;
68
-
69
-    /**
70
-     *    StdClass object for storing library classes in
71
-     *
72
-     * @public LIB
73
-     * @var StdClass $LIB
74
-     */
75
-    public $LIB = null;
76
-
77
-    /**
78
-     *    EE_Request_Handler Object
79
-     *
80
-     * @access    public
81
-     * @var    EE_Request_Handler $REQ
82
-     */
83
-    public $REQ = null;
84
-
85
-    /**
86
-     *    EE_Session Object
87
-     *
88
-     * @access    public
89
-     * @var    EE_Session $SSN
90
-     */
91
-    public $SSN = null;
92
-
93
-    /**
94
-     * holds the ee capabilities object.
95
-     *
96
-     * @since 4.5.0
97
-     * @var EE_Capabilities
98
-     */
99
-    public $CAP = null;
100
-
101
-    /**
102
-     * holds the EE_Message_Resource_Manager object.
103
-     *
104
-     * @since 4.9.0
105
-     * @var EE_Message_Resource_Manager
106
-     */
107
-    public $MRM = null;
108
-
109
-
110
-    /**
111
-     * Holds the Assets Registry instance
112
-     * @var Registry
113
-     */
114
-    public $AssetsRegistry = null;
115
-
116
-    /**
117
-     *    $addons - StdClass object for holding addons which have registered themselves to work with EE core
118
-     *
119
-     * @access    public
120
-     * @var    EE_Addon[]
121
-     */
122
-    public $addons = null;
123
-
124
-    /**
125
-     *    $models
126
-     * @access    public
127
-     * @var    EEM_Base[] $models keys are 'short names' (eg Event), values are class names (eg 'EEM_Event')
128
-     */
129
-    public $models = array();
130
-
131
-    /**
132
-     *    $modules
133
-     * @access    public
134
-     * @var    EED_Module[] $modules
135
-     */
136
-    public $modules = null;
137
-
138
-    /**
139
-     *    $shortcodes
140
-     * @access    public
141
-     * @var    EES_Shortcode[] $shortcodes
142
-     */
143
-    public $shortcodes = null;
144
-
145
-    /**
146
-     *    $widgets
147
-     * @access    public
148
-     * @var    WP_Widget[] $widgets
149
-     */
150
-    public $widgets = null;
151
-
152
-    /**
153
-     * $non_abstract_db_models
154
-     * @access public
155
-     * @var array this is an array of all implemented model names (i.e. not the parent abstract models, or models
156
-     * which don't actually fetch items from the DB in the normal way (ie, are not children of EEM_Base)).
157
-     * Keys are model "short names" (eg "Event") as used in model relations, and values are
158
-     * classnames (eg "EEM_Event")
159
-     */
160
-    public $non_abstract_db_models = array();
161
-
162
-
163
-    /**
164
-     *    $i18n_js_strings - internationalization for JS strings
165
-     *    usage:   EE_Registry::i18n_js_strings['string_key'] = __( 'string to translate.', 'event_espresso' );
166
-     *    in js file:  var translatedString = eei18n.string_key;
167
-     *
168
-     * @access    public
169
-     * @var    array
170
-     */
171
-    public static $i18n_js_strings = array();
172
-
173
-
174
-    /**
175
-     *    $main_file - path to espresso.php
176
-     *
177
-     * @access    public
178
-     * @var    array
179
-     */
180
-    public $main_file;
181
-
182
-    /**
183
-     * array of ReflectionClass objects where the key is the class name
184
-     *
185
-     * @access    public
186
-     * @var ReflectionClass[]
187
-     */
188
-    public $_reflectors;
189
-
190
-    /**
191
-     * boolean flag to indicate whether or not to load/save dependencies from/to the cache
192
-     *
193
-     * @access    protected
194
-     * @var boolean $_cache_on
195
-     */
196
-    protected $_cache_on = true;
197
-
198
-
199
-
200
-    /**
201
-     * @singleton method used to instantiate class object
202
-     * @access    public
203
-     * @param  \EE_Dependency_Map $dependency_map
204
-     * @return \EE_Registry instance
205
-     */
206
-    public static function instance(\EE_Dependency_Map $dependency_map = null)
207
-    {
208
-        // check if class object is instantiated
209
-        if ( ! self::$_instance instanceof EE_Registry) {
210
-            self::$_instance = new EE_Registry($dependency_map);
211
-        }
212
-        return self::$_instance;
213
-    }
214
-
215
-
216
-
217
-    /**
218
-     *protected constructor to prevent direct creation
219
-     *
220
-     * @Constructor
221
-     * @access protected
222
-     * @param  \EE_Dependency_Map $dependency_map
223
-     * @return \EE_Registry
224
-     */
225
-    protected function __construct(\EE_Dependency_Map $dependency_map)
226
-    {
227
-        $this->_dependency_map = $dependency_map;
228
-        add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
229
-    }
230
-
231
-
232
-
233
-    /**
234
-     * initialize
235
-     */
236
-    public function initialize()
237
-    {
238
-        $this->_class_abbreviations = apply_filters(
239
-            'FHEE__EE_Registry____construct___class_abbreviations',
240
-            array(
241
-                'EE_Config'                                       => 'CFG',
242
-                'EE_Session'                                      => 'SSN',
243
-                'EE_Capabilities'                                 => 'CAP',
244
-                'EE_Cart'                                         => 'CART',
245
-                'EE_Network_Config'                               => 'NET_CFG',
246
-                'EE_Request_Handler'                              => 'REQ',
247
-                'EE_Message_Resource_Manager'                     => 'MRM',
248
-                'EventEspresso\core\services\commands\CommandBus' => 'BUS',
249
-                'EventEspresso\core\services\assets\Registry'     => 'AssetsRegistry',
250
-            )
251
-        );
252
-        // class library
253
-        $this->LIB = new stdClass();
254
-        $this->addons = new stdClass();
255
-        $this->modules = new stdClass();
256
-        $this->shortcodes = new stdClass();
257
-        $this->widgets = new stdClass();
258
-        $this->load_core('Base', array(), true);
259
-        // add our request and response objects to the cache
260
-        $request_loader = $this->_dependency_map->class_loader('EE_Request');
261
-        $this->_set_cached_class(
262
-            $request_loader(),
263
-            'EE_Request'
264
-        );
265
-        $response_loader = $this->_dependency_map->class_loader('EE_Response');
266
-        $this->_set_cached_class(
267
-            $response_loader(),
268
-            'EE_Response'
269
-        );
270
-        add_action('AHEE__EE_System__set_hooks_for_core', array($this, 'init'));
271
-    }
272
-
273
-
274
-
275
-    /**
276
-     *    init
277
-     *
278
-     * @access    public
279
-     * @return    void
280
-     */
281
-    public function init()
282
-    {
283
-        // Get current page protocol
284
-        $protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
285
-        // Output admin-ajax.php URL with same protocol as current page
286
-        self::$i18n_js_strings['ajax_url'] = admin_url('admin-ajax.php', $protocol);
287
-        self::$i18n_js_strings['wp_debug'] = defined('WP_DEBUG') ? WP_DEBUG : false;
288
-    }
289
-
290
-
291
-
292
-    /**
293
-     * localize_i18n_js_strings
294
-     *
295
-     * @return string
296
-     */
297
-    public static function localize_i18n_js_strings()
298
-    {
299
-        $i18n_js_strings = (array)EE_Registry::$i18n_js_strings;
300
-        foreach ($i18n_js_strings as $key => $value) {
301
-            if (is_scalar($value)) {
302
-                $i18n_js_strings[$key] = html_entity_decode((string)$value, ENT_QUOTES, 'UTF-8');
303
-            }
304
-        }
305
-        return "/* <![CDATA[ */ var eei18n = " . wp_json_encode($i18n_js_strings) . '; /* ]]> */';
306
-    }
307
-
308
-
309
-
310
-    /**
311
-     * @param mixed string | EED_Module $module
312
-     */
313
-    public function add_module($module)
314
-    {
315
-        if ($module instanceof EED_Module) {
316
-            $module_class = get_class($module);
317
-            $this->modules->{$module_class} = $module;
318
-        } else {
319
-            if ( ! class_exists('EE_Module_Request_Router')) {
320
-                $this->load_core('Module_Request_Router');
321
-            }
322
-            $this->modules->{$module} = EE_Module_Request_Router::module_factory($module);
323
-        }
324
-    }
325
-
326
-
327
-
328
-    /**
329
-     * @param string $module_name
330
-     * @return mixed EED_Module | NULL
331
-     */
332
-    public function get_module($module_name = '')
333
-    {
334
-        return isset($this->modules->{$module_name}) ? $this->modules->{$module_name} : null;
335
-    }
336
-
337
-
338
-
339
-    /**
340
-     *    loads core classes - must be singletons
341
-     *
342
-     * @access    public
343
-     * @param string $class_name - simple class name ie: session
344
-     * @param mixed  $arguments
345
-     * @param bool   $load_only
346
-     * @return mixed
347
-     */
348
-    public function load_core($class_name, $arguments = array(), $load_only = false)
349
-    {
350
-        $core_paths = apply_filters(
351
-            'FHEE__EE_Registry__load_core__core_paths',
352
-            array(
353
-                EE_CORE,
354
-                EE_ADMIN,
355
-                EE_CPTS,
356
-                EE_CORE . 'data_migration_scripts' . DS,
357
-                EE_CORE . 'request_stack' . DS,
358
-                EE_CORE . 'middleware' . DS,
359
-            )
360
-        );
361
-        // retrieve instantiated class
362
-        return $this->_load($core_paths, 'EE_', $class_name, 'core', $arguments, false, true, $load_only);
363
-    }
364
-
365
-
366
-
367
-    /**
368
-     *    loads service classes
369
-     *
370
-     * @access    public
371
-     * @param string $class_name - simple class name ie: session
372
-     * @param mixed  $arguments
373
-     * @param bool   $load_only
374
-     * @return mixed
375
-     */
376
-    public function load_service($class_name, $arguments = array(), $load_only = false)
377
-    {
378
-        $service_paths = apply_filters(
379
-            'FHEE__EE_Registry__load_service__service_paths',
380
-            array(
381
-                EE_CORE . 'services' . DS,
382
-            )
383
-        );
384
-        // retrieve instantiated class
385
-        return $this->_load($service_paths, 'EE_', $class_name, 'class', $arguments, false, true, $load_only);
386
-    }
387
-
388
-
389
-
390
-    /**
391
-     *    loads data_migration_scripts
392
-     *
393
-     * @access    public
394
-     * @param string $class_name - class name for the DMS ie: EE_DMS_Core_4_2_0
395
-     * @param mixed  $arguments
396
-     * @return EE_Data_Migration_Script_Base|mixed
397
-     */
398
-    public function load_dms($class_name, $arguments = array())
399
-    {
400
-        // retrieve instantiated class
401
-        return $this->_load(EE_Data_Migration_Manager::instance()->get_data_migration_script_folders(), 'EE_DMS_', $class_name, 'dms', $arguments, false, false, false);
402
-    }
403
-
404
-
405
-
406
-    /**
407
-     *    loads object creating classes - must be singletons
408
-     *
409
-     * @param string $class_name - simple class name ie: attendee
410
-     * @param mixed  $arguments  - an array of arguments to pass to the class
411
-     * @param bool   $from_db    - some classes are instantiated from the db and thus call a different method to instantiate
412
-     * @param bool   $cache      if you don't want the class to be stored in the internal cache (non-persistent) then set this to FALSE (ie. when instantiating model objects from client in a loop)
413
-     * @param bool   $load_only  whether or not to just load the file and NOT instantiate, or load AND instantiate (default)
414
-     * @return EE_Base_Class | bool
415
-     */
416
-    public function load_class($class_name, $arguments = array(), $from_db = false, $cache = true, $load_only = false)
417
-    {
418
-        $paths = apply_filters('FHEE__EE_Registry__load_class__paths', array(
419
-            EE_CORE,
420
-            EE_CLASSES,
421
-            EE_BUSINESS,
422
-        ));
423
-        // retrieve instantiated class
424
-        return $this->_load($paths, 'EE_', $class_name, 'class', $arguments, $from_db, $cache, $load_only);
425
-    }
426
-
427
-
428
-
429
-    /**
430
-     *    loads helper classes - must be singletons
431
-     *
432
-     * @param string $class_name - simple class name ie: price
433
-     * @param mixed  $arguments
434
-     * @param bool   $load_only
435
-     * @return EEH_Base | bool
436
-     */
437
-    public function load_helper($class_name, $arguments = array(), $load_only = true)
438
-    {
439
-        // todo: add doing_it_wrong() in a few versions after all addons have had calls to this method removed
440
-        $helper_paths = apply_filters('FHEE__EE_Registry__load_helper__helper_paths', array(EE_HELPERS));
441
-        // retrieve instantiated class
442
-        return $this->_load($helper_paths, 'EEH_', $class_name, 'helper', $arguments, false, true, $load_only);
443
-    }
444
-
445
-
446
-
447
-    /**
448
-     *    loads core classes - must be singletons
449
-     *
450
-     * @access    public
451
-     * @param string $class_name - simple class name ie: session
452
-     * @param mixed  $arguments
453
-     * @param bool   $load_only
454
-     * @param bool   $cache      whether to cache the object or not.
455
-     * @return mixed
456
-     */
457
-    public function load_lib($class_name, $arguments = array(), $load_only = false, $cache = true)
458
-    {
459
-        $paths = array(
460
-            EE_LIBRARIES,
461
-            EE_LIBRARIES . 'messages' . DS,
462
-            EE_LIBRARIES . 'shortcodes' . DS,
463
-            EE_LIBRARIES . 'qtips' . DS,
464
-            EE_LIBRARIES . 'payment_methods' . DS,
465
-        );
466
-        // retrieve instantiated class
467
-        return $this->_load($paths, 'EE_', $class_name, 'lib', $arguments, false, $cache, $load_only);
468
-    }
469
-
470
-
471
-
472
-    /**
473
-     *    loads model classes - must be singletons
474
-     *
475
-     * @param string $class_name - simple class name ie: price
476
-     * @param mixed  $arguments
477
-     * @param bool   $load_only
478
-     * @return EEM_Base | bool
479
-     */
480
-    public function load_model($class_name, $arguments = array(), $load_only = false)
481
-    {
482
-        $paths = apply_filters('FHEE__EE_Registry__load_model__paths', array(
483
-            EE_MODELS,
484
-            EE_CORE,
485
-        ));
486
-        // retrieve instantiated class
487
-        return $this->_load($paths, 'EEM_', $class_name, 'model', $arguments, false, true, $load_only);
488
-    }
489
-
490
-
491
-
492
-    /**
493
-     *    loads model classes - must be singletons
494
-     *
495
-     * @param string $class_name - simple class name ie: price
496
-     * @param mixed  $arguments
497
-     * @param bool   $load_only
498
-     * @return mixed | bool
499
-     */
500
-    public function load_model_class($class_name, $arguments = array(), $load_only = true)
501
-    {
502
-        $paths = array(
503
-            EE_MODELS . 'fields' . DS,
504
-            EE_MODELS . 'helpers' . DS,
505
-            EE_MODELS . 'relations' . DS,
506
-            EE_MODELS . 'strategies' . DS,
507
-        );
508
-        // retrieve instantiated class
509
-        return $this->_load($paths, 'EE_', $class_name, '', $arguments, false, true, $load_only);
510
-    }
511
-
512
-
513
-
514
-    /**
515
-     * Determines if $model_name is the name of an actual EE model.
516
-     *
517
-     * @param string $model_name like Event, Attendee, Question_Group_Question, etc.
518
-     * @return boolean
519
-     */
520
-    public function is_model_name($model_name)
521
-    {
522
-        return isset($this->models[$model_name]) ? true : false;
523
-    }
524
-
525
-
526
-
527
-    /**
528
-     *    generic class loader
529
-     *
530
-     * @param string $path_to_file - directory path to file location, not including filename
531
-     * @param string $file_name    - file name  ie:  my_file.php, including extension
532
-     * @param string $type         - file type - core? class? helper? model?
533
-     * @param mixed  $arguments
534
-     * @param bool   $load_only
535
-     * @return mixed
536
-     */
537
-    public function load_file($path_to_file, $file_name, $type = '', $arguments = array(), $load_only = true)
538
-    {
539
-        // retrieve instantiated class
540
-        return $this->_load($path_to_file, '', $file_name, $type, $arguments, false, true, $load_only);
541
-    }
542
-
543
-
544
-
545
-    /**
546
-     *    load_addon
547
-     *
548
-     * @param string $path_to_file - directory path to file location, not including filename
549
-     * @param string $class_name   - full class name  ie:  My_Class
550
-     * @param string $type         - file type - core? class? helper? model?
551
-     * @param mixed  $arguments
552
-     * @param bool   $load_only
553
-     * @return EE_Addon
554
-     */
555
-    public function load_addon($path_to_file, $class_name, $type = 'class', $arguments = array(), $load_only = false)
556
-    {
557
-        // retrieve instantiated class
558
-        return $this->_load($path_to_file, 'addon', $class_name, $type, $arguments, false, true, $load_only);
559
-    }
560
-
561
-
562
-
563
-    /**
564
-     * instantiates, caches, and automatically resolves dependencies
565
-     * for classes that use a Fully Qualified Class Name.
566
-     * if the class is not capable of being loaded using PSR-4 autoloading,
567
-     * then you need to use one of the existing load_*() methods
568
-     * which can resolve the classname and filepath from the passed arguments
569
-     *
570
-     * @param bool|string $class_name   Fully Qualified Class Name
571
-     * @param array       $arguments    an argument, or array of arguments to pass to the class upon instantiation
572
-     * @param bool        $cache        whether to cache the instantiated object for reuse
573
-     * @param bool        $from_db      some classes are instantiated from the db
574
-     *                                  and thus call a different method to instantiate
575
-     * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
576
-     * @param bool|string $addon        if true, will cache the object in the EE_Registry->$addons array
577
-     * @return mixed                    null = failure to load or instantiate class object.
578
-     *                                  object = class loaded and instantiated successfully.
579
-     *                                  bool = fail or success when $load_only is true
580
-     */
581
-    public function create(
582
-        $class_name = false,
583
-        $arguments = array(),
584
-        $cache = false,
585
-        $from_db = false,
586
-        $load_only = false,
587
-        $addon = false
588
-    ) {
589
-        $class_name = ltrim($class_name, '\\');
590
-        $class_name = $this->_dependency_map->get_alias($class_name);
591
-        if ( ! class_exists($class_name)) {
592
-            // maybe the class is registered with a preceding \
593
-            $class_name = strpos($class_name, '\\') !== 0 ? '\\' . $class_name : $class_name;
594
-            // still doesn't exist ?
595
-            if ( ! class_exists($class_name)) {
596
-                return null;
597
-            }
598
-        }
599
-        // if we're only loading the class and it already exists, then let's just return true immediately
600
-        if ($load_only) {
601
-            return true;
602
-        }
603
-        $addon = $addon ? 'addon' : '';
604
-        // $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
605
-        // $cache is controlled by individual calls to separate Registry loader methods like load_class()
606
-        // $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
607
-        if ($this->_cache_on && $cache && ! $load_only) {
608
-            // return object if it's already cached
609
-            $cached_class = $this->_get_cached_class($class_name, $addon);
610
-            if ($cached_class !== null) {
611
-                return $cached_class;
612
-            }
613
-        }
614
-        // instantiate the requested object
615
-        $class_obj = $this->_create_object($class_name, $arguments, $addon, $from_db);
616
-        if ($this->_cache_on && $cache) {
617
-            // save it for later... kinda like gum  { : $
618
-            $this->_set_cached_class($class_obj, $class_name, $addon, $from_db);
619
-        }
620
-        $this->_cache_on = true;
621
-        return $class_obj;
622
-    }
623
-
624
-
625
-
626
-    /**
627
-     * instantiates, caches, and injects dependencies for classes
628
-     *
629
-     * @param array       $file_paths   an array of paths to folders to look in
630
-     * @param string      $class_prefix EE  or EEM or... ???
631
-     * @param bool|string $class_name   $class name
632
-     * @param string      $type         file type - core? class? helper? model?
633
-     * @param mixed       $arguments    an argument or array of arguments to pass to the class upon instantiation
634
-     * @param bool        $from_db      some classes are instantiated from the db
635
-     *                                  and thus call a different method to instantiate
636
-     * @param bool        $cache        whether to cache the instantiated object for reuse
637
-     * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
638
-     * @return null|object|bool         null = failure to load or instantiate class object.
639
-     *                                  object = class loaded and instantiated successfully.
640
-     *                                  bool = fail or success when $load_only is true
641
-     */
642
-    protected function _load(
643
-        $file_paths = array(),
644
-        $class_prefix = 'EE_',
645
-        $class_name = false,
646
-        $type = 'class',
647
-        $arguments = array(),
648
-        $from_db = false,
649
-        $cache = true,
650
-        $load_only = false
651
-    ) {
652
-        $class_name = ltrim($class_name, '\\');
653
-        // strip php file extension
654
-        $class_name = str_replace('.php', '', trim($class_name));
655
-        // does the class have a prefix ?
656
-        if ( ! empty($class_prefix) && $class_prefix != 'addon') {
657
-            // make sure $class_prefix is uppercase
658
-            $class_prefix = strtoupper(trim($class_prefix));
659
-            // add class prefix ONCE!!!
660
-            $class_name = $class_prefix . str_replace($class_prefix, '', $class_name);
661
-        }
662
-        $class_name = $this->_dependency_map->get_alias($class_name);
663
-        $class_exists = class_exists($class_name);
664
-        // if we're only loading the class and it already exists, then let's just return true immediately
665
-        if ($load_only && $class_exists) {
666
-            return true;
667
-        }
668
-        // $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
669
-        // $cache is controlled by individual calls to separate Registry loader methods like load_class()
670
-        // $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
671
-        if ($this->_cache_on && $cache && ! $load_only) {
672
-            // return object if it's already cached
673
-            $cached_class = $this->_get_cached_class($class_name, $class_prefix);
674
-            if ($cached_class !== null) {
675
-                return $cached_class;
676
-            }
677
-        }
678
-        // if the class doesn't already exist.. then we need to try and find the file and load it
679
-        if ( ! $class_exists) {
680
-            // get full path to file
681
-            $path = $this->_resolve_path($class_name, $type, $file_paths);
682
-            // load the file
683
-            $loaded = $this->_require_file($path, $class_name, $type, $file_paths);
684
-            // if loading failed, or we are only loading a file but NOT instantiating an object
685
-            if ( ! $loaded || $load_only) {
686
-                // return boolean if only loading, or null if an object was expected
687
-                return $load_only ? $loaded : null;
688
-            }
689
-        }
690
-        // instantiate the requested object
691
-        $class_obj = $this->_create_object($class_name, $arguments, $type, $from_db);
692
-        if ($this->_cache_on && $cache) {
693
-            // save it for later... kinda like gum  { : $
694
-            $this->_set_cached_class($class_obj, $class_name, $class_prefix, $from_db);
695
-        }
696
-        $this->_cache_on = true;
697
-        return $class_obj;
698
-    }
699
-
700
-
701
-
702
-    /**
703
-     * _get_cached_class
704
-     * attempts to find a cached version of the requested class
705
-     * by looking in the following places:
706
-     *        $this->{$class_abbreviation}            ie:    $this->CART
707
-     *        $this->{$class_name}                        ie:    $this->Some_Class
708
-     *        $this->LIB->{$class_name}                ie:    $this->LIB->Some_Class
709
-     *        $this->addon->{$class_name}    ie:    $this->addon->Some_Addon_Class
710
-     *
711
-     * @access protected
712
-     * @param string $class_name
713
-     * @param string $class_prefix
714
-     * @return mixed
715
-     */
716
-    protected function _get_cached_class($class_name, $class_prefix = '')
717
-    {
718
-        if (isset($this->_class_abbreviations[$class_name])) {
719
-            $class_abbreviation = $this->_class_abbreviations[$class_name];
720
-        } else {
721
-            // have to specify something, but not anything that will conflict
722
-            $class_abbreviation = 'FANCY_BATMAN_PANTS';
723
-        }
724
-        // check if class has already been loaded, and return it if it has been
725
-        if (isset($this->{$class_abbreviation}) && ! is_null($this->{$class_abbreviation})) {
726
-            return $this->{$class_abbreviation};
727
-        } else if (isset ($this->{$class_name})) {
728
-            return $this->{$class_name};
729
-        } else if (isset ($this->LIB->{$class_name})) {
730
-            return $this->LIB->{$class_name};
731
-        } else if ($class_prefix == 'addon' && isset ($this->addons->{$class_name})) {
732
-            return $this->addons->{$class_name};
733
-        }
734
-        return null;
735
-    }
736
-
737
-
738
-
739
-    /**
740
-     * _resolve_path
741
-     * attempts to find a full valid filepath for the requested class.
742
-     * loops thru each of the base paths in the $file_paths array and appends : "{classname} . {file type} . php"
743
-     * then returns that path if the target file has been found and is readable
744
-     *
745
-     * @access protected
746
-     * @param string $class_name
747
-     * @param string $type
748
-     * @param array  $file_paths
749
-     * @return string | bool
750
-     */
751
-    protected function _resolve_path($class_name, $type = '', $file_paths = array())
752
-    {
753
-        // make sure $file_paths is an array
754
-        $file_paths = is_array($file_paths) ? $file_paths : array($file_paths);
755
-        // cycle thru paths
756
-        foreach ($file_paths as $key => $file_path) {
757
-            // convert all separators to proper DS, if no filepath, then use EE_CLASSES
758
-            $file_path = $file_path ? str_replace(array('/', '\\'), DS, $file_path) : EE_CLASSES;
759
-            // prep file type
760
-            $type = ! empty($type) ? trim($type, '.') . '.' : '';
761
-            // build full file path
762
-            $file_paths[$key] = rtrim($file_path, DS) . DS . $class_name . '.' . $type . 'php';
763
-            //does the file exist and can be read ?
764
-            if (is_readable($file_paths[$key])) {
765
-                return $file_paths[$key];
766
-            }
767
-        }
768
-        return false;
769
-    }
770
-
771
-
772
-
773
-    /**
774
-     * _require_file
775
-     * basically just performs a require_once()
776
-     * but with some error handling
777
-     *
778
-     * @access protected
779
-     * @param  string $path
780
-     * @param  string $class_name
781
-     * @param  string $type
782
-     * @param  array  $file_paths
783
-     * @return boolean
784
-     * @throws \EE_Error
785
-     */
786
-    protected function _require_file($path, $class_name, $type = '', $file_paths = array())
787
-    {
788
-        // don't give up! you gotta...
789
-        try {
790
-            //does the file exist and can it be read ?
791
-            if ( ! $path) {
792
-                // so sorry, can't find the file
793
-                throw new EE_Error (
794
-                    sprintf(
795
-                        __('The %1$s file %2$s could not be located or is not readable due to file permissions. Please ensure that the following filepath(s) are correct: %3$s', 'event_espresso'),
796
-                        trim($type, '.'),
797
-                        $class_name,
798
-                        '<br />' . implode(',<br />', $file_paths)
799
-                    )
800
-                );
801
-            }
802
-            // get the file
803
-            require_once($path);
804
-            // if the class isn't already declared somewhere
805
-            if (class_exists($class_name, false) === false) {
806
-                // so sorry, not a class
807
-                throw new EE_Error(
808
-                    sprintf(
809
-                        __('The %s file %s does not appear to contain the %s Class.', 'event_espresso'),
810
-                        $type,
811
-                        $path,
812
-                        $class_name
813
-                    )
814
-                );
815
-            }
816
-        } catch (EE_Error $e) {
817
-            $e->get_error();
818
-            return false;
819
-        }
820
-        return true;
821
-    }
822
-
823
-
824
-
825
-    /**
826
-     * _create_object
827
-     * Attempts to instantiate the requested class via any of the
828
-     * commonly used instantiation methods employed throughout EE.
829
-     * The priority for instantiation is as follows:
830
-     *        - abstract classes or any class flagged as "load only" (no instantiation occurs)
831
-     *        - model objects via their 'new_instance_from_db' method
832
-     *        - model objects via their 'new_instance' method
833
-     *        - "singleton" classes" via their 'instance' method
834
-     *    - standard instantiable classes via their __constructor
835
-     * Prior to instantiation, if the classname exists in the dependency_map,
836
-     * then the constructor for the requested class will be examined to determine
837
-     * if any dependencies exist, and if they can be injected.
838
-     * If so, then those classes will be added to the array of arguments passed to the constructor
839
-     *
840
-     * @access protected
841
-     * @param string $class_name
842
-     * @param array  $arguments
843
-     * @param string $type
844
-     * @param bool   $from_db
845
-     * @return null | object
846
-     * @throws \EE_Error
847
-     */
848
-    protected function _create_object($class_name, $arguments = array(), $type = '', $from_db = false)
849
-    {
850
-        $class_obj = null;
851
-        $instantiation_mode = '0) none';
852
-        // don't give up! you gotta...
853
-        try {
854
-            // create reflection
855
-            $reflector = $this->get_ReflectionClass($class_name);
856
-            // make sure arguments are an array
857
-            $arguments = is_array($arguments) ? $arguments : array($arguments);
858
-            // and if arguments array is numerically and sequentially indexed, then we want it to remain as is,
859
-            // else wrap it in an additional array so that it doesn't get split into multiple parameters
860
-            $arguments = $this->_array_is_numerically_and_sequentially_indexed($arguments)
861
-                ? $arguments
862
-                : array($arguments);
863
-            // attempt to inject dependencies ?
864
-            if ($this->_dependency_map->has($class_name)) {
865
-                $arguments = $this->_resolve_dependencies($reflector, $class_name, $arguments);
866
-            }
867
-            // instantiate the class if possible
868
-            if ($reflector->isAbstract()) {
869
-                // nothing to instantiate, loading file was enough
870
-                // does not throw an exception so $instantiation_mode is unused
871
-                // $instantiation_mode = "1) no constructor abstract class";
872
-                $class_obj = true;
873
-            } else if ($reflector->getConstructor() === null && $reflector->isInstantiable() && empty($arguments)) {
874
-                // no constructor = static methods only... nothing to instantiate, loading file was enough
875
-                $instantiation_mode = "2) no constructor but instantiable";
876
-                $class_obj = $reflector->newInstance();
877
-            } else if ($from_db && method_exists($class_name, 'new_instance_from_db')) {
878
-                $instantiation_mode = "3) new_instance_from_db()";
879
-                $class_obj = call_user_func_array(array($class_name, 'new_instance_from_db'), $arguments);
880
-            } else if (method_exists($class_name, 'new_instance')) {
881
-                $instantiation_mode = "4) new_instance()";
882
-                $class_obj = call_user_func_array(array($class_name, 'new_instance'), $arguments);
883
-            } else if (method_exists($class_name, 'instance')) {
884
-                $instantiation_mode = "5) instance()";
885
-                $class_obj = call_user_func_array(array($class_name, 'instance'), $arguments);
886
-            } else if ($reflector->isInstantiable()) {
887
-                $instantiation_mode = "6) constructor";
888
-                $class_obj = $reflector->newInstanceArgs($arguments);
889
-            } else {
890
-                // heh ? something's not right !
891
-                throw new EE_Error(
892
-                    sprintf(
893
-                        __('The %s file %s could not be instantiated.', 'event_espresso'),
894
-                        $type,
895
-                        $class_name
896
-                    )
897
-                );
898
-            }
899
-        } catch (Exception $e) {
900
-            if ( ! $e instanceof EE_Error) {
901
-                $e = new EE_Error(
902
-                    sprintf(
903
-                        __('The following error occurred while attempting to instantiate "%1$s": %2$s %3$s %2$s instantiation mode : %4$s', 'event_espresso'),
904
-                        $class_name,
905
-                        '<br />',
906
-                        $e->getMessage(),
907
-                        $instantiation_mode
908
-                    )
909
-                );
910
-            }
911
-            $e->get_error();
912
-        }
913
-        return $class_obj;
914
-    }
915
-
916
-
917
-
918
-    /**
919
-     * @see http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential
920
-     * @param array $array
921
-     * @return bool
922
-     */
923
-    protected function _array_is_numerically_and_sequentially_indexed(array $array)
924
-    {
925
-        return ! empty($array) ? array_keys($array) === range(0, count($array) - 1) : true;
926
-    }
927
-
928
-
929
-
930
-    /**
931
-     * getReflectionClass
932
-     * checks if a ReflectionClass object has already been generated for a class
933
-     * and returns that instead of creating a new one
934
-     *
935
-     * @access public
936
-     * @param string $class_name
937
-     * @return ReflectionClass
938
-     */
939
-    public function get_ReflectionClass($class_name)
940
-    {
941
-        if (
942
-            ! isset($this->_reflectors[$class_name])
943
-            || ! $this->_reflectors[$class_name] instanceof ReflectionClass
944
-        ) {
945
-            $this->_reflectors[$class_name] = new ReflectionClass($class_name);
946
-        }
947
-        return $this->_reflectors[$class_name];
948
-    }
949
-
950
-
951
-
952
-    /**
953
-     * _resolve_dependencies
954
-     * examines the constructor for the requested class to determine
955
-     * if any dependencies exist, and if they can be injected.
956
-     * If so, then those classes will be added to the array of arguments passed to the constructor
957
-     * PLZ NOTE: this is achieved by type hinting the constructor params
958
-     * For example:
959
-     *        if attempting to load a class "Foo" with the following constructor:
960
-     *        __construct( Bar $bar_class, Fighter $grohl_class )
961
-     *        then $bar_class and $grohl_class will be added to the $arguments array,
962
-     *        but only IF they are NOT already present in the incoming arguments array,
963
-     *        and the correct classes can be loaded
964
-     *
965
-     * @access protected
966
-     * @param ReflectionClass $reflector
967
-     * @param string          $class_name
968
-     * @param array           $arguments
969
-     * @return array
970
-     * @throws \ReflectionException
971
-     */
972
-    protected function _resolve_dependencies(ReflectionClass $reflector, $class_name, $arguments = array())
973
-    {
974
-        // let's examine the constructor
975
-        $constructor = $reflector->getConstructor();
976
-        // whu? huh? nothing?
977
-        if ( ! $constructor) {
978
-            return $arguments;
979
-        }
980
-        // get constructor parameters
981
-        $params = $constructor->getParameters();
982
-        // and the keys for the incoming arguments array so that we can compare existing arguments with what is expected
983
-        $argument_keys = array_keys($arguments);
984
-        // now loop thru all of the constructors expected parameters
985
-        foreach ($params as $index => $param) {
986
-            // is this a dependency for a specific class ?
987
-            $param_class = $param->getClass() ? $param->getClass()->name : null;
988
-            if (
989
-                // param is not even a class
990
-                empty($param_class)
991
-                // and something already exists in the incoming arguments for this param
992
-                && isset($argument_keys[$index], $arguments[$argument_keys[$index]])
993
-            ) {
994
-                // so let's skip this argument and move on to the next
995
-                continue;
996
-            } else if (
997
-                // parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
998
-                ! empty($param_class)
999
-                && isset($argument_keys[$index], $arguments[$argument_keys[$index]])
1000
-                && $arguments[$argument_keys[$index]] instanceof $param_class
1001
-            ) {
1002
-                // skip this argument and move on to the next
1003
-                continue;
1004
-            } else if (
1005
-                // parameter is type hinted as a class, and should be injected
1006
-                ! empty($param_class)
1007
-                && $this->_dependency_map->has_dependency_for_class($class_name, $param_class)
1008
-            ) {
1009
-                $arguments = $this->_resolve_dependency($class_name, $param_class, $arguments, $index);
1010
-            } else {
1011
-                try {
1012
-                    $arguments[$index] = $param->getDefaultValue();
1013
-                } catch (ReflectionException $e) {
1014
-                    throw new ReflectionException(
1015
-                        sprintf(
1016
-                            __('%1$s for parameter "$%2$s"', 'event_espresso'),
1017
-                            $e->getMessage(),
1018
-                            $param->getName()
1019
-                        )
1020
-                    );
1021
-                }
1022
-            }
1023
-        }
1024
-        return $arguments;
1025
-    }
1026
-
1027
-
1028
-
1029
-    /**
1030
-     * @access protected
1031
-     * @param string $class_name
1032
-     * @param string $param_class
1033
-     * @param array  $arguments
1034
-     * @param mixed  $index
1035
-     * @return array
1036
-     */
1037
-    protected function _resolve_dependency($class_name, $param_class, $arguments, $index)
1038
-    {
1039
-        $dependency = null;
1040
-        // should dependency be loaded from cache ?
1041
-        $cache_on = $this->_dependency_map->loading_strategy_for_class_dependency($class_name, $param_class)
1042
-                    !== EE_Dependency_Map::load_new_object
1043
-            ? true
1044
-            : false;
1045
-        // we might have a dependency...
1046
-        // let's MAYBE try and find it in our cache if that's what's been requested
1047
-        $cached_class = $cache_on ? $this->_get_cached_class($param_class) : null;
1048
-        // and grab it if it exists
1049
-        if ($cached_class instanceof $param_class) {
1050
-            $dependency = $cached_class;
1051
-        } else if ($param_class != $class_name) {
1052
-            // obtain the loader method from the dependency map
1053
-            $loader = $this->_dependency_map->class_loader($param_class);
1054
-            // is loader a custom closure ?
1055
-            if ($loader instanceof Closure) {
1056
-                $dependency = $loader();
1057
-            } else {
1058
-                // set the cache on property for the recursive loading call
1059
-                $this->_cache_on = $cache_on;
1060
-                // if not, then let's try and load it via the registry
1061
-                if (method_exists($this, $loader)) {
1062
-                    $dependency = $this->{$loader}($param_class);
1063
-                } else {
1064
-                    $dependency = $this->create($param_class, array(), $cache_on);
1065
-                }
1066
-            }
1067
-        }
1068
-        // did we successfully find the correct dependency ?
1069
-        if ($dependency instanceof $param_class) {
1070
-            // then let's inject it into the incoming array of arguments at the correct location
1071
-            if (isset($argument_keys[$index])) {
1072
-                $arguments[$argument_keys[$index]] = $dependency;
1073
-            } else {
1074
-                $arguments[$index] = $dependency;
1075
-            }
1076
-        }
1077
-        return $arguments;
1078
-    }
1079
-
1080
-
1081
-
1082
-    /**
1083
-     * _set_cached_class
1084
-     * attempts to cache the instantiated class locally
1085
-     * in one of the following places, in the following order:
1086
-     *        $this->{class_abbreviation}   ie:    $this->CART
1087
-     *        $this->{$class_name}          ie:    $this->Some_Class
1088
-     *        $this->addon->{$$class_name}    ie:    $this->addon->Some_Addon_Class
1089
-     *        $this->LIB->{$class_name}     ie:    $this->LIB->Some_Class
1090
-     *
1091
-     * @access protected
1092
-     * @param object $class_obj
1093
-     * @param string $class_name
1094
-     * @param string $class_prefix
1095
-     * @param bool   $from_db
1096
-     * @return void
1097
-     */
1098
-    protected function _set_cached_class($class_obj, $class_name, $class_prefix = '', $from_db = false)
1099
-    {
1100
-        if (empty($class_obj)) {
1101
-            return;
1102
-        }
1103
-        // return newly instantiated class
1104
-        if (isset($this->_class_abbreviations[$class_name])) {
1105
-            $class_abbreviation = $this->_class_abbreviations[$class_name];
1106
-            $this->{$class_abbreviation} = $class_obj;
1107
-        } else if (property_exists($this, $class_name)) {
1108
-            $this->{$class_name} = $class_obj;
1109
-        } else if ($class_prefix == 'addon') {
1110
-            $this->addons->{$class_name} = $class_obj;
1111
-        } else if ( ! $from_db) {
1112
-            $this->LIB->{$class_name} = $class_obj;
1113
-        }
1114
-    }
1115
-
1116
-
1117
-
1118
-    /**
1119
-     * call any loader that's been registered in the EE_Dependency_Map::$_class_loaders array
1120
-     *
1121
-     * @param string $classname PLEASE NOTE: the class name needs to match what's registered
1122
-     *                          in the EE_Dependency_Map::$_class_loaders array,
1123
-     *                          including the class prefix, ie: "EE_", "EEM_", "EEH_", etc
1124
-     * @param array  $arguments
1125
-     * @return object
1126
-     */
1127
-    public static function factory($classname, $arguments = array())
1128
-    {
1129
-        $loader = self::instance()->_dependency_map->class_loader($classname);
1130
-        if ($loader instanceof Closure) {
1131
-            return $loader($arguments);
1132
-        } else if (method_exists(EE_Registry::instance(), $loader)) {
1133
-            return EE_Registry::instance()->{$loader}($classname, $arguments);
1134
-        }
1135
-        return null;
1136
-    }
1137
-
1138
-
1139
-
1140
-    /**
1141
-     * Gets the addon by its name/slug (not classname. For that, just
1142
-     * use the classname as the property name on EE_Config::instance()->addons)
1143
-     *
1144
-     * @param string $name
1145
-     * @return EE_Addon
1146
-     */
1147
-    public function get_addon_by_name($name)
1148
-    {
1149
-        foreach ($this->addons as $addon) {
1150
-            if ($addon->name() == $name) {
1151
-                return $addon;
1152
-            }
1153
-        }
1154
-        return null;
1155
-    }
1156
-
1157
-
1158
-
1159
-    /**
1160
-     * Gets an array of all the registered addons, where the keys are their names. (ie, what each returns for their name() function) They're already available on EE_Config::instance()->addons as properties, where each property's name is
1161
-     * the addon's classname. So if you just want to get the addon by classname, use EE_Config::instance()->addons->{classname}
1162
-     *
1163
-     * @return EE_Addon[] where the KEYS are the addon's name()
1164
-     */
1165
-    public function get_addons_by_name()
1166
-    {
1167
-        $addons = array();
1168
-        foreach ($this->addons as $addon) {
1169
-            $addons[$addon->name()] = $addon;
1170
-        }
1171
-        return $addons;
1172
-    }
1173
-
1174
-
1175
-
1176
-    /**
1177
-     * Resets the specified model's instance AND makes sure EE_Registry doesn't keep
1178
-     * a stale copy of it around
1179
-     *
1180
-     * @param string $model_name
1181
-     * @return \EEM_Base
1182
-     * @throws \EE_Error
1183
-     */
1184
-    public function reset_model($model_name)
1185
-    {
1186
-        $model_class_name = strpos($model_name, 'EEM_') !== 0 ? "EEM_{$model_name}" : $model_name;
1187
-        if ( ! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1188
-            return null;
1189
-        }
1190
-        //get that model reset it and make sure we nuke the old reference to it
1191
-        if ($this->LIB->{$model_class_name} instanceof $model_class_name && is_callable(array($model_class_name, 'reset'))) {
1192
-            $this->LIB->{$model_class_name} = $this->LIB->{$model_class_name}->reset();
1193
-        } else {
1194
-            throw new EE_Error(sprintf(__('Model %s does not have a method "reset"', 'event_espresso'), $model_name));
1195
-        }
1196
-        return $this->LIB->{$model_class_name};
1197
-    }
1198
-
1199
-
1200
-
1201
-    /**
1202
-     * Resets the registry.
1203
-     * The criteria for what gets reset is based on what can be shared between sites on the same request when switch_to_blog
1204
-     * is used in a multisite install.  Here is a list of things that are NOT reset.
1205
-     * - $_dependency_map
1206
-     * - $_class_abbreviations
1207
-     * - $NET_CFG (EE_Network_Config): The config is shared network wide so no need to reset.
1208
-     * - $REQ:  Still on the same request so no need to change.
1209
-     * - $CAP: There is no site specific state in the EE_Capability class.
1210
-     * - $SSN: Although ideally, the session should not be shared between site switches, we can't reset it because only one Session
1211
-     *         can be active in a single request.  Resetting could resolve in "headers already sent" errors.
1212
-     * - $addons:  In multisite, the state of the addons is something controlled via hooks etc in a normal request.  So
1213
-     *             for now, we won't reset the addons because it could break calls to an add-ons class/methods in the
1214
-     *             switch or on the restore.
1215
-     * - $modules
1216
-     * - $shortcodes
1217
-     * - $widgets
1218
-     *
1219
-     * @param boolean $hard             whether to reset data in the database too, or just refresh
1220
-     *                                  the Registry to its state at the beginning of the request
1221
-     * @param boolean $reinstantiate    whether to create new instances of EE_Registry's singletons too,
1222
-     *                                  or just reset without re-instantiating (handy to set to FALSE if you're not sure if you CAN
1223
-     *                                  currently reinstantiate the singletons at the moment)
1224
-     * @param   bool  $reset_models     Defaults to true.  When false, then the models are not reset.  This is so client
1225
-     *                                  code instead can just change the model context to a different blog id if necessary
1226
-     * @return EE_Registry
1227
-     */
1228
-    public static function reset($hard = false, $reinstantiate = true, $reset_models = true)
1229
-    {
1230
-        $instance = self::instance();
1231
-        EEH_Activation::reset();
1232
-        //properties that get reset
1233
-        $instance->_cache_on = true;
1234
-        $instance->CFG = EE_Config::reset($hard, $reinstantiate);
1235
-        $instance->CART = null;
1236
-        $instance->MRM = null;
1237
-        $instance->AssetsRegistry = null;
1238
-        $instance->AssetsRegistry = $instance->create('EventEspresso\core\services\assets\Registry');
1239
-        //messages reset
1240
-        EED_Messages::reset();
1241
-        if ($reset_models) {
1242
-            foreach (array_keys($instance->non_abstract_db_models) as $model_name) {
1243
-                $instance->reset_model($model_name);
1244
-            }
1245
-        }
1246
-        $instance->LIB = new stdClass();
1247
-        return $instance;
1248
-    }
1249
-
1250
-
1251
-
1252
-    /**
1253
-     * @override magic methods
1254
-     * @return void
1255
-     */
1256
-    public final function __destruct()
1257
-    {
1258
-    }
1259
-
1260
-
1261
-
1262
-    /**
1263
-     * @param $a
1264
-     * @param $b
1265
-     */
1266
-    public final function __call($a, $b)
1267
-    {
1268
-    }
1269
-
1270
-
1271
-
1272
-    /**
1273
-     * @param $a
1274
-     */
1275
-    public final function __get($a)
1276
-    {
1277
-    }
1278
-
1279
-
1280
-
1281
-    /**
1282
-     * @param $a
1283
-     * @param $b
1284
-     */
1285
-    public final function __set($a, $b)
1286
-    {
1287
-    }
1288
-
1289
-
1290
-
1291
-    /**
1292
-     * @param $a
1293
-     */
1294
-    public final function __isset($a)
1295
-    {
1296
-    }
19
+	/**
20
+	 *    EE_Registry Object
21
+	 *
22
+	 * @var EE_Registry $_instance
23
+	 * @access    private
24
+	 */
25
+	private static $_instance = null;
26
+
27
+	/**
28
+	 * @var EE_Dependency_Map $_dependency_map
29
+	 * @access    protected
30
+	 */
31
+	protected $_dependency_map = null;
32
+
33
+	/**
34
+	 * @var array $_class_abbreviations
35
+	 * @access    protected
36
+	 */
37
+	protected $_class_abbreviations = array();
38
+
39
+	/**
40
+	 * @access public
41
+	 * @var \EventEspresso\core\services\commands\CommandBusInterface $BUS
42
+	 */
43
+	public $BUS;
44
+
45
+	/**
46
+	 *    EE_Cart Object
47
+	 *
48
+	 * @access    public
49
+	 * @var    EE_Cart $CART
50
+	 */
51
+	public $CART = null;
52
+
53
+	/**
54
+	 *    EE_Config Object
55
+	 *
56
+	 * @access    public
57
+	 * @var    EE_Config $CFG
58
+	 */
59
+	public $CFG = null;
60
+
61
+	/**
62
+	 * EE_Network_Config Object
63
+	 *
64
+	 * @access public
65
+	 * @var EE_Network_Config $NET_CFG
66
+	 */
67
+	public $NET_CFG = null;
68
+
69
+	/**
70
+	 *    StdClass object for storing library classes in
71
+	 *
72
+	 * @public LIB
73
+	 * @var StdClass $LIB
74
+	 */
75
+	public $LIB = null;
76
+
77
+	/**
78
+	 *    EE_Request_Handler Object
79
+	 *
80
+	 * @access    public
81
+	 * @var    EE_Request_Handler $REQ
82
+	 */
83
+	public $REQ = null;
84
+
85
+	/**
86
+	 *    EE_Session Object
87
+	 *
88
+	 * @access    public
89
+	 * @var    EE_Session $SSN
90
+	 */
91
+	public $SSN = null;
92
+
93
+	/**
94
+	 * holds the ee capabilities object.
95
+	 *
96
+	 * @since 4.5.0
97
+	 * @var EE_Capabilities
98
+	 */
99
+	public $CAP = null;
100
+
101
+	/**
102
+	 * holds the EE_Message_Resource_Manager object.
103
+	 *
104
+	 * @since 4.9.0
105
+	 * @var EE_Message_Resource_Manager
106
+	 */
107
+	public $MRM = null;
108
+
109
+
110
+	/**
111
+	 * Holds the Assets Registry instance
112
+	 * @var Registry
113
+	 */
114
+	public $AssetsRegistry = null;
115
+
116
+	/**
117
+	 *    $addons - StdClass object for holding addons which have registered themselves to work with EE core
118
+	 *
119
+	 * @access    public
120
+	 * @var    EE_Addon[]
121
+	 */
122
+	public $addons = null;
123
+
124
+	/**
125
+	 *    $models
126
+	 * @access    public
127
+	 * @var    EEM_Base[] $models keys are 'short names' (eg Event), values are class names (eg 'EEM_Event')
128
+	 */
129
+	public $models = array();
130
+
131
+	/**
132
+	 *    $modules
133
+	 * @access    public
134
+	 * @var    EED_Module[] $modules
135
+	 */
136
+	public $modules = null;
137
+
138
+	/**
139
+	 *    $shortcodes
140
+	 * @access    public
141
+	 * @var    EES_Shortcode[] $shortcodes
142
+	 */
143
+	public $shortcodes = null;
144
+
145
+	/**
146
+	 *    $widgets
147
+	 * @access    public
148
+	 * @var    WP_Widget[] $widgets
149
+	 */
150
+	public $widgets = null;
151
+
152
+	/**
153
+	 * $non_abstract_db_models
154
+	 * @access public
155
+	 * @var array this is an array of all implemented model names (i.e. not the parent abstract models, or models
156
+	 * which don't actually fetch items from the DB in the normal way (ie, are not children of EEM_Base)).
157
+	 * Keys are model "short names" (eg "Event") as used in model relations, and values are
158
+	 * classnames (eg "EEM_Event")
159
+	 */
160
+	public $non_abstract_db_models = array();
161
+
162
+
163
+	/**
164
+	 *    $i18n_js_strings - internationalization for JS strings
165
+	 *    usage:   EE_Registry::i18n_js_strings['string_key'] = __( 'string to translate.', 'event_espresso' );
166
+	 *    in js file:  var translatedString = eei18n.string_key;
167
+	 *
168
+	 * @access    public
169
+	 * @var    array
170
+	 */
171
+	public static $i18n_js_strings = array();
172
+
173
+
174
+	/**
175
+	 *    $main_file - path to espresso.php
176
+	 *
177
+	 * @access    public
178
+	 * @var    array
179
+	 */
180
+	public $main_file;
181
+
182
+	/**
183
+	 * array of ReflectionClass objects where the key is the class name
184
+	 *
185
+	 * @access    public
186
+	 * @var ReflectionClass[]
187
+	 */
188
+	public $_reflectors;
189
+
190
+	/**
191
+	 * boolean flag to indicate whether or not to load/save dependencies from/to the cache
192
+	 *
193
+	 * @access    protected
194
+	 * @var boolean $_cache_on
195
+	 */
196
+	protected $_cache_on = true;
197
+
198
+
199
+
200
+	/**
201
+	 * @singleton method used to instantiate class object
202
+	 * @access    public
203
+	 * @param  \EE_Dependency_Map $dependency_map
204
+	 * @return \EE_Registry instance
205
+	 */
206
+	public static function instance(\EE_Dependency_Map $dependency_map = null)
207
+	{
208
+		// check if class object is instantiated
209
+		if ( ! self::$_instance instanceof EE_Registry) {
210
+			self::$_instance = new EE_Registry($dependency_map);
211
+		}
212
+		return self::$_instance;
213
+	}
214
+
215
+
216
+
217
+	/**
218
+	 *protected constructor to prevent direct creation
219
+	 *
220
+	 * @Constructor
221
+	 * @access protected
222
+	 * @param  \EE_Dependency_Map $dependency_map
223
+	 * @return \EE_Registry
224
+	 */
225
+	protected function __construct(\EE_Dependency_Map $dependency_map)
226
+	{
227
+		$this->_dependency_map = $dependency_map;
228
+		add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
229
+	}
230
+
231
+
232
+
233
+	/**
234
+	 * initialize
235
+	 */
236
+	public function initialize()
237
+	{
238
+		$this->_class_abbreviations = apply_filters(
239
+			'FHEE__EE_Registry____construct___class_abbreviations',
240
+			array(
241
+				'EE_Config'                                       => 'CFG',
242
+				'EE_Session'                                      => 'SSN',
243
+				'EE_Capabilities'                                 => 'CAP',
244
+				'EE_Cart'                                         => 'CART',
245
+				'EE_Network_Config'                               => 'NET_CFG',
246
+				'EE_Request_Handler'                              => 'REQ',
247
+				'EE_Message_Resource_Manager'                     => 'MRM',
248
+				'EventEspresso\core\services\commands\CommandBus' => 'BUS',
249
+				'EventEspresso\core\services\assets\Registry'     => 'AssetsRegistry',
250
+			)
251
+		);
252
+		// class library
253
+		$this->LIB = new stdClass();
254
+		$this->addons = new stdClass();
255
+		$this->modules = new stdClass();
256
+		$this->shortcodes = new stdClass();
257
+		$this->widgets = new stdClass();
258
+		$this->load_core('Base', array(), true);
259
+		// add our request and response objects to the cache
260
+		$request_loader = $this->_dependency_map->class_loader('EE_Request');
261
+		$this->_set_cached_class(
262
+			$request_loader(),
263
+			'EE_Request'
264
+		);
265
+		$response_loader = $this->_dependency_map->class_loader('EE_Response');
266
+		$this->_set_cached_class(
267
+			$response_loader(),
268
+			'EE_Response'
269
+		);
270
+		add_action('AHEE__EE_System__set_hooks_for_core', array($this, 'init'));
271
+	}
272
+
273
+
274
+
275
+	/**
276
+	 *    init
277
+	 *
278
+	 * @access    public
279
+	 * @return    void
280
+	 */
281
+	public function init()
282
+	{
283
+		// Get current page protocol
284
+		$protocol = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
285
+		// Output admin-ajax.php URL with same protocol as current page
286
+		self::$i18n_js_strings['ajax_url'] = admin_url('admin-ajax.php', $protocol);
287
+		self::$i18n_js_strings['wp_debug'] = defined('WP_DEBUG') ? WP_DEBUG : false;
288
+	}
289
+
290
+
291
+
292
+	/**
293
+	 * localize_i18n_js_strings
294
+	 *
295
+	 * @return string
296
+	 */
297
+	public static function localize_i18n_js_strings()
298
+	{
299
+		$i18n_js_strings = (array)EE_Registry::$i18n_js_strings;
300
+		foreach ($i18n_js_strings as $key => $value) {
301
+			if (is_scalar($value)) {
302
+				$i18n_js_strings[$key] = html_entity_decode((string)$value, ENT_QUOTES, 'UTF-8');
303
+			}
304
+		}
305
+		return "/* <![CDATA[ */ var eei18n = " . wp_json_encode($i18n_js_strings) . '; /* ]]> */';
306
+	}
307
+
308
+
309
+
310
+	/**
311
+	 * @param mixed string | EED_Module $module
312
+	 */
313
+	public function add_module($module)
314
+	{
315
+		if ($module instanceof EED_Module) {
316
+			$module_class = get_class($module);
317
+			$this->modules->{$module_class} = $module;
318
+		} else {
319
+			if ( ! class_exists('EE_Module_Request_Router')) {
320
+				$this->load_core('Module_Request_Router');
321
+			}
322
+			$this->modules->{$module} = EE_Module_Request_Router::module_factory($module);
323
+		}
324
+	}
325
+
326
+
327
+
328
+	/**
329
+	 * @param string $module_name
330
+	 * @return mixed EED_Module | NULL
331
+	 */
332
+	public function get_module($module_name = '')
333
+	{
334
+		return isset($this->modules->{$module_name}) ? $this->modules->{$module_name} : null;
335
+	}
336
+
337
+
338
+
339
+	/**
340
+	 *    loads core classes - must be singletons
341
+	 *
342
+	 * @access    public
343
+	 * @param string $class_name - simple class name ie: session
344
+	 * @param mixed  $arguments
345
+	 * @param bool   $load_only
346
+	 * @return mixed
347
+	 */
348
+	public function load_core($class_name, $arguments = array(), $load_only = false)
349
+	{
350
+		$core_paths = apply_filters(
351
+			'FHEE__EE_Registry__load_core__core_paths',
352
+			array(
353
+				EE_CORE,
354
+				EE_ADMIN,
355
+				EE_CPTS,
356
+				EE_CORE . 'data_migration_scripts' . DS,
357
+				EE_CORE . 'request_stack' . DS,
358
+				EE_CORE . 'middleware' . DS,
359
+			)
360
+		);
361
+		// retrieve instantiated class
362
+		return $this->_load($core_paths, 'EE_', $class_name, 'core', $arguments, false, true, $load_only);
363
+	}
364
+
365
+
366
+
367
+	/**
368
+	 *    loads service classes
369
+	 *
370
+	 * @access    public
371
+	 * @param string $class_name - simple class name ie: session
372
+	 * @param mixed  $arguments
373
+	 * @param bool   $load_only
374
+	 * @return mixed
375
+	 */
376
+	public function load_service($class_name, $arguments = array(), $load_only = false)
377
+	{
378
+		$service_paths = apply_filters(
379
+			'FHEE__EE_Registry__load_service__service_paths',
380
+			array(
381
+				EE_CORE . 'services' . DS,
382
+			)
383
+		);
384
+		// retrieve instantiated class
385
+		return $this->_load($service_paths, 'EE_', $class_name, 'class', $arguments, false, true, $load_only);
386
+	}
387
+
388
+
389
+
390
+	/**
391
+	 *    loads data_migration_scripts
392
+	 *
393
+	 * @access    public
394
+	 * @param string $class_name - class name for the DMS ie: EE_DMS_Core_4_2_0
395
+	 * @param mixed  $arguments
396
+	 * @return EE_Data_Migration_Script_Base|mixed
397
+	 */
398
+	public function load_dms($class_name, $arguments = array())
399
+	{
400
+		// retrieve instantiated class
401
+		return $this->_load(EE_Data_Migration_Manager::instance()->get_data_migration_script_folders(), 'EE_DMS_', $class_name, 'dms', $arguments, false, false, false);
402
+	}
403
+
404
+
405
+
406
+	/**
407
+	 *    loads object creating classes - must be singletons
408
+	 *
409
+	 * @param string $class_name - simple class name ie: attendee
410
+	 * @param mixed  $arguments  - an array of arguments to pass to the class
411
+	 * @param bool   $from_db    - some classes are instantiated from the db and thus call a different method to instantiate
412
+	 * @param bool   $cache      if you don't want the class to be stored in the internal cache (non-persistent) then set this to FALSE (ie. when instantiating model objects from client in a loop)
413
+	 * @param bool   $load_only  whether or not to just load the file and NOT instantiate, or load AND instantiate (default)
414
+	 * @return EE_Base_Class | bool
415
+	 */
416
+	public function load_class($class_name, $arguments = array(), $from_db = false, $cache = true, $load_only = false)
417
+	{
418
+		$paths = apply_filters('FHEE__EE_Registry__load_class__paths', array(
419
+			EE_CORE,
420
+			EE_CLASSES,
421
+			EE_BUSINESS,
422
+		));
423
+		// retrieve instantiated class
424
+		return $this->_load($paths, 'EE_', $class_name, 'class', $arguments, $from_db, $cache, $load_only);
425
+	}
426
+
427
+
428
+
429
+	/**
430
+	 *    loads helper classes - must be singletons
431
+	 *
432
+	 * @param string $class_name - simple class name ie: price
433
+	 * @param mixed  $arguments
434
+	 * @param bool   $load_only
435
+	 * @return EEH_Base | bool
436
+	 */
437
+	public function load_helper($class_name, $arguments = array(), $load_only = true)
438
+	{
439
+		// todo: add doing_it_wrong() in a few versions after all addons have had calls to this method removed
440
+		$helper_paths = apply_filters('FHEE__EE_Registry__load_helper__helper_paths', array(EE_HELPERS));
441
+		// retrieve instantiated class
442
+		return $this->_load($helper_paths, 'EEH_', $class_name, 'helper', $arguments, false, true, $load_only);
443
+	}
444
+
445
+
446
+
447
+	/**
448
+	 *    loads core classes - must be singletons
449
+	 *
450
+	 * @access    public
451
+	 * @param string $class_name - simple class name ie: session
452
+	 * @param mixed  $arguments
453
+	 * @param bool   $load_only
454
+	 * @param bool   $cache      whether to cache the object or not.
455
+	 * @return mixed
456
+	 */
457
+	public function load_lib($class_name, $arguments = array(), $load_only = false, $cache = true)
458
+	{
459
+		$paths = array(
460
+			EE_LIBRARIES,
461
+			EE_LIBRARIES . 'messages' . DS,
462
+			EE_LIBRARIES . 'shortcodes' . DS,
463
+			EE_LIBRARIES . 'qtips' . DS,
464
+			EE_LIBRARIES . 'payment_methods' . DS,
465
+		);
466
+		// retrieve instantiated class
467
+		return $this->_load($paths, 'EE_', $class_name, 'lib', $arguments, false, $cache, $load_only);
468
+	}
469
+
470
+
471
+
472
+	/**
473
+	 *    loads model classes - must be singletons
474
+	 *
475
+	 * @param string $class_name - simple class name ie: price
476
+	 * @param mixed  $arguments
477
+	 * @param bool   $load_only
478
+	 * @return EEM_Base | bool
479
+	 */
480
+	public function load_model($class_name, $arguments = array(), $load_only = false)
481
+	{
482
+		$paths = apply_filters('FHEE__EE_Registry__load_model__paths', array(
483
+			EE_MODELS,
484
+			EE_CORE,
485
+		));
486
+		// retrieve instantiated class
487
+		return $this->_load($paths, 'EEM_', $class_name, 'model', $arguments, false, true, $load_only);
488
+	}
489
+
490
+
491
+
492
+	/**
493
+	 *    loads model classes - must be singletons
494
+	 *
495
+	 * @param string $class_name - simple class name ie: price
496
+	 * @param mixed  $arguments
497
+	 * @param bool   $load_only
498
+	 * @return mixed | bool
499
+	 */
500
+	public function load_model_class($class_name, $arguments = array(), $load_only = true)
501
+	{
502
+		$paths = array(
503
+			EE_MODELS . 'fields' . DS,
504
+			EE_MODELS . 'helpers' . DS,
505
+			EE_MODELS . 'relations' . DS,
506
+			EE_MODELS . 'strategies' . DS,
507
+		);
508
+		// retrieve instantiated class
509
+		return $this->_load($paths, 'EE_', $class_name, '', $arguments, false, true, $load_only);
510
+	}
511
+
512
+
513
+
514
+	/**
515
+	 * Determines if $model_name is the name of an actual EE model.
516
+	 *
517
+	 * @param string $model_name like Event, Attendee, Question_Group_Question, etc.
518
+	 * @return boolean
519
+	 */
520
+	public function is_model_name($model_name)
521
+	{
522
+		return isset($this->models[$model_name]) ? true : false;
523
+	}
524
+
525
+
526
+
527
+	/**
528
+	 *    generic class loader
529
+	 *
530
+	 * @param string $path_to_file - directory path to file location, not including filename
531
+	 * @param string $file_name    - file name  ie:  my_file.php, including extension
532
+	 * @param string $type         - file type - core? class? helper? model?
533
+	 * @param mixed  $arguments
534
+	 * @param bool   $load_only
535
+	 * @return mixed
536
+	 */
537
+	public function load_file($path_to_file, $file_name, $type = '', $arguments = array(), $load_only = true)
538
+	{
539
+		// retrieve instantiated class
540
+		return $this->_load($path_to_file, '', $file_name, $type, $arguments, false, true, $load_only);
541
+	}
542
+
543
+
544
+
545
+	/**
546
+	 *    load_addon
547
+	 *
548
+	 * @param string $path_to_file - directory path to file location, not including filename
549
+	 * @param string $class_name   - full class name  ie:  My_Class
550
+	 * @param string $type         - file type - core? class? helper? model?
551
+	 * @param mixed  $arguments
552
+	 * @param bool   $load_only
553
+	 * @return EE_Addon
554
+	 */
555
+	public function load_addon($path_to_file, $class_name, $type = 'class', $arguments = array(), $load_only = false)
556
+	{
557
+		// retrieve instantiated class
558
+		return $this->_load($path_to_file, 'addon', $class_name, $type, $arguments, false, true, $load_only);
559
+	}
560
+
561
+
562
+
563
+	/**
564
+	 * instantiates, caches, and automatically resolves dependencies
565
+	 * for classes that use a Fully Qualified Class Name.
566
+	 * if the class is not capable of being loaded using PSR-4 autoloading,
567
+	 * then you need to use one of the existing load_*() methods
568
+	 * which can resolve the classname and filepath from the passed arguments
569
+	 *
570
+	 * @param bool|string $class_name   Fully Qualified Class Name
571
+	 * @param array       $arguments    an argument, or array of arguments to pass to the class upon instantiation
572
+	 * @param bool        $cache        whether to cache the instantiated object for reuse
573
+	 * @param bool        $from_db      some classes are instantiated from the db
574
+	 *                                  and thus call a different method to instantiate
575
+	 * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
576
+	 * @param bool|string $addon        if true, will cache the object in the EE_Registry->$addons array
577
+	 * @return mixed                    null = failure to load or instantiate class object.
578
+	 *                                  object = class loaded and instantiated successfully.
579
+	 *                                  bool = fail or success when $load_only is true
580
+	 */
581
+	public function create(
582
+		$class_name = false,
583
+		$arguments = array(),
584
+		$cache = false,
585
+		$from_db = false,
586
+		$load_only = false,
587
+		$addon = false
588
+	) {
589
+		$class_name = ltrim($class_name, '\\');
590
+		$class_name = $this->_dependency_map->get_alias($class_name);
591
+		if ( ! class_exists($class_name)) {
592
+			// maybe the class is registered with a preceding \
593
+			$class_name = strpos($class_name, '\\') !== 0 ? '\\' . $class_name : $class_name;
594
+			// still doesn't exist ?
595
+			if ( ! class_exists($class_name)) {
596
+				return null;
597
+			}
598
+		}
599
+		// if we're only loading the class and it already exists, then let's just return true immediately
600
+		if ($load_only) {
601
+			return true;
602
+		}
603
+		$addon = $addon ? 'addon' : '';
604
+		// $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
605
+		// $cache is controlled by individual calls to separate Registry loader methods like load_class()
606
+		// $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
607
+		if ($this->_cache_on && $cache && ! $load_only) {
608
+			// return object if it's already cached
609
+			$cached_class = $this->_get_cached_class($class_name, $addon);
610
+			if ($cached_class !== null) {
611
+				return $cached_class;
612
+			}
613
+		}
614
+		// instantiate the requested object
615
+		$class_obj = $this->_create_object($class_name, $arguments, $addon, $from_db);
616
+		if ($this->_cache_on && $cache) {
617
+			// save it for later... kinda like gum  { : $
618
+			$this->_set_cached_class($class_obj, $class_name, $addon, $from_db);
619
+		}
620
+		$this->_cache_on = true;
621
+		return $class_obj;
622
+	}
623
+
624
+
625
+
626
+	/**
627
+	 * instantiates, caches, and injects dependencies for classes
628
+	 *
629
+	 * @param array       $file_paths   an array of paths to folders to look in
630
+	 * @param string      $class_prefix EE  or EEM or... ???
631
+	 * @param bool|string $class_name   $class name
632
+	 * @param string      $type         file type - core? class? helper? model?
633
+	 * @param mixed       $arguments    an argument or array of arguments to pass to the class upon instantiation
634
+	 * @param bool        $from_db      some classes are instantiated from the db
635
+	 *                                  and thus call a different method to instantiate
636
+	 * @param bool        $cache        whether to cache the instantiated object for reuse
637
+	 * @param bool        $load_only    if true, will only load the file, but will NOT instantiate an object
638
+	 * @return null|object|bool         null = failure to load or instantiate class object.
639
+	 *                                  object = class loaded and instantiated successfully.
640
+	 *                                  bool = fail or success when $load_only is true
641
+	 */
642
+	protected function _load(
643
+		$file_paths = array(),
644
+		$class_prefix = 'EE_',
645
+		$class_name = false,
646
+		$type = 'class',
647
+		$arguments = array(),
648
+		$from_db = false,
649
+		$cache = true,
650
+		$load_only = false
651
+	) {
652
+		$class_name = ltrim($class_name, '\\');
653
+		// strip php file extension
654
+		$class_name = str_replace('.php', '', trim($class_name));
655
+		// does the class have a prefix ?
656
+		if ( ! empty($class_prefix) && $class_prefix != 'addon') {
657
+			// make sure $class_prefix is uppercase
658
+			$class_prefix = strtoupper(trim($class_prefix));
659
+			// add class prefix ONCE!!!
660
+			$class_name = $class_prefix . str_replace($class_prefix, '', $class_name);
661
+		}
662
+		$class_name = $this->_dependency_map->get_alias($class_name);
663
+		$class_exists = class_exists($class_name);
664
+		// if we're only loading the class and it already exists, then let's just return true immediately
665
+		if ($load_only && $class_exists) {
666
+			return true;
667
+		}
668
+		// $this->_cache_on is toggled during the recursive loading that can occur with dependency injection
669
+		// $cache is controlled by individual calls to separate Registry loader methods like load_class()
670
+		// $load_only is also controlled by individual calls to separate Registry loader methods like load_file()
671
+		if ($this->_cache_on && $cache && ! $load_only) {
672
+			// return object if it's already cached
673
+			$cached_class = $this->_get_cached_class($class_name, $class_prefix);
674
+			if ($cached_class !== null) {
675
+				return $cached_class;
676
+			}
677
+		}
678
+		// if the class doesn't already exist.. then we need to try and find the file and load it
679
+		if ( ! $class_exists) {
680
+			// get full path to file
681
+			$path = $this->_resolve_path($class_name, $type, $file_paths);
682
+			// load the file
683
+			$loaded = $this->_require_file($path, $class_name, $type, $file_paths);
684
+			// if loading failed, or we are only loading a file but NOT instantiating an object
685
+			if ( ! $loaded || $load_only) {
686
+				// return boolean if only loading, or null if an object was expected
687
+				return $load_only ? $loaded : null;
688
+			}
689
+		}
690
+		// instantiate the requested object
691
+		$class_obj = $this->_create_object($class_name, $arguments, $type, $from_db);
692
+		if ($this->_cache_on && $cache) {
693
+			// save it for later... kinda like gum  { : $
694
+			$this->_set_cached_class($class_obj, $class_name, $class_prefix, $from_db);
695
+		}
696
+		$this->_cache_on = true;
697
+		return $class_obj;
698
+	}
699
+
700
+
701
+
702
+	/**
703
+	 * _get_cached_class
704
+	 * attempts to find a cached version of the requested class
705
+	 * by looking in the following places:
706
+	 *        $this->{$class_abbreviation}            ie:    $this->CART
707
+	 *        $this->{$class_name}                        ie:    $this->Some_Class
708
+	 *        $this->LIB->{$class_name}                ie:    $this->LIB->Some_Class
709
+	 *        $this->addon->{$class_name}    ie:    $this->addon->Some_Addon_Class
710
+	 *
711
+	 * @access protected
712
+	 * @param string $class_name
713
+	 * @param string $class_prefix
714
+	 * @return mixed
715
+	 */
716
+	protected function _get_cached_class($class_name, $class_prefix = '')
717
+	{
718
+		if (isset($this->_class_abbreviations[$class_name])) {
719
+			$class_abbreviation = $this->_class_abbreviations[$class_name];
720
+		} else {
721
+			// have to specify something, but not anything that will conflict
722
+			$class_abbreviation = 'FANCY_BATMAN_PANTS';
723
+		}
724
+		// check if class has already been loaded, and return it if it has been
725
+		if (isset($this->{$class_abbreviation}) && ! is_null($this->{$class_abbreviation})) {
726
+			return $this->{$class_abbreviation};
727
+		} else if (isset ($this->{$class_name})) {
728
+			return $this->{$class_name};
729
+		} else if (isset ($this->LIB->{$class_name})) {
730
+			return $this->LIB->{$class_name};
731
+		} else if ($class_prefix == 'addon' && isset ($this->addons->{$class_name})) {
732
+			return $this->addons->{$class_name};
733
+		}
734
+		return null;
735
+	}
736
+
737
+
738
+
739
+	/**
740
+	 * _resolve_path
741
+	 * attempts to find a full valid filepath for the requested class.
742
+	 * loops thru each of the base paths in the $file_paths array and appends : "{classname} . {file type} . php"
743
+	 * then returns that path if the target file has been found and is readable
744
+	 *
745
+	 * @access protected
746
+	 * @param string $class_name
747
+	 * @param string $type
748
+	 * @param array  $file_paths
749
+	 * @return string | bool
750
+	 */
751
+	protected function _resolve_path($class_name, $type = '', $file_paths = array())
752
+	{
753
+		// make sure $file_paths is an array
754
+		$file_paths = is_array($file_paths) ? $file_paths : array($file_paths);
755
+		// cycle thru paths
756
+		foreach ($file_paths as $key => $file_path) {
757
+			// convert all separators to proper DS, if no filepath, then use EE_CLASSES
758
+			$file_path = $file_path ? str_replace(array('/', '\\'), DS, $file_path) : EE_CLASSES;
759
+			// prep file type
760
+			$type = ! empty($type) ? trim($type, '.') . '.' : '';
761
+			// build full file path
762
+			$file_paths[$key] = rtrim($file_path, DS) . DS . $class_name . '.' . $type . 'php';
763
+			//does the file exist and can be read ?
764
+			if (is_readable($file_paths[$key])) {
765
+				return $file_paths[$key];
766
+			}
767
+		}
768
+		return false;
769
+	}
770
+
771
+
772
+
773
+	/**
774
+	 * _require_file
775
+	 * basically just performs a require_once()
776
+	 * but with some error handling
777
+	 *
778
+	 * @access protected
779
+	 * @param  string $path
780
+	 * @param  string $class_name
781
+	 * @param  string $type
782
+	 * @param  array  $file_paths
783
+	 * @return boolean
784
+	 * @throws \EE_Error
785
+	 */
786
+	protected function _require_file($path, $class_name, $type = '', $file_paths = array())
787
+	{
788
+		// don't give up! you gotta...
789
+		try {
790
+			//does the file exist and can it be read ?
791
+			if ( ! $path) {
792
+				// so sorry, can't find the file
793
+				throw new EE_Error (
794
+					sprintf(
795
+						__('The %1$s file %2$s could not be located or is not readable due to file permissions. Please ensure that the following filepath(s) are correct: %3$s', 'event_espresso'),
796
+						trim($type, '.'),
797
+						$class_name,
798
+						'<br />' . implode(',<br />', $file_paths)
799
+					)
800
+				);
801
+			}
802
+			// get the file
803
+			require_once($path);
804
+			// if the class isn't already declared somewhere
805
+			if (class_exists($class_name, false) === false) {
806
+				// so sorry, not a class
807
+				throw new EE_Error(
808
+					sprintf(
809
+						__('The %s file %s does not appear to contain the %s Class.', 'event_espresso'),
810
+						$type,
811
+						$path,
812
+						$class_name
813
+					)
814
+				);
815
+			}
816
+		} catch (EE_Error $e) {
817
+			$e->get_error();
818
+			return false;
819
+		}
820
+		return true;
821
+	}
822
+
823
+
824
+
825
+	/**
826
+	 * _create_object
827
+	 * Attempts to instantiate the requested class via any of the
828
+	 * commonly used instantiation methods employed throughout EE.
829
+	 * The priority for instantiation is as follows:
830
+	 *        - abstract classes or any class flagged as "load only" (no instantiation occurs)
831
+	 *        - model objects via their 'new_instance_from_db' method
832
+	 *        - model objects via their 'new_instance' method
833
+	 *        - "singleton" classes" via their 'instance' method
834
+	 *    - standard instantiable classes via their __constructor
835
+	 * Prior to instantiation, if the classname exists in the dependency_map,
836
+	 * then the constructor for the requested class will be examined to determine
837
+	 * if any dependencies exist, and if they can be injected.
838
+	 * If so, then those classes will be added to the array of arguments passed to the constructor
839
+	 *
840
+	 * @access protected
841
+	 * @param string $class_name
842
+	 * @param array  $arguments
843
+	 * @param string $type
844
+	 * @param bool   $from_db
845
+	 * @return null | object
846
+	 * @throws \EE_Error
847
+	 */
848
+	protected function _create_object($class_name, $arguments = array(), $type = '', $from_db = false)
849
+	{
850
+		$class_obj = null;
851
+		$instantiation_mode = '0) none';
852
+		// don't give up! you gotta...
853
+		try {
854
+			// create reflection
855
+			$reflector = $this->get_ReflectionClass($class_name);
856
+			// make sure arguments are an array
857
+			$arguments = is_array($arguments) ? $arguments : array($arguments);
858
+			// and if arguments array is numerically and sequentially indexed, then we want it to remain as is,
859
+			// else wrap it in an additional array so that it doesn't get split into multiple parameters
860
+			$arguments = $this->_array_is_numerically_and_sequentially_indexed($arguments)
861
+				? $arguments
862
+				: array($arguments);
863
+			// attempt to inject dependencies ?
864
+			if ($this->_dependency_map->has($class_name)) {
865
+				$arguments = $this->_resolve_dependencies($reflector, $class_name, $arguments);
866
+			}
867
+			// instantiate the class if possible
868
+			if ($reflector->isAbstract()) {
869
+				// nothing to instantiate, loading file was enough
870
+				// does not throw an exception so $instantiation_mode is unused
871
+				// $instantiation_mode = "1) no constructor abstract class";
872
+				$class_obj = true;
873
+			} else if ($reflector->getConstructor() === null && $reflector->isInstantiable() && empty($arguments)) {
874
+				// no constructor = static methods only... nothing to instantiate, loading file was enough
875
+				$instantiation_mode = "2) no constructor but instantiable";
876
+				$class_obj = $reflector->newInstance();
877
+			} else if ($from_db && method_exists($class_name, 'new_instance_from_db')) {
878
+				$instantiation_mode = "3) new_instance_from_db()";
879
+				$class_obj = call_user_func_array(array($class_name, 'new_instance_from_db'), $arguments);
880
+			} else if (method_exists($class_name, 'new_instance')) {
881
+				$instantiation_mode = "4) new_instance()";
882
+				$class_obj = call_user_func_array(array($class_name, 'new_instance'), $arguments);
883
+			} else if (method_exists($class_name, 'instance')) {
884
+				$instantiation_mode = "5) instance()";
885
+				$class_obj = call_user_func_array(array($class_name, 'instance'), $arguments);
886
+			} else if ($reflector->isInstantiable()) {
887
+				$instantiation_mode = "6) constructor";
888
+				$class_obj = $reflector->newInstanceArgs($arguments);
889
+			} else {
890
+				// heh ? something's not right !
891
+				throw new EE_Error(
892
+					sprintf(
893
+						__('The %s file %s could not be instantiated.', 'event_espresso'),
894
+						$type,
895
+						$class_name
896
+					)
897
+				);
898
+			}
899
+		} catch (Exception $e) {
900
+			if ( ! $e instanceof EE_Error) {
901
+				$e = new EE_Error(
902
+					sprintf(
903
+						__('The following error occurred while attempting to instantiate "%1$s": %2$s %3$s %2$s instantiation mode : %4$s', 'event_espresso'),
904
+						$class_name,
905
+						'<br />',
906
+						$e->getMessage(),
907
+						$instantiation_mode
908
+					)
909
+				);
910
+			}
911
+			$e->get_error();
912
+		}
913
+		return $class_obj;
914
+	}
915
+
916
+
917
+
918
+	/**
919
+	 * @see http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential
920
+	 * @param array $array
921
+	 * @return bool
922
+	 */
923
+	protected function _array_is_numerically_and_sequentially_indexed(array $array)
924
+	{
925
+		return ! empty($array) ? array_keys($array) === range(0, count($array) - 1) : true;
926
+	}
927
+
928
+
929
+
930
+	/**
931
+	 * getReflectionClass
932
+	 * checks if a ReflectionClass object has already been generated for a class
933
+	 * and returns that instead of creating a new one
934
+	 *
935
+	 * @access public
936
+	 * @param string $class_name
937
+	 * @return ReflectionClass
938
+	 */
939
+	public function get_ReflectionClass($class_name)
940
+	{
941
+		if (
942
+			! isset($this->_reflectors[$class_name])
943
+			|| ! $this->_reflectors[$class_name] instanceof ReflectionClass
944
+		) {
945
+			$this->_reflectors[$class_name] = new ReflectionClass($class_name);
946
+		}
947
+		return $this->_reflectors[$class_name];
948
+	}
949
+
950
+
951
+
952
+	/**
953
+	 * _resolve_dependencies
954
+	 * examines the constructor for the requested class to determine
955
+	 * if any dependencies exist, and if they can be injected.
956
+	 * If so, then those classes will be added to the array of arguments passed to the constructor
957
+	 * PLZ NOTE: this is achieved by type hinting the constructor params
958
+	 * For example:
959
+	 *        if attempting to load a class "Foo" with the following constructor:
960
+	 *        __construct( Bar $bar_class, Fighter $grohl_class )
961
+	 *        then $bar_class and $grohl_class will be added to the $arguments array,
962
+	 *        but only IF they are NOT already present in the incoming arguments array,
963
+	 *        and the correct classes can be loaded
964
+	 *
965
+	 * @access protected
966
+	 * @param ReflectionClass $reflector
967
+	 * @param string          $class_name
968
+	 * @param array           $arguments
969
+	 * @return array
970
+	 * @throws \ReflectionException
971
+	 */
972
+	protected function _resolve_dependencies(ReflectionClass $reflector, $class_name, $arguments = array())
973
+	{
974
+		// let's examine the constructor
975
+		$constructor = $reflector->getConstructor();
976
+		// whu? huh? nothing?
977
+		if ( ! $constructor) {
978
+			return $arguments;
979
+		}
980
+		// get constructor parameters
981
+		$params = $constructor->getParameters();
982
+		// and the keys for the incoming arguments array so that we can compare existing arguments with what is expected
983
+		$argument_keys = array_keys($arguments);
984
+		// now loop thru all of the constructors expected parameters
985
+		foreach ($params as $index => $param) {
986
+			// is this a dependency for a specific class ?
987
+			$param_class = $param->getClass() ? $param->getClass()->name : null;
988
+			if (
989
+				// param is not even a class
990
+				empty($param_class)
991
+				// and something already exists in the incoming arguments for this param
992
+				&& isset($argument_keys[$index], $arguments[$argument_keys[$index]])
993
+			) {
994
+				// so let's skip this argument and move on to the next
995
+				continue;
996
+			} else if (
997
+				// parameter is type hinted as a class, exists as an incoming argument, AND it's the correct class
998
+				! empty($param_class)
999
+				&& isset($argument_keys[$index], $arguments[$argument_keys[$index]])
1000
+				&& $arguments[$argument_keys[$index]] instanceof $param_class
1001
+			) {
1002
+				// skip this argument and move on to the next
1003
+				continue;
1004
+			} else if (
1005
+				// parameter is type hinted as a class, and should be injected
1006
+				! empty($param_class)
1007
+				&& $this->_dependency_map->has_dependency_for_class($class_name, $param_class)
1008
+			) {
1009
+				$arguments = $this->_resolve_dependency($class_name, $param_class, $arguments, $index);
1010
+			} else {
1011
+				try {
1012
+					$arguments[$index] = $param->getDefaultValue();
1013
+				} catch (ReflectionException $e) {
1014
+					throw new ReflectionException(
1015
+						sprintf(
1016
+							__('%1$s for parameter "$%2$s"', 'event_espresso'),
1017
+							$e->getMessage(),
1018
+							$param->getName()
1019
+						)
1020
+					);
1021
+				}
1022
+			}
1023
+		}
1024
+		return $arguments;
1025
+	}
1026
+
1027
+
1028
+
1029
+	/**
1030
+	 * @access protected
1031
+	 * @param string $class_name
1032
+	 * @param string $param_class
1033
+	 * @param array  $arguments
1034
+	 * @param mixed  $index
1035
+	 * @return array
1036
+	 */
1037
+	protected function _resolve_dependency($class_name, $param_class, $arguments, $index)
1038
+	{
1039
+		$dependency = null;
1040
+		// should dependency be loaded from cache ?
1041
+		$cache_on = $this->_dependency_map->loading_strategy_for_class_dependency($class_name, $param_class)
1042
+					!== EE_Dependency_Map::load_new_object
1043
+			? true
1044
+			: false;
1045
+		// we might have a dependency...
1046
+		// let's MAYBE try and find it in our cache if that's what's been requested
1047
+		$cached_class = $cache_on ? $this->_get_cached_class($param_class) : null;
1048
+		// and grab it if it exists
1049
+		if ($cached_class instanceof $param_class) {
1050
+			$dependency = $cached_class;
1051
+		} else if ($param_class != $class_name) {
1052
+			// obtain the loader method from the dependency map
1053
+			$loader = $this->_dependency_map->class_loader($param_class);
1054
+			// is loader a custom closure ?
1055
+			if ($loader instanceof Closure) {
1056
+				$dependency = $loader();
1057
+			} else {
1058
+				// set the cache on property for the recursive loading call
1059
+				$this->_cache_on = $cache_on;
1060
+				// if not, then let's try and load it via the registry
1061
+				if (method_exists($this, $loader)) {
1062
+					$dependency = $this->{$loader}($param_class);
1063
+				} else {
1064
+					$dependency = $this->create($param_class, array(), $cache_on);
1065
+				}
1066
+			}
1067
+		}
1068
+		// did we successfully find the correct dependency ?
1069
+		if ($dependency instanceof $param_class) {
1070
+			// then let's inject it into the incoming array of arguments at the correct location
1071
+			if (isset($argument_keys[$index])) {
1072
+				$arguments[$argument_keys[$index]] = $dependency;
1073
+			} else {
1074
+				$arguments[$index] = $dependency;
1075
+			}
1076
+		}
1077
+		return $arguments;
1078
+	}
1079
+
1080
+
1081
+
1082
+	/**
1083
+	 * _set_cached_class
1084
+	 * attempts to cache the instantiated class locally
1085
+	 * in one of the following places, in the following order:
1086
+	 *        $this->{class_abbreviation}   ie:    $this->CART
1087
+	 *        $this->{$class_name}          ie:    $this->Some_Class
1088
+	 *        $this->addon->{$$class_name}    ie:    $this->addon->Some_Addon_Class
1089
+	 *        $this->LIB->{$class_name}     ie:    $this->LIB->Some_Class
1090
+	 *
1091
+	 * @access protected
1092
+	 * @param object $class_obj
1093
+	 * @param string $class_name
1094
+	 * @param string $class_prefix
1095
+	 * @param bool   $from_db
1096
+	 * @return void
1097
+	 */
1098
+	protected function _set_cached_class($class_obj, $class_name, $class_prefix = '', $from_db = false)
1099
+	{
1100
+		if (empty($class_obj)) {
1101
+			return;
1102
+		}
1103
+		// return newly instantiated class
1104
+		if (isset($this->_class_abbreviations[$class_name])) {
1105
+			$class_abbreviation = $this->_class_abbreviations[$class_name];
1106
+			$this->{$class_abbreviation} = $class_obj;
1107
+		} else if (property_exists($this, $class_name)) {
1108
+			$this->{$class_name} = $class_obj;
1109
+		} else if ($class_prefix == 'addon') {
1110
+			$this->addons->{$class_name} = $class_obj;
1111
+		} else if ( ! $from_db) {
1112
+			$this->LIB->{$class_name} = $class_obj;
1113
+		}
1114
+	}
1115
+
1116
+
1117
+
1118
+	/**
1119
+	 * call any loader that's been registered in the EE_Dependency_Map::$_class_loaders array
1120
+	 *
1121
+	 * @param string $classname PLEASE NOTE: the class name needs to match what's registered
1122
+	 *                          in the EE_Dependency_Map::$_class_loaders array,
1123
+	 *                          including the class prefix, ie: "EE_", "EEM_", "EEH_", etc
1124
+	 * @param array  $arguments
1125
+	 * @return object
1126
+	 */
1127
+	public static function factory($classname, $arguments = array())
1128
+	{
1129
+		$loader = self::instance()->_dependency_map->class_loader($classname);
1130
+		if ($loader instanceof Closure) {
1131
+			return $loader($arguments);
1132
+		} else if (method_exists(EE_Registry::instance(), $loader)) {
1133
+			return EE_Registry::instance()->{$loader}($classname, $arguments);
1134
+		}
1135
+		return null;
1136
+	}
1137
+
1138
+
1139
+
1140
+	/**
1141
+	 * Gets the addon by its name/slug (not classname. For that, just
1142
+	 * use the classname as the property name on EE_Config::instance()->addons)
1143
+	 *
1144
+	 * @param string $name
1145
+	 * @return EE_Addon
1146
+	 */
1147
+	public function get_addon_by_name($name)
1148
+	{
1149
+		foreach ($this->addons as $addon) {
1150
+			if ($addon->name() == $name) {
1151
+				return $addon;
1152
+			}
1153
+		}
1154
+		return null;
1155
+	}
1156
+
1157
+
1158
+
1159
+	/**
1160
+	 * Gets an array of all the registered addons, where the keys are their names. (ie, what each returns for their name() function) They're already available on EE_Config::instance()->addons as properties, where each property's name is
1161
+	 * the addon's classname. So if you just want to get the addon by classname, use EE_Config::instance()->addons->{classname}
1162
+	 *
1163
+	 * @return EE_Addon[] where the KEYS are the addon's name()
1164
+	 */
1165
+	public function get_addons_by_name()
1166
+	{
1167
+		$addons = array();
1168
+		foreach ($this->addons as $addon) {
1169
+			$addons[$addon->name()] = $addon;
1170
+		}
1171
+		return $addons;
1172
+	}
1173
+
1174
+
1175
+
1176
+	/**
1177
+	 * Resets the specified model's instance AND makes sure EE_Registry doesn't keep
1178
+	 * a stale copy of it around
1179
+	 *
1180
+	 * @param string $model_name
1181
+	 * @return \EEM_Base
1182
+	 * @throws \EE_Error
1183
+	 */
1184
+	public function reset_model($model_name)
1185
+	{
1186
+		$model_class_name = strpos($model_name, 'EEM_') !== 0 ? "EEM_{$model_name}" : $model_name;
1187
+		if ( ! isset($this->LIB->{$model_class_name}) || ! $this->LIB->{$model_class_name} instanceof EEM_Base) {
1188
+			return null;
1189
+		}
1190
+		//get that model reset it and make sure we nuke the old reference to it
1191
+		if ($this->LIB->{$model_class_name} instanceof $model_class_name && is_callable(array($model_class_name, 'reset'))) {
1192
+			$this->LIB->{$model_class_name} = $this->LIB->{$model_class_name}->reset();
1193
+		} else {
1194
+			throw new EE_Error(sprintf(__('Model %s does not have a method "reset"', 'event_espresso'), $model_name));
1195
+		}
1196
+		return $this->LIB->{$model_class_name};
1197
+	}
1198
+
1199
+
1200
+
1201
+	/**
1202
+	 * Resets the registry.
1203
+	 * The criteria for what gets reset is based on what can be shared between sites on the same request when switch_to_blog
1204
+	 * is used in a multisite install.  Here is a list of things that are NOT reset.
1205
+	 * - $_dependency_map
1206
+	 * - $_class_abbreviations
1207
+	 * - $NET_CFG (EE_Network_Config): The config is shared network wide so no need to reset.
1208
+	 * - $REQ:  Still on the same request so no need to change.
1209
+	 * - $CAP: There is no site specific state in the EE_Capability class.
1210
+	 * - $SSN: Although ideally, the session should not be shared between site switches, we can't reset it because only one Session
1211
+	 *         can be active in a single request.  Resetting could resolve in "headers already sent" errors.
1212
+	 * - $addons:  In multisite, the state of the addons is something controlled via hooks etc in a normal request.  So
1213
+	 *             for now, we won't reset the addons because it could break calls to an add-ons class/methods in the
1214
+	 *             switch or on the restore.
1215
+	 * - $modules
1216
+	 * - $shortcodes
1217
+	 * - $widgets
1218
+	 *
1219
+	 * @param boolean $hard             whether to reset data in the database too, or just refresh
1220
+	 *                                  the Registry to its state at the beginning of the request
1221
+	 * @param boolean $reinstantiate    whether to create new instances of EE_Registry's singletons too,
1222
+	 *                                  or just reset without re-instantiating (handy to set to FALSE if you're not sure if you CAN
1223
+	 *                                  currently reinstantiate the singletons at the moment)
1224
+	 * @param   bool  $reset_models     Defaults to true.  When false, then the models are not reset.  This is so client
1225
+	 *                                  code instead can just change the model context to a different blog id if necessary
1226
+	 * @return EE_Registry
1227
+	 */
1228
+	public static function reset($hard = false, $reinstantiate = true, $reset_models = true)
1229
+	{
1230
+		$instance = self::instance();
1231
+		EEH_Activation::reset();
1232
+		//properties that get reset
1233
+		$instance->_cache_on = true;
1234
+		$instance->CFG = EE_Config::reset($hard, $reinstantiate);
1235
+		$instance->CART = null;
1236
+		$instance->MRM = null;
1237
+		$instance->AssetsRegistry = null;
1238
+		$instance->AssetsRegistry = $instance->create('EventEspresso\core\services\assets\Registry');
1239
+		//messages reset
1240
+		EED_Messages::reset();
1241
+		if ($reset_models) {
1242
+			foreach (array_keys($instance->non_abstract_db_models) as $model_name) {
1243
+				$instance->reset_model($model_name);
1244
+			}
1245
+		}
1246
+		$instance->LIB = new stdClass();
1247
+		return $instance;
1248
+	}
1249
+
1250
+
1251
+
1252
+	/**
1253
+	 * @override magic methods
1254
+	 * @return void
1255
+	 */
1256
+	public final function __destruct()
1257
+	{
1258
+	}
1259
+
1260
+
1261
+
1262
+	/**
1263
+	 * @param $a
1264
+	 * @param $b
1265
+	 */
1266
+	public final function __call($a, $b)
1267
+	{
1268
+	}
1269
+
1270
+
1271
+
1272
+	/**
1273
+	 * @param $a
1274
+	 */
1275
+	public final function __get($a)
1276
+	{
1277
+	}
1278
+
1279
+
1280
+
1281
+	/**
1282
+	 * @param $a
1283
+	 * @param $b
1284
+	 */
1285
+	public final function __set($a, $b)
1286
+	{
1287
+	}
1288
+
1289
+
1290
+
1291
+	/**
1292
+	 * @param $a
1293
+	 */
1294
+	public final function __isset($a)
1295
+	{
1296
+	}
1297 1297
 
1298 1298
 
1299 1299
 
1300
-    /**
1301
-     * @param $a
1302
-     */
1303
-    public final function __unset($a)
1304
-    {
1305
-    }
1300
+	/**
1301
+	 * @param $a
1302
+	 */
1303
+	public final function __unset($a)
1304
+	{
1305
+	}
1306 1306
 
1307 1307
 
1308 1308
 
1309
-    /**
1310
-     * @return array
1311
-     */
1312
-    public final function __sleep()
1313
-    {
1314
-        return array();
1315
-    }
1309
+	/**
1310
+	 * @return array
1311
+	 */
1312
+	public final function __sleep()
1313
+	{
1314
+		return array();
1315
+	}
1316 1316
 
1317 1317
 
1318 1318
 
1319
-    public final function __wakeup()
1320
-    {
1321
-    }
1319
+	public final function __wakeup()
1320
+	{
1321
+	}
1322 1322
 
1323 1323
 
1324 1324
 
1325
-    /**
1326
-     * @return string
1327
-     */
1328
-    public final function __toString()
1329
-    {
1330
-        return '';
1331
-    }
1325
+	/**
1326
+	 * @return string
1327
+	 */
1328
+	public final function __toString()
1329
+	{
1330
+		return '';
1331
+	}
1332 1332
 
1333 1333
 
1334 1334
 
1335
-    public final function __invoke()
1336
-    {
1337
-    }
1335
+	public final function __invoke()
1336
+	{
1337
+	}
1338 1338
 
1339 1339
 
1340 1340
 
1341
-    public final static function __set_state($array = array())
1342
-    {
1343
-        return EE_Registry::instance();
1344
-    }
1341
+	public final static function __set_state($array = array())
1342
+	{
1343
+		return EE_Registry::instance();
1344
+	}
1345 1345
 
1346 1346
 
1347 1347
 
1348
-    public final function __clone()
1349
-    {
1350
-    }
1348
+	public final function __clone()
1349
+	{
1350
+	}
1351 1351
 
1352 1352
 
1353 1353
 
1354
-    /**
1355
-     * @param $a
1356
-     * @param $b
1357
-     */
1358
-    public final static function __callStatic($a, $b)
1359
-    {
1360
-    }
1354
+	/**
1355
+	 * @param $a
1356
+	 * @param $b
1357
+	 */
1358
+	public final static function __callStatic($a, $b)
1359
+	{
1360
+	}
1361 1361
 
1362 1362
 
1363 1363
 
1364
-    /**
1365
-     * Gets all the custom post type models defined
1366
-     *
1367
-     * @return array keys are model "short names" (Eg "Event") and keys are classnames (eg "EEM_Event")
1368
-     */
1369
-    public function cpt_models()
1370
-    {
1371
-        $cpt_models = array();
1372
-        foreach ($this->non_abstract_db_models as $short_name => $classname) {
1373
-            if (is_subclass_of($classname, 'EEM_CPT_Base')) {
1374
-                $cpt_models[$short_name] = $classname;
1375
-            }
1376
-        }
1377
-        return $cpt_models;
1378
-    }
1364
+	/**
1365
+	 * Gets all the custom post type models defined
1366
+	 *
1367
+	 * @return array keys are model "short names" (Eg "Event") and keys are classnames (eg "EEM_Event")
1368
+	 */
1369
+	public function cpt_models()
1370
+	{
1371
+		$cpt_models = array();
1372
+		foreach ($this->non_abstract_db_models as $short_name => $classname) {
1373
+			if (is_subclass_of($classname, 'EEM_CPT_Base')) {
1374
+				$cpt_models[$short_name] = $classname;
1375
+			}
1376
+		}
1377
+		return $cpt_models;
1378
+	}
1379 1379
 
1380 1380
 
1381 1381
 
1382
-    /**
1383
-     * @return \EE_Config
1384
-     */
1385
-    public static function CFG()
1386
-    {
1387
-        return self::instance()->CFG;
1388
-    }
1382
+	/**
1383
+	 * @return \EE_Config
1384
+	 */
1385
+	public static function CFG()
1386
+	{
1387
+		return self::instance()->CFG;
1388
+	}
1389 1389
 
1390 1390
 
1391 1391
 }
Please login to merge, or discard this patch.
core/EE_Dependency_Map.core.php 2 patches
Indentation   +648 added lines, -648 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
 
@@ -22,653 +22,653 @@  discard block
 block discarded – undo
22 22
 {
23 23
 
24 24
 
25
-    /**
26
-     * This means that the requested class dependency is not present in the dependency map
27
-     */
28
-    const not_registered = 0;
29
-
30
-
31
-    /**
32
-     * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
33
-     */
34
-    const load_new_object = 1;
35
-
36
-    /**
37
-     * This instructs class loaders to return a previously instantiated and cached object for the requested class.
38
-     * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
39
-     */
40
-    const load_from_cache = 2;
41
-
42
-    /**
43
-     * @type EE_Dependency_Map $_instance
44
-     */
45
-    protected static $_instance;
46
-
47
-    /**
48
-     * @type EE_Request $request
49
-     */
50
-    protected $_request;
51
-
52
-    /**
53
-     * @type EE_Response $response
54
-     */
55
-    protected $_response;
56
-
57
-    /**
58
-     * @type LoaderInterface $loader
59
-     */
60
-    protected $loader;
61
-
62
-    /**
63
-     * @type array $_dependency_map
64
-     */
65
-    protected $_dependency_map = array();
66
-
67
-    /**
68
-     * @type array $_class_loaders
69
-     */
70
-    protected $_class_loaders = array();
71
-
72
-    /**
73
-     * @type array $_aliases
74
-     */
75
-    protected $_aliases = array();
76
-
77
-
78
-
79
-    /**
80
-     * EE_Dependency_Map constructor.
81
-     *
82
-     * @param EE_Request  $request
83
-     * @param EE_Response $response
84
-     */
85
-    protected function __construct(EE_Request $request, EE_Response $response)
86
-    {
87
-        $this->_request = $request;
88
-        $this->_response = $response;
89
-        add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
90
-        do_action('EE_Dependency_Map____construct');
91
-    }
92
-
93
-
94
-
95
-    /**
96
-     * @throws InvalidDataTypeException
97
-     * @throws InvalidInterfaceException
98
-     * @throws InvalidArgumentException
99
-     */
100
-    public function initialize()
101
-    {
102
-        $this->_register_core_dependencies();
103
-        $this->_register_core_class_loaders();
104
-        $this->_register_core_aliases();
105
-    }
106
-
107
-
108
-
109
-    /**
110
-     * @singleton method used to instantiate class object
111
-     * @access    public
112
-     * @param EE_Request  $request
113
-     * @param EE_Response $response
114
-     * @return EE_Dependency_Map
115
-     */
116
-    public static function instance(EE_Request $request = null, EE_Response $response = null)
117
-    {
118
-        // check if class object is instantiated, and instantiated properly
119
-        if (! self::$_instance instanceof EE_Dependency_Map) {
120
-            self::$_instance = new EE_Dependency_Map($request, $response);
121
-        }
122
-        return self::$_instance;
123
-    }
124
-
125
-
126
-
127
-    /**
128
-     * @param LoaderInterface $loader
129
-     */
130
-    public function setLoader(LoaderInterface $loader)
131
-    {
132
-        $this->loader = $loader;
133
-    }
134
-
135
-
136
-
137
-    /**
138
-     * @param string $class
139
-     * @param array  $dependencies
140
-     * @return boolean
141
-     */
142
-    public static function register_dependencies($class, $dependencies)
143
-    {
144
-        if (! isset(self::$_instance->_dependency_map[$class])) {
145
-            // we need to make sure that any aliases used when registering a dependency
146
-            // get resolved to the correct class name
147
-            foreach ((array)$dependencies as $dependency => $load_source) {
148
-                $alias = self::$_instance->get_alias($dependency);
149
-                unset($dependencies[$dependency]);
150
-                $dependencies[$alias] = $load_source;
151
-            }
152
-            self::$_instance->_dependency_map[$class] = (array)$dependencies;
153
-            return true;
154
-        }
155
-        return false;
156
-    }
157
-
158
-
159
-
160
-    /**
161
-     * @param string $class_name
162
-     * @param string $loader
163
-     * @return bool
164
-     * @throws EE_Error
165
-     */
166
-    public static function register_class_loader($class_name, $loader = 'load_core')
167
-    {
168
-        // check that loader is callable or method starts with "load_" and exists in EE_Registry
169
-        if (
170
-            ! is_callable($loader)
171
-            && (
172
-                strpos($loader, 'load_') !== 0
173
-                || ! method_exists('EE_Registry', $loader)
174
-            )
175
-        ) {
176
-            throw new EE_Error(
177
-                sprintf(
178
-                    esc_html__('"%1$s" is not a valid loader method on EE_Registry.', 'event_espresso'),
179
-                    $loader
180
-                )
181
-            );
182
-        }
183
-        $class_name = self::$_instance->get_alias($class_name);
184
-        if (! isset(self::$_instance->_class_loaders[$class_name])) {
185
-            self::$_instance->_class_loaders[$class_name] = $loader;
186
-            return true;
187
-        }
188
-        return false;
189
-    }
190
-
191
-
192
-
193
-    /**
194
-     * @return array
195
-     */
196
-    public function dependency_map()
197
-    {
198
-        return $this->_dependency_map;
199
-    }
200
-
201
-
202
-
203
-    /**
204
-     * returns TRUE if dependency map contains a listing for the provided class name
205
-     *
206
-     * @param string $class_name
207
-     * @return boolean
208
-     */
209
-    public function has($class_name = '')
210
-    {
211
-        return isset($this->_dependency_map[$class_name]) ? true : false;
212
-    }
213
-
214
-
215
-
216
-    /**
217
-     * returns TRUE if dependency map contains a listing for the provided class name AND dependency
218
-     *
219
-     * @param string $class_name
220
-     * @param string $dependency
221
-     * @return bool
222
-     */
223
-    public function has_dependency_for_class($class_name = '', $dependency = '')
224
-    {
225
-        $dependency = $this->get_alias($dependency);
226
-        return isset($this->_dependency_map[$class_name], $this->_dependency_map[$class_name][$dependency])
227
-            ? true
228
-            : false;
229
-    }
230
-
231
-
232
-
233
-    /**
234
-     * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
235
-     *
236
-     * @param string $class_name
237
-     * @param string $dependency
238
-     * @return int
239
-     */
240
-    public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
241
-    {
242
-        $dependency = $this->get_alias($dependency);
243
-        return $this->has_dependency_for_class($class_name, $dependency)
244
-            ? $this->_dependency_map[$class_name][$dependency]
245
-            : EE_Dependency_Map::not_registered;
246
-    }
247
-
248
-
249
-
250
-    /**
251
-     * @param string $class_name
252
-     * @return string | Closure
253
-     */
254
-    public function class_loader($class_name)
255
-    {
256
-        $class_name = $this->get_alias($class_name);
257
-        return isset($this->_class_loaders[$class_name]) ? $this->_class_loaders[$class_name] : '';
258
-    }
259
-
260
-
261
-
262
-    /**
263
-     * @return array
264
-     */
265
-    public function class_loaders()
266
-    {
267
-        return $this->_class_loaders;
268
-    }
269
-
270
-
271
-
272
-    /**
273
-     * adds an alias for a classname
274
-     *
275
-     * @param string $class_name the class name that should be used (concrete class to replace interface)
276
-     * @param string $alias      the class name that would be type hinted for (abstract parent or interface)
277
-     * @param string $for_class  the class that has the dependency (is type hinting for the interface)
278
-     */
279
-    public function add_alias($class_name, $alias, $for_class = '')
280
-    {
281
-        if ($for_class !== '') {
282
-            if (! isset($this->_aliases[$for_class])) {
283
-                $this->_aliases[$for_class] = array();
284
-            }
285
-            $this->_aliases[$for_class][$class_name] = $alias;
286
-        }
287
-        $this->_aliases[$class_name] = $alias;
288
-    }
289
-
290
-
291
-
292
-    /**
293
-     * returns TRUE if the provided class name has an alias
294
-     *
295
-     * @param string $class_name
296
-     * @param string $for_class
297
-     * @return bool
298
-     */
299
-    public function has_alias($class_name = '', $for_class = '')
300
-    {
301
-        return isset($this->_aliases[$for_class], $this->_aliases[$for_class][$class_name])
302
-               || (
303
-                   isset($this->_aliases[$class_name])
304
-                   && ! is_array($this->_aliases[$class_name])
305
-               );
306
-    }
307
-
308
-
309
-
310
-    /**
311
-     * returns alias for class name if one exists, otherwise returns the original classname
312
-     * functions recursively, so that multiple aliases can be used to drill down to a classname
313
-     *  for example:
314
-     *      if the following two entries were added to the _aliases array:
315
-     *          array(
316
-     *              'interface_alias'           => 'some\namespace\interface'
317
-     *              'some\namespace\interface'  => 'some\namespace\classname'
318
-     *          )
319
-     *      then one could use EE_Registry::instance()->create( 'interface_alias' )
320
-     *      to load an instance of 'some\namespace\classname'
321
-     *
322
-     * @param string $class_name
323
-     * @param string $for_class
324
-     * @return string
325
-     */
326
-    public function get_alias($class_name = '', $for_class = '')
327
-    {
328
-        if (! $this->has_alias($class_name, $for_class)) {
329
-            return $class_name;
330
-        }
331
-        if ($for_class !== '') {
332
-            return $this->get_alias($this->_aliases[$for_class][$class_name], $for_class);
333
-        }
334
-        return $this->get_alias($this->_aliases[$class_name]);
335
-    }
336
-
337
-
338
-
339
-    /**
340
-     * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
341
-     * if one exists, or whether a new object should be generated every time the requested class is loaded.
342
-     * This is done by using the following class constants:
343
-     *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
344
-     *        EE_Dependency_Map::load_new_object - generates a new object every time
345
-     */
346
-    protected function _register_core_dependencies()
347
-    {
348
-        $this->_dependency_map = array(
349
-            'EE_Request_Handler'                                                                                          => array(
350
-                'EE_Request' => EE_Dependency_Map::load_from_cache,
351
-            ),
352
-            'EE_System'                                                                                                   => array(
353
-                'EE_Registry' => EE_Dependency_Map::load_from_cache,
354
-            ),
355
-            'EE_Session'                                                                                                  => array(
356
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
357
-                'EE_Encryption'                                           => EE_Dependency_Map::load_from_cache,
358
-            ),
359
-            'EE_Cart'                                                                                                     => array(
360
-                'EE_Session' => EE_Dependency_Map::load_from_cache,
361
-            ),
362
-            'EE_Front_Controller'                                                                                         => array(
363
-                'EE_Registry'              => EE_Dependency_Map::load_from_cache,
364
-                'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
365
-                'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
366
-            ),
367
-            'EE_Messenger_Collection_Loader'                                                                              => array(
368
-                'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
369
-            ),
370
-            'EE_Message_Type_Collection_Loader'                                                                           => array(
371
-                'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
372
-            ),
373
-            'EE_Message_Resource_Manager'                                                                                 => array(
374
-                'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
375
-                'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
376
-                'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
377
-            ),
378
-            'EE_Message_Factory'                                                                                          => array(
379
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
380
-            ),
381
-            'EE_messages'                                                                                                 => array(
382
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
383
-            ),
384
-            'EE_Messages_Generator'                                                                                       => array(
385
-                'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
386
-                'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
387
-                'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
388
-                'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
389
-            ),
390
-            'EE_Messages_Processor'                                                                                       => array(
391
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
392
-            ),
393
-            'EE_Messages_Queue'                                                                                           => array(
394
-                'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
395
-            ),
396
-            'EE_Messages_Template_Defaults'                                                                               => array(
397
-                'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
398
-                'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
399
-            ),
400
-            'EE_Message_To_Generate_From_Request'                                                                         => array(
401
-                'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
402
-                'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
403
-            ),
404
-            'EventEspresso\core\services\commands\CommandBus'                                                             => array(
405
-                'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
406
-            ),
407
-            'EventEspresso\services\commands\CommandHandler'                                                              => array(
408
-                'EE_Registry'         => EE_Dependency_Map::load_from_cache,
409
-                'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
410
-            ),
411
-            'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
412
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
413
-            ),
414
-            'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
415
-                'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
416
-                'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
417
-            ),
418
-            'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
419
-                'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
420
-            ),
421
-            'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
422
-                'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
423
-            ),
424
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
425
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
426
-            ),
427
-            'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
428
-                'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
429
-            ),
430
-            'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
431
-                'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
432
-            ),
433
-            'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
434
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
435
-            ),
436
-            'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
437
-                'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
438
-            ),
439
-            'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
440
-                'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
441
-            ),
442
-            'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
443
-                'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
444
-            ),
445
-            'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
446
-                'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
447
-            ),
448
-            'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
449
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
450
-            ),
451
-            'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
452
-                'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
453
-            ),
454
-            'EventEspresso\core\services\database\TableManager'                                                           => array(
455
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
456
-            ),
457
-            'EE_Data_Migration_Class_Base'                                                                                => array(
458
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
459
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
460
-            ),
461
-            'EE_DMS_Core_4_1_0'                                                                                           => array(
462
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
463
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
464
-            ),
465
-            'EE_DMS_Core_4_2_0'                                                                                           => array(
466
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
467
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
468
-            ),
469
-            'EE_DMS_Core_4_3_0'                                                                                           => array(
470
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
471
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
472
-            ),
473
-            'EE_DMS_Core_4_4_0'                                                                                           => array(
474
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
475
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
476
-            ),
477
-            'EE_DMS_Core_4_5_0'                                                                                           => array(
478
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
479
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
480
-            ),
481
-            'EE_DMS_Core_4_6_0'                                                                                           => array(
482
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
483
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
484
-            ),
485
-            'EE_DMS_Core_4_7_0'                                                                                           => array(
486
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
487
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
488
-            ),
489
-            'EE_DMS_Core_4_8_0'                                                                                           => array(
490
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
491
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
492
-            ),
493
-            'EE_DMS_Core_4_9_0'                                                                                           => array(
494
-                'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
495
-                'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
496
-            ),
497
-            'EventEspresso\core\services\assets\Registry'                                                                 => array(
498
-                'EE_Template_Config' => EE_Dependency_Map::load_from_cache,
499
-                'EE_Currency_Config' => EE_Dependency_Map::load_from_cache,
500
-            ),
501
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
502
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
503
-            ),
504
-            'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
505
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
506
-            ),
507
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
508
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
509
-            ),
510
-            'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
511
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
512
-            ),
513
-            'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
514
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
515
-            ),
516
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
517
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
518
-            ),
519
-            'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
520
-                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
521
-            ),
522
-            'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
523
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
524
-            ),
525
-            'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
526
-                'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
527
-            ),
528
-        );
529
-    }
530
-
531
-
532
-
533
-    /**
534
-     * Registers how core classes are loaded.
535
-     * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
536
-     *        'EE_Request_Handler' => 'load_core'
537
-     *        'EE_Messages_Queue'  => 'load_lib'
538
-     *        'EEH_Debug_Tools'    => 'load_helper'
539
-     * or, if greater control is required, by providing a custom closure. For example:
540
-     *        'Some_Class' => function () {
541
-     *            return new Some_Class();
542
-     *        },
543
-     * This is required for instantiating dependencies
544
-     * where an interface has been type hinted in a class constructor. For example:
545
-     *        'Required_Interface' => function () {
546
-     *            return new A_Class_That_Implements_Required_Interface();
547
-     *        },
548
-     */
549
-    protected function _register_core_class_loaders()
550
-    {
551
-        //for PHP5.3 compat, we need to register any properties called here in a variable because `$this` cannot
552
-        //be used in a closure.
553
-        $request = &$this->_request;
554
-        $response = &$this->_response;
555
-        $loader = &$this->loader;
556
-        $this->_class_loaders = array(
557
-            //load_core
558
-            'EE_Capabilities'                      => 'load_core',
559
-            'EE_Encryption'                        => 'load_core',
560
-            'EE_Front_Controller'                  => 'load_core',
561
-            'EE_Module_Request_Router'             => 'load_core',
562
-            'EE_Registry'                          => 'load_core',
563
-            'EE_Request'                           => function () use (&$request) {
564
-                return $request;
565
-            },
566
-            'EE_Response'                          => function () use (&$response) {
567
-                return $response;
568
-            },
569
-            'EE_Request_Handler'                   => 'load_core',
570
-            'EE_Session'                           => 'load_core',
571
-            'EE_System'                            => 'load_core',
572
-            //load_lib
573
-            'EE_Message_Resource_Manager'          => 'load_lib',
574
-            'EE_Message_Type_Collection'           => 'load_lib',
575
-            'EE_Message_Type_Collection_Loader'    => 'load_lib',
576
-            'EE_Messenger_Collection'              => 'load_lib',
577
-            'EE_Messenger_Collection_Loader'       => 'load_lib',
578
-            'EE_Messages_Processor'                => 'load_lib',
579
-            'EE_Message_Repository'                => 'load_lib',
580
-            'EE_Messages_Queue'                    => 'load_lib',
581
-            'EE_Messages_Data_Handler_Collection'  => 'load_lib',
582
-            'EE_Message_Template_Group_Collection' => 'load_lib',
583
-            'EE_Messages_Generator'                => function () {
584
-                return EE_Registry::instance()->load_lib(
585
-                    'Messages_Generator',
586
-                    array(),
587
-                    false,
588
-                    false
589
-                );
590
-            },
591
-            'EE_Messages_Template_Defaults'        => function ($arguments = array()) {
592
-                return EE_Registry::instance()->load_lib(
593
-                    'Messages_Template_Defaults',
594
-                    $arguments,
595
-                    false,
596
-                    false
597
-                );
598
-            },
599
-            //load_model
600
-            'EEM_Message_Template_Group'           => 'load_model',
601
-            'EEM_Message_Template'                 => 'load_model',
602
-            //load_helper
603
-            'EEH_Parse_Shortcodes'                 => function () {
604
-                if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
605
-                    return new EEH_Parse_Shortcodes();
606
-                }
607
-                return null;
608
-            },
609
-            'EE_Template_Config'                   => function () {
610
-                return EE_Config::instance()->template_settings;
611
-            },
612
-            'EE_Currency_Config'                   => function () {
613
-                return EE_Config::instance()->currency;
614
-            },
615
-            'EventEspresso\core\services\loaders\Loader' => function () use (&$loader) {
616
-                return $loader;
617
-            },
618
-        );
619
-    }
620
-
621
-
622
-
623
-    /**
624
-     * can be used for supplying alternate names for classes,
625
-     * or for connecting interface names to instantiable classes
626
-     */
627
-    protected function _register_core_aliases()
628
-    {
629
-        $this->_aliases = array(
630
-            'CommandBusInterface'                                                 => 'EventEspresso\core\services\commands\CommandBusInterface',
631
-            'EventEspresso\core\services\commands\CommandBusInterface'            => 'EventEspresso\core\services\commands\CommandBus',
632
-            'CommandHandlerManagerInterface'                                      => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
633
-            'EventEspresso\core\services\commands\CommandHandlerManagerInterface' => 'EventEspresso\core\services\commands\CommandHandlerManager',
634
-            'CapChecker'                                                          => 'EventEspresso\core\services\commands\middleware\CapChecker',
635
-            'AddActionHook'                                                       => 'EventEspresso\core\services\commands\middleware\AddActionHook',
636
-            'CapabilitiesChecker'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
637
-            'CapabilitiesCheckerInterface'                                        => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
638
-            'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
639
-            'CreateRegistrationService'                                           => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
640
-            'CreateRegCodeCommandHandler'                                         => 'EventEspresso\core\services\commands\registration\CreateRegCodeCommand',
641
-            'CreateRegUrlLinkCommandHandler'                                      => 'EventEspresso\core\services\commands\registration\CreateRegUrlLinkCommand',
642
-            'CreateRegistrationCommandHandler'                                    => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
643
-            'CopyRegistrationDetailsCommandHandler'                               => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
644
-            'CopyRegistrationPaymentsCommandHandler'                              => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
645
-            'CancelRegistrationAndTicketLineItemCommandHandler'                   => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
646
-            'UpdateRegistrationAndTransactionAfterChangeCommandHandler'           => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
647
-            'CreateTicketLineItemCommandHandler'                                  => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
648
-            'TableManager'                                                        => 'EventEspresso\core\services\database\TableManager',
649
-            'TableAnalysis'                                                       => 'EventEspresso\core\services\database\TableAnalysis',
650
-            'EspressoShortcode'                                                   => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
651
-            'ShortcodeInterface'                                                  => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
652
-            'EventEspresso\core\services\shortcodes\ShortcodeInterface'           => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
653
-            'EventEspresso\core\services\cache\CacheStorageInterface'             => 'EventEspresso\core\services\cache\TransientCacheStorage',
654
-            'LoaderInterface'                                                     => 'EventEspresso\core\services\loaders\LoaderInterface',
655
-            'EventEspresso\core\services\loaders\LoaderInterface'                 => 'EventEspresso\core\services\loaders\Loader',
656
-            'CommandFactoryInterface'                                             => 'EventEspresso\core\services\commands\CommandFactoryInterface',
657
-            'EventEspresso\core\services\commands\CommandFactoryInterface'        => 'EventEspresso\core\services\commands\CommandFactory',
658
-        );
659
-    }
660
-
661
-
662
-
663
-    /**
664
-     * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
665
-     * request Primarily used by unit tests.
666
-     */
667
-    public function reset()
668
-    {
669
-        $this->_register_core_class_loaders();
670
-        $this->_register_core_dependencies();
671
-    }
25
+	/**
26
+	 * This means that the requested class dependency is not present in the dependency map
27
+	 */
28
+	const not_registered = 0;
29
+
30
+
31
+	/**
32
+	 * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class.
33
+	 */
34
+	const load_new_object = 1;
35
+
36
+	/**
37
+	 * This instructs class loaders to return a previously instantiated and cached object for the requested class.
38
+	 * IF a previously instantiated object does not exist, a new one will be created and added to the cache.
39
+	 */
40
+	const load_from_cache = 2;
41
+
42
+	/**
43
+	 * @type EE_Dependency_Map $_instance
44
+	 */
45
+	protected static $_instance;
46
+
47
+	/**
48
+	 * @type EE_Request $request
49
+	 */
50
+	protected $_request;
51
+
52
+	/**
53
+	 * @type EE_Response $response
54
+	 */
55
+	protected $_response;
56
+
57
+	/**
58
+	 * @type LoaderInterface $loader
59
+	 */
60
+	protected $loader;
61
+
62
+	/**
63
+	 * @type array $_dependency_map
64
+	 */
65
+	protected $_dependency_map = array();
66
+
67
+	/**
68
+	 * @type array $_class_loaders
69
+	 */
70
+	protected $_class_loaders = array();
71
+
72
+	/**
73
+	 * @type array $_aliases
74
+	 */
75
+	protected $_aliases = array();
76
+
77
+
78
+
79
+	/**
80
+	 * EE_Dependency_Map constructor.
81
+	 *
82
+	 * @param EE_Request  $request
83
+	 * @param EE_Response $response
84
+	 */
85
+	protected function __construct(EE_Request $request, EE_Response $response)
86
+	{
87
+		$this->_request = $request;
88
+		$this->_response = $response;
89
+		add_action('EE_Load_Espresso_Core__handle_request__initialize_core_loading', array($this, 'initialize'));
90
+		do_action('EE_Dependency_Map____construct');
91
+	}
92
+
93
+
94
+
95
+	/**
96
+	 * @throws InvalidDataTypeException
97
+	 * @throws InvalidInterfaceException
98
+	 * @throws InvalidArgumentException
99
+	 */
100
+	public function initialize()
101
+	{
102
+		$this->_register_core_dependencies();
103
+		$this->_register_core_class_loaders();
104
+		$this->_register_core_aliases();
105
+	}
106
+
107
+
108
+
109
+	/**
110
+	 * @singleton method used to instantiate class object
111
+	 * @access    public
112
+	 * @param EE_Request  $request
113
+	 * @param EE_Response $response
114
+	 * @return EE_Dependency_Map
115
+	 */
116
+	public static function instance(EE_Request $request = null, EE_Response $response = null)
117
+	{
118
+		// check if class object is instantiated, and instantiated properly
119
+		if (! self::$_instance instanceof EE_Dependency_Map) {
120
+			self::$_instance = new EE_Dependency_Map($request, $response);
121
+		}
122
+		return self::$_instance;
123
+	}
124
+
125
+
126
+
127
+	/**
128
+	 * @param LoaderInterface $loader
129
+	 */
130
+	public function setLoader(LoaderInterface $loader)
131
+	{
132
+		$this->loader = $loader;
133
+	}
134
+
135
+
136
+
137
+	/**
138
+	 * @param string $class
139
+	 * @param array  $dependencies
140
+	 * @return boolean
141
+	 */
142
+	public static function register_dependencies($class, $dependencies)
143
+	{
144
+		if (! isset(self::$_instance->_dependency_map[$class])) {
145
+			// we need to make sure that any aliases used when registering a dependency
146
+			// get resolved to the correct class name
147
+			foreach ((array)$dependencies as $dependency => $load_source) {
148
+				$alias = self::$_instance->get_alias($dependency);
149
+				unset($dependencies[$dependency]);
150
+				$dependencies[$alias] = $load_source;
151
+			}
152
+			self::$_instance->_dependency_map[$class] = (array)$dependencies;
153
+			return true;
154
+		}
155
+		return false;
156
+	}
157
+
158
+
159
+
160
+	/**
161
+	 * @param string $class_name
162
+	 * @param string $loader
163
+	 * @return bool
164
+	 * @throws EE_Error
165
+	 */
166
+	public static function register_class_loader($class_name, $loader = 'load_core')
167
+	{
168
+		// check that loader is callable or method starts with "load_" and exists in EE_Registry
169
+		if (
170
+			! is_callable($loader)
171
+			&& (
172
+				strpos($loader, 'load_') !== 0
173
+				|| ! method_exists('EE_Registry', $loader)
174
+			)
175
+		) {
176
+			throw new EE_Error(
177
+				sprintf(
178
+					esc_html__('"%1$s" is not a valid loader method on EE_Registry.', 'event_espresso'),
179
+					$loader
180
+				)
181
+			);
182
+		}
183
+		$class_name = self::$_instance->get_alias($class_name);
184
+		if (! isset(self::$_instance->_class_loaders[$class_name])) {
185
+			self::$_instance->_class_loaders[$class_name] = $loader;
186
+			return true;
187
+		}
188
+		return false;
189
+	}
190
+
191
+
192
+
193
+	/**
194
+	 * @return array
195
+	 */
196
+	public function dependency_map()
197
+	{
198
+		return $this->_dependency_map;
199
+	}
200
+
201
+
202
+
203
+	/**
204
+	 * returns TRUE if dependency map contains a listing for the provided class name
205
+	 *
206
+	 * @param string $class_name
207
+	 * @return boolean
208
+	 */
209
+	public function has($class_name = '')
210
+	{
211
+		return isset($this->_dependency_map[$class_name]) ? true : false;
212
+	}
213
+
214
+
215
+
216
+	/**
217
+	 * returns TRUE if dependency map contains a listing for the provided class name AND dependency
218
+	 *
219
+	 * @param string $class_name
220
+	 * @param string $dependency
221
+	 * @return bool
222
+	 */
223
+	public function has_dependency_for_class($class_name = '', $dependency = '')
224
+	{
225
+		$dependency = $this->get_alias($dependency);
226
+		return isset($this->_dependency_map[$class_name], $this->_dependency_map[$class_name][$dependency])
227
+			? true
228
+			: false;
229
+	}
230
+
231
+
232
+
233
+	/**
234
+	 * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned
235
+	 *
236
+	 * @param string $class_name
237
+	 * @param string $dependency
238
+	 * @return int
239
+	 */
240
+	public function loading_strategy_for_class_dependency($class_name = '', $dependency = '')
241
+	{
242
+		$dependency = $this->get_alias($dependency);
243
+		return $this->has_dependency_for_class($class_name, $dependency)
244
+			? $this->_dependency_map[$class_name][$dependency]
245
+			: EE_Dependency_Map::not_registered;
246
+	}
247
+
248
+
249
+
250
+	/**
251
+	 * @param string $class_name
252
+	 * @return string | Closure
253
+	 */
254
+	public function class_loader($class_name)
255
+	{
256
+		$class_name = $this->get_alias($class_name);
257
+		return isset($this->_class_loaders[$class_name]) ? $this->_class_loaders[$class_name] : '';
258
+	}
259
+
260
+
261
+
262
+	/**
263
+	 * @return array
264
+	 */
265
+	public function class_loaders()
266
+	{
267
+		return $this->_class_loaders;
268
+	}
269
+
270
+
271
+
272
+	/**
273
+	 * adds an alias for a classname
274
+	 *
275
+	 * @param string $class_name the class name that should be used (concrete class to replace interface)
276
+	 * @param string $alias      the class name that would be type hinted for (abstract parent or interface)
277
+	 * @param string $for_class  the class that has the dependency (is type hinting for the interface)
278
+	 */
279
+	public function add_alias($class_name, $alias, $for_class = '')
280
+	{
281
+		if ($for_class !== '') {
282
+			if (! isset($this->_aliases[$for_class])) {
283
+				$this->_aliases[$for_class] = array();
284
+			}
285
+			$this->_aliases[$for_class][$class_name] = $alias;
286
+		}
287
+		$this->_aliases[$class_name] = $alias;
288
+	}
289
+
290
+
291
+
292
+	/**
293
+	 * returns TRUE if the provided class name has an alias
294
+	 *
295
+	 * @param string $class_name
296
+	 * @param string $for_class
297
+	 * @return bool
298
+	 */
299
+	public function has_alias($class_name = '', $for_class = '')
300
+	{
301
+		return isset($this->_aliases[$for_class], $this->_aliases[$for_class][$class_name])
302
+			   || (
303
+				   isset($this->_aliases[$class_name])
304
+				   && ! is_array($this->_aliases[$class_name])
305
+			   );
306
+	}
307
+
308
+
309
+
310
+	/**
311
+	 * returns alias for class name if one exists, otherwise returns the original classname
312
+	 * functions recursively, so that multiple aliases can be used to drill down to a classname
313
+	 *  for example:
314
+	 *      if the following two entries were added to the _aliases array:
315
+	 *          array(
316
+	 *              'interface_alias'           => 'some\namespace\interface'
317
+	 *              'some\namespace\interface'  => 'some\namespace\classname'
318
+	 *          )
319
+	 *      then one could use EE_Registry::instance()->create( 'interface_alias' )
320
+	 *      to load an instance of 'some\namespace\classname'
321
+	 *
322
+	 * @param string $class_name
323
+	 * @param string $for_class
324
+	 * @return string
325
+	 */
326
+	public function get_alias($class_name = '', $for_class = '')
327
+	{
328
+		if (! $this->has_alias($class_name, $for_class)) {
329
+			return $class_name;
330
+		}
331
+		if ($for_class !== '') {
332
+			return $this->get_alias($this->_aliases[$for_class][$class_name], $for_class);
333
+		}
334
+		return $this->get_alias($this->_aliases[$class_name]);
335
+	}
336
+
337
+
338
+
339
+	/**
340
+	 * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache,
341
+	 * if one exists, or whether a new object should be generated every time the requested class is loaded.
342
+	 * This is done by using the following class constants:
343
+	 *        EE_Dependency_Map::load_from_cache - loads previously instantiated object
344
+	 *        EE_Dependency_Map::load_new_object - generates a new object every time
345
+	 */
346
+	protected function _register_core_dependencies()
347
+	{
348
+		$this->_dependency_map = array(
349
+			'EE_Request_Handler'                                                                                          => array(
350
+				'EE_Request' => EE_Dependency_Map::load_from_cache,
351
+			),
352
+			'EE_System'                                                                                                   => array(
353
+				'EE_Registry' => EE_Dependency_Map::load_from_cache,
354
+			),
355
+			'EE_Session'                                                                                                  => array(
356
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
357
+				'EE_Encryption'                                           => EE_Dependency_Map::load_from_cache,
358
+			),
359
+			'EE_Cart'                                                                                                     => array(
360
+				'EE_Session' => EE_Dependency_Map::load_from_cache,
361
+			),
362
+			'EE_Front_Controller'                                                                                         => array(
363
+				'EE_Registry'              => EE_Dependency_Map::load_from_cache,
364
+				'EE_Request_Handler'       => EE_Dependency_Map::load_from_cache,
365
+				'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache,
366
+			),
367
+			'EE_Messenger_Collection_Loader'                                                                              => array(
368
+				'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object,
369
+			),
370
+			'EE_Message_Type_Collection_Loader'                                                                           => array(
371
+				'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object,
372
+			),
373
+			'EE_Message_Resource_Manager'                                                                                 => array(
374
+				'EE_Messenger_Collection_Loader'    => EE_Dependency_Map::load_new_object,
375
+				'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object,
376
+				'EEM_Message_Template_Group'        => EE_Dependency_Map::load_from_cache,
377
+			),
378
+			'EE_Message_Factory'                                                                                          => array(
379
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
380
+			),
381
+			'EE_messages'                                                                                                 => array(
382
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
383
+			),
384
+			'EE_Messages_Generator'                                                                                       => array(
385
+				'EE_Messages_Queue'                    => EE_Dependency_Map::load_new_object,
386
+				'EE_Messages_Data_Handler_Collection'  => EE_Dependency_Map::load_new_object,
387
+				'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object,
388
+				'EEH_Parse_Shortcodes'                 => EE_Dependency_Map::load_from_cache,
389
+			),
390
+			'EE_Messages_Processor'                                                                                       => array(
391
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
392
+			),
393
+			'EE_Messages_Queue'                                                                                           => array(
394
+				'EE_Message_Repository' => EE_Dependency_Map::load_new_object,
395
+			),
396
+			'EE_Messages_Template_Defaults'                                                                               => array(
397
+				'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache,
398
+				'EEM_Message_Template'       => EE_Dependency_Map::load_from_cache,
399
+			),
400
+			'EE_Message_To_Generate_From_Request'                                                                         => array(
401
+				'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache,
402
+				'EE_Request_Handler'          => EE_Dependency_Map::load_from_cache,
403
+			),
404
+			'EventEspresso\core\services\commands\CommandBus'                                                             => array(
405
+				'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache,
406
+			),
407
+			'EventEspresso\services\commands\CommandHandler'                                                              => array(
408
+				'EE_Registry'         => EE_Dependency_Map::load_from_cache,
409
+				'CommandBusInterface' => EE_Dependency_Map::load_from_cache,
410
+			),
411
+			'EventEspresso\core\services\commands\CommandHandlerManager'                                                  => array(
412
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
413
+			),
414
+			'EventEspresso\core\services\commands\CompositeCommandHandler'                                                => array(
415
+				'EventEspresso\core\services\commands\CommandBus'     => EE_Dependency_Map::load_from_cache,
416
+				'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache,
417
+			),
418
+			'EventEspresso\core\services\commands\CommandFactory'                                                         => array(
419
+				'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache,
420
+			),
421
+			'EventEspresso\core\services\commands\middleware\CapChecker'                                                  => array(
422
+				'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache,
423
+			),
424
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker'                                         => array(
425
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
426
+			),
427
+			'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker'                                     => array(
428
+				'EE_Capabilities' => EE_Dependency_Map::load_from_cache,
429
+			),
430
+			'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler'                          => array(
431
+				'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache,
432
+			),
433
+			'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler'                     => array(
434
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
435
+			),
436
+			'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler'                    => array(
437
+				'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache,
438
+			),
439
+			'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler'         => array(
440
+				'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
441
+			),
442
+			'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array(
443
+				'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache,
444
+			),
445
+			'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler'                              => array(
446
+				'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache,
447
+			),
448
+			'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler'                              => array(
449
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
450
+			),
451
+			'EventEspresso\core\domain\services\registration\CancelRegistrationService'                                   => array(
452
+				'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache,
453
+			),
454
+			'EventEspresso\core\services\database\TableManager'                                                           => array(
455
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
456
+			),
457
+			'EE_Data_Migration_Class_Base'                                                                                => array(
458
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
459
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
460
+			),
461
+			'EE_DMS_Core_4_1_0'                                                                                           => array(
462
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
463
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
464
+			),
465
+			'EE_DMS_Core_4_2_0'                                                                                           => array(
466
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
467
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
468
+			),
469
+			'EE_DMS_Core_4_3_0'                                                                                           => array(
470
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
471
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
472
+			),
473
+			'EE_DMS_Core_4_4_0'                                                                                           => array(
474
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
475
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
476
+			),
477
+			'EE_DMS_Core_4_5_0'                                                                                           => array(
478
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
479
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
480
+			),
481
+			'EE_DMS_Core_4_6_0'                                                                                           => array(
482
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
483
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
484
+			),
485
+			'EE_DMS_Core_4_7_0'                                                                                           => array(
486
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
487
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
488
+			),
489
+			'EE_DMS_Core_4_8_0'                                                                                           => array(
490
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
491
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
492
+			),
493
+			'EE_DMS_Core_4_9_0'                                                                                           => array(
494
+				'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache,
495
+				'EventEspresso\core\services\database\TableManager'  => EE_Dependency_Map::load_from_cache,
496
+			),
497
+			'EventEspresso\core\services\assets\Registry'                                                                 => array(
498
+				'EE_Template_Config' => EE_Dependency_Map::load_from_cache,
499
+				'EE_Currency_Config' => EE_Dependency_Map::load_from_cache,
500
+			),
501
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled'                                             => array(
502
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
503
+			),
504
+			'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout'                                              => array(
505
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
506
+			),
507
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees'                                        => array(
508
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
509
+			),
510
+			'EventEspresso\core\domain\entities\shortcodes\EspressoEvents'                                                => array(
511
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
512
+			),
513
+			'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou'                                              => array(
514
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
515
+			),
516
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector'                                        => array(
517
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
518
+			),
519
+			'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage'                                               => array(
520
+				'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
521
+			),
522
+			'EventEspresso\core\services\cache\BasicCacheManager'                                                         => array(
523
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
524
+			),
525
+			'EventEspresso\core\services\cache\PostRelatedCacheManager'                                                   => array(
526
+				'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache,
527
+			),
528
+		);
529
+	}
530
+
531
+
532
+
533
+	/**
534
+	 * Registers how core classes are loaded.
535
+	 * This can either be done by simply providing the name of one of the EE_Registry loader methods such as:
536
+	 *        'EE_Request_Handler' => 'load_core'
537
+	 *        'EE_Messages_Queue'  => 'load_lib'
538
+	 *        'EEH_Debug_Tools'    => 'load_helper'
539
+	 * or, if greater control is required, by providing a custom closure. For example:
540
+	 *        'Some_Class' => function () {
541
+	 *            return new Some_Class();
542
+	 *        },
543
+	 * This is required for instantiating dependencies
544
+	 * where an interface has been type hinted in a class constructor. For example:
545
+	 *        'Required_Interface' => function () {
546
+	 *            return new A_Class_That_Implements_Required_Interface();
547
+	 *        },
548
+	 */
549
+	protected function _register_core_class_loaders()
550
+	{
551
+		//for PHP5.3 compat, we need to register any properties called here in a variable because `$this` cannot
552
+		//be used in a closure.
553
+		$request = &$this->_request;
554
+		$response = &$this->_response;
555
+		$loader = &$this->loader;
556
+		$this->_class_loaders = array(
557
+			//load_core
558
+			'EE_Capabilities'                      => 'load_core',
559
+			'EE_Encryption'                        => 'load_core',
560
+			'EE_Front_Controller'                  => 'load_core',
561
+			'EE_Module_Request_Router'             => 'load_core',
562
+			'EE_Registry'                          => 'load_core',
563
+			'EE_Request'                           => function () use (&$request) {
564
+				return $request;
565
+			},
566
+			'EE_Response'                          => function () use (&$response) {
567
+				return $response;
568
+			},
569
+			'EE_Request_Handler'                   => 'load_core',
570
+			'EE_Session'                           => 'load_core',
571
+			'EE_System'                            => 'load_core',
572
+			//load_lib
573
+			'EE_Message_Resource_Manager'          => 'load_lib',
574
+			'EE_Message_Type_Collection'           => 'load_lib',
575
+			'EE_Message_Type_Collection_Loader'    => 'load_lib',
576
+			'EE_Messenger_Collection'              => 'load_lib',
577
+			'EE_Messenger_Collection_Loader'       => 'load_lib',
578
+			'EE_Messages_Processor'                => 'load_lib',
579
+			'EE_Message_Repository'                => 'load_lib',
580
+			'EE_Messages_Queue'                    => 'load_lib',
581
+			'EE_Messages_Data_Handler_Collection'  => 'load_lib',
582
+			'EE_Message_Template_Group_Collection' => 'load_lib',
583
+			'EE_Messages_Generator'                => function () {
584
+				return EE_Registry::instance()->load_lib(
585
+					'Messages_Generator',
586
+					array(),
587
+					false,
588
+					false
589
+				);
590
+			},
591
+			'EE_Messages_Template_Defaults'        => function ($arguments = array()) {
592
+				return EE_Registry::instance()->load_lib(
593
+					'Messages_Template_Defaults',
594
+					$arguments,
595
+					false,
596
+					false
597
+				);
598
+			},
599
+			//load_model
600
+			'EEM_Message_Template_Group'           => 'load_model',
601
+			'EEM_Message_Template'                 => 'load_model',
602
+			//load_helper
603
+			'EEH_Parse_Shortcodes'                 => function () {
604
+				if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
605
+					return new EEH_Parse_Shortcodes();
606
+				}
607
+				return null;
608
+			},
609
+			'EE_Template_Config'                   => function () {
610
+				return EE_Config::instance()->template_settings;
611
+			},
612
+			'EE_Currency_Config'                   => function () {
613
+				return EE_Config::instance()->currency;
614
+			},
615
+			'EventEspresso\core\services\loaders\Loader' => function () use (&$loader) {
616
+				return $loader;
617
+			},
618
+		);
619
+	}
620
+
621
+
622
+
623
+	/**
624
+	 * can be used for supplying alternate names for classes,
625
+	 * or for connecting interface names to instantiable classes
626
+	 */
627
+	protected function _register_core_aliases()
628
+	{
629
+		$this->_aliases = array(
630
+			'CommandBusInterface'                                                 => 'EventEspresso\core\services\commands\CommandBusInterface',
631
+			'EventEspresso\core\services\commands\CommandBusInterface'            => 'EventEspresso\core\services\commands\CommandBus',
632
+			'CommandHandlerManagerInterface'                                      => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
633
+			'EventEspresso\core\services\commands\CommandHandlerManagerInterface' => 'EventEspresso\core\services\commands\CommandHandlerManager',
634
+			'CapChecker'                                                          => 'EventEspresso\core\services\commands\middleware\CapChecker',
635
+			'AddActionHook'                                                       => 'EventEspresso\core\services\commands\middleware\AddActionHook',
636
+			'CapabilitiesChecker'                                                 => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
637
+			'CapabilitiesCheckerInterface'                                        => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface',
638
+			'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker',
639
+			'CreateRegistrationService'                                           => 'EventEspresso\core\domain\services\registration\CreateRegistrationService',
640
+			'CreateRegCodeCommandHandler'                                         => 'EventEspresso\core\services\commands\registration\CreateRegCodeCommand',
641
+			'CreateRegUrlLinkCommandHandler'                                      => 'EventEspresso\core\services\commands\registration\CreateRegUrlLinkCommand',
642
+			'CreateRegistrationCommandHandler'                                    => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
643
+			'CopyRegistrationDetailsCommandHandler'                               => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand',
644
+			'CopyRegistrationPaymentsCommandHandler'                              => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand',
645
+			'CancelRegistrationAndTicketLineItemCommandHandler'                   => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler',
646
+			'UpdateRegistrationAndTransactionAfterChangeCommandHandler'           => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler',
647
+			'CreateTicketLineItemCommandHandler'                                  => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand',
648
+			'TableManager'                                                        => 'EventEspresso\core\services\database\TableManager',
649
+			'TableAnalysis'                                                       => 'EventEspresso\core\services\database\TableAnalysis',
650
+			'EspressoShortcode'                                                   => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
651
+			'ShortcodeInterface'                                                  => 'EventEspresso\core\services\shortcodes\ShortcodeInterface',
652
+			'EventEspresso\core\services\shortcodes\ShortcodeInterface'           => 'EventEspresso\core\services\shortcodes\EspressoShortcode',
653
+			'EventEspresso\core\services\cache\CacheStorageInterface'             => 'EventEspresso\core\services\cache\TransientCacheStorage',
654
+			'LoaderInterface'                                                     => 'EventEspresso\core\services\loaders\LoaderInterface',
655
+			'EventEspresso\core\services\loaders\LoaderInterface'                 => 'EventEspresso\core\services\loaders\Loader',
656
+			'CommandFactoryInterface'                                             => 'EventEspresso\core\services\commands\CommandFactoryInterface',
657
+			'EventEspresso\core\services\commands\CommandFactoryInterface'        => 'EventEspresso\core\services\commands\CommandFactory',
658
+		);
659
+	}
660
+
661
+
662
+
663
+	/**
664
+	 * This is used to reset the internal map and class_loaders to their original default state at the beginning of the
665
+	 * request Primarily used by unit tests.
666
+	 */
667
+	public function reset()
668
+	{
669
+		$this->_register_core_class_loaders();
670
+		$this->_register_core_dependencies();
671
+	}
672 672
 
673 673
 
674 674
 }
Please login to merge, or discard this patch.
Spacing   +16 added lines, -16 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
 
@@ -116,7 +116,7 @@  discard block
 block discarded – undo
116 116
     public static function instance(EE_Request $request = null, EE_Response $response = null)
117 117
     {
118 118
         // check if class object is instantiated, and instantiated properly
119
-        if (! self::$_instance instanceof EE_Dependency_Map) {
119
+        if ( ! self::$_instance instanceof EE_Dependency_Map) {
120 120
             self::$_instance = new EE_Dependency_Map($request, $response);
121 121
         }
122 122
         return self::$_instance;
@@ -141,15 +141,15 @@  discard block
 block discarded – undo
141 141
      */
142 142
     public static function register_dependencies($class, $dependencies)
143 143
     {
144
-        if (! isset(self::$_instance->_dependency_map[$class])) {
144
+        if ( ! isset(self::$_instance->_dependency_map[$class])) {
145 145
             // we need to make sure that any aliases used when registering a dependency
146 146
             // get resolved to the correct class name
147
-            foreach ((array)$dependencies as $dependency => $load_source) {
147
+            foreach ((array) $dependencies as $dependency => $load_source) {
148 148
                 $alias = self::$_instance->get_alias($dependency);
149 149
                 unset($dependencies[$dependency]);
150 150
                 $dependencies[$alias] = $load_source;
151 151
             }
152
-            self::$_instance->_dependency_map[$class] = (array)$dependencies;
152
+            self::$_instance->_dependency_map[$class] = (array) $dependencies;
153 153
             return true;
154 154
         }
155 155
         return false;
@@ -181,7 +181,7 @@  discard block
 block discarded – undo
181 181
             );
182 182
         }
183 183
         $class_name = self::$_instance->get_alias($class_name);
184
-        if (! isset(self::$_instance->_class_loaders[$class_name])) {
184
+        if ( ! isset(self::$_instance->_class_loaders[$class_name])) {
185 185
             self::$_instance->_class_loaders[$class_name] = $loader;
186 186
             return true;
187 187
         }
@@ -279,7 +279,7 @@  discard block
 block discarded – undo
279 279
     public function add_alias($class_name, $alias, $for_class = '')
280 280
     {
281 281
         if ($for_class !== '') {
282
-            if (! isset($this->_aliases[$for_class])) {
282
+            if ( ! isset($this->_aliases[$for_class])) {
283 283
                 $this->_aliases[$for_class] = array();
284 284
             }
285 285
             $this->_aliases[$for_class][$class_name] = $alias;
@@ -325,7 +325,7 @@  discard block
 block discarded – undo
325 325
      */
326 326
     public function get_alias($class_name = '', $for_class = '')
327 327
     {
328
-        if (! $this->has_alias($class_name, $for_class)) {
328
+        if ( ! $this->has_alias($class_name, $for_class)) {
329 329
             return $class_name;
330 330
         }
331 331
         if ($for_class !== '') {
@@ -560,10 +560,10 @@  discard block
 block discarded – undo
560 560
             'EE_Front_Controller'                  => 'load_core',
561 561
             'EE_Module_Request_Router'             => 'load_core',
562 562
             'EE_Registry'                          => 'load_core',
563
-            'EE_Request'                           => function () use (&$request) {
563
+            'EE_Request'                           => function() use (&$request) {
564 564
                 return $request;
565 565
             },
566
-            'EE_Response'                          => function () use (&$response) {
566
+            'EE_Response'                          => function() use (&$response) {
567 567
                 return $response;
568 568
             },
569 569
             'EE_Request_Handler'                   => 'load_core',
@@ -580,7 +580,7 @@  discard block
 block discarded – undo
580 580
             'EE_Messages_Queue'                    => 'load_lib',
581 581
             'EE_Messages_Data_Handler_Collection'  => 'load_lib',
582 582
             'EE_Message_Template_Group_Collection' => 'load_lib',
583
-            'EE_Messages_Generator'                => function () {
583
+            'EE_Messages_Generator'                => function() {
584 584
                 return EE_Registry::instance()->load_lib(
585 585
                     'Messages_Generator',
586 586
                     array(),
@@ -588,7 +588,7 @@  discard block
 block discarded – undo
588 588
                     false
589 589
                 );
590 590
             },
591
-            'EE_Messages_Template_Defaults'        => function ($arguments = array()) {
591
+            'EE_Messages_Template_Defaults'        => function($arguments = array()) {
592 592
                 return EE_Registry::instance()->load_lib(
593 593
                     'Messages_Template_Defaults',
594 594
                     $arguments,
@@ -600,19 +600,19 @@  discard block
 block discarded – undo
600 600
             'EEM_Message_Template_Group'           => 'load_model',
601 601
             'EEM_Message_Template'                 => 'load_model',
602 602
             //load_helper
603
-            'EEH_Parse_Shortcodes'                 => function () {
603
+            'EEH_Parse_Shortcodes'                 => function() {
604 604
                 if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) {
605 605
                     return new EEH_Parse_Shortcodes();
606 606
                 }
607 607
                 return null;
608 608
             },
609
-            'EE_Template_Config'                   => function () {
609
+            'EE_Template_Config'                   => function() {
610 610
                 return EE_Config::instance()->template_settings;
611 611
             },
612
-            'EE_Currency_Config'                   => function () {
612
+            'EE_Currency_Config'                   => function() {
613 613
                 return EE_Config::instance()->currency;
614 614
             },
615
-            'EventEspresso\core\services\loaders\Loader' => function () use (&$loader) {
615
+            'EventEspresso\core\services\loaders\Loader' => function() use (&$loader) {
616 616
                 return $loader;
617 617
             },
618 618
         );
Please login to merge, or discard this patch.
core/services/assets/Registry.php 2 patches
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -71,7 +71,7 @@  discard block
 block discarded – undo
71 71
         global $wp_version;
72 72
         wp_register_script(
73 73
             'eejs-core',
74
-            EE_PLUGIN_DIR_URL . 'core/services/assets/core_assets/eejs-core.js',
74
+            EE_PLUGIN_DIR_URL.'core/services/assets/core_assets/eejs-core.js',
75 75
             array(),
76 76
             EVENT_ESPRESSO_VERSION,
77 77
             true
@@ -81,7 +81,7 @@  discard block
 block discarded – undo
81 81
             //js.api
82 82
             wp_register_script(
83 83
                 'eejs-api',
84
-                EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
84
+                EE_LIBRARIES_URL.'rest_api/assets/js/eejs-api.min.js',
85 85
                 array('underscore', 'eejs-core'),
86 86
                 EVENT_ESPRESSO_VERSION,
87 87
                 true
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
             $this->jsdata['eejs_api_nonce'] = wp_create_nonce('wp_rest');
90 90
             $this->jsdata['paths'] = array('rest_route' => rest_url('ee/v4.8.36/'));
91 91
         }
92
-        if (! is_admin()) {
92
+        if ( ! is_admin()) {
93 93
             $this->loadCoreCss();
94 94
         }
95 95
         $this->loadCoreJs();
@@ -182,7 +182,7 @@  discard block
 block discarded – undo
182 182
      */
183 183
     public function addTemplate($template_reference, $template_content)
184 184
     {
185
-        if (! isset($this->jsdata['templates'])) {
185
+        if ( ! isset($this->jsdata['templates'])) {
186 186
             $this->jsdata['templates'] = array();
187 187
         }
188 188
         //no overrides allowed.
@@ -279,9 +279,9 @@  discard block
 block discarded – undo
279 279
     private function loadCoreCss()
280 280
     {
281 281
         if ($this->template_config->enable_default_style) {
282
-            $default_stylesheet_path = is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
283
-                ? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
284
-                : EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css';
282
+            $default_stylesheet_path = is_readable(EVENT_ESPRESSO_UPLOAD_DIR.'css/style.css')
283
+                ? EVENT_ESPRESSO_UPLOAD_DIR.'css/espresso_default.css'
284
+                : EE_GLOBAL_ASSETS_URL.'css/espresso_default.css';
285 285
             wp_register_style(
286 286
                 'espresso_default',
287 287
                 $default_stylesheet_path,
@@ -292,7 +292,7 @@  discard block
 block discarded – undo
292 292
             if ($this->template_config->custom_style_sheet !== null) {
293 293
                 wp_register_style(
294 294
                     'espresso_custom_css',
295
-                    EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
295
+                    EVENT_ESPRESSO_UPLOAD_URL.'css/'.$this->template_config->custom_style_sheet,
296 296
                     array('espresso_default'),
297 297
                     EVENT_ESPRESSO_VERSION
298 298
                 );
@@ -310,7 +310,7 @@  discard block
 block discarded – undo
310 310
         // load core js
311 311
         wp_register_script(
312 312
             'espresso_core',
313
-            EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
313
+            EE_GLOBAL_ASSETS_URL.'scripts/espresso_core.js',
314 314
             array('jquery'),
315 315
             EVENT_ESPRESSO_VERSION,
316 316
             true
@@ -328,14 +328,14 @@  discard block
 block discarded – undo
328 328
         // register jQuery Validate and additional methods
329 329
         wp_register_script(
330 330
             'jquery-validate',
331
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
331
+            EE_GLOBAL_ASSETS_URL.'scripts/jquery.validate.min.js',
332 332
             array('jquery'),
333 333
             '1.15.0',
334 334
             true
335 335
         );
336 336
         wp_register_script(
337 337
             'jquery-validate-extra-methods',
338
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
338
+            EE_GLOBAL_ASSETS_URL.'scripts/jquery.validate.additional-methods.min.js',
339 339
             array('jquery', 'jquery-validate'),
340 340
             '1.15.0',
341 341
             true
@@ -353,14 +353,14 @@  discard block
 block discarded – undo
353 353
         // @link http://josscrowcroft.github.io/accounting.js/
354 354
         wp_register_script(
355 355
             'ee-accounting-core',
356
-            EE_THIRD_PARTY_URL . 'accounting/accounting.js',
356
+            EE_THIRD_PARTY_URL.'accounting/accounting.js',
357 357
             array('underscore'),
358 358
             '0.3.2',
359 359
             true
360 360
         );
361 361
         wp_register_script(
362 362
             'ee-accounting',
363
-            EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
363
+            EE_GLOBAL_ASSETS_URL.'scripts/ee-accounting-config.js',
364 364
             array('ee-accounting-core'),
365 365
             EVENT_ESPRESSO_VERSION,
366 366
             true
Please login to merge, or discard this patch.
Indentation   +384 added lines, -384 removed lines patch added patch discarded remove patch
@@ -23,394 +23,394 @@
 block discarded – undo
23 23
 class Registry
24 24
 {
25 25
 
26
-    /**
27
-     * @var EE_Template_Config $template_config
28
-     */
29
-    protected $template_config;
30
-
31
-    /**
32
-     * @var EE_Currency_Config $currency_config
33
-     */
34
-    protected $currency_config;
35
-
36
-    /**
37
-     * This holds the jsdata data object that will be exposed on pages that enqueue the `eejs-core` script.
38
-     *
39
-     * @var array
40
-     */
41
-    protected $jsdata = array();
42
-
43
-
44
-
45
-    /**
46
-     * Registry constructor.
47
-     * Hooking into WP actions for script registry.
48
-     *
49
-     * @param EE_Template_Config $template_config
50
-     * @param EE_Currency_Config $currency_config
51
-     */
52
-    public function __construct(EE_Template_Config $template_config, EE_Currency_Config $currency_config)
53
-    {
54
-        $this->template_config = $template_config;
55
-        $this->currency_config = $currency_config;
56
-        add_action('wp_enqueue_scripts', array($this, 'scripts'), 1);
57
-        add_action('admin_enqueue_scripts', array($this, 'scripts'), 1);
58
-        add_action('wp_print_footer_scripts', array($this, 'enqueueData'), 1);
59
-        add_action('admin_print_footer_scripts', array($this, 'enqueueData'), 1);
60
-    }
61
-
62
-
63
-
64
-    /**
65
-     * Callback for the WP script actions.
66
-     * Used to register globally accessible core scripts.
67
-     * Also used to add the eejs.data object to the source for any js having eejs-core as a dependency.
68
-     */
69
-    public function scripts()
70
-    {
71
-        global $wp_version;
72
-        wp_register_script(
73
-            'eejs-core',
74
-            EE_PLUGIN_DIR_URL . 'core/services/assets/core_assets/eejs-core.js',
75
-            array(),
76
-            EVENT_ESPRESSO_VERSION,
77
-            true
78
-        );
79
-        //only run this if WordPress 4.4.0 > is in use.
80
-        if (version_compare($wp_version, '4.4.0', '>')) {
81
-            //js.api
82
-            wp_register_script(
83
-                'eejs-api',
84
-                EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
85
-                array('underscore', 'eejs-core'),
86
-                EVENT_ESPRESSO_VERSION,
87
-                true
88
-            );
89
-            $this->jsdata['eejs_api_nonce'] = wp_create_nonce('wp_rest');
90
-            $this->jsdata['paths'] = array('rest_route' => rest_url('ee/v4.8.36/'));
91
-        }
92
-        if (! is_admin()) {
93
-            $this->loadCoreCss();
94
-        }
95
-        $this->loadCoreJs();
96
-        $this->loadJqueryValidate();
97
-        $this->loadAccountingJs();
98
-        $this->loadQtipJs();
99
-    }
100
-
101
-
102
-
103
-    /**
104
-     * Call back for the script print in frontend and backend.
105
-     * Used to call wp_localize_scripts so that data can be added throughout the runtime until this later hook point.
106
-     *
107
-     * @since 4.9.31.rc.015
108
-     */
109
-    public function enqueueData()
110
-    {
111
-        wp_localize_script('eejs-core', 'eejs', array('data' => $this->jsdata));
112
-        wp_localize_script('espresso_core', 'eei18n', EE_Registry::$i18n_js_strings);
113
-        $this->localizeAccountingJs();
114
-    }
115
-
116
-
117
-
118
-    /**
119
-     * Used to add data to eejs.data object.
120
-     * Note:  Overriding existing data is not allowed.
121
-     * Data will be accessible as a javascript object when you list `eejs-core` as a dependency for your javascript.
122
-     * If the data you add is something like this:
123
-     *  $this->addData( 'my_plugin_data', array( 'foo' => 'gar' ) );
124
-     * It will be exposed in the page source as:
125
-     *  eejs.data.my_plugin_data.foo == gar
126
-     *
127
-     * @param string       $key   Key used to access your data
128
-     * @param string|array $value Value to attach to key
129
-     * @throws InvalidArgumentException
130
-     */
131
-    public function addData($key, $value)
132
-    {
133
-        if ($this->verifyDataNotExisting($key)) {
134
-            $this->jsdata[$key] = $value;
135
-        }
136
-    }
137
-
138
-
139
-
140
-    /**
141
-     * Similar to addData except this allows for users to push values to an existing key where the values on key are
142
-     * elements in an array.
143
-     * When you use this method, the value you include will be appended to the end of an array on $key.
144
-     * So if the $key was 'test' and you added a value of 'my_data' then it would be represented in the javascript
145
-     * object like this, eejs.data.test = [ my_data,
146
-     * ]
147
-     * If there has already been a scalar value attached to the data object given key, then
148
-     * this will throw an exception.
149
-     *
150
-     * @param string       $key   Key to attach data to.
151
-     * @param string|array $value Value being registered.
152
-     * @throws InvalidArgumentException
153
-     */
154
-    public function pushData($key, $value)
155
-    {
156
-        if (isset($this->jsdata[$key])
157
-            && ! is_array($this->jsdata[$key])
158
-        ) {
159
-            throw new invalidArgumentException(
160
-                sprintf(
161
-                    __(
162
-                        'The value for %1$s is already set and it is not an array. The %2$s method can only be used to
26
+	/**
27
+	 * @var EE_Template_Config $template_config
28
+	 */
29
+	protected $template_config;
30
+
31
+	/**
32
+	 * @var EE_Currency_Config $currency_config
33
+	 */
34
+	protected $currency_config;
35
+
36
+	/**
37
+	 * This holds the jsdata data object that will be exposed on pages that enqueue the `eejs-core` script.
38
+	 *
39
+	 * @var array
40
+	 */
41
+	protected $jsdata = array();
42
+
43
+
44
+
45
+	/**
46
+	 * Registry constructor.
47
+	 * Hooking into WP actions for script registry.
48
+	 *
49
+	 * @param EE_Template_Config $template_config
50
+	 * @param EE_Currency_Config $currency_config
51
+	 */
52
+	public function __construct(EE_Template_Config $template_config, EE_Currency_Config $currency_config)
53
+	{
54
+		$this->template_config = $template_config;
55
+		$this->currency_config = $currency_config;
56
+		add_action('wp_enqueue_scripts', array($this, 'scripts'), 1);
57
+		add_action('admin_enqueue_scripts', array($this, 'scripts'), 1);
58
+		add_action('wp_print_footer_scripts', array($this, 'enqueueData'), 1);
59
+		add_action('admin_print_footer_scripts', array($this, 'enqueueData'), 1);
60
+	}
61
+
62
+
63
+
64
+	/**
65
+	 * Callback for the WP script actions.
66
+	 * Used to register globally accessible core scripts.
67
+	 * Also used to add the eejs.data object to the source for any js having eejs-core as a dependency.
68
+	 */
69
+	public function scripts()
70
+	{
71
+		global $wp_version;
72
+		wp_register_script(
73
+			'eejs-core',
74
+			EE_PLUGIN_DIR_URL . 'core/services/assets/core_assets/eejs-core.js',
75
+			array(),
76
+			EVENT_ESPRESSO_VERSION,
77
+			true
78
+		);
79
+		//only run this if WordPress 4.4.0 > is in use.
80
+		if (version_compare($wp_version, '4.4.0', '>')) {
81
+			//js.api
82
+			wp_register_script(
83
+				'eejs-api',
84
+				EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
85
+				array('underscore', 'eejs-core'),
86
+				EVENT_ESPRESSO_VERSION,
87
+				true
88
+			);
89
+			$this->jsdata['eejs_api_nonce'] = wp_create_nonce('wp_rest');
90
+			$this->jsdata['paths'] = array('rest_route' => rest_url('ee/v4.8.36/'));
91
+		}
92
+		if (! is_admin()) {
93
+			$this->loadCoreCss();
94
+		}
95
+		$this->loadCoreJs();
96
+		$this->loadJqueryValidate();
97
+		$this->loadAccountingJs();
98
+		$this->loadQtipJs();
99
+	}
100
+
101
+
102
+
103
+	/**
104
+	 * Call back for the script print in frontend and backend.
105
+	 * Used to call wp_localize_scripts so that data can be added throughout the runtime until this later hook point.
106
+	 *
107
+	 * @since 4.9.31.rc.015
108
+	 */
109
+	public function enqueueData()
110
+	{
111
+		wp_localize_script('eejs-core', 'eejs', array('data' => $this->jsdata));
112
+		wp_localize_script('espresso_core', 'eei18n', EE_Registry::$i18n_js_strings);
113
+		$this->localizeAccountingJs();
114
+	}
115
+
116
+
117
+
118
+	/**
119
+	 * Used to add data to eejs.data object.
120
+	 * Note:  Overriding existing data is not allowed.
121
+	 * Data will be accessible as a javascript object when you list `eejs-core` as a dependency for your javascript.
122
+	 * If the data you add is something like this:
123
+	 *  $this->addData( 'my_plugin_data', array( 'foo' => 'gar' ) );
124
+	 * It will be exposed in the page source as:
125
+	 *  eejs.data.my_plugin_data.foo == gar
126
+	 *
127
+	 * @param string       $key   Key used to access your data
128
+	 * @param string|array $value Value to attach to key
129
+	 * @throws InvalidArgumentException
130
+	 */
131
+	public function addData($key, $value)
132
+	{
133
+		if ($this->verifyDataNotExisting($key)) {
134
+			$this->jsdata[$key] = $value;
135
+		}
136
+	}
137
+
138
+
139
+
140
+	/**
141
+	 * Similar to addData except this allows for users to push values to an existing key where the values on key are
142
+	 * elements in an array.
143
+	 * When you use this method, the value you include will be appended to the end of an array on $key.
144
+	 * So if the $key was 'test' and you added a value of 'my_data' then it would be represented in the javascript
145
+	 * object like this, eejs.data.test = [ my_data,
146
+	 * ]
147
+	 * If there has already been a scalar value attached to the data object given key, then
148
+	 * this will throw an exception.
149
+	 *
150
+	 * @param string       $key   Key to attach data to.
151
+	 * @param string|array $value Value being registered.
152
+	 * @throws InvalidArgumentException
153
+	 */
154
+	public function pushData($key, $value)
155
+	{
156
+		if (isset($this->jsdata[$key])
157
+			&& ! is_array($this->jsdata[$key])
158
+		) {
159
+			throw new invalidArgumentException(
160
+				sprintf(
161
+					__(
162
+						'The value for %1$s is already set and it is not an array. The %2$s method can only be used to
163 163
                          push values to this data element when it is an array.',
164
-                        'event_espresso'
165
-                    ),
166
-                    $key,
167
-                    __METHOD__
168
-                )
169
-            );
170
-        }
171
-        $this->jsdata[$key][] = $value;
172
-    }
173
-
174
-
175
-
176
-    /**
177
-     * Used to set content used by javascript for a template.
178
-     * Note: Overrides of existing registered templates are not allowed.
179
-     *
180
-     * @param string $template_reference
181
-     * @param string $template_content
182
-     * @throws InvalidArgumentException
183
-     */
184
-    public function addTemplate($template_reference, $template_content)
185
-    {
186
-        if (! isset($this->jsdata['templates'])) {
187
-            $this->jsdata['templates'] = array();
188
-        }
189
-        //no overrides allowed.
190
-        if (isset($this->jsdata['templates'][$template_reference])) {
191
-            throw new invalidArgumentException(
192
-                sprintf(
193
-                    __(
194
-                        'The %1$s key already exists for the templates array in the js data array.  No overrides are allowed.',
195
-                        'event_espresso'
196
-                    ),
197
-                    $template_reference
198
-                )
199
-            );
200
-        }
201
-        $this->jsdata['templates'][$template_reference] = $template_content;
202
-    }
203
-
204
-
205
-
206
-    /**
207
-     * Retrieve the template content already registered for the given reference.
208
-     *
209
-     * @param string $template_reference
210
-     * @return string
211
-     */
212
-    public function getTemplate($template_reference)
213
-    {
214
-        return isset($this->jsdata['templates'], $this->jsdata['templates'][$template_reference])
215
-            ? $this->jsdata['templates'][$template_reference]
216
-            : '';
217
-    }
218
-
219
-
220
-
221
-    /**
222
-     * Retrieve registered data.
223
-     *
224
-     * @param string $key Name of key to attach data to.
225
-     * @return mixed                If there is no for the given key, then false is returned.
226
-     */
227
-    public function getData($key)
228
-    {
229
-        return isset($this->jsdata[$key])
230
-            ? $this->jsdata[$key]
231
-            : false;
232
-    }
233
-
234
-
235
-
236
-    /**
237
-     * Verifies whether the given data exists already on the jsdata array.
238
-     * Overriding data is not allowed.
239
-     *
240
-     * @param string $key Index for data.
241
-     * @return bool        If valid then return true.
242
-     * @throws InvalidArgumentException if data already exists.
243
-     */
244
-    protected function verifyDataNotExisting($key)
245
-    {
246
-        if (isset($this->jsdata[$key])) {
247
-            if (is_array($this->jsdata[$key])) {
248
-                throw new InvalidArgumentException(
249
-                    sprintf(
250
-                        __(
251
-                            'The value for %1$s already exists in the Registry::eejs object.
164
+						'event_espresso'
165
+					),
166
+					$key,
167
+					__METHOD__
168
+				)
169
+			);
170
+		}
171
+		$this->jsdata[$key][] = $value;
172
+	}
173
+
174
+
175
+
176
+	/**
177
+	 * Used to set content used by javascript for a template.
178
+	 * Note: Overrides of existing registered templates are not allowed.
179
+	 *
180
+	 * @param string $template_reference
181
+	 * @param string $template_content
182
+	 * @throws InvalidArgumentException
183
+	 */
184
+	public function addTemplate($template_reference, $template_content)
185
+	{
186
+		if (! isset($this->jsdata['templates'])) {
187
+			$this->jsdata['templates'] = array();
188
+		}
189
+		//no overrides allowed.
190
+		if (isset($this->jsdata['templates'][$template_reference])) {
191
+			throw new invalidArgumentException(
192
+				sprintf(
193
+					__(
194
+						'The %1$s key already exists for the templates array in the js data array.  No overrides are allowed.',
195
+						'event_espresso'
196
+					),
197
+					$template_reference
198
+				)
199
+			);
200
+		}
201
+		$this->jsdata['templates'][$template_reference] = $template_content;
202
+	}
203
+
204
+
205
+
206
+	/**
207
+	 * Retrieve the template content already registered for the given reference.
208
+	 *
209
+	 * @param string $template_reference
210
+	 * @return string
211
+	 */
212
+	public function getTemplate($template_reference)
213
+	{
214
+		return isset($this->jsdata['templates'], $this->jsdata['templates'][$template_reference])
215
+			? $this->jsdata['templates'][$template_reference]
216
+			: '';
217
+	}
218
+
219
+
220
+
221
+	/**
222
+	 * Retrieve registered data.
223
+	 *
224
+	 * @param string $key Name of key to attach data to.
225
+	 * @return mixed                If there is no for the given key, then false is returned.
226
+	 */
227
+	public function getData($key)
228
+	{
229
+		return isset($this->jsdata[$key])
230
+			? $this->jsdata[$key]
231
+			: false;
232
+	}
233
+
234
+
235
+
236
+	/**
237
+	 * Verifies whether the given data exists already on the jsdata array.
238
+	 * Overriding data is not allowed.
239
+	 *
240
+	 * @param string $key Index for data.
241
+	 * @return bool        If valid then return true.
242
+	 * @throws InvalidArgumentException if data already exists.
243
+	 */
244
+	protected function verifyDataNotExisting($key)
245
+	{
246
+		if (isset($this->jsdata[$key])) {
247
+			if (is_array($this->jsdata[$key])) {
248
+				throw new InvalidArgumentException(
249
+					sprintf(
250
+						__(
251
+							'The value for %1$s already exists in the Registry::eejs object.
252 252
                             Overrides are not allowed. Since the value of this data is an array, you may want to use the
253 253
                             %2$s method to push your value to the array.',
254
-                            'event_espresso'
255
-                        ),
256
-                        $key,
257
-                        'pushData()'
258
-                    )
259
-                );
260
-            }
261
-            throw new InvalidArgumentException(
262
-                sprintf(
263
-                    __(
264
-                        'The value for %1$s already exists in the Registry::eejs object. Overrides are not
254
+							'event_espresso'
255
+						),
256
+						$key,
257
+						'pushData()'
258
+					)
259
+				);
260
+			}
261
+			throw new InvalidArgumentException(
262
+				sprintf(
263
+					__(
264
+						'The value for %1$s already exists in the Registry::eejs object. Overrides are not
265 265
                         allowed.  Consider attaching your value to a different key',
266
-                        'event_espresso'
267
-                    ),
268
-                    $key
269
-                )
270
-            );
271
-        }
272
-        return true;
273
-    }
274
-
275
-
276
-
277
-    /**
278
-     * registers core default stylesheets
279
-     */
280
-    private function loadCoreCss()
281
-    {
282
-        if ($this->template_config->enable_default_style) {
283
-            $default_stylesheet_path = is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
284
-                ? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
285
-                : EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css';
286
-            wp_register_style(
287
-                'espresso_default',
288
-                $default_stylesheet_path,
289
-                array('dashicons'),
290
-                EVENT_ESPRESSO_VERSION
291
-            );
292
-            //Load custom style sheet if available
293
-            if ($this->template_config->custom_style_sheet !== null) {
294
-                wp_register_style(
295
-                    'espresso_custom_css',
296
-                    EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
297
-                    array('espresso_default'),
298
-                    EVENT_ESPRESSO_VERSION
299
-                );
300
-            }
301
-        }
302
-    }
303
-
304
-
305
-
306
-    /**
307
-     * registers core default javascript
308
-     */
309
-    private function loadCoreJs()
310
-    {
311
-        // load core js
312
-        wp_register_script(
313
-            'espresso_core',
314
-            EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
315
-            array('jquery'),
316
-            EVENT_ESPRESSO_VERSION,
317
-            true
318
-        );
319
-    }
320
-
321
-
322
-
323
-    /**
324
-     * registers jQuery Validate for form validation
325
-     */
326
-    private function loadJqueryValidate()
327
-    {
328
-        // register jQuery Validate and additional methods
329
-        wp_register_script(
330
-            'jquery-validate',
331
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
332
-            array('jquery'),
333
-            '1.15.0',
334
-            true
335
-        );
336
-        wp_register_script(
337
-            'jquery-validate-extra-methods',
338
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
339
-            array('jquery', 'jquery-validate'),
340
-            '1.15.0',
341
-            true
342
-        );
343
-    }
344
-
345
-
346
-
347
-    /**
348
-     * registers accounting.js for performing client-side calculations
349
-     */
350
-    private function loadAccountingJs()
351
-    {
352
-        //accounting.js library
353
-        // @link http://josscrowcroft.github.io/accounting.js/
354
-        wp_register_script(
355
-            'ee-accounting-core',
356
-            EE_THIRD_PARTY_URL . 'accounting/accounting.js',
357
-            array('underscore'),
358
-            '0.3.2',
359
-            true
360
-        );
361
-        wp_register_script(
362
-            'ee-accounting',
363
-            EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
364
-            array('ee-accounting-core'),
365
-            EVENT_ESPRESSO_VERSION,
366
-            true
367
-        );
368
-    }
369
-
370
-
371
-
372
-    /**
373
-     * registers accounting.js for performing client-side calculations
374
-     */
375
-    private function localizeAccountingJs()
376
-    {
377
-        wp_localize_script(
378
-            'ee-accounting',
379
-            'EE_ACCOUNTING_CFG',
380
-            array(
381
-                'currency' => array(
382
-                    'symbol'    => $this->currency_config->sign,
383
-                    'format'    => array(
384
-                        'pos'  => $this->currency_config->sign_b4 ? '%s%v' : '%v%s',
385
-                        'neg'  => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s',
386
-                        'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s',
387
-                    ),
388
-                    'decimal'   => $this->currency_config->dec_mrk,
389
-                    'thousand'  => $this->currency_config->thsnds,
390
-                    'precision' => $this->currency_config->dec_plc,
391
-                ),
392
-                'number'   => array(
393
-                    'precision' => 0,
394
-                    'thousand'  => $this->currency_config->thsnds,
395
-                    'decimal'   => $this->currency_config->dec_mrk,
396
-                ),
397
-            )
398
-        );
399
-    }
400
-
401
-
402
-
403
-    /**
404
-     * registers assets for cleaning your ears
405
-     */
406
-    private function loadQtipJs()
407
-    {
408
-        // qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
409
-        // can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
410
-        if (apply_filters('FHEE_load_qtip', false)) {
411
-            EEH_Qtip_Loader::instance()->register_and_enqueue();
412
-        }
413
-    }
266
+						'event_espresso'
267
+					),
268
+					$key
269
+				)
270
+			);
271
+		}
272
+		return true;
273
+	}
274
+
275
+
276
+
277
+	/**
278
+	 * registers core default stylesheets
279
+	 */
280
+	private function loadCoreCss()
281
+	{
282
+		if ($this->template_config->enable_default_style) {
283
+			$default_stylesheet_path = is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
284
+				? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
285
+				: EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css';
286
+			wp_register_style(
287
+				'espresso_default',
288
+				$default_stylesheet_path,
289
+				array('dashicons'),
290
+				EVENT_ESPRESSO_VERSION
291
+			);
292
+			//Load custom style sheet if available
293
+			if ($this->template_config->custom_style_sheet !== null) {
294
+				wp_register_style(
295
+					'espresso_custom_css',
296
+					EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
297
+					array('espresso_default'),
298
+					EVENT_ESPRESSO_VERSION
299
+				);
300
+			}
301
+		}
302
+	}
303
+
304
+
305
+
306
+	/**
307
+	 * registers core default javascript
308
+	 */
309
+	private function loadCoreJs()
310
+	{
311
+		// load core js
312
+		wp_register_script(
313
+			'espresso_core',
314
+			EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
315
+			array('jquery'),
316
+			EVENT_ESPRESSO_VERSION,
317
+			true
318
+		);
319
+	}
320
+
321
+
322
+
323
+	/**
324
+	 * registers jQuery Validate for form validation
325
+	 */
326
+	private function loadJqueryValidate()
327
+	{
328
+		// register jQuery Validate and additional methods
329
+		wp_register_script(
330
+			'jquery-validate',
331
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
332
+			array('jquery'),
333
+			'1.15.0',
334
+			true
335
+		);
336
+		wp_register_script(
337
+			'jquery-validate-extra-methods',
338
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
339
+			array('jquery', 'jquery-validate'),
340
+			'1.15.0',
341
+			true
342
+		);
343
+	}
344
+
345
+
346
+
347
+	/**
348
+	 * registers accounting.js for performing client-side calculations
349
+	 */
350
+	private function loadAccountingJs()
351
+	{
352
+		//accounting.js library
353
+		// @link http://josscrowcroft.github.io/accounting.js/
354
+		wp_register_script(
355
+			'ee-accounting-core',
356
+			EE_THIRD_PARTY_URL . 'accounting/accounting.js',
357
+			array('underscore'),
358
+			'0.3.2',
359
+			true
360
+		);
361
+		wp_register_script(
362
+			'ee-accounting',
363
+			EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
364
+			array('ee-accounting-core'),
365
+			EVENT_ESPRESSO_VERSION,
366
+			true
367
+		);
368
+	}
369
+
370
+
371
+
372
+	/**
373
+	 * registers accounting.js for performing client-side calculations
374
+	 */
375
+	private function localizeAccountingJs()
376
+	{
377
+		wp_localize_script(
378
+			'ee-accounting',
379
+			'EE_ACCOUNTING_CFG',
380
+			array(
381
+				'currency' => array(
382
+					'symbol'    => $this->currency_config->sign,
383
+					'format'    => array(
384
+						'pos'  => $this->currency_config->sign_b4 ? '%s%v' : '%v%s',
385
+						'neg'  => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s',
386
+						'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s',
387
+					),
388
+					'decimal'   => $this->currency_config->dec_mrk,
389
+					'thousand'  => $this->currency_config->thsnds,
390
+					'precision' => $this->currency_config->dec_plc,
391
+				),
392
+				'number'   => array(
393
+					'precision' => 0,
394
+					'thousand'  => $this->currency_config->thsnds,
395
+					'decimal'   => $this->currency_config->dec_mrk,
396
+				),
397
+			)
398
+		);
399
+	}
400
+
401
+
402
+
403
+	/**
404
+	 * registers assets for cleaning your ears
405
+	 */
406
+	private function loadQtipJs()
407
+	{
408
+		// qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
409
+		// can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
410
+		if (apply_filters('FHEE_load_qtip', false)) {
411
+			EEH_Qtip_Loader::instance()->register_and_enqueue();
412
+		}
413
+	}
414 414
 
415 415
 
416 416
 
Please login to merge, or discard this patch.
modules/single_page_checkout/EED_Single_Page_Checkout.module.php 2 patches
Indentation   +1849 added lines, -1849 removed lines patch added patch discarded remove patch
@@ -5,7 +5,7 @@  discard block
 block discarded – undo
5 5
 use EventEspresso\core\exceptions\InvalidEntityException;
6 6
 
7 7
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
8
-    exit('No direct script access allowed');
8
+	exit('No direct script access allowed');
9 9
 }
10 10
 
11 11
 
@@ -20,1854 +20,1854 @@  discard block
 block discarded – undo
20 20
 class EED_Single_Page_Checkout extends EED_Module
21 21
 {
22 22
 
23
-    /**
24
-     * $_initialized - has the SPCO controller already been initialized ?
25
-     *
26
-     * @access private
27
-     * @var bool $_initialized
28
-     */
29
-    private static $_initialized = false;
30
-
31
-
32
-    /**
33
-     * $_checkout_verified - is the EE_Checkout verified as correct for this request ?
34
-     *
35
-     * @access private
36
-     * @var bool $_valid_checkout
37
-     */
38
-    private static $_checkout_verified = true;
39
-
40
-    /**
41
-     *    $_reg_steps_array - holds initial array of reg steps
42
-     *
43
-     * @access private
44
-     * @var array $_reg_steps_array
45
-     */
46
-    private static $_reg_steps_array = array();
47
-
48
-    /**
49
-     *    $checkout - EE_Checkout object for handling the properties of the current checkout process
50
-     *
51
-     * @access public
52
-     * @var EE_Checkout $checkout
53
-     */
54
-    public $checkout;
55
-
56
-
57
-
58
-    /**
59
-     * @return EED_Module|EED_Single_Page_Checkout
60
-     */
61
-    public static function instance()
62
-    {
63
-        add_filter('EED_Single_Page_Checkout__SPCO_active', '__return_true');
64
-        return parent::get_instance(__CLASS__);
65
-    }
66
-
67
-
68
-
69
-    /**
70
-     * @return EE_CART
71
-     */
72
-    public function cart()
73
-    {
74
-        return $this->checkout->cart;
75
-    }
76
-
77
-
78
-
79
-    /**
80
-     * @return EE_Transaction
81
-     */
82
-    public function transaction()
83
-    {
84
-        return $this->checkout->transaction;
85
-    }
86
-
87
-
88
-
89
-    /**
90
-     *    set_hooks - for hooking into EE Core, other modules, etc
91
-     *
92
-     * @access    public
93
-     * @return    void
94
-     * @throws EE_Error
95
-     */
96
-    public static function set_hooks()
97
-    {
98
-        EED_Single_Page_Checkout::set_definitions();
99
-    }
100
-
101
-
102
-
103
-    /**
104
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
105
-     *
106
-     * @access    public
107
-     * @return    void
108
-     * @throws EE_Error
109
-     */
110
-    public static function set_hooks_admin()
111
-    {
112
-        EED_Single_Page_Checkout::set_definitions();
113
-        if ( ! (defined('DOING_AJAX') && DOING_AJAX)) {
114
-            return;
115
-        }
116
-        // going to start an output buffer in case anything gets accidentally output
117
-        // that might disrupt our JSON response
118
-        ob_start();
119
-        EED_Single_Page_Checkout::load_request_handler();
120
-        EED_Single_Page_Checkout::load_reg_steps();
121
-        // set ajax hooks
122
-        add_action('wp_ajax_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
123
-        add_action('wp_ajax_nopriv_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
124
-        add_action('wp_ajax_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
125
-        add_action('wp_ajax_nopriv_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
126
-        add_action('wp_ajax_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
127
-        add_action('wp_ajax_nopriv_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
128
-    }
129
-
130
-
131
-
132
-    /**
133
-     *    process ajax request
134
-     *
135
-     * @param string $ajax_action
136
-     * @throws EE_Error
137
-     */
138
-    public static function process_ajax_request($ajax_action)
139
-    {
140
-        EE_Registry::instance()->REQ->set('action', $ajax_action);
141
-        EED_Single_Page_Checkout::instance()->_initialize();
142
-    }
143
-
144
-
145
-
146
-    /**
147
-     *    ajax display registration step
148
-     *
149
-     * @throws EE_Error
150
-     */
151
-    public static function display_reg_step()
152
-    {
153
-        EED_Single_Page_Checkout::process_ajax_request('display_spco_reg_step');
154
-    }
155
-
156
-
157
-
158
-    /**
159
-     *    ajax process registration step
160
-     *
161
-     * @throws EE_Error
162
-     */
163
-    public static function process_reg_step()
164
-    {
165
-        EED_Single_Page_Checkout::process_ajax_request('process_reg_step');
166
-    }
167
-
168
-
169
-
170
-    /**
171
-     *    ajax process registration step
172
-     *
173
-     * @throws EE_Error
174
-     */
175
-    public static function update_reg_step()
176
-    {
177
-        EED_Single_Page_Checkout::process_ajax_request('update_reg_step');
178
-    }
179
-
180
-
181
-
182
-    /**
183
-     *   update_checkout
184
-     *
185
-     * @access public
186
-     * @return void
187
-     * @throws EE_Error
188
-     */
189
-    public static function update_checkout()
190
-    {
191
-        EED_Single_Page_Checkout::process_ajax_request('update_checkout');
192
-    }
193
-
194
-
195
-
196
-    /**
197
-     *    load_request_handler
198
-     *
199
-     * @access    public
200
-     * @return    void
201
-     */
202
-    public static function load_request_handler()
203
-    {
204
-        // load core Request_Handler class
205
-        if (EE_Registry::instance()->REQ !== null) {
206
-            EE_Registry::instance()->load_core('Request_Handler');
207
-        }
208
-    }
209
-
210
-
211
-
212
-    /**
213
-     *    set_definitions
214
-     *
215
-     * @access    public
216
-     * @return    void
217
-     * @throws EE_Error
218
-     */
219
-    public static function set_definitions()
220
-    {
221
-        if(defined('SPCO_BASE_PATH')) {
222
-            return;
223
-        }
224
-        define(
225
-            'SPCO_BASE_PATH',
226
-            rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS) . DS
227
-        );
228
-        define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css' . DS);
229
-        define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img' . DS);
230
-        define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js' . DS);
231
-        define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc' . DS);
232
-        define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps' . DS);
233
-        define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates' . DS);
234
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true);
235
-        EE_Registry::$i18n_js_strings['registration_expiration_notice'] = sprintf(
236
-            __('%1$sWe\'re sorry, but you\'re registration time has expired.%2$s%4$sIf you still wish to complete your registration, please return to the %5$sEvent List%6$sEvent List%7$s and reselect your tickets if available. Please except our apologies for any inconvenience this may have caused.%8$s',
237
-                'event_espresso'),
238
-            '<h4 class="important-notice">',
239
-            '</h4>',
240
-            '<br />',
241
-            '<p>',
242
-            '<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
243
-            '">',
244
-            '</a>',
245
-            '</p>'
246
-        );
247
-    }
248
-
249
-
250
-
251
-    /**
252
-     * load_reg_steps
253
-     * loads and instantiates each reg step based on the EE_Registry::instance()->CFG->registration->reg_steps array
254
-     *
255
-     * @access    private
256
-     * @throws EE_Error
257
-     */
258
-    public static function load_reg_steps()
259
-    {
260
-        static $reg_steps_loaded = false;
261
-        if ($reg_steps_loaded) {
262
-            return;
263
-        }
264
-        // filter list of reg_steps
265
-        $reg_steps_to_load = (array)apply_filters(
266
-            'AHEE__SPCO__load_reg_steps__reg_steps_to_load',
267
-            EED_Single_Page_Checkout::get_reg_steps()
268
-        );
269
-        // sort by key (order)
270
-        ksort($reg_steps_to_load);
271
-        // loop through folders
272
-        foreach ($reg_steps_to_load as $order => $reg_step) {
273
-            // we need a
274
-            if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
275
-                // copy over to the reg_steps_array
276
-                EED_Single_Page_Checkout::$_reg_steps_array[$order] = $reg_step;
277
-                // register custom key route for each reg step
278
-                // ie: step=>"slug" - this is the entire reason we load the reg steps array now
279
-                EE_Config::register_route(
280
-                    $reg_step['slug'],
281
-                    'EED_Single_Page_Checkout',
282
-                    'run',
283
-                    'step'
284
-                );
285
-                // add AJAX or other hooks
286
-                if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) {
287
-                    // setup autoloaders if necessary
288
-                    if ( ! class_exists($reg_step['class_name'])) {
289
-                        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(
290
-                            $reg_step['file_path'],
291
-                            true
292
-                        );
293
-                    }
294
-                    if (is_callable($reg_step['class_name'], 'set_hooks')) {
295
-                        call_user_func(array($reg_step['class_name'], 'set_hooks'));
296
-                    }
297
-                }
298
-            }
299
-        }
300
-        $reg_steps_loaded = true;
301
-    }
302
-
303
-
304
-
305
-    /**
306
-     *    get_reg_steps
307
-     *
308
-     * @access    public
309
-     * @return    array
310
-     */
311
-    public static function get_reg_steps()
312
-    {
313
-        $reg_steps = EE_Registry::instance()->CFG->registration->reg_steps;
314
-        if (empty($reg_steps)) {
315
-            $reg_steps = array(
316
-                10  => array(
317
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'attendee_information',
318
-                    'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information',
319
-                    'slug'       => 'attendee_information',
320
-                    'has_hooks'  => false,
321
-                ),
322
-                20  => array(
323
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'registration_confirmation',
324
-                    'class_name' => 'EE_SPCO_Reg_Step_Registration_Confirmation',
325
-                    'slug'       => 'registration_confirmation',
326
-                    'has_hooks'  => false,
327
-                ),
328
-                30  => array(
329
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'payment_options',
330
-                    'class_name' => 'EE_SPCO_Reg_Step_Payment_Options',
331
-                    'slug'       => 'payment_options',
332
-                    'has_hooks'  => true,
333
-                ),
334
-                999 => array(
335
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'finalize_registration',
336
-                    'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration',
337
-                    'slug'       => 'finalize_registration',
338
-                    'has_hooks'  => false,
339
-                ),
340
-            );
341
-        }
342
-        return $reg_steps;
343
-    }
344
-
345
-
346
-
347
-    /**
348
-     *    registration_checkout_for_admin
349
-     *
350
-     * @access    public
351
-     * @return    string
352
-     * @throws EE_Error
353
-     */
354
-    public static function registration_checkout_for_admin()
355
-    {
356
-        EED_Single_Page_Checkout::load_request_handler();
357
-        EE_Registry::instance()->REQ->set('step', 'attendee_information');
358
-        EE_Registry::instance()->REQ->set('action', 'display_spco_reg_step');
359
-        EE_Registry::instance()->REQ->set('process_form_submission', false);
360
-        EED_Single_Page_Checkout::instance()->_initialize();
361
-        EED_Single_Page_Checkout::instance()->_display_spco_reg_form();
362
-        return EE_Registry::instance()->REQ->get_output();
363
-    }
364
-
365
-
366
-
367
-    /**
368
-     * process_registration_from_admin
369
-     *
370
-     * @access public
371
-     * @return \EE_Transaction
372
-     * @throws EE_Error
373
-     */
374
-    public static function process_registration_from_admin()
375
-    {
376
-        EED_Single_Page_Checkout::load_request_handler();
377
-        EE_Registry::instance()->REQ->set('step', 'attendee_information');
378
-        EE_Registry::instance()->REQ->set('action', 'process_reg_step');
379
-        EE_Registry::instance()->REQ->set('process_form_submission', true);
380
-        EED_Single_Page_Checkout::instance()->_initialize();
381
-        if (EED_Single_Page_Checkout::instance()->checkout->current_step->completed()) {
382
-            $final_reg_step = end(EED_Single_Page_Checkout::instance()->checkout->reg_steps);
383
-            if ($final_reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) {
384
-                EED_Single_Page_Checkout::instance()->checkout->set_reg_step_initiated($final_reg_step);
385
-                if ($final_reg_step->process_reg_step()) {
386
-                    $final_reg_step->set_completed();
387
-                    EED_Single_Page_Checkout::instance()->checkout->update_txn_reg_steps_array();
388
-                    return EED_Single_Page_Checkout::instance()->checkout->transaction;
389
-                }
390
-            }
391
-        }
392
-        return null;
393
-    }
394
-
395
-
396
-
397
-    /**
398
-     *    run
399
-     *
400
-     * @access    public
401
-     * @param WP_Query $WP_Query
402
-     * @return    void
403
-     * @throws EE_Error
404
-     */
405
-    public function run($WP_Query)
406
-    {
407
-        if (
408
-            $WP_Query instanceof WP_Query
409
-            && $WP_Query->is_main_query()
410
-            && apply_filters('FHEE__EED_Single_Page_Checkout__run', true)
411
-            && $this->_is_reg_checkout()
412
-        ) {
413
-            $this->_initialize();
414
-        }
415
-    }
416
-
417
-
418
-
419
-    /**
420
-     * determines whether current url matches reg page url
421
-     *
422
-     * @return bool
423
-     */
424
-    protected function _is_reg_checkout()
425
-    {
426
-        // get current permalink for reg page without any extra query args
427
-        $reg_page_url = \get_permalink(EE_Config::instance()->core->reg_page_id);
428
-        // get request URI for current request, but without the scheme or host
429
-        $current_request_uri = \EEH_URL::filter_input_server_url('REQUEST_URI');
430
-        $current_request_uri = html_entity_decode($current_request_uri);
431
-        // get array of query args from the current request URI
432
-        $query_args = \EEH_URL::get_query_string($current_request_uri);
433
-        // grab page id if it is set
434
-        $page_id = isset($query_args['page_id']) ? absint($query_args['page_id']) : 0;
435
-        // and remove the page id from the query args (we will re-add it later)
436
-        unset($query_args['page_id']);
437
-        // now strip all query args from current request URI
438
-        $current_request_uri = remove_query_arg(array_keys($query_args), $current_request_uri);
439
-        // and re-add the page id if it was set
440
-        if ($page_id) {
441
-            $current_request_uri = add_query_arg('page_id', $page_id, $current_request_uri);
442
-        }
443
-        // remove slashes and ?
444
-        $current_request_uri = trim($current_request_uri, '?/');
445
-        // is current request URI part of the known full reg page URL ?
446
-        return ! empty($current_request_uri) && strpos($reg_page_url, $current_request_uri) !== false;
447
-    }
448
-
449
-
450
-
451
-    /**
452
-     * @param WP_Query $wp_query
453
-     * @return    void
454
-     * @throws EE_Error
455
-     */
456
-    public static function init($wp_query)
457
-    {
458
-        EED_Single_Page_Checkout::instance()->run($wp_query);
459
-    }
460
-
461
-
462
-
463
-    /**
464
-     *    _initialize - initial module setup
465
-     *
466
-     * @access    private
467
-     * @throws EE_Error
468
-     * @return    void
469
-     */
470
-    private function _initialize()
471
-    {
472
-        // ensure SPCO doesn't run twice
473
-        if (EED_Single_Page_Checkout::$_initialized) {
474
-            return;
475
-        }
476
-        try {
477
-            EED_Single_Page_Checkout::load_reg_steps();
478
-            $this->_verify_session();
479
-            // setup the EE_Checkout object
480
-            $this->checkout = $this->_initialize_checkout();
481
-            // filter checkout
482
-            $this->checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize__checkout', $this->checkout);
483
-            // get the $_GET
484
-            $this->_get_request_vars();
485
-            if ($this->_block_bots()) {
486
-                return;
487
-            }
488
-            // filter continue_reg
489
-            $this->checkout->continue_reg = apply_filters(
490
-                'FHEE__EED_Single_Page_Checkout__init___continue_reg',
491
-                true,
492
-                $this->checkout
493
-            );
494
-            // load the reg steps array
495
-            if ( ! $this->_load_and_instantiate_reg_steps()) {
496
-                EED_Single_Page_Checkout::$_initialized = true;
497
-                return;
498
-            }
499
-            // set the current step
500
-            $this->checkout->set_current_step($this->checkout->step);
501
-            // and the next step
502
-            $this->checkout->set_next_step();
503
-            // verify that everything has been setup correctly
504
-            if ( ! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) {
505
-                EED_Single_Page_Checkout::$_initialized = true;
506
-                return;
507
-            }
508
-            // lock the transaction
509
-            $this->checkout->transaction->lock();
510
-            // make sure all of our cached objects are added to their respective model entity mappers
511
-            $this->checkout->refresh_all_entities();
512
-            // set amount owing
513
-            $this->checkout->amount_owing = $this->checkout->transaction->remaining();
514
-            // initialize each reg step, which gives them the chance to potentially alter the process
515
-            $this->_initialize_reg_steps();
516
-            // DEBUG LOG
517
-            //$this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
518
-            // get reg form
519
-            if( ! $this->_check_form_submission()) {
520
-                EED_Single_Page_Checkout::$_initialized = true;
521
-                return;
522
-            }
523
-            // checkout the action!!!
524
-            $this->_process_form_action();
525
-            // add some style and make it dance
526
-            $this->add_styles_and_scripts();
527
-            // kk... SPCO has successfully run
528
-            EED_Single_Page_Checkout::$_initialized = true;
529
-            // set no cache headers and constants
530
-            EE_System::do_not_cache();
531
-            // add anchor
532
-            add_action('loop_start', array($this, 'set_checkout_anchor'), 1);
533
-            // remove transaction lock
534
-            add_action('shutdown', array($this, 'unlock_transaction'), 1);
535
-        } catch (Exception $e) {
536
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
537
-        }
538
-    }
539
-
540
-
541
-
542
-    /**
543
-     *    _verify_session
544
-     * checks that the session is valid and not expired
545
-     *
546
-     * @access    private
547
-     * @throws EE_Error
548
-     */
549
-    private function _verify_session()
550
-    {
551
-        if ( ! EE_Registry::instance()->SSN instanceof EE_Session) {
552
-            throw new EE_Error(__('The EE_Session class could not be loaded.', 'event_espresso'));
553
-        }
554
-        // is session still valid ?
555
-        if (
556
-            EE_Registry::instance()->SSN->expired()
557
-            && EE_Registry::instance()->REQ->get('e_reg_url_link', '') === ''
558
-        ) {
559
-            $this->checkout = new EE_Checkout();
560
-            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
561
-            // EE_Registry::instance()->SSN->reset_cart();
562
-            // EE_Registry::instance()->SSN->reset_checkout();
563
-            // EE_Registry::instance()->SSN->reset_transaction();
564
-            EE_Error::add_attention(
565
-                EE_Registry::$i18n_js_strings['registration_expiration_notice'],
566
-                __FILE__, __FUNCTION__, __LINE__
567
-            );
568
-            // EE_Registry::instance()->SSN->reset_expired();
569
-        }
570
-    }
571
-
572
-
573
-
574
-    /**
575
-     *    _initialize_checkout
576
-     * loads and instantiates EE_Checkout
577
-     *
578
-     * @access    private
579
-     * @throws EE_Error
580
-     * @return EE_Checkout
581
-     */
582
-    private function _initialize_checkout()
583
-    {
584
-        // look in session for existing checkout
585
-        /** @type EE_Checkout $checkout */
586
-        $checkout = EE_Registry::instance()->SSN->checkout();
587
-        // verify
588
-        if ( ! $checkout instanceof EE_Checkout) {
589
-            // instantiate EE_Checkout object for handling the properties of the current checkout process
590
-            $checkout = EE_Registry::instance()->load_file(
591
-                SPCO_INC_PATH,
592
-                'EE_Checkout',
593
-                'class', array(),
594
-                false
595
-            );
596
-        } else {
597
-            if ($checkout->current_step->is_final_step() && $checkout->exit_spco() === true) {
598
-                $this->unlock_transaction();
599
-                wp_safe_redirect($checkout->redirect_url);
600
-                exit();
601
-            }
602
-        }
603
-        $checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout);
604
-        // verify again
605
-        if ( ! $checkout instanceof EE_Checkout) {
606
-            throw new EE_Error(__('The EE_Checkout class could not be loaded.', 'event_espresso'));
607
-        }
608
-        // reset anything that needs a clean slate for each request
609
-        $checkout->reset_for_current_request();
610
-        return $checkout;
611
-    }
612
-
613
-
614
-
615
-    /**
616
-     *    _get_request_vars
617
-     *
618
-     * @access    private
619
-     * @return    void
620
-     * @throws EE_Error
621
-     */
622
-    private function _get_request_vars()
623
-    {
624
-        // load classes
625
-        EED_Single_Page_Checkout::load_request_handler();
626
-        //make sure this request is marked as belonging to EE
627
-        EE_Registry::instance()->REQ->set_espresso_page(true);
628
-        // which step is being requested ?
629
-        $this->checkout->step = EE_Registry::instance()->REQ->get('step', $this->_get_first_step());
630
-        // which step is being edited ?
631
-        $this->checkout->edit_step = EE_Registry::instance()->REQ->get('edit_step', '');
632
-        // and what we're doing on the current step
633
-        $this->checkout->action = EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step');
634
-        // timestamp
635
-        $this->checkout->uts = EE_Registry::instance()->REQ->get('uts', 0);
636
-        // returning to edit ?
637
-        $this->checkout->reg_url_link = EE_Registry::instance()->REQ->get('e_reg_url_link', '');
638
-        // or some other kind of revisit ?
639
-        $this->checkout->revisit = filter_var(
640
-            EE_Registry::instance()->REQ->get('revisit', false),
641
-            FILTER_VALIDATE_BOOLEAN
642
-        );
643
-        // and whether or not to generate a reg form for this request
644
-        $this->checkout->generate_reg_form = filter_var(
645
-            EE_Registry::instance()->REQ->get('generate_reg_form', true),
646
-            FILTER_VALIDATE_BOOLEAN
647
-        );
648
-        // and whether or not to process a reg form submission for this request
649
-        $this->checkout->process_form_submission = filter_var(
650
-            EE_Registry::instance()->REQ->get(
651
-                'process_form_submission',
652
-                $this->checkout->action === 'process_reg_step'
653
-            ),
654
-            FILTER_VALIDATE_BOOLEAN
655
-        );
656
-        $this->checkout->process_form_submission = filter_var(
657
-            $this->checkout->action !== 'display_spco_reg_step'
658
-                ? $this->checkout->process_form_submission
659
-                : false,
660
-            FILTER_VALIDATE_BOOLEAN
661
-        );
662
-        // $this->_display_request_vars();
663
-    }
664
-
665
-
666
-
667
-    /**
668
-     *  _display_request_vars
669
-     *
670
-     * @access    protected
671
-     * @return    void
672
-     */
673
-    protected function _display_request_vars()
674
-    {
675
-        if ( ! WP_DEBUG) {
676
-            return;
677
-        }
678
-        EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__);
679
-        EEH_Debug_Tools::printr($this->checkout->step, '$this->checkout->step', __FILE__, __LINE__);
680
-        EEH_Debug_Tools::printr($this->checkout->edit_step, '$this->checkout->edit_step', __FILE__, __LINE__);
681
-        EEH_Debug_Tools::printr($this->checkout->action, '$this->checkout->action', __FILE__, __LINE__);
682
-        EEH_Debug_Tools::printr($this->checkout->reg_url_link, '$this->checkout->reg_url_link', __FILE__, __LINE__);
683
-        EEH_Debug_Tools::printr($this->checkout->revisit, '$this->checkout->revisit', __FILE__, __LINE__);
684
-        EEH_Debug_Tools::printr($this->checkout->generate_reg_form, '$this->checkout->generate_reg_form', __FILE__, __LINE__);
685
-        EEH_Debug_Tools::printr($this->checkout->process_form_submission, '$this->checkout->process_form_submission', __FILE__, __LINE__);
686
-    }
687
-
688
-
689
-
690
-    /**
691
-     * _block_bots
692
-     * checks that the incoming request has either of the following set:
693
-     *  a uts (unix timestamp) which indicates that the request was redirected from the Ticket Selector
694
-     *  a REG URL Link, which indicates that the request is a return visit to SPCO for a valid TXN
695
-     * so if you're not coming from the Ticket Selector nor returning for a valid IP...
696
-     * then where you coming from man?
697
-     *
698
-     * @return boolean
699
-     */
700
-    private function _block_bots()
701
-    {
702
-        $invalid_checkout_access = EED_Invalid_Checkout_Access::getInvalidCheckoutAccess();
703
-        if ($invalid_checkout_access->checkoutAccessIsInvalid($this->checkout)) {
704
-            return true;
705
-        }
706
-        return false;
707
-    }
708
-
709
-
710
-
711
-    /**
712
-     *    _get_first_step
713
-     *  gets slug for first step in $_reg_steps_array
714
-     *
715
-     * @access    private
716
-     * @throws EE_Error
717
-     * @return    string
718
-     */
719
-    private function _get_first_step()
720
-    {
721
-        $first_step = reset(EED_Single_Page_Checkout::$_reg_steps_array);
722
-        return isset($first_step['slug']) ? $first_step['slug'] : 'attendee_information';
723
-    }
724
-
725
-
726
-
727
-    /**
728
-     *    _load_and_instantiate_reg_steps
729
-     *  instantiates each reg step based on the loaded reg_steps array
730
-     *
731
-     * @access    private
732
-     * @throws EE_Error
733
-     * @return    bool
734
-     */
735
-    private function _load_and_instantiate_reg_steps()
736
-    {
737
-        do_action('AHEE__Single_Page_Checkout___load_and_instantiate_reg_steps__start', $this->checkout);
738
-        // have reg_steps already been instantiated ?
739
-        if (
740
-            empty($this->checkout->reg_steps)
741
-            || apply_filters('FHEE__Single_Page_Checkout__load_reg_steps__reload_reg_steps', false, $this->checkout)
742
-        ) {
743
-            // if not, then loop through raw reg steps array
744
-            foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) {
745
-                if ( ! $this->_load_and_instantiate_reg_step($reg_step, $order)) {
746
-                    return false;
747
-                }
748
-            }
749
-            EE_Registry::instance()->CFG->registration->skip_reg_confirmation = true;
750
-            EE_Registry::instance()->CFG->registration->reg_confirmation_last = true;
751
-            // skip the registration_confirmation page ?
752
-            if (EE_Registry::instance()->CFG->registration->skip_reg_confirmation) {
753
-                // just remove it from the reg steps array
754
-                $this->checkout->remove_reg_step('registration_confirmation', false);
755
-            } else if (
756
-                isset($this->checkout->reg_steps['registration_confirmation'])
757
-                && EE_Registry::instance()->CFG->registration->reg_confirmation_last
758
-            ) {
759
-                // set the order to something big like 100
760
-                $this->checkout->set_reg_step_order('registration_confirmation', 100);
761
-            }
762
-            // filter the array for good luck
763
-            $this->checkout->reg_steps = apply_filters(
764
-                'FHEE__Single_Page_Checkout__load_reg_steps__reg_steps',
765
-                $this->checkout->reg_steps
766
-            );
767
-            // finally re-sort based on the reg step class order properties
768
-            $this->checkout->sort_reg_steps();
769
-        } else {
770
-            foreach ($this->checkout->reg_steps as $reg_step) {
771
-                // set all current step stati to FALSE
772
-                $reg_step->set_is_current_step(false);
773
-            }
774
-        }
775
-        if (empty($this->checkout->reg_steps)) {
776
-            EE_Error::add_error(
777
-                __('No Reg Steps were loaded..', 'event_espresso'),
778
-                __FILE__, __FUNCTION__, __LINE__
779
-            );
780
-            return false;
781
-        }
782
-        // make reg step details available to JS
783
-        $this->checkout->set_reg_step_JSON_info();
784
-        return true;
785
-    }
786
-
787
-
788
-
789
-    /**
790
-     *     _load_and_instantiate_reg_step
791
-     *
792
-     * @access    private
793
-     * @param array $reg_step
794
-     * @param int   $order
795
-     * @return bool
796
-     */
797
-    private function _load_and_instantiate_reg_step($reg_step = array(), $order = 0)
798
-    {
799
-        // we need a file_path, class_name, and slug to add a reg step
800
-        if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
801
-            // if editing a specific step, but this is NOT that step... (and it's not the 'finalize_registration' step)
802
-            if (
803
-                $this->checkout->reg_url_link
804
-                && $this->checkout->step !== $reg_step['slug']
805
-                && $reg_step['slug'] !== 'finalize_registration'
806
-                // normally at this point we would NOT load the reg step, but this filter can change that
807
-                && apply_filters(
808
-                    'FHEE__Single_Page_Checkout___load_and_instantiate_reg_step__bypass_reg_step',
809
-                    true,
810
-                    $reg_step,
811
-                    $this->checkout
812
-                )
813
-            ) {
814
-                return true;
815
-            }
816
-            // instantiate step class using file path and class name
817
-            $reg_step_obj = EE_Registry::instance()->load_file(
818
-                $reg_step['file_path'],
819
-                $reg_step['class_name'],
820
-                'class',
821
-                $this->checkout,
822
-                false
823
-            );
824
-            // did we gets the goods ?
825
-            if ($reg_step_obj instanceof EE_SPCO_Reg_Step) {
826
-                // set reg step order based on config
827
-                $reg_step_obj->set_order($order);
828
-                // add instantiated reg step object to the master reg steps array
829
-                $this->checkout->add_reg_step($reg_step_obj);
830
-            } else {
831
-                EE_Error::add_error(
832
-                    __('The current step could not be set.', 'event_espresso'),
833
-                    __FILE__, __FUNCTION__, __LINE__
834
-                );
835
-                return false;
836
-            }
837
-        } else {
838
-            if (WP_DEBUG) {
839
-                EE_Error::add_error(
840
-                    sprintf(
841
-                        __(
842
-                            'A registration step could not be loaded. One or more of the following data points is invalid:%4$s%5$sFile Path: %1$s%6$s%5$sClass Name: %2$s%6$s%5$sSlug: %3$s%6$s%7$s',
843
-                            'event_espresso'
844
-                        ),
845
-                        isset($reg_step['file_path']) ? $reg_step['file_path'] : '',
846
-                        isset($reg_step['class_name']) ? $reg_step['class_name'] : '',
847
-                        isset($reg_step['slug']) ? $reg_step['slug'] : '',
848
-                        '<ul>',
849
-                        '<li>',
850
-                        '</li>',
851
-                        '</ul>'
852
-                    ),
853
-                    __FILE__, __FUNCTION__, __LINE__
854
-                );
855
-            }
856
-            return false;
857
-        }
858
-        return true;
859
-    }
860
-
861
-
862
-    /**
863
-     * _verify_transaction_and_get_registrations
864
-     *
865
-     * @access private
866
-     * @return bool
867
-     * @throws InvalidDataTypeException
868
-     * @throws InvalidEntityException
869
-     * @throws EE_Error
870
-     */
871
-    private function _verify_transaction_and_get_registrations()
872
-    {
873
-        // was there already a valid transaction in the checkout from the session ?
874
-        if ( ! $this->checkout->transaction instanceof EE_Transaction) {
875
-            // get transaction from db or session
876
-            $this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin()
877
-                ? $this->_get_transaction_and_cart_for_previous_visit()
878
-                : $this->_get_cart_for_current_session_and_setup_new_transaction();
879
-            if ( ! $this->checkout->transaction instanceof EE_Transaction) {
880
-                EE_Error::add_error(
881
-                    __('Your Registration and Transaction information could not be retrieved from the db.',
882
-                        'event_espresso'),
883
-                    __FILE__, __FUNCTION__, __LINE__
884
-                );
885
-                $this->checkout->transaction = EE_Transaction::new_instance();
886
-                // add some style and make it dance
887
-                $this->add_styles_and_scripts();
888
-                EED_Single_Page_Checkout::$_initialized = true;
889
-                return false;
890
-            }
891
-            // and the registrations for the transaction
892
-            $this->_get_registrations($this->checkout->transaction);
893
-        }
894
-        return true;
895
-    }
896
-
897
-
898
-
899
-    /**
900
-     * _get_transaction_and_cart_for_previous_visit
901
-     *
902
-     * @access private
903
-     * @return mixed EE_Transaction|NULL
904
-     */
905
-    private function _get_transaction_and_cart_for_previous_visit()
906
-    {
907
-        /** @var $TXN_model EEM_Transaction */
908
-        $TXN_model = EE_Registry::instance()->load_model('Transaction');
909
-        // because the reg_url_link is present in the request,
910
-        // this is a return visit to SPCO, so we'll get the transaction data from the db
911
-        $transaction = $TXN_model->get_transaction_from_reg_url_link($this->checkout->reg_url_link);
912
-        // verify transaction
913
-        if ($transaction instanceof EE_Transaction) {
914
-            // and get the cart that was used for that transaction
915
-            $this->checkout->cart = $this->_get_cart_for_transaction($transaction);
916
-            return $transaction;
917
-        }
918
-        EE_Error::add_error(
919
-            __('Your Registration and Transaction information could not be retrieved from the db.', 'event_espresso'),
920
-            __FILE__, __FUNCTION__, __LINE__
921
-        );
922
-        return null;
923
-
924
-    }
925
-
926
-
927
-
928
-    /**
929
-     * _get_cart_for_transaction
930
-     *
931
-     * @access private
932
-     * @param EE_Transaction $transaction
933
-     * @return EE_Cart
934
-     */
935
-    private function _get_cart_for_transaction($transaction)
936
-    {
937
-        return $this->checkout->get_cart_for_transaction($transaction);
938
-    }
939
-
940
-
941
-
942
-    /**
943
-     * get_cart_for_transaction
944
-     *
945
-     * @access public
946
-     * @param EE_Transaction $transaction
947
-     * @return EE_Cart
948
-     */
949
-    public function get_cart_for_transaction(EE_Transaction $transaction)
950
-    {
951
-        return $this->checkout->get_cart_for_transaction($transaction);
952
-    }
953
-
954
-
955
-
956
-    /**
957
-     * _get_transaction_and_cart_for_current_session
958
-     *    generates a new EE_Transaction object and adds it to the $_transaction property.
959
-     *
960
-     * @access private
961
-     * @return EE_Transaction
962
-     * @throws EE_Error
963
-     */
964
-    private function _get_cart_for_current_session_and_setup_new_transaction()
965
-    {
966
-        //  if there's no transaction, then this is the FIRST visit to SPCO
967
-        // so load up the cart ( passing nothing for the TXN because it doesn't exist yet )
968
-        $this->checkout->cart = $this->_get_cart_for_transaction(null);
969
-        // and then create a new transaction
970
-        $transaction = $this->_initialize_transaction();
971
-        // verify transaction
972
-        if ($transaction instanceof EE_Transaction) {
973
-            // save it so that we have an ID for other objects to use
974
-            $transaction->save();
975
-            // and save TXN data to the cart
976
-            $this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn($transaction->ID());
977
-        } else {
978
-            EE_Error::add_error(
979
-                __('A Valid Transaction could not be initialized.', 'event_espresso'),
980
-                __FILE__, __FUNCTION__, __LINE__
981
-            );
982
-        }
983
-        return $transaction;
984
-    }
985
-
986
-
987
-
988
-    /**
989
-     *    generates a new EE_Transaction object and adds it to the $_transaction property.
990
-     *
991
-     * @access private
992
-     * @return mixed EE_Transaction|NULL
993
-     */
994
-    private function _initialize_transaction()
995
-    {
996
-        try {
997
-            // ensure cart totals have been calculated
998
-            $this->checkout->cart->get_grand_total()->recalculate_total_including_taxes();
999
-            // grab the cart grand total
1000
-            $cart_total = $this->checkout->cart->get_cart_grand_total();
1001
-            // create new TXN
1002
-            $transaction = EE_Transaction::new_instance(
1003
-                array(
1004
-                    'TXN_reg_steps' => $this->checkout->initialize_txn_reg_steps_array(),
1005
-                    'TXN_total'     => $cart_total > 0 ? $cart_total : 0,
1006
-                    'TXN_paid'      => 0,
1007
-                    'STS_ID'        => EEM_Transaction::failed_status_code,
1008
-                )
1009
-            );
1010
-            // save it so that we have an ID for other objects to use
1011
-            $transaction->save();
1012
-            // set cron job for following up on TXNs after their session has expired
1013
-            EE_Cron_Tasks::schedule_expired_transaction_check(
1014
-                EE_Registry::instance()->SSN->expiration() + 1,
1015
-                $transaction->ID()
1016
-            );
1017
-            return $transaction;
1018
-        } catch (Exception $e) {
1019
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
1020
-        }
1021
-        return null;
1022
-    }
1023
-
1024
-
1025
-    /**
1026
-     * _get_registrations
1027
-     *
1028
-     * @access private
1029
-     * @param EE_Transaction $transaction
1030
-     * @return void
1031
-     * @throws InvalidDataTypeException
1032
-     * @throws InvalidEntityException
1033
-     * @throws EE_Error
1034
-     */
1035
-    private function _get_registrations(EE_Transaction $transaction)
1036
-    {
1037
-        // first step: grab the registrants  { : o
1038
-        $registrations = $transaction->registrations($this->checkout->reg_cache_where_params, true);
1039
-        // verify registrations have been set
1040
-        if (empty($registrations)) {
1041
-            // if no cached registrations, then check the db
1042
-            $registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false);
1043
-            // still nothing ? well as long as this isn't a revisit
1044
-            if (empty($registrations) && ! $this->checkout->revisit) {
1045
-                // generate new registrations from scratch
1046
-                $registrations = $this->_initialize_registrations($transaction);
1047
-            }
1048
-        }
1049
-        // sort by their original registration order
1050
-        usort($registrations, array('EED_Single_Page_Checkout', 'sort_registrations_by_REG_count'));
1051
-        // then loop thru the array
1052
-        foreach ($registrations as $registration) {
1053
-            // verify each registration
1054
-            if ($registration instanceof EE_Registration) {
1055
-                // we display all attendee info for the primary registrant
1056
-                if ($this->checkout->reg_url_link === $registration->reg_url_link()
1057
-                    && $registration->is_primary_registrant()
1058
-                ) {
1059
-                    $this->checkout->primary_revisit = true;
1060
-                    break;
1061
-                }
1062
-                if ($this->checkout->revisit
1063
-                           && $this->checkout->reg_url_link !== $registration->reg_url_link()
1064
-                ) {
1065
-                    // but hide info if it doesn't belong to you
1066
-                    $transaction->clear_cache('Registration', $registration->ID());
1067
-                }
1068
-                $this->checkout->set_reg_status_updated($registration->ID(), false);
1069
-            }
1070
-        }
1071
-    }
1072
-
1073
-
1074
-    /**
1075
-     *    adds related EE_Registration objects for each ticket in the cart to the current EE_Transaction object
1076
-     *
1077
-     * @access private
1078
-     * @param EE_Transaction $transaction
1079
-     * @return    array
1080
-     * @throws InvalidDataTypeException
1081
-     * @throws InvalidEntityException
1082
-     * @throws EE_Error
1083
-     */
1084
-    private function _initialize_registrations(EE_Transaction $transaction)
1085
-    {
1086
-        $att_nmbr = 0;
1087
-        $registrations = array();
1088
-        if ($transaction instanceof EE_Transaction) {
1089
-            /** @type EE_Registration_Processor $registration_processor */
1090
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
1091
-            $this->checkout->total_ticket_count = $this->checkout->cart->all_ticket_quantity_count();
1092
-            // now let's add the cart items to the $transaction
1093
-            foreach ($this->checkout->cart->get_tickets() as $line_item) {
1094
-                //do the following for each ticket of this type they selected
1095
-                for ($x = 1; $x <= $line_item->quantity(); $x++) {
1096
-                    $att_nmbr++;
1097
-                    /** @var EventEspresso\core\services\commands\registration\CreateRegistrationCommand $CreateRegistrationCommand */
1098
-                    $CreateRegistrationCommand = EE_Registry::instance()->create(
1099
-                        'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
1100
-                        array(
1101
-                            $transaction,
1102
-                            $line_item,
1103
-                            $att_nmbr,
1104
-                            $this->checkout->total_ticket_count,
1105
-                        )
1106
-                    );
1107
-                    // override capabilities for frontend registrations
1108
-                    if ( ! is_admin()) {
1109
-                        $CreateRegistrationCommand->setCapCheck(
1110
-                            new PublicCapabilities('', 'create_new_registration')
1111
-                        );
1112
-                    }
1113
-                    $registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand);
1114
-                    if ( ! $registration instanceof EE_Registration) {
1115
-                        throw new InvalidEntityException($registration, 'EE_Registration');
1116
-                    }
1117
-                    $registrations[ $registration->ID() ] = $registration;
1118
-                }
1119
-            }
1120
-            $registration_processor->fix_reg_final_price_rounding_issue($transaction);
1121
-        }
1122
-        return $registrations;
1123
-    }
1124
-
1125
-
1126
-
1127
-    /**
1128
-     * sorts registrations by REG_count
1129
-     *
1130
-     * @access public
1131
-     * @param EE_Registration $reg_A
1132
-     * @param EE_Registration $reg_B
1133
-     * @return int
1134
-     */
1135
-    public static function sort_registrations_by_REG_count(EE_Registration $reg_A, EE_Registration $reg_B)
1136
-    {
1137
-        // this shouldn't ever happen within the same TXN, but oh well
1138
-        if ($reg_A->count() === $reg_B->count()) {
1139
-            return 0;
1140
-        }
1141
-        return ($reg_A->count() > $reg_B->count()) ? 1 : -1;
1142
-    }
1143
-
1144
-
1145
-
1146
-    /**
1147
-     *    _final_verifications
1148
-     * just makes sure that everything is set up correctly before proceeding
1149
-     *
1150
-     * @access    private
1151
-     * @return    bool
1152
-     * @throws EE_Error
1153
-     */
1154
-    private function _final_verifications()
1155
-    {
1156
-        // filter checkout
1157
-        $this->checkout = apply_filters(
1158
-            'FHEE__EED_Single_Page_Checkout___final_verifications__checkout',
1159
-            $this->checkout
1160
-        );
1161
-        //verify that current step is still set correctly
1162
-        if ( ! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) {
1163
-            EE_Error::add_error(
1164
-                __('We\'re sorry but the registration process can not proceed because one or more registration steps were not setup correctly. Please refresh the page and try again or contact support.', 'event_espresso'),
1165
-                __FILE__,
1166
-                __FUNCTION__,
1167
-                __LINE__
1168
-            );
1169
-            return false;
1170
-        }
1171
-        // if returning to SPCO, then verify that primary registrant is set
1172
-        if ( ! empty($this->checkout->reg_url_link)) {
1173
-            $valid_registrant = $this->checkout->transaction->primary_registration();
1174
-            if ( ! $valid_registrant instanceof EE_Registration) {
1175
-                EE_Error::add_error(
1176
-                    __('We\'re sorry but there appears to be an error with the "reg_url_link" or the primary registrant for this transaction. Please refresh the page and try again or contact support.', 'event_espresso'),
1177
-                    __FILE__,
1178
-                    __FUNCTION__,
1179
-                    __LINE__
1180
-                );
1181
-                return false;
1182
-            }
1183
-            $valid_registrant = null;
1184
-            foreach (
1185
-                $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params) as $registration
1186
-            ) {
1187
-                if (
1188
-                    $registration instanceof EE_Registration
1189
-                    && $registration->reg_url_link() === $this->checkout->reg_url_link
1190
-                ) {
1191
-                    $valid_registrant = $registration;
1192
-                }
1193
-            }
1194
-            if ( ! $valid_registrant instanceof EE_Registration) {
1195
-                // hmmm... maybe we have the wrong session because the user is opening multiple tabs ?
1196
-                if (EED_Single_Page_Checkout::$_checkout_verified) {
1197
-                    // clear the session, mark the checkout as unverified, and try again
1198
-                    EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
1199
-                    EED_Single_Page_Checkout::$_initialized = false;
1200
-                    EED_Single_Page_Checkout::$_checkout_verified = false;
1201
-                    $this->_initialize();
1202
-                    EE_Error::reset_notices();
1203
-                    return false;
1204
-                }
1205
-                EE_Error::add_error(
1206
-                    __(
1207
-                        'We\'re sorry but there appears to be an error with the "reg_url_link" or the transaction itself. Please refresh the page and try again or contact support.',
1208
-                        'event_espresso'
1209
-                    ),
1210
-                    __FILE__,
1211
-                    __FUNCTION__,
1212
-                    __LINE__
1213
-                );
1214
-                return false;
1215
-            }
1216
-        }
1217
-        // now that things have been kinda sufficiently verified,
1218
-        // let's add the checkout to the session so that it's available to other systems
1219
-        EE_Registry::instance()->SSN->set_checkout($this->checkout);
1220
-        return true;
1221
-    }
1222
-
1223
-
1224
-
1225
-    /**
1226
-     *    _initialize_reg_steps
1227
-     * first makes sure that EE_Transaction_Processor::set_reg_step_initiated() is called as required
1228
-     * then loops thru all of the active reg steps and calls the initialize_reg_step() method
1229
-     *
1230
-     * @access    private
1231
-     * @param bool $reinitializing
1232
-     * @throws EE_Error
1233
-     */
1234
-    private function _initialize_reg_steps($reinitializing = false)
1235
-    {
1236
-        $this->checkout->set_reg_step_initiated($this->checkout->current_step);
1237
-        // loop thru all steps to call their individual "initialize" methods and set i18n strings for JS
1238
-        foreach ($this->checkout->reg_steps as $reg_step) {
1239
-            if ( ! $reg_step->initialize_reg_step()) {
1240
-                // if not initialized then maybe this step is being removed...
1241
-                if ( ! $reinitializing && $reg_step->is_current_step()) {
1242
-                    // if it was the current step, then we need to start over here
1243
-                    $this->_initialize_reg_steps(true);
1244
-                    return;
1245
-                }
1246
-                continue;
1247
-            }
1248
-            // add css and JS for current step
1249
-            $reg_step->enqueue_styles_and_scripts();
1250
-            // i18n
1251
-            $reg_step->translate_js_strings();
1252
-            if ($reg_step->is_current_step()) {
1253
-                // the text that appears on the reg step form submit button
1254
-                $reg_step->set_submit_button_text();
1255
-            }
1256
-        }
1257
-        // dynamically creates hook point like: AHEE__Single_Page_Checkout___initialize_reg_step__attendee_information
1258
-        do_action(
1259
-            "AHEE__Single_Page_Checkout___initialize_reg_step__{$this->checkout->current_step->slug()}",
1260
-            $this->checkout->current_step
1261
-        );
1262
-    }
1263
-
1264
-
1265
-
1266
-    /**
1267
-     * _check_form_submission
1268
-     *
1269
-     * @access private
1270
-     * @return boolean
1271
-     */
1272
-    private function _check_form_submission()
1273
-    {
1274
-        //does this request require the reg form to be generated ?
1275
-        if ($this->checkout->generate_reg_form) {
1276
-            // ever heard that song by Blue Rodeo ?
1277
-            try {
1278
-                $this->checkout->current_step->reg_form = $this->checkout->current_step->generate_reg_form();
1279
-                // if not displaying a form, then check for form submission
1280
-                if (
1281
-                    $this->checkout->process_form_submission
1282
-                    && $this->checkout->current_step->reg_form->was_submitted()
1283
-                ) {
1284
-                    // clear out any old data in case this step is being run again
1285
-                    $this->checkout->current_step->set_valid_data(array());
1286
-                    // capture submitted form data
1287
-                    $this->checkout->current_step->reg_form->receive_form_submission(
1288
-                        apply_filters(
1289
-                            'FHEE__Single_Page_Checkout___check_form_submission__request_params',
1290
-                            EE_Registry::instance()->REQ->params(),
1291
-                            $this->checkout
1292
-                        )
1293
-                    );
1294
-                    // validate submitted form data
1295
-                    if ( ! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) {
1296
-                        // thou shall not pass !!!
1297
-                        $this->checkout->continue_reg = false;
1298
-                        // any form validation errors?
1299
-                        if ($this->checkout->current_step->reg_form->submission_error_message() !== '') {
1300
-                            $submission_error_messages = array();
1301
-                            // bad, bad, bad registrant
1302
-                            foreach (
1303
-                                $this->checkout->current_step->reg_form->get_validation_errors_accumulated()
1304
-                                as $validation_error
1305
-                            ) {
1306
-                                if ($validation_error instanceof EE_Validation_Error) {
1307
-                                    $submission_error_messages[] = sprintf(
1308
-                                        __('%s : %s', 'event_espresso'),
1309
-                                        $validation_error->get_form_section()->html_label_text(),
1310
-                                        $validation_error->getMessage()
1311
-                                    );
1312
-                                }
1313
-                            }
1314
-                            EE_Error::add_error(
1315
-                                implode('<br />', $submission_error_messages),
1316
-                                __FILE__, __FUNCTION__, __LINE__
1317
-                            );
1318
-                        }
1319
-                        // well not really... what will happen is
1320
-                        // we'll just get redirected back to redo the current step
1321
-                        $this->go_to_next_step();
1322
-                        return false;
1323
-                    }
1324
-                }
1325
-            } catch (EE_Error $e) {
1326
-                $e->get_error();
1327
-            }
1328
-        }
1329
-        return true;
1330
-    }
1331
-
1332
-
1333
-
1334
-    /**
1335
-     * _process_action
1336
-     *
1337
-     * @access private
1338
-     * @return void
1339
-     * @throws EE_Error
1340
-     */
1341
-    private function _process_form_action()
1342
-    {
1343
-        // what cha wanna do?
1344
-        switch ($this->checkout->action) {
1345
-            // AJAX next step reg form
1346
-            case 'display_spco_reg_step' :
1347
-                $this->checkout->redirect = false;
1348
-                if (EE_Registry::instance()->REQ->ajax) {
1349
-                    $this->checkout->json_response->set_reg_step_html(
1350
-                        $this->checkout->current_step->display_reg_form()
1351
-                    );
1352
-                }
1353
-                break;
1354
-            default :
1355
-                // meh... do one of those other steps first
1356
-                if (
1357
-                    ! empty($this->checkout->action)
1358
-                    && is_callable(array($this->checkout->current_step, $this->checkout->action))
1359
-                ) {
1360
-                    // dynamically creates hook point like:
1361
-                    //   AHEE__Single_Page_Checkout__before_attendee_information__process_reg_step
1362
-                    do_action(
1363
-                        "AHEE__Single_Page_Checkout__before_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1364
-                        $this->checkout->current_step
1365
-                    );
1366
-                    // call action on current step
1367
-                    if (call_user_func(array($this->checkout->current_step, $this->checkout->action))) {
1368
-                        // good registrant, you get to proceed
1369
-                        if (
1370
-                            $this->checkout->current_step->success_message() !== ''
1371
-                            && apply_filters(
1372
-                                'FHEE__Single_Page_Checkout___process_form_action__display_success',
1373
-                                false
1374
-                            )
1375
-                        ) {
1376
-                            EE_Error::add_success(
1377
-                                $this->checkout->current_step->success_message()
1378
-                                . '<br />' . $this->checkout->next_step->_instructions()
1379
-                            );
1380
-                        }
1381
-                        // pack it up, pack it in...
1382
-                        $this->_setup_redirect();
1383
-                    }
1384
-                    // dynamically creates hook point like:
1385
-                    //  AHEE__Single_Page_Checkout__after_payment_options__process_reg_step
1386
-                    do_action(
1387
-                        "AHEE__Single_Page_Checkout__after_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1388
-                        $this->checkout->current_step
1389
-                    );
1390
-                } else {
1391
-                    EE_Error::add_error(
1392
-                        sprintf(
1393
-                            __(
1394
-                                'The requested form action "%s" does not exist for the current "%s" registration step.',
1395
-                                'event_espresso'
1396
-                            ),
1397
-                            $this->checkout->action,
1398
-                            $this->checkout->current_step->name()
1399
-                        ),
1400
-                        __FILE__,
1401
-                        __FUNCTION__,
1402
-                        __LINE__
1403
-                    );
1404
-                }
1405
-            // end default
1406
-        }
1407
-        // store our progress so far
1408
-        $this->checkout->stash_transaction_and_checkout();
1409
-        // advance to the next step! If you pass GO, collect $200
1410
-        $this->go_to_next_step();
1411
-    }
1412
-
1413
-
1414
-
1415
-    /**
1416
-     *        add_styles_and_scripts
1417
-     *
1418
-     * @access        public
1419
-     * @return        void
1420
-     */
1421
-    public function add_styles_and_scripts()
1422
-    {
1423
-        // i18n
1424
-        $this->translate_js_strings();
1425
-        if ($this->checkout->admin_request) {
1426
-            add_action('admin_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1427
-        } else {
1428
-            add_action('wp_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1429
-        }
1430
-    }
1431
-
1432
-
1433
-
1434
-    /**
1435
-     *        translate_js_strings
1436
-     *
1437
-     * @access        public
1438
-     * @return        void
1439
-     */
1440
-    public function translate_js_strings()
1441
-    {
1442
-        EE_Registry::$i18n_js_strings['revisit'] = $this->checkout->revisit;
1443
-        EE_Registry::$i18n_js_strings['e_reg_url_link'] = $this->checkout->reg_url_link;
1444
-        EE_Registry::$i18n_js_strings['server_error'] = __(
1445
-            'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.',
1446
-            'event_espresso'
1447
-        );
1448
-        EE_Registry::$i18n_js_strings['invalid_json_response'] = __(
1449
-            'An invalid response was returned from the server while attempting to process your request. Please refresh the page and try again or contact support.',
1450
-            'event_espresso'
1451
-        );
1452
-        EE_Registry::$i18n_js_strings['validation_error'] = __(
1453
-            'There appears to be a problem with the form validation configuration! Please check the admin settings or contact support.',
1454
-            'event_espresso'
1455
-        );
1456
-        EE_Registry::$i18n_js_strings['invalid_payment_method'] = __(
1457
-            'There appears to be a problem with the payment method configuration! Please refresh the page and try again or contact support.',
1458
-            'event_espresso'
1459
-        );
1460
-        EE_Registry::$i18n_js_strings['reg_step_error'] = __(
1461
-            'This registration step could not be completed. Please refresh the page and try again.',
1462
-            'event_espresso'
1463
-        );
1464
-        EE_Registry::$i18n_js_strings['invalid_coupon'] = __(
1465
-            'We\'re sorry but that coupon code does not appear to be valid. If this is incorrect, please contact the site administrator.',
1466
-            'event_espresso'
1467
-        );
1468
-        EE_Registry::$i18n_js_strings['process_registration'] = sprintf(
1469
-            __(
1470
-                'Please wait while we process your registration.%sDo not refresh the page or navigate away while this is happening.%sThank you for your patience.',
1471
-                'event_espresso'
1472
-            ),
1473
-            '<br/>',
1474
-            '<br/>'
1475
-        );
1476
-        EE_Registry::$i18n_js_strings['language'] = get_bloginfo('language');
1477
-        EE_Registry::$i18n_js_strings['EESID'] = EE_Registry::instance()->SSN->id();
1478
-        EE_Registry::$i18n_js_strings['currency'] = EE_Registry::instance()->CFG->currency;
1479
-        EE_Registry::$i18n_js_strings['datepicker_yearRange'] = '-150:+20';
1480
-        EE_Registry::$i18n_js_strings['timer_years'] = __('years', 'event_espresso');
1481
-        EE_Registry::$i18n_js_strings['timer_months'] = __('months', 'event_espresso');
1482
-        EE_Registry::$i18n_js_strings['timer_weeks'] = __('weeks', 'event_espresso');
1483
-        EE_Registry::$i18n_js_strings['timer_days'] = __('days', 'event_espresso');
1484
-        EE_Registry::$i18n_js_strings['timer_hours'] = __('hours', 'event_espresso');
1485
-        EE_Registry::$i18n_js_strings['timer_minutes'] = __('minutes', 'event_espresso');
1486
-        EE_Registry::$i18n_js_strings['timer_seconds'] = __('seconds', 'event_espresso');
1487
-        EE_Registry::$i18n_js_strings['timer_year'] = __('year', 'event_espresso');
1488
-        EE_Registry::$i18n_js_strings['timer_month'] = __('month', 'event_espresso');
1489
-        EE_Registry::$i18n_js_strings['timer_week'] = __('week', 'event_espresso');
1490
-        EE_Registry::$i18n_js_strings['timer_day'] = __('day', 'event_espresso');
1491
-        EE_Registry::$i18n_js_strings['timer_hour'] = __('hour', 'event_espresso');
1492
-        EE_Registry::$i18n_js_strings['timer_minute'] = __('minute', 'event_espresso');
1493
-        EE_Registry::$i18n_js_strings['timer_second'] = __('second', 'event_espresso');
1494
-        EE_Registry::$i18n_js_strings['registration_expiration_notice'] = sprintf(
1495
-            __(
1496
-                '%1$sWe\'re sorry, but your registration time has expired.%2$s%3$s%4$sIf you still wish to complete your registration, please return to the %5$sEvent List%6$sEvent List%7$s and reselect your tickets if available. Please except our apologies for any inconvenience this may have caused.%8$s',
1497
-                'event_espresso'
1498
-            ),
1499
-            '<h4 class="important-notice">',
1500
-            '</h4>',
1501
-            '<br />',
1502
-            '<p>',
1503
-            '<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
1504
-            '">',
1505
-            '</a>',
1506
-            '</p>'
1507
-        );
1508
-        EE_Registry::$i18n_js_strings['ajax_submit'] = apply_filters(
1509
-            'FHEE__Single_Page_Checkout__translate_js_strings__ajax_submit',
1510
-            true
1511
-        );
1512
-        EE_Registry::$i18n_js_strings['session_extension'] = absint(
1513
-            apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS)
1514
-        );
1515
-        EE_Registry::$i18n_js_strings['session_expiration'] = gmdate(
1516
-            'M d, Y H:i:s',
1517
-            EE_Registry::instance()->SSN->expiration() + (get_option('gmt_offset') * HOUR_IN_SECONDS)
1518
-        );
1519
-    }
1520
-
1521
-
1522
-
1523
-    /**
1524
-     *    enqueue_styles_and_scripts
1525
-     *
1526
-     * @access        public
1527
-     * @return        void
1528
-     * @throws EE_Error
1529
-     */
1530
-    public function enqueue_styles_and_scripts()
1531
-    {
1532
-        // load css
1533
-        wp_register_style(
1534
-            'single_page_checkout',
1535
-            SPCO_CSS_URL . 'single_page_checkout.css',
1536
-            array('espresso_default'),
1537
-            EVENT_ESPRESSO_VERSION
1538
-        );
1539
-        wp_enqueue_style('single_page_checkout');
1540
-        // load JS
1541
-        wp_register_script(
1542
-            'jquery_plugin',
1543
-            EE_THIRD_PARTY_URL . 'jquery	.plugin.min.js',
1544
-            array('jquery'),
1545
-            '1.0.1',
1546
-            true
1547
-        );
1548
-        wp_register_script(
1549
-            'jquery_countdown',
1550
-            EE_THIRD_PARTY_URL . 'jquery	.countdown.min.js',
1551
-            array('jquery_plugin'),
1552
-            '2.0.2',
1553
-            true
1554
-        );
1555
-        wp_register_script(
1556
-            'single_page_checkout',
1557
-            SPCO_JS_URL . 'single_page_checkout.js',
1558
-            array('espresso_core', 'underscore', 'ee_form_section_validation', 'jquery_countdown'),
1559
-            EVENT_ESPRESSO_VERSION,
1560
-            true
1561
-        );
1562
-        if ($this->checkout->registration_form instanceof EE_Form_Section_Proper) {
1563
-            $this->checkout->registration_form->enqueue_js();
1564
-        }
1565
-        if ($this->checkout->current_step->reg_form instanceof EE_Form_Section_Proper) {
1566
-            $this->checkout->current_step->reg_form->enqueue_js();
1567
-        }
1568
-        wp_enqueue_script('single_page_checkout');
1569
-        /**
1570
-         * global action hook for enqueueing styles and scripts with
1571
-         * spco calls.
1572
-         */
1573
-        do_action('AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts', $this);
1574
-        /**
1575
-         * dynamic action hook for enqueueing styles and scripts with spco calls.
1576
-         * The hook will end up being something like:
1577
-         *      AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information
1578
-         */
1579
-        do_action(
1580
-            'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(),
1581
-            $this
1582
-        );
1583
-    }
1584
-
1585
-
1586
-
1587
-    /**
1588
-     *    display the Registration Single Page Checkout Form
1589
-     *
1590
-     * @access    private
1591
-     * @return    void
1592
-     * @throws EE_Error
1593
-     */
1594
-    private function _display_spco_reg_form()
1595
-    {
1596
-        // if registering via the admin, just display the reg form for the current step
1597
-        if ($this->checkout->admin_request) {
1598
-            EE_Registry::instance()->REQ->add_output($this->checkout->current_step->display_reg_form());
1599
-        } else {
1600
-            // add powered by EE msg
1601
-            add_action('AHEE__SPCO__reg_form_footer', array('EED_Single_Page_Checkout', 'display_registration_footer'));
1602
-            $empty_cart = count(
1603
-                $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params)
1604
-            ) < 1;
1605
-            EE_Registry::$i18n_js_strings['empty_cart'] = $empty_cart;
1606
-            $cookies_not_set_msg = '';
1607
-            if ($empty_cart && ! isset($_COOKIE['ee_cookie_test'])) {
1608
-                $cookies_not_set_msg = apply_filters(
1609
-                    'FHEE__Single_Page_Checkout__display_spco_reg_form__cookies_not_set_msg',
1610
-                    sprintf(
1611
-                        __(
1612
-                            '%1$s%3$sIt appears your browser is not currently set to accept Cookies%4$s%5$sIn order to register for events, you need to enable cookies.%7$sIf you require assistance, then click the following link to learn how to %8$senable cookies%9$s%6$s%2$s',
1613
-                            'event_espresso'
1614
-                        ),
1615
-                        '<div class="ee-attention">',
1616
-                        '</div>',
1617
-                        '<h6 class="important-notice">',
1618
-                        '</h6>',
1619
-                        '<p>',
1620
-                        '</p>',
1621
-                        '<br />',
1622
-                        '<a href="http://www.whatarecookies.com/enable.asp" target="_blank">',
1623
-                        '</a>'
1624
-                    )
1625
-                );
1626
-            }
1627
-            $this->checkout->registration_form = new EE_Form_Section_Proper(
1628
-                array(
1629
-                    'name'            => 'single-page-checkout',
1630
-                    'html_id'         => 'ee-single-page-checkout-dv',
1631
-                    'layout_strategy' =>
1632
-                        new EE_Template_Layout(
1633
-                            array(
1634
-                                'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php',
1635
-                                'template_args'        => array(
1636
-                                    'empty_cart'              => $empty_cart,
1637
-                                    'revisit'                 => $this->checkout->revisit,
1638
-                                    'reg_steps'               => $this->checkout->reg_steps,
1639
-                                    'next_step'               => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
1640
-                                        ? $this->checkout->next_step->slug()
1641
-                                        : '',
1642
-                                    'cancel_page_url'         => $this->checkout->cancel_page_url,
1643
-                                    'empty_msg'               => apply_filters(
1644
-                                        'FHEE__Single_Page_Checkout__display_spco_reg_form__empty_msg',
1645
-                                        sprintf(
1646
-                                            __(
1647
-                                                'You need to %1$sReturn to Events list%2$sselect at least one event%3$s before you can proceed with the registration process.',
1648
-                                                'event_espresso'
1649
-                                            ),
1650
-                                            '<a href="'
1651
-                                            . get_post_type_archive_link('espresso_events')
1652
-                                            . '" title="',
1653
-                                            '">',
1654
-                                            '</a>'
1655
-                                        )
1656
-                                    ),
1657
-                                    'cookies_not_set_msg'     => $cookies_not_set_msg,
1658
-                                    'registration_time_limit' => $this->checkout->get_registration_time_limit(),
1659
-                                    'session_expiration'      => gmdate(
1660
-                                        'M d, Y H:i:s',
1661
-                                        EE_Registry::instance()->SSN->expiration()
1662
-                                        + (get_option('gmt_offset') * HOUR_IN_SECONDS)
1663
-                                    ),
1664
-                                ),
1665
-                            )
1666
-                        ),
1667
-                )
1668
-            );
1669
-            // load template and add to output sent that gets filtered into the_content()
1670
-            EE_Registry::instance()->REQ->add_output($this->checkout->registration_form->get_html());
1671
-        }
1672
-    }
1673
-
1674
-
1675
-
1676
-    /**
1677
-     *    add_extra_finalize_registration_inputs
1678
-     *
1679
-     * @access    public
1680
-     * @param $next_step
1681
-     * @internal  param string $label
1682
-     * @return void
1683
-     */
1684
-    public function add_extra_finalize_registration_inputs($next_step)
1685
-    {
1686
-        if ($next_step === 'finalize_registration') {
1687
-            echo '<div id="spco-extra-finalize_registration-inputs-dv"></div>';
1688
-        }
1689
-    }
1690
-
1691
-
1692
-
1693
-    /**
1694
-     *    display_registration_footer
1695
-     *
1696
-     * @access    public
1697
-     * @return    string
1698
-     */
1699
-    public static function display_registration_footer()
1700
-    {
1701
-        if (
1702
-        apply_filters(
1703
-            'FHEE__EE_Front__Controller__show_reg_footer',
1704
-            EE_Registry::instance()->CFG->admin->show_reg_footer
1705
-        )
1706
-        ) {
1707
-            add_filter(
1708
-                'FHEE__EEH_Template__powered_by_event_espresso__url',
1709
-                function ($url) {
1710
-                    return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url);
1711
-                }
1712
-            );
1713
-            echo apply_filters(
1714
-                'FHEE__EE_Front_Controller__display_registration_footer',
1715
-                \EEH_Template::powered_by_event_espresso(
1716
-                    '',
1717
-                    'espresso-registration-footer-dv',
1718
-                    array('utm_content' => 'registration_checkout')
1719
-                )
1720
-            );
1721
-        }
1722
-        return '';
1723
-    }
1724
-
1725
-
1726
-
1727
-    /**
1728
-     *    unlock_transaction
1729
-     *
1730
-     * @access    public
1731
-     * @return    void
1732
-     * @throws EE_Error
1733
-     */
1734
-    public function unlock_transaction()
1735
-    {
1736
-        if ($this->checkout->transaction instanceof EE_Transaction) {
1737
-            $this->checkout->transaction->unlock();
1738
-        }
1739
-    }
1740
-
1741
-
1742
-
1743
-    /**
1744
-     *        _setup_redirect
1745
-     *
1746
-     * @access    private
1747
-     * @return void
1748
-     */
1749
-    private function _setup_redirect()
1750
-    {
1751
-        if ($this->checkout->continue_reg && $this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
1752
-            $this->checkout->redirect = true;
1753
-            if (empty($this->checkout->redirect_url)) {
1754
-                $this->checkout->redirect_url = $this->checkout->next_step->reg_step_url();
1755
-            }
1756
-            $this->checkout->redirect_url = apply_filters(
1757
-                'FHEE__EED_Single_Page_Checkout___setup_redirect__checkout_redirect_url',
1758
-                $this->checkout->redirect_url,
1759
-                $this->checkout
1760
-            );
1761
-        }
1762
-    }
1763
-
1764
-
1765
-
1766
-    /**
1767
-     *   handle ajax message responses and redirects
1768
-     *
1769
-     * @access public
1770
-     * @return void
1771
-     * @throws EE_Error
1772
-     */
1773
-    public function go_to_next_step()
1774
-    {
1775
-        if (EE_Registry::instance()->REQ->ajax) {
1776
-            // capture contents of output buffer we started earlier in the request, and insert into JSON response
1777
-            $this->checkout->json_response->set_unexpected_errors(ob_get_clean());
1778
-        }
1779
-        $this->unlock_transaction();
1780
-        // just return for these conditions
1781
-        if (
1782
-            $this->checkout->admin_request
1783
-            || $this->checkout->action === 'redirect_form'
1784
-            || $this->checkout->action === 'update_checkout'
1785
-        ) {
1786
-            return;
1787
-        }
1788
-        // AJAX response
1789
-        $this->_handle_json_response();
1790
-        // redirect to next step or the Thank You page
1791
-        $this->_handle_html_redirects();
1792
-        // hmmm... must be something wrong, so let's just display the form again !
1793
-        $this->_display_spco_reg_form();
1794
-    }
1795
-
1796
-
1797
-
1798
-    /**
1799
-     *   _handle_json_response
1800
-     *
1801
-     * @access protected
1802
-     * @return void
1803
-     */
1804
-    protected function _handle_json_response()
1805
-    {
1806
-        // if this is an ajax request
1807
-        if (EE_Registry::instance()->REQ->ajax) {
1808
-            // DEBUG LOG
1809
-            //$this->checkout->log(
1810
-            //	__CLASS__, __FUNCTION__, __LINE__,
1811
-            //	array(
1812
-            //		'json_response_redirect_url' => $this->checkout->json_response->redirect_url(),
1813
-            //		'redirect'                   => $this->checkout->redirect,
1814
-            //		'continue_reg'               => $this->checkout->continue_reg,
1815
-            //	)
1816
-            //);
1817
-            $this->checkout->json_response->set_registration_time_limit(
1818
-                $this->checkout->get_registration_time_limit()
1819
-            );
1820
-            $this->checkout->json_response->set_payment_amount($this->checkout->amount_owing);
1821
-            // just send the ajax (
1822
-            $json_response = apply_filters(
1823
-                'FHEE__EE_Single_Page_Checkout__JSON_response',
1824
-                $this->checkout->json_response
1825
-            );
1826
-            echo $json_response;
1827
-            exit();
1828
-        }
1829
-    }
1830
-
1831
-
1832
-
1833
-    /**
1834
-     *   _handle_redirects
1835
-     *
1836
-     * @access protected
1837
-     * @return void
1838
-     */
1839
-    protected function _handle_html_redirects()
1840
-    {
1841
-        // going somewhere ?
1842
-        if ($this->checkout->redirect && ! empty($this->checkout->redirect_url)) {
1843
-            // store notices in a transient
1844
-            EE_Error::get_notices(false, true, true);
1845
-            // DEBUG LOG
1846
-            //$this->checkout->log(
1847
-            //	__CLASS__, __FUNCTION__, __LINE__,
1848
-            //	array(
1849
-            //		'headers_sent' => headers_sent(),
1850
-            //		'redirect_url'     => $this->checkout->redirect_url,
1851
-            //		'headers_list'    => headers_list(),
1852
-            //	)
1853
-            //);
1854
-            wp_safe_redirect($this->checkout->redirect_url);
1855
-            exit();
1856
-        }
1857
-    }
1858
-
1859
-
1860
-
1861
-    /**
1862
-     *   set_checkout_anchor
1863
-     *
1864
-     * @access public
1865
-     * @return void
1866
-     */
1867
-    public function set_checkout_anchor()
1868
-    {
1869
-        echo '<a id="checkout" style="float: left; margin-left: -999em;"></a>';
1870
-    }
23
+	/**
24
+	 * $_initialized - has the SPCO controller already been initialized ?
25
+	 *
26
+	 * @access private
27
+	 * @var bool $_initialized
28
+	 */
29
+	private static $_initialized = false;
30
+
31
+
32
+	/**
33
+	 * $_checkout_verified - is the EE_Checkout verified as correct for this request ?
34
+	 *
35
+	 * @access private
36
+	 * @var bool $_valid_checkout
37
+	 */
38
+	private static $_checkout_verified = true;
39
+
40
+	/**
41
+	 *    $_reg_steps_array - holds initial array of reg steps
42
+	 *
43
+	 * @access private
44
+	 * @var array $_reg_steps_array
45
+	 */
46
+	private static $_reg_steps_array = array();
47
+
48
+	/**
49
+	 *    $checkout - EE_Checkout object for handling the properties of the current checkout process
50
+	 *
51
+	 * @access public
52
+	 * @var EE_Checkout $checkout
53
+	 */
54
+	public $checkout;
55
+
56
+
57
+
58
+	/**
59
+	 * @return EED_Module|EED_Single_Page_Checkout
60
+	 */
61
+	public static function instance()
62
+	{
63
+		add_filter('EED_Single_Page_Checkout__SPCO_active', '__return_true');
64
+		return parent::get_instance(__CLASS__);
65
+	}
66
+
67
+
68
+
69
+	/**
70
+	 * @return EE_CART
71
+	 */
72
+	public function cart()
73
+	{
74
+		return $this->checkout->cart;
75
+	}
76
+
77
+
78
+
79
+	/**
80
+	 * @return EE_Transaction
81
+	 */
82
+	public function transaction()
83
+	{
84
+		return $this->checkout->transaction;
85
+	}
86
+
87
+
88
+
89
+	/**
90
+	 *    set_hooks - for hooking into EE Core, other modules, etc
91
+	 *
92
+	 * @access    public
93
+	 * @return    void
94
+	 * @throws EE_Error
95
+	 */
96
+	public static function set_hooks()
97
+	{
98
+		EED_Single_Page_Checkout::set_definitions();
99
+	}
100
+
101
+
102
+
103
+	/**
104
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
105
+	 *
106
+	 * @access    public
107
+	 * @return    void
108
+	 * @throws EE_Error
109
+	 */
110
+	public static function set_hooks_admin()
111
+	{
112
+		EED_Single_Page_Checkout::set_definitions();
113
+		if ( ! (defined('DOING_AJAX') && DOING_AJAX)) {
114
+			return;
115
+		}
116
+		// going to start an output buffer in case anything gets accidentally output
117
+		// that might disrupt our JSON response
118
+		ob_start();
119
+		EED_Single_Page_Checkout::load_request_handler();
120
+		EED_Single_Page_Checkout::load_reg_steps();
121
+		// set ajax hooks
122
+		add_action('wp_ajax_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
123
+		add_action('wp_ajax_nopriv_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
124
+		add_action('wp_ajax_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
125
+		add_action('wp_ajax_nopriv_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
126
+		add_action('wp_ajax_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
127
+		add_action('wp_ajax_nopriv_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
128
+	}
129
+
130
+
131
+
132
+	/**
133
+	 *    process ajax request
134
+	 *
135
+	 * @param string $ajax_action
136
+	 * @throws EE_Error
137
+	 */
138
+	public static function process_ajax_request($ajax_action)
139
+	{
140
+		EE_Registry::instance()->REQ->set('action', $ajax_action);
141
+		EED_Single_Page_Checkout::instance()->_initialize();
142
+	}
143
+
144
+
145
+
146
+	/**
147
+	 *    ajax display registration step
148
+	 *
149
+	 * @throws EE_Error
150
+	 */
151
+	public static function display_reg_step()
152
+	{
153
+		EED_Single_Page_Checkout::process_ajax_request('display_spco_reg_step');
154
+	}
155
+
156
+
157
+
158
+	/**
159
+	 *    ajax process registration step
160
+	 *
161
+	 * @throws EE_Error
162
+	 */
163
+	public static function process_reg_step()
164
+	{
165
+		EED_Single_Page_Checkout::process_ajax_request('process_reg_step');
166
+	}
167
+
168
+
169
+
170
+	/**
171
+	 *    ajax process registration step
172
+	 *
173
+	 * @throws EE_Error
174
+	 */
175
+	public static function update_reg_step()
176
+	{
177
+		EED_Single_Page_Checkout::process_ajax_request('update_reg_step');
178
+	}
179
+
180
+
181
+
182
+	/**
183
+	 *   update_checkout
184
+	 *
185
+	 * @access public
186
+	 * @return void
187
+	 * @throws EE_Error
188
+	 */
189
+	public static function update_checkout()
190
+	{
191
+		EED_Single_Page_Checkout::process_ajax_request('update_checkout');
192
+	}
193
+
194
+
195
+
196
+	/**
197
+	 *    load_request_handler
198
+	 *
199
+	 * @access    public
200
+	 * @return    void
201
+	 */
202
+	public static function load_request_handler()
203
+	{
204
+		// load core Request_Handler class
205
+		if (EE_Registry::instance()->REQ !== null) {
206
+			EE_Registry::instance()->load_core('Request_Handler');
207
+		}
208
+	}
209
+
210
+
211
+
212
+	/**
213
+	 *    set_definitions
214
+	 *
215
+	 * @access    public
216
+	 * @return    void
217
+	 * @throws EE_Error
218
+	 */
219
+	public static function set_definitions()
220
+	{
221
+		if(defined('SPCO_BASE_PATH')) {
222
+			return;
223
+		}
224
+		define(
225
+			'SPCO_BASE_PATH',
226
+			rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS) . DS
227
+		);
228
+		define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css' . DS);
229
+		define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img' . DS);
230
+		define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js' . DS);
231
+		define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc' . DS);
232
+		define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps' . DS);
233
+		define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates' . DS);
234
+		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true);
235
+		EE_Registry::$i18n_js_strings['registration_expiration_notice'] = sprintf(
236
+			__('%1$sWe\'re sorry, but you\'re registration time has expired.%2$s%4$sIf you still wish to complete your registration, please return to the %5$sEvent List%6$sEvent List%7$s and reselect your tickets if available. Please except our apologies for any inconvenience this may have caused.%8$s',
237
+				'event_espresso'),
238
+			'<h4 class="important-notice">',
239
+			'</h4>',
240
+			'<br />',
241
+			'<p>',
242
+			'<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
243
+			'">',
244
+			'</a>',
245
+			'</p>'
246
+		);
247
+	}
248
+
249
+
250
+
251
+	/**
252
+	 * load_reg_steps
253
+	 * loads and instantiates each reg step based on the EE_Registry::instance()->CFG->registration->reg_steps array
254
+	 *
255
+	 * @access    private
256
+	 * @throws EE_Error
257
+	 */
258
+	public static function load_reg_steps()
259
+	{
260
+		static $reg_steps_loaded = false;
261
+		if ($reg_steps_loaded) {
262
+			return;
263
+		}
264
+		// filter list of reg_steps
265
+		$reg_steps_to_load = (array)apply_filters(
266
+			'AHEE__SPCO__load_reg_steps__reg_steps_to_load',
267
+			EED_Single_Page_Checkout::get_reg_steps()
268
+		);
269
+		// sort by key (order)
270
+		ksort($reg_steps_to_load);
271
+		// loop through folders
272
+		foreach ($reg_steps_to_load as $order => $reg_step) {
273
+			// we need a
274
+			if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
275
+				// copy over to the reg_steps_array
276
+				EED_Single_Page_Checkout::$_reg_steps_array[$order] = $reg_step;
277
+				// register custom key route for each reg step
278
+				// ie: step=>"slug" - this is the entire reason we load the reg steps array now
279
+				EE_Config::register_route(
280
+					$reg_step['slug'],
281
+					'EED_Single_Page_Checkout',
282
+					'run',
283
+					'step'
284
+				);
285
+				// add AJAX or other hooks
286
+				if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) {
287
+					// setup autoloaders if necessary
288
+					if ( ! class_exists($reg_step['class_name'])) {
289
+						EEH_Autoloader::register_autoloaders_for_each_file_in_folder(
290
+							$reg_step['file_path'],
291
+							true
292
+						);
293
+					}
294
+					if (is_callable($reg_step['class_name'], 'set_hooks')) {
295
+						call_user_func(array($reg_step['class_name'], 'set_hooks'));
296
+					}
297
+				}
298
+			}
299
+		}
300
+		$reg_steps_loaded = true;
301
+	}
302
+
303
+
304
+
305
+	/**
306
+	 *    get_reg_steps
307
+	 *
308
+	 * @access    public
309
+	 * @return    array
310
+	 */
311
+	public static function get_reg_steps()
312
+	{
313
+		$reg_steps = EE_Registry::instance()->CFG->registration->reg_steps;
314
+		if (empty($reg_steps)) {
315
+			$reg_steps = array(
316
+				10  => array(
317
+					'file_path'  => SPCO_REG_STEPS_PATH . 'attendee_information',
318
+					'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information',
319
+					'slug'       => 'attendee_information',
320
+					'has_hooks'  => false,
321
+				),
322
+				20  => array(
323
+					'file_path'  => SPCO_REG_STEPS_PATH . 'registration_confirmation',
324
+					'class_name' => 'EE_SPCO_Reg_Step_Registration_Confirmation',
325
+					'slug'       => 'registration_confirmation',
326
+					'has_hooks'  => false,
327
+				),
328
+				30  => array(
329
+					'file_path'  => SPCO_REG_STEPS_PATH . 'payment_options',
330
+					'class_name' => 'EE_SPCO_Reg_Step_Payment_Options',
331
+					'slug'       => 'payment_options',
332
+					'has_hooks'  => true,
333
+				),
334
+				999 => array(
335
+					'file_path'  => SPCO_REG_STEPS_PATH . 'finalize_registration',
336
+					'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration',
337
+					'slug'       => 'finalize_registration',
338
+					'has_hooks'  => false,
339
+				),
340
+			);
341
+		}
342
+		return $reg_steps;
343
+	}
344
+
345
+
346
+
347
+	/**
348
+	 *    registration_checkout_for_admin
349
+	 *
350
+	 * @access    public
351
+	 * @return    string
352
+	 * @throws EE_Error
353
+	 */
354
+	public static function registration_checkout_for_admin()
355
+	{
356
+		EED_Single_Page_Checkout::load_request_handler();
357
+		EE_Registry::instance()->REQ->set('step', 'attendee_information');
358
+		EE_Registry::instance()->REQ->set('action', 'display_spco_reg_step');
359
+		EE_Registry::instance()->REQ->set('process_form_submission', false);
360
+		EED_Single_Page_Checkout::instance()->_initialize();
361
+		EED_Single_Page_Checkout::instance()->_display_spco_reg_form();
362
+		return EE_Registry::instance()->REQ->get_output();
363
+	}
364
+
365
+
366
+
367
+	/**
368
+	 * process_registration_from_admin
369
+	 *
370
+	 * @access public
371
+	 * @return \EE_Transaction
372
+	 * @throws EE_Error
373
+	 */
374
+	public static function process_registration_from_admin()
375
+	{
376
+		EED_Single_Page_Checkout::load_request_handler();
377
+		EE_Registry::instance()->REQ->set('step', 'attendee_information');
378
+		EE_Registry::instance()->REQ->set('action', 'process_reg_step');
379
+		EE_Registry::instance()->REQ->set('process_form_submission', true);
380
+		EED_Single_Page_Checkout::instance()->_initialize();
381
+		if (EED_Single_Page_Checkout::instance()->checkout->current_step->completed()) {
382
+			$final_reg_step = end(EED_Single_Page_Checkout::instance()->checkout->reg_steps);
383
+			if ($final_reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) {
384
+				EED_Single_Page_Checkout::instance()->checkout->set_reg_step_initiated($final_reg_step);
385
+				if ($final_reg_step->process_reg_step()) {
386
+					$final_reg_step->set_completed();
387
+					EED_Single_Page_Checkout::instance()->checkout->update_txn_reg_steps_array();
388
+					return EED_Single_Page_Checkout::instance()->checkout->transaction;
389
+				}
390
+			}
391
+		}
392
+		return null;
393
+	}
394
+
395
+
396
+
397
+	/**
398
+	 *    run
399
+	 *
400
+	 * @access    public
401
+	 * @param WP_Query $WP_Query
402
+	 * @return    void
403
+	 * @throws EE_Error
404
+	 */
405
+	public function run($WP_Query)
406
+	{
407
+		if (
408
+			$WP_Query instanceof WP_Query
409
+			&& $WP_Query->is_main_query()
410
+			&& apply_filters('FHEE__EED_Single_Page_Checkout__run', true)
411
+			&& $this->_is_reg_checkout()
412
+		) {
413
+			$this->_initialize();
414
+		}
415
+	}
416
+
417
+
418
+
419
+	/**
420
+	 * determines whether current url matches reg page url
421
+	 *
422
+	 * @return bool
423
+	 */
424
+	protected function _is_reg_checkout()
425
+	{
426
+		// get current permalink for reg page without any extra query args
427
+		$reg_page_url = \get_permalink(EE_Config::instance()->core->reg_page_id);
428
+		// get request URI for current request, but without the scheme or host
429
+		$current_request_uri = \EEH_URL::filter_input_server_url('REQUEST_URI');
430
+		$current_request_uri = html_entity_decode($current_request_uri);
431
+		// get array of query args from the current request URI
432
+		$query_args = \EEH_URL::get_query_string($current_request_uri);
433
+		// grab page id if it is set
434
+		$page_id = isset($query_args['page_id']) ? absint($query_args['page_id']) : 0;
435
+		// and remove the page id from the query args (we will re-add it later)
436
+		unset($query_args['page_id']);
437
+		// now strip all query args from current request URI
438
+		$current_request_uri = remove_query_arg(array_keys($query_args), $current_request_uri);
439
+		// and re-add the page id if it was set
440
+		if ($page_id) {
441
+			$current_request_uri = add_query_arg('page_id', $page_id, $current_request_uri);
442
+		}
443
+		// remove slashes and ?
444
+		$current_request_uri = trim($current_request_uri, '?/');
445
+		// is current request URI part of the known full reg page URL ?
446
+		return ! empty($current_request_uri) && strpos($reg_page_url, $current_request_uri) !== false;
447
+	}
448
+
449
+
450
+
451
+	/**
452
+	 * @param WP_Query $wp_query
453
+	 * @return    void
454
+	 * @throws EE_Error
455
+	 */
456
+	public static function init($wp_query)
457
+	{
458
+		EED_Single_Page_Checkout::instance()->run($wp_query);
459
+	}
460
+
461
+
462
+
463
+	/**
464
+	 *    _initialize - initial module setup
465
+	 *
466
+	 * @access    private
467
+	 * @throws EE_Error
468
+	 * @return    void
469
+	 */
470
+	private function _initialize()
471
+	{
472
+		// ensure SPCO doesn't run twice
473
+		if (EED_Single_Page_Checkout::$_initialized) {
474
+			return;
475
+		}
476
+		try {
477
+			EED_Single_Page_Checkout::load_reg_steps();
478
+			$this->_verify_session();
479
+			// setup the EE_Checkout object
480
+			$this->checkout = $this->_initialize_checkout();
481
+			// filter checkout
482
+			$this->checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize__checkout', $this->checkout);
483
+			// get the $_GET
484
+			$this->_get_request_vars();
485
+			if ($this->_block_bots()) {
486
+				return;
487
+			}
488
+			// filter continue_reg
489
+			$this->checkout->continue_reg = apply_filters(
490
+				'FHEE__EED_Single_Page_Checkout__init___continue_reg',
491
+				true,
492
+				$this->checkout
493
+			);
494
+			// load the reg steps array
495
+			if ( ! $this->_load_and_instantiate_reg_steps()) {
496
+				EED_Single_Page_Checkout::$_initialized = true;
497
+				return;
498
+			}
499
+			// set the current step
500
+			$this->checkout->set_current_step($this->checkout->step);
501
+			// and the next step
502
+			$this->checkout->set_next_step();
503
+			// verify that everything has been setup correctly
504
+			if ( ! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) {
505
+				EED_Single_Page_Checkout::$_initialized = true;
506
+				return;
507
+			}
508
+			// lock the transaction
509
+			$this->checkout->transaction->lock();
510
+			// make sure all of our cached objects are added to their respective model entity mappers
511
+			$this->checkout->refresh_all_entities();
512
+			// set amount owing
513
+			$this->checkout->amount_owing = $this->checkout->transaction->remaining();
514
+			// initialize each reg step, which gives them the chance to potentially alter the process
515
+			$this->_initialize_reg_steps();
516
+			// DEBUG LOG
517
+			//$this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
518
+			// get reg form
519
+			if( ! $this->_check_form_submission()) {
520
+				EED_Single_Page_Checkout::$_initialized = true;
521
+				return;
522
+			}
523
+			// checkout the action!!!
524
+			$this->_process_form_action();
525
+			// add some style and make it dance
526
+			$this->add_styles_and_scripts();
527
+			// kk... SPCO has successfully run
528
+			EED_Single_Page_Checkout::$_initialized = true;
529
+			// set no cache headers and constants
530
+			EE_System::do_not_cache();
531
+			// add anchor
532
+			add_action('loop_start', array($this, 'set_checkout_anchor'), 1);
533
+			// remove transaction lock
534
+			add_action('shutdown', array($this, 'unlock_transaction'), 1);
535
+		} catch (Exception $e) {
536
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
537
+		}
538
+	}
539
+
540
+
541
+
542
+	/**
543
+	 *    _verify_session
544
+	 * checks that the session is valid and not expired
545
+	 *
546
+	 * @access    private
547
+	 * @throws EE_Error
548
+	 */
549
+	private function _verify_session()
550
+	{
551
+		if ( ! EE_Registry::instance()->SSN instanceof EE_Session) {
552
+			throw new EE_Error(__('The EE_Session class could not be loaded.', 'event_espresso'));
553
+		}
554
+		// is session still valid ?
555
+		if (
556
+			EE_Registry::instance()->SSN->expired()
557
+			&& EE_Registry::instance()->REQ->get('e_reg_url_link', '') === ''
558
+		) {
559
+			$this->checkout = new EE_Checkout();
560
+			EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
561
+			// EE_Registry::instance()->SSN->reset_cart();
562
+			// EE_Registry::instance()->SSN->reset_checkout();
563
+			// EE_Registry::instance()->SSN->reset_transaction();
564
+			EE_Error::add_attention(
565
+				EE_Registry::$i18n_js_strings['registration_expiration_notice'],
566
+				__FILE__, __FUNCTION__, __LINE__
567
+			);
568
+			// EE_Registry::instance()->SSN->reset_expired();
569
+		}
570
+	}
571
+
572
+
573
+
574
+	/**
575
+	 *    _initialize_checkout
576
+	 * loads and instantiates EE_Checkout
577
+	 *
578
+	 * @access    private
579
+	 * @throws EE_Error
580
+	 * @return EE_Checkout
581
+	 */
582
+	private function _initialize_checkout()
583
+	{
584
+		// look in session for existing checkout
585
+		/** @type EE_Checkout $checkout */
586
+		$checkout = EE_Registry::instance()->SSN->checkout();
587
+		// verify
588
+		if ( ! $checkout instanceof EE_Checkout) {
589
+			// instantiate EE_Checkout object for handling the properties of the current checkout process
590
+			$checkout = EE_Registry::instance()->load_file(
591
+				SPCO_INC_PATH,
592
+				'EE_Checkout',
593
+				'class', array(),
594
+				false
595
+			);
596
+		} else {
597
+			if ($checkout->current_step->is_final_step() && $checkout->exit_spco() === true) {
598
+				$this->unlock_transaction();
599
+				wp_safe_redirect($checkout->redirect_url);
600
+				exit();
601
+			}
602
+		}
603
+		$checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout);
604
+		// verify again
605
+		if ( ! $checkout instanceof EE_Checkout) {
606
+			throw new EE_Error(__('The EE_Checkout class could not be loaded.', 'event_espresso'));
607
+		}
608
+		// reset anything that needs a clean slate for each request
609
+		$checkout->reset_for_current_request();
610
+		return $checkout;
611
+	}
612
+
613
+
614
+
615
+	/**
616
+	 *    _get_request_vars
617
+	 *
618
+	 * @access    private
619
+	 * @return    void
620
+	 * @throws EE_Error
621
+	 */
622
+	private function _get_request_vars()
623
+	{
624
+		// load classes
625
+		EED_Single_Page_Checkout::load_request_handler();
626
+		//make sure this request is marked as belonging to EE
627
+		EE_Registry::instance()->REQ->set_espresso_page(true);
628
+		// which step is being requested ?
629
+		$this->checkout->step = EE_Registry::instance()->REQ->get('step', $this->_get_first_step());
630
+		// which step is being edited ?
631
+		$this->checkout->edit_step = EE_Registry::instance()->REQ->get('edit_step', '');
632
+		// and what we're doing on the current step
633
+		$this->checkout->action = EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step');
634
+		// timestamp
635
+		$this->checkout->uts = EE_Registry::instance()->REQ->get('uts', 0);
636
+		// returning to edit ?
637
+		$this->checkout->reg_url_link = EE_Registry::instance()->REQ->get('e_reg_url_link', '');
638
+		// or some other kind of revisit ?
639
+		$this->checkout->revisit = filter_var(
640
+			EE_Registry::instance()->REQ->get('revisit', false),
641
+			FILTER_VALIDATE_BOOLEAN
642
+		);
643
+		// and whether or not to generate a reg form for this request
644
+		$this->checkout->generate_reg_form = filter_var(
645
+			EE_Registry::instance()->REQ->get('generate_reg_form', true),
646
+			FILTER_VALIDATE_BOOLEAN
647
+		);
648
+		// and whether or not to process a reg form submission for this request
649
+		$this->checkout->process_form_submission = filter_var(
650
+			EE_Registry::instance()->REQ->get(
651
+				'process_form_submission',
652
+				$this->checkout->action === 'process_reg_step'
653
+			),
654
+			FILTER_VALIDATE_BOOLEAN
655
+		);
656
+		$this->checkout->process_form_submission = filter_var(
657
+			$this->checkout->action !== 'display_spco_reg_step'
658
+				? $this->checkout->process_form_submission
659
+				: false,
660
+			FILTER_VALIDATE_BOOLEAN
661
+		);
662
+		// $this->_display_request_vars();
663
+	}
664
+
665
+
666
+
667
+	/**
668
+	 *  _display_request_vars
669
+	 *
670
+	 * @access    protected
671
+	 * @return    void
672
+	 */
673
+	protected function _display_request_vars()
674
+	{
675
+		if ( ! WP_DEBUG) {
676
+			return;
677
+		}
678
+		EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__);
679
+		EEH_Debug_Tools::printr($this->checkout->step, '$this->checkout->step', __FILE__, __LINE__);
680
+		EEH_Debug_Tools::printr($this->checkout->edit_step, '$this->checkout->edit_step', __FILE__, __LINE__);
681
+		EEH_Debug_Tools::printr($this->checkout->action, '$this->checkout->action', __FILE__, __LINE__);
682
+		EEH_Debug_Tools::printr($this->checkout->reg_url_link, '$this->checkout->reg_url_link', __FILE__, __LINE__);
683
+		EEH_Debug_Tools::printr($this->checkout->revisit, '$this->checkout->revisit', __FILE__, __LINE__);
684
+		EEH_Debug_Tools::printr($this->checkout->generate_reg_form, '$this->checkout->generate_reg_form', __FILE__, __LINE__);
685
+		EEH_Debug_Tools::printr($this->checkout->process_form_submission, '$this->checkout->process_form_submission', __FILE__, __LINE__);
686
+	}
687
+
688
+
689
+
690
+	/**
691
+	 * _block_bots
692
+	 * checks that the incoming request has either of the following set:
693
+	 *  a uts (unix timestamp) which indicates that the request was redirected from the Ticket Selector
694
+	 *  a REG URL Link, which indicates that the request is a return visit to SPCO for a valid TXN
695
+	 * so if you're not coming from the Ticket Selector nor returning for a valid IP...
696
+	 * then where you coming from man?
697
+	 *
698
+	 * @return boolean
699
+	 */
700
+	private function _block_bots()
701
+	{
702
+		$invalid_checkout_access = EED_Invalid_Checkout_Access::getInvalidCheckoutAccess();
703
+		if ($invalid_checkout_access->checkoutAccessIsInvalid($this->checkout)) {
704
+			return true;
705
+		}
706
+		return false;
707
+	}
708
+
709
+
710
+
711
+	/**
712
+	 *    _get_first_step
713
+	 *  gets slug for first step in $_reg_steps_array
714
+	 *
715
+	 * @access    private
716
+	 * @throws EE_Error
717
+	 * @return    string
718
+	 */
719
+	private function _get_first_step()
720
+	{
721
+		$first_step = reset(EED_Single_Page_Checkout::$_reg_steps_array);
722
+		return isset($first_step['slug']) ? $first_step['slug'] : 'attendee_information';
723
+	}
724
+
725
+
726
+
727
+	/**
728
+	 *    _load_and_instantiate_reg_steps
729
+	 *  instantiates each reg step based on the loaded reg_steps array
730
+	 *
731
+	 * @access    private
732
+	 * @throws EE_Error
733
+	 * @return    bool
734
+	 */
735
+	private function _load_and_instantiate_reg_steps()
736
+	{
737
+		do_action('AHEE__Single_Page_Checkout___load_and_instantiate_reg_steps__start', $this->checkout);
738
+		// have reg_steps already been instantiated ?
739
+		if (
740
+			empty($this->checkout->reg_steps)
741
+			|| apply_filters('FHEE__Single_Page_Checkout__load_reg_steps__reload_reg_steps', false, $this->checkout)
742
+		) {
743
+			// if not, then loop through raw reg steps array
744
+			foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) {
745
+				if ( ! $this->_load_and_instantiate_reg_step($reg_step, $order)) {
746
+					return false;
747
+				}
748
+			}
749
+			EE_Registry::instance()->CFG->registration->skip_reg_confirmation = true;
750
+			EE_Registry::instance()->CFG->registration->reg_confirmation_last = true;
751
+			// skip the registration_confirmation page ?
752
+			if (EE_Registry::instance()->CFG->registration->skip_reg_confirmation) {
753
+				// just remove it from the reg steps array
754
+				$this->checkout->remove_reg_step('registration_confirmation', false);
755
+			} else if (
756
+				isset($this->checkout->reg_steps['registration_confirmation'])
757
+				&& EE_Registry::instance()->CFG->registration->reg_confirmation_last
758
+			) {
759
+				// set the order to something big like 100
760
+				$this->checkout->set_reg_step_order('registration_confirmation', 100);
761
+			}
762
+			// filter the array for good luck
763
+			$this->checkout->reg_steps = apply_filters(
764
+				'FHEE__Single_Page_Checkout__load_reg_steps__reg_steps',
765
+				$this->checkout->reg_steps
766
+			);
767
+			// finally re-sort based on the reg step class order properties
768
+			$this->checkout->sort_reg_steps();
769
+		} else {
770
+			foreach ($this->checkout->reg_steps as $reg_step) {
771
+				// set all current step stati to FALSE
772
+				$reg_step->set_is_current_step(false);
773
+			}
774
+		}
775
+		if (empty($this->checkout->reg_steps)) {
776
+			EE_Error::add_error(
777
+				__('No Reg Steps were loaded..', 'event_espresso'),
778
+				__FILE__, __FUNCTION__, __LINE__
779
+			);
780
+			return false;
781
+		}
782
+		// make reg step details available to JS
783
+		$this->checkout->set_reg_step_JSON_info();
784
+		return true;
785
+	}
786
+
787
+
788
+
789
+	/**
790
+	 *     _load_and_instantiate_reg_step
791
+	 *
792
+	 * @access    private
793
+	 * @param array $reg_step
794
+	 * @param int   $order
795
+	 * @return bool
796
+	 */
797
+	private function _load_and_instantiate_reg_step($reg_step = array(), $order = 0)
798
+	{
799
+		// we need a file_path, class_name, and slug to add a reg step
800
+		if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
801
+			// if editing a specific step, but this is NOT that step... (and it's not the 'finalize_registration' step)
802
+			if (
803
+				$this->checkout->reg_url_link
804
+				&& $this->checkout->step !== $reg_step['slug']
805
+				&& $reg_step['slug'] !== 'finalize_registration'
806
+				// normally at this point we would NOT load the reg step, but this filter can change that
807
+				&& apply_filters(
808
+					'FHEE__Single_Page_Checkout___load_and_instantiate_reg_step__bypass_reg_step',
809
+					true,
810
+					$reg_step,
811
+					$this->checkout
812
+				)
813
+			) {
814
+				return true;
815
+			}
816
+			// instantiate step class using file path and class name
817
+			$reg_step_obj = EE_Registry::instance()->load_file(
818
+				$reg_step['file_path'],
819
+				$reg_step['class_name'],
820
+				'class',
821
+				$this->checkout,
822
+				false
823
+			);
824
+			// did we gets the goods ?
825
+			if ($reg_step_obj instanceof EE_SPCO_Reg_Step) {
826
+				// set reg step order based on config
827
+				$reg_step_obj->set_order($order);
828
+				// add instantiated reg step object to the master reg steps array
829
+				$this->checkout->add_reg_step($reg_step_obj);
830
+			} else {
831
+				EE_Error::add_error(
832
+					__('The current step could not be set.', 'event_espresso'),
833
+					__FILE__, __FUNCTION__, __LINE__
834
+				);
835
+				return false;
836
+			}
837
+		} else {
838
+			if (WP_DEBUG) {
839
+				EE_Error::add_error(
840
+					sprintf(
841
+						__(
842
+							'A registration step could not be loaded. One or more of the following data points is invalid:%4$s%5$sFile Path: %1$s%6$s%5$sClass Name: %2$s%6$s%5$sSlug: %3$s%6$s%7$s',
843
+							'event_espresso'
844
+						),
845
+						isset($reg_step['file_path']) ? $reg_step['file_path'] : '',
846
+						isset($reg_step['class_name']) ? $reg_step['class_name'] : '',
847
+						isset($reg_step['slug']) ? $reg_step['slug'] : '',
848
+						'<ul>',
849
+						'<li>',
850
+						'</li>',
851
+						'</ul>'
852
+					),
853
+					__FILE__, __FUNCTION__, __LINE__
854
+				);
855
+			}
856
+			return false;
857
+		}
858
+		return true;
859
+	}
860
+
861
+
862
+	/**
863
+	 * _verify_transaction_and_get_registrations
864
+	 *
865
+	 * @access private
866
+	 * @return bool
867
+	 * @throws InvalidDataTypeException
868
+	 * @throws InvalidEntityException
869
+	 * @throws EE_Error
870
+	 */
871
+	private function _verify_transaction_and_get_registrations()
872
+	{
873
+		// was there already a valid transaction in the checkout from the session ?
874
+		if ( ! $this->checkout->transaction instanceof EE_Transaction) {
875
+			// get transaction from db or session
876
+			$this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin()
877
+				? $this->_get_transaction_and_cart_for_previous_visit()
878
+				: $this->_get_cart_for_current_session_and_setup_new_transaction();
879
+			if ( ! $this->checkout->transaction instanceof EE_Transaction) {
880
+				EE_Error::add_error(
881
+					__('Your Registration and Transaction information could not be retrieved from the db.',
882
+						'event_espresso'),
883
+					__FILE__, __FUNCTION__, __LINE__
884
+				);
885
+				$this->checkout->transaction = EE_Transaction::new_instance();
886
+				// add some style and make it dance
887
+				$this->add_styles_and_scripts();
888
+				EED_Single_Page_Checkout::$_initialized = true;
889
+				return false;
890
+			}
891
+			// and the registrations for the transaction
892
+			$this->_get_registrations($this->checkout->transaction);
893
+		}
894
+		return true;
895
+	}
896
+
897
+
898
+
899
+	/**
900
+	 * _get_transaction_and_cart_for_previous_visit
901
+	 *
902
+	 * @access private
903
+	 * @return mixed EE_Transaction|NULL
904
+	 */
905
+	private function _get_transaction_and_cart_for_previous_visit()
906
+	{
907
+		/** @var $TXN_model EEM_Transaction */
908
+		$TXN_model = EE_Registry::instance()->load_model('Transaction');
909
+		// because the reg_url_link is present in the request,
910
+		// this is a return visit to SPCO, so we'll get the transaction data from the db
911
+		$transaction = $TXN_model->get_transaction_from_reg_url_link($this->checkout->reg_url_link);
912
+		// verify transaction
913
+		if ($transaction instanceof EE_Transaction) {
914
+			// and get the cart that was used for that transaction
915
+			$this->checkout->cart = $this->_get_cart_for_transaction($transaction);
916
+			return $transaction;
917
+		}
918
+		EE_Error::add_error(
919
+			__('Your Registration and Transaction information could not be retrieved from the db.', 'event_espresso'),
920
+			__FILE__, __FUNCTION__, __LINE__
921
+		);
922
+		return null;
923
+
924
+	}
925
+
926
+
927
+
928
+	/**
929
+	 * _get_cart_for_transaction
930
+	 *
931
+	 * @access private
932
+	 * @param EE_Transaction $transaction
933
+	 * @return EE_Cart
934
+	 */
935
+	private function _get_cart_for_transaction($transaction)
936
+	{
937
+		return $this->checkout->get_cart_for_transaction($transaction);
938
+	}
939
+
940
+
941
+
942
+	/**
943
+	 * get_cart_for_transaction
944
+	 *
945
+	 * @access public
946
+	 * @param EE_Transaction $transaction
947
+	 * @return EE_Cart
948
+	 */
949
+	public function get_cart_for_transaction(EE_Transaction $transaction)
950
+	{
951
+		return $this->checkout->get_cart_for_transaction($transaction);
952
+	}
953
+
954
+
955
+
956
+	/**
957
+	 * _get_transaction_and_cart_for_current_session
958
+	 *    generates a new EE_Transaction object and adds it to the $_transaction property.
959
+	 *
960
+	 * @access private
961
+	 * @return EE_Transaction
962
+	 * @throws EE_Error
963
+	 */
964
+	private function _get_cart_for_current_session_and_setup_new_transaction()
965
+	{
966
+		//  if there's no transaction, then this is the FIRST visit to SPCO
967
+		// so load up the cart ( passing nothing for the TXN because it doesn't exist yet )
968
+		$this->checkout->cart = $this->_get_cart_for_transaction(null);
969
+		// and then create a new transaction
970
+		$transaction = $this->_initialize_transaction();
971
+		// verify transaction
972
+		if ($transaction instanceof EE_Transaction) {
973
+			// save it so that we have an ID for other objects to use
974
+			$transaction->save();
975
+			// and save TXN data to the cart
976
+			$this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn($transaction->ID());
977
+		} else {
978
+			EE_Error::add_error(
979
+				__('A Valid Transaction could not be initialized.', 'event_espresso'),
980
+				__FILE__, __FUNCTION__, __LINE__
981
+			);
982
+		}
983
+		return $transaction;
984
+	}
985
+
986
+
987
+
988
+	/**
989
+	 *    generates a new EE_Transaction object and adds it to the $_transaction property.
990
+	 *
991
+	 * @access private
992
+	 * @return mixed EE_Transaction|NULL
993
+	 */
994
+	private function _initialize_transaction()
995
+	{
996
+		try {
997
+			// ensure cart totals have been calculated
998
+			$this->checkout->cart->get_grand_total()->recalculate_total_including_taxes();
999
+			// grab the cart grand total
1000
+			$cart_total = $this->checkout->cart->get_cart_grand_total();
1001
+			// create new TXN
1002
+			$transaction = EE_Transaction::new_instance(
1003
+				array(
1004
+					'TXN_reg_steps' => $this->checkout->initialize_txn_reg_steps_array(),
1005
+					'TXN_total'     => $cart_total > 0 ? $cart_total : 0,
1006
+					'TXN_paid'      => 0,
1007
+					'STS_ID'        => EEM_Transaction::failed_status_code,
1008
+				)
1009
+			);
1010
+			// save it so that we have an ID for other objects to use
1011
+			$transaction->save();
1012
+			// set cron job for following up on TXNs after their session has expired
1013
+			EE_Cron_Tasks::schedule_expired_transaction_check(
1014
+				EE_Registry::instance()->SSN->expiration() + 1,
1015
+				$transaction->ID()
1016
+			);
1017
+			return $transaction;
1018
+		} catch (Exception $e) {
1019
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
1020
+		}
1021
+		return null;
1022
+	}
1023
+
1024
+
1025
+	/**
1026
+	 * _get_registrations
1027
+	 *
1028
+	 * @access private
1029
+	 * @param EE_Transaction $transaction
1030
+	 * @return void
1031
+	 * @throws InvalidDataTypeException
1032
+	 * @throws InvalidEntityException
1033
+	 * @throws EE_Error
1034
+	 */
1035
+	private function _get_registrations(EE_Transaction $transaction)
1036
+	{
1037
+		// first step: grab the registrants  { : o
1038
+		$registrations = $transaction->registrations($this->checkout->reg_cache_where_params, true);
1039
+		// verify registrations have been set
1040
+		if (empty($registrations)) {
1041
+			// if no cached registrations, then check the db
1042
+			$registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false);
1043
+			// still nothing ? well as long as this isn't a revisit
1044
+			if (empty($registrations) && ! $this->checkout->revisit) {
1045
+				// generate new registrations from scratch
1046
+				$registrations = $this->_initialize_registrations($transaction);
1047
+			}
1048
+		}
1049
+		// sort by their original registration order
1050
+		usort($registrations, array('EED_Single_Page_Checkout', 'sort_registrations_by_REG_count'));
1051
+		// then loop thru the array
1052
+		foreach ($registrations as $registration) {
1053
+			// verify each registration
1054
+			if ($registration instanceof EE_Registration) {
1055
+				// we display all attendee info for the primary registrant
1056
+				if ($this->checkout->reg_url_link === $registration->reg_url_link()
1057
+					&& $registration->is_primary_registrant()
1058
+				) {
1059
+					$this->checkout->primary_revisit = true;
1060
+					break;
1061
+				}
1062
+				if ($this->checkout->revisit
1063
+						   && $this->checkout->reg_url_link !== $registration->reg_url_link()
1064
+				) {
1065
+					// but hide info if it doesn't belong to you
1066
+					$transaction->clear_cache('Registration', $registration->ID());
1067
+				}
1068
+				$this->checkout->set_reg_status_updated($registration->ID(), false);
1069
+			}
1070
+		}
1071
+	}
1072
+
1073
+
1074
+	/**
1075
+	 *    adds related EE_Registration objects for each ticket in the cart to the current EE_Transaction object
1076
+	 *
1077
+	 * @access private
1078
+	 * @param EE_Transaction $transaction
1079
+	 * @return    array
1080
+	 * @throws InvalidDataTypeException
1081
+	 * @throws InvalidEntityException
1082
+	 * @throws EE_Error
1083
+	 */
1084
+	private function _initialize_registrations(EE_Transaction $transaction)
1085
+	{
1086
+		$att_nmbr = 0;
1087
+		$registrations = array();
1088
+		if ($transaction instanceof EE_Transaction) {
1089
+			/** @type EE_Registration_Processor $registration_processor */
1090
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
1091
+			$this->checkout->total_ticket_count = $this->checkout->cart->all_ticket_quantity_count();
1092
+			// now let's add the cart items to the $transaction
1093
+			foreach ($this->checkout->cart->get_tickets() as $line_item) {
1094
+				//do the following for each ticket of this type they selected
1095
+				for ($x = 1; $x <= $line_item->quantity(); $x++) {
1096
+					$att_nmbr++;
1097
+					/** @var EventEspresso\core\services\commands\registration\CreateRegistrationCommand $CreateRegistrationCommand */
1098
+					$CreateRegistrationCommand = EE_Registry::instance()->create(
1099
+						'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
1100
+						array(
1101
+							$transaction,
1102
+							$line_item,
1103
+							$att_nmbr,
1104
+							$this->checkout->total_ticket_count,
1105
+						)
1106
+					);
1107
+					// override capabilities for frontend registrations
1108
+					if ( ! is_admin()) {
1109
+						$CreateRegistrationCommand->setCapCheck(
1110
+							new PublicCapabilities('', 'create_new_registration')
1111
+						);
1112
+					}
1113
+					$registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand);
1114
+					if ( ! $registration instanceof EE_Registration) {
1115
+						throw new InvalidEntityException($registration, 'EE_Registration');
1116
+					}
1117
+					$registrations[ $registration->ID() ] = $registration;
1118
+				}
1119
+			}
1120
+			$registration_processor->fix_reg_final_price_rounding_issue($transaction);
1121
+		}
1122
+		return $registrations;
1123
+	}
1124
+
1125
+
1126
+
1127
+	/**
1128
+	 * sorts registrations by REG_count
1129
+	 *
1130
+	 * @access public
1131
+	 * @param EE_Registration $reg_A
1132
+	 * @param EE_Registration $reg_B
1133
+	 * @return int
1134
+	 */
1135
+	public static function sort_registrations_by_REG_count(EE_Registration $reg_A, EE_Registration $reg_B)
1136
+	{
1137
+		// this shouldn't ever happen within the same TXN, but oh well
1138
+		if ($reg_A->count() === $reg_B->count()) {
1139
+			return 0;
1140
+		}
1141
+		return ($reg_A->count() > $reg_B->count()) ? 1 : -1;
1142
+	}
1143
+
1144
+
1145
+
1146
+	/**
1147
+	 *    _final_verifications
1148
+	 * just makes sure that everything is set up correctly before proceeding
1149
+	 *
1150
+	 * @access    private
1151
+	 * @return    bool
1152
+	 * @throws EE_Error
1153
+	 */
1154
+	private function _final_verifications()
1155
+	{
1156
+		// filter checkout
1157
+		$this->checkout = apply_filters(
1158
+			'FHEE__EED_Single_Page_Checkout___final_verifications__checkout',
1159
+			$this->checkout
1160
+		);
1161
+		//verify that current step is still set correctly
1162
+		if ( ! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) {
1163
+			EE_Error::add_error(
1164
+				__('We\'re sorry but the registration process can not proceed because one or more registration steps were not setup correctly. Please refresh the page and try again or contact support.', 'event_espresso'),
1165
+				__FILE__,
1166
+				__FUNCTION__,
1167
+				__LINE__
1168
+			);
1169
+			return false;
1170
+		}
1171
+		// if returning to SPCO, then verify that primary registrant is set
1172
+		if ( ! empty($this->checkout->reg_url_link)) {
1173
+			$valid_registrant = $this->checkout->transaction->primary_registration();
1174
+			if ( ! $valid_registrant instanceof EE_Registration) {
1175
+				EE_Error::add_error(
1176
+					__('We\'re sorry but there appears to be an error with the "reg_url_link" or the primary registrant for this transaction. Please refresh the page and try again or contact support.', 'event_espresso'),
1177
+					__FILE__,
1178
+					__FUNCTION__,
1179
+					__LINE__
1180
+				);
1181
+				return false;
1182
+			}
1183
+			$valid_registrant = null;
1184
+			foreach (
1185
+				$this->checkout->transaction->registrations($this->checkout->reg_cache_where_params) as $registration
1186
+			) {
1187
+				if (
1188
+					$registration instanceof EE_Registration
1189
+					&& $registration->reg_url_link() === $this->checkout->reg_url_link
1190
+				) {
1191
+					$valid_registrant = $registration;
1192
+				}
1193
+			}
1194
+			if ( ! $valid_registrant instanceof EE_Registration) {
1195
+				// hmmm... maybe we have the wrong session because the user is opening multiple tabs ?
1196
+				if (EED_Single_Page_Checkout::$_checkout_verified) {
1197
+					// clear the session, mark the checkout as unverified, and try again
1198
+					EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
1199
+					EED_Single_Page_Checkout::$_initialized = false;
1200
+					EED_Single_Page_Checkout::$_checkout_verified = false;
1201
+					$this->_initialize();
1202
+					EE_Error::reset_notices();
1203
+					return false;
1204
+				}
1205
+				EE_Error::add_error(
1206
+					__(
1207
+						'We\'re sorry but there appears to be an error with the "reg_url_link" or the transaction itself. Please refresh the page and try again or contact support.',
1208
+						'event_espresso'
1209
+					),
1210
+					__FILE__,
1211
+					__FUNCTION__,
1212
+					__LINE__
1213
+				);
1214
+				return false;
1215
+			}
1216
+		}
1217
+		// now that things have been kinda sufficiently verified,
1218
+		// let's add the checkout to the session so that it's available to other systems
1219
+		EE_Registry::instance()->SSN->set_checkout($this->checkout);
1220
+		return true;
1221
+	}
1222
+
1223
+
1224
+
1225
+	/**
1226
+	 *    _initialize_reg_steps
1227
+	 * first makes sure that EE_Transaction_Processor::set_reg_step_initiated() is called as required
1228
+	 * then loops thru all of the active reg steps and calls the initialize_reg_step() method
1229
+	 *
1230
+	 * @access    private
1231
+	 * @param bool $reinitializing
1232
+	 * @throws EE_Error
1233
+	 */
1234
+	private function _initialize_reg_steps($reinitializing = false)
1235
+	{
1236
+		$this->checkout->set_reg_step_initiated($this->checkout->current_step);
1237
+		// loop thru all steps to call their individual "initialize" methods and set i18n strings for JS
1238
+		foreach ($this->checkout->reg_steps as $reg_step) {
1239
+			if ( ! $reg_step->initialize_reg_step()) {
1240
+				// if not initialized then maybe this step is being removed...
1241
+				if ( ! $reinitializing && $reg_step->is_current_step()) {
1242
+					// if it was the current step, then we need to start over here
1243
+					$this->_initialize_reg_steps(true);
1244
+					return;
1245
+				}
1246
+				continue;
1247
+			}
1248
+			// add css and JS for current step
1249
+			$reg_step->enqueue_styles_and_scripts();
1250
+			// i18n
1251
+			$reg_step->translate_js_strings();
1252
+			if ($reg_step->is_current_step()) {
1253
+				// the text that appears on the reg step form submit button
1254
+				$reg_step->set_submit_button_text();
1255
+			}
1256
+		}
1257
+		// dynamically creates hook point like: AHEE__Single_Page_Checkout___initialize_reg_step__attendee_information
1258
+		do_action(
1259
+			"AHEE__Single_Page_Checkout___initialize_reg_step__{$this->checkout->current_step->slug()}",
1260
+			$this->checkout->current_step
1261
+		);
1262
+	}
1263
+
1264
+
1265
+
1266
+	/**
1267
+	 * _check_form_submission
1268
+	 *
1269
+	 * @access private
1270
+	 * @return boolean
1271
+	 */
1272
+	private function _check_form_submission()
1273
+	{
1274
+		//does this request require the reg form to be generated ?
1275
+		if ($this->checkout->generate_reg_form) {
1276
+			// ever heard that song by Blue Rodeo ?
1277
+			try {
1278
+				$this->checkout->current_step->reg_form = $this->checkout->current_step->generate_reg_form();
1279
+				// if not displaying a form, then check for form submission
1280
+				if (
1281
+					$this->checkout->process_form_submission
1282
+					&& $this->checkout->current_step->reg_form->was_submitted()
1283
+				) {
1284
+					// clear out any old data in case this step is being run again
1285
+					$this->checkout->current_step->set_valid_data(array());
1286
+					// capture submitted form data
1287
+					$this->checkout->current_step->reg_form->receive_form_submission(
1288
+						apply_filters(
1289
+							'FHEE__Single_Page_Checkout___check_form_submission__request_params',
1290
+							EE_Registry::instance()->REQ->params(),
1291
+							$this->checkout
1292
+						)
1293
+					);
1294
+					// validate submitted form data
1295
+					if ( ! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) {
1296
+						// thou shall not pass !!!
1297
+						$this->checkout->continue_reg = false;
1298
+						// any form validation errors?
1299
+						if ($this->checkout->current_step->reg_form->submission_error_message() !== '') {
1300
+							$submission_error_messages = array();
1301
+							// bad, bad, bad registrant
1302
+							foreach (
1303
+								$this->checkout->current_step->reg_form->get_validation_errors_accumulated()
1304
+								as $validation_error
1305
+							) {
1306
+								if ($validation_error instanceof EE_Validation_Error) {
1307
+									$submission_error_messages[] = sprintf(
1308
+										__('%s : %s', 'event_espresso'),
1309
+										$validation_error->get_form_section()->html_label_text(),
1310
+										$validation_error->getMessage()
1311
+									);
1312
+								}
1313
+							}
1314
+							EE_Error::add_error(
1315
+								implode('<br />', $submission_error_messages),
1316
+								__FILE__, __FUNCTION__, __LINE__
1317
+							);
1318
+						}
1319
+						// well not really... what will happen is
1320
+						// we'll just get redirected back to redo the current step
1321
+						$this->go_to_next_step();
1322
+						return false;
1323
+					}
1324
+				}
1325
+			} catch (EE_Error $e) {
1326
+				$e->get_error();
1327
+			}
1328
+		}
1329
+		return true;
1330
+	}
1331
+
1332
+
1333
+
1334
+	/**
1335
+	 * _process_action
1336
+	 *
1337
+	 * @access private
1338
+	 * @return void
1339
+	 * @throws EE_Error
1340
+	 */
1341
+	private function _process_form_action()
1342
+	{
1343
+		// what cha wanna do?
1344
+		switch ($this->checkout->action) {
1345
+			// AJAX next step reg form
1346
+			case 'display_spco_reg_step' :
1347
+				$this->checkout->redirect = false;
1348
+				if (EE_Registry::instance()->REQ->ajax) {
1349
+					$this->checkout->json_response->set_reg_step_html(
1350
+						$this->checkout->current_step->display_reg_form()
1351
+					);
1352
+				}
1353
+				break;
1354
+			default :
1355
+				// meh... do one of those other steps first
1356
+				if (
1357
+					! empty($this->checkout->action)
1358
+					&& is_callable(array($this->checkout->current_step, $this->checkout->action))
1359
+				) {
1360
+					// dynamically creates hook point like:
1361
+					//   AHEE__Single_Page_Checkout__before_attendee_information__process_reg_step
1362
+					do_action(
1363
+						"AHEE__Single_Page_Checkout__before_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1364
+						$this->checkout->current_step
1365
+					);
1366
+					// call action on current step
1367
+					if (call_user_func(array($this->checkout->current_step, $this->checkout->action))) {
1368
+						// good registrant, you get to proceed
1369
+						if (
1370
+							$this->checkout->current_step->success_message() !== ''
1371
+							&& apply_filters(
1372
+								'FHEE__Single_Page_Checkout___process_form_action__display_success',
1373
+								false
1374
+							)
1375
+						) {
1376
+							EE_Error::add_success(
1377
+								$this->checkout->current_step->success_message()
1378
+								. '<br />' . $this->checkout->next_step->_instructions()
1379
+							);
1380
+						}
1381
+						// pack it up, pack it in...
1382
+						$this->_setup_redirect();
1383
+					}
1384
+					// dynamically creates hook point like:
1385
+					//  AHEE__Single_Page_Checkout__after_payment_options__process_reg_step
1386
+					do_action(
1387
+						"AHEE__Single_Page_Checkout__after_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1388
+						$this->checkout->current_step
1389
+					);
1390
+				} else {
1391
+					EE_Error::add_error(
1392
+						sprintf(
1393
+							__(
1394
+								'The requested form action "%s" does not exist for the current "%s" registration step.',
1395
+								'event_espresso'
1396
+							),
1397
+							$this->checkout->action,
1398
+							$this->checkout->current_step->name()
1399
+						),
1400
+						__FILE__,
1401
+						__FUNCTION__,
1402
+						__LINE__
1403
+					);
1404
+				}
1405
+			// end default
1406
+		}
1407
+		// store our progress so far
1408
+		$this->checkout->stash_transaction_and_checkout();
1409
+		// advance to the next step! If you pass GO, collect $200
1410
+		$this->go_to_next_step();
1411
+	}
1412
+
1413
+
1414
+
1415
+	/**
1416
+	 *        add_styles_and_scripts
1417
+	 *
1418
+	 * @access        public
1419
+	 * @return        void
1420
+	 */
1421
+	public function add_styles_and_scripts()
1422
+	{
1423
+		// i18n
1424
+		$this->translate_js_strings();
1425
+		if ($this->checkout->admin_request) {
1426
+			add_action('admin_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1427
+		} else {
1428
+			add_action('wp_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1429
+		}
1430
+	}
1431
+
1432
+
1433
+
1434
+	/**
1435
+	 *        translate_js_strings
1436
+	 *
1437
+	 * @access        public
1438
+	 * @return        void
1439
+	 */
1440
+	public function translate_js_strings()
1441
+	{
1442
+		EE_Registry::$i18n_js_strings['revisit'] = $this->checkout->revisit;
1443
+		EE_Registry::$i18n_js_strings['e_reg_url_link'] = $this->checkout->reg_url_link;
1444
+		EE_Registry::$i18n_js_strings['server_error'] = __(
1445
+			'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.',
1446
+			'event_espresso'
1447
+		);
1448
+		EE_Registry::$i18n_js_strings['invalid_json_response'] = __(
1449
+			'An invalid response was returned from the server while attempting to process your request. Please refresh the page and try again or contact support.',
1450
+			'event_espresso'
1451
+		);
1452
+		EE_Registry::$i18n_js_strings['validation_error'] = __(
1453
+			'There appears to be a problem with the form validation configuration! Please check the admin settings or contact support.',
1454
+			'event_espresso'
1455
+		);
1456
+		EE_Registry::$i18n_js_strings['invalid_payment_method'] = __(
1457
+			'There appears to be a problem with the payment method configuration! Please refresh the page and try again or contact support.',
1458
+			'event_espresso'
1459
+		);
1460
+		EE_Registry::$i18n_js_strings['reg_step_error'] = __(
1461
+			'This registration step could not be completed. Please refresh the page and try again.',
1462
+			'event_espresso'
1463
+		);
1464
+		EE_Registry::$i18n_js_strings['invalid_coupon'] = __(
1465
+			'We\'re sorry but that coupon code does not appear to be valid. If this is incorrect, please contact the site administrator.',
1466
+			'event_espresso'
1467
+		);
1468
+		EE_Registry::$i18n_js_strings['process_registration'] = sprintf(
1469
+			__(
1470
+				'Please wait while we process your registration.%sDo not refresh the page or navigate away while this is happening.%sThank you for your patience.',
1471
+				'event_espresso'
1472
+			),
1473
+			'<br/>',
1474
+			'<br/>'
1475
+		);
1476
+		EE_Registry::$i18n_js_strings['language'] = get_bloginfo('language');
1477
+		EE_Registry::$i18n_js_strings['EESID'] = EE_Registry::instance()->SSN->id();
1478
+		EE_Registry::$i18n_js_strings['currency'] = EE_Registry::instance()->CFG->currency;
1479
+		EE_Registry::$i18n_js_strings['datepicker_yearRange'] = '-150:+20';
1480
+		EE_Registry::$i18n_js_strings['timer_years'] = __('years', 'event_espresso');
1481
+		EE_Registry::$i18n_js_strings['timer_months'] = __('months', 'event_espresso');
1482
+		EE_Registry::$i18n_js_strings['timer_weeks'] = __('weeks', 'event_espresso');
1483
+		EE_Registry::$i18n_js_strings['timer_days'] = __('days', 'event_espresso');
1484
+		EE_Registry::$i18n_js_strings['timer_hours'] = __('hours', 'event_espresso');
1485
+		EE_Registry::$i18n_js_strings['timer_minutes'] = __('minutes', 'event_espresso');
1486
+		EE_Registry::$i18n_js_strings['timer_seconds'] = __('seconds', 'event_espresso');
1487
+		EE_Registry::$i18n_js_strings['timer_year'] = __('year', 'event_espresso');
1488
+		EE_Registry::$i18n_js_strings['timer_month'] = __('month', 'event_espresso');
1489
+		EE_Registry::$i18n_js_strings['timer_week'] = __('week', 'event_espresso');
1490
+		EE_Registry::$i18n_js_strings['timer_day'] = __('day', 'event_espresso');
1491
+		EE_Registry::$i18n_js_strings['timer_hour'] = __('hour', 'event_espresso');
1492
+		EE_Registry::$i18n_js_strings['timer_minute'] = __('minute', 'event_espresso');
1493
+		EE_Registry::$i18n_js_strings['timer_second'] = __('second', 'event_espresso');
1494
+		EE_Registry::$i18n_js_strings['registration_expiration_notice'] = sprintf(
1495
+			__(
1496
+				'%1$sWe\'re sorry, but your registration time has expired.%2$s%3$s%4$sIf you still wish to complete your registration, please return to the %5$sEvent List%6$sEvent List%7$s and reselect your tickets if available. Please except our apologies for any inconvenience this may have caused.%8$s',
1497
+				'event_espresso'
1498
+			),
1499
+			'<h4 class="important-notice">',
1500
+			'</h4>',
1501
+			'<br />',
1502
+			'<p>',
1503
+			'<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
1504
+			'">',
1505
+			'</a>',
1506
+			'</p>'
1507
+		);
1508
+		EE_Registry::$i18n_js_strings['ajax_submit'] = apply_filters(
1509
+			'FHEE__Single_Page_Checkout__translate_js_strings__ajax_submit',
1510
+			true
1511
+		);
1512
+		EE_Registry::$i18n_js_strings['session_extension'] = absint(
1513
+			apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS)
1514
+		);
1515
+		EE_Registry::$i18n_js_strings['session_expiration'] = gmdate(
1516
+			'M d, Y H:i:s',
1517
+			EE_Registry::instance()->SSN->expiration() + (get_option('gmt_offset') * HOUR_IN_SECONDS)
1518
+		);
1519
+	}
1520
+
1521
+
1522
+
1523
+	/**
1524
+	 *    enqueue_styles_and_scripts
1525
+	 *
1526
+	 * @access        public
1527
+	 * @return        void
1528
+	 * @throws EE_Error
1529
+	 */
1530
+	public function enqueue_styles_and_scripts()
1531
+	{
1532
+		// load css
1533
+		wp_register_style(
1534
+			'single_page_checkout',
1535
+			SPCO_CSS_URL . 'single_page_checkout.css',
1536
+			array('espresso_default'),
1537
+			EVENT_ESPRESSO_VERSION
1538
+		);
1539
+		wp_enqueue_style('single_page_checkout');
1540
+		// load JS
1541
+		wp_register_script(
1542
+			'jquery_plugin',
1543
+			EE_THIRD_PARTY_URL . 'jquery	.plugin.min.js',
1544
+			array('jquery'),
1545
+			'1.0.1',
1546
+			true
1547
+		);
1548
+		wp_register_script(
1549
+			'jquery_countdown',
1550
+			EE_THIRD_PARTY_URL . 'jquery	.countdown.min.js',
1551
+			array('jquery_plugin'),
1552
+			'2.0.2',
1553
+			true
1554
+		);
1555
+		wp_register_script(
1556
+			'single_page_checkout',
1557
+			SPCO_JS_URL . 'single_page_checkout.js',
1558
+			array('espresso_core', 'underscore', 'ee_form_section_validation', 'jquery_countdown'),
1559
+			EVENT_ESPRESSO_VERSION,
1560
+			true
1561
+		);
1562
+		if ($this->checkout->registration_form instanceof EE_Form_Section_Proper) {
1563
+			$this->checkout->registration_form->enqueue_js();
1564
+		}
1565
+		if ($this->checkout->current_step->reg_form instanceof EE_Form_Section_Proper) {
1566
+			$this->checkout->current_step->reg_form->enqueue_js();
1567
+		}
1568
+		wp_enqueue_script('single_page_checkout');
1569
+		/**
1570
+		 * global action hook for enqueueing styles and scripts with
1571
+		 * spco calls.
1572
+		 */
1573
+		do_action('AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts', $this);
1574
+		/**
1575
+		 * dynamic action hook for enqueueing styles and scripts with spco calls.
1576
+		 * The hook will end up being something like:
1577
+		 *      AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information
1578
+		 */
1579
+		do_action(
1580
+			'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(),
1581
+			$this
1582
+		);
1583
+	}
1584
+
1585
+
1586
+
1587
+	/**
1588
+	 *    display the Registration Single Page Checkout Form
1589
+	 *
1590
+	 * @access    private
1591
+	 * @return    void
1592
+	 * @throws EE_Error
1593
+	 */
1594
+	private function _display_spco_reg_form()
1595
+	{
1596
+		// if registering via the admin, just display the reg form for the current step
1597
+		if ($this->checkout->admin_request) {
1598
+			EE_Registry::instance()->REQ->add_output($this->checkout->current_step->display_reg_form());
1599
+		} else {
1600
+			// add powered by EE msg
1601
+			add_action('AHEE__SPCO__reg_form_footer', array('EED_Single_Page_Checkout', 'display_registration_footer'));
1602
+			$empty_cart = count(
1603
+				$this->checkout->transaction->registrations($this->checkout->reg_cache_where_params)
1604
+			) < 1;
1605
+			EE_Registry::$i18n_js_strings['empty_cart'] = $empty_cart;
1606
+			$cookies_not_set_msg = '';
1607
+			if ($empty_cart && ! isset($_COOKIE['ee_cookie_test'])) {
1608
+				$cookies_not_set_msg = apply_filters(
1609
+					'FHEE__Single_Page_Checkout__display_spco_reg_form__cookies_not_set_msg',
1610
+					sprintf(
1611
+						__(
1612
+							'%1$s%3$sIt appears your browser is not currently set to accept Cookies%4$s%5$sIn order to register for events, you need to enable cookies.%7$sIf you require assistance, then click the following link to learn how to %8$senable cookies%9$s%6$s%2$s',
1613
+							'event_espresso'
1614
+						),
1615
+						'<div class="ee-attention">',
1616
+						'</div>',
1617
+						'<h6 class="important-notice">',
1618
+						'</h6>',
1619
+						'<p>',
1620
+						'</p>',
1621
+						'<br />',
1622
+						'<a href="http://www.whatarecookies.com/enable.asp" target="_blank">',
1623
+						'</a>'
1624
+					)
1625
+				);
1626
+			}
1627
+			$this->checkout->registration_form = new EE_Form_Section_Proper(
1628
+				array(
1629
+					'name'            => 'single-page-checkout',
1630
+					'html_id'         => 'ee-single-page-checkout-dv',
1631
+					'layout_strategy' =>
1632
+						new EE_Template_Layout(
1633
+							array(
1634
+								'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php',
1635
+								'template_args'        => array(
1636
+									'empty_cart'              => $empty_cart,
1637
+									'revisit'                 => $this->checkout->revisit,
1638
+									'reg_steps'               => $this->checkout->reg_steps,
1639
+									'next_step'               => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
1640
+										? $this->checkout->next_step->slug()
1641
+										: '',
1642
+									'cancel_page_url'         => $this->checkout->cancel_page_url,
1643
+									'empty_msg'               => apply_filters(
1644
+										'FHEE__Single_Page_Checkout__display_spco_reg_form__empty_msg',
1645
+										sprintf(
1646
+											__(
1647
+												'You need to %1$sReturn to Events list%2$sselect at least one event%3$s before you can proceed with the registration process.',
1648
+												'event_espresso'
1649
+											),
1650
+											'<a href="'
1651
+											. get_post_type_archive_link('espresso_events')
1652
+											. '" title="',
1653
+											'">',
1654
+											'</a>'
1655
+										)
1656
+									),
1657
+									'cookies_not_set_msg'     => $cookies_not_set_msg,
1658
+									'registration_time_limit' => $this->checkout->get_registration_time_limit(),
1659
+									'session_expiration'      => gmdate(
1660
+										'M d, Y H:i:s',
1661
+										EE_Registry::instance()->SSN->expiration()
1662
+										+ (get_option('gmt_offset') * HOUR_IN_SECONDS)
1663
+									),
1664
+								),
1665
+							)
1666
+						),
1667
+				)
1668
+			);
1669
+			// load template and add to output sent that gets filtered into the_content()
1670
+			EE_Registry::instance()->REQ->add_output($this->checkout->registration_form->get_html());
1671
+		}
1672
+	}
1673
+
1674
+
1675
+
1676
+	/**
1677
+	 *    add_extra_finalize_registration_inputs
1678
+	 *
1679
+	 * @access    public
1680
+	 * @param $next_step
1681
+	 * @internal  param string $label
1682
+	 * @return void
1683
+	 */
1684
+	public function add_extra_finalize_registration_inputs($next_step)
1685
+	{
1686
+		if ($next_step === 'finalize_registration') {
1687
+			echo '<div id="spco-extra-finalize_registration-inputs-dv"></div>';
1688
+		}
1689
+	}
1690
+
1691
+
1692
+
1693
+	/**
1694
+	 *    display_registration_footer
1695
+	 *
1696
+	 * @access    public
1697
+	 * @return    string
1698
+	 */
1699
+	public static function display_registration_footer()
1700
+	{
1701
+		if (
1702
+		apply_filters(
1703
+			'FHEE__EE_Front__Controller__show_reg_footer',
1704
+			EE_Registry::instance()->CFG->admin->show_reg_footer
1705
+		)
1706
+		) {
1707
+			add_filter(
1708
+				'FHEE__EEH_Template__powered_by_event_espresso__url',
1709
+				function ($url) {
1710
+					return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url);
1711
+				}
1712
+			);
1713
+			echo apply_filters(
1714
+				'FHEE__EE_Front_Controller__display_registration_footer',
1715
+				\EEH_Template::powered_by_event_espresso(
1716
+					'',
1717
+					'espresso-registration-footer-dv',
1718
+					array('utm_content' => 'registration_checkout')
1719
+				)
1720
+			);
1721
+		}
1722
+		return '';
1723
+	}
1724
+
1725
+
1726
+
1727
+	/**
1728
+	 *    unlock_transaction
1729
+	 *
1730
+	 * @access    public
1731
+	 * @return    void
1732
+	 * @throws EE_Error
1733
+	 */
1734
+	public function unlock_transaction()
1735
+	{
1736
+		if ($this->checkout->transaction instanceof EE_Transaction) {
1737
+			$this->checkout->transaction->unlock();
1738
+		}
1739
+	}
1740
+
1741
+
1742
+
1743
+	/**
1744
+	 *        _setup_redirect
1745
+	 *
1746
+	 * @access    private
1747
+	 * @return void
1748
+	 */
1749
+	private function _setup_redirect()
1750
+	{
1751
+		if ($this->checkout->continue_reg && $this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
1752
+			$this->checkout->redirect = true;
1753
+			if (empty($this->checkout->redirect_url)) {
1754
+				$this->checkout->redirect_url = $this->checkout->next_step->reg_step_url();
1755
+			}
1756
+			$this->checkout->redirect_url = apply_filters(
1757
+				'FHEE__EED_Single_Page_Checkout___setup_redirect__checkout_redirect_url',
1758
+				$this->checkout->redirect_url,
1759
+				$this->checkout
1760
+			);
1761
+		}
1762
+	}
1763
+
1764
+
1765
+
1766
+	/**
1767
+	 *   handle ajax message responses and redirects
1768
+	 *
1769
+	 * @access public
1770
+	 * @return void
1771
+	 * @throws EE_Error
1772
+	 */
1773
+	public function go_to_next_step()
1774
+	{
1775
+		if (EE_Registry::instance()->REQ->ajax) {
1776
+			// capture contents of output buffer we started earlier in the request, and insert into JSON response
1777
+			$this->checkout->json_response->set_unexpected_errors(ob_get_clean());
1778
+		}
1779
+		$this->unlock_transaction();
1780
+		// just return for these conditions
1781
+		if (
1782
+			$this->checkout->admin_request
1783
+			|| $this->checkout->action === 'redirect_form'
1784
+			|| $this->checkout->action === 'update_checkout'
1785
+		) {
1786
+			return;
1787
+		}
1788
+		// AJAX response
1789
+		$this->_handle_json_response();
1790
+		// redirect to next step or the Thank You page
1791
+		$this->_handle_html_redirects();
1792
+		// hmmm... must be something wrong, so let's just display the form again !
1793
+		$this->_display_spco_reg_form();
1794
+	}
1795
+
1796
+
1797
+
1798
+	/**
1799
+	 *   _handle_json_response
1800
+	 *
1801
+	 * @access protected
1802
+	 * @return void
1803
+	 */
1804
+	protected function _handle_json_response()
1805
+	{
1806
+		// if this is an ajax request
1807
+		if (EE_Registry::instance()->REQ->ajax) {
1808
+			// DEBUG LOG
1809
+			//$this->checkout->log(
1810
+			//	__CLASS__, __FUNCTION__, __LINE__,
1811
+			//	array(
1812
+			//		'json_response_redirect_url' => $this->checkout->json_response->redirect_url(),
1813
+			//		'redirect'                   => $this->checkout->redirect,
1814
+			//		'continue_reg'               => $this->checkout->continue_reg,
1815
+			//	)
1816
+			//);
1817
+			$this->checkout->json_response->set_registration_time_limit(
1818
+				$this->checkout->get_registration_time_limit()
1819
+			);
1820
+			$this->checkout->json_response->set_payment_amount($this->checkout->amount_owing);
1821
+			// just send the ajax (
1822
+			$json_response = apply_filters(
1823
+				'FHEE__EE_Single_Page_Checkout__JSON_response',
1824
+				$this->checkout->json_response
1825
+			);
1826
+			echo $json_response;
1827
+			exit();
1828
+		}
1829
+	}
1830
+
1831
+
1832
+
1833
+	/**
1834
+	 *   _handle_redirects
1835
+	 *
1836
+	 * @access protected
1837
+	 * @return void
1838
+	 */
1839
+	protected function _handle_html_redirects()
1840
+	{
1841
+		// going somewhere ?
1842
+		if ($this->checkout->redirect && ! empty($this->checkout->redirect_url)) {
1843
+			// store notices in a transient
1844
+			EE_Error::get_notices(false, true, true);
1845
+			// DEBUG LOG
1846
+			//$this->checkout->log(
1847
+			//	__CLASS__, __FUNCTION__, __LINE__,
1848
+			//	array(
1849
+			//		'headers_sent' => headers_sent(),
1850
+			//		'redirect_url'     => $this->checkout->redirect_url,
1851
+			//		'headers_list'    => headers_list(),
1852
+			//	)
1853
+			//);
1854
+			wp_safe_redirect($this->checkout->redirect_url);
1855
+			exit();
1856
+		}
1857
+	}
1858
+
1859
+
1860
+
1861
+	/**
1862
+	 *   set_checkout_anchor
1863
+	 *
1864
+	 * @access public
1865
+	 * @return void
1866
+	 */
1867
+	public function set_checkout_anchor()
1868
+	{
1869
+		echo '<a id="checkout" style="float: left; margin-left: -999em;"></a>';
1870
+	}
1871 1871
 
1872 1872
 
1873 1873
 
Please login to merge, or discard this patch.
Spacing   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -218,19 +218,19 @@  discard block
 block discarded – undo
218 218
      */
219 219
     public static function set_definitions()
220 220
     {
221
-        if(defined('SPCO_BASE_PATH')) {
221
+        if (defined('SPCO_BASE_PATH')) {
222 222
             return;
223 223
         }
224 224
         define(
225 225
             'SPCO_BASE_PATH',
226
-            rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS) . DS
226
+            rtrim(str_replace(array('\\', '/'), DS, plugin_dir_path(__FILE__)), DS).DS
227 227
         );
228
-        define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css' . DS);
229
-        define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img' . DS);
230
-        define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js' . DS);
231
-        define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc' . DS);
232
-        define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps' . DS);
233
-        define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates' . DS);
228
+        define('SPCO_CSS_URL', plugin_dir_url(__FILE__).'css'.DS);
229
+        define('SPCO_IMG_URL', plugin_dir_url(__FILE__).'img'.DS);
230
+        define('SPCO_JS_URL', plugin_dir_url(__FILE__).'js'.DS);
231
+        define('SPCO_INC_PATH', SPCO_BASE_PATH.'inc'.DS);
232
+        define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH.'reg_steps'.DS);
233
+        define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH.'templates'.DS);
234 234
         EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true);
235 235
         EE_Registry::$i18n_js_strings['registration_expiration_notice'] = sprintf(
236 236
             __('%1$sWe\'re sorry, but you\'re registration time has expired.%2$s%4$sIf you still wish to complete your registration, please return to the %5$sEvent List%6$sEvent List%7$s and reselect your tickets if available. Please except our apologies for any inconvenience this may have caused.%8$s',
@@ -239,7 +239,7 @@  discard block
 block discarded – undo
239 239
             '</h4>',
240 240
             '<br />',
241 241
             '<p>',
242
-            '<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
242
+            '<a href="'.get_post_type_archive_link('espresso_events').'" title="',
243 243
             '">',
244 244
             '</a>',
245 245
             '</p>'
@@ -262,7 +262,7 @@  discard block
 block discarded – undo
262 262
             return;
263 263
         }
264 264
         // filter list of reg_steps
265
-        $reg_steps_to_load = (array)apply_filters(
265
+        $reg_steps_to_load = (array) apply_filters(
266 266
             'AHEE__SPCO__load_reg_steps__reg_steps_to_load',
267 267
             EED_Single_Page_Checkout::get_reg_steps()
268 268
         );
@@ -314,25 +314,25 @@  discard block
 block discarded – undo
314 314
         if (empty($reg_steps)) {
315 315
             $reg_steps = array(
316 316
                 10  => array(
317
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'attendee_information',
317
+                    'file_path'  => SPCO_REG_STEPS_PATH.'attendee_information',
318 318
                     'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information',
319 319
                     'slug'       => 'attendee_information',
320 320
                     'has_hooks'  => false,
321 321
                 ),
322 322
                 20  => array(
323
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'registration_confirmation',
323
+                    'file_path'  => SPCO_REG_STEPS_PATH.'registration_confirmation',
324 324
                     'class_name' => 'EE_SPCO_Reg_Step_Registration_Confirmation',
325 325
                     'slug'       => 'registration_confirmation',
326 326
                     'has_hooks'  => false,
327 327
                 ),
328 328
                 30  => array(
329
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'payment_options',
329
+                    'file_path'  => SPCO_REG_STEPS_PATH.'payment_options',
330 330
                     'class_name' => 'EE_SPCO_Reg_Step_Payment_Options',
331 331
                     'slug'       => 'payment_options',
332 332
                     'has_hooks'  => true,
333 333
                 ),
334 334
                 999 => array(
335
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'finalize_registration',
335
+                    'file_path'  => SPCO_REG_STEPS_PATH.'finalize_registration',
336 336
                     'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration',
337 337
                     'slug'       => 'finalize_registration',
338 338
                     'has_hooks'  => false,
@@ -516,7 +516,7 @@  discard block
 block discarded – undo
516 516
             // DEBUG LOG
517 517
             //$this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
518 518
             // get reg form
519
-            if( ! $this->_check_form_submission()) {
519
+            if ( ! $this->_check_form_submission()) {
520 520
                 EED_Single_Page_Checkout::$_initialized = true;
521 521
                 return;
522 522
             }
@@ -1114,7 +1114,7 @@  discard block
 block discarded – undo
1114 1114
                     if ( ! $registration instanceof EE_Registration) {
1115 1115
                         throw new InvalidEntityException($registration, 'EE_Registration');
1116 1116
                     }
1117
-                    $registrations[ $registration->ID() ] = $registration;
1117
+                    $registrations[$registration->ID()] = $registration;
1118 1118
                 }
1119 1119
             }
1120 1120
             $registration_processor->fix_reg_final_price_rounding_issue($transaction);
@@ -1375,7 +1375,7 @@  discard block
 block discarded – undo
1375 1375
                         ) {
1376 1376
                             EE_Error::add_success(
1377 1377
                                 $this->checkout->current_step->success_message()
1378
-                                . '<br />' . $this->checkout->next_step->_instructions()
1378
+                                . '<br />'.$this->checkout->next_step->_instructions()
1379 1379
                             );
1380 1380
                         }
1381 1381
                         // pack it up, pack it in...
@@ -1500,7 +1500,7 @@  discard block
 block discarded – undo
1500 1500
             '</h4>',
1501 1501
             '<br />',
1502 1502
             '<p>',
1503
-            '<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
1503
+            '<a href="'.get_post_type_archive_link('espresso_events').'" title="',
1504 1504
             '">',
1505 1505
             '</a>',
1506 1506
             '</p>'
@@ -1532,7 +1532,7 @@  discard block
 block discarded – undo
1532 1532
         // load css
1533 1533
         wp_register_style(
1534 1534
             'single_page_checkout',
1535
-            SPCO_CSS_URL . 'single_page_checkout.css',
1535
+            SPCO_CSS_URL.'single_page_checkout.css',
1536 1536
             array('espresso_default'),
1537 1537
             EVENT_ESPRESSO_VERSION
1538 1538
         );
@@ -1540,21 +1540,21 @@  discard block
 block discarded – undo
1540 1540
         // load JS
1541 1541
         wp_register_script(
1542 1542
             'jquery_plugin',
1543
-            EE_THIRD_PARTY_URL . 'jquery	.plugin.min.js',
1543
+            EE_THIRD_PARTY_URL.'jquery	.plugin.min.js',
1544 1544
             array('jquery'),
1545 1545
             '1.0.1',
1546 1546
             true
1547 1547
         );
1548 1548
         wp_register_script(
1549 1549
             'jquery_countdown',
1550
-            EE_THIRD_PARTY_URL . 'jquery	.countdown.min.js',
1550
+            EE_THIRD_PARTY_URL.'jquery	.countdown.min.js',
1551 1551
             array('jquery_plugin'),
1552 1552
             '2.0.2',
1553 1553
             true
1554 1554
         );
1555 1555
         wp_register_script(
1556 1556
             'single_page_checkout',
1557
-            SPCO_JS_URL . 'single_page_checkout.js',
1557
+            SPCO_JS_URL.'single_page_checkout.js',
1558 1558
             array('espresso_core', 'underscore', 'ee_form_section_validation', 'jquery_countdown'),
1559 1559
             EVENT_ESPRESSO_VERSION,
1560 1560
             true
@@ -1577,7 +1577,7 @@  discard block
 block discarded – undo
1577 1577
          *      AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information
1578 1578
          */
1579 1579
         do_action(
1580
-            'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(),
1580
+            'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__'.$this->checkout->current_step->slug(),
1581 1581
             $this
1582 1582
         );
1583 1583
     }
@@ -1631,7 +1631,7 @@  discard block
 block discarded – undo
1631 1631
                     'layout_strategy' =>
1632 1632
                         new EE_Template_Layout(
1633 1633
                             array(
1634
-                                'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php',
1634
+                                'layout_template_file' => SPCO_TEMPLATES_PATH.'registration_page_wrapper.template.php',
1635 1635
                                 'template_args'        => array(
1636 1636
                                     'empty_cart'              => $empty_cart,
1637 1637
                                     'revisit'                 => $this->checkout->revisit,
@@ -1706,7 +1706,7 @@  discard block
 block discarded – undo
1706 1706
         ) {
1707 1707
             add_filter(
1708 1708
                 'FHEE__EEH_Template__powered_by_event_espresso__url',
1709
-                function ($url) {
1709
+                function($url) {
1710 1710
                     return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url);
1711 1711
                 }
1712 1712
             );
Please login to merge, or discard this patch.
modules/thank_you_page/EED_Thank_You_Page.module.php 1 patch
Indentation   +916 added lines, -916 removed lines patch added patch discarded remove patch
@@ -14,757 +14,757 @@  discard block
 block discarded – undo
14 14
 class EED_Thank_You_Page extends EED_Module
15 15
 {
16 16
 
17
-    /**
18
-     * time in seconds to wait for the IPN to arrive before telling the registrant to bugger off ( 1200s = 20 minutes )
19
-     */
20
-    const IPN_wait_time = 1200;
21
-
22
-    /**
23
-     * The transaction specified by the reg_url_link passed from the Request, or from the Session
24
-     *
25
-     * @var EE_Transaction $_current_txn
26
-     */
27
-    private $_current_txn;
28
-
29
-    /**
30
-     * @var EE_Registration $_primary_registrant
31
-     */
32
-    private $_primary_registrant;
33
-
34
-    /**
35
-     * The reg_url_link passed from the Request, or from the Session
36
-     *
37
-     * @var string $_reg_url_link
38
-     */
39
-    private $_reg_url_link;
40
-
41
-    /**
42
-     * whether the incoming reg_url_link is for the primary registrant or not
43
-     *
44
-     * @var boolean $_is_primary
45
-     */
46
-    private $_is_primary;
47
-
48
-    /**
49
-     * The URL for revisiting the SPCO attendee information step
50
-     *
51
-     * @var string $_SPCO_attendee_information_url
52
-     */
53
-    private $_SPCO_attendee_information_url;
54
-
55
-    /**
56
-     * The URL for revisiting the SPCO payment options step
57
-     *
58
-     * @var string $_SPCO_payment_options_url
59
-     */
60
-    private $_SPCO_payment_options_url;
61
-
62
-    /**
63
-     * whether to display the Payment Options link
64
-     *
65
-     * @var boolean $_show_try_pay_again_link
66
-     */
67
-    private $_show_try_pay_again_link = false;
68
-
69
-    /**
70
-     * whether payments are allowed at this time
71
-     *
72
-     * @var boolean $_payments_closed
73
-     */
74
-    private $_payments_closed = false;
75
-
76
-    /**
77
-     * whether the selected payment method is Bank, Check , Invoice, etc
78
-     *
79
-     * @var boolean $_is_offline_payment_method
80
-     */
81
-    private $_is_offline_payment_method = true;
82
-
83
-
84
-
85
-    /**
86
-     * @return EED_Module|EED_Thank_You_Page
87
-     */
88
-    public static function instance()
89
-    {
90
-        return parent::get_instance(__CLASS__);
91
-    }
92
-
93
-
94
-    /**
95
-     * set_hooks - for hooking into EE Core, modules, etc
96
-     *
97
-     * @return void
98
-     */
99
-    public static function set_hooks()
100
-    {
101
-        add_action('wp_loaded', array('EED_Thank_You_Page', 'set_definitions'), 2);
102
-    }
103
-
104
-
105
-
106
-    /**
107
-     * set_hooks_admin - for hooking into EE Admin Core, modules, etc
108
-     *
109
-     * @return void
110
-     */
111
-    public static function set_hooks_admin()
112
-    {
113
-        // AJAX for IPN monitoring
114
-        add_filter('heartbeat_received', array('EED_Thank_You_Page', 'thank_you_page_IPN_monitor'), 10, 3);
115
-        add_filter(
116
-            'heartbeat_nopriv_received',
117
-            array('EED_Thank_You_Page', 'thank_you_page_IPN_monitor'),
118
-            10,
119
-            3
120
-        );
121
-        add_action(
122
-            'wp_ajax_espresso_resend_reg_confirmation_email',
123
-            array('EED_Thank_You_Page', 'resend_reg_confirmation_email'),
124
-            10,
125
-            2
126
-        );
127
-        add_action(
128
-            'wp_ajax_nopriv_espresso_resend_reg_confirmation_email',
129
-            array('EED_Thank_You_Page', 'resend_reg_confirmation_email'),
130
-            10,
131
-            2
132
-        );
133
-    }
134
-
135
-
136
-
137
-    /**
138
-     * set_definitions
139
-     *
140
-     * @return void
141
-     */
142
-    public static function set_definitions()
143
-    {
144
-        define('THANK_YOU_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets' . DS);
145
-        define('THANK_YOU_TEMPLATES_PATH', str_replace('\\', DS, plugin_dir_path(__FILE__)) . 'templates' . DS);
146
-    }
147
-
148
-
149
-
150
-    /**
151
-     * get_txn
152
-     *
153
-     * @return EE_Transaction
154
-     */
155
-    public function get_txn()
156
-    {
157
-        if ($this->_current_txn instanceof EE_Transaction) {
158
-            return $this->_current_txn;
159
-        }
160
-        $TXN_model = EE_Registry::instance()->load_model('Transaction');
161
-        if ( ! $TXN_model instanceof EEM_Transaction) {
162
-            EE_Error::add_error(
163
-                __('The transaction model could not be established.', 'event_espresso'),
164
-                __FILE__,
165
-                __FUNCTION__,
166
-                __LINE__
167
-            );
168
-            return null;
169
-        }
170
-        //get the transaction. yes, we may have just loaded it, but it may have been updated, or this may be via an ajax request
171
-        $this->_current_txn = $TXN_model->get_transaction_from_reg_url_link($this->_reg_url_link);
172
-        // verify TXN
173
-        if (WP_DEBUG && ! $this->_current_txn instanceof EE_Transaction) {
174
-            EE_Error::add_error(
175
-                __(
176
-                    'No transaction information could be retrieved or the transaction data is not of the correct type.',
177
-                    'event_espresso'
178
-                ),
179
-                __FILE__,
180
-                __FUNCTION__,
181
-                __LINE__
182
-            );
183
-            return null;
184
-        }
185
-        return $this->_current_txn;
186
-    }
187
-
188
-
189
-
190
-    /**
191
-     * get_txn_payments
192
-     *
193
-     * @param int $since
194
-     * @return mixed array of EE_Payment || FALSE
195
-     * @throws \EE_Error
196
-     */
197
-    public function get_txn_payments($since = 0)
198
-    {
199
-        if ( ! $this->get_txn()) {
200
-            return false;
201
-        }
202
-        $args = array('order_by' => array('PAY_timestamp' => 'ASC'));
203
-        if ($since > 0) {
204
-            $args[0] = array('PAY_timestamp' => array('>', $since));
205
-        }
206
-        // get array of payments with most recent first
207
-        return $this->_current_txn->payments($args);
208
-    }
209
-
210
-
211
-
212
-    /**
213
-     * get_reg_url_link
214
-     *
215
-     * @return void
216
-     */
217
-    private function _get_reg_url_link()
218
-    {
219
-        if ( ! empty($this->_reg_url_link)) {
220
-            return;
221
-        }
222
-        // only do thank you page stuff if we have a REG_url_link in the url
223
-        if (WP_DEBUG && ! EE_Registry::instance()->REQ->is_set('e_reg_url_link')) {
224
-            EE_Error::add_error(
225
-                __(
226
-                    'No transaction information could be retrieved because the registration URL link is missing or invalid.',
227
-                    'event_espresso'
228
-                ),
229
-                __FILE__,
230
-                __FUNCTION__,
231
-                __LINE__
232
-            );
233
-            return;
234
-        }
235
-        // check for reg_url_link
236
-        $this->_reg_url_link = EE_Registry::instance()->REQ->get('e_reg_url_link');
237
-    }
238
-
239
-
240
-
241
-    /**
242
-     * set_reg_url_link
243
-     *
244
-     * @param string $reg_url_link
245
-     */
246
-    public function set_reg_url_link($reg_url_link = null)
247
-    {
248
-        $this->_reg_url_link = ! empty($reg_url_link) ? $reg_url_link : $this->_reg_url_link;
249
-    }
250
-
251
-
252
-
253
-    /**
254
-     * run - initial module setup
255
-     * this method is primarily used for activating resources in the EE_Front_Controller thru the use of filters
256
-     *
257
-     * @param WP $WP
258
-     * @return void
259
-     * @throws \EE_Error
260
-     */
261
-    public function run($WP)
262
-    {
263
-
264
-    }
265
-
266
-
267
-
268
-    /**
269
-     * load_resources
270
-     *
271
-     * @return void
272
-     * @throws \EE_Error
273
-     */
274
-    public function load_resources() {
275
-        $this->_get_reg_url_link();
276
-        // resend_reg_confirmation_email ?
277
-        if (EE_Registry::instance()->REQ->is_set('resend')) {
278
-            EED_Thank_You_Page::resend_reg_confirmation_email();
279
-        }
280
-        EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
281
-        $this->_translate_strings();
282
-        // load assets
283
-        add_action('wp_enqueue_scripts', array($this, 'load_js'), 10);
284
-    }
285
-
286
-
287
-
288
-    /**
289
-     * load_js
290
-     *
291
-     * @return void
292
-     */
293
-    protected function _translate_strings()
294
-    {
295
-        EE_Registry::$i18n_js_strings['e_reg_url_link'] = $this->_reg_url_link;
296
-        EE_Registry::$i18n_js_strings['initial_access'] = time();
297
-        EE_Registry::$i18n_js_strings['IPN_wait_time'] = EED_Thank_You_Page::IPN_wait_time;
298
-        EE_Registry::$i18n_js_strings['TXN_complete'] = EEM_Transaction::complete_status_code;
299
-        EE_Registry::$i18n_js_strings['TXN_incomplete'] = EEM_Transaction::incomplete_status_code;
300
-        EE_Registry::$i18n_js_strings['checking_for_new_payments'] = __(
301
-            'checking for new payments...',
302
-            'event_espresso'
303
-        );
304
-        EE_Registry::$i18n_js_strings['loading_payment_info'] = __(
305
-            'loading payment information...',
306
-            'event_espresso'
307
-        );
308
-        EE_Registry::$i18n_js_strings['server_error'] = __(
309
-            'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again.',
310
-            'event_espresso'
311
-        );
312
-        EE_Registry::$i18n_js_strings['slow_IPN'] = apply_filters(
313
-            'EED_Thank_You_Page__load_js__slow_IPN',
314
-            sprintf(
315
-                __(
316
-                    '%sThe Payment Notification appears to be taking longer than usual to arrive. Maybe check back later or just wait for your payment and registration confirmation results to be sent to you via email. We apologize for any inconvenience this may have caused.%s',
317
-                    'event_espresso'
318
-                ),
319
-                '<div id="espresso-thank-you-page-slow-IPN-dv" class="ee-attention jst-left">',
320
-                '</div>'
321
-            )
322
-        );
323
-    }
324
-
325
-
326
-
327
-    /**
328
-     * load_js
329
-     *
330
-     * @return void
331
-     */
332
-    public function load_js()
333
-    {
334
-        wp_register_script(
335
-            'thank_you_page',
336
-            THANK_YOU_ASSETS_URL . 'thank_you_page.js',
337
-            array('espresso_core', 'heartbeat'),
338
-            EVENT_ESPRESSO_VERSION,
339
-            true
340
-        );
341
-        wp_enqueue_script('thank_you_page');
342
-        wp_enqueue_style('espresso_default');
343
-    }
344
-
345
-
346
-
347
-    /**
348
-     * init
349
-     *
350
-     * @return void
351
-     * @throws \EE_Error
352
-     */
353
-    public function init()
354
-    {
355
-        $this->_get_reg_url_link();
356
-        if ( ! $this->get_txn()) {
357
-            echo EEH_HTML::div(
358
-                EEH_HTML::h4(__('We\'re sorry...', 'event_espresso'), '', '') .
359
-                sprintf(
360
-                    __(
361
-                        'This is a system page for displaying transaction information after a purchase.%1$sYou are most likely seeing this notice because you have navigated to this page%1$sthrough some means other than completing a transaction.%1$sSorry for the disappointment, but you will most likely find nothing of interest here.%1$s%1$s',
362
-                        'event_espresso'
363
-                    ),
364
-                    '<br/>'
365
-                ),
366
-                '',
367
-                'ee-attention'
368
-            );
369
-            return null;
370
-        }
371
-        // if we've made it to the Thank You page, then let's toggle any "Failed" transactions to "Incomplete"
372
-        if ($this->_current_txn->status_ID() === EEM_Transaction::failed_status_code) {
373
-            $this->_current_txn->set_status(EEM_Transaction::incomplete_status_code);
374
-            $this->_current_txn->save();
375
-        }
376
-        $this->_primary_registrant = $this->_current_txn->primary_registration() instanceof EE_Registration
377
-            ? $this->_current_txn->primary_registration()
378
-            : null;
379
-        $this->_is_primary = $this->_primary_registrant->reg_url_link() === $this->_reg_url_link ? true : false;
380
-        $show_try_pay_again_link_default = apply_filters(
381
-            'AFEE__EED_Thank_You_Page__init__show_try_pay_again_link_default',
382
-            true
383
-        );
384
-        $this->_show_try_pay_again_link = $show_try_pay_again_link_default;
385
-        // txn status ?
386
-        if ($this->_current_txn->is_completed()) {
387
-            $this->_show_try_pay_again_link = $show_try_pay_again_link_default;
388
-        } else if (
389
-            $this->_current_txn->is_incomplete()
390
-            && ($this->_primary_registrant->is_approved()
391
-                || $this->_primary_registrant->is_pending_payment())
392
-        ) {
393
-            $this->_show_try_pay_again_link = true;
394
-        } else if ($this->_primary_registrant->is_approved() || $this->_primary_registrant->is_pending_payment()) {
395
-            // its pending
396
-            $this->_show_try_pay_again_link = isset(
397
-                                                  EE_Registry::instance()->CFG->registration->show_pending_payment_options
398
-                                              )
399
-                                              && EE_Registry::instance()->CFG->registration->show_pending_payment_options
400
-                ? true
401
-                : $show_try_pay_again_link_default;
402
-        }
403
-        $this->_payments_closed = ! $this->_current_txn->payment_method() instanceof EE_Payment_Method
404
-            ? true
405
-            : false;
406
-        $this->_is_offline_payment_method = false;
407
-        if (
408
-            // if payment method is unknown
409
-            ! $this->_current_txn->payment_method() instanceof EE_Payment_Method
410
-            || (
411
-                // or is an offline payment method
412
-                $this->_current_txn->payment_method() instanceof EE_Payment_Method
413
-                && $this->_current_txn->payment_method()->is_off_line()
414
-            )
415
-        ) {
416
-            $this->_is_offline_payment_method = true;
417
-        }
418
-        // link to SPCO
419
-        $revisit_spco_url = add_query_arg(
420
-            array('ee' => '_register', 'revisit' => true, 'e_reg_url_link' => $this->_reg_url_link),
421
-            EE_Registry::instance()->CFG->core->reg_page_url()
422
-        );
423
-        // link to SPCO payment_options
424
-        $this->_SPCO_payment_options_url = $this->_primary_registrant instanceof EE_Registration
425
-            ? $this->_primary_registrant->payment_overview_url()
426
-            : add_query_arg(
427
-                array('step' => 'payment_options'),
428
-                $revisit_spco_url
429
-            );
430
-        // link to SPCO attendee_information
431
-        $this->_SPCO_attendee_information_url = $this->_primary_registrant instanceof EE_Registration
432
-            ? $this->_primary_registrant->edit_attendee_information_url()
433
-            : false;
434
-        do_action('AHEE__EED_Thank_You_Page__init_end', $this->_current_txn);
435
-        // set no cache headers and constants
436
-        EE_System::do_not_cache();
437
-    }
438
-
439
-
440
-
441
-    /**
442
-     * display_thank_you_page_results
443
-     *
444
-     * @return string
445
-     * @throws \EE_Error
446
-     */
447
-    public function thank_you_page_results()
448
-    {
449
-        $this->init();
450
-        if ( ! $this->_current_txn instanceof EE_Transaction) {
451
-            return EE_Error::get_notices();
452
-        }
453
-        // link to receipt
454
-        $template_args['TXN_receipt_url'] = $this->_current_txn->receipt_url('html');
455
-        if ( ! empty($template_args['TXN_receipt_url'])) {
456
-            $template_args['order_conf_desc'] = __(
457
-                '%1$sCongratulations%2$sYour registration has been successfully processed.%3$sCheck your email for your registration confirmation or click the button below to view / download / print a full description of your purchases and registration information.',
458
-                'event_espresso'
459
-            );
460
-        } else {
461
-            $template_args['order_conf_desc'] = __(
462
-                '%1$sCongratulations%2$sYour registration has been successfully processed.%3$sCheck your email for your registration confirmation.',
463
-                'event_espresso'
464
-            );
465
-        }
466
-        $template_args['transaction'] = $this->_current_txn;
467
-        $template_args['revisit'] = EE_Registry::instance()->REQ->get('revisit', false);
468
-        add_action('AHEE__thank_you_page_overview_template__content', array($this, 'get_registration_details'));
469
-        if ($this->_is_primary && ! $this->_current_txn->is_free()) {
470
-            add_action('AHEE__thank_you_page_overview_template__content', array($this, 'get_ajax_content'));
471
-        }
472
-        return EEH_Template::locate_template(
473
-            THANK_YOU_TEMPLATES_PATH . 'thank-you-page-overview.template.php',
474
-            $template_args,
475
-            true,
476
-            true
477
-        );
478
-    }
479
-
480
-
481
-
482
-    /**
483
-     * thank_you_page_IPN_monitor
484
-     * this basically just pulls the TXN based on the reg_url_link sent from the server,
485
-     * then checks that the TXN status is not failed, and that no other errors have been generated.
486
-     * it also calculates the IPN wait time since the Thank You page was first loaded
487
-     *
488
-     * @param array $response
489
-     * @param array $data
490
-     * @return array
491
-     * @throws \EE_Error
492
-     */
493
-    public static function thank_you_page_IPN_monitor($response = array(), $data = array())
494
-    {
495
-        // does this heartbeat contain our data ?
496
-        if ( ! isset($data['espresso_thank_you_page'])) {
497
-            return $response;
498
-        }
499
-        // check for reg_url_link in the incoming heartbeat data
500
-        if ( ! isset($data['espresso_thank_you_page']['e_reg_url_link'])) {
501
-            $response['espresso_thank_you_page'] = array(
502
-                'errors' => ! empty($notices['errors'])
503
-                    ? $notices['errors']
504
-                    : __(
505
-                        'No transaction information could be retrieved because the registration URL link is missing or invalid.',
506
-                        'event_espresso'
507
-                    )
508
-            );
509
-            return $response;
510
-        }
511
-        // kk heartbeat has our data
512
-        $response['espresso_thank_you_page'] = array();
513
-        // set_definitions, instantiate the thank you page class, and get the ball rolling
514
-        EED_Thank_You_Page::set_definitions();
515
-        /** @var $espresso_thank_you_page EED_Thank_You_Page */
516
-        $espresso_thank_you_page = EED_Thank_You_Page::instance();
517
-        $espresso_thank_you_page->set_reg_url_link($data['espresso_thank_you_page']['e_reg_url_link']);
518
-        $espresso_thank_you_page->init();
519
-        //get TXN
520
-        $TXN = $espresso_thank_you_page->get_txn();
521
-        // no TXN? then get out
522
-        if ( ! $TXN instanceof EE_Transaction) {
523
-            $notices = EE_Error::get_notices();
524
-            $response['espresso_thank_you_page'] = array(
525
-                'errors' => ! empty($notices['errors'])
526
-                    ? $notices['errors']
527
-                    : sprintf(
528
-                        __(
529
-                            'The information for your transaction could not be retrieved from the server or the transaction data received was invalid because of a technical reason. (%s)',
530
-                            'event_espresso'
531
-                        ),
532
-                        __LINE__
533
-                    )
534
-            );
535
-            return $response;
536
-        }
537
-        // grab transient of TXN's status
538
-        $txn_status = isset($data['espresso_thank_you_page']['txn_status'])
539
-            ? $data['espresso_thank_you_page']['txn_status']
540
-            : null;
541
-        // has the TXN status changed since we last checked (or empty because this is the first time running through this code)?
542
-        if ($txn_status !== $TXN->status_ID()) {
543
-            // switch between two possible basic outcomes
544
-            switch ($TXN->status_ID()) {
545
-                // TXN has been updated in some way
546
-                case EEM_Transaction::overpaid_status_code:
547
-                case EEM_Transaction::complete_status_code:
548
-                case EEM_Transaction::incomplete_status_code:
549
-                    // send updated TXN results back to client,
550
-                    $response['espresso_thank_you_page'] = array(
551
-                        'transaction_details' => $espresso_thank_you_page->get_transaction_details(),
552
-                        'txn_status'          => $TXN->status_ID()
553
-                    );
554
-                    break;
555
-                // or we have a bad TXN, or really slow IPN, so calculate the wait time and send that back...
556
-                case EEM_Transaction::failed_status_code:
557
-                default:
558
-                    // keep on waiting...
559
-                    return $espresso_thank_you_page->_update_server_wait_time($data['espresso_thank_you_page']);
560
-            }
561
-            // or is the TXN still failed (never been updated) ???
562
-        } else if ($TXN->failed()) {
563
-            // keep on waiting...
564
-            return $espresso_thank_you_page->_update_server_wait_time($data['espresso_thank_you_page']);
565
-        }
566
-        // TXN is happening so let's get the payments now
567
-        // if we've already gotten payments then the heartbeat data will contain the timestamp of the last time we checked
568
-        $since = isset($data['espresso_thank_you_page']['get_payments_since'])
569
-            ? $data['espresso_thank_you_page']['get_payments_since']
570
-            : 0;
571
-        // then check for payments
572
-        $payments = $espresso_thank_you_page->get_txn_payments($since);
573
-        // has a payment been processed ?
574
-        if ( ! empty($payments) || $espresso_thank_you_page->_is_offline_payment_method) {
575
-            if ($since) {
576
-                $response['espresso_thank_you_page'] = array(
577
-                    'new_payments'        => $espresso_thank_you_page->get_new_payments($payments),
578
-                    'transaction_details' => $espresso_thank_you_page->get_transaction_details(),
579
-                    'txn_status'          => $TXN->status_ID()
580
-                );
581
-            } else {
582
-                $response['espresso_thank_you_page']['payment_details'] = $espresso_thank_you_page->get_payment_details(
583
-                    $payments
584
-                );
585
-            }
586
-            // reset time to check for payments
587
-            $response['espresso_thank_you_page']['get_payments_since'] = time();
588
-        } else {
589
-            $response['espresso_thank_you_page']['get_payments_since'] = $since;
590
-        }
591
-        return $response;
592
-    }
593
-
594
-
595
-
596
-    /**
597
-     * _update_server_wait_time
598
-     *
599
-     * @param array $thank_you_page_data thank you page portion of the incoming JSON array from the WP heartbeat data
600
-     * @return array
601
-     * @throws \EE_Error
602
-     */
603
-    private function _update_server_wait_time($thank_you_page_data = array())
604
-    {
605
-        $response['espresso_thank_you_page'] = array(
606
-            'still_waiting' => isset($thank_you_page_data['initial_access'])
607
-                ? time() - $thank_you_page_data['initial_access']
608
-                : 0,
609
-            'txn_status'    => $this->_current_txn->status_ID()
610
-        );
611
-        return $response;
612
-    }
613
-
614
-
615
-
616
-    /**
617
-     * get_registration_details
618
-     *
619
-     * @throws \EE_Error
620
-     */
621
-    public function get_registration_details()
622
-    {
623
-        //prepare variables for displaying
624
-        $template_args = array();
625
-        $template_args['transaction'] = $this->_current_txn;
626
-        $template_args['reg_url_link'] = $this->_reg_url_link;
627
-        $template_args['is_primary'] = $this->_is_primary;
628
-        $template_args['SPCO_attendee_information_url'] = $this->_SPCO_attendee_information_url;
629
-        $template_args['resend_reg_confirmation_url'] = add_query_arg(
630
-            array('token' => $this->_reg_url_link, 'resend_reg_confirmation' => 'true'),
631
-            EE_Registry::instance()->CFG->core->thank_you_page_url()
632
-        );
633
-        // verify template arguments
634
-        EEH_Template_Validator::verify_instanceof($template_args['transaction'], '$transaction', 'EE_Transaction');
635
-        EEH_Template_Validator::verify_isnt_null(
636
-            $template_args['SPCO_attendee_information_url'],
637
-            '$SPCO_attendee_information_url'
638
-        );
639
-        echo EEH_Template::locate_template(
640
-            THANK_YOU_TEMPLATES_PATH . 'thank-you-page-registration-details.template.php',
641
-            $template_args,
642
-            true,
643
-            true
644
-        );
645
-    }
646
-
647
-
648
-
649
-    /**
650
-     * resend_reg_confirmation_email
651
-     *
652
-     * @throws \EE_Error
653
-     */
654
-    public static function resend_reg_confirmation_email()
655
-    {
656
-        EE_Registry::instance()->load_core('Request_Handler');
657
-        $reg_url_link = EE_Registry::instance()->REQ->get('token');
658
-        // was a REG_ID passed ?
659
-        if ($reg_url_link) {
660
-            $registration = EE_Registry::instance()->load_model('Registration')->get_one(
661
-                array(array('REG_url_link' => $reg_url_link))
662
-            );
663
-            if ($registration instanceof EE_Registration) {
664
-                // resend email
665
-                EED_Messages::process_resend(array('_REG_ID' => $registration->ID()));
666
-            } else {
667
-                EE_Error::add_error(
668
-                    __(
669
-                        'The Registration Confirmation email could not be sent because a valid Registration could not be retrieved from the database.',
670
-                        'event_espresso'
671
-                    ),
672
-                    __FILE__,
673
-                    __FUNCTION__,
674
-                    __LINE__
675
-                );
676
-            }
677
-        } else {
678
-            EE_Error::add_error(
679
-                __(
680
-                    'The Registration Confirmation email could not be sent because a registration token is missing or invalid.',
681
-                    'event_espresso'
682
-                ),
683
-                __FILE__,
684
-                __FUNCTION__,
685
-                __LINE__
686
-            );
687
-        }
688
-        // request sent via AJAX ?
689
-        if (EE_FRONT_AJAX) {
690
-            echo wp_json_encode(EE_Error::get_notices(false));
691
-            die();
692
-            // or was JS disabled ?
693
-        } else {
694
-            // save errors so that they get picked up on the next request
695
-            EE_Error::get_notices(true, true);
696
-            wp_safe_redirect(
697
-                add_query_arg(
698
-                    array('e_reg_url_link' => $reg_url_link),
699
-                    EE_Registry::instance()->CFG->core->thank_you_page_url()
700
-                )
701
-            );
702
-        }
703
-    }
704
-
705
-
706
-
707
-    /**
708
-     * get_ajax_content
709
-     *
710
-     * @return void
711
-     * @throws \EE_Error
712
-     */
713
-    public function get_ajax_content()
714
-    {
715
-        if ( ! $this->get_txn()) {
716
-            return;
717
-        }
718
-        // first determine which event(s) require pre-approval or not
719
-        $events = array();
720
-        $events_requiring_pre_approval = array();
721
-        foreach ($this->_current_txn->registrations() as $registration) {
722
-            if ($registration instanceof EE_Registration) {
723
-                $event = $registration->event();
724
-                if ($event instanceof EE_Event) {
725
-                    if ($registration->is_not_approved() && $registration->event() instanceof EE_Event) {
726
-                        $events_requiring_pre_approval[$event->ID()] = $event;
727
-                    } else {
728
-                        $events[$event->ID()] = $event;
729
-                    }
730
-                }
731
-            }
732
-        }
733
-        $this->display_details_for_events_requiring_pre_approval($events_requiring_pre_approval);
734
-        $this->display_details_for_events($events);
735
-    }
736
-
737
-
738
-
739
-    /**
740
-     * display_details_for_events
741
-     *
742
-     * @param EE_Event[] $events
743
-     * @return void
744
-     */
745
-    public function display_details_for_events($events = array())
746
-    {
747
-        if ( ! empty($events)) {
748
-            ?>
17
+	/**
18
+	 * time in seconds to wait for the IPN to arrive before telling the registrant to bugger off ( 1200s = 20 minutes )
19
+	 */
20
+	const IPN_wait_time = 1200;
21
+
22
+	/**
23
+	 * The transaction specified by the reg_url_link passed from the Request, or from the Session
24
+	 *
25
+	 * @var EE_Transaction $_current_txn
26
+	 */
27
+	private $_current_txn;
28
+
29
+	/**
30
+	 * @var EE_Registration $_primary_registrant
31
+	 */
32
+	private $_primary_registrant;
33
+
34
+	/**
35
+	 * The reg_url_link passed from the Request, or from the Session
36
+	 *
37
+	 * @var string $_reg_url_link
38
+	 */
39
+	private $_reg_url_link;
40
+
41
+	/**
42
+	 * whether the incoming reg_url_link is for the primary registrant or not
43
+	 *
44
+	 * @var boolean $_is_primary
45
+	 */
46
+	private $_is_primary;
47
+
48
+	/**
49
+	 * The URL for revisiting the SPCO attendee information step
50
+	 *
51
+	 * @var string $_SPCO_attendee_information_url
52
+	 */
53
+	private $_SPCO_attendee_information_url;
54
+
55
+	/**
56
+	 * The URL for revisiting the SPCO payment options step
57
+	 *
58
+	 * @var string $_SPCO_payment_options_url
59
+	 */
60
+	private $_SPCO_payment_options_url;
61
+
62
+	/**
63
+	 * whether to display the Payment Options link
64
+	 *
65
+	 * @var boolean $_show_try_pay_again_link
66
+	 */
67
+	private $_show_try_pay_again_link = false;
68
+
69
+	/**
70
+	 * whether payments are allowed at this time
71
+	 *
72
+	 * @var boolean $_payments_closed
73
+	 */
74
+	private $_payments_closed = false;
75
+
76
+	/**
77
+	 * whether the selected payment method is Bank, Check , Invoice, etc
78
+	 *
79
+	 * @var boolean $_is_offline_payment_method
80
+	 */
81
+	private $_is_offline_payment_method = true;
82
+
83
+
84
+
85
+	/**
86
+	 * @return EED_Module|EED_Thank_You_Page
87
+	 */
88
+	public static function instance()
89
+	{
90
+		return parent::get_instance(__CLASS__);
91
+	}
92
+
93
+
94
+	/**
95
+	 * set_hooks - for hooking into EE Core, modules, etc
96
+	 *
97
+	 * @return void
98
+	 */
99
+	public static function set_hooks()
100
+	{
101
+		add_action('wp_loaded', array('EED_Thank_You_Page', 'set_definitions'), 2);
102
+	}
103
+
104
+
105
+
106
+	/**
107
+	 * set_hooks_admin - for hooking into EE Admin Core, modules, etc
108
+	 *
109
+	 * @return void
110
+	 */
111
+	public static function set_hooks_admin()
112
+	{
113
+		// AJAX for IPN monitoring
114
+		add_filter('heartbeat_received', array('EED_Thank_You_Page', 'thank_you_page_IPN_monitor'), 10, 3);
115
+		add_filter(
116
+			'heartbeat_nopriv_received',
117
+			array('EED_Thank_You_Page', 'thank_you_page_IPN_monitor'),
118
+			10,
119
+			3
120
+		);
121
+		add_action(
122
+			'wp_ajax_espresso_resend_reg_confirmation_email',
123
+			array('EED_Thank_You_Page', 'resend_reg_confirmation_email'),
124
+			10,
125
+			2
126
+		);
127
+		add_action(
128
+			'wp_ajax_nopriv_espresso_resend_reg_confirmation_email',
129
+			array('EED_Thank_You_Page', 'resend_reg_confirmation_email'),
130
+			10,
131
+			2
132
+		);
133
+	}
134
+
135
+
136
+
137
+	/**
138
+	 * set_definitions
139
+	 *
140
+	 * @return void
141
+	 */
142
+	public static function set_definitions()
143
+	{
144
+		define('THANK_YOU_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets' . DS);
145
+		define('THANK_YOU_TEMPLATES_PATH', str_replace('\\', DS, plugin_dir_path(__FILE__)) . 'templates' . DS);
146
+	}
147
+
148
+
149
+
150
+	/**
151
+	 * get_txn
152
+	 *
153
+	 * @return EE_Transaction
154
+	 */
155
+	public function get_txn()
156
+	{
157
+		if ($this->_current_txn instanceof EE_Transaction) {
158
+			return $this->_current_txn;
159
+		}
160
+		$TXN_model = EE_Registry::instance()->load_model('Transaction');
161
+		if ( ! $TXN_model instanceof EEM_Transaction) {
162
+			EE_Error::add_error(
163
+				__('The transaction model could not be established.', 'event_espresso'),
164
+				__FILE__,
165
+				__FUNCTION__,
166
+				__LINE__
167
+			);
168
+			return null;
169
+		}
170
+		//get the transaction. yes, we may have just loaded it, but it may have been updated, or this may be via an ajax request
171
+		$this->_current_txn = $TXN_model->get_transaction_from_reg_url_link($this->_reg_url_link);
172
+		// verify TXN
173
+		if (WP_DEBUG && ! $this->_current_txn instanceof EE_Transaction) {
174
+			EE_Error::add_error(
175
+				__(
176
+					'No transaction information could be retrieved or the transaction data is not of the correct type.',
177
+					'event_espresso'
178
+				),
179
+				__FILE__,
180
+				__FUNCTION__,
181
+				__LINE__
182
+			);
183
+			return null;
184
+		}
185
+		return $this->_current_txn;
186
+	}
187
+
188
+
189
+
190
+	/**
191
+	 * get_txn_payments
192
+	 *
193
+	 * @param int $since
194
+	 * @return mixed array of EE_Payment || FALSE
195
+	 * @throws \EE_Error
196
+	 */
197
+	public function get_txn_payments($since = 0)
198
+	{
199
+		if ( ! $this->get_txn()) {
200
+			return false;
201
+		}
202
+		$args = array('order_by' => array('PAY_timestamp' => 'ASC'));
203
+		if ($since > 0) {
204
+			$args[0] = array('PAY_timestamp' => array('>', $since));
205
+		}
206
+		// get array of payments with most recent first
207
+		return $this->_current_txn->payments($args);
208
+	}
209
+
210
+
211
+
212
+	/**
213
+	 * get_reg_url_link
214
+	 *
215
+	 * @return void
216
+	 */
217
+	private function _get_reg_url_link()
218
+	{
219
+		if ( ! empty($this->_reg_url_link)) {
220
+			return;
221
+		}
222
+		// only do thank you page stuff if we have a REG_url_link in the url
223
+		if (WP_DEBUG && ! EE_Registry::instance()->REQ->is_set('e_reg_url_link')) {
224
+			EE_Error::add_error(
225
+				__(
226
+					'No transaction information could be retrieved because the registration URL link is missing or invalid.',
227
+					'event_espresso'
228
+				),
229
+				__FILE__,
230
+				__FUNCTION__,
231
+				__LINE__
232
+			);
233
+			return;
234
+		}
235
+		// check for reg_url_link
236
+		$this->_reg_url_link = EE_Registry::instance()->REQ->get('e_reg_url_link');
237
+	}
238
+
239
+
240
+
241
+	/**
242
+	 * set_reg_url_link
243
+	 *
244
+	 * @param string $reg_url_link
245
+	 */
246
+	public function set_reg_url_link($reg_url_link = null)
247
+	{
248
+		$this->_reg_url_link = ! empty($reg_url_link) ? $reg_url_link : $this->_reg_url_link;
249
+	}
250
+
251
+
252
+
253
+	/**
254
+	 * run - initial module setup
255
+	 * this method is primarily used for activating resources in the EE_Front_Controller thru the use of filters
256
+	 *
257
+	 * @param WP $WP
258
+	 * @return void
259
+	 * @throws \EE_Error
260
+	 */
261
+	public function run($WP)
262
+	{
263
+
264
+	}
265
+
266
+
267
+
268
+	/**
269
+	 * load_resources
270
+	 *
271
+	 * @return void
272
+	 * @throws \EE_Error
273
+	 */
274
+	public function load_resources() {
275
+		$this->_get_reg_url_link();
276
+		// resend_reg_confirmation_email ?
277
+		if (EE_Registry::instance()->REQ->is_set('resend')) {
278
+			EED_Thank_You_Page::resend_reg_confirmation_email();
279
+		}
280
+		EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
281
+		$this->_translate_strings();
282
+		// load assets
283
+		add_action('wp_enqueue_scripts', array($this, 'load_js'), 10);
284
+	}
285
+
286
+
287
+
288
+	/**
289
+	 * load_js
290
+	 *
291
+	 * @return void
292
+	 */
293
+	protected function _translate_strings()
294
+	{
295
+		EE_Registry::$i18n_js_strings['e_reg_url_link'] = $this->_reg_url_link;
296
+		EE_Registry::$i18n_js_strings['initial_access'] = time();
297
+		EE_Registry::$i18n_js_strings['IPN_wait_time'] = EED_Thank_You_Page::IPN_wait_time;
298
+		EE_Registry::$i18n_js_strings['TXN_complete'] = EEM_Transaction::complete_status_code;
299
+		EE_Registry::$i18n_js_strings['TXN_incomplete'] = EEM_Transaction::incomplete_status_code;
300
+		EE_Registry::$i18n_js_strings['checking_for_new_payments'] = __(
301
+			'checking for new payments...',
302
+			'event_espresso'
303
+		);
304
+		EE_Registry::$i18n_js_strings['loading_payment_info'] = __(
305
+			'loading payment information...',
306
+			'event_espresso'
307
+		);
308
+		EE_Registry::$i18n_js_strings['server_error'] = __(
309
+			'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again.',
310
+			'event_espresso'
311
+		);
312
+		EE_Registry::$i18n_js_strings['slow_IPN'] = apply_filters(
313
+			'EED_Thank_You_Page__load_js__slow_IPN',
314
+			sprintf(
315
+				__(
316
+					'%sThe Payment Notification appears to be taking longer than usual to arrive. Maybe check back later or just wait for your payment and registration confirmation results to be sent to you via email. We apologize for any inconvenience this may have caused.%s',
317
+					'event_espresso'
318
+				),
319
+				'<div id="espresso-thank-you-page-slow-IPN-dv" class="ee-attention jst-left">',
320
+				'</div>'
321
+			)
322
+		);
323
+	}
324
+
325
+
326
+
327
+	/**
328
+	 * load_js
329
+	 *
330
+	 * @return void
331
+	 */
332
+	public function load_js()
333
+	{
334
+		wp_register_script(
335
+			'thank_you_page',
336
+			THANK_YOU_ASSETS_URL . 'thank_you_page.js',
337
+			array('espresso_core', 'heartbeat'),
338
+			EVENT_ESPRESSO_VERSION,
339
+			true
340
+		);
341
+		wp_enqueue_script('thank_you_page');
342
+		wp_enqueue_style('espresso_default');
343
+	}
344
+
345
+
346
+
347
+	/**
348
+	 * init
349
+	 *
350
+	 * @return void
351
+	 * @throws \EE_Error
352
+	 */
353
+	public function init()
354
+	{
355
+		$this->_get_reg_url_link();
356
+		if ( ! $this->get_txn()) {
357
+			echo EEH_HTML::div(
358
+				EEH_HTML::h4(__('We\'re sorry...', 'event_espresso'), '', '') .
359
+				sprintf(
360
+					__(
361
+						'This is a system page for displaying transaction information after a purchase.%1$sYou are most likely seeing this notice because you have navigated to this page%1$sthrough some means other than completing a transaction.%1$sSorry for the disappointment, but you will most likely find nothing of interest here.%1$s%1$s',
362
+						'event_espresso'
363
+					),
364
+					'<br/>'
365
+				),
366
+				'',
367
+				'ee-attention'
368
+			);
369
+			return null;
370
+		}
371
+		// if we've made it to the Thank You page, then let's toggle any "Failed" transactions to "Incomplete"
372
+		if ($this->_current_txn->status_ID() === EEM_Transaction::failed_status_code) {
373
+			$this->_current_txn->set_status(EEM_Transaction::incomplete_status_code);
374
+			$this->_current_txn->save();
375
+		}
376
+		$this->_primary_registrant = $this->_current_txn->primary_registration() instanceof EE_Registration
377
+			? $this->_current_txn->primary_registration()
378
+			: null;
379
+		$this->_is_primary = $this->_primary_registrant->reg_url_link() === $this->_reg_url_link ? true : false;
380
+		$show_try_pay_again_link_default = apply_filters(
381
+			'AFEE__EED_Thank_You_Page__init__show_try_pay_again_link_default',
382
+			true
383
+		);
384
+		$this->_show_try_pay_again_link = $show_try_pay_again_link_default;
385
+		// txn status ?
386
+		if ($this->_current_txn->is_completed()) {
387
+			$this->_show_try_pay_again_link = $show_try_pay_again_link_default;
388
+		} else if (
389
+			$this->_current_txn->is_incomplete()
390
+			&& ($this->_primary_registrant->is_approved()
391
+				|| $this->_primary_registrant->is_pending_payment())
392
+		) {
393
+			$this->_show_try_pay_again_link = true;
394
+		} else if ($this->_primary_registrant->is_approved() || $this->_primary_registrant->is_pending_payment()) {
395
+			// its pending
396
+			$this->_show_try_pay_again_link = isset(
397
+												  EE_Registry::instance()->CFG->registration->show_pending_payment_options
398
+											  )
399
+											  && EE_Registry::instance()->CFG->registration->show_pending_payment_options
400
+				? true
401
+				: $show_try_pay_again_link_default;
402
+		}
403
+		$this->_payments_closed = ! $this->_current_txn->payment_method() instanceof EE_Payment_Method
404
+			? true
405
+			: false;
406
+		$this->_is_offline_payment_method = false;
407
+		if (
408
+			// if payment method is unknown
409
+			! $this->_current_txn->payment_method() instanceof EE_Payment_Method
410
+			|| (
411
+				// or is an offline payment method
412
+				$this->_current_txn->payment_method() instanceof EE_Payment_Method
413
+				&& $this->_current_txn->payment_method()->is_off_line()
414
+			)
415
+		) {
416
+			$this->_is_offline_payment_method = true;
417
+		}
418
+		// link to SPCO
419
+		$revisit_spco_url = add_query_arg(
420
+			array('ee' => '_register', 'revisit' => true, 'e_reg_url_link' => $this->_reg_url_link),
421
+			EE_Registry::instance()->CFG->core->reg_page_url()
422
+		);
423
+		// link to SPCO payment_options
424
+		$this->_SPCO_payment_options_url = $this->_primary_registrant instanceof EE_Registration
425
+			? $this->_primary_registrant->payment_overview_url()
426
+			: add_query_arg(
427
+				array('step' => 'payment_options'),
428
+				$revisit_spco_url
429
+			);
430
+		// link to SPCO attendee_information
431
+		$this->_SPCO_attendee_information_url = $this->_primary_registrant instanceof EE_Registration
432
+			? $this->_primary_registrant->edit_attendee_information_url()
433
+			: false;
434
+		do_action('AHEE__EED_Thank_You_Page__init_end', $this->_current_txn);
435
+		// set no cache headers and constants
436
+		EE_System::do_not_cache();
437
+	}
438
+
439
+
440
+
441
+	/**
442
+	 * display_thank_you_page_results
443
+	 *
444
+	 * @return string
445
+	 * @throws \EE_Error
446
+	 */
447
+	public function thank_you_page_results()
448
+	{
449
+		$this->init();
450
+		if ( ! $this->_current_txn instanceof EE_Transaction) {
451
+			return EE_Error::get_notices();
452
+		}
453
+		// link to receipt
454
+		$template_args['TXN_receipt_url'] = $this->_current_txn->receipt_url('html');
455
+		if ( ! empty($template_args['TXN_receipt_url'])) {
456
+			$template_args['order_conf_desc'] = __(
457
+				'%1$sCongratulations%2$sYour registration has been successfully processed.%3$sCheck your email for your registration confirmation or click the button below to view / download / print a full description of your purchases and registration information.',
458
+				'event_espresso'
459
+			);
460
+		} else {
461
+			$template_args['order_conf_desc'] = __(
462
+				'%1$sCongratulations%2$sYour registration has been successfully processed.%3$sCheck your email for your registration confirmation.',
463
+				'event_espresso'
464
+			);
465
+		}
466
+		$template_args['transaction'] = $this->_current_txn;
467
+		$template_args['revisit'] = EE_Registry::instance()->REQ->get('revisit', false);
468
+		add_action('AHEE__thank_you_page_overview_template__content', array($this, 'get_registration_details'));
469
+		if ($this->_is_primary && ! $this->_current_txn->is_free()) {
470
+			add_action('AHEE__thank_you_page_overview_template__content', array($this, 'get_ajax_content'));
471
+		}
472
+		return EEH_Template::locate_template(
473
+			THANK_YOU_TEMPLATES_PATH . 'thank-you-page-overview.template.php',
474
+			$template_args,
475
+			true,
476
+			true
477
+		);
478
+	}
479
+
480
+
481
+
482
+	/**
483
+	 * thank_you_page_IPN_monitor
484
+	 * this basically just pulls the TXN based on the reg_url_link sent from the server,
485
+	 * then checks that the TXN status is not failed, and that no other errors have been generated.
486
+	 * it also calculates the IPN wait time since the Thank You page was first loaded
487
+	 *
488
+	 * @param array $response
489
+	 * @param array $data
490
+	 * @return array
491
+	 * @throws \EE_Error
492
+	 */
493
+	public static function thank_you_page_IPN_monitor($response = array(), $data = array())
494
+	{
495
+		// does this heartbeat contain our data ?
496
+		if ( ! isset($data['espresso_thank_you_page'])) {
497
+			return $response;
498
+		}
499
+		// check for reg_url_link in the incoming heartbeat data
500
+		if ( ! isset($data['espresso_thank_you_page']['e_reg_url_link'])) {
501
+			$response['espresso_thank_you_page'] = array(
502
+				'errors' => ! empty($notices['errors'])
503
+					? $notices['errors']
504
+					: __(
505
+						'No transaction information could be retrieved because the registration URL link is missing or invalid.',
506
+						'event_espresso'
507
+					)
508
+			);
509
+			return $response;
510
+		}
511
+		// kk heartbeat has our data
512
+		$response['espresso_thank_you_page'] = array();
513
+		// set_definitions, instantiate the thank you page class, and get the ball rolling
514
+		EED_Thank_You_Page::set_definitions();
515
+		/** @var $espresso_thank_you_page EED_Thank_You_Page */
516
+		$espresso_thank_you_page = EED_Thank_You_Page::instance();
517
+		$espresso_thank_you_page->set_reg_url_link($data['espresso_thank_you_page']['e_reg_url_link']);
518
+		$espresso_thank_you_page->init();
519
+		//get TXN
520
+		$TXN = $espresso_thank_you_page->get_txn();
521
+		// no TXN? then get out
522
+		if ( ! $TXN instanceof EE_Transaction) {
523
+			$notices = EE_Error::get_notices();
524
+			$response['espresso_thank_you_page'] = array(
525
+				'errors' => ! empty($notices['errors'])
526
+					? $notices['errors']
527
+					: sprintf(
528
+						__(
529
+							'The information for your transaction could not be retrieved from the server or the transaction data received was invalid because of a technical reason. (%s)',
530
+							'event_espresso'
531
+						),
532
+						__LINE__
533
+					)
534
+			);
535
+			return $response;
536
+		}
537
+		// grab transient of TXN's status
538
+		$txn_status = isset($data['espresso_thank_you_page']['txn_status'])
539
+			? $data['espresso_thank_you_page']['txn_status']
540
+			: null;
541
+		// has the TXN status changed since we last checked (or empty because this is the first time running through this code)?
542
+		if ($txn_status !== $TXN->status_ID()) {
543
+			// switch between two possible basic outcomes
544
+			switch ($TXN->status_ID()) {
545
+				// TXN has been updated in some way
546
+				case EEM_Transaction::overpaid_status_code:
547
+				case EEM_Transaction::complete_status_code:
548
+				case EEM_Transaction::incomplete_status_code:
549
+					// send updated TXN results back to client,
550
+					$response['espresso_thank_you_page'] = array(
551
+						'transaction_details' => $espresso_thank_you_page->get_transaction_details(),
552
+						'txn_status'          => $TXN->status_ID()
553
+					);
554
+					break;
555
+				// or we have a bad TXN, or really slow IPN, so calculate the wait time and send that back...
556
+				case EEM_Transaction::failed_status_code:
557
+				default:
558
+					// keep on waiting...
559
+					return $espresso_thank_you_page->_update_server_wait_time($data['espresso_thank_you_page']);
560
+			}
561
+			// or is the TXN still failed (never been updated) ???
562
+		} else if ($TXN->failed()) {
563
+			// keep on waiting...
564
+			return $espresso_thank_you_page->_update_server_wait_time($data['espresso_thank_you_page']);
565
+		}
566
+		// TXN is happening so let's get the payments now
567
+		// if we've already gotten payments then the heartbeat data will contain the timestamp of the last time we checked
568
+		$since = isset($data['espresso_thank_you_page']['get_payments_since'])
569
+			? $data['espresso_thank_you_page']['get_payments_since']
570
+			: 0;
571
+		// then check for payments
572
+		$payments = $espresso_thank_you_page->get_txn_payments($since);
573
+		// has a payment been processed ?
574
+		if ( ! empty($payments) || $espresso_thank_you_page->_is_offline_payment_method) {
575
+			if ($since) {
576
+				$response['espresso_thank_you_page'] = array(
577
+					'new_payments'        => $espresso_thank_you_page->get_new_payments($payments),
578
+					'transaction_details' => $espresso_thank_you_page->get_transaction_details(),
579
+					'txn_status'          => $TXN->status_ID()
580
+				);
581
+			} else {
582
+				$response['espresso_thank_you_page']['payment_details'] = $espresso_thank_you_page->get_payment_details(
583
+					$payments
584
+				);
585
+			}
586
+			// reset time to check for payments
587
+			$response['espresso_thank_you_page']['get_payments_since'] = time();
588
+		} else {
589
+			$response['espresso_thank_you_page']['get_payments_since'] = $since;
590
+		}
591
+		return $response;
592
+	}
593
+
594
+
595
+
596
+	/**
597
+	 * _update_server_wait_time
598
+	 *
599
+	 * @param array $thank_you_page_data thank you page portion of the incoming JSON array from the WP heartbeat data
600
+	 * @return array
601
+	 * @throws \EE_Error
602
+	 */
603
+	private function _update_server_wait_time($thank_you_page_data = array())
604
+	{
605
+		$response['espresso_thank_you_page'] = array(
606
+			'still_waiting' => isset($thank_you_page_data['initial_access'])
607
+				? time() - $thank_you_page_data['initial_access']
608
+				: 0,
609
+			'txn_status'    => $this->_current_txn->status_ID()
610
+		);
611
+		return $response;
612
+	}
613
+
614
+
615
+
616
+	/**
617
+	 * get_registration_details
618
+	 *
619
+	 * @throws \EE_Error
620
+	 */
621
+	public function get_registration_details()
622
+	{
623
+		//prepare variables for displaying
624
+		$template_args = array();
625
+		$template_args['transaction'] = $this->_current_txn;
626
+		$template_args['reg_url_link'] = $this->_reg_url_link;
627
+		$template_args['is_primary'] = $this->_is_primary;
628
+		$template_args['SPCO_attendee_information_url'] = $this->_SPCO_attendee_information_url;
629
+		$template_args['resend_reg_confirmation_url'] = add_query_arg(
630
+			array('token' => $this->_reg_url_link, 'resend_reg_confirmation' => 'true'),
631
+			EE_Registry::instance()->CFG->core->thank_you_page_url()
632
+		);
633
+		// verify template arguments
634
+		EEH_Template_Validator::verify_instanceof($template_args['transaction'], '$transaction', 'EE_Transaction');
635
+		EEH_Template_Validator::verify_isnt_null(
636
+			$template_args['SPCO_attendee_information_url'],
637
+			'$SPCO_attendee_information_url'
638
+		);
639
+		echo EEH_Template::locate_template(
640
+			THANK_YOU_TEMPLATES_PATH . 'thank-you-page-registration-details.template.php',
641
+			$template_args,
642
+			true,
643
+			true
644
+		);
645
+	}
646
+
647
+
648
+
649
+	/**
650
+	 * resend_reg_confirmation_email
651
+	 *
652
+	 * @throws \EE_Error
653
+	 */
654
+	public static function resend_reg_confirmation_email()
655
+	{
656
+		EE_Registry::instance()->load_core('Request_Handler');
657
+		$reg_url_link = EE_Registry::instance()->REQ->get('token');
658
+		// was a REG_ID passed ?
659
+		if ($reg_url_link) {
660
+			$registration = EE_Registry::instance()->load_model('Registration')->get_one(
661
+				array(array('REG_url_link' => $reg_url_link))
662
+			);
663
+			if ($registration instanceof EE_Registration) {
664
+				// resend email
665
+				EED_Messages::process_resend(array('_REG_ID' => $registration->ID()));
666
+			} else {
667
+				EE_Error::add_error(
668
+					__(
669
+						'The Registration Confirmation email could not be sent because a valid Registration could not be retrieved from the database.',
670
+						'event_espresso'
671
+					),
672
+					__FILE__,
673
+					__FUNCTION__,
674
+					__LINE__
675
+				);
676
+			}
677
+		} else {
678
+			EE_Error::add_error(
679
+				__(
680
+					'The Registration Confirmation email could not be sent because a registration token is missing or invalid.',
681
+					'event_espresso'
682
+				),
683
+				__FILE__,
684
+				__FUNCTION__,
685
+				__LINE__
686
+			);
687
+		}
688
+		// request sent via AJAX ?
689
+		if (EE_FRONT_AJAX) {
690
+			echo wp_json_encode(EE_Error::get_notices(false));
691
+			die();
692
+			// or was JS disabled ?
693
+		} else {
694
+			// save errors so that they get picked up on the next request
695
+			EE_Error::get_notices(true, true);
696
+			wp_safe_redirect(
697
+				add_query_arg(
698
+					array('e_reg_url_link' => $reg_url_link),
699
+					EE_Registry::instance()->CFG->core->thank_you_page_url()
700
+				)
701
+			);
702
+		}
703
+	}
704
+
705
+
706
+
707
+	/**
708
+	 * get_ajax_content
709
+	 *
710
+	 * @return void
711
+	 * @throws \EE_Error
712
+	 */
713
+	public function get_ajax_content()
714
+	{
715
+		if ( ! $this->get_txn()) {
716
+			return;
717
+		}
718
+		// first determine which event(s) require pre-approval or not
719
+		$events = array();
720
+		$events_requiring_pre_approval = array();
721
+		foreach ($this->_current_txn->registrations() as $registration) {
722
+			if ($registration instanceof EE_Registration) {
723
+				$event = $registration->event();
724
+				if ($event instanceof EE_Event) {
725
+					if ($registration->is_not_approved() && $registration->event() instanceof EE_Event) {
726
+						$events_requiring_pre_approval[$event->ID()] = $event;
727
+					} else {
728
+						$events[$event->ID()] = $event;
729
+					}
730
+				}
731
+			}
732
+		}
733
+		$this->display_details_for_events_requiring_pre_approval($events_requiring_pre_approval);
734
+		$this->display_details_for_events($events);
735
+	}
736
+
737
+
738
+
739
+	/**
740
+	 * display_details_for_events
741
+	 *
742
+	 * @param EE_Event[] $events
743
+	 * @return void
744
+	 */
745
+	public function display_details_for_events($events = array())
746
+	{
747
+		if ( ! empty($events)) {
748
+			?>
749 749
             <div id="espresso-thank-you-page-ajax-content-dv">
750 750
                 <div id="espresso-thank-you-page-ajax-transaction-dv"></div>
751 751
                 <div id="espresso-thank-you-page-ajax-payment-dv"></div>
752 752
                 <div id="espresso-thank-you-page-ajax-loading-dv">
753 753
                     <div id="ee-ajax-loading-dv" class="float-left lt-blue-text">
754 754
                         <span class="dashicons dashicons-upload"></span><span id="ee-ajax-loading-msg-spn"><?php _e(
755
-                                'loading transaction and payment information...',
756
-                                'event_espresso'
757
-                            ); ?></span>
755
+								'loading transaction and payment information...',
756
+								'event_espresso'
757
+							); ?></span>
758 758
                     </div>
759 759
                     <?php if ( ! $this->_is_offline_payment_method && ! $this->_payments_closed) : ?>
760 760
                         <p id="ee-ajax-loading-pg" class="highlight-bg small-text clear">
761 761
                             <?php echo apply_filters(
762
-                                'EED_Thank_You_Page__get_ajax_content__waiting_for_IPN_msg',
763
-                                __(
764
-                                    'Some payment gateways can take 15 minutes or more to return their payment notification, so please be patient if you require payment confirmation as soon as possible. Please note that as soon as everything is finalized, we will send your full payment and registration confirmation results to you via email.',
765
-                                    'event_espresso'
766
-                                )
767
-                            ); ?>
762
+								'EED_Thank_You_Page__get_ajax_content__waiting_for_IPN_msg',
763
+								__(
764
+									'Some payment gateways can take 15 minutes or more to return their payment notification, so please be patient if you require payment confirmation as soon as possible. Please note that as soon as everything is finalized, we will send your full payment and registration confirmation results to you via email.',
765
+									'event_espresso'
766
+								)
767
+							); ?>
768 768
                             <br/>
769 769
                             <span class="jst-rght ee-block small-text lt-grey-text">
770 770
 								<?php _e('current wait time ', 'event_espresso'); ?>
@@ -775,120 +775,120 @@  discard block
 block discarded – undo
775 775
                 <div class="clear"></div>
776 776
             </div>
777 777
             <?php
778
-        }
779
-    }
778
+		}
779
+	}
780 780
 
781 781
 
782 782
 
783
-    /**
784
-     * display_details_for_events_requiring_pre_approval
785
-     *
786
-     * @param EE_Event[] $events
787
-     * @return void
788
-     */
789
-    public function display_details_for_events_requiring_pre_approval($events = array())
790
-    {
791
-        if ( ! empty($events)) {
792
-            ?>
783
+	/**
784
+	 * display_details_for_events_requiring_pre_approval
785
+	 *
786
+	 * @param EE_Event[] $events
787
+	 * @return void
788
+	 */
789
+	public function display_details_for_events_requiring_pre_approval($events = array())
790
+	{
791
+		if ( ! empty($events)) {
792
+			?>
793 793
             <div id="espresso-thank-you-page-not-approved-message-dv">
794 794
                 <h4 class="orange-text"><?php _e('Important Notice:', 'event_espresso'); ?></h4>
795 795
                 <p id="events-requiring-pre-approval-pg" class="small-text">
796 796
                     <?php echo apply_filters(
797
-                        'AHEE__EED_Thank_You_Page__get_ajax_content__not_approved_message',
798
-                        __(
799
-                            'The following Event(s) you have registered for do not require payment at this time and will not be billed for during this transaction. Billing will only occur after all attendees have been approved by the event organizer. You will be notified when your registration has been processed. If this is a free event, then no billing will occur.',
800
-                            'event_espresso'
801
-                        )
802
-                    ); ?>
797
+						'AHEE__EED_Thank_You_Page__get_ajax_content__not_approved_message',
798
+						__(
799
+							'The following Event(s) you have registered for do not require payment at this time and will not be billed for during this transaction. Billing will only occur after all attendees have been approved by the event organizer. You will be notified when your registration has been processed. If this is a free event, then no billing will occur.',
800
+							'event_espresso'
801
+						)
802
+					); ?>
803 803
                 </p>
804 804
                 <ul class="events-requiring-pre-approval-ul">
805 805
                     <?php foreach ($events as $event) {
806
-                        if ($event instanceof EE_Event) {
807
-                            echo '<li><span class="dashicons dashicons-marker ee-icon-size-16 orange-text"></span>',
808
-                            $event->name(),
809
-                            '</li>';
810
-                        }
811
-                    } ?>
806
+						if ($event instanceof EE_Event) {
807
+							echo '<li><span class="dashicons dashicons-marker ee-icon-size-16 orange-text"></span>',
808
+							$event->name(),
809
+							'</li>';
810
+						}
811
+					} ?>
812 812
                 </ul>
813 813
                 <div class="clear"></div>
814 814
             </div>
815 815
             <?php
816
-        }
817
-    }
818
-
819
-
820
-
821
-    /**
822
-     * get_transaction_details
823
-     *
824
-     * @return string
825
-     * @throws \EE_Error
826
-     */
827
-    public function get_transaction_details()
828
-    {
829
-        //prepare variables for displaying
830
-        $template_args = array();
831
-        $template_args['transaction'] = $this->_current_txn;
832
-        $template_args['reg_url_link'] = $this->_reg_url_link;
833
-        $template_args['primary_registrant_name'] = $this->_primary_registrant->attendee()->full_name(true);
834
-        // link to SPCO payment_options
835
-        $template_args['show_try_pay_again_link'] = $this->_show_try_pay_again_link;
836
-        $template_args['SPCO_payment_options_url'] = $this->_SPCO_payment_options_url;
837
-        // verify template arguments
838
-        EEH_Template_Validator::verify_instanceof($template_args['transaction'], '$transaction', 'EE_Transaction');
839
-        EEH_Template_Validator::verify_isnt_null(
840
-            $template_args['show_try_pay_again_link'],
841
-            '$show_try_pay_again_link'
842
-        );
843
-        EEH_Template_Validator::verify_isnt_null(
844
-            $template_args['SPCO_payment_options_url'],
845
-            '$SPCO_payment_options_url'
846
-        );
847
-        return EEH_Template::locate_template(
848
-            THANK_YOU_TEMPLATES_PATH . 'thank-you-page-transaction-details.template.php',
849
-            $template_args,
850
-            true,
851
-            true
852
-        );
853
-    }
854
-
855
-
856
-
857
-    /**
858
-     * get_payment_row_html
859
-     *
860
-     * @param EE_Payment $payment
861
-     * @return string
862
-     * @throws \EE_Error
863
-     */
864
-    public function get_payment_row_html($payment = null)
865
-    {
866
-        $html = '';
867
-        if ($payment instanceof EE_Payment) {
868
-            if (
869
-                $payment->payment_method() instanceof EE_Payment_Method
870
-                && $payment->status() === EEM_Payment::status_id_failed
871
-                && $payment->payment_method()->is_off_site()
872
-            ) {
873
-                // considering the registrant has made it to the Thank You page,
874
-                // any failed payments may actually be pending and the IPN is just slow
875
-                // so let's
876
-                $payment->set_status(EEM_Payment::status_id_pending);
877
-            }
878
-            $payment_declined_msg = $payment->STS_ID() === EEM_Payment::status_id_declined
879
-                ? '<br /><span class="small-text">' . $payment->gateway_response() . '</span>'
880
-                : '';
881
-            $html .= '
816
+		}
817
+	}
818
+
819
+
820
+
821
+	/**
822
+	 * get_transaction_details
823
+	 *
824
+	 * @return string
825
+	 * @throws \EE_Error
826
+	 */
827
+	public function get_transaction_details()
828
+	{
829
+		//prepare variables for displaying
830
+		$template_args = array();
831
+		$template_args['transaction'] = $this->_current_txn;
832
+		$template_args['reg_url_link'] = $this->_reg_url_link;
833
+		$template_args['primary_registrant_name'] = $this->_primary_registrant->attendee()->full_name(true);
834
+		// link to SPCO payment_options
835
+		$template_args['show_try_pay_again_link'] = $this->_show_try_pay_again_link;
836
+		$template_args['SPCO_payment_options_url'] = $this->_SPCO_payment_options_url;
837
+		// verify template arguments
838
+		EEH_Template_Validator::verify_instanceof($template_args['transaction'], '$transaction', 'EE_Transaction');
839
+		EEH_Template_Validator::verify_isnt_null(
840
+			$template_args['show_try_pay_again_link'],
841
+			'$show_try_pay_again_link'
842
+		);
843
+		EEH_Template_Validator::verify_isnt_null(
844
+			$template_args['SPCO_payment_options_url'],
845
+			'$SPCO_payment_options_url'
846
+		);
847
+		return EEH_Template::locate_template(
848
+			THANK_YOU_TEMPLATES_PATH . 'thank-you-page-transaction-details.template.php',
849
+			$template_args,
850
+			true,
851
+			true
852
+		);
853
+	}
854
+
855
+
856
+
857
+	/**
858
+	 * get_payment_row_html
859
+	 *
860
+	 * @param EE_Payment $payment
861
+	 * @return string
862
+	 * @throws \EE_Error
863
+	 */
864
+	public function get_payment_row_html($payment = null)
865
+	{
866
+		$html = '';
867
+		if ($payment instanceof EE_Payment) {
868
+			if (
869
+				$payment->payment_method() instanceof EE_Payment_Method
870
+				&& $payment->status() === EEM_Payment::status_id_failed
871
+				&& $payment->payment_method()->is_off_site()
872
+			) {
873
+				// considering the registrant has made it to the Thank You page,
874
+				// any failed payments may actually be pending and the IPN is just slow
875
+				// so let's
876
+				$payment->set_status(EEM_Payment::status_id_pending);
877
+			}
878
+			$payment_declined_msg = $payment->STS_ID() === EEM_Payment::status_id_declined
879
+				? '<br /><span class="small-text">' . $payment->gateway_response() . '</span>'
880
+				: '';
881
+			$html .= '
882 882
 				<tr>
883 883
 					<td>
884 884
 						' . $payment->timestamp() . '
885 885
 					</td>
886 886
 					<td>
887 887
 						' . (
888
-                $payment->payment_method() instanceof EE_Payment_Method
889
-                    ? $payment->payment_method()->name()
890
-                    : __('Unknown', 'event_espresso')
891
-                ) . '
888
+				$payment->payment_method() instanceof EE_Payment_Method
889
+					? $payment->payment_method()->name()
890
+					: __('Unknown', 'event_espresso')
891
+				) . '
892 892
 					</td>
893 893
 					<td class="jst-rght">
894 894
 						' . EEH_Template::format_currency($payment->amount()) . '
@@ -897,87 +897,87 @@  discard block
 block discarded – undo
897 897
 						' . $payment->pretty_status(true) . $payment_declined_msg . '
898 898
 					</td>
899 899
 				</tr>';
900
-            do_action('AHEE__thank_you_page_payment_details_template__after_each_payment', $payment);
901
-        }
902
-        return $html;
903
-    }
904
-
905
-
906
-
907
-    /**
908
-     * get_payment_details
909
-     *
910
-     * @param array $payments
911
-     * @return string
912
-     * @throws \EE_Error
913
-     */
914
-    public function get_payment_details($payments = array())
915
-    {
916
-        //prepare variables for displaying
917
-        $template_args = array();
918
-        $template_args['transaction'] = $this->_current_txn;
919
-        $template_args['reg_url_link'] = $this->_reg_url_link;
920
-        $template_args['payments'] = array();
921
-        foreach ($payments as $payment) {
922
-            $template_args['payments'][] = $this->get_payment_row_html($payment);
923
-        }
924
-        //create a hacky payment object, but dont save it
925
-        $payment = EE_Payment::new_instance(
926
-            array(
927
-                'TXN_ID'        => $this->_current_txn->ID(),
928
-                'STS_ID'        => EEM_Payment::status_id_pending,
929
-                'PAY_timestamp' => time(),
930
-                'PAY_amount'    => $this->_current_txn->total(),
931
-                'PMD_ID'        => $this->_current_txn->payment_method_ID()
932
-            )
933
-        );
934
-        $payment_method = $this->_current_txn->payment_method();
935
-        if ($payment_method instanceof EE_Payment_Method && $payment_method->type_obj() instanceof EE_PMT_Base) {
936
-            $template_args['gateway_content'] = $payment_method->type_obj()->payment_overview_content($payment);
937
-        } else {
938
-            $template_args['gateway_content'] = '';
939
-        }
940
-        // link to SPCO payment_options
941
-        $template_args['show_try_pay_again_link'] = $this->_show_try_pay_again_link;
942
-        $template_args['SPCO_payment_options_url'] = $this->_SPCO_payment_options_url;
943
-        // verify template arguments
944
-        EEH_Template_Validator::verify_instanceof($template_args['transaction'], '$transaction', 'EE_Transaction');
945
-        EEH_Template_Validator::verify_isnt_null($template_args['payments'], '$payments');
946
-        EEH_Template_Validator::verify_isnt_null(
947
-            $template_args['show_try_pay_again_link'],
948
-            '$show_try_pay_again_link'
949
-        );
950
-        EEH_Template_Validator::verify_isnt_null($template_args['gateway_content'], '$gateway_content');
951
-        EEH_Template_Validator::verify_isnt_null(
952
-            $template_args['SPCO_payment_options_url'],
953
-            '$SPCO_payment_options_url'
954
-        );
955
-        return EEH_Template::locate_template(
956
-            THANK_YOU_TEMPLATES_PATH . 'thank-you-page-payment-details.template.php',
957
-            $template_args,
958
-            true,
959
-            true
960
-        );
961
-    }
962
-
963
-
964
-
965
-    /**
966
-     * get_payment_details
967
-     *
968
-     * @param array $payments
969
-     * @return string
970
-     * @throws \EE_Error
971
-     */
972
-    public function get_new_payments($payments = array())
973
-    {
974
-        $payments_html = '';
975
-        //prepare variables for displaying
976
-        foreach ($payments as $payment) {
977
-            $payments_html .= $this->get_payment_row_html($payment);
978
-        }
979
-        return $payments_html;
980
-    }
900
+			do_action('AHEE__thank_you_page_payment_details_template__after_each_payment', $payment);
901
+		}
902
+		return $html;
903
+	}
904
+
905
+
906
+
907
+	/**
908
+	 * get_payment_details
909
+	 *
910
+	 * @param array $payments
911
+	 * @return string
912
+	 * @throws \EE_Error
913
+	 */
914
+	public function get_payment_details($payments = array())
915
+	{
916
+		//prepare variables for displaying
917
+		$template_args = array();
918
+		$template_args['transaction'] = $this->_current_txn;
919
+		$template_args['reg_url_link'] = $this->_reg_url_link;
920
+		$template_args['payments'] = array();
921
+		foreach ($payments as $payment) {
922
+			$template_args['payments'][] = $this->get_payment_row_html($payment);
923
+		}
924
+		//create a hacky payment object, but dont save it
925
+		$payment = EE_Payment::new_instance(
926
+			array(
927
+				'TXN_ID'        => $this->_current_txn->ID(),
928
+				'STS_ID'        => EEM_Payment::status_id_pending,
929
+				'PAY_timestamp' => time(),
930
+				'PAY_amount'    => $this->_current_txn->total(),
931
+				'PMD_ID'        => $this->_current_txn->payment_method_ID()
932
+			)
933
+		);
934
+		$payment_method = $this->_current_txn->payment_method();
935
+		if ($payment_method instanceof EE_Payment_Method && $payment_method->type_obj() instanceof EE_PMT_Base) {
936
+			$template_args['gateway_content'] = $payment_method->type_obj()->payment_overview_content($payment);
937
+		} else {
938
+			$template_args['gateway_content'] = '';
939
+		}
940
+		// link to SPCO payment_options
941
+		$template_args['show_try_pay_again_link'] = $this->_show_try_pay_again_link;
942
+		$template_args['SPCO_payment_options_url'] = $this->_SPCO_payment_options_url;
943
+		// verify template arguments
944
+		EEH_Template_Validator::verify_instanceof($template_args['transaction'], '$transaction', 'EE_Transaction');
945
+		EEH_Template_Validator::verify_isnt_null($template_args['payments'], '$payments');
946
+		EEH_Template_Validator::verify_isnt_null(
947
+			$template_args['show_try_pay_again_link'],
948
+			'$show_try_pay_again_link'
949
+		);
950
+		EEH_Template_Validator::verify_isnt_null($template_args['gateway_content'], '$gateway_content');
951
+		EEH_Template_Validator::verify_isnt_null(
952
+			$template_args['SPCO_payment_options_url'],
953
+			'$SPCO_payment_options_url'
954
+		);
955
+		return EEH_Template::locate_template(
956
+			THANK_YOU_TEMPLATES_PATH . 'thank-you-page-payment-details.template.php',
957
+			$template_args,
958
+			true,
959
+			true
960
+		);
961
+	}
962
+
963
+
964
+
965
+	/**
966
+	 * get_payment_details
967
+	 *
968
+	 * @param array $payments
969
+	 * @return string
970
+	 * @throws \EE_Error
971
+	 */
972
+	public function get_new_payments($payments = array())
973
+	{
974
+		$payments_html = '';
975
+		//prepare variables for displaying
976
+		foreach ($payments as $payment) {
977
+			$payments_html .= $this->get_payment_row_html($payment);
978
+		}
979
+		return $payments_html;
980
+	}
981 981
 
982 982
 
983 983
 }
Please login to merge, or discard this patch.
admin/extend/transactions/Extend_Transactions_Admin_Page.core.php 2 patches
Indentation   +220 added lines, -220 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
3
-    exit('NO direct script access allowed');
3
+	exit('NO direct script access allowed');
4 4
 }
5 5
 
6 6
 /**
@@ -32,224 +32,224 @@  discard block
 block discarded – undo
32 32
 {
33 33
 
34 34
 
35
-    /**
36
-     * This is used to hold the reports template data which is setup early in the request.
37
-     * @type array
38
-     */
39
-    protected $_reports_template_data = array();
40
-
41
-    /**
42
-     * @Constructor
43
-     * @access public
44
-     *
45
-     * @param bool $routing
46
-     *
47
-     * @return \Extend_Transactions_Admin_Page
48
-     */
49
-    public function __construct($routing = true)
50
-    {
51
-        parent::__construct($routing);
52
-        define('TXN_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'transactions/templates/');
53
-        define('TXN_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'transactions/assets/');
54
-        define('TXN_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'transactions/assets/');
55
-    }
56
-
57
-
58
-    /**
59
-     *    _extend_page_config
60
-     *
61
-     * @access protected
62
-     * @return void
63
-     */
64
-    protected function _extend_page_config()
65
-    {
66
-        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'transactions';
67
-
68
-        $new_page_routes = array(
69
-            'reports' => array(
70
-                'func'       => '_transaction_reports',
71
-                'capability' => 'ee_read_transactions'
72
-            )
73
-        );
74
-
75
-        $this->_page_routes = array_merge($this->_page_routes, $new_page_routes);
76
-
77
-        $new_page_config    = array(
78
-            'reports' => array(
79
-                'nav'           => array(
80
-                    'label' => __('Reports', 'event_espresso'),
81
-                    'order' => 20
82
-                ),
83
-                'help_tabs'     => array(
84
-                    'transactions_reports_help_tab' => array(
85
-                        'title'    => __('Transaction Reports', 'event_espresso'),
86
-                        'filename' => 'transactions_reports'
87
-                    )
88
-                ),
89
-                /*'help_tour' => array( 'Transaction_Reports_Help_Tour' ),*/
90
-                'require_nonce' => false
91
-            )
92
-        );
93
-        $this->_page_config = array_merge($this->_page_config, $new_page_config);
94
-    }
95
-
96
-
97
-    /**
98
-     *    load_scripts_styles_reports
99
-     *
100
-     * @access public
101
-     * @return void
102
-     */
103
-    public function load_scripts_styles_reports()
104
-    {
105
-        wp_register_script(
106
-            'ee-txn-reports-js',
107
-            TXN_CAF_ASSETS_URL . 'ee-transaction-admin-reports.js',
108
-            array('google-charts'),
109
-            EVENT_ESPRESSO_VERSION,
110
-            true
111
-        );
112
-        wp_enqueue_script('ee-txn-reports-js');
113
-        $this->_transaction_reports_js_setup();
114
-        EE_Registry::$i18n_js_strings['currency_format'] = EEH_Money::get_format_for_google_charts();
115
-    }
116
-
117
-
118
-    /**
119
-     * This is called when javascript is being enqueued to setup the various data needed for the reports js.
120
-     * Also $this->{$_reports_template_data} property is set for later usage by the _transaction_reports method.
121
-     */
122
-    protected function _transaction_reports_js_setup()
123
-    {
124
-        $this->_reports_template_data['admin_reports'][] = $this->_revenue_per_day_report();
125
-        $this->_reports_template_data['admin_reports'][] = $this->_revenue_per_event_report();
126
-    }
127
-
128
-
129
-    /**
130
-     * _transaction_reports
131
-     *    generates Business Reports regarding Transactions
132
-     *
133
-     * @return void
134
-     */
135
-    protected function _transaction_reports()
136
-    {
137
-        $template_path                              = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
138
-        $this->_admin_page_title                    = __('Transactions', 'event_espresso');
139
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
140
-            $this->_reports_template_data, true);
141
-
142
-        // the final template wrapper
143
-        $this->display_admin_page_with_no_sidebar();
144
-    }
145
-
146
-
147
-    /**
148
-     * _revenue_per_day_report
149
-     * generates Business Report showing Total Revenue per Day.
150
-     *
151
-     * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
152
-     *
153
-     * @return string
154
-     */
155
-    private function _revenue_per_day_report($period = '-1 month')
156
-    {
157
-
158
-        $report_ID = 'txn-admin-revenue-per-day-report-dv';
159
-
160
-        $TXN = EEM_Transaction::instance();
161
-
162
-        $results  = $TXN->get_revenue_per_day_report($period);
163
-        $results  = (array)$results;
164
-        $revenue  = array();
165
-        $subtitle = '';
166
-
167
-        if ($results) {
168
-            $revenue[] = array(
169
-                __('Date (only shows dates that have a revenue greater than 1)', 'event_espresso'),
170
-                __('Total Revenue', 'event_espresso')
171
-            );
172
-            foreach ($results as $result) {
173
-                $revenue[] = array($result->txnDate, (float)$result->revenue);
174
-            }
175
-
176
-            //setup the date range.
177
-            $beginning_date = new DateTime('now' . $period, new DateTimeZone(EEH_DTT_Helper::get_timezone()));
178
-            $ending_date    = new DateTime('now', new DateTimeZone(EEH_DTT_Helper::get_timezone()));
179
-            $subtitle       = sprintf(_x('For the period: %s to %s', 'Used to give date range', 'event_espresso'),
180
-                $beginning_date->format('Y-m-d'), $ending_date->format('Y-m-d'));
181
-        }
182
-
183
-        $report_title = esc_html__('Total Revenue per Day', 'event_espresso');
184
-
185
-        $report_params = array(
186
-            'title'     => $report_title,
187
-            'subtitle'  => $subtitle,
188
-            'id'        => $report_ID,
189
-            'revenue'   => $revenue,
190
-            'noResults' => empty($revenue) || count($revenue) === 1,
191
-            'noTxnMsg'  => sprintf(__('%sThere is no revenue to report for the last 30 days.%s', 'event_espresso'),
192
-                '<h2>' . $report_title . '</h2><p>', '</p>')
193
-        );
194
-        wp_localize_script('ee-txn-reports-js', 'txnRevPerDay', $report_params);
195
-
196
-        return $report_ID;
197
-    }
198
-
199
-
200
-    /**
201
-     * _revenue_per_event_report
202
-     * generates Business Report showing total revenue per event.
203
-     *
204
-     * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
205
-     *
206
-     * @return int
207
-     */
208
-    private function _revenue_per_event_report($period = '-1 month')
209
-    {
210
-
211
-        $report_ID = 'txn-admin-revenue-per-event-report-dv';
212
-
213
-        $TXN      = EEM_Transaction::instance();
214
-        $results  = $TXN->get_revenue_per_event_report($period);
215
-        $results  = (array)$results;
216
-        $revenue  = array();
217
-        $subtitle = '';
218
-
219
-        if ($results) {
220
-            $revenue[] = array(
221
-                __('Event (only events that have a revenue greater than 1 are shown)', 'event_espresso'),
222
-                __('Total Revenue', 'event_espresso')
223
-            );
224
-            foreach ($results as $result) {
225
-                if ($result->revenue > 1) {
226
-                    $event_name = stripslashes(html_entity_decode($result->event_name, ENT_QUOTES, 'UTF-8'));
227
-                    $event_name = wp_trim_words($event_name, 5, '...');
228
-                    $revenue[]  = array($event_name, (float)$result->revenue);
229
-                }
230
-            }
231
-
232
-            //setup the date range.
233
-            $beginning_date = new DateTime('now' . $period, new DateTimeZone(EEH_DTT_Helper::get_timezone()));
234
-            $ending_date    = new DateTime('now', new DateTimeZone(EEH_DTT_Helper::get_timezone()));
235
-            $subtitle       = sprintf(_x('For the period: %s to %s', 'Used to give date range', 'event_espresso'),
236
-                $beginning_date->format('Y-m-d'), $ending_date->format('Y-m-d'));
237
-        }
238
-
239
-        $report_title = esc_html__('Total Revenue per Event', 'event_espresso');
240
-
241
-        $report_params = array(
242
-            'title'     => $report_title,
243
-            'subtitle'  => $subtitle,
244
-            'id'        => $report_ID,
245
-            'revenue'   => $revenue,
246
-            'noResults' => empty($revenue),
247
-            'noTxnMsg'  => sprintf(__('%sThere is no revenue to report for the last 30 days.%s', 'event_espresso'),
248
-                '<h2>' . $report_title . '</h2><p>', '</p>')
249
-        );
250
-        wp_localize_script('ee-txn-reports-js', 'txnRevPerEvent', $report_params);
251
-
252
-        return $report_ID;
253
-    }
35
+	/**
36
+	 * This is used to hold the reports template data which is setup early in the request.
37
+	 * @type array
38
+	 */
39
+	protected $_reports_template_data = array();
40
+
41
+	/**
42
+	 * @Constructor
43
+	 * @access public
44
+	 *
45
+	 * @param bool $routing
46
+	 *
47
+	 * @return \Extend_Transactions_Admin_Page
48
+	 */
49
+	public function __construct($routing = true)
50
+	{
51
+		parent::__construct($routing);
52
+		define('TXN_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'transactions/templates/');
53
+		define('TXN_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'transactions/assets/');
54
+		define('TXN_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'transactions/assets/');
55
+	}
56
+
57
+
58
+	/**
59
+	 *    _extend_page_config
60
+	 *
61
+	 * @access protected
62
+	 * @return void
63
+	 */
64
+	protected function _extend_page_config()
65
+	{
66
+		$this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'transactions';
67
+
68
+		$new_page_routes = array(
69
+			'reports' => array(
70
+				'func'       => '_transaction_reports',
71
+				'capability' => 'ee_read_transactions'
72
+			)
73
+		);
74
+
75
+		$this->_page_routes = array_merge($this->_page_routes, $new_page_routes);
76
+
77
+		$new_page_config    = array(
78
+			'reports' => array(
79
+				'nav'           => array(
80
+					'label' => __('Reports', 'event_espresso'),
81
+					'order' => 20
82
+				),
83
+				'help_tabs'     => array(
84
+					'transactions_reports_help_tab' => array(
85
+						'title'    => __('Transaction Reports', 'event_espresso'),
86
+						'filename' => 'transactions_reports'
87
+					)
88
+				),
89
+				/*'help_tour' => array( 'Transaction_Reports_Help_Tour' ),*/
90
+				'require_nonce' => false
91
+			)
92
+		);
93
+		$this->_page_config = array_merge($this->_page_config, $new_page_config);
94
+	}
95
+
96
+
97
+	/**
98
+	 *    load_scripts_styles_reports
99
+	 *
100
+	 * @access public
101
+	 * @return void
102
+	 */
103
+	public function load_scripts_styles_reports()
104
+	{
105
+		wp_register_script(
106
+			'ee-txn-reports-js',
107
+			TXN_CAF_ASSETS_URL . 'ee-transaction-admin-reports.js',
108
+			array('google-charts'),
109
+			EVENT_ESPRESSO_VERSION,
110
+			true
111
+		);
112
+		wp_enqueue_script('ee-txn-reports-js');
113
+		$this->_transaction_reports_js_setup();
114
+		EE_Registry::$i18n_js_strings['currency_format'] = EEH_Money::get_format_for_google_charts();
115
+	}
116
+
117
+
118
+	/**
119
+	 * This is called when javascript is being enqueued to setup the various data needed for the reports js.
120
+	 * Also $this->{$_reports_template_data} property is set for later usage by the _transaction_reports method.
121
+	 */
122
+	protected function _transaction_reports_js_setup()
123
+	{
124
+		$this->_reports_template_data['admin_reports'][] = $this->_revenue_per_day_report();
125
+		$this->_reports_template_data['admin_reports'][] = $this->_revenue_per_event_report();
126
+	}
127
+
128
+
129
+	/**
130
+	 * _transaction_reports
131
+	 *    generates Business Reports regarding Transactions
132
+	 *
133
+	 * @return void
134
+	 */
135
+	protected function _transaction_reports()
136
+	{
137
+		$template_path                              = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
138
+		$this->_admin_page_title                    = __('Transactions', 'event_espresso');
139
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
140
+			$this->_reports_template_data, true);
141
+
142
+		// the final template wrapper
143
+		$this->display_admin_page_with_no_sidebar();
144
+	}
145
+
146
+
147
+	/**
148
+	 * _revenue_per_day_report
149
+	 * generates Business Report showing Total Revenue per Day.
150
+	 *
151
+	 * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
152
+	 *
153
+	 * @return string
154
+	 */
155
+	private function _revenue_per_day_report($period = '-1 month')
156
+	{
157
+
158
+		$report_ID = 'txn-admin-revenue-per-day-report-dv';
159
+
160
+		$TXN = EEM_Transaction::instance();
161
+
162
+		$results  = $TXN->get_revenue_per_day_report($period);
163
+		$results  = (array)$results;
164
+		$revenue  = array();
165
+		$subtitle = '';
166
+
167
+		if ($results) {
168
+			$revenue[] = array(
169
+				__('Date (only shows dates that have a revenue greater than 1)', 'event_espresso'),
170
+				__('Total Revenue', 'event_espresso')
171
+			);
172
+			foreach ($results as $result) {
173
+				$revenue[] = array($result->txnDate, (float)$result->revenue);
174
+			}
175
+
176
+			//setup the date range.
177
+			$beginning_date = new DateTime('now' . $period, new DateTimeZone(EEH_DTT_Helper::get_timezone()));
178
+			$ending_date    = new DateTime('now', new DateTimeZone(EEH_DTT_Helper::get_timezone()));
179
+			$subtitle       = sprintf(_x('For the period: %s to %s', 'Used to give date range', 'event_espresso'),
180
+				$beginning_date->format('Y-m-d'), $ending_date->format('Y-m-d'));
181
+		}
182
+
183
+		$report_title = esc_html__('Total Revenue per Day', 'event_espresso');
184
+
185
+		$report_params = array(
186
+			'title'     => $report_title,
187
+			'subtitle'  => $subtitle,
188
+			'id'        => $report_ID,
189
+			'revenue'   => $revenue,
190
+			'noResults' => empty($revenue) || count($revenue) === 1,
191
+			'noTxnMsg'  => sprintf(__('%sThere is no revenue to report for the last 30 days.%s', 'event_espresso'),
192
+				'<h2>' . $report_title . '</h2><p>', '</p>')
193
+		);
194
+		wp_localize_script('ee-txn-reports-js', 'txnRevPerDay', $report_params);
195
+
196
+		return $report_ID;
197
+	}
198
+
199
+
200
+	/**
201
+	 * _revenue_per_event_report
202
+	 * generates Business Report showing total revenue per event.
203
+	 *
204
+	 * @param string $period The period (acceptable by PHP Datetime constructor) for which the report is generated.
205
+	 *
206
+	 * @return int
207
+	 */
208
+	private function _revenue_per_event_report($period = '-1 month')
209
+	{
210
+
211
+		$report_ID = 'txn-admin-revenue-per-event-report-dv';
212
+
213
+		$TXN      = EEM_Transaction::instance();
214
+		$results  = $TXN->get_revenue_per_event_report($period);
215
+		$results  = (array)$results;
216
+		$revenue  = array();
217
+		$subtitle = '';
218
+
219
+		if ($results) {
220
+			$revenue[] = array(
221
+				__('Event (only events that have a revenue greater than 1 are shown)', 'event_espresso'),
222
+				__('Total Revenue', 'event_espresso')
223
+			);
224
+			foreach ($results as $result) {
225
+				if ($result->revenue > 1) {
226
+					$event_name = stripslashes(html_entity_decode($result->event_name, ENT_QUOTES, 'UTF-8'));
227
+					$event_name = wp_trim_words($event_name, 5, '...');
228
+					$revenue[]  = array($event_name, (float)$result->revenue);
229
+				}
230
+			}
231
+
232
+			//setup the date range.
233
+			$beginning_date = new DateTime('now' . $period, new DateTimeZone(EEH_DTT_Helper::get_timezone()));
234
+			$ending_date    = new DateTime('now', new DateTimeZone(EEH_DTT_Helper::get_timezone()));
235
+			$subtitle       = sprintf(_x('For the period: %s to %s', 'Used to give date range', 'event_espresso'),
236
+				$beginning_date->format('Y-m-d'), $ending_date->format('Y-m-d'));
237
+		}
238
+
239
+		$report_title = esc_html__('Total Revenue per Event', 'event_espresso');
240
+
241
+		$report_params = array(
242
+			'title'     => $report_title,
243
+			'subtitle'  => $subtitle,
244
+			'id'        => $report_ID,
245
+			'revenue'   => $revenue,
246
+			'noResults' => empty($revenue),
247
+			'noTxnMsg'  => sprintf(__('%sThere is no revenue to report for the last 30 days.%s', 'event_espresso'),
248
+				'<h2>' . $report_title . '</h2><p>', '</p>')
249
+		);
250
+		wp_localize_script('ee-txn-reports-js', 'txnRevPerEvent', $report_params);
251
+
252
+		return $report_ID;
253
+	}
254 254
 
255 255
 }
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -49,9 +49,9 @@  discard block
 block discarded – undo
49 49
     public function __construct($routing = true)
50 50
     {
51 51
         parent::__construct($routing);
52
-        define('TXN_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'transactions/templates/');
53
-        define('TXN_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'transactions/assets/');
54
-        define('TXN_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'transactions/assets/');
52
+        define('TXN_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND.'transactions/templates/');
53
+        define('TXN_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND.'transactions/assets/');
54
+        define('TXN_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL.'transactions/assets/');
55 55
     }
56 56
 
57 57
 
@@ -63,7 +63,7 @@  discard block
 block discarded – undo
63 63
      */
64 64
     protected function _extend_page_config()
65 65
     {
66
-        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'transactions';
66
+        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND.'transactions';
67 67
 
68 68
         $new_page_routes = array(
69 69
             'reports' => array(
@@ -104,7 +104,7 @@  discard block
 block discarded – undo
104 104
     {
105 105
         wp_register_script(
106 106
             'ee-txn-reports-js',
107
-            TXN_CAF_ASSETS_URL . 'ee-transaction-admin-reports.js',
107
+            TXN_CAF_ASSETS_URL.'ee-transaction-admin-reports.js',
108 108
             array('google-charts'),
109 109
             EVENT_ESPRESSO_VERSION,
110 110
             true
@@ -134,7 +134,7 @@  discard block
 block discarded – undo
134 134
      */
135 135
     protected function _transaction_reports()
136 136
     {
137
-        $template_path                              = EE_ADMIN_TEMPLATE . 'admin_reports.template.php';
137
+        $template_path                              = EE_ADMIN_TEMPLATE.'admin_reports.template.php';
138 138
         $this->_admin_page_title                    = __('Transactions', 'event_espresso');
139 139
         $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
140 140
             $this->_reports_template_data, true);
@@ -160,7 +160,7 @@  discard block
 block discarded – undo
160 160
         $TXN = EEM_Transaction::instance();
161 161
 
162 162
         $results  = $TXN->get_revenue_per_day_report($period);
163
-        $results  = (array)$results;
163
+        $results  = (array) $results;
164 164
         $revenue  = array();
165 165
         $subtitle = '';
166 166
 
@@ -170,11 +170,11 @@  discard block
 block discarded – undo
170 170
                 __('Total Revenue', 'event_espresso')
171 171
             );
172 172
             foreach ($results as $result) {
173
-                $revenue[] = array($result->txnDate, (float)$result->revenue);
173
+                $revenue[] = array($result->txnDate, (float) $result->revenue);
174 174
             }
175 175
 
176 176
             //setup the date range.
177
-            $beginning_date = new DateTime('now' . $period, new DateTimeZone(EEH_DTT_Helper::get_timezone()));
177
+            $beginning_date = new DateTime('now'.$period, new DateTimeZone(EEH_DTT_Helper::get_timezone()));
178 178
             $ending_date    = new DateTime('now', new DateTimeZone(EEH_DTT_Helper::get_timezone()));
179 179
             $subtitle       = sprintf(_x('For the period: %s to %s', 'Used to give date range', 'event_espresso'),
180 180
                 $beginning_date->format('Y-m-d'), $ending_date->format('Y-m-d'));
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
             'revenue'   => $revenue,
190 190
             'noResults' => empty($revenue) || count($revenue) === 1,
191 191
             'noTxnMsg'  => sprintf(__('%sThere is no revenue to report for the last 30 days.%s', 'event_espresso'),
192
-                '<h2>' . $report_title . '</h2><p>', '</p>')
192
+                '<h2>'.$report_title.'</h2><p>', '</p>')
193 193
         );
194 194
         wp_localize_script('ee-txn-reports-js', 'txnRevPerDay', $report_params);
195 195
 
@@ -212,7 +212,7 @@  discard block
 block discarded – undo
212 212
 
213 213
         $TXN      = EEM_Transaction::instance();
214 214
         $results  = $TXN->get_revenue_per_event_report($period);
215
-        $results  = (array)$results;
215
+        $results  = (array) $results;
216 216
         $revenue  = array();
217 217
         $subtitle = '';
218 218
 
@@ -225,12 +225,12 @@  discard block
 block discarded – undo
225 225
                 if ($result->revenue > 1) {
226 226
                     $event_name = stripslashes(html_entity_decode($result->event_name, ENT_QUOTES, 'UTF-8'));
227 227
                     $event_name = wp_trim_words($event_name, 5, '...');
228
-                    $revenue[]  = array($event_name, (float)$result->revenue);
228
+                    $revenue[]  = array($event_name, (float) $result->revenue);
229 229
                 }
230 230
             }
231 231
 
232 232
             //setup the date range.
233
-            $beginning_date = new DateTime('now' . $period, new DateTimeZone(EEH_DTT_Helper::get_timezone()));
233
+            $beginning_date = new DateTime('now'.$period, new DateTimeZone(EEH_DTT_Helper::get_timezone()));
234 234
             $ending_date    = new DateTime('now', new DateTimeZone(EEH_DTT_Helper::get_timezone()));
235 235
             $subtitle       = sprintf(_x('For the period: %s to %s', 'Used to give date range', 'event_espresso'),
236 236
                 $beginning_date->format('Y-m-d'), $ending_date->format('Y-m-d'));
@@ -245,7 +245,7 @@  discard block
 block discarded – undo
245 245
             'revenue'   => $revenue,
246 246
             'noResults' => empty($revenue),
247 247
             'noTxnMsg'  => sprintf(__('%sThere is no revenue to report for the last 30 days.%s', 'event_espresso'),
248
-                '<h2>' . $report_title . '</h2><p>', '</p>')
248
+                '<h2>'.$report_title.'</h2><p>', '</p>')
249 249
         );
250 250
         wp_localize_script('ee-txn-reports-js', 'txnRevPerEvent', $report_params);
251 251
 
Please login to merge, or discard this patch.
core/helpers/EEH_Event_View.helper.php 1 patch
Indentation   +94 added lines, -94 removed lines patch added patch discarded remove patch
@@ -32,49 +32,49 @@  discard block
 block discarded – undo
32 32
 
33 33
 
34 34
 
35
-    /**
36
-     * get_event
37
-     * attempts to retrieve an EE_Event object any way it can
38
-     *
39
-     * @param int|WP_Post $EVT_ID
40
-     * @return EE_Event|null
41
-     * @throws \EE_Error
42
-     */
35
+	/**
36
+	 * get_event
37
+	 * attempts to retrieve an EE_Event object any way it can
38
+	 *
39
+	 * @param int|WP_Post $EVT_ID
40
+	 * @return EE_Event|null
41
+	 * @throws \EE_Error
42
+	 */
43 43
 	public static function get_event( $EVT_ID = 0 ) {
44
-        // international newspaper?
45
-        global $post;
46
-        $EVT_ID = $EVT_ID instanceof WP_Post && $EVT_ID->post_type === 'espresso_events'
47
-            ? $EVT_ID->ID
48
-            : absint($EVT_ID);
49
-        // do we already have the Event  you are looking for?
50
-        if (EEH_Event_View::$_event instanceof EE_Event && $EVT_ID && EEH_Event_View::$_event->ID() === $EVT_ID) {
51
-            return EEH_Event_View::$_event;
52
-        }
53
-        //reset property so that the new event is cached.
54
-        EEH_Event_View::$_event = null;
55
-
56
-        if ($EVT_ID || $post instanceof WP_Post) {
57
-            //if the post type is for an event and it has a cached event and we don't have a different incoming $EVT_ID
58
-            //then let's just use that cached event on the $post object.
59
-            if (($post instanceof WP_Post 
60
-                    && $post->post_type === 'espresso_events'
61
-                    )
62
-                && isset($post->EE_Event)
63
-                && ($EVT_ID === 0
64
-                    || $EVT_ID === $post->ID
65
-                    )
66
-            ) {
67
-                EEH_Event_View::$_event = $post->EE_Event;
68
-            }
69
-
70
-            //If the event we have isn't an event but we do have an EVT_ID, let's try getting the event using the ID.
71
-            if (! EEH_Event_View::$_event instanceof EE_Event && $EVT_ID) {
72
-                EEH_Event_View::$_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
73
-            }
74
-        }
75
-
76
-        return EEH_Event_View::$_event;
77
-    }
44
+		// international newspaper?
45
+		global $post;
46
+		$EVT_ID = $EVT_ID instanceof WP_Post && $EVT_ID->post_type === 'espresso_events'
47
+			? $EVT_ID->ID
48
+			: absint($EVT_ID);
49
+		// do we already have the Event  you are looking for?
50
+		if (EEH_Event_View::$_event instanceof EE_Event && $EVT_ID && EEH_Event_View::$_event->ID() === $EVT_ID) {
51
+			return EEH_Event_View::$_event;
52
+		}
53
+		//reset property so that the new event is cached.
54
+		EEH_Event_View::$_event = null;
55
+
56
+		if ($EVT_ID || $post instanceof WP_Post) {
57
+			//if the post type is for an event and it has a cached event and we don't have a different incoming $EVT_ID
58
+			//then let's just use that cached event on the $post object.
59
+			if (($post instanceof WP_Post 
60
+					&& $post->post_type === 'espresso_events'
61
+					)
62
+				&& isset($post->EE_Event)
63
+				&& ($EVT_ID === 0
64
+					|| $EVT_ID === $post->ID
65
+					)
66
+			) {
67
+				EEH_Event_View::$_event = $post->EE_Event;
68
+			}
69
+
70
+			//If the event we have isn't an event but we do have an EVT_ID, let's try getting the event using the ID.
71
+			if (! EEH_Event_View::$_event instanceof EE_Event && $EVT_ID) {
72
+				EEH_Event_View::$_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
73
+			}
74
+		}
75
+
76
+		return EEH_Event_View::$_event;
77
+	}
78 78
 
79 79
 
80 80
 
@@ -150,58 +150,58 @@  discard block
 block discarded – undo
150 150
 	 * @return    string
151 151
 	 */
152 152
 	public static function event_content_or_excerpt( $num_words = NULL, $more = NULL ) {
153
-        global $post;
153
+		global $post;
154 154
 		ob_start();
155 155
 		if (( is_single() ) || ( is_archive() && espresso_display_full_description_in_event_list() )) {
156 156
 			// admin has chosen "full description"
157
-            // for the "Event Espresso - Events > Templates > Display Description" option
157
+			// for the "Event Espresso - Events > Templates > Display Description" option
158 158
 			the_content();
159 159
 		} else if (( is_archive() && espresso_display_excerpt_in_event_list() ) ) {
160
-            if ( has_excerpt( $post->ID )) {
161
-                // admin has chosen "excerpt (short desc)"
162
-                // for the "Event Espresso - Events > Templates > Display Description" option
163
-                // AND an excerpt actually exists
164
-                the_excerpt();
165
-            } else {
166
-                // admin has chosen "excerpt (short desc)"
167
-                // for the "Event Espresso - Events > Templates > Display Description" option
168
-                // but NO excerpt actually exists, so we need to create one
169
-                if ( ! empty( $num_words )) {
170
-                    if ( empty( $more )) {
171
-                        $more_link_text = __( '(more&hellip;)' );
172
-                        $more = ' <a href="' . get_permalink() . '"';
173
-                        $more .= ' class="more-link"';
174
-                        $more .= \EED_Events_Archive::link_target();
175
-                        $more .= '>' . $more_link_text . '</a>';
176
-                        $more = apply_filters( 'the_content_more_link', $more, $more_link_text );
177
-                    }
178
-                    $content = str_replace( 'NOMORELINK', '', get_the_content( 'NOMORELINK' ));
179
-
180
-                    $content =  wp_trim_words( $content, $num_words, ' ' ) . $more;
181
-                } else {
182
-                    $content =  get_the_content();
183
-                }
184
-                global $allowedtags;
185
-                // make sure links are allowed
186
-                $allowedtags['a'] = isset($allowedtags['a'])
187
-                    ? $allowedtags['a']
188
-                    : array();
189
-                // as well as target attribute
190
-                $allowedtags['a']['target'] = isset($allowedtags['a']['target'])
191
-                    ? $allowedtags['a']['target']
192
-                    : false;
193
-                // but get previous value so we can reset it
194
-                $prev_value = $allowedtags['a']['target'];
195
-                $allowedtags['a']['target'] = true;
196
-                $content = wp_kses( $content, $allowedtags );
197
-                $content = strip_shortcodes( $content );
198
-                echo apply_filters( 'the_content', $content );
199
-                $allowedtags['a']['target'] = $prev_value;
200
-            }
201
-        } else {
202
-            // admin has chosen "none"
203
-            // for the "Event Espresso - Events > Templates > Display Description" option
204
-            echo apply_filters( 'the_content', '' );
160
+			if ( has_excerpt( $post->ID )) {
161
+				// admin has chosen "excerpt (short desc)"
162
+				// for the "Event Espresso - Events > Templates > Display Description" option
163
+				// AND an excerpt actually exists
164
+				the_excerpt();
165
+			} else {
166
+				// admin has chosen "excerpt (short desc)"
167
+				// for the "Event Espresso - Events > Templates > Display Description" option
168
+				// but NO excerpt actually exists, so we need to create one
169
+				if ( ! empty( $num_words )) {
170
+					if ( empty( $more )) {
171
+						$more_link_text = __( '(more&hellip;)' );
172
+						$more = ' <a href="' . get_permalink() . '"';
173
+						$more .= ' class="more-link"';
174
+						$more .= \EED_Events_Archive::link_target();
175
+						$more .= '>' . $more_link_text . '</a>';
176
+						$more = apply_filters( 'the_content_more_link', $more, $more_link_text );
177
+					}
178
+					$content = str_replace( 'NOMORELINK', '', get_the_content( 'NOMORELINK' ));
179
+
180
+					$content =  wp_trim_words( $content, $num_words, ' ' ) . $more;
181
+				} else {
182
+					$content =  get_the_content();
183
+				}
184
+				global $allowedtags;
185
+				// make sure links are allowed
186
+				$allowedtags['a'] = isset($allowedtags['a'])
187
+					? $allowedtags['a']
188
+					: array();
189
+				// as well as target attribute
190
+				$allowedtags['a']['target'] = isset($allowedtags['a']['target'])
191
+					? $allowedtags['a']['target']
192
+					: false;
193
+				// but get previous value so we can reset it
194
+				$prev_value = $allowedtags['a']['target'];
195
+				$allowedtags['a']['target'] = true;
196
+				$content = wp_kses( $content, $allowedtags );
197
+				$content = strip_shortcodes( $content );
198
+				echo apply_filters( 'the_content', $content );
199
+				$allowedtags['a']['target'] = $prev_value;
200
+			}
201
+		} else {
202
+			// admin has chosen "none"
203
+			// for the "Event Espresso - Events > Templates > Display Description" option
204
+			echo apply_filters( 'the_content', '' );
205 205
 		}
206 206
 		return ob_get_clean();
207 207
 	}
@@ -248,11 +248,11 @@  discard block
 block discarded – undo
248 248
 					$url = get_term_link( $term, 'espresso_venue_categories' );
249 249
 					if ( ! is_wp_error( $url ) && (( $hide_uncategorized && strtolower( $term->name ) != __( 'uncategorized', 'event_espresso' )) || ! $hide_uncategorized )) {
250 250
 						$category_links[] = '<a href="' . esc_url( $url )
251
-                                            . '" rel="tag"'
252
-                                            . \EED_Events_Archive::link_target()
253
-                                            .'>'
254
-                                            . $term->name
255
-                                            . '</a>';
251
+											. '" rel="tag"'
252
+											. \EED_Events_Archive::link_target()
253
+											.'>'
254
+											. $term->name
255
+											. '</a>';
256 256
 					}
257 257
 				}
258 258
 			}
Please login to merge, or discard this patch.
admin_pages/about/templates/credits.template.php 1 patch
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -3,7 +3,7 @@  discard block
 block discarded – undo
3 3
 <ul class="wp-people-group" id="ee-people-group-owners">
4 4
 	<li class="wp-person" id="ee-person-sshoultes">
5 5
 		<a href="<?php esp_gravatar_profile('[email protected]'); ?>">
6
-			<?php echo esp_gravatar_image( '[email protected]', 'Seth Shoultes' ); ?>
6
+			<?php echo esp_gravatar_image('[email protected]', 'Seth Shoultes'); ?>
7 7
 		</a>
8 8
 		<a class="web" href="<?php esp_gravatar_profile('[email protected]'); ?>">
9 9
 			Seth Shoultes
@@ -12,7 +12,7 @@  discard block
 block discarded – undo
12 12
 	</li>
13 13
 	<li class="wp-person" id="ee-person-gkoyle">
14 14
 		<a href="<?php esp_gravatar_profile('[email protected]'); ?>">
15
-			<?php echo esp_gravatar_image( '[email protected]', 'Garth Koyle' ); ?>
15
+			<?php echo esp_gravatar_image('[email protected]', 'Garth Koyle'); ?>
16 16
 		</a>
17 17
 		<a class="web" href="<?php esp_gravatar_profile('[email protected]'); ?>">
18 18
 			Garth Koyle
@@ -24,7 +24,7 @@  discard block
 block discarded – undo
24 24
 <ul class="wp-people-group" id="ee-people-group-core-developers">
25 25
 	<li class="wp-person" id="ee-person-bchristensen">
26 26
 		<a href="<?php esp_gravatar_profile('[email protected]'); ?>">
27
-			<?php echo esp_gravatar_image( '[email protected]', 'Brent Christensen' ); ?>
27
+			<?php echo esp_gravatar_image('[email protected]', 'Brent Christensen'); ?>
28 28
 		</a>
29 29
 		<a class="web" href="<?php esp_gravatar_profile('[email protected]'); ?>">
30 30
 			Brent Christensen
@@ -33,7 +33,7 @@  discard block
 block discarded – undo
33 33
 	</li>
34 34
 	<li class="wp-person" id="ee-person-dethier">
35 35
 		<a href="<?php esp_gravatar_profile('[email protected]'); ?>">
36
-			<?php echo esp_gravatar_image( '[email protected]', 'Darren Ethier' ); ?>
36
+			<?php echo esp_gravatar_image('[email protected]', 'Darren Ethier'); ?>
37 37
 		</a>
38 38
 		<a class="web" href="<?php esp_gravatar_profile('[email protected]'); ?>">
39 39
 			Darren Ethier
@@ -42,7 +42,7 @@  discard block
 block discarded – undo
42 42
 	</li>
43 43
 	<li class="wp-person" id="ee-person-mnelson">
44 44
 		<a href="<?php esp_gravatar_profile('[email protected]'); ?>">
45
-			<?php echo esp_gravatar_image( '[email protected]', 'Michael Nelson' ); ?>
45
+			<?php echo esp_gravatar_image('[email protected]', 'Michael Nelson'); ?>
46 46
 		</a>
47 47
 		<a class="web" href="<?php esp_gravatar_profile('[email protected]'); ?>">
48 48
 			Michael Nelson
@@ -51,7 +51,7 @@  discard block
 block discarded – undo
51 51
 	</li>
52 52
 	<li class="wp-person" id="ee-person-nkolivoshka">
53 53
 		<a href="<?php esp_gravatar_profile('[email protected]'); ?>">
54
-			<?php echo esp_gravatar_image( '[email protected]', 'Nazar Kolivoshka' ); ?>
54
+			<?php echo esp_gravatar_image('[email protected]', 'Nazar Kolivoshka'); ?>
55 55
 		</a>
56 56
 		<a class="web" href="<?php esp_gravatar_profile('[email protected]'); ?>">
57 57
 			Nazar Kolivoshka
@@ -63,7 +63,7 @@  discard block
 block discarded – undo
63 63
 <ul class="wp-people-group" id="ee-people-group-support-staff">
64 64
 	<li class="wp-person" id="ee-person-jfeck">
65 65
 		<a href="<?php esp_gravatar_profile('[email protected]'); ?>">
66
-			<?php echo esp_gravatar_image( '[email protected]', 'Josh Feck' ); ?>
66
+			<?php echo esp_gravatar_image('[email protected]', 'Josh Feck'); ?>
67 67
 		</a>
68 68
 		<a class="web" href="<?php esp_gravatar_profile('[email protected]'); ?>">
69 69
 			Josh Feck
@@ -71,7 +71,7 @@  discard block
 block discarded – undo
71 71
 	</li>
72 72
 	<li class="wp-person" id="ee-person-twarwick">
73 73
 		<a href="<?php esp_gravatar_profile('[email protected]'); ?>">
74
-			<?php echo esp_gravatar_image( '[email protected]', 'Tony Warwick' ); ?>
74
+			<?php echo esp_gravatar_image('[email protected]', 'Tony Warwick'); ?>
75 75
 		</a>
76 76
 		<a class="web" href="<?php esp_gravatar_profile('[email protected]'); ?>">
77 77
 			Tony Warwick
@@ -79,7 +79,7 @@  discard block
 block discarded – undo
79 79
 	</li>
80 80
 	<li class="wp-person" id="ee-person-lcaum">
81 81
 		<a href="<?php esp_gravatar_profile('[email protected]'); ?>">
82
-			<?php echo esp_gravatar_image( '[email protected]', 'Lorenzo Caum' ); ?>
82
+			<?php echo esp_gravatar_image('[email protected]', 'Lorenzo Caum'); ?>
83 83
 		</a>
84 84
 		<a class="web" href="<?php esp_gravatar_profile('[email protected]'); ?>">
85 85
 			Lorenzo Caum
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
 </ul>
90 90
 <h3 class="wp-people-group"><?php _e('Contributor Recognition', 'event_espresso'); ?></h3>
91 91
 <p class="description">
92
-	<?php printf( __('For every major release we want to recognize the people who contributed to the release via a GitHub pull request. Want to see your name listed here? %sWhen you submit a pull request that gets included in a major release%s, we\'ll add your name here linked to your GitHub profile.', 'event_espresso'), '<a href="https://github.com/eventespresso/event-espresso-core" title="Contribute to Event Espresso by making a pull request via GitHub">', '</a>' ); ?>
92
+	<?php printf(__('For every major release we want to recognize the people who contributed to the release via a GitHub pull request. Want to see your name listed here? %sWhen you submit a pull request that gets included in a major release%s, we\'ll add your name here linked to your GitHub profile.', 'event_espresso'), '<a href="https://github.com/eventespresso/event-espresso-core" title="Contribute to Event Espresso by making a pull request via GitHub">', '</a>'); ?>
93 93
 </p>
94 94
 <p class="wp-credits-list">
95 95
 	<ul>
@@ -103,7 +103,7 @@  discard block
 block discarded – undo
103 103
 </p>
104 104
 <h3 class="wp-people-group"><?php _e('External Libraries', 'event_espresso'); ?></h3>
105 105
 <p class="description">
106
-	<?php printf( __('Along with the libraries %sincluded with WordPress%s, Event Espresso utilizes the following third party libraries:', 'event_espresso'), '<a href="credits.php">', '</a>' ); ?>
106
+	<?php printf(__('Along with the libraries %sincluded with WordPress%s, Event Espresso utilizes the following third party libraries:', 'event_espresso'), '<a href="credits.php">', '</a>'); ?>
107 107
 </p>
108 108
 <p class="wp-credits-list">
109 109
 	<a href="http://josscrowcroft.github.io/accounting.js/"><?php _e('accounting.js', 'event_espresso'); ?></a>,
@@ -119,10 +119,10 @@  discard block
 block discarded – undo
119 119
 
120 120
 <?php
121 121
 	function esp_gravatar_profile($email) {
122
-		echo 'http://www.gravatar.com/' . md5($email);
122
+		echo 'http://www.gravatar.com/'.md5($email);
123 123
 	}
124 124
 
125 125
 	function esp_gravatar_image($email, $name) {
126
-		echo '<img src="http://0.gravatar.com/avatar/' . md5($email) . '?s=60" class="gravatar" alt="' . $name . '"/>';
126
+		echo '<img src="http://0.gravatar.com/avatar/'.md5($email).'?s=60" class="gravatar" alt="'.$name.'"/>';
127 127
 	}
128 128
 ?>
Please login to merge, or discard this patch.