Completed
Pull Request — master (#1436)
by Darren
10:07
created
modules/venue_single/EED_Venue_Single.module.php 2 patches
Indentation   +167 added lines, -167 removed lines patch added patch discarded remove patch
@@ -29,171 +29,171 @@
 block discarded – undo
29 29
 class EED_Venue_Single extends EED_Module
30 30
 {
31 31
 
32
-    /**
33
-     * @return EED_Venue_Single
34
-     */
35
-    public static function instance()
36
-    {
37
-        return parent::get_instance(__CLASS__);
38
-    }
39
-
40
-
41
-    /**
42
-     * set_hooks - for hooking into EE Core, other modules, etc
43
-     *
44
-     * @return void
45
-     * @throws InvalidArgumentException
46
-     * @throws InvalidDataTypeException
47
-     * @throws InvalidInterfaceException
48
-     */
49
-    public static function set_hooks()
50
-    {
51
-        /** @var EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions $custom_post_type_definitions */
52
-        $custom_post_type_definitions = LoaderFactory::getLoader()->getShared(
53
-            'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'
54
-        );
55
-        $custom_post_types = $custom_post_type_definitions->getDefinitions();
56
-        EE_Config::register_route(
57
-            $custom_post_types['espresso_venues']['singular_slug'],
58
-            'Venue_Single',
59
-            'run'
60
-        );
61
-    }
62
-
63
-    /**
64
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
65
-     *
66
-     * @access    public
67
-     * @return    void
68
-     */
69
-    public static function set_hooks_admin()
70
-    {
71
-    }
72
-
73
-
74
-    /**
75
-     * run - initial module setup
76
-     *
77
-     * @access    public
78
-     * @param \WP $WP
79
-     */
80
-    public function run($WP)
81
-    {
82
-        // check what template is loaded
83
-        add_filter('template_include', array($this, 'template_include'), 999, 1);
84
-        add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
85
-    }
86
-
87
-
88
-    /**
89
-     * template_include
90
-     *
91
-     * @access public
92
-     * @param  string $template
93
-     * @return string
94
-     */
95
-    public function template_include($template)
96
-    {
97
-        // not a custom template?
98
-        if (EE_Registry::instance()
99
-                       ->load_core('Front_Controller', array(), false, true)
100
-                       ->get_selected_template() != 'single-espresso_venues.php'
101
-        ) {
102
-            EEH_Template::load_espresso_theme_functions();
103
-            // then add extra event data via hooks
104
-            add_filter('the_title', array($this, 'the_title'), 100, 1);
105
-            add_filter('the_content', array($this, 'venue_details'), 100);
106
-            // don't display entry meta because the existing theme will take car of that
107
-            add_filter('FHEE__content_espresso_venues_details_template__display_entry_meta', '__return_false');
108
-        }
109
-        return $template;
110
-    }
111
-
112
-
113
-    /**
114
-     * the_title
115
-     *
116
-     * @access public
117
-     * @param  string $title
118
-     * @return string
119
-     */
120
-    public function the_title($title = '')
121
-    {
122
-        return $title;
123
-    }
124
-
125
-
126
-    /**
127
-     *    venue_details
128
-     *
129
-     * @access public
130
-     * @param  string $content
131
-     * @return string
132
-     */
133
-    public function venue_details($content)
134
-    {
135
-        global $post;
136
-        if ($post->post_type == 'espresso_venues'
137
-            && ! post_password_required()
138
-        ) {
139
-            // since the 'content-espresso_venues-details.php' template might be used directly from within a theme,
140
-            // it uses the_content() for displaying the $post->post_content
141
-            // so in order to load a template that uses the_content() from within a callback being used to filter the_content(),
142
-            // we need to first remove this callback from being applied to the_content() (otherwise it will recurse and blow up the interweb)
143
-            remove_filter('the_content', array($this, 'venue_details'), 100);
144
-            // add filters we want
145
-            add_filter('the_content', array($this, 'venue_location'), 110);
146
-            // now load our template
147
-            $template = EEH_Template::locate_template('content-espresso_venues-details.php');
148
-            // remove other filters we added so they won't get applied to the next post
149
-            remove_filter('the_content', array($this, 'venue_location'), 110);
150
-        }
151
-        // we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt)
152
-        return ! empty($template) ? $template : $content;
153
-    }
154
-
155
-
156
-    /**
157
-     * venue_location
158
-     *
159
-     * @access public
160
-     * @param  string $content
161
-     * @return string
162
-     */
163
-    public function venue_location($content)
164
-    {
165
-        return $content . EEH_Template::locate_template('content-espresso_venues-location.php');
166
-    }
167
-
168
-
169
-    /**
170
-     *    wp_enqueue_scripts
171
-     *
172
-     * @access public
173
-     * @return void
174
-     */
175
-    public function wp_enqueue_scripts()
176
-    {
177
-        // get some style
178
-        if (apply_filters('FHEE_enable_default_espresso_css', true) && is_single()) {
179
-            // first check theme folder
180
-            if (is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
181
-                wp_register_style(
182
-                    $this->theme,
183
-                    get_stylesheet_directory_uri() . $this->theme . '/style.css',
184
-                    array('dashicons', 'espresso_default')
185
-                );
186
-            } elseif (is_readable(EE_TEMPLATES . $this->theme . '/style.css')) {
187
-                wp_register_style(
188
-                    $this->theme,
189
-                    EE_TEMPLATES_URL . $this->theme . '/style.css',
190
-                    array('dashicons', 'espresso_default')
191
-                );
192
-            }
193
-            wp_enqueue_style($this->theme);
194
-            if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
195
-                add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
196
-            }
197
-        }
198
-    }
32
+	/**
33
+	 * @return EED_Venue_Single
34
+	 */
35
+	public static function instance()
36
+	{
37
+		return parent::get_instance(__CLASS__);
38
+	}
39
+
40
+
41
+	/**
42
+	 * set_hooks - for hooking into EE Core, other modules, etc
43
+	 *
44
+	 * @return void
45
+	 * @throws InvalidArgumentException
46
+	 * @throws InvalidDataTypeException
47
+	 * @throws InvalidInterfaceException
48
+	 */
49
+	public static function set_hooks()
50
+	{
51
+		/** @var EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions $custom_post_type_definitions */
52
+		$custom_post_type_definitions = LoaderFactory::getLoader()->getShared(
53
+			'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'
54
+		);
55
+		$custom_post_types = $custom_post_type_definitions->getDefinitions();
56
+		EE_Config::register_route(
57
+			$custom_post_types['espresso_venues']['singular_slug'],
58
+			'Venue_Single',
59
+			'run'
60
+		);
61
+	}
62
+
63
+	/**
64
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
65
+	 *
66
+	 * @access    public
67
+	 * @return    void
68
+	 */
69
+	public static function set_hooks_admin()
70
+	{
71
+	}
72
+
73
+
74
+	/**
75
+	 * run - initial module setup
76
+	 *
77
+	 * @access    public
78
+	 * @param \WP $WP
79
+	 */
80
+	public function run($WP)
81
+	{
82
+		// check what template is loaded
83
+		add_filter('template_include', array($this, 'template_include'), 999, 1);
84
+		add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
85
+	}
86
+
87
+
88
+	/**
89
+	 * template_include
90
+	 *
91
+	 * @access public
92
+	 * @param  string $template
93
+	 * @return string
94
+	 */
95
+	public function template_include($template)
96
+	{
97
+		// not a custom template?
98
+		if (EE_Registry::instance()
99
+					   ->load_core('Front_Controller', array(), false, true)
100
+					   ->get_selected_template() != 'single-espresso_venues.php'
101
+		) {
102
+			EEH_Template::load_espresso_theme_functions();
103
+			// then add extra event data via hooks
104
+			add_filter('the_title', array($this, 'the_title'), 100, 1);
105
+			add_filter('the_content', array($this, 'venue_details'), 100);
106
+			// don't display entry meta because the existing theme will take car of that
107
+			add_filter('FHEE__content_espresso_venues_details_template__display_entry_meta', '__return_false');
108
+		}
109
+		return $template;
110
+	}
111
+
112
+
113
+	/**
114
+	 * the_title
115
+	 *
116
+	 * @access public
117
+	 * @param  string $title
118
+	 * @return string
119
+	 */
120
+	public function the_title($title = '')
121
+	{
122
+		return $title;
123
+	}
124
+
125
+
126
+	/**
127
+	 *    venue_details
128
+	 *
129
+	 * @access public
130
+	 * @param  string $content
131
+	 * @return string
132
+	 */
133
+	public function venue_details($content)
134
+	{
135
+		global $post;
136
+		if ($post->post_type == 'espresso_venues'
137
+			&& ! post_password_required()
138
+		) {
139
+			// since the 'content-espresso_venues-details.php' template might be used directly from within a theme,
140
+			// it uses the_content() for displaying the $post->post_content
141
+			// so in order to load a template that uses the_content() from within a callback being used to filter the_content(),
142
+			// we need to first remove this callback from being applied to the_content() (otherwise it will recurse and blow up the interweb)
143
+			remove_filter('the_content', array($this, 'venue_details'), 100);
144
+			// add filters we want
145
+			add_filter('the_content', array($this, 'venue_location'), 110);
146
+			// now load our template
147
+			$template = EEH_Template::locate_template('content-espresso_venues-details.php');
148
+			// remove other filters we added so they won't get applied to the next post
149
+			remove_filter('the_content', array($this, 'venue_location'), 110);
150
+		}
151
+		// we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt)
152
+		return ! empty($template) ? $template : $content;
153
+	}
154
+
155
+
156
+	/**
157
+	 * venue_location
158
+	 *
159
+	 * @access public
160
+	 * @param  string $content
161
+	 * @return string
162
+	 */
163
+	public function venue_location($content)
164
+	{
165
+		return $content . EEH_Template::locate_template('content-espresso_venues-location.php');
166
+	}
167
+
168
+
169
+	/**
170
+	 *    wp_enqueue_scripts
171
+	 *
172
+	 * @access public
173
+	 * @return void
174
+	 */
175
+	public function wp_enqueue_scripts()
176
+	{
177
+		// get some style
178
+		if (apply_filters('FHEE_enable_default_espresso_css', true) && is_single()) {
179
+			// first check theme folder
180
+			if (is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
181
+				wp_register_style(
182
+					$this->theme,
183
+					get_stylesheet_directory_uri() . $this->theme . '/style.css',
184
+					array('dashicons', 'espresso_default')
185
+				);
186
+			} elseif (is_readable(EE_TEMPLATES . $this->theme . '/style.css')) {
187
+				wp_register_style(
188
+					$this->theme,
189
+					EE_TEMPLATES_URL . $this->theme . '/style.css',
190
+					array('dashicons', 'espresso_default')
191
+				);
192
+			}
193
+			wp_enqueue_style($this->theme);
194
+			if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
195
+				add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
196
+			}
197
+		}
198
+	}
199 199
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -162,7 +162,7 @@  discard block
 block discarded – undo
162 162
      */
163 163
     public function venue_location($content)
164 164
     {
165
-        return $content . EEH_Template::locate_template('content-espresso_venues-location.php');
165
+        return $content.EEH_Template::locate_template('content-espresso_venues-location.php');
166 166
     }
167 167
 
168 168
 
@@ -177,16 +177,16 @@  discard block
 block discarded – undo
177 177
         // get some style
178 178
         if (apply_filters('FHEE_enable_default_espresso_css', true) && is_single()) {
179 179
             // first check theme folder
180
-            if (is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
180
+            if (is_readable(get_stylesheet_directory().$this->theme.'/style.css')) {
181 181
                 wp_register_style(
182 182
                     $this->theme,
183
-                    get_stylesheet_directory_uri() . $this->theme . '/style.css',
183
+                    get_stylesheet_directory_uri().$this->theme.'/style.css',
184 184
                     array('dashicons', 'espresso_default')
185 185
                 );
186
-            } elseif (is_readable(EE_TEMPLATES . $this->theme . '/style.css')) {
186
+            } elseif (is_readable(EE_TEMPLATES.$this->theme.'/style.css')) {
187 187
                 wp_register_style(
188 188
                     $this->theme,
189
-                    EE_TEMPLATES_URL . $this->theme . '/style.css',
189
+                    EE_TEMPLATES_URL.$this->theme.'/style.css',
190 190
                     array('dashicons', 'espresso_default')
191 191
                 );
192 192
             }
Please login to merge, or discard this patch.
modules/events_archive_filters/EED_Events_Archive_Filters.module.php 2 patches
Indentation   +1021 added lines, -1021 removed lines patch added patch discarded remove patch
@@ -12,1025 +12,1025 @@
 block discarded – undo
12 12
 {
13 13
 
14 14
 
15
-    /**
16
-     * @return EED_Events_Archive_Filters
17
-     */
18
-    public static function instance()
19
-    {
20
-        return parent::get_instance(__CLASS__);
21
-    }
22
-
23
-
24
-    /**
25
-     *    Start Date
26
-     *
27
-     * @var    $_elf_month
28
-     * @access    protected
29
-     */
30
-    protected $_elf_month = null;
31
-
32
-
33
-    /**
34
-     *    Category
35
-     *
36
-     * @var    $_elf_category
37
-     * @access    protected
38
-     */
39
-    protected $_elf_category = null;
40
-
41
-
42
-    /**
43
-     *    whether to display expired events in the event list
44
-     *
45
-     * @var    $_show_expired
46
-     * @access    protected
47
-     */
48
-    protected $_show_expired = null;
49
-
50
-
51
-    /**
52
-     *    whether to display the event list as a grid or list
53
-     *
54
-     * @var    $_type
55
-     * @access    protected
56
-     */
57
-    protected static $_type = null;
58
-
59
-
60
-    /**
61
-     *    array of existing event list views
62
-     *
63
-     * @var    $_types
64
-     * @access    protected
65
-     */
66
-    protected static $_types = array('grid', 'text', 'dates');
67
-
68
-
69
-
70
-    /**
71
-     *    set_hooks - for hooking into EE Core, other modules, etc
72
-     *
73
-     * @access    public
74
-     * @return    void
75
-     */
76
-    public static function set_hooks()
77
-    {
78
-    }
79
-
80
-    /**
81
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
82
-     *
83
-     * @access    public
84
-     * @return    void
85
-     */
86
-    public static function set_hooks_admin()
87
-    {
88
-    }
89
-
90
-
91
-    /**
92
-     *    set_definitions
93
-     *
94
-     * @access    public
95
-     * @return    void
96
-     */
97
-    public static function set_definitions()
98
-    {
99
-    }
100
-
101
-
102
-    /**
103
-     *    run - initial module setup
104
-     *
105
-     * @access    public
106
-     * @return    void
107
-     */
108
-    public function run($WP)
109
-    {
110
-    }
111
-
112
-
113
-    /**
114
-     *    event_list
115
-     *
116
-     * @access    public
117
-     * @return    void
118
-     */
119
-    public function event_list()
120
-    {
121
-        // load other required components
122
-        $this->_load_assests();
123
-    }
124
-
125
-
126
-    /**
127
-     *    _filter_query_parts
128
-     *
129
-     * @access    public
130
-     * @return    void
131
-     */
132
-    private function _filter_query_parts()
133
-    {
134
-        // build event list query
135
-        add_filter('posts_join', array($this, 'posts_join'), 1, 2);
136
-        add_filter('posts_where', array($this, 'posts_where'), 1, 2);
137
-        add_filter('posts_orderby', array($this, 'posts_orderby'), 1, 2);
138
-    }
139
-
140
-    /**
141
-     *    _type - the type of event list : grid, text, dates
142
-     *
143
-     * @access    public
144
-     * @return    string
145
-     */
146
-    public static function set_type()
147
-    {
148
-        do_action('AHEE__EED_Events_Archive_Filters__before_set_type');
149
-        EED_Events_Archive_Filters::$_types = apply_filters(
150
-            'EED_Events_Archive_Filters__set_type__types',
151
-            EED_Events_Archive_Filters::$_types
152
-        );
153
-        $view = isset(EE_Registry::instance()->CFG->EED_Events_Archive_Filters['default_type']) ? EE_Registry::instance(
154
-        )->CFG->EED_Events_Archive_Filters['default_type'] : 'grid';
155
-        $elf_type = EE_Registry::instance()->REQ->is_set('elf_type') ? sanitize_text_field(
156
-            EE_Registry::instance()->REQ->get('elf_type')
157
-        ) : '';
158
-        $view = ! empty($elf_type) ? $elf_type : $view;
159
-        $view = apply_filters('EED_Events_Archive_Filters__set_type__type', $view);
160
-        if (! empty($view) && in_array($view, EED_Events_Archive_Filters::$_types)) {
161
-            self::$_type = $view;
162
-        }
163
-    }
164
-
165
-    /**
166
-     *    _show_expired
167
-     *
168
-     * @access    private
169
-     * @param    boolean $req_only if TRUE, then ignore defaults and only return $_POST value
170
-     * @return    boolean
171
-     */
172
-    private static function _show_expired($req_only = false)
173
-    {
174
-        // get default value for "display_expired_events" as set in the EE General Settings > Templates > Event Listings
175
-        $show_expired = ! $req_only && isset(
176
-            EE_Registry::instance()->CFG->EED_Events_Archive_Filters['display_expired_events']
177
-        ) ? EE_Registry::instance()->CFG->EED_Events_Archive_Filters['display_expired_events'] : false;
178
-        // override default expired option if set via filter
179
-        $show_expired = EE_Registry::instance()->REQ->is_set('elf_expired_chk') ? absint(
180
-            EE_Registry::instance()->REQ->get('elf_expired_chk')
181
-        ) : $show_expired;
182
-        return $show_expired ? true : false;
183
-    }
184
-
185
-    /**
186
-     *    _event_category_slug
187
-     *
188
-     * @access    private
189
-     * @return    string
190
-     */
191
-    private static function _event_category_slug()
192
-    {
193
-        return EE_Registry::instance()->REQ->is_set('elf_category_dd') ? sanitize_text_field(
194
-            EE_Registry::instance()->REQ->get('elf_category_dd')
195
-        ) : '';
196
-    }
197
-
198
-    /**
199
-     *    _display_month - what month should the event list display events for?
200
-     *
201
-     * @access    private
202
-     * @return    string
203
-     */
204
-    private static function _display_month()
205
-    {
206
-        return EE_Registry::instance()->REQ->is_set('elf_month_dd') ? sanitize_text_field(
207
-            EE_Registry::instance()->REQ->get('elf_month_dd')
208
-        ) : '';
209
-    }
210
-
211
-
212
-    /**
213
-     *    get_post_data
214
-     *
215
-     * @access    public
216
-     * @return    void
217
-     */
218
-    public function get_post_data()
219
-    {
220
-        $this->_elf_month = EED_Events_Archive_Filters::_display_month();
221
-        $this->_elf_category = EED_Events_Archive_Filters::_event_category_slug();
222
-        $this->_show_expired = EED_Events_Archive_Filters::_show_expired(true);
223
-    }
224
-
225
-
226
-    /**
227
-     *    posts_join
228
-     *
229
-     * @access    public
230
-     * @return    void
231
-     */
232
-    public function posts_join($SQL, WP_Query $wp_query)
233
-    {
234
-        if (isset($wp_query->query) && isset($wp_query->query['post_type']) && $wp_query->query['post_type'] == 'espresso_events') {
235
-            // Category
236
-            $SQL .= EED_Events_Archive_Filters::posts_join_sql_for_terms(
237
-                EED_Events_Archive_Filters::_event_category_slug()
238
-            );
239
-        }
240
-        return $SQL;
241
-    }
242
-
243
-
244
-    /**
245
-     *    posts_join_sql_for_terms
246
-     *
247
-     * @access    public
248
-     * @param    mixed boolean|string    $join_terms pass TRUE or term string, doesn't really matter since this value
249
-     *                                   doesn't really get used for anything yet
250
-     * @return    string
251
-     */
252
-    public static function posts_join_sql_for_terms($join_terms = null)
253
-    {
254
-        $SQL = '';
255
-        if (! empty($join_terms)) {
256
-            global $wpdb;
257
-            $SQL .= " LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)";
258
-            $SQL .= " LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";
259
-            $SQL .= " LEFT JOIN $wpdb->terms ON ($wpdb->terms.term_id = $wpdb->term_taxonomy.term_id) ";
260
-        }
261
-        return $SQL;
262
-    }
263
-
264
-
265
-    /**
266
-     *    posts_join_for_orderby
267
-     *    usage:  $SQL .= EED_Events_Archive_Filters::posts_join_for_orderby( $orderby_params );
268
-     *
269
-     * @access    public
270
-     * @param    array $orderby_params
271
-     * @return    string
272
-     */
273
-    public static function posts_join_for_orderby($orderby_params = array())
274
-    {
275
-        global $wpdb;
276
-        $SQL = '';
277
-        $orderby_params = is_array($orderby_params) ? $orderby_params : array($orderby_params);
278
-        foreach ($orderby_params as $orderby) {
279
-            switch ($orderby) {
280
-                case 'ticket_start':
281
-                case 'ticket_end':
282
-                    $SQL .= ' LEFT JOIN ' . EEM_Datetime_Ticket::instance()->table() . ' ON ('
283
-                            . EEM_Datetime::instance()->table() . '.DTT_ID = '
284
-                            . EEM_Datetime_Ticket::instance()->table() . '.DTT_ID )';
285
-                    $SQL .= ' LEFT JOIN ' . EEM_Ticket::instance()->table() . ' ON ('
286
-                            . EEM_Datetime_Ticket::instance()->table() . '.TKT_ID = '
287
-                            . EEM_Ticket::instance()->table() . '.TKT_ID )';
288
-                    break;
289
-
290
-                case 'venue_title':
291
-                case 'city':
292
-                    $SQL .= ' LEFT JOIN ' . EEM_Event_Venue::instance()->table() . ' ON (' . $wpdb->posts . '.ID = '
293
-                            . EEM_Event_Venue::instance()->table() . '.EVT_ID )';
294
-                    $SQL .= ' LEFT JOIN ' . EEM_Venue::instance()->table() . ' ON ('
295
-                            . EEM_Event_Venue::instance()->table() . '.VNU_ID = '
296
-                            . EEM_Venue::instance()->table() . '.VNU_ID )';
297
-                    break;
298
-
299
-                case 'state':
300
-                    $SQL .= ' LEFT JOIN ' . EEM_Event_Venue::instance()->table() . ' ON (' . $wpdb->posts . '.ID = '
301
-                            . EEM_Event_Venue::instance()->table() . '.EVT_ID )';
302
-                    $SQL .= ' LEFT JOIN ' . EEM_Event_Venue::instance()->second_table() . ' ON ('
303
-                            . EEM_Event_Venue::instance()->table() . '.VNU_ID = '
304
-                            . EEM_Event_Venue::instance()->second_table() . '.VNU_ID )';
305
-                    break;
306
-            }
307
-        }
308
-        return $SQL;
309
-    }
310
-
311
-
312
-    /**
313
-     *    posts_where
314
-     *
315
-     * @access    public
316
-     * @return    void
317
-     */
318
-    public function posts_where($SQL, WP_Query $wp_query)
319
-    {
320
-        if (isset($wp_query->query_vars) && isset($wp_query->query_vars['post_type']) && $wp_query->query_vars['post_type'] == 'espresso_events') {
321
-            // Show Expired ?
322
-            $SQL .= EED_Events_Archive_Filters::posts_where_sql_for_show_expired(
323
-                EED_Events_Archive_Filters::_show_expired()
324
-            );
325
-            // Category
326
-            // $elf_category = EED_Events_Archive_Filters::_event_category_slug();
327
-            $SQL .= EED_Events_Archive_Filters::posts_where_sql_for_event_category_slug(
328
-                EED_Events_Archive_Filters::_event_category_slug()
329
-            );
330
-            // Start Date
331
-            // $elf_month = EED_Events_Archive_Filters::_display_month();
332
-            $SQL .= EED_Events_Archive_Filters::posts_where_sql_for_event_list_month(
333
-                EED_Events_Archive_Filters::_display_month()
334
-            );
335
-        }
336
-        return $SQL;
337
-    }
338
-
339
-
340
-    /**
341
-     *    posts_where_sql_for_show_expired
342
-     *
343
-     * @access    public
344
-     * @param    boolean $show_expired if TRUE, then displayed past events
345
-     * @return    string
346
-     */
347
-    public static function posts_where_sql_for_show_expired($show_expired = false)
348
-    {
349
-        return ! $show_expired
350
-            ? ' AND ' . EEM_Datetime::instance()->table() . '.DTT_EVT_end > "' . date('Y-m-d H:s:i') . '" '
351
-            : '';
352
-    }
353
-
354
-
355
-    /**
356
-     *    posts_where_sql_for_event_category_slug
357
-     *
358
-     * @access    public
359
-     * @param    boolean $event_category_slug
360
-     * @return    string
361
-     */
362
-    public static function posts_where_sql_for_event_category_slug($event_category_slug = null)
363
-    {
364
-        global $wpdb;
365
-        return ! empty($event_category_slug) ? ' AND ' . $wpdb->terms . '.slug = "' . $event_category_slug . '" ' : '';
366
-    }
367
-
368
-    /**
369
-     *    posts_where_sql_for_event_list_month
370
-     *
371
-     * @access    public
372
-     * @param    boolean $month
373
-     * @return    string
374
-     */
375
-    public static function posts_where_sql_for_event_list_month($month = null)
376
-    {
377
-        $SQL = '';
378
-        if (! empty($month)) {
379
-            // event start date is LESS than the end of the month ( so nothing that doesn't start until next month )
380
-            $SQL = ' AND ' . EEM_Datetime::instance()->table() . '.DTT_EVT_start';
381
-            $SQL .= ' <= "' . date('Y-m-t 23:59:59', \EEH_DTT_Helper::first_of_month_timestamp($month)) . '"';
382
-            // event end date is GREATER than the start of the month ( so nothing that ended before this month )
383
-            $SQL .= ' AND ' . EEM_Datetime::instance()->table() . '.DTT_EVT_end';
384
-            $SQL .= ' >= "' . date('Y-m-d 0:0:00', \EEH_DTT_Helper::first_of_month_timestamp($month)) . '" ';
385
-        }
386
-        return $SQL;
387
-    }
388
-
389
-
390
-    /**
391
-     *    posts_orderby
392
-     *
393
-     * @access    public
394
-     * @return    void
395
-     */
396
-    public function posts_orderby($SQL, WP_Query $wp_query)
397
-    {
398
-        if (isset($wp_query->query) && isset($wp_query->query['post_type']) && $wp_query->query['post_type'] == 'espresso_events') {
399
-            $SQL = EED_Events_Archive_Filters::posts_orderby_sql(array('start_date'));
400
-        }
401
-        return $SQL;
402
-    }
403
-
404
-
405
-    /**
406
-     *    posts_orderby_sql
407
-     *
408
-     *    possible parameters:
409
-     *    ID
410
-     *    start_date
411
-     *    end_date
412
-     *    event_name
413
-     *    category_slug
414
-     *    ticket_start
415
-     *    ticket_end
416
-     *    venue_title
417
-     *    city
418
-     *    state
419
-     *
420
-     *    **IMPORTANT**
421
-     *    make sure to also send the $orderby_params array to the posts_join_for_orderby() method
422
-     *    or else some of the table references below will result in MySQL errors
423
-     *
424
-     * @access    public
425
-     * @param    boolean $orderby_params
426
-     * @return    string
427
-     */
428
-    public static function posts_orderby_sql($orderby_params = array(), $sort = 'ASC')
429
-    {
430
-        global $wpdb;
431
-        $SQL = '';
432
-        $cntr = 1;
433
-        $orderby_params = is_array($orderby_params) ? $orderby_params : array($orderby_params);
434
-        foreach ($orderby_params as $orderby) {
435
-            $glue = $cntr == 1 || $cntr == count($orderby_params) ? ' ' : ', ';
436
-            switch ($orderby) {
437
-                case 'id':
438
-                case 'ID':
439
-                    $SQL .= $glue . $wpdb->posts . '.ID ' . $sort;
440
-                    break;
441
-
442
-                case 'start_date':
443
-                    $SQL .= $glue . EEM_Datetime::instance()->table() . '.DTT_EVT_start ' . $sort;
444
-                    break;
445
-
446
-                case 'end_date':
447
-                    $SQL .= $glue . EEM_Datetime::instance()->table() . '.DTT_EVT_end ' . $sort;
448
-                    break;
449
-
450
-                case 'event_name':
451
-                    $SQL .= $glue . $wpdb->posts . '.post_title ' . $sort;
452
-                    break;
453
-
454
-                case 'category_slug':
455
-                    $SQL .= $glue . $wpdb->terms . '.slug ' . $sort;
456
-                    break;
457
-
458
-                case 'ticket_start':
459
-                    $SQL .= $glue . EEM_Ticket::instance()->table() . '.TKT_start_date ' . $sort;
460
-                    break;
461
-
462
-                case 'ticket_end':
463
-                    $SQL .= $glue . EEM_Ticket::instance()->table() . '.TKT_end_date ' . $sort;
464
-                    break;
465
-
466
-                case 'venue_title':
467
-                    $SQL .= $glue . 'venue_title ' . $sort;
468
-                    break;
469
-
470
-                case 'city':
471
-                    $SQL .= $glue . EEM_Venue::instance()->second_table() . '.VNU_city ' . $sort;
472
-                    break;
473
-
474
-                case 'state':
475
-                    $SQL .= $glue . EEM_State::instance()->table() . '.STA_name ' . $sort;
476
-                    break;
477
-            }
478
-            $cntr++;
479
-        }
480
-        // echo '<h4>$SQL : ' . $SQL . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
481
-        return $SQL;
482
-    }
483
-
484
-
485
-    /**
486
-     *    template_redirect
487
-     *
488
-     * @access    public
489
-     * @return    void
490
-     */
491
-    public function template_redirect()
492
-    {
493
-        // add event list filters
494
-        add_action('loop_start', array($this, 'event_list_template_filters'));
495
-        // and pagination
496
-        add_action('loop_start', array($this, 'event_list_pagination'));
497
-        add_action('loop_end', array($this, 'event_list_pagination'));
498
-        // if NOT a custom template
499
-        if (EE_Registry::instance()
500
-                       ->load_core('Front_Controller', array(), false, true)
501
-                       ->get_selected_template() != 'archive-espresso_events.php'
502
-        ) {
503
-            // don't know if theme uses the_excerpt
504
-            add_filter('the_excerpt', array($this, 'event_details'), 100);
505
-            add_filter('the_excerpt', array($this, 'event_tickets'), 110);
506
-            add_filter('the_excerpt', array($this, 'event_datetimes'), 120);
507
-            add_filter('the_excerpt', array($this, 'event_venues'), 130);
508
-            // or the_content
509
-            add_filter('the_content', array($this, 'event_details'), 100);
510
-            add_filter('the_content', array($this, 'event_tickets'), 110);
511
-            add_filter('the_content', array($this, 'event_datetimes'), 120);
512
-            add_filter('the_content', array($this, 'event_venues'), 130);
513
-        } else {
514
-            remove_all_filters('excerpt_length');
515
-            add_filter('excerpt_length', array($this, 'excerpt_length'), 10);
516
-            add_filter('excerpt_more', array($this, 'excerpt_more'), 10);
517
-        }
518
-    }
519
-
520
-
521
-    /**
522
-     *    event_list_pagination
523
-     *
524
-     * @access    public
525
-     * @return        void
526
-     */
527
-    public function event_list_pagination()
528
-    {
529
-        echo '<div class="ee-pagination-dv ee-clear-float">' . espresso_event_list_pagination() . '</div>';
530
-    }
531
-
532
-
533
-    /**
534
-     *    event_details
535
-     *
536
-     * @access    public
537
-     * @param        string $content
538
-     * @return        void
539
-     */
540
-    public function event_details($content)
541
-    {
542
-        return EEH_Template::display_template(
543
-            EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-details.php',
544
-            array('the_content' => $content),
545
-            true
546
-        );
547
-    }
548
-
549
-
550
-    /**
551
-     *    event_tickets
552
-     *
553
-     * @access    public
554
-     * @param        string $content
555
-     * @return        void
556
-     */
557
-    public function event_tickets($content)
558
-    {
559
-        return $content
560
-               . EEH_Template::display_template(
561
-                   EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-tickets.php',
562
-                   array(),
563
-                   true
564
-               );
565
-    }
566
-
567
-    /**
568
-     *    event_datetimes
569
-     *
570
-     * @access    public
571
-     * @param        string $content
572
-     * @return        void
573
-     */
574
-    public function event_datetimes($content)
575
-    {
576
-        return $content
577
-               . EEH_Template::display_template(
578
-                   EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-datetimes.php',
579
-                   array(),
580
-                   true
581
-               );
582
-    }
583
-
584
-    /**
585
-     *    event_venues
586
-     *
587
-     * @access    public
588
-     * @param        string $content
589
-     * @return        void
590
-     */
591
-    public function event_venues($content)
592
-    {
593
-        return $content
594
-               . EEH_Template::display_template(
595
-                   EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-venues.php',
596
-                   array(),
597
-                   true
598
-               );
599
-    }
600
-
601
-
602
-    /**
603
-     *    _initial_setup
604
-     *
605
-     * @access    public
606
-     * @return    void
607
-     */
608
-    private function _load_assests()
609
-    {
610
-        do_action('AHEE__EED_Events_Archive_Filters__before_load_assests');
611
-        wp_enqueue_style('espresso_default');
612
-        wp_enqueue_style('espresso_custom_css');
613
-        add_filter('FHEE_load_EE_Session', '__return_true');
614
-        add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
615
-        if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
616
-            add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
617
-        }
618
-        // add_filter( 'the_excerpt', array( $this, 'the_excerpt' ), 999 );
619
-    }
620
-
621
-
622
-    /**
623
-     *    _get_template
624
-     *
625
-     * @access    private
626
-     * @return    string
627
-     */
628
-    private function _get_template($which = 'part')
629
-    {
630
-        return EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events.php';
631
-    }
632
-
633
-
634
-    /**
635
-     *    excerpt_length
636
-     *
637
-     * @access    public
638
-     * @return    void
639
-     */
640
-    public function excerpt_length($length)
641
-    {
642
-
643
-        if (self::$_type == 'grid') {
644
-            return 36;
645
-        }
646
-
647
-        switch (EE_Registry::instance()->CFG->template_settings->EED_Events_Archive_Filters->event_list_grid_size) {
648
-            case 'tiny':
649
-                return 12;
650
-                break;
651
-            case 'small':
652
-                return 24;
653
-                break;
654
-            case 'large':
655
-                return 48;
656
-                break;
657
-            case 'medium':
658
-            default:
659
-                return 36;
660
-        }
661
-    }
662
-
663
-
664
-    /**
665
-     *    excerpt_more
666
-     *
667
-     * @access    public
668
-     * @return    void
669
-     */
670
-    public function excerpt_more($more)
671
-    {
672
-        return '&hellip;';
673
-    }
674
-
675
-
676
-
677
-
678
-    /**
679
-     *    wp_enqueue_scripts
680
-     *
681
-     * @access    public
682
-     * @return    void
683
-     */
684
-    public function wp_enqueue_scripts()
685
-    {
686
-        // get some style
687
-        if (apply_filters('FHEE_enable_default_espresso_css', false)) {
688
-            // first check uploads folder
689
-            if (is_readable(
690
-                get_stylesheet_directory() . EE_Config::get_current_theme() . '/archive-espresso_events.css'
691
-            )) {
692
-                wp_register_style(
693
-                    'archive-espresso_events',
694
-                    get_stylesheet_directory_uri() . EE_Config::get_current_theme(
695
-                    ) . '/archive-espresso_events.css',
696
-                    array('dashicons', 'espresso_default')
697
-                );
698
-            } else {
699
-                wp_register_style(
700
-                    'archive-espresso_events',
701
-                    EE_TEMPLATES_URL . EE_Config::get_current_theme() . '/archive-espresso_events.css',
702
-                    array('dashicons', 'espresso_default')
703
-                );
704
-            }
705
-            if (is_readable(
706
-                get_stylesheet_directory() . EE_Config::get_current_theme() . '/archive-espresso_events.js'
707
-            )) {
708
-                wp_register_script(
709
-                    'archive-espresso_events',
710
-                    get_stylesheet_directory_uri() . EE_Config::get_current_theme() . '/archive-espresso_events.js',
711
-                    array('jquery-masonry'),
712
-                    '1.0',
713
-                    true
714
-                );
715
-            } else {
716
-                wp_register_script(
717
-                    'archive-espresso_events',
718
-                    EVENTS_ARCHIVE_ASSETS_URL . 'archive-espresso_events.js',
719
-                    array('jquery-masonry'),
720
-                    '1.0',
721
-                    true
722
-                );
723
-            }
724
-            wp_enqueue_style('archive-espresso_events');
725
-            wp_enqueue_script('jquery-masonry');
726
-            wp_enqueue_script('archive-espresso_events');
727
-            add_action('wp_footer', array('EED_Events_Archive_Filters', 'localize_grid_event_lists'), 1);
728
-        }
729
-    }
730
-
731
-
732
-    /**
733
-     *    template_settings_form
734
-     *
735
-     * @access    public
736
-     * @static
737
-     * @return    void
738
-     */
739
-    public static function localize_grid_event_lists()
740
-    {
741
-        wp_localize_script(
742
-            'archive-espresso_events',
743
-            'espresso_grid_event_lists',
744
-            EED_Events_Archive_Filters::$espresso_grid_event_lists
745
-        );
746
-    }
747
-
748
-
749
-    /**
750
-     *    template_settings_form
751
-     *
752
-     * @access    public
753
-     * @static
754
-     * @return    void
755
-     */
756
-    public static function template_settings_form()
757
-    {
758
-        $EE = EE_Registry::instance();
759
-        $EE->CFG->template_settings->EED_Events_Archive_Filters = isset($EE->CFG->template_settings->EED_Events_Archive_Filters)
760
-            ? $EE->CFG->template_settings->EED_Events_Archive_Filters : new EE_Events_Archive_Config();
761
-        $EE->CFG->template_settings->EED_Events_Archive_Filters = apply_filters(
762
-            'FHEE__Event_List__template_settings_form__event_list_config',
763
-            $EE->CFG->template_settings->EED_Events_Archive_Filters
764
-        );
765
-        EEH_Template::display_template(
766
-            EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
767
-            $EE->CFG->template_settings->EED_Events_Archive_Filters
768
-        );
769
-    }
770
-
771
-
772
-    /**
773
-     *    set_default_settings
774
-     *
775
-     * @access    public
776
-     * @static
777
-     * @return    void
778
-     */
779
-    public static function set_default_settings($CFG)
780
-    {
781
-        // EEH_Debug_Tools::printr( $CFG, '$CFG  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
782
-        $CFG->display_description = isset($CFG->display_description) && ! empty($CFG->display_description)
783
-            ? $CFG->display_description : 1;
784
-        $CFG->display_address = isset($CFG->display_address) && ! empty($CFG->display_address) ? $CFG->display_address
785
-            : true;
786
-        $CFG->display_venue_details = isset($CFG->display_venue_details) && ! empty($CFG->display_venue_details)
787
-            ? $CFG->display_venue_details : true;
788
-        $CFG->display_expired_events = isset($CFG->display_expired_events) && ! empty($CFG->display_expired_events)
789
-            ? $CFG->display_expired_events : false;
790
-        $CFG->default_type = isset($CFG->default_type) && ! empty($CFG->default_type) ? $CFG->default_type : 'grid';
791
-        $CFG->event_list_grid_size = isset($CFG->event_list_grid_size) && ! empty($CFG->event_list_grid_size)
792
-            ? $CFG->event_list_grid_size : 'medium';
793
-        $CFG->templates['full'] = isset($CFG->templates['full']) && ! empty($CFG->templates['full'])
794
-            ? $CFG->templates['full']
795
-            : EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events.php';
796
-        $CFG->templates['part'] = isset($CFG->templates['part']) && ! empty($CFG->templates['part'])
797
-            ? $CFG->templates['part']
798
-            : EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events-grid-view.php';
799
-        return $CFG;
800
-    }
801
-
802
-
803
-    /**
804
-     *    filter_config
805
-     *
806
-     * @access    public
807
-     * @return    void
808
-     */
809
-    public function filter_config($CFG)
810
-    {
811
-        return $CFG;
812
-    }
813
-
814
-
815
-    /**
816
-     *    filter_config
817
-     *
818
-     * @access    public
819
-     * @return    void
820
-     */
821
-    public static function update_template_settings($CFG, $REQ)
822
-    {
823
-        // $CFG->template_settings->EED_Events_Archive_Filters = new stdClass();
824
-        $CFG->EED_Events_Archive_Filters->display_description = isset($REQ['display_description_in_event_list'])
825
-            ? absint($REQ['display_description_in_event_list']) : 1;
826
-        $CFG->EED_Events_Archive_Filters->display_address = isset($REQ['display_address_in_event_list']) ? absint(
827
-            $REQ['display_address_in_event_list']
828
-        ) : true;
829
-        $CFG->EED_Events_Archive_Filters->display_venue_details = isset($REQ['display_venue_details_in_event_list'])
830
-            ? absint($REQ['display_venue_details_in_event_list']) : true;
831
-        $CFG->EED_Events_Archive_Filters->display_expired_events = isset($REQ['display_expired_events']) ? absint(
832
-            $REQ['display_expired_events']
833
-        ) : false;
834
-        $CFG->EED_Events_Archive_Filters->default_type = isset($REQ['default_type']) ? sanitize_text_field(
835
-            $REQ['default_type']
836
-        ) : 'grid';
837
-        $CFG->EED_Events_Archive_Filters->event_list_grid_size = isset($REQ['event_list_grid_size'])
838
-            ? sanitize_text_field($REQ['event_list_grid_size']) : 'medium';
839
-        $CFG->EED_Events_Archive_Filters->templates = array(
840
-            'full' => EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events.php',
841
-        );
842
-
843
-        switch ($CFG->EED_Events_Archive_Filters->default_type) {
844
-            case 'dates':
845
-                $CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES . EE_Config::get_current_theme()
846
-                                                                      . '/archive-espresso_events-dates-view.php';
847
-                break;
848
-            case 'text':
849
-                $CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES . EE_Config::get_current_theme()
850
-                                                                      . '/archive-espresso_events-text-view.php';
851
-                break;
852
-            default:
853
-                $CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES . EE_Config::get_current_theme()
854
-                                                                      . '/archive-espresso_events-grid-view.php';
855
-        }
856
-
857
-        $CFG->EED_Events_Archive_Filters = isset($REQ['reset_event_list_settings'])
858
-                                           && absint($REQ['reset_event_list_settings']) == 1
859
-            ? new EE_Events_Archive_Config()
860
-            : $CFG->EED_Events_Archive_Filters;
861
-        return $CFG;
862
-    }
863
-
864
-
865
-    /**
866
-     *    get_template_part
867
-     *
868
-     * @access    public
869
-     * @return    void
870
-     */
871
-    public static function get_template_part()
872
-    {
873
-        switch (self::$_type) {
874
-            case 'dates':
875
-                return 'archive-espresso_events-dates-view.php';
876
-                break;
877
-            case 'text':
878
-                return 'archive-espresso_events-text-view.php';
879
-                break;
880
-            default:
881
-                return 'archive-espresso_events-grid-view.php';
882
-        }
883
-    }
884
-
885
-
886
-    /**
887
-     *    event_list_template_filters
888
-     *
889
-     * @access    public
890
-     * @return    void
891
-     */
892
-    public function event_list_template_filters()
893
-    {
894
-        $args = array(
895
-            'form_url'         => get_post_type_archive_link('espresso_events'),
896
-            // add_query_arg( array( 'post_type' => 'espresso_events' ), home_url() ),
897
-            'elf_month'        => EED_Events_Archive_Filters::_display_month(),
898
-            'elf_category'     => EED_Events_Archive_Filters::_event_category_slug(),
899
-            'elf_show_expired' => EED_Events_Archive_Filters::_show_expired(),
900
-            'elf_type'         => self::$_type,
901
-        );
902
-        EEH_Template::display_template(
903
-            EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events-filters.php',
904
-            $args
905
-        );
906
-    }
907
-
908
-
909
-    /**
910
-     *    event_list_css
911
-     *
912
-     * @access    public
913
-     * @return    void
914
-     */
915
-    public static function event_list_css($extra_class = '')
916
-    {
917
-        $EE = EE_Registry::instance();
918
-        $event_list_css = ! empty($extra_class) ? array($extra_class) : array();
919
-        $event_list_css[] = 'espresso-event-list-event';
920
-        if (self::$_type == 'grid') {
921
-            $event_list_grid_size = isset($EE->CFG->template_settings->EED_Events_Archive_Filters->event_list_grid_size)
922
-                ? $EE->CFG->template_settings->EED_Events_Archive_Filters->event_list_grid_size : 'medium';
923
-            $event_list_css[] = $event_list_grid_size . '-event-list-grid';
924
-        }
925
-        $event_list_css = apply_filters(
926
-            'EED_Events_Archive_Filters__event_list_css__event_list_css_array',
927
-            $event_list_css
928
-        );
929
-        return implode(' ', $event_list_css);
930
-    }
931
-
932
-
933
-    /**
934
-     *    event_categories
935
-     *
936
-     * @access    public
937
-     * @return    void
938
-     */
939
-    public static function event_categories()
940
-    {
941
-        return EE_Registry::instance()->load_model('Term')->get_all_ee_categories();
942
-    }
943
-
944
-
945
-    /**
946
-     *    display_description
947
-     *
948
-     * @access    public
949
-     * @return    void
950
-     */
951
-    public static function display_description($value)
952
-    {
953
-        $EE = EE_Registry::instance();
954
-        $display_description = isset($EE->CFG->template_settings->EED_Events_Archive_Filters->display_description)
955
-            ? $EE->CFG->template_settings->EED_Events_Archive_Filters->display_description : 1;
956
-        return $display_description === $value ? true : false;
957
-    }
958
-
959
-
960
-    /**
961
-     *    display_venue_details
962
-     *
963
-     * @access    public
964
-     * @return    void
965
-     */
966
-    public static function display_venue_details()
967
-    {
968
-        $EE = EE_Registry::instance();
969
-        $display_venue_details = isset($EE->CFG->template_settings->EED_Events_Archive_Filters->display_venue_details)
970
-            ? $EE->CFG->template_settings->EED_Events_Archive_Filters->display_venue_details : true;
971
-        $venue_name = EEH_Venue_View::venue_name();
972
-        return $display_venue_details && ! empty($venue_name) ? true : false;
973
-    }
974
-
975
-
976
-    /**
977
-     *    display_address
978
-     *
979
-     * @access    public
980
-     * @return    void
981
-     */
982
-    public static function display_address()
983
-    {
984
-        $EE = EE_Registry::instance();
985
-        $display_address = isset($EE->CFG->template_settings->EED_Events_Archive_Filters->display_address)
986
-            ? $EE->CFG->template_settings->EED_Events_Archive_Filters->display_address : false;
987
-        $venue_name = EEH_Venue_View::venue_name();
988
-        return $display_address && ! empty($venue_name) ? true : false;
989
-    }
990
-
991
-
992
-    /**
993
-     *    pagination
994
-     *
995
-     * @access    public
996
-     * @return    void
997
-     */
998
-    public static function pagination()
999
-    {
1000
-        global $wp_query;
1001
-        $big = 999999999; // need an unlikely integer
1002
-        $pagination = paginate_links(
1003
-            array(
1004
-                'base'         => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
1005
-                'format'       => '?paged=%#%',
1006
-                'current'      => max(1, get_query_var('paged')),
1007
-                'total'        => $wp_query->max_num_pages,
1008
-                'show_all'     => true,
1009
-                'end_size'     => 10,
1010
-                'mid_size'     => 6,
1011
-                'prev_next'    => true,
1012
-                'prev_text'    => __('&lsaquo; PREV', 'event_espresso'),
1013
-                'next_text'    => __('NEXT &rsaquo;', 'event_espresso'),
1014
-                'type'         => 'plain',
1015
-                'add_args'     => false,
1016
-                'add_fragment' => '',
1017
-            )
1018
-        );
1019
-        return ! empty($pagination) ? '<div class="ee-pagination-dv clear">' . $pagination . '</div>' : '';
1020
-    }
1021
-
1022
-
1023
-    /**
1024
-     *    event_list_title
1025
-     *
1026
-     * @access    public
1027
-     * @return    void
1028
-     */
1029
-    public static function event_list_title()
1030
-    {
1031
-        return apply_filters(
1032
-            'EED_Events_Archive_Filters__event_list_title__event_list_title',
1033
-            __('Upcoming Events', 'event_espresso')
1034
-        );
1035
-    }
15
+	/**
16
+	 * @return EED_Events_Archive_Filters
17
+	 */
18
+	public static function instance()
19
+	{
20
+		return parent::get_instance(__CLASS__);
21
+	}
22
+
23
+
24
+	/**
25
+	 *    Start Date
26
+	 *
27
+	 * @var    $_elf_month
28
+	 * @access    protected
29
+	 */
30
+	protected $_elf_month = null;
31
+
32
+
33
+	/**
34
+	 *    Category
35
+	 *
36
+	 * @var    $_elf_category
37
+	 * @access    protected
38
+	 */
39
+	protected $_elf_category = null;
40
+
41
+
42
+	/**
43
+	 *    whether to display expired events in the event list
44
+	 *
45
+	 * @var    $_show_expired
46
+	 * @access    protected
47
+	 */
48
+	protected $_show_expired = null;
49
+
50
+
51
+	/**
52
+	 *    whether to display the event list as a grid or list
53
+	 *
54
+	 * @var    $_type
55
+	 * @access    protected
56
+	 */
57
+	protected static $_type = null;
58
+
59
+
60
+	/**
61
+	 *    array of existing event list views
62
+	 *
63
+	 * @var    $_types
64
+	 * @access    protected
65
+	 */
66
+	protected static $_types = array('grid', 'text', 'dates');
67
+
68
+
69
+
70
+	/**
71
+	 *    set_hooks - for hooking into EE Core, other modules, etc
72
+	 *
73
+	 * @access    public
74
+	 * @return    void
75
+	 */
76
+	public static function set_hooks()
77
+	{
78
+	}
79
+
80
+	/**
81
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
82
+	 *
83
+	 * @access    public
84
+	 * @return    void
85
+	 */
86
+	public static function set_hooks_admin()
87
+	{
88
+	}
89
+
90
+
91
+	/**
92
+	 *    set_definitions
93
+	 *
94
+	 * @access    public
95
+	 * @return    void
96
+	 */
97
+	public static function set_definitions()
98
+	{
99
+	}
100
+
101
+
102
+	/**
103
+	 *    run - initial module setup
104
+	 *
105
+	 * @access    public
106
+	 * @return    void
107
+	 */
108
+	public function run($WP)
109
+	{
110
+	}
111
+
112
+
113
+	/**
114
+	 *    event_list
115
+	 *
116
+	 * @access    public
117
+	 * @return    void
118
+	 */
119
+	public function event_list()
120
+	{
121
+		// load other required components
122
+		$this->_load_assests();
123
+	}
124
+
125
+
126
+	/**
127
+	 *    _filter_query_parts
128
+	 *
129
+	 * @access    public
130
+	 * @return    void
131
+	 */
132
+	private function _filter_query_parts()
133
+	{
134
+		// build event list query
135
+		add_filter('posts_join', array($this, 'posts_join'), 1, 2);
136
+		add_filter('posts_where', array($this, 'posts_where'), 1, 2);
137
+		add_filter('posts_orderby', array($this, 'posts_orderby'), 1, 2);
138
+	}
139
+
140
+	/**
141
+	 *    _type - the type of event list : grid, text, dates
142
+	 *
143
+	 * @access    public
144
+	 * @return    string
145
+	 */
146
+	public static function set_type()
147
+	{
148
+		do_action('AHEE__EED_Events_Archive_Filters__before_set_type');
149
+		EED_Events_Archive_Filters::$_types = apply_filters(
150
+			'EED_Events_Archive_Filters__set_type__types',
151
+			EED_Events_Archive_Filters::$_types
152
+		);
153
+		$view = isset(EE_Registry::instance()->CFG->EED_Events_Archive_Filters['default_type']) ? EE_Registry::instance(
154
+		)->CFG->EED_Events_Archive_Filters['default_type'] : 'grid';
155
+		$elf_type = EE_Registry::instance()->REQ->is_set('elf_type') ? sanitize_text_field(
156
+			EE_Registry::instance()->REQ->get('elf_type')
157
+		) : '';
158
+		$view = ! empty($elf_type) ? $elf_type : $view;
159
+		$view = apply_filters('EED_Events_Archive_Filters__set_type__type', $view);
160
+		if (! empty($view) && in_array($view, EED_Events_Archive_Filters::$_types)) {
161
+			self::$_type = $view;
162
+		}
163
+	}
164
+
165
+	/**
166
+	 *    _show_expired
167
+	 *
168
+	 * @access    private
169
+	 * @param    boolean $req_only if TRUE, then ignore defaults and only return $_POST value
170
+	 * @return    boolean
171
+	 */
172
+	private static function _show_expired($req_only = false)
173
+	{
174
+		// get default value for "display_expired_events" as set in the EE General Settings > Templates > Event Listings
175
+		$show_expired = ! $req_only && isset(
176
+			EE_Registry::instance()->CFG->EED_Events_Archive_Filters['display_expired_events']
177
+		) ? EE_Registry::instance()->CFG->EED_Events_Archive_Filters['display_expired_events'] : false;
178
+		// override default expired option if set via filter
179
+		$show_expired = EE_Registry::instance()->REQ->is_set('elf_expired_chk') ? absint(
180
+			EE_Registry::instance()->REQ->get('elf_expired_chk')
181
+		) : $show_expired;
182
+		return $show_expired ? true : false;
183
+	}
184
+
185
+	/**
186
+	 *    _event_category_slug
187
+	 *
188
+	 * @access    private
189
+	 * @return    string
190
+	 */
191
+	private static function _event_category_slug()
192
+	{
193
+		return EE_Registry::instance()->REQ->is_set('elf_category_dd') ? sanitize_text_field(
194
+			EE_Registry::instance()->REQ->get('elf_category_dd')
195
+		) : '';
196
+	}
197
+
198
+	/**
199
+	 *    _display_month - what month should the event list display events for?
200
+	 *
201
+	 * @access    private
202
+	 * @return    string
203
+	 */
204
+	private static function _display_month()
205
+	{
206
+		return EE_Registry::instance()->REQ->is_set('elf_month_dd') ? sanitize_text_field(
207
+			EE_Registry::instance()->REQ->get('elf_month_dd')
208
+		) : '';
209
+	}
210
+
211
+
212
+	/**
213
+	 *    get_post_data
214
+	 *
215
+	 * @access    public
216
+	 * @return    void
217
+	 */
218
+	public function get_post_data()
219
+	{
220
+		$this->_elf_month = EED_Events_Archive_Filters::_display_month();
221
+		$this->_elf_category = EED_Events_Archive_Filters::_event_category_slug();
222
+		$this->_show_expired = EED_Events_Archive_Filters::_show_expired(true);
223
+	}
224
+
225
+
226
+	/**
227
+	 *    posts_join
228
+	 *
229
+	 * @access    public
230
+	 * @return    void
231
+	 */
232
+	public function posts_join($SQL, WP_Query $wp_query)
233
+	{
234
+		if (isset($wp_query->query) && isset($wp_query->query['post_type']) && $wp_query->query['post_type'] == 'espresso_events') {
235
+			// Category
236
+			$SQL .= EED_Events_Archive_Filters::posts_join_sql_for_terms(
237
+				EED_Events_Archive_Filters::_event_category_slug()
238
+			);
239
+		}
240
+		return $SQL;
241
+	}
242
+
243
+
244
+	/**
245
+	 *    posts_join_sql_for_terms
246
+	 *
247
+	 * @access    public
248
+	 * @param    mixed boolean|string    $join_terms pass TRUE or term string, doesn't really matter since this value
249
+	 *                                   doesn't really get used for anything yet
250
+	 * @return    string
251
+	 */
252
+	public static function posts_join_sql_for_terms($join_terms = null)
253
+	{
254
+		$SQL = '';
255
+		if (! empty($join_terms)) {
256
+			global $wpdb;
257
+			$SQL .= " LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)";
258
+			$SQL .= " LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";
259
+			$SQL .= " LEFT JOIN $wpdb->terms ON ($wpdb->terms.term_id = $wpdb->term_taxonomy.term_id) ";
260
+		}
261
+		return $SQL;
262
+	}
263
+
264
+
265
+	/**
266
+	 *    posts_join_for_orderby
267
+	 *    usage:  $SQL .= EED_Events_Archive_Filters::posts_join_for_orderby( $orderby_params );
268
+	 *
269
+	 * @access    public
270
+	 * @param    array $orderby_params
271
+	 * @return    string
272
+	 */
273
+	public static function posts_join_for_orderby($orderby_params = array())
274
+	{
275
+		global $wpdb;
276
+		$SQL = '';
277
+		$orderby_params = is_array($orderby_params) ? $orderby_params : array($orderby_params);
278
+		foreach ($orderby_params as $orderby) {
279
+			switch ($orderby) {
280
+				case 'ticket_start':
281
+				case 'ticket_end':
282
+					$SQL .= ' LEFT JOIN ' . EEM_Datetime_Ticket::instance()->table() . ' ON ('
283
+							. EEM_Datetime::instance()->table() . '.DTT_ID = '
284
+							. EEM_Datetime_Ticket::instance()->table() . '.DTT_ID )';
285
+					$SQL .= ' LEFT JOIN ' . EEM_Ticket::instance()->table() . ' ON ('
286
+							. EEM_Datetime_Ticket::instance()->table() . '.TKT_ID = '
287
+							. EEM_Ticket::instance()->table() . '.TKT_ID )';
288
+					break;
289
+
290
+				case 'venue_title':
291
+				case 'city':
292
+					$SQL .= ' LEFT JOIN ' . EEM_Event_Venue::instance()->table() . ' ON (' . $wpdb->posts . '.ID = '
293
+							. EEM_Event_Venue::instance()->table() . '.EVT_ID )';
294
+					$SQL .= ' LEFT JOIN ' . EEM_Venue::instance()->table() . ' ON ('
295
+							. EEM_Event_Venue::instance()->table() . '.VNU_ID = '
296
+							. EEM_Venue::instance()->table() . '.VNU_ID )';
297
+					break;
298
+
299
+				case 'state':
300
+					$SQL .= ' LEFT JOIN ' . EEM_Event_Venue::instance()->table() . ' ON (' . $wpdb->posts . '.ID = '
301
+							. EEM_Event_Venue::instance()->table() . '.EVT_ID )';
302
+					$SQL .= ' LEFT JOIN ' . EEM_Event_Venue::instance()->second_table() . ' ON ('
303
+							. EEM_Event_Venue::instance()->table() . '.VNU_ID = '
304
+							. EEM_Event_Venue::instance()->second_table() . '.VNU_ID )';
305
+					break;
306
+			}
307
+		}
308
+		return $SQL;
309
+	}
310
+
311
+
312
+	/**
313
+	 *    posts_where
314
+	 *
315
+	 * @access    public
316
+	 * @return    void
317
+	 */
318
+	public function posts_where($SQL, WP_Query $wp_query)
319
+	{
320
+		if (isset($wp_query->query_vars) && isset($wp_query->query_vars['post_type']) && $wp_query->query_vars['post_type'] == 'espresso_events') {
321
+			// Show Expired ?
322
+			$SQL .= EED_Events_Archive_Filters::posts_where_sql_for_show_expired(
323
+				EED_Events_Archive_Filters::_show_expired()
324
+			);
325
+			// Category
326
+			// $elf_category = EED_Events_Archive_Filters::_event_category_slug();
327
+			$SQL .= EED_Events_Archive_Filters::posts_where_sql_for_event_category_slug(
328
+				EED_Events_Archive_Filters::_event_category_slug()
329
+			);
330
+			// Start Date
331
+			// $elf_month = EED_Events_Archive_Filters::_display_month();
332
+			$SQL .= EED_Events_Archive_Filters::posts_where_sql_for_event_list_month(
333
+				EED_Events_Archive_Filters::_display_month()
334
+			);
335
+		}
336
+		return $SQL;
337
+	}
338
+
339
+
340
+	/**
341
+	 *    posts_where_sql_for_show_expired
342
+	 *
343
+	 * @access    public
344
+	 * @param    boolean $show_expired if TRUE, then displayed past events
345
+	 * @return    string
346
+	 */
347
+	public static function posts_where_sql_for_show_expired($show_expired = false)
348
+	{
349
+		return ! $show_expired
350
+			? ' AND ' . EEM_Datetime::instance()->table() . '.DTT_EVT_end > "' . date('Y-m-d H:s:i') . '" '
351
+			: '';
352
+	}
353
+
354
+
355
+	/**
356
+	 *    posts_where_sql_for_event_category_slug
357
+	 *
358
+	 * @access    public
359
+	 * @param    boolean $event_category_slug
360
+	 * @return    string
361
+	 */
362
+	public static function posts_where_sql_for_event_category_slug($event_category_slug = null)
363
+	{
364
+		global $wpdb;
365
+		return ! empty($event_category_slug) ? ' AND ' . $wpdb->terms . '.slug = "' . $event_category_slug . '" ' : '';
366
+	}
367
+
368
+	/**
369
+	 *    posts_where_sql_for_event_list_month
370
+	 *
371
+	 * @access    public
372
+	 * @param    boolean $month
373
+	 * @return    string
374
+	 */
375
+	public static function posts_where_sql_for_event_list_month($month = null)
376
+	{
377
+		$SQL = '';
378
+		if (! empty($month)) {
379
+			// event start date is LESS than the end of the month ( so nothing that doesn't start until next month )
380
+			$SQL = ' AND ' . EEM_Datetime::instance()->table() . '.DTT_EVT_start';
381
+			$SQL .= ' <= "' . date('Y-m-t 23:59:59', \EEH_DTT_Helper::first_of_month_timestamp($month)) . '"';
382
+			// event end date is GREATER than the start of the month ( so nothing that ended before this month )
383
+			$SQL .= ' AND ' . EEM_Datetime::instance()->table() . '.DTT_EVT_end';
384
+			$SQL .= ' >= "' . date('Y-m-d 0:0:00', \EEH_DTT_Helper::first_of_month_timestamp($month)) . '" ';
385
+		}
386
+		return $SQL;
387
+	}
388
+
389
+
390
+	/**
391
+	 *    posts_orderby
392
+	 *
393
+	 * @access    public
394
+	 * @return    void
395
+	 */
396
+	public function posts_orderby($SQL, WP_Query $wp_query)
397
+	{
398
+		if (isset($wp_query->query) && isset($wp_query->query['post_type']) && $wp_query->query['post_type'] == 'espresso_events') {
399
+			$SQL = EED_Events_Archive_Filters::posts_orderby_sql(array('start_date'));
400
+		}
401
+		return $SQL;
402
+	}
403
+
404
+
405
+	/**
406
+	 *    posts_orderby_sql
407
+	 *
408
+	 *    possible parameters:
409
+	 *    ID
410
+	 *    start_date
411
+	 *    end_date
412
+	 *    event_name
413
+	 *    category_slug
414
+	 *    ticket_start
415
+	 *    ticket_end
416
+	 *    venue_title
417
+	 *    city
418
+	 *    state
419
+	 *
420
+	 *    **IMPORTANT**
421
+	 *    make sure to also send the $orderby_params array to the posts_join_for_orderby() method
422
+	 *    or else some of the table references below will result in MySQL errors
423
+	 *
424
+	 * @access    public
425
+	 * @param    boolean $orderby_params
426
+	 * @return    string
427
+	 */
428
+	public static function posts_orderby_sql($orderby_params = array(), $sort = 'ASC')
429
+	{
430
+		global $wpdb;
431
+		$SQL = '';
432
+		$cntr = 1;
433
+		$orderby_params = is_array($orderby_params) ? $orderby_params : array($orderby_params);
434
+		foreach ($orderby_params as $orderby) {
435
+			$glue = $cntr == 1 || $cntr == count($orderby_params) ? ' ' : ', ';
436
+			switch ($orderby) {
437
+				case 'id':
438
+				case 'ID':
439
+					$SQL .= $glue . $wpdb->posts . '.ID ' . $sort;
440
+					break;
441
+
442
+				case 'start_date':
443
+					$SQL .= $glue . EEM_Datetime::instance()->table() . '.DTT_EVT_start ' . $sort;
444
+					break;
445
+
446
+				case 'end_date':
447
+					$SQL .= $glue . EEM_Datetime::instance()->table() . '.DTT_EVT_end ' . $sort;
448
+					break;
449
+
450
+				case 'event_name':
451
+					$SQL .= $glue . $wpdb->posts . '.post_title ' . $sort;
452
+					break;
453
+
454
+				case 'category_slug':
455
+					$SQL .= $glue . $wpdb->terms . '.slug ' . $sort;
456
+					break;
457
+
458
+				case 'ticket_start':
459
+					$SQL .= $glue . EEM_Ticket::instance()->table() . '.TKT_start_date ' . $sort;
460
+					break;
461
+
462
+				case 'ticket_end':
463
+					$SQL .= $glue . EEM_Ticket::instance()->table() . '.TKT_end_date ' . $sort;
464
+					break;
465
+
466
+				case 'venue_title':
467
+					$SQL .= $glue . 'venue_title ' . $sort;
468
+					break;
469
+
470
+				case 'city':
471
+					$SQL .= $glue . EEM_Venue::instance()->second_table() . '.VNU_city ' . $sort;
472
+					break;
473
+
474
+				case 'state':
475
+					$SQL .= $glue . EEM_State::instance()->table() . '.STA_name ' . $sort;
476
+					break;
477
+			}
478
+			$cntr++;
479
+		}
480
+		// echo '<h4>$SQL : ' . $SQL . '  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span></h4>';
481
+		return $SQL;
482
+	}
483
+
484
+
485
+	/**
486
+	 *    template_redirect
487
+	 *
488
+	 * @access    public
489
+	 * @return    void
490
+	 */
491
+	public function template_redirect()
492
+	{
493
+		// add event list filters
494
+		add_action('loop_start', array($this, 'event_list_template_filters'));
495
+		// and pagination
496
+		add_action('loop_start', array($this, 'event_list_pagination'));
497
+		add_action('loop_end', array($this, 'event_list_pagination'));
498
+		// if NOT a custom template
499
+		if (EE_Registry::instance()
500
+					   ->load_core('Front_Controller', array(), false, true)
501
+					   ->get_selected_template() != 'archive-espresso_events.php'
502
+		) {
503
+			// don't know if theme uses the_excerpt
504
+			add_filter('the_excerpt', array($this, 'event_details'), 100);
505
+			add_filter('the_excerpt', array($this, 'event_tickets'), 110);
506
+			add_filter('the_excerpt', array($this, 'event_datetimes'), 120);
507
+			add_filter('the_excerpt', array($this, 'event_venues'), 130);
508
+			// or the_content
509
+			add_filter('the_content', array($this, 'event_details'), 100);
510
+			add_filter('the_content', array($this, 'event_tickets'), 110);
511
+			add_filter('the_content', array($this, 'event_datetimes'), 120);
512
+			add_filter('the_content', array($this, 'event_venues'), 130);
513
+		} else {
514
+			remove_all_filters('excerpt_length');
515
+			add_filter('excerpt_length', array($this, 'excerpt_length'), 10);
516
+			add_filter('excerpt_more', array($this, 'excerpt_more'), 10);
517
+		}
518
+	}
519
+
520
+
521
+	/**
522
+	 *    event_list_pagination
523
+	 *
524
+	 * @access    public
525
+	 * @return        void
526
+	 */
527
+	public function event_list_pagination()
528
+	{
529
+		echo '<div class="ee-pagination-dv ee-clear-float">' . espresso_event_list_pagination() . '</div>';
530
+	}
531
+
532
+
533
+	/**
534
+	 *    event_details
535
+	 *
536
+	 * @access    public
537
+	 * @param        string $content
538
+	 * @return        void
539
+	 */
540
+	public function event_details($content)
541
+	{
542
+		return EEH_Template::display_template(
543
+			EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-details.php',
544
+			array('the_content' => $content),
545
+			true
546
+		);
547
+	}
548
+
549
+
550
+	/**
551
+	 *    event_tickets
552
+	 *
553
+	 * @access    public
554
+	 * @param        string $content
555
+	 * @return        void
556
+	 */
557
+	public function event_tickets($content)
558
+	{
559
+		return $content
560
+			   . EEH_Template::display_template(
561
+				   EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-tickets.php',
562
+				   array(),
563
+				   true
564
+			   );
565
+	}
566
+
567
+	/**
568
+	 *    event_datetimes
569
+	 *
570
+	 * @access    public
571
+	 * @param        string $content
572
+	 * @return        void
573
+	 */
574
+	public function event_datetimes($content)
575
+	{
576
+		return $content
577
+			   . EEH_Template::display_template(
578
+				   EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-datetimes.php',
579
+				   array(),
580
+				   true
581
+			   );
582
+	}
583
+
584
+	/**
585
+	 *    event_venues
586
+	 *
587
+	 * @access    public
588
+	 * @param        string $content
589
+	 * @return        void
590
+	 */
591
+	public function event_venues($content)
592
+	{
593
+		return $content
594
+			   . EEH_Template::display_template(
595
+				   EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-venues.php',
596
+				   array(),
597
+				   true
598
+			   );
599
+	}
600
+
601
+
602
+	/**
603
+	 *    _initial_setup
604
+	 *
605
+	 * @access    public
606
+	 * @return    void
607
+	 */
608
+	private function _load_assests()
609
+	{
610
+		do_action('AHEE__EED_Events_Archive_Filters__before_load_assests');
611
+		wp_enqueue_style('espresso_default');
612
+		wp_enqueue_style('espresso_custom_css');
613
+		add_filter('FHEE_load_EE_Session', '__return_true');
614
+		add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
615
+		if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
616
+			add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
617
+		}
618
+		// add_filter( 'the_excerpt', array( $this, 'the_excerpt' ), 999 );
619
+	}
620
+
621
+
622
+	/**
623
+	 *    _get_template
624
+	 *
625
+	 * @access    private
626
+	 * @return    string
627
+	 */
628
+	private function _get_template($which = 'part')
629
+	{
630
+		return EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events.php';
631
+	}
632
+
633
+
634
+	/**
635
+	 *    excerpt_length
636
+	 *
637
+	 * @access    public
638
+	 * @return    void
639
+	 */
640
+	public function excerpt_length($length)
641
+	{
642
+
643
+		if (self::$_type == 'grid') {
644
+			return 36;
645
+		}
646
+
647
+		switch (EE_Registry::instance()->CFG->template_settings->EED_Events_Archive_Filters->event_list_grid_size) {
648
+			case 'tiny':
649
+				return 12;
650
+				break;
651
+			case 'small':
652
+				return 24;
653
+				break;
654
+			case 'large':
655
+				return 48;
656
+				break;
657
+			case 'medium':
658
+			default:
659
+				return 36;
660
+		}
661
+	}
662
+
663
+
664
+	/**
665
+	 *    excerpt_more
666
+	 *
667
+	 * @access    public
668
+	 * @return    void
669
+	 */
670
+	public function excerpt_more($more)
671
+	{
672
+		return '&hellip;';
673
+	}
674
+
675
+
676
+
677
+
678
+	/**
679
+	 *    wp_enqueue_scripts
680
+	 *
681
+	 * @access    public
682
+	 * @return    void
683
+	 */
684
+	public function wp_enqueue_scripts()
685
+	{
686
+		// get some style
687
+		if (apply_filters('FHEE_enable_default_espresso_css', false)) {
688
+			// first check uploads folder
689
+			if (is_readable(
690
+				get_stylesheet_directory() . EE_Config::get_current_theme() . '/archive-espresso_events.css'
691
+			)) {
692
+				wp_register_style(
693
+					'archive-espresso_events',
694
+					get_stylesheet_directory_uri() . EE_Config::get_current_theme(
695
+					) . '/archive-espresso_events.css',
696
+					array('dashicons', 'espresso_default')
697
+				);
698
+			} else {
699
+				wp_register_style(
700
+					'archive-espresso_events',
701
+					EE_TEMPLATES_URL . EE_Config::get_current_theme() . '/archive-espresso_events.css',
702
+					array('dashicons', 'espresso_default')
703
+				);
704
+			}
705
+			if (is_readable(
706
+				get_stylesheet_directory() . EE_Config::get_current_theme() . '/archive-espresso_events.js'
707
+			)) {
708
+				wp_register_script(
709
+					'archive-espresso_events',
710
+					get_stylesheet_directory_uri() . EE_Config::get_current_theme() . '/archive-espresso_events.js',
711
+					array('jquery-masonry'),
712
+					'1.0',
713
+					true
714
+				);
715
+			} else {
716
+				wp_register_script(
717
+					'archive-espresso_events',
718
+					EVENTS_ARCHIVE_ASSETS_URL . 'archive-espresso_events.js',
719
+					array('jquery-masonry'),
720
+					'1.0',
721
+					true
722
+				);
723
+			}
724
+			wp_enqueue_style('archive-espresso_events');
725
+			wp_enqueue_script('jquery-masonry');
726
+			wp_enqueue_script('archive-espresso_events');
727
+			add_action('wp_footer', array('EED_Events_Archive_Filters', 'localize_grid_event_lists'), 1);
728
+		}
729
+	}
730
+
731
+
732
+	/**
733
+	 *    template_settings_form
734
+	 *
735
+	 * @access    public
736
+	 * @static
737
+	 * @return    void
738
+	 */
739
+	public static function localize_grid_event_lists()
740
+	{
741
+		wp_localize_script(
742
+			'archive-espresso_events',
743
+			'espresso_grid_event_lists',
744
+			EED_Events_Archive_Filters::$espresso_grid_event_lists
745
+		);
746
+	}
747
+
748
+
749
+	/**
750
+	 *    template_settings_form
751
+	 *
752
+	 * @access    public
753
+	 * @static
754
+	 * @return    void
755
+	 */
756
+	public static function template_settings_form()
757
+	{
758
+		$EE = EE_Registry::instance();
759
+		$EE->CFG->template_settings->EED_Events_Archive_Filters = isset($EE->CFG->template_settings->EED_Events_Archive_Filters)
760
+			? $EE->CFG->template_settings->EED_Events_Archive_Filters : new EE_Events_Archive_Config();
761
+		$EE->CFG->template_settings->EED_Events_Archive_Filters = apply_filters(
762
+			'FHEE__Event_List__template_settings_form__event_list_config',
763
+			$EE->CFG->template_settings->EED_Events_Archive_Filters
764
+		);
765
+		EEH_Template::display_template(
766
+			EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
767
+			$EE->CFG->template_settings->EED_Events_Archive_Filters
768
+		);
769
+	}
770
+
771
+
772
+	/**
773
+	 *    set_default_settings
774
+	 *
775
+	 * @access    public
776
+	 * @static
777
+	 * @return    void
778
+	 */
779
+	public static function set_default_settings($CFG)
780
+	{
781
+		// EEH_Debug_Tools::printr( $CFG, '$CFG  <br /><span style="font-size:10px;font-weight:normal;">' . __FILE__ . '<br />line no: ' . __LINE__ . '</span>', 'auto' );
782
+		$CFG->display_description = isset($CFG->display_description) && ! empty($CFG->display_description)
783
+			? $CFG->display_description : 1;
784
+		$CFG->display_address = isset($CFG->display_address) && ! empty($CFG->display_address) ? $CFG->display_address
785
+			: true;
786
+		$CFG->display_venue_details = isset($CFG->display_venue_details) && ! empty($CFG->display_venue_details)
787
+			? $CFG->display_venue_details : true;
788
+		$CFG->display_expired_events = isset($CFG->display_expired_events) && ! empty($CFG->display_expired_events)
789
+			? $CFG->display_expired_events : false;
790
+		$CFG->default_type = isset($CFG->default_type) && ! empty($CFG->default_type) ? $CFG->default_type : 'grid';
791
+		$CFG->event_list_grid_size = isset($CFG->event_list_grid_size) && ! empty($CFG->event_list_grid_size)
792
+			? $CFG->event_list_grid_size : 'medium';
793
+		$CFG->templates['full'] = isset($CFG->templates['full']) && ! empty($CFG->templates['full'])
794
+			? $CFG->templates['full']
795
+			: EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events.php';
796
+		$CFG->templates['part'] = isset($CFG->templates['part']) && ! empty($CFG->templates['part'])
797
+			? $CFG->templates['part']
798
+			: EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events-grid-view.php';
799
+		return $CFG;
800
+	}
801
+
802
+
803
+	/**
804
+	 *    filter_config
805
+	 *
806
+	 * @access    public
807
+	 * @return    void
808
+	 */
809
+	public function filter_config($CFG)
810
+	{
811
+		return $CFG;
812
+	}
813
+
814
+
815
+	/**
816
+	 *    filter_config
817
+	 *
818
+	 * @access    public
819
+	 * @return    void
820
+	 */
821
+	public static function update_template_settings($CFG, $REQ)
822
+	{
823
+		// $CFG->template_settings->EED_Events_Archive_Filters = new stdClass();
824
+		$CFG->EED_Events_Archive_Filters->display_description = isset($REQ['display_description_in_event_list'])
825
+			? absint($REQ['display_description_in_event_list']) : 1;
826
+		$CFG->EED_Events_Archive_Filters->display_address = isset($REQ['display_address_in_event_list']) ? absint(
827
+			$REQ['display_address_in_event_list']
828
+		) : true;
829
+		$CFG->EED_Events_Archive_Filters->display_venue_details = isset($REQ['display_venue_details_in_event_list'])
830
+			? absint($REQ['display_venue_details_in_event_list']) : true;
831
+		$CFG->EED_Events_Archive_Filters->display_expired_events = isset($REQ['display_expired_events']) ? absint(
832
+			$REQ['display_expired_events']
833
+		) : false;
834
+		$CFG->EED_Events_Archive_Filters->default_type = isset($REQ['default_type']) ? sanitize_text_field(
835
+			$REQ['default_type']
836
+		) : 'grid';
837
+		$CFG->EED_Events_Archive_Filters->event_list_grid_size = isset($REQ['event_list_grid_size'])
838
+			? sanitize_text_field($REQ['event_list_grid_size']) : 'medium';
839
+		$CFG->EED_Events_Archive_Filters->templates = array(
840
+			'full' => EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events.php',
841
+		);
842
+
843
+		switch ($CFG->EED_Events_Archive_Filters->default_type) {
844
+			case 'dates':
845
+				$CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES . EE_Config::get_current_theme()
846
+																	  . '/archive-espresso_events-dates-view.php';
847
+				break;
848
+			case 'text':
849
+				$CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES . EE_Config::get_current_theme()
850
+																	  . '/archive-espresso_events-text-view.php';
851
+				break;
852
+			default:
853
+				$CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES . EE_Config::get_current_theme()
854
+																	  . '/archive-espresso_events-grid-view.php';
855
+		}
856
+
857
+		$CFG->EED_Events_Archive_Filters = isset($REQ['reset_event_list_settings'])
858
+										   && absint($REQ['reset_event_list_settings']) == 1
859
+			? new EE_Events_Archive_Config()
860
+			: $CFG->EED_Events_Archive_Filters;
861
+		return $CFG;
862
+	}
863
+
864
+
865
+	/**
866
+	 *    get_template_part
867
+	 *
868
+	 * @access    public
869
+	 * @return    void
870
+	 */
871
+	public static function get_template_part()
872
+	{
873
+		switch (self::$_type) {
874
+			case 'dates':
875
+				return 'archive-espresso_events-dates-view.php';
876
+				break;
877
+			case 'text':
878
+				return 'archive-espresso_events-text-view.php';
879
+				break;
880
+			default:
881
+				return 'archive-espresso_events-grid-view.php';
882
+		}
883
+	}
884
+
885
+
886
+	/**
887
+	 *    event_list_template_filters
888
+	 *
889
+	 * @access    public
890
+	 * @return    void
891
+	 */
892
+	public function event_list_template_filters()
893
+	{
894
+		$args = array(
895
+			'form_url'         => get_post_type_archive_link('espresso_events'),
896
+			// add_query_arg( array( 'post_type' => 'espresso_events' ), home_url() ),
897
+			'elf_month'        => EED_Events_Archive_Filters::_display_month(),
898
+			'elf_category'     => EED_Events_Archive_Filters::_event_category_slug(),
899
+			'elf_show_expired' => EED_Events_Archive_Filters::_show_expired(),
900
+			'elf_type'         => self::$_type,
901
+		);
902
+		EEH_Template::display_template(
903
+			EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events-filters.php',
904
+			$args
905
+		);
906
+	}
907
+
908
+
909
+	/**
910
+	 *    event_list_css
911
+	 *
912
+	 * @access    public
913
+	 * @return    void
914
+	 */
915
+	public static function event_list_css($extra_class = '')
916
+	{
917
+		$EE = EE_Registry::instance();
918
+		$event_list_css = ! empty($extra_class) ? array($extra_class) : array();
919
+		$event_list_css[] = 'espresso-event-list-event';
920
+		if (self::$_type == 'grid') {
921
+			$event_list_grid_size = isset($EE->CFG->template_settings->EED_Events_Archive_Filters->event_list_grid_size)
922
+				? $EE->CFG->template_settings->EED_Events_Archive_Filters->event_list_grid_size : 'medium';
923
+			$event_list_css[] = $event_list_grid_size . '-event-list-grid';
924
+		}
925
+		$event_list_css = apply_filters(
926
+			'EED_Events_Archive_Filters__event_list_css__event_list_css_array',
927
+			$event_list_css
928
+		);
929
+		return implode(' ', $event_list_css);
930
+	}
931
+
932
+
933
+	/**
934
+	 *    event_categories
935
+	 *
936
+	 * @access    public
937
+	 * @return    void
938
+	 */
939
+	public static function event_categories()
940
+	{
941
+		return EE_Registry::instance()->load_model('Term')->get_all_ee_categories();
942
+	}
943
+
944
+
945
+	/**
946
+	 *    display_description
947
+	 *
948
+	 * @access    public
949
+	 * @return    void
950
+	 */
951
+	public static function display_description($value)
952
+	{
953
+		$EE = EE_Registry::instance();
954
+		$display_description = isset($EE->CFG->template_settings->EED_Events_Archive_Filters->display_description)
955
+			? $EE->CFG->template_settings->EED_Events_Archive_Filters->display_description : 1;
956
+		return $display_description === $value ? true : false;
957
+	}
958
+
959
+
960
+	/**
961
+	 *    display_venue_details
962
+	 *
963
+	 * @access    public
964
+	 * @return    void
965
+	 */
966
+	public static function display_venue_details()
967
+	{
968
+		$EE = EE_Registry::instance();
969
+		$display_venue_details = isset($EE->CFG->template_settings->EED_Events_Archive_Filters->display_venue_details)
970
+			? $EE->CFG->template_settings->EED_Events_Archive_Filters->display_venue_details : true;
971
+		$venue_name = EEH_Venue_View::venue_name();
972
+		return $display_venue_details && ! empty($venue_name) ? true : false;
973
+	}
974
+
975
+
976
+	/**
977
+	 *    display_address
978
+	 *
979
+	 * @access    public
980
+	 * @return    void
981
+	 */
982
+	public static function display_address()
983
+	{
984
+		$EE = EE_Registry::instance();
985
+		$display_address = isset($EE->CFG->template_settings->EED_Events_Archive_Filters->display_address)
986
+			? $EE->CFG->template_settings->EED_Events_Archive_Filters->display_address : false;
987
+		$venue_name = EEH_Venue_View::venue_name();
988
+		return $display_address && ! empty($venue_name) ? true : false;
989
+	}
990
+
991
+
992
+	/**
993
+	 *    pagination
994
+	 *
995
+	 * @access    public
996
+	 * @return    void
997
+	 */
998
+	public static function pagination()
999
+	{
1000
+		global $wp_query;
1001
+		$big = 999999999; // need an unlikely integer
1002
+		$pagination = paginate_links(
1003
+			array(
1004
+				'base'         => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
1005
+				'format'       => '?paged=%#%',
1006
+				'current'      => max(1, get_query_var('paged')),
1007
+				'total'        => $wp_query->max_num_pages,
1008
+				'show_all'     => true,
1009
+				'end_size'     => 10,
1010
+				'mid_size'     => 6,
1011
+				'prev_next'    => true,
1012
+				'prev_text'    => __('&lsaquo; PREV', 'event_espresso'),
1013
+				'next_text'    => __('NEXT &rsaquo;', 'event_espresso'),
1014
+				'type'         => 'plain',
1015
+				'add_args'     => false,
1016
+				'add_fragment' => '',
1017
+			)
1018
+		);
1019
+		return ! empty($pagination) ? '<div class="ee-pagination-dv clear">' . $pagination . '</div>' : '';
1020
+	}
1021
+
1022
+
1023
+	/**
1024
+	 *    event_list_title
1025
+	 *
1026
+	 * @access    public
1027
+	 * @return    void
1028
+	 */
1029
+	public static function event_list_title()
1030
+	{
1031
+		return apply_filters(
1032
+			'EED_Events_Archive_Filters__event_list_title__event_list_title',
1033
+			__('Upcoming Events', 'event_espresso')
1034
+		);
1035
+	}
1036 1036
 }
Please login to merge, or discard this patch.
Spacing   +58 added lines, -58 removed lines patch added patch discarded remove patch
@@ -157,7 +157,7 @@  discard block
 block discarded – undo
157 157
         ) : '';
158 158
         $view = ! empty($elf_type) ? $elf_type : $view;
159 159
         $view = apply_filters('EED_Events_Archive_Filters__set_type__type', $view);
160
-        if (! empty($view) && in_array($view, EED_Events_Archive_Filters::$_types)) {
160
+        if ( ! empty($view) && in_array($view, EED_Events_Archive_Filters::$_types)) {
161 161
             self::$_type = $view;
162 162
         }
163 163
     }
@@ -252,7 +252,7 @@  discard block
 block discarded – undo
252 252
     public static function posts_join_sql_for_terms($join_terms = null)
253 253
     {
254 254
         $SQL = '';
255
-        if (! empty($join_terms)) {
255
+        if ( ! empty($join_terms)) {
256 256
             global $wpdb;
257 257
             $SQL .= " LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)";
258 258
             $SQL .= " LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";
@@ -279,29 +279,29 @@  discard block
 block discarded – undo
279 279
             switch ($orderby) {
280 280
                 case 'ticket_start':
281 281
                 case 'ticket_end':
282
-                    $SQL .= ' LEFT JOIN ' . EEM_Datetime_Ticket::instance()->table() . ' ON ('
283
-                            . EEM_Datetime::instance()->table() . '.DTT_ID = '
284
-                            . EEM_Datetime_Ticket::instance()->table() . '.DTT_ID )';
285
-                    $SQL .= ' LEFT JOIN ' . EEM_Ticket::instance()->table() . ' ON ('
286
-                            . EEM_Datetime_Ticket::instance()->table() . '.TKT_ID = '
287
-                            . EEM_Ticket::instance()->table() . '.TKT_ID )';
282
+                    $SQL .= ' LEFT JOIN '.EEM_Datetime_Ticket::instance()->table().' ON ('
283
+                            . EEM_Datetime::instance()->table().'.DTT_ID = '
284
+                            . EEM_Datetime_Ticket::instance()->table().'.DTT_ID )';
285
+                    $SQL .= ' LEFT JOIN '.EEM_Ticket::instance()->table().' ON ('
286
+                            . EEM_Datetime_Ticket::instance()->table().'.TKT_ID = '
287
+                            . EEM_Ticket::instance()->table().'.TKT_ID )';
288 288
                     break;
289 289
 
290 290
                 case 'venue_title':
291 291
                 case 'city':
292
-                    $SQL .= ' LEFT JOIN ' . EEM_Event_Venue::instance()->table() . ' ON (' . $wpdb->posts . '.ID = '
293
-                            . EEM_Event_Venue::instance()->table() . '.EVT_ID )';
294
-                    $SQL .= ' LEFT JOIN ' . EEM_Venue::instance()->table() . ' ON ('
295
-                            . EEM_Event_Venue::instance()->table() . '.VNU_ID = '
296
-                            . EEM_Venue::instance()->table() . '.VNU_ID )';
292
+                    $SQL .= ' LEFT JOIN '.EEM_Event_Venue::instance()->table().' ON ('.$wpdb->posts.'.ID = '
293
+                            . EEM_Event_Venue::instance()->table().'.EVT_ID )';
294
+                    $SQL .= ' LEFT JOIN '.EEM_Venue::instance()->table().' ON ('
295
+                            . EEM_Event_Venue::instance()->table().'.VNU_ID = '
296
+                            . EEM_Venue::instance()->table().'.VNU_ID )';
297 297
                     break;
298 298
 
299 299
                 case 'state':
300
-                    $SQL .= ' LEFT JOIN ' . EEM_Event_Venue::instance()->table() . ' ON (' . $wpdb->posts . '.ID = '
301
-                            . EEM_Event_Venue::instance()->table() . '.EVT_ID )';
302
-                    $SQL .= ' LEFT JOIN ' . EEM_Event_Venue::instance()->second_table() . ' ON ('
303
-                            . EEM_Event_Venue::instance()->table() . '.VNU_ID = '
304
-                            . EEM_Event_Venue::instance()->second_table() . '.VNU_ID )';
300
+                    $SQL .= ' LEFT JOIN '.EEM_Event_Venue::instance()->table().' ON ('.$wpdb->posts.'.ID = '
301
+                            . EEM_Event_Venue::instance()->table().'.EVT_ID )';
302
+                    $SQL .= ' LEFT JOIN '.EEM_Event_Venue::instance()->second_table().' ON ('
303
+                            . EEM_Event_Venue::instance()->table().'.VNU_ID = '
304
+                            . EEM_Event_Venue::instance()->second_table().'.VNU_ID )';
305 305
                     break;
306 306
             }
307 307
         }
@@ -347,7 +347,7 @@  discard block
 block discarded – undo
347 347
     public static function posts_where_sql_for_show_expired($show_expired = false)
348 348
     {
349 349
         return ! $show_expired
350
-            ? ' AND ' . EEM_Datetime::instance()->table() . '.DTT_EVT_end > "' . date('Y-m-d H:s:i') . '" '
350
+            ? ' AND '.EEM_Datetime::instance()->table().'.DTT_EVT_end > "'.date('Y-m-d H:s:i').'" '
351 351
             : '';
352 352
     }
353 353
 
@@ -362,7 +362,7 @@  discard block
 block discarded – undo
362 362
     public static function posts_where_sql_for_event_category_slug($event_category_slug = null)
363 363
     {
364 364
         global $wpdb;
365
-        return ! empty($event_category_slug) ? ' AND ' . $wpdb->terms . '.slug = "' . $event_category_slug . '" ' : '';
365
+        return ! empty($event_category_slug) ? ' AND '.$wpdb->terms.'.slug = "'.$event_category_slug.'" ' : '';
366 366
     }
367 367
 
368 368
     /**
@@ -375,13 +375,13 @@  discard block
 block discarded – undo
375 375
     public static function posts_where_sql_for_event_list_month($month = null)
376 376
     {
377 377
         $SQL = '';
378
-        if (! empty($month)) {
378
+        if ( ! empty($month)) {
379 379
             // event start date is LESS than the end of the month ( so nothing that doesn't start until next month )
380
-            $SQL = ' AND ' . EEM_Datetime::instance()->table() . '.DTT_EVT_start';
381
-            $SQL .= ' <= "' . date('Y-m-t 23:59:59', \EEH_DTT_Helper::first_of_month_timestamp($month)) . '"';
380
+            $SQL = ' AND '.EEM_Datetime::instance()->table().'.DTT_EVT_start';
381
+            $SQL .= ' <= "'.date('Y-m-t 23:59:59', \EEH_DTT_Helper::first_of_month_timestamp($month)).'"';
382 382
             // event end date is GREATER than the start of the month ( so nothing that ended before this month )
383
-            $SQL .= ' AND ' . EEM_Datetime::instance()->table() . '.DTT_EVT_end';
384
-            $SQL .= ' >= "' . date('Y-m-d 0:0:00', \EEH_DTT_Helper::first_of_month_timestamp($month)) . '" ';
383
+            $SQL .= ' AND '.EEM_Datetime::instance()->table().'.DTT_EVT_end';
384
+            $SQL .= ' >= "'.date('Y-m-d 0:0:00', \EEH_DTT_Helper::first_of_month_timestamp($month)).'" ';
385 385
         }
386 386
         return $SQL;
387 387
     }
@@ -436,43 +436,43 @@  discard block
 block discarded – undo
436 436
             switch ($orderby) {
437 437
                 case 'id':
438 438
                 case 'ID':
439
-                    $SQL .= $glue . $wpdb->posts . '.ID ' . $sort;
439
+                    $SQL .= $glue.$wpdb->posts.'.ID '.$sort;
440 440
                     break;
441 441
 
442 442
                 case 'start_date':
443
-                    $SQL .= $glue . EEM_Datetime::instance()->table() . '.DTT_EVT_start ' . $sort;
443
+                    $SQL .= $glue.EEM_Datetime::instance()->table().'.DTT_EVT_start '.$sort;
444 444
                     break;
445 445
 
446 446
                 case 'end_date':
447
-                    $SQL .= $glue . EEM_Datetime::instance()->table() . '.DTT_EVT_end ' . $sort;
447
+                    $SQL .= $glue.EEM_Datetime::instance()->table().'.DTT_EVT_end '.$sort;
448 448
                     break;
449 449
 
450 450
                 case 'event_name':
451
-                    $SQL .= $glue . $wpdb->posts . '.post_title ' . $sort;
451
+                    $SQL .= $glue.$wpdb->posts.'.post_title '.$sort;
452 452
                     break;
453 453
 
454 454
                 case 'category_slug':
455
-                    $SQL .= $glue . $wpdb->terms . '.slug ' . $sort;
455
+                    $SQL .= $glue.$wpdb->terms.'.slug '.$sort;
456 456
                     break;
457 457
 
458 458
                 case 'ticket_start':
459
-                    $SQL .= $glue . EEM_Ticket::instance()->table() . '.TKT_start_date ' . $sort;
459
+                    $SQL .= $glue.EEM_Ticket::instance()->table().'.TKT_start_date '.$sort;
460 460
                     break;
461 461
 
462 462
                 case 'ticket_end':
463
-                    $SQL .= $glue . EEM_Ticket::instance()->table() . '.TKT_end_date ' . $sort;
463
+                    $SQL .= $glue.EEM_Ticket::instance()->table().'.TKT_end_date '.$sort;
464 464
                     break;
465 465
 
466 466
                 case 'venue_title':
467
-                    $SQL .= $glue . 'venue_title ' . $sort;
467
+                    $SQL .= $glue.'venue_title '.$sort;
468 468
                     break;
469 469
 
470 470
                 case 'city':
471
-                    $SQL .= $glue . EEM_Venue::instance()->second_table() . '.VNU_city ' . $sort;
471
+                    $SQL .= $glue.EEM_Venue::instance()->second_table().'.VNU_city '.$sort;
472 472
                     break;
473 473
 
474 474
                 case 'state':
475
-                    $SQL .= $glue . EEM_State::instance()->table() . '.STA_name ' . $sort;
475
+                    $SQL .= $glue.EEM_State::instance()->table().'.STA_name '.$sort;
476 476
                     break;
477 477
             }
478 478
             $cntr++;
@@ -526,7 +526,7 @@  discard block
 block discarded – undo
526 526
      */
527 527
     public function event_list_pagination()
528 528
     {
529
-        echo '<div class="ee-pagination-dv ee-clear-float">' . espresso_event_list_pagination() . '</div>';
529
+        echo '<div class="ee-pagination-dv ee-clear-float">'.espresso_event_list_pagination().'</div>';
530 530
     }
531 531
 
532 532
 
@@ -540,7 +540,7 @@  discard block
 block discarded – undo
540 540
     public function event_details($content)
541 541
     {
542 542
         return EEH_Template::display_template(
543
-            EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-details.php',
543
+            EE_TEMPLATES.EE_Config::get_current_theme().'/content-espresso_events-details.php',
544 544
             array('the_content' => $content),
545 545
             true
546 546
         );
@@ -558,7 +558,7 @@  discard block
 block discarded – undo
558 558
     {
559 559
         return $content
560 560
                . EEH_Template::display_template(
561
-                   EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-tickets.php',
561
+                   EE_TEMPLATES.EE_Config::get_current_theme().'/content-espresso_events-tickets.php',
562 562
                    array(),
563 563
                    true
564 564
                );
@@ -575,7 +575,7 @@  discard block
 block discarded – undo
575 575
     {
576 576
         return $content
577 577
                . EEH_Template::display_template(
578
-                   EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-datetimes.php',
578
+                   EE_TEMPLATES.EE_Config::get_current_theme().'/content-espresso_events-datetimes.php',
579 579
                    array(),
580 580
                    true
581 581
                );
@@ -592,7 +592,7 @@  discard block
 block discarded – undo
592 592
     {
593 593
         return $content
594 594
                . EEH_Template::display_template(
595
-                   EE_TEMPLATES . EE_Config::get_current_theme() . '/content-espresso_events-venues.php',
595
+                   EE_TEMPLATES.EE_Config::get_current_theme().'/content-espresso_events-venues.php',
596 596
                    array(),
597 597
                    true
598 598
                );
@@ -627,7 +627,7 @@  discard block
 block discarded – undo
627 627
      */
628 628
     private function _get_template($which = 'part')
629 629
     {
630
-        return EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events.php';
630
+        return EE_TEMPLATES.EE_Config::get_current_theme().'/archive-espresso_events.php';
631 631
     }
632 632
 
633 633
 
@@ -687,27 +687,27 @@  discard block
 block discarded – undo
687 687
         if (apply_filters('FHEE_enable_default_espresso_css', false)) {
688 688
             // first check uploads folder
689 689
             if (is_readable(
690
-                get_stylesheet_directory() . EE_Config::get_current_theme() . '/archive-espresso_events.css'
690
+                get_stylesheet_directory().EE_Config::get_current_theme().'/archive-espresso_events.css'
691 691
             )) {
692 692
                 wp_register_style(
693 693
                     'archive-espresso_events',
694
-                    get_stylesheet_directory_uri() . EE_Config::get_current_theme(
695
-                    ) . '/archive-espresso_events.css',
694
+                    get_stylesheet_directory_uri().EE_Config::get_current_theme(
695
+                    ).'/archive-espresso_events.css',
696 696
                     array('dashicons', 'espresso_default')
697 697
                 );
698 698
             } else {
699 699
                 wp_register_style(
700 700
                     'archive-espresso_events',
701
-                    EE_TEMPLATES_URL . EE_Config::get_current_theme() . '/archive-espresso_events.css',
701
+                    EE_TEMPLATES_URL.EE_Config::get_current_theme().'/archive-espresso_events.css',
702 702
                     array('dashicons', 'espresso_default')
703 703
                 );
704 704
             }
705 705
             if (is_readable(
706
-                get_stylesheet_directory() . EE_Config::get_current_theme() . '/archive-espresso_events.js'
706
+                get_stylesheet_directory().EE_Config::get_current_theme().'/archive-espresso_events.js'
707 707
             )) {
708 708
                 wp_register_script(
709 709
                     'archive-espresso_events',
710
-                    get_stylesheet_directory_uri() . EE_Config::get_current_theme() . '/archive-espresso_events.js',
710
+                    get_stylesheet_directory_uri().EE_Config::get_current_theme().'/archive-espresso_events.js',
711 711
                     array('jquery-masonry'),
712 712
                     '1.0',
713 713
                     true
@@ -715,7 +715,7 @@  discard block
 block discarded – undo
715 715
             } else {
716 716
                 wp_register_script(
717 717
                     'archive-espresso_events',
718
-                    EVENTS_ARCHIVE_ASSETS_URL . 'archive-espresso_events.js',
718
+                    EVENTS_ARCHIVE_ASSETS_URL.'archive-espresso_events.js',
719 719
                     array('jquery-masonry'),
720 720
                     '1.0',
721 721
                     true
@@ -763,7 +763,7 @@  discard block
 block discarded – undo
763 763
             $EE->CFG->template_settings->EED_Events_Archive_Filters
764 764
         );
765 765
         EEH_Template::display_template(
766
-            EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
766
+            EVENTS_ARCHIVE_TEMPLATES_PATH.'admin-event-list-settings.template.php',
767 767
             $EE->CFG->template_settings->EED_Events_Archive_Filters
768 768
         );
769 769
     }
@@ -792,10 +792,10 @@  discard block
 block discarded – undo
792 792
             ? $CFG->event_list_grid_size : 'medium';
793 793
         $CFG->templates['full'] = isset($CFG->templates['full']) && ! empty($CFG->templates['full'])
794 794
             ? $CFG->templates['full']
795
-            : EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events.php';
795
+            : EE_TEMPLATES.EE_Config::get_current_theme().'/archive-espresso_events.php';
796 796
         $CFG->templates['part'] = isset($CFG->templates['part']) && ! empty($CFG->templates['part'])
797 797
             ? $CFG->templates['part']
798
-            : EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events-grid-view.php';
798
+            : EE_TEMPLATES.EE_Config::get_current_theme().'/archive-espresso_events-grid-view.php';
799 799
         return $CFG;
800 800
     }
801 801
 
@@ -837,20 +837,20 @@  discard block
 block discarded – undo
837 837
         $CFG->EED_Events_Archive_Filters->event_list_grid_size = isset($REQ['event_list_grid_size'])
838 838
             ? sanitize_text_field($REQ['event_list_grid_size']) : 'medium';
839 839
         $CFG->EED_Events_Archive_Filters->templates = array(
840
-            'full' => EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events.php',
840
+            'full' => EE_TEMPLATES.EE_Config::get_current_theme().'/archive-espresso_events.php',
841 841
         );
842 842
 
843 843
         switch ($CFG->EED_Events_Archive_Filters->default_type) {
844 844
             case 'dates':
845
-                $CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES . EE_Config::get_current_theme()
845
+                $CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES.EE_Config::get_current_theme()
846 846
                                                                       . '/archive-espresso_events-dates-view.php';
847 847
                 break;
848 848
             case 'text':
849
-                $CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES . EE_Config::get_current_theme()
849
+                $CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES.EE_Config::get_current_theme()
850 850
                                                                       . '/archive-espresso_events-text-view.php';
851 851
                 break;
852 852
             default:
853
-                $CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES . EE_Config::get_current_theme()
853
+                $CFG->EED_Events_Archive_Filters->templates['part'] = EE_TEMPLATES.EE_Config::get_current_theme()
854 854
                                                                       . '/archive-espresso_events-grid-view.php';
855 855
         }
856 856
 
@@ -900,7 +900,7 @@  discard block
 block discarded – undo
900 900
             'elf_type'         => self::$_type,
901 901
         );
902 902
         EEH_Template::display_template(
903
-            EE_TEMPLATES . EE_Config::get_current_theme() . '/archive-espresso_events-filters.php',
903
+            EE_TEMPLATES.EE_Config::get_current_theme().'/archive-espresso_events-filters.php',
904 904
             $args
905 905
         );
906 906
     }
@@ -920,7 +920,7 @@  discard block
 block discarded – undo
920 920
         if (self::$_type == 'grid') {
921 921
             $event_list_grid_size = isset($EE->CFG->template_settings->EED_Events_Archive_Filters->event_list_grid_size)
922 922
                 ? $EE->CFG->template_settings->EED_Events_Archive_Filters->event_list_grid_size : 'medium';
923
-            $event_list_css[] = $event_list_grid_size . '-event-list-grid';
923
+            $event_list_css[] = $event_list_grid_size.'-event-list-grid';
924 924
         }
925 925
         $event_list_css = apply_filters(
926 926
             'EED_Events_Archive_Filters__event_list_css__event_list_css_array',
@@ -1016,7 +1016,7 @@  discard block
 block discarded – undo
1016 1016
                 'add_fragment' => '',
1017 1017
             )
1018 1018
         );
1019
-        return ! empty($pagination) ? '<div class="ee-pagination-dv clear">' . $pagination . '</div>' : '';
1019
+        return ! empty($pagination) ? '<div class="ee-pagination-dv clear">'.$pagination.'</div>' : '';
1020 1020
     }
1021 1021
 
1022 1022
 
Please login to merge, or discard this patch.
modules/bot_trap/EED_Bot_Trap.module.php 2 patches
Indentation   +275 added lines, -275 removed lines patch added patch discarded remove patch
@@ -16,304 +16,304 @@
 block discarded – undo
16 16
 class EED_Bot_Trap extends EED_Module
17 17
 {
18 18
 
19
-    /**
20
-     * @return EED_Bot_Trap|EED_Module
21
-     */
22
-    public static function instance()
23
-    {
24
-        return parent::get_instance(__CLASS__);
25
-    }
19
+	/**
20
+	 * @return EED_Bot_Trap|EED_Module
21
+	 */
22
+	public static function instance()
23
+	{
24
+		return parent::get_instance(__CLASS__);
25
+	}
26 26
 
27 27
 
28
-    /**
29
-     * set_hooks - for hooking into EE Core, other modules, etc
30
-     *
31
-     * @return void
32
-     */
33
-    public static function set_hooks()
34
-    {
35
-        if (apply_filters('FHEE__EED_Bot_Trap__set_hooks__use_bot_trap', true) &&
36
-            EE_Registry::instance()->CFG->registration->use_bot_trap
37
-        ) {
38
-            EED_Bot_Trap::set_trap();
39
-            // redirect bots to bogus success page
40
-            EE_Config::register_route(
41
-                'ticket_selection_received',
42
-                'EED_Bot_Trap',
43
-                'display_bot_trap_success'
44
-            );
45
-        }
46
-    }
28
+	/**
29
+	 * set_hooks - for hooking into EE Core, other modules, etc
30
+	 *
31
+	 * @return void
32
+	 */
33
+	public static function set_hooks()
34
+	{
35
+		if (apply_filters('FHEE__EED_Bot_Trap__set_hooks__use_bot_trap', true) &&
36
+			EE_Registry::instance()->CFG->registration->use_bot_trap
37
+		) {
38
+			EED_Bot_Trap::set_trap();
39
+			// redirect bots to bogus success page
40
+			EE_Config::register_route(
41
+				'ticket_selection_received',
42
+				'EED_Bot_Trap',
43
+				'display_bot_trap_success'
44
+			);
45
+		}
46
+	}
47 47
 
48 48
 
49
-    /**
50
-     * set_hooks_admin - for hooking into EE Admin Core, other modules, etc
51
-     *
52
-     * @return void
53
-     */
54
-    public static function set_trap()
55
-    {
56
-        define('EE_BOT_TRAP_BASE_URL', plugin_dir_url(__FILE__) . '/');
57
-        add_action(
58
-            'AHEE__ticket_selector_chart__template__after_ticket_selector',
59
-            array('EED_Bot_Trap', 'generate_bot_trap'),
60
-            10,
61
-            2
62
-        );
63
-        add_action(
64
-            'EED_Ticket_Selector__process_ticket_selections__before',
65
-            array('EED_Bot_Trap', 'process_bot_trap'),
66
-            1,
67
-            2
68
-        );
69
-    }
49
+	/**
50
+	 * set_hooks_admin - for hooking into EE Admin Core, other modules, etc
51
+	 *
52
+	 * @return void
53
+	 */
54
+	public static function set_trap()
55
+	{
56
+		define('EE_BOT_TRAP_BASE_URL', plugin_dir_url(__FILE__) . '/');
57
+		add_action(
58
+			'AHEE__ticket_selector_chart__template__after_ticket_selector',
59
+			array('EED_Bot_Trap', 'generate_bot_trap'),
60
+			10,
61
+			2
62
+		);
63
+		add_action(
64
+			'EED_Ticket_Selector__process_ticket_selections__before',
65
+			array('EED_Bot_Trap', 'process_bot_trap'),
66
+			1,
67
+			2
68
+		);
69
+	}
70 70
 
71 71
 
72
-    /**
73
-     * set_hooks_admin - for hooking into EE Admin Core, other modules, etc
74
-     *
75
-     * @return void
76
-     */
77
-    public static function set_hooks_admin()
78
-    {
79
-        if (defined('DOING_AJAX')
80
-            && DOING_AJAX
81
-            && apply_filters('FHEE__EED_Bot_Trap__set_hooks__use_bot_trap', true)
82
-            && EE_Registry::instance()->CFG->registration->use_bot_trap
83
-        ) {
84
-            EED_Bot_Trap::set_trap();
85
-        }
86
-        add_action(
87
-            'AHEE__Extend_Registration_Form_Admin_Page___reg_form_settings_template',
88
-            array('EED_Bot_Trap', 'bot_trap_settings_form'),
89
-            5
90
-        );
91
-        add_filter(
92
-            'FHEE__Extend_Registration_Form_Admin_Page___update_reg_form_settings__CFG_registration',
93
-            array('EED_Bot_Trap', 'update_bot_trap_settings_form'),
94
-            10,
95
-            1
96
-        );
97
-    }
72
+	/**
73
+	 * set_hooks_admin - for hooking into EE Admin Core, other modules, etc
74
+	 *
75
+	 * @return void
76
+	 */
77
+	public static function set_hooks_admin()
78
+	{
79
+		if (defined('DOING_AJAX')
80
+			&& DOING_AJAX
81
+			&& apply_filters('FHEE__EED_Bot_Trap__set_hooks__use_bot_trap', true)
82
+			&& EE_Registry::instance()->CFG->registration->use_bot_trap
83
+		) {
84
+			EED_Bot_Trap::set_trap();
85
+		}
86
+		add_action(
87
+			'AHEE__Extend_Registration_Form_Admin_Page___reg_form_settings_template',
88
+			array('EED_Bot_Trap', 'bot_trap_settings_form'),
89
+			5
90
+		);
91
+		add_filter(
92
+			'FHEE__Extend_Registration_Form_Admin_Page___update_reg_form_settings__CFG_registration',
93
+			array('EED_Bot_Trap', 'update_bot_trap_settings_form'),
94
+			10,
95
+			1
96
+		);
97
+	}
98 98
 
99 99
 
100
-    /**
101
-     * run - initial module setup
102
-     *
103
-     * @param WP $WP
104
-     * @return void
105
-     */
106
-    public function run($WP)
107
-    {
108
-    }
100
+	/**
101
+	 * run - initial module setup
102
+	 *
103
+	 * @param WP $WP
104
+	 * @return void
105
+	 */
106
+	public function run($WP)
107
+	{
108
+	}
109 109
 
110 110
 
111
-    /**
112
-     * generate_bot_trap
113
-     *
114
-     * @return void
115
-     * @throws RuntimeException
116
-     */
117
-    public static function generate_bot_trap()
118
-    {
119
-        $do_not_enter = esc_html__('please do not enter anything in this input', 'event_espresso');
120
-        $time = microtime(true);
121
-        $html = '<div class="tkt-slctr-request-processor-dv" style="float:left; margin:0 0 0 -999em; height: 0;">';
122
-        $html .= '<label for="tkt-slctr-request-processor-email-' . $time . '">' . $do_not_enter . '</label>';
123
-        $html .= '<input type="email" id="tkt-slctr-request-processor-email-';
124
-        $html .= $time . '" name="tkt-slctr-request-processor-email" value=""/>';
125
-        $html .= '</div><!-- .tkt-slctr-request-processor-dv -->';
126
-        echo $html;
127
-    }
111
+	/**
112
+	 * generate_bot_trap
113
+	 *
114
+	 * @return void
115
+	 * @throws RuntimeException
116
+	 */
117
+	public static function generate_bot_trap()
118
+	{
119
+		$do_not_enter = esc_html__('please do not enter anything in this input', 'event_espresso');
120
+		$time = microtime(true);
121
+		$html = '<div class="tkt-slctr-request-processor-dv" style="float:left; margin:0 0 0 -999em; height: 0;">';
122
+		$html .= '<label for="tkt-slctr-request-processor-email-' . $time . '">' . $do_not_enter . '</label>';
123
+		$html .= '<input type="email" id="tkt-slctr-request-processor-email-';
124
+		$html .= $time . '" name="tkt-slctr-request-processor-email" value=""/>';
125
+		$html .= '</div><!-- .tkt-slctr-request-processor-dv -->';
126
+		echo $html;
127
+	}
128 128
 
129 129
 
130
-    /**
131
-     * process_bot_trap
132
-     *
133
-     * @param array|string $triggered_trap_callback Callback that will be executed for handling the
134
-     *                                              response if the bot trap is triggered.
135
-     *                                              It should receive one argument: a boolean indicating
136
-     *                                              whether the trap was triggered by suspicious timing or not.
137
-     * @throws RuntimeException
138
-     */
139
-    public static function process_bot_trap($triggered_trap_callback = array())
140
-    {
141
-        // what's your email address Mr. Bot ?
142
-        $empty_trap = isset($_REQUEST['tkt-slctr-request-processor-email'])
143
-                      && $_REQUEST['tkt-slctr-request-processor-email'] === '';
144
-        // are we human ?
145
-        if ($empty_trap) {
146
-            do_action('AHEE__EED_Bot_Trap__process_bot_trap__trap_not_triggered');
147
-            return;
148
-        }
149
-        // check the given callback is valid first before executing
150
-        if (! is_callable($triggered_trap_callback)) {
151
-            // invalid callback so lets just sub in our default.
152
-            $triggered_trap_callback = array('EED_Bot_Trap', 'triggered_trap_response');
153
-        }
154
-        call_user_func($triggered_trap_callback);
155
-    }
130
+	/**
131
+	 * process_bot_trap
132
+	 *
133
+	 * @param array|string $triggered_trap_callback Callback that will be executed for handling the
134
+	 *                                              response if the bot trap is triggered.
135
+	 *                                              It should receive one argument: a boolean indicating
136
+	 *                                              whether the trap was triggered by suspicious timing or not.
137
+	 * @throws RuntimeException
138
+	 */
139
+	public static function process_bot_trap($triggered_trap_callback = array())
140
+	{
141
+		// what's your email address Mr. Bot ?
142
+		$empty_trap = isset($_REQUEST['tkt-slctr-request-processor-email'])
143
+					  && $_REQUEST['tkt-slctr-request-processor-email'] === '';
144
+		// are we human ?
145
+		if ($empty_trap) {
146
+			do_action('AHEE__EED_Bot_Trap__process_bot_trap__trap_not_triggered');
147
+			return;
148
+		}
149
+		// check the given callback is valid first before executing
150
+		if (! is_callable($triggered_trap_callback)) {
151
+			// invalid callback so lets just sub in our default.
152
+			$triggered_trap_callback = array('EED_Bot_Trap', 'triggered_trap_response');
153
+		}
154
+		call_user_func($triggered_trap_callback);
155
+	}
156 156
 
157 157
 
158
-    /**
159
-     * This is the default callback executed by EED_Bot_Trap::process_bot_trap that handles the response.
160
-     *
161
-     * @throws InvalidArgumentException
162
-     * @throws InvalidDataTypeException
163
-     * @throws InvalidInterfaceException
164
-     */
165
-    public static function triggered_trap_response()
166
-    {
167
-        // UH OH...
168
-        $redirect_url = apply_filters(
169
-            'FHEE__EED_Bot_Trap__process_bot_trap__redirect_url',
170
-            add_query_arg(
171
-                array('ee' => 'ticket_selection_received'),
172
-                EE_Registry::instance()->CFG->core->reg_page_url()
173
-            )
174
-        );
175
-        // if AJAX, return the redirect URL
176
-        if (defined('DOING_AJAX') && DOING_AJAX) {
177
-            echo wp_json_encode(
178
-                array_merge(
179
-                    EE_Error::get_notices(false),
180
-                    array(
181
-                        'redirect_url' => $redirect_url,
182
-                    )
183
-                )
184
-            );
185
-            exit();
186
-        }
187
-        wp_safe_redirect($redirect_url);
188
-        exit();
189
-    }
158
+	/**
159
+	 * This is the default callback executed by EED_Bot_Trap::process_bot_trap that handles the response.
160
+	 *
161
+	 * @throws InvalidArgumentException
162
+	 * @throws InvalidDataTypeException
163
+	 * @throws InvalidInterfaceException
164
+	 */
165
+	public static function triggered_trap_response()
166
+	{
167
+		// UH OH...
168
+		$redirect_url = apply_filters(
169
+			'FHEE__EED_Bot_Trap__process_bot_trap__redirect_url',
170
+			add_query_arg(
171
+				array('ee' => 'ticket_selection_received'),
172
+				EE_Registry::instance()->CFG->core->reg_page_url()
173
+			)
174
+		);
175
+		// if AJAX, return the redirect URL
176
+		if (defined('DOING_AJAX') && DOING_AJAX) {
177
+			echo wp_json_encode(
178
+				array_merge(
179
+					EE_Error::get_notices(false),
180
+					array(
181
+						'redirect_url' => $redirect_url,
182
+					)
183
+				)
184
+			);
185
+			exit();
186
+		}
187
+		wp_safe_redirect($redirect_url);
188
+		exit();
189
+	}
190 190
 
191 191
 
192
-    /**
193
-     * display_bot_trap_success
194
-     * shows a "success" screen to bots so that they (ie: the ppl managing them)
195
-     * think the form was submitted successfully
196
-     *
197
-     * @return void
198
-     */
199
-    public static function display_bot_trap_success()
200
-    {
201
-        add_filter('FHEE__EED_Single_Page_Checkout__run', '__return_false');
202
-        $bot_notice = esc_html__(
203
-            'Thank you so much. Your ticket selections have been received for consideration.',
204
-            'event_espresso'
205
-        );
206
-        $bot_notice = isset($_REQUEST['ee-notice']) && $_REQUEST['ee-notice'] !== ''
207
-            ? sanitize_text_field(stripslashes($_REQUEST['ee-notice']))
208
-            : $bot_notice;
209
-        EE_Registry::instance()->REQ->add_output(EEH_HTML::div($bot_notice, '', 'ee-attention'));
210
-    }
192
+	/**
193
+	 * display_bot_trap_success
194
+	 * shows a "success" screen to bots so that they (ie: the ppl managing them)
195
+	 * think the form was submitted successfully
196
+	 *
197
+	 * @return void
198
+	 */
199
+	public static function display_bot_trap_success()
200
+	{
201
+		add_filter('FHEE__EED_Single_Page_Checkout__run', '__return_false');
202
+		$bot_notice = esc_html__(
203
+			'Thank you so much. Your ticket selections have been received for consideration.',
204
+			'event_espresso'
205
+		);
206
+		$bot_notice = isset($_REQUEST['ee-notice']) && $_REQUEST['ee-notice'] !== ''
207
+			? sanitize_text_field(stripslashes($_REQUEST['ee-notice']))
208
+			: $bot_notice;
209
+		EE_Registry::instance()->REQ->add_output(EEH_HTML::div($bot_notice, '', 'ee-attention'));
210
+	}
211 211
 
212 212
 
213 213
 
214
-    /***********************************    ADMIN    **********************************/
214
+	/***********************************    ADMIN    **********************************/
215 215
 
216 216
 
217
-    /**
218
-     * bot_trap_settings_form
219
-     *
220
-     * @return void
221
-     * @throws EE_Error
222
-     * @throws InvalidArgumentException
223
-     * @throws InvalidDataTypeException
224
-     * @throws InvalidInterfaceException
225
-     */
226
-    public static function bot_trap_settings_form()
227
-    {
228
-        EED_Bot_Trap::_bot_trap_settings_form()->enqueue_js();
229
-        echo EED_Bot_Trap::_bot_trap_settings_form()->get_html();
230
-    }
217
+	/**
218
+	 * bot_trap_settings_form
219
+	 *
220
+	 * @return void
221
+	 * @throws EE_Error
222
+	 * @throws InvalidArgumentException
223
+	 * @throws InvalidDataTypeException
224
+	 * @throws InvalidInterfaceException
225
+	 */
226
+	public static function bot_trap_settings_form()
227
+	{
228
+		EED_Bot_Trap::_bot_trap_settings_form()->enqueue_js();
229
+		echo EED_Bot_Trap::_bot_trap_settings_form()->get_html();
230
+	}
231 231
 
232 232
 
233
-    /**
234
-     * _bot_trap_settings_form
235
-     *
236
-     * @return EE_Form_Section_Proper
237
-     * @throws EE_Error
238
-     */
239
-    protected static function _bot_trap_settings_form()
240
-    {
241
-        return new EE_Form_Section_Proper(
242
-            array(
243
-                'name'            => 'bot_trap_settings',
244
-                'html_id'         => 'bot_trap_settings',
245
-                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
246
-                'subsections'     => array(
247
-                    'bot_trap_hdr' => new EE_Form_Section_HTML(
248
-                        EEH_HTML::h2(esc_html__('Bot Trap Settings', 'event_espresso'))
249
-                    ),
250
-                    'use_bot_trap' => new EE_Yes_No_Input(
251
-                        array(
252
-                            'html_label_text' => esc_html__('Enable Bot Trap', 'event_espresso'),
253
-                            'html_help_text'  => esc_html__(
254
-                                'The Event Espresso Bot Trap will insert a fake input into your Ticket Selector forms that is hidden from regular site visitors, but visible to spam bots. Because the input asks for an email address, it is irresistible to spam bots who will of course enter text into it. Since regular site visitors can not see this input, any value detected during form submission means a bot has been detected, which will then be blocked from submitting the form.',
255
-                                'event_espresso'
256
-                            ),
257
-                            'default'         => EE_Registry::instance()->CFG->registration->use_bot_trap !== null
258
-                                ? EE_Registry::instance()->CFG->registration->use_bot_trap
259
-                                : true,
260
-                            'required'        => false,
261
-                        )
262
-                    ),
263
-                ),
264
-            )
265
-        );
266
-    }
233
+	/**
234
+	 * _bot_trap_settings_form
235
+	 *
236
+	 * @return EE_Form_Section_Proper
237
+	 * @throws EE_Error
238
+	 */
239
+	protected static function _bot_trap_settings_form()
240
+	{
241
+		return new EE_Form_Section_Proper(
242
+			array(
243
+				'name'            => 'bot_trap_settings',
244
+				'html_id'         => 'bot_trap_settings',
245
+				'layout_strategy' => new EE_Admin_Two_Column_Layout(),
246
+				'subsections'     => array(
247
+					'bot_trap_hdr' => new EE_Form_Section_HTML(
248
+						EEH_HTML::h2(esc_html__('Bot Trap Settings', 'event_espresso'))
249
+					),
250
+					'use_bot_trap' => new EE_Yes_No_Input(
251
+						array(
252
+							'html_label_text' => esc_html__('Enable Bot Trap', 'event_espresso'),
253
+							'html_help_text'  => esc_html__(
254
+								'The Event Espresso Bot Trap will insert a fake input into your Ticket Selector forms that is hidden from regular site visitors, but visible to spam bots. Because the input asks for an email address, it is irresistible to spam bots who will of course enter text into it. Since regular site visitors can not see this input, any value detected during form submission means a bot has been detected, which will then be blocked from submitting the form.',
255
+								'event_espresso'
256
+							),
257
+							'default'         => EE_Registry::instance()->CFG->registration->use_bot_trap !== null
258
+								? EE_Registry::instance()->CFG->registration->use_bot_trap
259
+								: true,
260
+							'required'        => false,
261
+						)
262
+					),
263
+				),
264
+			)
265
+		);
266
+	}
267 267
 
268 268
 
269
-    /**
270
-     * update_bot_trap_settings_form
271
-     *
272
-     * @param EE_Registration_Config $EE_Registration_Config
273
-     * @return EE_Registration_Config
274
-     * @throws EE_Error
275
-     * @throws InvalidArgumentException
276
-     * @throws ReflectionException
277
-     * @throws InvalidDataTypeException
278
-     * @throws InvalidInterfaceException
279
-     */
280
-    public static function update_bot_trap_settings_form(EE_Registration_Config $EE_Registration_Config)
281
-    {
282
-        try {
283
-            $bot_trap_settings_form = EED_Bot_Trap::_bot_trap_settings_form();
284
-            // if not displaying a form, then check for form submission
285
-            if ($bot_trap_settings_form->was_submitted()) {
286
-                // capture form data
287
-                $bot_trap_settings_form->receive_form_submission();
288
-                // validate form data
289
-                if ($bot_trap_settings_form->is_valid()) {
290
-                    // grab validated data from form
291
-                    $valid_data = $bot_trap_settings_form->valid_data();
292
-                    if (isset($valid_data['use_bot_trap'])) {
293
-                        $EE_Registration_Config->use_bot_trap = $valid_data['use_bot_trap'];
294
-                    } else {
295
-                        EE_Error::add_error(
296
-                            esc_html__(
297
-                                'Invalid or missing Bot Trap settings. Please refresh the form and try again.',
298
-                                'event_espresso'
299
-                            ),
300
-                            __FILE__,
301
-                            __FUNCTION__,
302
-                            __LINE__
303
-                        );
304
-                    }
305
-                } elseif ($bot_trap_settings_form->submission_error_message() !== '') {
306
-                    EE_Error::add_error(
307
-                        $bot_trap_settings_form->submission_error_message(),
308
-                        __FILE__,
309
-                        __FUNCTION__,
310
-                        __LINE__
311
-                    );
312
-                }
313
-            }
314
-        } catch (EE_Error $e) {
315
-            $e->get_error();
316
-        }
317
-        return $EE_Registration_Config;
318
-    }
269
+	/**
270
+	 * update_bot_trap_settings_form
271
+	 *
272
+	 * @param EE_Registration_Config $EE_Registration_Config
273
+	 * @return EE_Registration_Config
274
+	 * @throws EE_Error
275
+	 * @throws InvalidArgumentException
276
+	 * @throws ReflectionException
277
+	 * @throws InvalidDataTypeException
278
+	 * @throws InvalidInterfaceException
279
+	 */
280
+	public static function update_bot_trap_settings_form(EE_Registration_Config $EE_Registration_Config)
281
+	{
282
+		try {
283
+			$bot_trap_settings_form = EED_Bot_Trap::_bot_trap_settings_form();
284
+			// if not displaying a form, then check for form submission
285
+			if ($bot_trap_settings_form->was_submitted()) {
286
+				// capture form data
287
+				$bot_trap_settings_form->receive_form_submission();
288
+				// validate form data
289
+				if ($bot_trap_settings_form->is_valid()) {
290
+					// grab validated data from form
291
+					$valid_data = $bot_trap_settings_form->valid_data();
292
+					if (isset($valid_data['use_bot_trap'])) {
293
+						$EE_Registration_Config->use_bot_trap = $valid_data['use_bot_trap'];
294
+					} else {
295
+						EE_Error::add_error(
296
+							esc_html__(
297
+								'Invalid or missing Bot Trap settings. Please refresh the form and try again.',
298
+								'event_espresso'
299
+							),
300
+							__FILE__,
301
+							__FUNCTION__,
302
+							__LINE__
303
+						);
304
+					}
305
+				} elseif ($bot_trap_settings_form->submission_error_message() !== '') {
306
+					EE_Error::add_error(
307
+						$bot_trap_settings_form->submission_error_message(),
308
+						__FILE__,
309
+						__FUNCTION__,
310
+						__LINE__
311
+					);
312
+				}
313
+			}
314
+		} catch (EE_Error $e) {
315
+			$e->get_error();
316
+		}
317
+		return $EE_Registration_Config;
318
+	}
319 319
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -53,7 +53,7 @@  discard block
 block discarded – undo
53 53
      */
54 54
     public static function set_trap()
55 55
     {
56
-        define('EE_BOT_TRAP_BASE_URL', plugin_dir_url(__FILE__) . '/');
56
+        define('EE_BOT_TRAP_BASE_URL', plugin_dir_url(__FILE__).'/');
57 57
         add_action(
58 58
             'AHEE__ticket_selector_chart__template__after_ticket_selector',
59 59
             array('EED_Bot_Trap', 'generate_bot_trap'),
@@ -119,9 +119,9 @@  discard block
 block discarded – undo
119 119
         $do_not_enter = esc_html__('please do not enter anything in this input', 'event_espresso');
120 120
         $time = microtime(true);
121 121
         $html = '<div class="tkt-slctr-request-processor-dv" style="float:left; margin:0 0 0 -999em; height: 0;">';
122
-        $html .= '<label for="tkt-slctr-request-processor-email-' . $time . '">' . $do_not_enter . '</label>';
122
+        $html .= '<label for="tkt-slctr-request-processor-email-'.$time.'">'.$do_not_enter.'</label>';
123 123
         $html .= '<input type="email" id="tkt-slctr-request-processor-email-';
124
-        $html .= $time . '" name="tkt-slctr-request-processor-email" value=""/>';
124
+        $html .= $time.'" name="tkt-slctr-request-processor-email" value=""/>';
125 125
         $html .= '</div><!-- .tkt-slctr-request-processor-dv -->';
126 126
         echo $html;
127 127
     }
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
             return;
148 148
         }
149 149
         // check the given callback is valid first before executing
150
-        if (! is_callable($triggered_trap_callback)) {
150
+        if ( ! is_callable($triggered_trap_callback)) {
151 151
             // invalid callback so lets just sub in our default.
152 152
             $triggered_trap_callback = array('EED_Bot_Trap', 'triggered_trap_response');
153 153
         }
Please login to merge, or discard this patch.
modules/events_archive/EED_Events_Archive.module.php 2 patches
Indentation   +1099 added lines, -1099 removed lines patch added patch discarded remove patch
@@ -16,1094 +16,1094 @@  discard block
 block discarded – undo
16 16
 class EED_Events_Archive extends EED_Module
17 17
 {
18 18
 
19
-    const EVENT_DETAILS_PRIORITY = 100;
20
-
21
-    const EVENT_DATETIMES_PRIORITY = 110;
22
-
23
-    const EVENT_TICKETS_PRIORITY = 120;
24
-
25
-    const EVENT_VENUES_PRIORITY = 130;
26
-
27
-
28
-    public static $espresso_event_list_ID = 0;
29
-
30
-    public static $espresso_grid_event_lists = array();
31
-
32
-    /**
33
-     * @type bool $using_get_the_excerpt
34
-     */
35
-    protected static $using_get_the_excerpt = false;
36
-
37
-    /**
38
-     * Used to flag when the event list is being called from an external iframe.
39
-     *
40
-     * @var bool $iframe
41
-     */
42
-    protected static $iframe = false;
43
-
44
-    /**
45
-     * @var \EventEspresso\core\libraries\iframe_display\EventListIframeEmbedButton $_iframe_embed_button
46
-     */
47
-    private static $_iframe_embed_button;
48
-
49
-    /**
50
-     * @type EE_Template_Part_Manager $template_parts
51
-     */
52
-    protected $template_parts;
53
-
54
-
55
-    /**
56
-     * @return EED_Events_Archive
57
-     */
58
-    public static function instance()
59
-    {
60
-        return parent::get_instance(__CLASS__);
61
-    }
62
-
63
-
64
-    /**
65
-     * set_hooks - for hooking into EE Core, other modules, etc
66
-     *
67
-     * @return void
68
-     * @throws InvalidArgumentException
69
-     * @throws InvalidDataTypeException
70
-     * @throws InvalidInterfaceException
71
-     */
72
-    public static function set_hooks()
73
-    {
74
-        /** @var EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions $custom_post_type_definitions */
75
-        $custom_post_type_definitions = LoaderFactory::getLoader()->getShared(
76
-            'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'
77
-        );
78
-        $custom_post_types = $custom_post_type_definitions->getDefinitions();
79
-        EE_Config::register_route(
80
-            $custom_post_types['espresso_events']['plural_slug'],
81
-            'Events_Archive',
82
-            'run'
83
-        );
84
-        EE_Config::register_route(
85
-            'event_list',
86
-            'Events_Archive',
87
-            'event_list'
88
-        );
89
-        EE_Config::register_route(
90
-            'iframe',
91
-            'Events_Archive',
92
-            'event_list_iframe',
93
-            'event_list'
94
-        );
95
-        add_action('wp_loaded', array('EED_Events_Archive', 'set_definitions'), 2);
96
-    }
97
-
98
-
99
-    /**
100
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
101
-     *
102
-     * @access    public
103
-     * @return    void
104
-     */
105
-    public static function set_hooks_admin()
106
-    {
107
-        add_action('wp_loaded', array('EED_Events_Archive', 'set_definitions'), 2);
108
-        // hook into the end of the \EE_Admin_Page::_load_page_dependencies()
109
-        // to load assets for "espresso_events" page on the "default" route (action)
110
-        add_action(
111
-            'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_events__default',
112
-            array('EED_Events_Archive', 'event_list_iframe_embed_button'),
113
-            10
114
-        );
115
-    }
116
-
117
-
118
-    /**
119
-     *    set_definitions
120
-     *
121
-     * @access    public
122
-     * @return    void
123
-     */
124
-    public static function set_definitions()
125
-    {
126
-        define('EVENTS_ARCHIVE_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
127
-        define('EVENTS_ARCHIVE_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/');
128
-    }
129
-
130
-
131
-    /**
132
-     * set up EE_Events_Archive_Config
133
-     */
134
-    protected function set_config()
135
-    {
136
-        $this->set_config_section('template_settings');
137
-        $this->set_config_class('EE_Events_Archive_Config');
138
-        $this->set_config_name('EED_Events_Archive');
139
-    }
140
-
141
-
142
-    /**
143
-     * @return EventListIframeEmbedButton
144
-     */
145
-    public static function get_iframe_embed_button()
146
-    {
147
-        if (! self::$_iframe_embed_button instanceof EventListIframeEmbedButton) {
148
-            self::$_iframe_embed_button = new EventListIframeEmbedButton();
149
-        }
150
-        return self::$_iframe_embed_button;
151
-    }
152
-
153
-
154
-    /**
155
-     * event_list_iframe_embed_button
156
-     *
157
-     * @return    void
158
-     * @throws \EE_Error
159
-     */
160
-    public static function event_list_iframe_embed_button()
161
-    {
162
-        $iframe_embed_button = \EED_Events_Archive::get_iframe_embed_button();
163
-        $iframe_embed_button->addEmbedButton();
164
-    }
165
-
166
-
167
-    /**
168
-     *    initialize_template_parts
169
-     *
170
-     * @access    public
171
-     * @param \EE_Events_Archive_Config $config
172
-     * @return \EE_Template_Part_Manager
173
-     */
174
-    public function initialize_template_parts(EE_Events_Archive_Config $config = null)
175
-    {
176
-        $config = $config instanceof EE_Events_Archive_Config ? $config : $this->config();
177
-        EEH_Autoloader::instance()->register_template_part_autoloaders();
178
-        $template_parts = new EE_Template_Part_Manager();
179
-        $template_parts->add_template_part(
180
-            'tickets',
181
-            __('Ticket Selector', 'event_espresso'),
182
-            'content-espresso_events-tickets.php',
183
-            $config->display_order_tickets
184
-        );
185
-        $template_parts->add_template_part(
186
-            'datetimes',
187
-            __('Dates and Times', 'event_espresso'),
188
-            'content-espresso_events-datetimes.php',
189
-            $config->display_order_datetimes
190
-        );
191
-        $template_parts->add_template_part(
192
-            'event',
193
-            __('Event Description', 'event_espresso'),
194
-            'content-espresso_events-details.php',
195
-            $config->display_order_event
196
-        );
197
-        $template_parts->add_template_part(
198
-            'venue',
199
-            __('Venue Information', 'event_espresso'),
200
-            'content-espresso_events-venues.php',
201
-            $config->display_order_venue
202
-        );
203
-        do_action('AHEE__EED_Event_Archive__initialize_template_parts', $template_parts);
204
-        return $template_parts;
205
-    }
206
-
207
-
208
-    /**
209
-     *    run - initial module setup - this gets called by the EE_Front_Controller if the module route is found in the
210
-     *    incoming request
211
-     *
212
-     * @access    public
213
-     * @param WP $WP
214
-     * @return    void
215
-     */
216
-    public function run($WP)
217
-    {
218
-        do_action('AHEE__EED_Events_Archive__before_run');
219
-        // ensure valid EE_Events_Archive_Config() object exists
220
-        $this->set_config();
221
-        /** @type EE_Events_Archive_Config $config */
222
-        $config = $this->config();
223
-        // load other required components
224
-        $this->load_event_list_assets();
225
-        // filter the WP posts_join, posts_where, and posts_orderby SQL clauses
226
-        // add query filters
227
-        EEH_Event_Query::add_query_filters();
228
-        // set params that will get used by the filters
229
-        EEH_Event_Query::set_query_params(
230
-            '',    // month
231
-            '',    // category
232
-            $config->display_expired_events,    // show_expired
233
-            'start_date',    // orderby
234
-            'ASC'    // sort
235
-        );
236
-        // check what template is loaded
237
-        add_filter('template_include', array($this, 'template_include'), 999, 1);
238
-    }
239
-
240
-
241
-    /**
242
-     * most likely called by the ESPRESSO_EVENTS shortcode which uses this module to do some of it's lifting
243
-     *
244
-     * @return    void
245
-     */
246
-    public function event_list()
247
-    {
248
-        // ensure valid EE_Events_Archive_Config() object exists
249
-        $this->set_config();
250
-        // load other required components
251
-        $this->load_event_list_assets();
252
-    }
253
-
254
-
255
-    /**
256
-     * @access    public
257
-     * @return    void
258
-     * @throws \EE_Error
259
-     * @throws \DomainException
260
-     */
261
-    public function event_list_iframe()
262
-    {
263
-        \EED_Events_Archive::$iframe = true;
264
-        $event_list_iframe = new EventsArchiveIframe($this);
265
-        $event_list_iframe->display();
266
-    }
267
-
268
-
269
-    /**
270
-     * @access public
271
-     * @return string
272
-     */
273
-    public static function is_iframe()
274
-    {
275
-        return \EED_Events_Archive::$iframe;
276
-    }
277
-
278
-
279
-    /**
280
-     * @access public
281
-     * @return string
282
-     */
283
-    public static function link_target()
284
-    {
285
-        return \EED_Events_Archive::$iframe ? ' target="_blank"' : '';
286
-    }
287
-
288
-
289
-    /**
290
-     *    template_include
291
-     *
292
-     * @access    public
293
-     * @param string $template
294
-     * @return    string
295
-     */
296
-    public function template_include($template = '')
297
-    {
298
-        // don't add content filter for dedicated EE child themes or private posts
299
-        if (! EEH_Template::is_espresso_theme()) {
300
-            /** @type EE_Events_Archive_Config $config */
301
-            $config = $this->config();
302
-            // add status banner ?
303
-            if ($config->display_status_banner) {
304
-                add_filter('the_title', array('EED_Events_Archive', 'the_title'), 100, 2);
305
-            }
306
-            // if NOT a custom template
307
-            if (apply_filters('FHEE__EED_Event_Archive__template_include__allow_custom_selected_template', false)
308
-                || EE_Registry::instance()
309
-                              ->load_core('Front_Controller')
310
-                              ->get_selected_template() !== 'archive-espresso_events.php'
311
-            ) {
312
-                // don't display entry meta because the existing theme will take care of that
313
-                add_filter('FHEE__EED_Events_Archive__template_include__events_list_active', '__return_true');
314
-                // load functions.php file for the theme (loaded by WP if using child theme)
315
-                EEH_Template::load_espresso_theme_functions();
316
-                // because we don't know if the theme is using the_excerpt()
317
-                add_filter(
318
-                    'the_excerpt',
319
-                    array('EED_Events_Archive', 'event_details'),
320
-                    EED_Events_Archive::EVENT_DETAILS_PRIORITY
321
-                );
322
-                // or the_content
323
-                add_filter(
324
-                    'the_content',
325
-                    array('EED_Events_Archive', 'event_details'),
326
-                    EED_Events_Archive::EVENT_DETAILS_PRIORITY
327
-                );
328
-                // and just in case they are running get_the_excerpt() which DESTROYS things
329
-                add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
330
-                // don't display entry meta because the existing theme will take care of that
331
-                add_filter('FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false');
332
-            }
333
-        }
334
-        return $template;
335
-    }
336
-
337
-
338
-    /**
339
-     *    get_the_excerpt - kinda hacky, but if a theme is using get_the_excerpt(), then we need to remove our filters
340
-     *    on the_content()
341
-     *
342
-     * @access    public
343
-     * @param        string $excerpt
344
-     * @return        string
345
-     */
346
-    public static function get_the_excerpt($excerpt = '')
347
-    {
348
-        if (post_password_required()) {
349
-            return $excerpt;
350
-        }
351
-        if (apply_filters('FHEE__EED_Events_Archive__get_the_excerpt__theme_uses_get_the_excerpt', false)) {
352
-            remove_filter(
353
-                'the_excerpt',
354
-                array('EED_Events_Archive', 'event_details'),
355
-                EED_Events_Archive::EVENT_DETAILS_PRIORITY
356
-            );
357
-            remove_filter(
358
-                'the_content',
359
-                array('EED_Events_Archive', 'event_details'),
360
-                EED_Events_Archive::EVENT_DETAILS_PRIORITY
361
-            );
362
-            $excerpt = EED_Events_Archive::event_details($excerpt);
363
-        } else {
364
-            EED_Events_Archive::$using_get_the_excerpt = true;
365
-            add_filter('wp_trim_excerpt', array('EED_Events_Archive', 'end_get_the_excerpt'), 999, 1);
366
-        }
367
-        return $excerpt;
368
-    }
369
-
370
-
371
-    /**
372
-     * end_get_the_excerpt
373
-     *
374
-     * @access public
375
-     * @param  string $text
376
-     * @return string
377
-     */
378
-    public static function end_get_the_excerpt($text = '')
379
-    {
380
-        EED_Events_Archive::$using_get_the_excerpt = false;
381
-        return $text;
382
-    }
383
-
384
-
385
-    /**
386
-     *    the_title
387
-     *
388
-     * @access        public
389
-     * @param        string $title
390
-     * @param        string $id
391
-     * @return        string
392
-     */
393
-    public static function the_title($title = '', $id = '')
394
-    {
395
-        global $post;
396
-        if ($post instanceof WP_Post) {
397
-            return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID) . $title : $title;
398
-        }
399
-        return $title;
400
-    }
401
-
402
-
403
-    /**
404
-     *    event_details
405
-     *
406
-     * @access    public
407
-     * @param        string $content
408
-     * @return        string
409
-     */
410
-    public static function event_details($content)
411
-    {
412
-        global $post;
413
-        static $current_post_ID = 0;
414
-        if ($current_post_ID !== $post->ID
415
-            && $post->post_type === 'espresso_events'
416
-            && ! EED_Events_Archive::$using_get_the_excerpt
417
-            && ! post_password_required()
418
-            && (
419
-                apply_filters('FHEE__EES_Espresso_Events__process_shortcode__true', false)
420
-                || ! apply_filters('FHEE__content_espresso_events__template_loaded', false)
421
-            )
422
-        ) {
423
-            // Set current post ID to prevent showing content twice, but only if headers have definitely been sent.
424
-            // Reason being is that some plugins, like Yoast, need to run through a copy of the loop early
425
-            // BEFORE headers are sent in order to examine the post content and generate content for the HTML header.
426
-            // We want to allow those plugins to still do their thing and have access to our content, but depending on
427
-            // how your event content is being displayed (shortcode, CPT route, etc), this filter can get applied twice,
428
-            // so the following allows this filter to be applied multiple times, but only once for real
429
-            $current_post_ID = did_action('loop_start') ? $post->ID : 0;
430
-            if (EE_Registry::instance()->CFG->template_settings->EED_Events_Archive->use_sortable_display_order) {
431
-                $content = \EED_Events_Archive::use_sortable_display_order();
432
-            } else {
433
-                $content = \EED_Events_Archive::use_filterable_display_order();
434
-            }
435
-        }
436
-        return $content;
437
-    }
438
-
439
-
440
-    /**
441
-     *    use_sortable_display_order
442
-     *
443
-     * @access    protected
444
-     * @return string
445
-     */
446
-    protected static function use_sortable_display_order()
447
-    {
448
-        // no further password checks required atm
449
-        add_filter('FHEE__EED_Events_Archive__event_details__no_post_password_required', '__return_true');
450
-        // we need to first remove this callback from being applied to the_content() or the_excerpt()
451
-        // (otherwise it will recurse and blow up the interweb)
452
-        remove_filter(
453
-            'the_excerpt',
454
-            array('EED_Events_Archive', 'event_details'),
455
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
456
-        );
457
-        remove_filter(
458
-            'the_content',
459
-            array('EED_Events_Archive', 'event_details'),
460
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
461
-        );
462
-        remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
463
-        // now add additional content depending on whether event is using the_excerpt() or the_content()
464
-        EED_Events_Archive::instance()->template_parts = EED_Events_Archive::instance()->initialize_template_parts();
465
-        $content = EEH_Template::locate_template('content-espresso_events-details.php');
466
-        $content = EED_Events_Archive::instance()->template_parts->apply_template_part_filters($content);
467
-        // re-add our main filters (or else the next event won't have them)
468
-        add_filter(
469
-            'the_excerpt',
470
-            array('EED_Events_Archive', 'event_details'),
471
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
472
-        );
473
-        add_filter(
474
-            'the_content',
475
-            array('EED_Events_Archive', 'event_details'),
476
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
477
-        );
478
-        add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
479
-        remove_filter(
480
-            'FHEE__EED_Events_Archive__event_details__no_post_password_required',
481
-            '__return_true'
482
-        );
483
-        return $content;
484
-    }
485
-
486
-
487
-    /**
488
-     *    use_filterable_display_order
489
-     *
490
-     * @access    protected
491
-     * @return    string
492
-     */
493
-    protected static function use_filterable_display_order()
494
-    {
495
-        // we need to first remove this callback from being applied to the_content()
496
-        // (otherwise it will recurse and blow up the interweb)
497
-        remove_filter(
498
-            'the_excerpt',
499
-            array('EED_Events_Archive', 'event_details'),
500
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
501
-        );
502
-        remove_filter(
503
-            'the_content',
504
-            array('EED_Events_Archive', 'event_details'),
505
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
506
-        );
507
-        remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
508
-        // now add additional content depending on whether event is using the_excerpt() or the_content()
509
-        EED_Events_Archive::_add_additional_excerpt_filters();
510
-        EED_Events_Archive::_add_additional_content_filters();
511
-        do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_add_filters');
512
-        // now load our template
513
-        $content = EEH_Template::locate_template('content-espresso_events-details.php');
514
-        // re-add our main filters (or else the next event won't have them)
515
-        add_filter(
516
-            'the_excerpt',
517
-            array('EED_Events_Archive', 'event_details'),
518
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
519
-        );
520
-        add_filter(
521
-            'the_content',
522
-            array('EED_Events_Archive', 'event_details'),
523
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
524
-        );
525
-        add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
526
-        // but remove the other filters so that they don't get applied to the next post
527
-        EED_Events_Archive::_remove_additional_events_archive_filters();
528
-        do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_remove_filters');
529
-        // we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt)
530
-        // return ! empty( $template ) ? $template : $content;
531
-        return $content;
532
-    }
533
-
534
-
535
-    /**
536
-     *    event_datetimes - adds datetimes ABOVE content
537
-     *
538
-     * @access    public
539
-     * @param        string $content
540
-     * @return        string
541
-     */
542
-    public static function event_datetimes($content)
543
-    {
544
-        if (post_password_required()) {
545
-            return $content;
546
-        }
547
-        return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
548
-    }
549
-
550
-
551
-    /**
552
-     *    event_tickets - adds tickets ABOVE content (which includes datetimes)
553
-     *
554
-     * @access    public
555
-     * @param        string $content
556
-     * @return        string
557
-     */
558
-    public static function event_tickets($content)
559
-    {
560
-        if (post_password_required()) {
561
-            return $content;
562
-        }
563
-        return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
564
-    }
565
-
566
-
567
-    /**
568
-     *    event_venues - adds venues BELOW content
569
-     *
570
-     * @access    public
571
-     * @param    string $content
572
-     * @return    string
573
-     */
574
-    public static function event_venue($content)
575
-    {
576
-        return EED_Events_Archive::event_venues($content);
577
-    }
578
-
579
-
580
-    /**
581
-     *    event_venues - adds venues BELOW content
582
-     *
583
-     * @access    public
584
-     * @param        string $content
585
-     * @return        string
586
-     */
587
-    public static function event_venues($content)
588
-    {
589
-        if (post_password_required()) {
590
-            return $content;
591
-        }
592
-        return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
593
-    }
594
-
595
-
596
-    /**
597
-     *    _add_additional_content_filters
598
-     *
599
-     * @access    private
600
-     * @return        void
601
-     */
602
-    private static function _add_additional_excerpt_filters()
603
-    {
604
-        add_filter(
605
-            'the_excerpt',
606
-            array('EED_Events_Archive', 'event_datetimes'),
607
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
608
-        );
609
-        add_filter(
610
-            'the_excerpt',
611
-            array('EED_Events_Archive', 'event_tickets'),
612
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
613
-        );
614
-        add_filter(
615
-            'the_excerpt',
616
-            array('EED_Events_Archive', 'event_venues'),
617
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
618
-        );
619
-    }
620
-
621
-
622
-    /**
623
-     *    _add_additional_content_filters
624
-     *
625
-     * @access    private
626
-     * @return        void
627
-     */
628
-    private static function _add_additional_content_filters()
629
-    {
630
-        add_filter(
631
-            'the_content',
632
-            array('EED_Events_Archive', 'event_datetimes'),
633
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
634
-        );
635
-        add_filter(
636
-            'the_content',
637
-            array('EED_Events_Archive', 'event_tickets'),
638
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
639
-        );
640
-        add_filter(
641
-            'the_content',
642
-            array('EED_Events_Archive', 'event_venues'),
643
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
644
-        );
645
-    }
646
-
647
-
648
-    /**
649
-     *    _remove_additional_events_archive_filters
650
-     *
651
-     * @access    private
652
-     * @return        void
653
-     */
654
-    private static function _remove_additional_events_archive_filters()
655
-    {
656
-        remove_filter(
657
-            'the_excerpt',
658
-            array('EED_Events_Archive', 'event_datetimes'),
659
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
660
-        );
661
-        remove_filter(
662
-            'the_excerpt',
663
-            array('EED_Events_Archive', 'event_tickets'),
664
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
665
-        );
666
-        remove_filter(
667
-            'the_excerpt',
668
-            array('EED_Events_Archive', 'event_venues'),
669
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
670
-        );
671
-        remove_filter(
672
-            'the_content',
673
-            array('EED_Events_Archive', 'event_datetimes'),
674
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
675
-        );
676
-        remove_filter(
677
-            'the_content',
678
-            array('EED_Events_Archive', 'event_tickets'),
679
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
680
-        );
681
-        remove_filter(
682
-            'the_content',
683
-            array('EED_Events_Archive', 'event_venues'),
684
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
685
-        );
686
-    }
687
-
688
-
689
-    /**
690
-     *    remove_all_events_archive_filters
691
-     *
692
-     * @access    public
693
-     * @return        void
694
-     */
695
-    public static function remove_all_events_archive_filters()
696
-    {
697
-        // remove_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1 );
698
-        remove_filter('the_title', array('EED_Events_Archive', 'the_title'), 1);
699
-        remove_filter(
700
-            'the_excerpt',
701
-            array('EED_Events_Archive', 'event_details'),
702
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
703
-        );
704
-        remove_filter(
705
-            'the_excerpt',
706
-            array('EED_Events_Archive', 'event_datetimes'),
707
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
708
-        );
709
-        remove_filter(
710
-            'the_excerpt',
711
-            array('EED_Events_Archive', 'event_tickets'),
712
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
713
-        );
714
-        remove_filter(
715
-            'the_excerpt',
716
-            array('EED_Events_Archive', 'event_venues'),
717
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
718
-        );
719
-        remove_filter(
720
-            'the_content',
721
-            array('EED_Events_Archive', 'event_details'),
722
-            EED_Events_Archive::EVENT_DETAILS_PRIORITY
723
-        );
724
-        remove_filter(
725
-            'the_content',
726
-            array('EED_Events_Archive', 'event_datetimes'),
727
-            EED_Events_Archive::EVENT_DATETIMES_PRIORITY
728
-        );
729
-        remove_filter(
730
-            'the_content',
731
-            array('EED_Events_Archive', 'event_tickets'),
732
-            EED_Events_Archive::EVENT_TICKETS_PRIORITY
733
-        );
734
-        remove_filter(
735
-            'the_content',
736
-            array('EED_Events_Archive', 'event_venues'),
737
-            EED_Events_Archive::EVENT_VENUES_PRIORITY
738
-        );
739
-        // don't display entry meta because the existing theme will take care of that
740
-        remove_filter(
741
-            'FHEE__content_espresso_events_details_template__display_entry_meta',
742
-            '__return_false'
743
-        );
744
-    }
745
-
746
-
747
-    /**
748
-     *    load_event_list_assets
749
-     *
750
-     * @access    public
751
-     * @return    void
752
-     */
753
-    public function load_event_list_assets()
754
-    {
755
-        do_action('AHEE__EED_Events_Archive__before_load_assets');
756
-        add_filter('FHEE_load_EE_Session', '__return_true');
757
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
758
-        add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
759
-        if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
760
-            add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
761
-        }
762
-    }
763
-
764
-
765
-    /**
766
-     *    wp_enqueue_scripts
767
-     *
768
-     * @access    public
769
-     * @return    void
770
-     */
771
-    public function wp_enqueue_scripts()
772
-    {
773
-        // get some style
774
-        if (apply_filters('FHEE_enable_default_espresso_css', false)) {
775
-            // first check uploads folder
776
-            if (EEH_File::is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
777
-                wp_register_style(
778
-                    $this->theme,
779
-                    get_stylesheet_directory_uri() . $this->theme . '/style.css',
780
-                    array('dashicons', 'espresso_default')
781
-                );
782
-            } else {
783
-            }
784
-            wp_enqueue_style($this->theme);
785
-        }
786
-    }
787
-
788
-
789
-    /**
790
-     *    template_settings_form
791
-     *
792
-     * @access    public
793
-     * @static
794
-     * @return    string
795
-     */
796
-    public static function template_settings_form()
797
-    {
798
-        $template_settings = EE_Registry::instance()->CFG->template_settings;
799
-        $template_settings->EED_Events_Archive = isset($template_settings->EED_Events_Archive)
800
-            ? $template_settings->EED_Events_Archive : new EE_Events_Archive_Config();
801
-        $template_settings->EED_Events_Archive = apply_filters(
802
-            'FHEE__EED_Events_Archive__template_settings_form__event_list_config',
803
-            $template_settings->EED_Events_Archive
804
-        );
805
-        $events_archive_settings = array(
806
-            'display_status_banner' => 0,
807
-            'display_description' => 1,
808
-            'display_ticket_selector' => 0,
809
-            'display_datetimes' => 1,
810
-            'display_venue' => 0,
811
-            'display_expired_events' => 0,
812
-        );
813
-        $events_archive_settings = array_merge(
814
-            $events_archive_settings,
815
-            (array) $template_settings->EED_Events_Archive
816
-        );
817
-        EEH_Template::display_template(
818
-            EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
819
-            $events_archive_settings
820
-        );
821
-    }
822
-
823
-
824
-    /**
825
-     *    update_template_settings
826
-     *
827
-     * @access    public
828
-     * @param    EE_Template_Config $CFG
829
-     * @param    EE_Request_Handler $REQ
830
-     * @return    EE_Template_Config
831
-     */
832
-    public static function update_template_settings($CFG, $REQ)
833
-    {
834
-        $CFG->EED_Events_Archive = new EE_Events_Archive_Config();
835
-        // unless we are resetting the config...
836
-        if (! isset($REQ['EED_Events_Archive_reset_event_list_settings'])
837
-            || absint($REQ['EED_Events_Archive_reset_event_list_settings']) !== 1
838
-        ) {
839
-            $CFG->EED_Events_Archive->display_status_banner = isset($REQ['EED_Events_Archive_display_status_banner'])
840
-                ? absint($REQ['EED_Events_Archive_display_status_banner']) : 0;
841
-            $CFG->EED_Events_Archive->display_description = isset($REQ['EED_Events_Archive_display_description'])
842
-                ? absint($REQ['EED_Events_Archive_display_description']) : 1;
843
-            $CFG->EED_Events_Archive->display_ticket_selector = isset($REQ['EED_Events_Archive_display_ticket_selector'])
844
-                ? absint($REQ['EED_Events_Archive_display_ticket_selector']) : 0;
845
-            $CFG->EED_Events_Archive->display_datetimes = isset($REQ['EED_Events_Archive_display_datetimes']) ? absint(
846
-                $REQ['EED_Events_Archive_display_datetimes']
847
-            ) : 1;
848
-            $CFG->EED_Events_Archive->display_venue = isset($REQ['EED_Events_Archive_display_venue']) ? absint(
849
-                $REQ['EED_Events_Archive_display_venue']
850
-            ) : 0;
851
-            $CFG->EED_Events_Archive->display_expired_events = isset($REQ['EED_Events_Archive_display_expired_events'])
852
-                ? absint($REQ['EED_Events_Archive_display_expired_events']) : 0;
853
-        }
854
-        return $CFG;
855
-    }
856
-
857
-
858
-    /**
859
-     *    event_list_css
860
-     *
861
-     * @access    public
862
-     * @param string $extra_class
863
-     * @return    string
864
-     */
865
-    public static function event_list_css($extra_class = '')
866
-    {
867
-        $event_list_css = ! empty($extra_class) ? array($extra_class) : array();
868
-        $event_list_css[] = 'espresso-event-list-event';
869
-        return implode(' ', $event_list_css);
870
-    }
871
-
872
-
873
-    /**
874
-     *    event_categories
875
-     *
876
-     * @access    public
877
-     * @return    array
878
-     */
879
-    public static function event_categories()
880
-    {
881
-        return EE_Registry::instance()->load_model('Term')->get_all_ee_categories();
882
-    }
883
-
884
-
885
-    /**
886
-     *    display_description
887
-     *
888
-     * @access    public
889
-     * @param $value
890
-     * @return    bool
891
-     */
892
-    public static function display_description($value)
893
-    {
894
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
895
-        $display_description = isset($config->display_description) ? $config->display_description : 1;
896
-        return $display_description === $value ? true : false;
897
-    }
898
-
899
-
900
-    /**
901
-     *    display_ticket_selector
902
-     *
903
-     * @access    public
904
-     * @return    bool
905
-     */
906
-    public static function display_ticket_selector()
907
-    {
908
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
909
-        return isset($config->display_ticket_selector) && $config->display_ticket_selector ? true : false;
910
-    }
911
-
912
-
913
-    /**
914
-     *    display_venue
915
-     *
916
-     * @access    public
917
-     * @return    bool
918
-     */
919
-    public static function display_venue()
920
-    {
921
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
922
-        return isset($config->display_venue) && $config->display_venue && EEH_Venue_View::venue_name() ? true : false;
923
-    }
924
-
925
-
926
-    /**
927
-     *    display_datetimes
928
-     *
929
-     * @access    public
930
-     * @return    bool
931
-     */
932
-    public static function display_datetimes()
933
-    {
934
-        $config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
935
-        return isset($config->display_datetimes) && $config->display_datetimes ? true : false;
936
-    }
937
-
938
-
939
-    /**
940
-     *    event_list_title
941
-     *
942
-     * @access    public
943
-     * @return    string
944
-     */
945
-    public static function event_list_title()
946
-    {
947
-        return apply_filters(
948
-            'FHEE__archive_espresso_events_template__upcoming_events_h1',
949
-            __('Upcoming Events', 'event_espresso')
950
-        );
951
-    }
952
-
953
-
954
-    // GRAVEYARD
955
-
956
-
957
-    /**
958
-     * @since 4.4.0
959
-     */
960
-    public static function _doing_it_wrong_notice($function = '')
961
-    {
962
-        EE_Error::doing_it_wrong(
963
-            __FUNCTION__,
964
-            sprintf(
965
-                __(
966
-                    'EED_Events_Archive::%1$s was moved to EEH_Event_Query::%1$s:%2$sPlease update your existing code because the method it calls will be removed in version %3$s',
967
-                    'event_espresso'
968
-                ),
969
-                $function,
970
-                '<br />',
971
-                '4.6.0'
972
-            ),
973
-            '4.4.0'
974
-        );
975
-    }
976
-
977
-
978
-    /**
979
-     * @deprecated
980
-     * @since 4.4.0
981
-     */
982
-    public function get_post_data()
983
-    {
984
-        EEH_Event_Query::set_query_params();
985
-    }
986
-
987
-
988
-    /**
989
-     * @deprecated
990
-     * @since 4.4.0
991
-     */
992
-    public function posts_fields($SQL, WP_Query $wp_query)
993
-    {
994
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
995
-        return EEH_Event_Query::posts_fields($SQL, $wp_query);
996
-    }
997
-
998
-
999
-    /**
1000
-     * @deprecated
1001
-     * @since 4.4.0
1002
-     */
1003
-    public static function posts_fields_sql_for_orderby($orderby_params = array())
1004
-    {
1005
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1006
-        return EEH_Event_Query::posts_fields_sql_for_orderby($orderby_params);
1007
-    }
1008
-
1009
-
1010
-    /**
1011
-     * @deprecated
1012
-     * @since 4.4.0
1013
-     */
1014
-    public function posts_join($SQL, WP_Query $wp_query)
1015
-    {
1016
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1017
-        return EEH_Event_Query::posts_join($SQL, $wp_query);
1018
-    }
1019
-
1020
-
1021
-    /**
1022
-     * @deprecated
1023
-     * @since 4.4.0
1024
-     */
1025
-    public static function posts_join_sql_for_terms($join_terms = null)
1026
-    {
1027
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1028
-        return EEH_Event_Query::posts_join_sql_for_terms($join_terms);
1029
-    }
1030
-
1031
-
1032
-    /**
1033
-     * @deprecated
1034
-     * @since 4.4.0
1035
-     */
1036
-    public static function posts_join_for_orderby($orderby_params = array())
1037
-    {
1038
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1039
-        return EEH_Event_Query::posts_join_for_orderby($orderby_params);
1040
-    }
1041
-
1042
-
1043
-    /**
1044
-     * @deprecated
1045
-     * @since 4.4.0
1046
-     */
1047
-    public function posts_where($SQL, WP_Query $wp_query)
1048
-    {
1049
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1050
-        return EEH_Event_Query::posts_where($SQL, $wp_query);
1051
-    }
1052
-
1053
-
1054
-    /**
1055
-     * @deprecated
1056
-     * @since 4.4.0
1057
-     */
1058
-    public static function posts_where_sql_for_show_expired($show_expired = false)
1059
-    {
1060
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1061
-        return EEH_Event_Query::posts_where_sql_for_show_expired($show_expired);
1062
-    }
1063
-
1064
-
1065
-    /**
1066
-     * @deprecated
1067
-     * @since 4.4.0
1068
-     */
1069
-    public static function posts_where_sql_for_event_category_slug($event_category_slug = null)
1070
-    {
1071
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1072
-        return EEH_Event_Query::posts_where_sql_for_event_category_slug($event_category_slug);
1073
-    }
1074
-
1075
-
1076
-    /**
1077
-     * @deprecated
1078
-     * @since 4.4.0
1079
-     */
1080
-    public static function posts_where_sql_for_event_list_month($month = null)
1081
-    {
1082
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1083
-        return EEH_Event_Query::posts_where_sql_for_event_list_month($month);
1084
-    }
1085
-
1086
-
1087
-    /**
1088
-     * @deprecated
1089
-     * @since 4.4.0
1090
-     */
1091
-    public function posts_orderby($SQL, WP_Query $wp_query)
1092
-    {
1093
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1094
-        return EEH_Event_Query::posts_orderby($SQL, $wp_query);
1095
-    }
1096
-
1097
-
1098
-    /**
1099
-     * @deprecated
1100
-     * @since 4.4.0
1101
-     */
1102
-    public static function posts_orderby_sql($orderby_params = array(), $sort = 'ASC')
1103
-    {
1104
-        EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1105
-        return EEH_Event_Query::posts_orderby_sql($orderby_params, $sort);
1106
-    }
19
+	const EVENT_DETAILS_PRIORITY = 100;
20
+
21
+	const EVENT_DATETIMES_PRIORITY = 110;
22
+
23
+	const EVENT_TICKETS_PRIORITY = 120;
24
+
25
+	const EVENT_VENUES_PRIORITY = 130;
26
+
27
+
28
+	public static $espresso_event_list_ID = 0;
29
+
30
+	public static $espresso_grid_event_lists = array();
31
+
32
+	/**
33
+	 * @type bool $using_get_the_excerpt
34
+	 */
35
+	protected static $using_get_the_excerpt = false;
36
+
37
+	/**
38
+	 * Used to flag when the event list is being called from an external iframe.
39
+	 *
40
+	 * @var bool $iframe
41
+	 */
42
+	protected static $iframe = false;
43
+
44
+	/**
45
+	 * @var \EventEspresso\core\libraries\iframe_display\EventListIframeEmbedButton $_iframe_embed_button
46
+	 */
47
+	private static $_iframe_embed_button;
48
+
49
+	/**
50
+	 * @type EE_Template_Part_Manager $template_parts
51
+	 */
52
+	protected $template_parts;
53
+
54
+
55
+	/**
56
+	 * @return EED_Events_Archive
57
+	 */
58
+	public static function instance()
59
+	{
60
+		return parent::get_instance(__CLASS__);
61
+	}
62
+
63
+
64
+	/**
65
+	 * set_hooks - for hooking into EE Core, other modules, etc
66
+	 *
67
+	 * @return void
68
+	 * @throws InvalidArgumentException
69
+	 * @throws InvalidDataTypeException
70
+	 * @throws InvalidInterfaceException
71
+	 */
72
+	public static function set_hooks()
73
+	{
74
+		/** @var EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions $custom_post_type_definitions */
75
+		$custom_post_type_definitions = LoaderFactory::getLoader()->getShared(
76
+			'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'
77
+		);
78
+		$custom_post_types = $custom_post_type_definitions->getDefinitions();
79
+		EE_Config::register_route(
80
+			$custom_post_types['espresso_events']['plural_slug'],
81
+			'Events_Archive',
82
+			'run'
83
+		);
84
+		EE_Config::register_route(
85
+			'event_list',
86
+			'Events_Archive',
87
+			'event_list'
88
+		);
89
+		EE_Config::register_route(
90
+			'iframe',
91
+			'Events_Archive',
92
+			'event_list_iframe',
93
+			'event_list'
94
+		);
95
+		add_action('wp_loaded', array('EED_Events_Archive', 'set_definitions'), 2);
96
+	}
97
+
98
+
99
+	/**
100
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
101
+	 *
102
+	 * @access    public
103
+	 * @return    void
104
+	 */
105
+	public static function set_hooks_admin()
106
+	{
107
+		add_action('wp_loaded', array('EED_Events_Archive', 'set_definitions'), 2);
108
+		// hook into the end of the \EE_Admin_Page::_load_page_dependencies()
109
+		// to load assets for "espresso_events" page on the "default" route (action)
110
+		add_action(
111
+			'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_events__default',
112
+			array('EED_Events_Archive', 'event_list_iframe_embed_button'),
113
+			10
114
+		);
115
+	}
116
+
117
+
118
+	/**
119
+	 *    set_definitions
120
+	 *
121
+	 * @access    public
122
+	 * @return    void
123
+	 */
124
+	public static function set_definitions()
125
+	{
126
+		define('EVENTS_ARCHIVE_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
127
+		define('EVENTS_ARCHIVE_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/');
128
+	}
129
+
130
+
131
+	/**
132
+	 * set up EE_Events_Archive_Config
133
+	 */
134
+	protected function set_config()
135
+	{
136
+		$this->set_config_section('template_settings');
137
+		$this->set_config_class('EE_Events_Archive_Config');
138
+		$this->set_config_name('EED_Events_Archive');
139
+	}
140
+
141
+
142
+	/**
143
+	 * @return EventListIframeEmbedButton
144
+	 */
145
+	public static function get_iframe_embed_button()
146
+	{
147
+		if (! self::$_iframe_embed_button instanceof EventListIframeEmbedButton) {
148
+			self::$_iframe_embed_button = new EventListIframeEmbedButton();
149
+		}
150
+		return self::$_iframe_embed_button;
151
+	}
152
+
153
+
154
+	/**
155
+	 * event_list_iframe_embed_button
156
+	 *
157
+	 * @return    void
158
+	 * @throws \EE_Error
159
+	 */
160
+	public static function event_list_iframe_embed_button()
161
+	{
162
+		$iframe_embed_button = \EED_Events_Archive::get_iframe_embed_button();
163
+		$iframe_embed_button->addEmbedButton();
164
+	}
165
+
166
+
167
+	/**
168
+	 *    initialize_template_parts
169
+	 *
170
+	 * @access    public
171
+	 * @param \EE_Events_Archive_Config $config
172
+	 * @return \EE_Template_Part_Manager
173
+	 */
174
+	public function initialize_template_parts(EE_Events_Archive_Config $config = null)
175
+	{
176
+		$config = $config instanceof EE_Events_Archive_Config ? $config : $this->config();
177
+		EEH_Autoloader::instance()->register_template_part_autoloaders();
178
+		$template_parts = new EE_Template_Part_Manager();
179
+		$template_parts->add_template_part(
180
+			'tickets',
181
+			__('Ticket Selector', 'event_espresso'),
182
+			'content-espresso_events-tickets.php',
183
+			$config->display_order_tickets
184
+		);
185
+		$template_parts->add_template_part(
186
+			'datetimes',
187
+			__('Dates and Times', 'event_espresso'),
188
+			'content-espresso_events-datetimes.php',
189
+			$config->display_order_datetimes
190
+		);
191
+		$template_parts->add_template_part(
192
+			'event',
193
+			__('Event Description', 'event_espresso'),
194
+			'content-espresso_events-details.php',
195
+			$config->display_order_event
196
+		);
197
+		$template_parts->add_template_part(
198
+			'venue',
199
+			__('Venue Information', 'event_espresso'),
200
+			'content-espresso_events-venues.php',
201
+			$config->display_order_venue
202
+		);
203
+		do_action('AHEE__EED_Event_Archive__initialize_template_parts', $template_parts);
204
+		return $template_parts;
205
+	}
206
+
207
+
208
+	/**
209
+	 *    run - initial module setup - this gets called by the EE_Front_Controller if the module route is found in the
210
+	 *    incoming request
211
+	 *
212
+	 * @access    public
213
+	 * @param WP $WP
214
+	 * @return    void
215
+	 */
216
+	public function run($WP)
217
+	{
218
+		do_action('AHEE__EED_Events_Archive__before_run');
219
+		// ensure valid EE_Events_Archive_Config() object exists
220
+		$this->set_config();
221
+		/** @type EE_Events_Archive_Config $config */
222
+		$config = $this->config();
223
+		// load other required components
224
+		$this->load_event_list_assets();
225
+		// filter the WP posts_join, posts_where, and posts_orderby SQL clauses
226
+		// add query filters
227
+		EEH_Event_Query::add_query_filters();
228
+		// set params that will get used by the filters
229
+		EEH_Event_Query::set_query_params(
230
+			'',    // month
231
+			'',    // category
232
+			$config->display_expired_events,    // show_expired
233
+			'start_date',    // orderby
234
+			'ASC'    // sort
235
+		);
236
+		// check what template is loaded
237
+		add_filter('template_include', array($this, 'template_include'), 999, 1);
238
+	}
239
+
240
+
241
+	/**
242
+	 * most likely called by the ESPRESSO_EVENTS shortcode which uses this module to do some of it's lifting
243
+	 *
244
+	 * @return    void
245
+	 */
246
+	public function event_list()
247
+	{
248
+		// ensure valid EE_Events_Archive_Config() object exists
249
+		$this->set_config();
250
+		// load other required components
251
+		$this->load_event_list_assets();
252
+	}
253
+
254
+
255
+	/**
256
+	 * @access    public
257
+	 * @return    void
258
+	 * @throws \EE_Error
259
+	 * @throws \DomainException
260
+	 */
261
+	public function event_list_iframe()
262
+	{
263
+		\EED_Events_Archive::$iframe = true;
264
+		$event_list_iframe = new EventsArchiveIframe($this);
265
+		$event_list_iframe->display();
266
+	}
267
+
268
+
269
+	/**
270
+	 * @access public
271
+	 * @return string
272
+	 */
273
+	public static function is_iframe()
274
+	{
275
+		return \EED_Events_Archive::$iframe;
276
+	}
277
+
278
+
279
+	/**
280
+	 * @access public
281
+	 * @return string
282
+	 */
283
+	public static function link_target()
284
+	{
285
+		return \EED_Events_Archive::$iframe ? ' target="_blank"' : '';
286
+	}
287
+
288
+
289
+	/**
290
+	 *    template_include
291
+	 *
292
+	 * @access    public
293
+	 * @param string $template
294
+	 * @return    string
295
+	 */
296
+	public function template_include($template = '')
297
+	{
298
+		// don't add content filter for dedicated EE child themes or private posts
299
+		if (! EEH_Template::is_espresso_theme()) {
300
+			/** @type EE_Events_Archive_Config $config */
301
+			$config = $this->config();
302
+			// add status banner ?
303
+			if ($config->display_status_banner) {
304
+				add_filter('the_title', array('EED_Events_Archive', 'the_title'), 100, 2);
305
+			}
306
+			// if NOT a custom template
307
+			if (apply_filters('FHEE__EED_Event_Archive__template_include__allow_custom_selected_template', false)
308
+				|| EE_Registry::instance()
309
+							  ->load_core('Front_Controller')
310
+							  ->get_selected_template() !== 'archive-espresso_events.php'
311
+			) {
312
+				// don't display entry meta because the existing theme will take care of that
313
+				add_filter('FHEE__EED_Events_Archive__template_include__events_list_active', '__return_true');
314
+				// load functions.php file for the theme (loaded by WP if using child theme)
315
+				EEH_Template::load_espresso_theme_functions();
316
+				// because we don't know if the theme is using the_excerpt()
317
+				add_filter(
318
+					'the_excerpt',
319
+					array('EED_Events_Archive', 'event_details'),
320
+					EED_Events_Archive::EVENT_DETAILS_PRIORITY
321
+				);
322
+				// or the_content
323
+				add_filter(
324
+					'the_content',
325
+					array('EED_Events_Archive', 'event_details'),
326
+					EED_Events_Archive::EVENT_DETAILS_PRIORITY
327
+				);
328
+				// and just in case they are running get_the_excerpt() which DESTROYS things
329
+				add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
330
+				// don't display entry meta because the existing theme will take care of that
331
+				add_filter('FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false');
332
+			}
333
+		}
334
+		return $template;
335
+	}
336
+
337
+
338
+	/**
339
+	 *    get_the_excerpt - kinda hacky, but if a theme is using get_the_excerpt(), then we need to remove our filters
340
+	 *    on the_content()
341
+	 *
342
+	 * @access    public
343
+	 * @param        string $excerpt
344
+	 * @return        string
345
+	 */
346
+	public static function get_the_excerpt($excerpt = '')
347
+	{
348
+		if (post_password_required()) {
349
+			return $excerpt;
350
+		}
351
+		if (apply_filters('FHEE__EED_Events_Archive__get_the_excerpt__theme_uses_get_the_excerpt', false)) {
352
+			remove_filter(
353
+				'the_excerpt',
354
+				array('EED_Events_Archive', 'event_details'),
355
+				EED_Events_Archive::EVENT_DETAILS_PRIORITY
356
+			);
357
+			remove_filter(
358
+				'the_content',
359
+				array('EED_Events_Archive', 'event_details'),
360
+				EED_Events_Archive::EVENT_DETAILS_PRIORITY
361
+			);
362
+			$excerpt = EED_Events_Archive::event_details($excerpt);
363
+		} else {
364
+			EED_Events_Archive::$using_get_the_excerpt = true;
365
+			add_filter('wp_trim_excerpt', array('EED_Events_Archive', 'end_get_the_excerpt'), 999, 1);
366
+		}
367
+		return $excerpt;
368
+	}
369
+
370
+
371
+	/**
372
+	 * end_get_the_excerpt
373
+	 *
374
+	 * @access public
375
+	 * @param  string $text
376
+	 * @return string
377
+	 */
378
+	public static function end_get_the_excerpt($text = '')
379
+	{
380
+		EED_Events_Archive::$using_get_the_excerpt = false;
381
+		return $text;
382
+	}
383
+
384
+
385
+	/**
386
+	 *    the_title
387
+	 *
388
+	 * @access        public
389
+	 * @param        string $title
390
+	 * @param        string $id
391
+	 * @return        string
392
+	 */
393
+	public static function the_title($title = '', $id = '')
394
+	{
395
+		global $post;
396
+		if ($post instanceof WP_Post) {
397
+			return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID) . $title : $title;
398
+		}
399
+		return $title;
400
+	}
401
+
402
+
403
+	/**
404
+	 *    event_details
405
+	 *
406
+	 * @access    public
407
+	 * @param        string $content
408
+	 * @return        string
409
+	 */
410
+	public static function event_details($content)
411
+	{
412
+		global $post;
413
+		static $current_post_ID = 0;
414
+		if ($current_post_ID !== $post->ID
415
+			&& $post->post_type === 'espresso_events'
416
+			&& ! EED_Events_Archive::$using_get_the_excerpt
417
+			&& ! post_password_required()
418
+			&& (
419
+				apply_filters('FHEE__EES_Espresso_Events__process_shortcode__true', false)
420
+				|| ! apply_filters('FHEE__content_espresso_events__template_loaded', false)
421
+			)
422
+		) {
423
+			// Set current post ID to prevent showing content twice, but only if headers have definitely been sent.
424
+			// Reason being is that some plugins, like Yoast, need to run through a copy of the loop early
425
+			// BEFORE headers are sent in order to examine the post content and generate content for the HTML header.
426
+			// We want to allow those plugins to still do their thing and have access to our content, but depending on
427
+			// how your event content is being displayed (shortcode, CPT route, etc), this filter can get applied twice,
428
+			// so the following allows this filter to be applied multiple times, but only once for real
429
+			$current_post_ID = did_action('loop_start') ? $post->ID : 0;
430
+			if (EE_Registry::instance()->CFG->template_settings->EED_Events_Archive->use_sortable_display_order) {
431
+				$content = \EED_Events_Archive::use_sortable_display_order();
432
+			} else {
433
+				$content = \EED_Events_Archive::use_filterable_display_order();
434
+			}
435
+		}
436
+		return $content;
437
+	}
438
+
439
+
440
+	/**
441
+	 *    use_sortable_display_order
442
+	 *
443
+	 * @access    protected
444
+	 * @return string
445
+	 */
446
+	protected static function use_sortable_display_order()
447
+	{
448
+		// no further password checks required atm
449
+		add_filter('FHEE__EED_Events_Archive__event_details__no_post_password_required', '__return_true');
450
+		// we need to first remove this callback from being applied to the_content() or the_excerpt()
451
+		// (otherwise it will recurse and blow up the interweb)
452
+		remove_filter(
453
+			'the_excerpt',
454
+			array('EED_Events_Archive', 'event_details'),
455
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
456
+		);
457
+		remove_filter(
458
+			'the_content',
459
+			array('EED_Events_Archive', 'event_details'),
460
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
461
+		);
462
+		remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
463
+		// now add additional content depending on whether event is using the_excerpt() or the_content()
464
+		EED_Events_Archive::instance()->template_parts = EED_Events_Archive::instance()->initialize_template_parts();
465
+		$content = EEH_Template::locate_template('content-espresso_events-details.php');
466
+		$content = EED_Events_Archive::instance()->template_parts->apply_template_part_filters($content);
467
+		// re-add our main filters (or else the next event won't have them)
468
+		add_filter(
469
+			'the_excerpt',
470
+			array('EED_Events_Archive', 'event_details'),
471
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
472
+		);
473
+		add_filter(
474
+			'the_content',
475
+			array('EED_Events_Archive', 'event_details'),
476
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
477
+		);
478
+		add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
479
+		remove_filter(
480
+			'FHEE__EED_Events_Archive__event_details__no_post_password_required',
481
+			'__return_true'
482
+		);
483
+		return $content;
484
+	}
485
+
486
+
487
+	/**
488
+	 *    use_filterable_display_order
489
+	 *
490
+	 * @access    protected
491
+	 * @return    string
492
+	 */
493
+	protected static function use_filterable_display_order()
494
+	{
495
+		// we need to first remove this callback from being applied to the_content()
496
+		// (otherwise it will recurse and blow up the interweb)
497
+		remove_filter(
498
+			'the_excerpt',
499
+			array('EED_Events_Archive', 'event_details'),
500
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
501
+		);
502
+		remove_filter(
503
+			'the_content',
504
+			array('EED_Events_Archive', 'event_details'),
505
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
506
+		);
507
+		remove_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1);
508
+		// now add additional content depending on whether event is using the_excerpt() or the_content()
509
+		EED_Events_Archive::_add_additional_excerpt_filters();
510
+		EED_Events_Archive::_add_additional_content_filters();
511
+		do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_add_filters');
512
+		// now load our template
513
+		$content = EEH_Template::locate_template('content-espresso_events-details.php');
514
+		// re-add our main filters (or else the next event won't have them)
515
+		add_filter(
516
+			'the_excerpt',
517
+			array('EED_Events_Archive', 'event_details'),
518
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
519
+		);
520
+		add_filter(
521
+			'the_content',
522
+			array('EED_Events_Archive', 'event_details'),
523
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
524
+		);
525
+		add_filter('get_the_excerpt', array('EED_Events_Archive', 'get_the_excerpt'), 1, 1);
526
+		// but remove the other filters so that they don't get applied to the next post
527
+		EED_Events_Archive::_remove_additional_events_archive_filters();
528
+		do_action('AHEE__EED_Events_Archive__use_filterable_display_order__after_remove_filters');
529
+		// we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt)
530
+		// return ! empty( $template ) ? $template : $content;
531
+		return $content;
532
+	}
533
+
534
+
535
+	/**
536
+	 *    event_datetimes - adds datetimes ABOVE content
537
+	 *
538
+	 * @access    public
539
+	 * @param        string $content
540
+	 * @return        string
541
+	 */
542
+	public static function event_datetimes($content)
543
+	{
544
+		if (post_password_required()) {
545
+			return $content;
546
+		}
547
+		return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
548
+	}
549
+
550
+
551
+	/**
552
+	 *    event_tickets - adds tickets ABOVE content (which includes datetimes)
553
+	 *
554
+	 * @access    public
555
+	 * @param        string $content
556
+	 * @return        string
557
+	 */
558
+	public static function event_tickets($content)
559
+	{
560
+		if (post_password_required()) {
561
+			return $content;
562
+		}
563
+		return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
564
+	}
565
+
566
+
567
+	/**
568
+	 *    event_venues - adds venues BELOW content
569
+	 *
570
+	 * @access    public
571
+	 * @param    string $content
572
+	 * @return    string
573
+	 */
574
+	public static function event_venue($content)
575
+	{
576
+		return EED_Events_Archive::event_venues($content);
577
+	}
578
+
579
+
580
+	/**
581
+	 *    event_venues - adds venues BELOW content
582
+	 *
583
+	 * @access    public
584
+	 * @param        string $content
585
+	 * @return        string
586
+	 */
587
+	public static function event_venues($content)
588
+	{
589
+		if (post_password_required()) {
590
+			return $content;
591
+		}
592
+		return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
593
+	}
594
+
595
+
596
+	/**
597
+	 *    _add_additional_content_filters
598
+	 *
599
+	 * @access    private
600
+	 * @return        void
601
+	 */
602
+	private static function _add_additional_excerpt_filters()
603
+	{
604
+		add_filter(
605
+			'the_excerpt',
606
+			array('EED_Events_Archive', 'event_datetimes'),
607
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
608
+		);
609
+		add_filter(
610
+			'the_excerpt',
611
+			array('EED_Events_Archive', 'event_tickets'),
612
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
613
+		);
614
+		add_filter(
615
+			'the_excerpt',
616
+			array('EED_Events_Archive', 'event_venues'),
617
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
618
+		);
619
+	}
620
+
621
+
622
+	/**
623
+	 *    _add_additional_content_filters
624
+	 *
625
+	 * @access    private
626
+	 * @return        void
627
+	 */
628
+	private static function _add_additional_content_filters()
629
+	{
630
+		add_filter(
631
+			'the_content',
632
+			array('EED_Events_Archive', 'event_datetimes'),
633
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
634
+		);
635
+		add_filter(
636
+			'the_content',
637
+			array('EED_Events_Archive', 'event_tickets'),
638
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
639
+		);
640
+		add_filter(
641
+			'the_content',
642
+			array('EED_Events_Archive', 'event_venues'),
643
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
644
+		);
645
+	}
646
+
647
+
648
+	/**
649
+	 *    _remove_additional_events_archive_filters
650
+	 *
651
+	 * @access    private
652
+	 * @return        void
653
+	 */
654
+	private static function _remove_additional_events_archive_filters()
655
+	{
656
+		remove_filter(
657
+			'the_excerpt',
658
+			array('EED_Events_Archive', 'event_datetimes'),
659
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
660
+		);
661
+		remove_filter(
662
+			'the_excerpt',
663
+			array('EED_Events_Archive', 'event_tickets'),
664
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
665
+		);
666
+		remove_filter(
667
+			'the_excerpt',
668
+			array('EED_Events_Archive', 'event_venues'),
669
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
670
+		);
671
+		remove_filter(
672
+			'the_content',
673
+			array('EED_Events_Archive', 'event_datetimes'),
674
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
675
+		);
676
+		remove_filter(
677
+			'the_content',
678
+			array('EED_Events_Archive', 'event_tickets'),
679
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
680
+		);
681
+		remove_filter(
682
+			'the_content',
683
+			array('EED_Events_Archive', 'event_venues'),
684
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
685
+		);
686
+	}
687
+
688
+
689
+	/**
690
+	 *    remove_all_events_archive_filters
691
+	 *
692
+	 * @access    public
693
+	 * @return        void
694
+	 */
695
+	public static function remove_all_events_archive_filters()
696
+	{
697
+		// remove_filter( 'get_the_excerpt', array( 'EED_Events_Archive', 'get_the_excerpt' ), 1 );
698
+		remove_filter('the_title', array('EED_Events_Archive', 'the_title'), 1);
699
+		remove_filter(
700
+			'the_excerpt',
701
+			array('EED_Events_Archive', 'event_details'),
702
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
703
+		);
704
+		remove_filter(
705
+			'the_excerpt',
706
+			array('EED_Events_Archive', 'event_datetimes'),
707
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
708
+		);
709
+		remove_filter(
710
+			'the_excerpt',
711
+			array('EED_Events_Archive', 'event_tickets'),
712
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
713
+		);
714
+		remove_filter(
715
+			'the_excerpt',
716
+			array('EED_Events_Archive', 'event_venues'),
717
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
718
+		);
719
+		remove_filter(
720
+			'the_content',
721
+			array('EED_Events_Archive', 'event_details'),
722
+			EED_Events_Archive::EVENT_DETAILS_PRIORITY
723
+		);
724
+		remove_filter(
725
+			'the_content',
726
+			array('EED_Events_Archive', 'event_datetimes'),
727
+			EED_Events_Archive::EVENT_DATETIMES_PRIORITY
728
+		);
729
+		remove_filter(
730
+			'the_content',
731
+			array('EED_Events_Archive', 'event_tickets'),
732
+			EED_Events_Archive::EVENT_TICKETS_PRIORITY
733
+		);
734
+		remove_filter(
735
+			'the_content',
736
+			array('EED_Events_Archive', 'event_venues'),
737
+			EED_Events_Archive::EVENT_VENUES_PRIORITY
738
+		);
739
+		// don't display entry meta because the existing theme will take care of that
740
+		remove_filter(
741
+			'FHEE__content_espresso_events_details_template__display_entry_meta',
742
+			'__return_false'
743
+		);
744
+	}
745
+
746
+
747
+	/**
748
+	 *    load_event_list_assets
749
+	 *
750
+	 * @access    public
751
+	 * @return    void
752
+	 */
753
+	public function load_event_list_assets()
754
+	{
755
+		do_action('AHEE__EED_Events_Archive__before_load_assets');
756
+		add_filter('FHEE_load_EE_Session', '__return_true');
757
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
758
+		add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
759
+		if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
760
+			add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
761
+		}
762
+	}
763
+
764
+
765
+	/**
766
+	 *    wp_enqueue_scripts
767
+	 *
768
+	 * @access    public
769
+	 * @return    void
770
+	 */
771
+	public function wp_enqueue_scripts()
772
+	{
773
+		// get some style
774
+		if (apply_filters('FHEE_enable_default_espresso_css', false)) {
775
+			// first check uploads folder
776
+			if (EEH_File::is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
777
+				wp_register_style(
778
+					$this->theme,
779
+					get_stylesheet_directory_uri() . $this->theme . '/style.css',
780
+					array('dashicons', 'espresso_default')
781
+				);
782
+			} else {
783
+			}
784
+			wp_enqueue_style($this->theme);
785
+		}
786
+	}
787
+
788
+
789
+	/**
790
+	 *    template_settings_form
791
+	 *
792
+	 * @access    public
793
+	 * @static
794
+	 * @return    string
795
+	 */
796
+	public static function template_settings_form()
797
+	{
798
+		$template_settings = EE_Registry::instance()->CFG->template_settings;
799
+		$template_settings->EED_Events_Archive = isset($template_settings->EED_Events_Archive)
800
+			? $template_settings->EED_Events_Archive : new EE_Events_Archive_Config();
801
+		$template_settings->EED_Events_Archive = apply_filters(
802
+			'FHEE__EED_Events_Archive__template_settings_form__event_list_config',
803
+			$template_settings->EED_Events_Archive
804
+		);
805
+		$events_archive_settings = array(
806
+			'display_status_banner' => 0,
807
+			'display_description' => 1,
808
+			'display_ticket_selector' => 0,
809
+			'display_datetimes' => 1,
810
+			'display_venue' => 0,
811
+			'display_expired_events' => 0,
812
+		);
813
+		$events_archive_settings = array_merge(
814
+			$events_archive_settings,
815
+			(array) $template_settings->EED_Events_Archive
816
+		);
817
+		EEH_Template::display_template(
818
+			EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
819
+			$events_archive_settings
820
+		);
821
+	}
822
+
823
+
824
+	/**
825
+	 *    update_template_settings
826
+	 *
827
+	 * @access    public
828
+	 * @param    EE_Template_Config $CFG
829
+	 * @param    EE_Request_Handler $REQ
830
+	 * @return    EE_Template_Config
831
+	 */
832
+	public static function update_template_settings($CFG, $REQ)
833
+	{
834
+		$CFG->EED_Events_Archive = new EE_Events_Archive_Config();
835
+		// unless we are resetting the config...
836
+		if (! isset($REQ['EED_Events_Archive_reset_event_list_settings'])
837
+			|| absint($REQ['EED_Events_Archive_reset_event_list_settings']) !== 1
838
+		) {
839
+			$CFG->EED_Events_Archive->display_status_banner = isset($REQ['EED_Events_Archive_display_status_banner'])
840
+				? absint($REQ['EED_Events_Archive_display_status_banner']) : 0;
841
+			$CFG->EED_Events_Archive->display_description = isset($REQ['EED_Events_Archive_display_description'])
842
+				? absint($REQ['EED_Events_Archive_display_description']) : 1;
843
+			$CFG->EED_Events_Archive->display_ticket_selector = isset($REQ['EED_Events_Archive_display_ticket_selector'])
844
+				? absint($REQ['EED_Events_Archive_display_ticket_selector']) : 0;
845
+			$CFG->EED_Events_Archive->display_datetimes = isset($REQ['EED_Events_Archive_display_datetimes']) ? absint(
846
+				$REQ['EED_Events_Archive_display_datetimes']
847
+			) : 1;
848
+			$CFG->EED_Events_Archive->display_venue = isset($REQ['EED_Events_Archive_display_venue']) ? absint(
849
+				$REQ['EED_Events_Archive_display_venue']
850
+			) : 0;
851
+			$CFG->EED_Events_Archive->display_expired_events = isset($REQ['EED_Events_Archive_display_expired_events'])
852
+				? absint($REQ['EED_Events_Archive_display_expired_events']) : 0;
853
+		}
854
+		return $CFG;
855
+	}
856
+
857
+
858
+	/**
859
+	 *    event_list_css
860
+	 *
861
+	 * @access    public
862
+	 * @param string $extra_class
863
+	 * @return    string
864
+	 */
865
+	public static function event_list_css($extra_class = '')
866
+	{
867
+		$event_list_css = ! empty($extra_class) ? array($extra_class) : array();
868
+		$event_list_css[] = 'espresso-event-list-event';
869
+		return implode(' ', $event_list_css);
870
+	}
871
+
872
+
873
+	/**
874
+	 *    event_categories
875
+	 *
876
+	 * @access    public
877
+	 * @return    array
878
+	 */
879
+	public static function event_categories()
880
+	{
881
+		return EE_Registry::instance()->load_model('Term')->get_all_ee_categories();
882
+	}
883
+
884
+
885
+	/**
886
+	 *    display_description
887
+	 *
888
+	 * @access    public
889
+	 * @param $value
890
+	 * @return    bool
891
+	 */
892
+	public static function display_description($value)
893
+	{
894
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
895
+		$display_description = isset($config->display_description) ? $config->display_description : 1;
896
+		return $display_description === $value ? true : false;
897
+	}
898
+
899
+
900
+	/**
901
+	 *    display_ticket_selector
902
+	 *
903
+	 * @access    public
904
+	 * @return    bool
905
+	 */
906
+	public static function display_ticket_selector()
907
+	{
908
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
909
+		return isset($config->display_ticket_selector) && $config->display_ticket_selector ? true : false;
910
+	}
911
+
912
+
913
+	/**
914
+	 *    display_venue
915
+	 *
916
+	 * @access    public
917
+	 * @return    bool
918
+	 */
919
+	public static function display_venue()
920
+	{
921
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
922
+		return isset($config->display_venue) && $config->display_venue && EEH_Venue_View::venue_name() ? true : false;
923
+	}
924
+
925
+
926
+	/**
927
+	 *    display_datetimes
928
+	 *
929
+	 * @access    public
930
+	 * @return    bool
931
+	 */
932
+	public static function display_datetimes()
933
+	{
934
+		$config = EE_Registry::instance()->CFG->template_settings->EED_Events_Archive;
935
+		return isset($config->display_datetimes) && $config->display_datetimes ? true : false;
936
+	}
937
+
938
+
939
+	/**
940
+	 *    event_list_title
941
+	 *
942
+	 * @access    public
943
+	 * @return    string
944
+	 */
945
+	public static function event_list_title()
946
+	{
947
+		return apply_filters(
948
+			'FHEE__archive_espresso_events_template__upcoming_events_h1',
949
+			__('Upcoming Events', 'event_espresso')
950
+		);
951
+	}
952
+
953
+
954
+	// GRAVEYARD
955
+
956
+
957
+	/**
958
+	 * @since 4.4.0
959
+	 */
960
+	public static function _doing_it_wrong_notice($function = '')
961
+	{
962
+		EE_Error::doing_it_wrong(
963
+			__FUNCTION__,
964
+			sprintf(
965
+				__(
966
+					'EED_Events_Archive::%1$s was moved to EEH_Event_Query::%1$s:%2$sPlease update your existing code because the method it calls will be removed in version %3$s',
967
+					'event_espresso'
968
+				),
969
+				$function,
970
+				'<br />',
971
+				'4.6.0'
972
+			),
973
+			'4.4.0'
974
+		);
975
+	}
976
+
977
+
978
+	/**
979
+	 * @deprecated
980
+	 * @since 4.4.0
981
+	 */
982
+	public function get_post_data()
983
+	{
984
+		EEH_Event_Query::set_query_params();
985
+	}
986
+
987
+
988
+	/**
989
+	 * @deprecated
990
+	 * @since 4.4.0
991
+	 */
992
+	public function posts_fields($SQL, WP_Query $wp_query)
993
+	{
994
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
995
+		return EEH_Event_Query::posts_fields($SQL, $wp_query);
996
+	}
997
+
998
+
999
+	/**
1000
+	 * @deprecated
1001
+	 * @since 4.4.0
1002
+	 */
1003
+	public static function posts_fields_sql_for_orderby($orderby_params = array())
1004
+	{
1005
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1006
+		return EEH_Event_Query::posts_fields_sql_for_orderby($orderby_params);
1007
+	}
1008
+
1009
+
1010
+	/**
1011
+	 * @deprecated
1012
+	 * @since 4.4.0
1013
+	 */
1014
+	public function posts_join($SQL, WP_Query $wp_query)
1015
+	{
1016
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1017
+		return EEH_Event_Query::posts_join($SQL, $wp_query);
1018
+	}
1019
+
1020
+
1021
+	/**
1022
+	 * @deprecated
1023
+	 * @since 4.4.0
1024
+	 */
1025
+	public static function posts_join_sql_for_terms($join_terms = null)
1026
+	{
1027
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1028
+		return EEH_Event_Query::posts_join_sql_for_terms($join_terms);
1029
+	}
1030
+
1031
+
1032
+	/**
1033
+	 * @deprecated
1034
+	 * @since 4.4.0
1035
+	 */
1036
+	public static function posts_join_for_orderby($orderby_params = array())
1037
+	{
1038
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1039
+		return EEH_Event_Query::posts_join_for_orderby($orderby_params);
1040
+	}
1041
+
1042
+
1043
+	/**
1044
+	 * @deprecated
1045
+	 * @since 4.4.0
1046
+	 */
1047
+	public function posts_where($SQL, WP_Query $wp_query)
1048
+	{
1049
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1050
+		return EEH_Event_Query::posts_where($SQL, $wp_query);
1051
+	}
1052
+
1053
+
1054
+	/**
1055
+	 * @deprecated
1056
+	 * @since 4.4.0
1057
+	 */
1058
+	public static function posts_where_sql_for_show_expired($show_expired = false)
1059
+	{
1060
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1061
+		return EEH_Event_Query::posts_where_sql_for_show_expired($show_expired);
1062
+	}
1063
+
1064
+
1065
+	/**
1066
+	 * @deprecated
1067
+	 * @since 4.4.0
1068
+	 */
1069
+	public static function posts_where_sql_for_event_category_slug($event_category_slug = null)
1070
+	{
1071
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1072
+		return EEH_Event_Query::posts_where_sql_for_event_category_slug($event_category_slug);
1073
+	}
1074
+
1075
+
1076
+	/**
1077
+	 * @deprecated
1078
+	 * @since 4.4.0
1079
+	 */
1080
+	public static function posts_where_sql_for_event_list_month($month = null)
1081
+	{
1082
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1083
+		return EEH_Event_Query::posts_where_sql_for_event_list_month($month);
1084
+	}
1085
+
1086
+
1087
+	/**
1088
+	 * @deprecated
1089
+	 * @since 4.4.0
1090
+	 */
1091
+	public function posts_orderby($SQL, WP_Query $wp_query)
1092
+	{
1093
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1094
+		return EEH_Event_Query::posts_orderby($SQL, $wp_query);
1095
+	}
1096
+
1097
+
1098
+	/**
1099
+	 * @deprecated
1100
+	 * @since 4.4.0
1101
+	 */
1102
+	public static function posts_orderby_sql($orderby_params = array(), $sort = 'ASC')
1103
+	{
1104
+		EED_Events_Archive::_doing_it_wrong_notice(__FUNCTION__);
1105
+		return EEH_Event_Query::posts_orderby_sql($orderby_params, $sort);
1106
+	}
1107 1107
 }
1108 1108
 
1109 1109
 
@@ -1112,9 +1112,9 @@  discard block
 block discarded – undo
1112 1112
  */
1113 1113
 function espresso_get_event_list_ID()
1114 1114
 {
1115
-    EED_Events_Archive::$espresso_event_list_ID++;
1116
-    EED_Events_Archive::$espresso_grid_event_lists[] = EED_Events_Archive::$espresso_event_list_ID;
1117
-    return EED_Events_Archive::$espresso_event_list_ID;
1115
+	EED_Events_Archive::$espresso_event_list_ID++;
1116
+	EED_Events_Archive::$espresso_grid_event_lists[] = EED_Events_Archive::$espresso_event_list_ID;
1117
+	return EED_Events_Archive::$espresso_event_list_ID;
1118 1118
 }
1119 1119
 
1120 1120
 /**
@@ -1122,7 +1122,7 @@  discard block
 block discarded – undo
1122 1122
  */
1123 1123
 function espresso_event_list_title()
1124 1124
 {
1125
-    return EED_Events_Archive::event_list_title();
1125
+	return EED_Events_Archive::event_list_title();
1126 1126
 }
1127 1127
 
1128 1128
 /**
@@ -1131,7 +1131,7 @@  discard block
 block discarded – undo
1131 1131
  */
1132 1132
 function espresso_event_list_css($extra_class = '')
1133 1133
 {
1134
-    return EED_Events_Archive::event_list_css($extra_class);
1134
+	return EED_Events_Archive::event_list_css($extra_class);
1135 1135
 }
1136 1136
 
1137 1137
 /**
@@ -1139,7 +1139,7 @@  discard block
 block discarded – undo
1139 1139
  */
1140 1140
 function espresso_get_event_categories()
1141 1141
 {
1142
-    return EED_Events_Archive::event_categories();
1142
+	return EED_Events_Archive::event_categories();
1143 1143
 }
1144 1144
 
1145 1145
 /**
@@ -1147,7 +1147,7 @@  discard block
 block discarded – undo
1147 1147
  */
1148 1148
 function espresso_display_full_description_in_event_list()
1149 1149
 {
1150
-    return EED_Events_Archive::display_description(2);
1150
+	return EED_Events_Archive::display_description(2);
1151 1151
 }
1152 1152
 
1153 1153
 /**
@@ -1155,7 +1155,7 @@  discard block
 block discarded – undo
1155 1155
  */
1156 1156
 function espresso_display_excerpt_in_event_list()
1157 1157
 {
1158
-    return EED_Events_Archive::display_description(1);
1158
+	return EED_Events_Archive::display_description(1);
1159 1159
 }
1160 1160
 
1161 1161
 /**
@@ -1163,7 +1163,7 @@  discard block
 block discarded – undo
1163 1163
  */
1164 1164
 function espresso_display_ticket_selector_in_event_list()
1165 1165
 {
1166
-    return EED_Events_Archive::display_ticket_selector();
1166
+	return EED_Events_Archive::display_ticket_selector();
1167 1167
 }
1168 1168
 
1169 1169
 /**
@@ -1171,7 +1171,7 @@  discard block
 block discarded – undo
1171 1171
  */
1172 1172
 function espresso_display_venue_in_event_list()
1173 1173
 {
1174
-    return EED_Events_Archive::display_venue();
1174
+	return EED_Events_Archive::display_venue();
1175 1175
 }
1176 1176
 
1177 1177
 /**
@@ -1179,5 +1179,5 @@  discard block
 block discarded – undo
1179 1179
  */
1180 1180
 function espresso_display_datetimes_in_event_list()
1181 1181
 {
1182
-    return EED_Events_Archive::display_datetimes();
1182
+	return EED_Events_Archive::display_datetimes();
1183 1183
 }
Please login to merge, or discard this patch.
Spacing   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -123,8 +123,8 @@  discard block
 block discarded – undo
123 123
      */
124 124
     public static function set_definitions()
125 125
     {
126
-        define('EVENTS_ARCHIVE_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
127
-        define('EVENTS_ARCHIVE_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/');
126
+        define('EVENTS_ARCHIVE_ASSETS_URL', plugin_dir_url(__FILE__).'assets/');
127
+        define('EVENTS_ARCHIVE_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)).'templates/');
128 128
     }
129 129
 
130 130
 
@@ -144,7 +144,7 @@  discard block
 block discarded – undo
144 144
      */
145 145
     public static function get_iframe_embed_button()
146 146
     {
147
-        if (! self::$_iframe_embed_button instanceof EventListIframeEmbedButton) {
147
+        if ( ! self::$_iframe_embed_button instanceof EventListIframeEmbedButton) {
148 148
             self::$_iframe_embed_button = new EventListIframeEmbedButton();
149 149
         }
150 150
         return self::$_iframe_embed_button;
@@ -227,10 +227,10 @@  discard block
 block discarded – undo
227 227
         EEH_Event_Query::add_query_filters();
228 228
         // set params that will get used by the filters
229 229
         EEH_Event_Query::set_query_params(
230
-            '',    // month
231
-            '',    // category
232
-            $config->display_expired_events,    // show_expired
233
-            'start_date',    // orderby
230
+            '', // month
231
+            '', // category
232
+            $config->display_expired_events, // show_expired
233
+            'start_date', // orderby
234 234
             'ASC'    // sort
235 235
         );
236 236
         // check what template is loaded
@@ -296,7 +296,7 @@  discard block
 block discarded – undo
296 296
     public function template_include($template = '')
297 297
     {
298 298
         // don't add content filter for dedicated EE child themes or private posts
299
-        if (! EEH_Template::is_espresso_theme()) {
299
+        if ( ! EEH_Template::is_espresso_theme()) {
300 300
             /** @type EE_Events_Archive_Config $config */
301 301
             $config = $this->config();
302 302
             // add status banner ?
@@ -394,7 +394,7 @@  discard block
 block discarded – undo
394 394
     {
395 395
         global $post;
396 396
         if ($post instanceof WP_Post) {
397
-            return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID) . $title : $title;
397
+            return in_the_loop() && $post->ID == $id ? espresso_event_status_banner($post->ID).$title : $title;
398 398
         }
399 399
         return $title;
400 400
     }
@@ -544,7 +544,7 @@  discard block
 block discarded – undo
544 544
         if (post_password_required()) {
545 545
             return $content;
546 546
         }
547
-        return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
547
+        return EEH_Template::locate_template('content-espresso_events-datetimes.php').$content;
548 548
     }
549 549
 
550 550
 
@@ -560,7 +560,7 @@  discard block
 block discarded – undo
560 560
         if (post_password_required()) {
561 561
             return $content;
562 562
         }
563
-        return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
563
+        return EEH_Template::locate_template('content-espresso_events-tickets.php').$content;
564 564
     }
565 565
 
566 566
 
@@ -589,7 +589,7 @@  discard block
 block discarded – undo
589 589
         if (post_password_required()) {
590 590
             return $content;
591 591
         }
592
-        return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
592
+        return $content.EEH_Template::locate_template('content-espresso_events-venues.php');
593 593
     }
594 594
 
595 595
 
@@ -773,10 +773,10 @@  discard block
 block discarded – undo
773 773
         // get some style
774 774
         if (apply_filters('FHEE_enable_default_espresso_css', false)) {
775 775
             // first check uploads folder
776
-            if (EEH_File::is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
776
+            if (EEH_File::is_readable(get_stylesheet_directory().$this->theme.'/style.css')) {
777 777
                 wp_register_style(
778 778
                     $this->theme,
779
-                    get_stylesheet_directory_uri() . $this->theme . '/style.css',
779
+                    get_stylesheet_directory_uri().$this->theme.'/style.css',
780 780
                     array('dashicons', 'espresso_default')
781 781
                 );
782 782
             } else {
@@ -815,7 +815,7 @@  discard block
 block discarded – undo
815 815
             (array) $template_settings->EED_Events_Archive
816 816
         );
817 817
         EEH_Template::display_template(
818
-            EVENTS_ARCHIVE_TEMPLATES_PATH . 'admin-event-list-settings.template.php',
818
+            EVENTS_ARCHIVE_TEMPLATES_PATH.'admin-event-list-settings.template.php',
819 819
             $events_archive_settings
820 820
         );
821 821
     }
@@ -833,7 +833,7 @@  discard block
 block discarded – undo
833 833
     {
834 834
         $CFG->EED_Events_Archive = new EE_Events_Archive_Config();
835 835
         // unless we are resetting the config...
836
-        if (! isset($REQ['EED_Events_Archive_reset_event_list_settings'])
836
+        if ( ! isset($REQ['EED_Events_Archive_reset_event_list_settings'])
837 837
             || absint($REQ['EED_Events_Archive_reset_event_list_settings']) !== 1
838 838
         ) {
839 839
             $CFG->EED_Events_Archive->display_status_banner = isset($REQ['EED_Events_Archive_display_status_banner'])
Please login to merge, or discard this patch.
modules/single_page_checkout/EED_Single_Page_Checkout.module.php 2 patches
Indentation   +1796 added lines, -1796 removed lines patch added patch discarded remove patch
@@ -15,1800 +15,1800 @@
 block discarded – undo
15 15
 class EED_Single_Page_Checkout extends EED_Module
16 16
 {
17 17
 
18
-    /**
19
-     * $_initialized - has the SPCO controller already been initialized ?
20
-     *
21
-     * @access private
22
-     * @var bool $_initialized
23
-     */
24
-    private static $_initialized = false;
25
-
26
-
27
-    /**
28
-     * $_checkout_verified - is the EE_Checkout verified as correct for this request ?
29
-     *
30
-     * @access private
31
-     * @var bool $_valid_checkout
32
-     */
33
-    private static $_checkout_verified = true;
34
-
35
-    /**
36
-     *    $_reg_steps_array - holds initial array of reg steps
37
-     *
38
-     * @access private
39
-     * @var array $_reg_steps_array
40
-     */
41
-    private static $_reg_steps_array = array();
42
-
43
-    /**
44
-     *    $checkout - EE_Checkout object for handling the properties of the current checkout process
45
-     *
46
-     * @access public
47
-     * @var EE_Checkout $checkout
48
-     */
49
-    public $checkout;
50
-
51
-
52
-    /**
53
-     * @return EED_Module|EED_Single_Page_Checkout
54
-     */
55
-    public static function instance()
56
-    {
57
-        add_filter('EED_Single_Page_Checkout__SPCO_active', '__return_true');
58
-        return parent::get_instance(__CLASS__);
59
-    }
60
-
61
-
62
-    /**
63
-     * @return EE_CART
64
-     */
65
-    public function cart()
66
-    {
67
-        return $this->checkout->cart;
68
-    }
69
-
70
-
71
-    /**
72
-     * @return EE_Transaction
73
-     */
74
-    public function transaction()
75
-    {
76
-        return $this->checkout->transaction;
77
-    }
78
-
79
-
80
-    /**
81
-     *    set_hooks - for hooking into EE Core, other modules, etc
82
-     *
83
-     * @access    public
84
-     * @return    void
85
-     * @throws EE_Error
86
-     */
87
-    public static function set_hooks()
88
-    {
89
-        EED_Single_Page_Checkout::set_definitions();
90
-    }
91
-
92
-
93
-    /**
94
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
95
-     *
96
-     * @access    public
97
-     * @return    void
98
-     * @throws EE_Error
99
-     */
100
-    public static function set_hooks_admin()
101
-    {
102
-        EED_Single_Page_Checkout::set_definitions();
103
-        if (! (defined('DOING_AJAX') && DOING_AJAX)) {
104
-            return;
105
-        }
106
-        // going to start an output buffer in case anything gets accidentally output
107
-        // that might disrupt our JSON response
108
-        ob_start();
109
-        EED_Single_Page_Checkout::load_request_handler();
110
-        EED_Single_Page_Checkout::load_reg_steps();
111
-        // set ajax hooks
112
-        add_action('wp_ajax_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
113
-        add_action('wp_ajax_nopriv_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
114
-        add_action('wp_ajax_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
115
-        add_action('wp_ajax_nopriv_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
116
-        add_action('wp_ajax_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
117
-        add_action('wp_ajax_nopriv_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
118
-    }
119
-
120
-
121
-    /**
122
-     *    process ajax request
123
-     *
124
-     * @param string $ajax_action
125
-     * @throws EE_Error
126
-     */
127
-    public static function process_ajax_request($ajax_action)
128
-    {
129
-        EE_Registry::instance()->REQ->set('action', $ajax_action);
130
-        EED_Single_Page_Checkout::instance()->_initialize();
131
-    }
132
-
133
-
134
-    /**
135
-     *    ajax display registration step
136
-     *
137
-     * @throws EE_Error
138
-     */
139
-    public static function display_reg_step()
140
-    {
141
-        EED_Single_Page_Checkout::process_ajax_request('display_spco_reg_step');
142
-    }
143
-
144
-
145
-    /**
146
-     *    ajax process registration step
147
-     *
148
-     * @throws EE_Error
149
-     */
150
-    public static function process_reg_step()
151
-    {
152
-        EED_Single_Page_Checkout::process_ajax_request('process_reg_step');
153
-    }
154
-
155
-
156
-    /**
157
-     *    ajax process registration step
158
-     *
159
-     * @throws EE_Error
160
-     */
161
-    public static function update_reg_step()
162
-    {
163
-        EED_Single_Page_Checkout::process_ajax_request('update_reg_step');
164
-    }
165
-
166
-
167
-    /**
168
-     *   update_checkout
169
-     *
170
-     * @access public
171
-     * @return void
172
-     * @throws EE_Error
173
-     */
174
-    public static function update_checkout()
175
-    {
176
-        EED_Single_Page_Checkout::process_ajax_request('update_checkout');
177
-    }
178
-
179
-
180
-    /**
181
-     *    load_request_handler
182
-     *
183
-     * @access    public
184
-     * @return    void
185
-     */
186
-    public static function load_request_handler()
187
-    {
188
-        // load core Request_Handler class
189
-        if (EE_Registry::instance()->REQ !== null) {
190
-            EE_Registry::instance()->load_core('Request_Handler');
191
-        }
192
-    }
193
-
194
-
195
-    /**
196
-     *    set_definitions
197
-     *
198
-     * @access    public
199
-     * @return    void
200
-     * @throws EE_Error
201
-     */
202
-    public static function set_definitions()
203
-    {
204
-        if (defined('SPCO_BASE_PATH')) {
205
-            return;
206
-        }
207
-        define(
208
-            'SPCO_BASE_PATH',
209
-            rtrim(str_replace(array('\\', '/'), '/', plugin_dir_path(__FILE__)), '/') . '/'
210
-        );
211
-        define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css/');
212
-        define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img/');
213
-        define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js/');
214
-        define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc/');
215
-        define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps/');
216
-        define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates/');
217
-        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true);
218
-        EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice(
219
-        );
220
-    }
221
-
222
-
223
-    /**
224
-     * load_reg_steps
225
-     * loads and instantiates each reg step based on the EE_Registry::instance()->CFG->registration->reg_steps array
226
-     *
227
-     * @access    private
228
-     * @throws EE_Error
229
-     */
230
-    public static function load_reg_steps()
231
-    {
232
-        static $reg_steps_loaded = false;
233
-        if ($reg_steps_loaded) {
234
-            return;
235
-        }
236
-        // filter list of reg_steps
237
-        $reg_steps_to_load = (array) apply_filters(
238
-            'AHEE__SPCO__load_reg_steps__reg_steps_to_load',
239
-            EED_Single_Page_Checkout::get_reg_steps()
240
-        );
241
-        // sort by key (order)
242
-        ksort($reg_steps_to_load);
243
-        // loop through folders
244
-        foreach ($reg_steps_to_load as $order => $reg_step) {
245
-            // we need a
246
-            if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
247
-                // copy over to the reg_steps_array
248
-                EED_Single_Page_Checkout::$_reg_steps_array[ $order ] = $reg_step;
249
-                // register custom key route for each reg step
250
-                // ie: step=>"slug" - this is the entire reason we load the reg steps array now
251
-                EE_Config::register_route(
252
-                    $reg_step['slug'],
253
-                    'EED_Single_Page_Checkout',
254
-                    'run',
255
-                    'step'
256
-                );
257
-                // add AJAX or other hooks
258
-                if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) {
259
-                    // setup autoloaders if necessary
260
-                    if (! class_exists($reg_step['class_name'])) {
261
-                        EEH_Autoloader::register_autoloaders_for_each_file_in_folder(
262
-                            $reg_step['file_path'],
263
-                            true
264
-                        );
265
-                    }
266
-                    if (is_callable($reg_step['class_name'], 'set_hooks')) {
267
-                        call_user_func(array($reg_step['class_name'], 'set_hooks'));
268
-                    }
269
-                }
270
-            }
271
-        }
272
-        $reg_steps_loaded = true;
273
-    }
274
-
275
-
276
-    /**
277
-     *    get_reg_steps
278
-     *
279
-     * @access    public
280
-     * @return    array
281
-     */
282
-    public static function get_reg_steps()
283
-    {
284
-        $reg_steps = EE_Registry::instance()->CFG->registration->reg_steps;
285
-        if (empty($reg_steps)) {
286
-            $reg_steps = array(
287
-                10  => array(
288
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'attendee_information',
289
-                    'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information',
290
-                    'slug'       => 'attendee_information',
291
-                    'has_hooks'  => false,
292
-                ),
293
-                30  => array(
294
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'payment_options',
295
-                    'class_name' => 'EE_SPCO_Reg_Step_Payment_Options',
296
-                    'slug'       => 'payment_options',
297
-                    'has_hooks'  => true,
298
-                ),
299
-                999 => array(
300
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'finalize_registration',
301
-                    'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration',
302
-                    'slug'       => 'finalize_registration',
303
-                    'has_hooks'  => false,
304
-                ),
305
-            );
306
-        }
307
-        return $reg_steps;
308
-    }
309
-
310
-
311
-    /**
312
-     *    registration_checkout_for_admin
313
-     *
314
-     * @access    public
315
-     * @return    string
316
-     * @throws EE_Error
317
-     */
318
-    public static function registration_checkout_for_admin()
319
-    {
320
-        EED_Single_Page_Checkout::load_request_handler();
321
-        EE_Registry::instance()->REQ->set('step', 'attendee_information');
322
-        EE_Registry::instance()->REQ->set('action', 'display_spco_reg_step');
323
-        EE_Registry::instance()->REQ->set('process_form_submission', false);
324
-        EED_Single_Page_Checkout::instance()->_initialize();
325
-        EED_Single_Page_Checkout::instance()->_display_spco_reg_form();
326
-        return EE_Registry::instance()->REQ->get_output();
327
-    }
328
-
329
-
330
-    /**
331
-     * process_registration_from_admin
332
-     *
333
-     * @access public
334
-     * @return \EE_Transaction
335
-     * @throws EE_Error
336
-     */
337
-    public static function process_registration_from_admin()
338
-    {
339
-        EED_Single_Page_Checkout::load_request_handler();
340
-        EE_Registry::instance()->REQ->set('step', 'attendee_information');
341
-        EE_Registry::instance()->REQ->set('action', 'process_reg_step');
342
-        EE_Registry::instance()->REQ->set('process_form_submission', true);
343
-        EED_Single_Page_Checkout::instance()->_initialize();
344
-        if (EED_Single_Page_Checkout::instance()->checkout->current_step->completed()) {
345
-            $final_reg_step = end(EED_Single_Page_Checkout::instance()->checkout->reg_steps);
346
-            if ($final_reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) {
347
-                EED_Single_Page_Checkout::instance()->checkout->set_reg_step_initiated($final_reg_step);
348
-                if ($final_reg_step->process_reg_step()) {
349
-                    $final_reg_step->set_completed();
350
-                    EED_Single_Page_Checkout::instance()->checkout->update_txn_reg_steps_array();
351
-                    return EED_Single_Page_Checkout::instance()->checkout->transaction;
352
-                }
353
-            }
354
-        }
355
-        return null;
356
-    }
357
-
358
-
359
-    /**
360
-     *    run
361
-     *
362
-     * @access    public
363
-     * @param WP_Query $WP_Query
364
-     * @return    void
365
-     * @throws EE_Error
366
-     */
367
-    public function run($WP_Query)
368
-    {
369
-        if ($WP_Query instanceof WP_Query
370
-            && $WP_Query->is_main_query()
371
-            && apply_filters('FHEE__EED_Single_Page_Checkout__run', true)
372
-            && $this->_is_reg_checkout()
373
-        ) {
374
-            $this->_initialize();
375
-        }
376
-    }
377
-
378
-
379
-    /**
380
-     * determines whether current url matches reg page url
381
-     *
382
-     * @return bool
383
-     */
384
-    protected function _is_reg_checkout()
385
-    {
386
-        // get current permalink for reg page without any extra query args
387
-        $reg_page_url = \get_permalink(EE_Config::instance()->core->reg_page_id);
388
-        // get request URI for current request, but without the scheme or host
389
-        $current_request_uri = \EEH_URL::filter_input_server_url('REQUEST_URI');
390
-        $current_request_uri = html_entity_decode($current_request_uri);
391
-        // get array of query args from the current request URI
392
-        $query_args = \EEH_URL::get_query_string($current_request_uri);
393
-        // grab page id if it is set
394
-        $page_id = isset($query_args['page_id']) ? absint($query_args['page_id']) : 0;
395
-        // and remove the page id from the query args (we will re-add it later)
396
-        unset($query_args['page_id']);
397
-        // now strip all query args from current request URI
398
-        $current_request_uri = remove_query_arg(array_keys($query_args), $current_request_uri);
399
-        // and re-add the page id if it was set
400
-        if ($page_id) {
401
-            $current_request_uri = add_query_arg('page_id', $page_id, $current_request_uri);
402
-        }
403
-        // remove slashes and ?
404
-        $current_request_uri = trim($current_request_uri, '?/');
405
-        // is current request URI part of the known full reg page URL ?
406
-        return ! empty($current_request_uri) && strpos($reg_page_url, $current_request_uri) !== false;
407
-    }
408
-
409
-
410
-    /**
411
-     * @param WP_Query $wp_query
412
-     * @return    void
413
-     * @throws EE_Error
414
-     */
415
-    public static function init($wp_query)
416
-    {
417
-        EED_Single_Page_Checkout::instance()->run($wp_query);
418
-    }
419
-
420
-
421
-    /**
422
-     *    _initialize - initial module setup
423
-     *
424
-     * @access    private
425
-     * @throws EE_Error
426
-     * @return    void
427
-     */
428
-    private function _initialize()
429
-    {
430
-        // ensure SPCO doesn't run twice
431
-        if (EED_Single_Page_Checkout::$_initialized) {
432
-            return;
433
-        }
434
-        try {
435
-            EED_Single_Page_Checkout::load_reg_steps();
436
-            $this->_verify_session();
437
-            // setup the EE_Checkout object
438
-            $this->checkout = $this->_initialize_checkout();
439
-            // filter checkout
440
-            $this->checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize__checkout', $this->checkout);
441
-            // get the $_GET
442
-            $this->_get_request_vars();
443
-            if ($this->_block_bots()) {
444
-                return;
445
-            }
446
-            // filter continue_reg
447
-            $this->checkout->continue_reg = apply_filters(
448
-                'FHEE__EED_Single_Page_Checkout__init___continue_reg',
449
-                true,
450
-                $this->checkout
451
-            );
452
-            // load the reg steps array
453
-            if (! $this->_load_and_instantiate_reg_steps()) {
454
-                EED_Single_Page_Checkout::$_initialized = true;
455
-                return;
456
-            }
457
-            // set the current step
458
-            $this->checkout->set_current_step($this->checkout->step);
459
-            // and the next step
460
-            $this->checkout->set_next_step();
461
-            // verify that everything has been setup correctly
462
-            if (! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) {
463
-                EED_Single_Page_Checkout::$_initialized = true;
464
-                return;
465
-            }
466
-            // lock the transaction
467
-            $this->checkout->transaction->lock();
468
-            // make sure all of our cached objects are added to their respective model entity mappers
469
-            $this->checkout->refresh_all_entities();
470
-            // set amount owing
471
-            $this->checkout->amount_owing = $this->checkout->transaction->remaining();
472
-            // initialize each reg step, which gives them the chance to potentially alter the process
473
-            $this->_initialize_reg_steps();
474
-            // DEBUG LOG
475
-            // $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
476
-            // get reg form
477
-            if (! $this->_check_form_submission()) {
478
-                EED_Single_Page_Checkout::$_initialized = true;
479
-                return;
480
-            }
481
-            // checkout the action!!!
482
-            $this->_process_form_action();
483
-            // add some style and make it dance
484
-            $this->add_styles_and_scripts();
485
-            // kk... SPCO has successfully run
486
-            EED_Single_Page_Checkout::$_initialized = true;
487
-            // set no cache headers and constants
488
-            EE_System::do_not_cache();
489
-            // add anchor
490
-            add_action('loop_start', array($this, 'set_checkout_anchor'), 1);
491
-            // remove transaction lock
492
-            add_action('shutdown', array($this, 'unlock_transaction'), 1);
493
-        } catch (Exception $e) {
494
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
495
-        }
496
-    }
497
-
498
-
499
-    /**
500
-     *    _verify_session
501
-     * checks that the session is valid and not expired
502
-     *
503
-     * @access    private
504
-     * @throws EE_Error
505
-     */
506
-    private function _verify_session()
507
-    {
508
-        if (! EE_Registry::instance()->SSN instanceof EE_Session) {
509
-            throw new EE_Error(esc_html__('The EE_Session class could not be loaded.', 'event_espresso'));
510
-        }
511
-        $clear_session_requested = filter_var(
512
-            EE_Registry::instance()->REQ->get('clear_session', false),
513
-            FILTER_VALIDATE_BOOLEAN
514
-        );
515
-        // is session still valid ?
516
-        if ($clear_session_requested
517
-            || (EE_Registry::instance()->SSN->expired()
518
-                && EE_Registry::instance()->REQ->get('e_reg_url_link', '') === ''
519
-            )
520
-        ) {
521
-            $this->checkout = new EE_Checkout();
522
-            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
523
-            // EE_Registry::instance()->SSN->reset_cart();
524
-            // EE_Registry::instance()->SSN->reset_checkout();
525
-            // EE_Registry::instance()->SSN->reset_transaction();
526
-            if (! $clear_session_requested) {
527
-                EE_Error::add_attention(
528
-                    EE_Registry::$i18n_js_strings['registration_expiration_notice'],
529
-                    __FILE__,
530
-                    __FUNCTION__,
531
-                    __LINE__
532
-                );
533
-            }
534
-            // EE_Registry::instance()->SSN->reset_expired();
535
-        }
536
-    }
537
-
538
-
539
-    /**
540
-     *    _initialize_checkout
541
-     * loads and instantiates EE_Checkout
542
-     *
543
-     * @access    private
544
-     * @throws EE_Error
545
-     * @return EE_Checkout
546
-     */
547
-    private function _initialize_checkout()
548
-    {
549
-        // look in session for existing checkout
550
-        /** @type EE_Checkout $checkout */
551
-        $checkout = EE_Registry::instance()->SSN->checkout();
552
-        // verify
553
-        if (! $checkout instanceof EE_Checkout) {
554
-            // instantiate EE_Checkout object for handling the properties of the current checkout process
555
-            $checkout = EE_Registry::instance()->load_file(
556
-                SPCO_INC_PATH,
557
-                'EE_Checkout',
558
-                'class',
559
-                array(),
560
-                false
561
-            );
562
-        } else {
563
-            if ($checkout->current_step->is_final_step() && $checkout->exit_spco() === true) {
564
-                $this->unlock_transaction();
565
-                wp_safe_redirect($checkout->redirect_url);
566
-                exit();
567
-            }
568
-        }
569
-        $checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout);
570
-        // verify again
571
-        if (! $checkout instanceof EE_Checkout) {
572
-            throw new EE_Error(esc_html__('The EE_Checkout class could not be loaded.', 'event_espresso'));
573
-        }
574
-        // reset anything that needs a clean slate for each request
575
-        $checkout->reset_for_current_request();
576
-        return $checkout;
577
-    }
578
-
579
-
580
-    /**
581
-     *    _get_request_vars
582
-     *
583
-     * @access    private
584
-     * @return    void
585
-     * @throws EE_Error
586
-     */
587
-    private function _get_request_vars()
588
-    {
589
-        // load classes
590
-        EED_Single_Page_Checkout::load_request_handler();
591
-        // make sure this request is marked as belonging to EE
592
-        EE_Registry::instance()->REQ->set_espresso_page(true);
593
-        // which step is being requested ?
594
-        $this->checkout->step = EE_Registry::instance()->REQ->get('step', $this->_get_first_step());
595
-        // which step is being edited ?
596
-        $this->checkout->edit_step = EE_Registry::instance()->REQ->get('edit_step', '');
597
-        // and what we're doing on the current step
598
-        $this->checkout->action = EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step');
599
-        // timestamp
600
-        $this->checkout->uts = EE_Registry::instance()->REQ->get('uts', 0);
601
-        // returning to edit ?
602
-        $this->checkout->reg_url_link = EE_Registry::instance()->REQ->get('e_reg_url_link', '');
603
-        // add reg url link to registration query params
604
-        if ($this->checkout->reg_url_link && strpos($this->checkout->reg_url_link, '1-') !== 0) {
605
-            $this->checkout->reg_cache_where_params[0]['REG_url_link'] = $this->checkout->reg_url_link;
606
-        }
607
-        // or some other kind of revisit ?
608
-        $this->checkout->revisit = filter_var(
609
-            EE_Registry::instance()->REQ->get('revisit', false),
610
-            FILTER_VALIDATE_BOOLEAN
611
-        );
612
-        // and whether or not to generate a reg form for this request
613
-        $this->checkout->generate_reg_form = filter_var(
614
-            EE_Registry::instance()->REQ->get('generate_reg_form', true),
615
-            FILTER_VALIDATE_BOOLEAN
616
-        );
617
-        // and whether or not to process a reg form submission for this request
618
-        $this->checkout->process_form_submission = filter_var(
619
-            EE_Registry::instance()->REQ->get(
620
-                'process_form_submission',
621
-                $this->checkout->action === 'process_reg_step'
622
-            ),
623
-            FILTER_VALIDATE_BOOLEAN
624
-        );
625
-        $this->checkout->process_form_submission = filter_var(
626
-            $this->checkout->action !== 'display_spco_reg_step'
627
-                ? $this->checkout->process_form_submission
628
-                : false,
629
-            FILTER_VALIDATE_BOOLEAN
630
-        );
631
-        // $this->_display_request_vars();
632
-    }
633
-
634
-
635
-    /**
636
-     *  _display_request_vars
637
-     *
638
-     * @access    protected
639
-     * @return    void
640
-     */
641
-    protected function _display_request_vars()
642
-    {
643
-        if (! WP_DEBUG) {
644
-            return;
645
-        }
646
-        EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__);
647
-        EEH_Debug_Tools::printr($this->checkout->step, '$this->checkout->step', __FILE__, __LINE__);
648
-        EEH_Debug_Tools::printr($this->checkout->edit_step, '$this->checkout->edit_step', __FILE__, __LINE__);
649
-        EEH_Debug_Tools::printr($this->checkout->action, '$this->checkout->action', __FILE__, __LINE__);
650
-        EEH_Debug_Tools::printr($this->checkout->reg_url_link, '$this->checkout->reg_url_link', __FILE__, __LINE__);
651
-        EEH_Debug_Tools::printr($this->checkout->revisit, '$this->checkout->revisit', __FILE__, __LINE__);
652
-        EEH_Debug_Tools::printr(
653
-            $this->checkout->generate_reg_form,
654
-            '$this->checkout->generate_reg_form',
655
-            __FILE__,
656
-            __LINE__
657
-        );
658
-        EEH_Debug_Tools::printr(
659
-            $this->checkout->process_form_submission,
660
-            '$this->checkout->process_form_submission',
661
-            __FILE__,
662
-            __LINE__
663
-        );
664
-    }
665
-
666
-
667
-    /**
668
-     * _block_bots
669
-     * checks that the incoming request has either of the following set:
670
-     *  a uts (unix timestamp) which indicates that the request was redirected from the Ticket Selector
671
-     *  a REG URL Link, which indicates that the request is a return visit to SPCO for a valid TXN
672
-     * so if you're not coming from the Ticket Selector nor returning for a valid IP...
673
-     * then where you coming from man?
674
-     *
675
-     * @return boolean
676
-     */
677
-    private function _block_bots()
678
-    {
679
-        $invalid_checkout_access = EED_Invalid_Checkout_Access::getInvalidCheckoutAccess();
680
-        if ($invalid_checkout_access->checkoutAccessIsInvalid($this->checkout)) {
681
-            return true;
682
-        }
683
-        return false;
684
-    }
685
-
686
-
687
-    /**
688
-     *    _get_first_step
689
-     *  gets slug for first step in $_reg_steps_array
690
-     *
691
-     * @access    private
692
-     * @throws EE_Error
693
-     * @return    string
694
-     */
695
-    private function _get_first_step()
696
-    {
697
-        $first_step = reset(EED_Single_Page_Checkout::$_reg_steps_array);
698
-        return isset($first_step['slug']) ? $first_step['slug'] : 'attendee_information';
699
-    }
700
-
701
-
702
-    /**
703
-     * instantiates each reg step based on the loaded reg_steps array
704
-     *
705
-     * @return    bool
706
-     * @throws EE_Error
707
-     * @throws InvalidArgumentException
708
-     * @throws InvalidDataTypeException
709
-     * @throws InvalidInterfaceException
710
-     */
711
-    private function _load_and_instantiate_reg_steps()
712
-    {
713
-        do_action('AHEE__Single_Page_Checkout___load_and_instantiate_reg_steps__start', $this->checkout);
714
-        // have reg_steps already been instantiated ?
715
-        if (empty($this->checkout->reg_steps)
716
-            || apply_filters('FHEE__Single_Page_Checkout__load_reg_steps__reload_reg_steps', false, $this->checkout)
717
-        ) {
718
-            // if not, then loop through raw reg steps array
719
-            foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) {
720
-                if (! $this->_load_and_instantiate_reg_step($reg_step, $order)) {
721
-                    return false;
722
-                }
723
-            }
724
-            if (isset($this->checkout->reg_steps['registration_confirmation'])) {
725
-                // skip the registration_confirmation page ?
726
-                if (EE_Registry::instance()->CFG->registration->skip_reg_confirmation) {
727
-                    // just remove it from the reg steps array
728
-                    $this->checkout->remove_reg_step('registration_confirmation', false);
729
-                } elseif (EE_Registry::instance()->CFG->registration->reg_confirmation_last
730
-                ) {
731
-                    // set the order to something big like 100
732
-                    $this->checkout->set_reg_step_order('registration_confirmation', 100);
733
-                }
734
-            }
735
-            // filter the array for good luck
736
-            $this->checkout->reg_steps = apply_filters(
737
-                'FHEE__Single_Page_Checkout__load_reg_steps__reg_steps',
738
-                $this->checkout->reg_steps
739
-            );
740
-            // finally re-sort based on the reg step class order properties
741
-            $this->checkout->sort_reg_steps();
742
-        } else {
743
-            foreach ($this->checkout->reg_steps as $reg_step) {
744
-                // set all current step stati to FALSE
745
-                $reg_step->set_is_current_step(false);
746
-            }
747
-        }
748
-        if (empty($this->checkout->reg_steps)) {
749
-            EE_Error::add_error(
750
-                esc_html__('No Reg Steps were loaded..', 'event_espresso'),
751
-                __FILE__,
752
-                __FUNCTION__,
753
-                __LINE__
754
-            );
755
-            return false;
756
-        }
757
-        // make reg step details available to JS
758
-        $this->checkout->set_reg_step_JSON_info();
759
-        return true;
760
-    }
761
-
762
-
763
-    /**
764
-     *     _load_and_instantiate_reg_step
765
-     *
766
-     * @access    private
767
-     * @param array $reg_step
768
-     * @param int   $order
769
-     * @return bool
770
-     */
771
-    private function _load_and_instantiate_reg_step($reg_step = array(), $order = 0)
772
-    {
773
-        // we need a file_path, class_name, and slug to add a reg step
774
-        if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
775
-            // if editing a specific step, but this is NOT that step... (and it's not the 'finalize_registration' step)
776
-            if ($this->checkout->reg_url_link
777
-                && $this->checkout->step !== $reg_step['slug']
778
-                && $reg_step['slug'] !== 'finalize_registration'
779
-                // normally at this point we would NOT load the reg step, but this filter can change that
780
-                && apply_filters(
781
-                    'FHEE__Single_Page_Checkout___load_and_instantiate_reg_step__bypass_reg_step',
782
-                    true,
783
-                    $reg_step,
784
-                    $this->checkout
785
-                )
786
-            ) {
787
-                return true;
788
-            }
789
-            // instantiate step class using file path and class name
790
-            $reg_step_obj = EE_Registry::instance()->load_file(
791
-                $reg_step['file_path'],
792
-                $reg_step['class_name'],
793
-                'class',
794
-                $this->checkout,
795
-                false
796
-            );
797
-            // did we gets the goods ?
798
-            if ($reg_step_obj instanceof EE_SPCO_Reg_Step) {
799
-                // set reg step order based on config
800
-                $reg_step_obj->set_order($order);
801
-                // add instantiated reg step object to the master reg steps array
802
-                $this->checkout->add_reg_step($reg_step_obj);
803
-            } else {
804
-                EE_Error::add_error(
805
-                    esc_html__('The current step could not be set.', 'event_espresso'),
806
-                    __FILE__,
807
-                    __FUNCTION__,
808
-                    __LINE__
809
-                );
810
-                return false;
811
-            }
812
-        } else {
813
-            if (WP_DEBUG) {
814
-                EE_Error::add_error(
815
-                    sprintf(
816
-                        esc_html__(
817
-                            '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',
818
-                            'event_espresso'
819
-                        ),
820
-                        isset($reg_step['file_path']) ? $reg_step['file_path'] : '',
821
-                        isset($reg_step['class_name']) ? $reg_step['class_name'] : '',
822
-                        isset($reg_step['slug']) ? $reg_step['slug'] : '',
823
-                        '<ul>',
824
-                        '<li>',
825
-                        '</li>',
826
-                        '</ul>'
827
-                    ),
828
-                    __FILE__,
829
-                    __FUNCTION__,
830
-                    __LINE__
831
-                );
832
-            }
833
-            return false;
834
-        }
835
-        return true;
836
-    }
837
-
838
-
839
-    /**
840
-     * _verify_transaction_and_get_registrations
841
-     *
842
-     * @access private
843
-     * @return bool
844
-     * @throws InvalidDataTypeException
845
-     * @throws InvalidEntityException
846
-     * @throws EE_Error
847
-     */
848
-    private function _verify_transaction_and_get_registrations()
849
-    {
850
-        // was there already a valid transaction in the checkout from the session ?
851
-        if (! $this->checkout->transaction instanceof EE_Transaction) {
852
-            // get transaction from db or session
853
-            $this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin()
854
-                ? $this->_get_transaction_and_cart_for_previous_visit()
855
-                : $this->_get_cart_for_current_session_and_setup_new_transaction();
856
-            if (! $this->checkout->transaction instanceof EE_Transaction) {
857
-                EE_Error::add_error(
858
-                    esc_html__(
859
-                        'Your Registration and Transaction information could not be retrieved from the db.',
860
-                        'event_espresso'
861
-                    ),
862
-                    __FILE__,
863
-                    __FUNCTION__,
864
-                    __LINE__
865
-                );
866
-                $this->checkout->transaction = EE_Transaction::new_instance();
867
-                // add some style and make it dance
868
-                $this->add_styles_and_scripts();
869
-                EED_Single_Page_Checkout::$_initialized = true;
870
-                return false;
871
-            }
872
-            // and the registrations for the transaction
873
-            $this->_get_registrations($this->checkout->transaction);
874
-        }
875
-        return true;
876
-    }
877
-
878
-
879
-    /**
880
-     * _get_transaction_and_cart_for_previous_visit
881
-     *
882
-     * @access private
883
-     * @return mixed EE_Transaction|NULL
884
-     */
885
-    private function _get_transaction_and_cart_for_previous_visit()
886
-    {
887
-        /** @var $TXN_model EEM_Transaction */
888
-        $TXN_model = EE_Registry::instance()->load_model('Transaction');
889
-        // because the reg_url_link is present in the request,
890
-        // this is a return visit to SPCO, so we'll get the transaction data from the db
891
-        $transaction = $TXN_model->get_transaction_from_reg_url_link($this->checkout->reg_url_link);
892
-        // verify transaction
893
-        if ($transaction instanceof EE_Transaction) {
894
-            // and get the cart that was used for that transaction
895
-            $this->checkout->cart = $this->_get_cart_for_transaction($transaction);
896
-            return $transaction;
897
-        }
898
-        EE_Error::add_error(
899
-            esc_html__('Your Registration and Transaction information could not be retrieved from the db.', 'event_espresso'),
900
-            __FILE__,
901
-            __FUNCTION__,
902
-            __LINE__
903
-        );
904
-        return null;
905
-    }
906
-
907
-
908
-    /**
909
-     * _get_cart_for_transaction
910
-     *
911
-     * @access private
912
-     * @param EE_Transaction $transaction
913
-     * @return EE_Cart
914
-     */
915
-    private function _get_cart_for_transaction($transaction)
916
-    {
917
-        return $this->checkout->get_cart_for_transaction($transaction);
918
-    }
919
-
920
-
921
-    /**
922
-     * get_cart_for_transaction
923
-     *
924
-     * @access public
925
-     * @param EE_Transaction $transaction
926
-     * @return EE_Cart
927
-     */
928
-    public function get_cart_for_transaction(EE_Transaction $transaction)
929
-    {
930
-        return $this->checkout->get_cart_for_transaction($transaction);
931
-    }
932
-
933
-
934
-    /**
935
-     * _get_transaction_and_cart_for_current_session
936
-     *    generates a new EE_Transaction object and adds it to the $_transaction property.
937
-     *
938
-     * @access private
939
-     * @return EE_Transaction
940
-     * @throws EE_Error
941
-     */
942
-    private function _get_cart_for_current_session_and_setup_new_transaction()
943
-    {
944
-        //  if there's no transaction, then this is the FIRST visit to SPCO
945
-        // so load up the cart ( passing nothing for the TXN because it doesn't exist yet )
946
-        $this->checkout->cart = $this->_get_cart_for_transaction(null);
947
-        // and then create a new transaction
948
-        $transaction = $this->_initialize_transaction();
949
-        // verify transaction
950
-        if ($transaction instanceof EE_Transaction) {
951
-            // save it so that we have an ID for other objects to use
952
-            $transaction->save();
953
-            // and save TXN data to the cart
954
-            $this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn($transaction->ID());
955
-        } else {
956
-            EE_Error::add_error(
957
-                esc_html__('A Valid Transaction could not be initialized.', 'event_espresso'),
958
-                __FILE__,
959
-                __FUNCTION__,
960
-                __LINE__
961
-            );
962
-        }
963
-        return $transaction;
964
-    }
965
-
966
-
967
-    /**
968
-     *    generates a new EE_Transaction object and adds it to the $_transaction property.
969
-     *
970
-     * @access private
971
-     * @return mixed EE_Transaction|NULL
972
-     */
973
-    private function _initialize_transaction()
974
-    {
975
-        try {
976
-            // ensure cart totals have been calculated
977
-            $this->checkout->cart->get_grand_total()->recalculate_total_including_taxes();
978
-            // grab the cart grand total
979
-            $cart_total = $this->checkout->cart->get_cart_grand_total();
980
-            // create new TXN
981
-            $transaction = EE_Transaction::new_instance(
982
-                array(
983
-                    'TXN_reg_steps' => $this->checkout->initialize_txn_reg_steps_array(),
984
-                    'TXN_total'     => $cart_total > 0 ? $cart_total : 0,
985
-                    'TXN_paid'      => 0,
986
-                    'STS_ID'        => EEM_Transaction::failed_status_code,
987
-                )
988
-            );
989
-            // save it so that we have an ID for other objects to use
990
-            $transaction->save();
991
-            // set cron job for following up on TXNs after their session has expired
992
-            EE_Cron_Tasks::schedule_expired_transaction_check(
993
-                EE_Registry::instance()->SSN->expiration() + 1,
994
-                $transaction->ID()
995
-            );
996
-            return $transaction;
997
-        } catch (Exception $e) {
998
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
999
-        }
1000
-        return null;
1001
-    }
1002
-
1003
-
1004
-    /**
1005
-     * _get_registrations
1006
-     *
1007
-     * @access private
1008
-     * @param EE_Transaction $transaction
1009
-     * @return void
1010
-     * @throws InvalidDataTypeException
1011
-     * @throws InvalidEntityException
1012
-     * @throws EE_Error
1013
-     */
1014
-    private function _get_registrations(EE_Transaction $transaction)
1015
-    {
1016
-        // first step: grab the registrants  { : o
1017
-        $registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false);
1018
-        $this->checkout->total_ticket_count = count($registrations);
1019
-        // verify registrations have been set
1020
-        if (empty($registrations)) {
1021
-            // if no cached registrations, then check the db
1022
-            $registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false);
1023
-            // still nothing ? well as long as this isn't a revisit
1024
-            if (empty($registrations) && ! $this->checkout->revisit) {
1025
-                // generate new registrations from scratch
1026
-                $registrations = $this->_initialize_registrations($transaction);
1027
-            }
1028
-        }
1029
-        // sort by their original registration order
1030
-        usort($registrations, array('EED_Single_Page_Checkout', 'sort_registrations_by_REG_count'));
1031
-        // then loop thru the array
1032
-        foreach ($registrations as $registration) {
1033
-            // verify each registration
1034
-            if ($registration instanceof EE_Registration) {
1035
-                // we display all attendee info for the primary registrant
1036
-                if ($this->checkout->reg_url_link === $registration->reg_url_link()
1037
-                    && $registration->is_primary_registrant()
1038
-                ) {
1039
-                    $this->checkout->primary_revisit = true;
1040
-                    break;
1041
-                }
1042
-                if ($this->checkout->revisit && $this->checkout->reg_url_link !== $registration->reg_url_link()) {
1043
-                    // but hide info if it doesn't belong to you
1044
-                    $transaction->clear_cache('Registration', $registration->ID());
1045
-                    $this->checkout->total_ticket_count--;
1046
-                }
1047
-                $this->checkout->set_reg_status_updated($registration->ID(), false);
1048
-            }
1049
-        }
1050
-    }
1051
-
1052
-
1053
-    /**
1054
-     *    adds related EE_Registration objects for each ticket in the cart to the current EE_Transaction object
1055
-     *
1056
-     * @access private
1057
-     * @param EE_Transaction $transaction
1058
-     * @return    array
1059
-     * @throws InvalidDataTypeException
1060
-     * @throws InvalidEntityException
1061
-     * @throws EE_Error
1062
-     */
1063
-    private function _initialize_registrations(EE_Transaction $transaction)
1064
-    {
1065
-        $att_nmbr = 0;
1066
-        $registrations = array();
1067
-        if ($transaction instanceof EE_Transaction) {
1068
-            /** @type EE_Registration_Processor $registration_processor */
1069
-            $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
1070
-            $this->checkout->total_ticket_count = $this->checkout->cart->all_ticket_quantity_count();
1071
-            // now let's add the cart items to the $transaction
1072
-            foreach ($this->checkout->cart->get_tickets() as $line_item) {
1073
-                // do the following for each ticket of this type they selected
1074
-                for ($x = 1; $x <= $line_item->quantity(); $x++) {
1075
-                    $att_nmbr++;
1076
-                    /** @var EventEspresso\core\services\commands\registration\CreateRegistrationCommand $CreateRegistrationCommand */
1077
-                    $CreateRegistrationCommand = EE_Registry::instance()->create(
1078
-                        'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
1079
-                        array(
1080
-                            $transaction,
1081
-                            $line_item,
1082
-                            $att_nmbr,
1083
-                            $this->checkout->total_ticket_count,
1084
-                        )
1085
-                    );
1086
-                    // override capabilities for frontend registrations
1087
-                    if (! is_admin()) {
1088
-                        $CreateRegistrationCommand->setCapCheck(
1089
-                            new PublicCapabilities('', 'create_new_registration')
1090
-                        );
1091
-                    }
1092
-                    $registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand);
1093
-                    if (! $registration instanceof EE_Registration) {
1094
-                        throw new InvalidEntityException($registration, 'EE_Registration');
1095
-                    }
1096
-                    $registrations[ $registration->ID() ] = $registration;
1097
-                }
1098
-            }
1099
-            $registration_processor->fix_reg_final_price_rounding_issue($transaction);
1100
-        }
1101
-        return $registrations;
1102
-    }
1103
-
1104
-
1105
-    /**
1106
-     * sorts registrations by REG_count
1107
-     *
1108
-     * @access public
1109
-     * @param EE_Registration $reg_A
1110
-     * @param EE_Registration $reg_B
1111
-     * @return int
1112
-     */
1113
-    public static function sort_registrations_by_REG_count(EE_Registration $reg_A, EE_Registration $reg_B)
1114
-    {
1115
-        // this shouldn't ever happen within the same TXN, but oh well
1116
-        if ($reg_A->count() === $reg_B->count()) {
1117
-            return 0;
1118
-        }
1119
-        return ($reg_A->count() > $reg_B->count()) ? 1 : -1;
1120
-    }
1121
-
1122
-
1123
-    /**
1124
-     *    _final_verifications
1125
-     * just makes sure that everything is set up correctly before proceeding
1126
-     *
1127
-     * @access    private
1128
-     * @return    bool
1129
-     * @throws EE_Error
1130
-     */
1131
-    private function _final_verifications()
1132
-    {
1133
-        // filter checkout
1134
-        $this->checkout = apply_filters(
1135
-            'FHEE__EED_Single_Page_Checkout___final_verifications__checkout',
1136
-            $this->checkout
1137
-        );
1138
-        // verify that current step is still set correctly
1139
-        if (! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) {
1140
-            EE_Error::add_error(
1141
-                esc_html__(
1142
-                    '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.',
1143
-                    'event_espresso'
1144
-                ),
1145
-                __FILE__,
1146
-                __FUNCTION__,
1147
-                __LINE__
1148
-            );
1149
-            return false;
1150
-        }
1151
-        // if returning to SPCO, then verify that primary registrant is set
1152
-        if (! empty($this->checkout->reg_url_link)) {
1153
-            $valid_registrant = $this->checkout->transaction->primary_registration();
1154
-            if (! $valid_registrant instanceof EE_Registration) {
1155
-                EE_Error::add_error(
1156
-                    esc_html__(
1157
-                        '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.',
1158
-                        'event_espresso'
1159
-                    ),
1160
-                    __FILE__,
1161
-                    __FUNCTION__,
1162
-                    __LINE__
1163
-                );
1164
-                return false;
1165
-            }
1166
-            $valid_registrant = null;
1167
-            foreach ($this->checkout->transaction->registrations($this->checkout->reg_cache_where_params) as $registration) {
1168
-                if ($registration instanceof EE_Registration
1169
-                    && $registration->reg_url_link() === $this->checkout->reg_url_link
1170
-                ) {
1171
-                    $valid_registrant = $registration;
1172
-                }
1173
-            }
1174
-            if (! $valid_registrant instanceof EE_Registration) {
1175
-                // hmmm... maybe we have the wrong session because the user is opening multiple tabs ?
1176
-                if (EED_Single_Page_Checkout::$_checkout_verified) {
1177
-                    // clear the session, mark the checkout as unverified, and try again
1178
-                    EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
1179
-                    EED_Single_Page_Checkout::$_initialized = false;
1180
-                    EED_Single_Page_Checkout::$_checkout_verified = false;
1181
-                    $this->_initialize();
1182
-                    EE_Error::reset_notices();
1183
-                    return false;
1184
-                }
1185
-                EE_Error::add_error(
1186
-                    esc_html__(
1187
-                        '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.',
1188
-                        'event_espresso'
1189
-                    ),
1190
-                    __FILE__,
1191
-                    __FUNCTION__,
1192
-                    __LINE__
1193
-                );
1194
-                return false;
1195
-            }
1196
-        }
1197
-        // now that things have been kinda sufficiently verified,
1198
-        // let's add the checkout to the session so that it's available to other systems
1199
-        EE_Registry::instance()->SSN->set_checkout($this->checkout);
1200
-        return true;
1201
-    }
1202
-
1203
-
1204
-    /**
1205
-     *    _initialize_reg_steps
1206
-     * first makes sure that EE_Transaction_Processor::set_reg_step_initiated() is called as required
1207
-     * then loops thru all of the active reg steps and calls the initialize_reg_step() method
1208
-     *
1209
-     * @access    private
1210
-     * @param bool $reinitializing
1211
-     * @throws EE_Error
1212
-     */
1213
-    private function _initialize_reg_steps($reinitializing = false)
1214
-    {
1215
-        $this->checkout->set_reg_step_initiated($this->checkout->current_step);
1216
-        // loop thru all steps to call their individual "initialize" methods and set i18n strings for JS
1217
-        foreach ($this->checkout->reg_steps as $reg_step) {
1218
-            if (! $reg_step->initialize_reg_step()) {
1219
-                // if not initialized then maybe this step is being removed...
1220
-                if (! $reinitializing && $reg_step->is_current_step()) {
1221
-                    // if it was the current step, then we need to start over here
1222
-                    $this->_initialize_reg_steps(true);
1223
-                    return;
1224
-                }
1225
-                continue;
1226
-            }
1227
-            // add css and JS for current step
1228
-            $reg_step->enqueue_styles_and_scripts();
1229
-            // i18n
1230
-            $reg_step->translate_js_strings();
1231
-            if ($reg_step->is_current_step()) {
1232
-                // the text that appears on the reg step form submit button
1233
-                $reg_step->set_submit_button_text();
1234
-            }
1235
-        }
1236
-        // dynamically creates hook point like: AHEE__Single_Page_Checkout___initialize_reg_step__attendee_information
1237
-        do_action(
1238
-            "AHEE__Single_Page_Checkout___initialize_reg_step__{$this->checkout->current_step->slug()}",
1239
-            $this->checkout->current_step
1240
-        );
1241
-    }
1242
-
1243
-
1244
-    /**
1245
-     * _check_form_submission
1246
-     *
1247
-     * @access private
1248
-     * @return boolean
1249
-     */
1250
-    private function _check_form_submission()
1251
-    {
1252
-        // does this request require the reg form to be generated ?
1253
-        if ($this->checkout->generate_reg_form) {
1254
-            // ever heard that song by Blue Rodeo ?
1255
-            try {
1256
-                $this->checkout->current_step->reg_form = $this->checkout->current_step->generate_reg_form();
1257
-                // if not displaying a form, then check for form submission
1258
-                if ($this->checkout->process_form_submission
1259
-                    && $this->checkout->current_step->reg_form->was_submitted()
1260
-                ) {
1261
-                    // clear out any old data in case this step is being run again
1262
-                    $this->checkout->current_step->set_valid_data(array());
1263
-                    // capture submitted form data
1264
-                    $this->checkout->current_step->reg_form->receive_form_submission(
1265
-                        apply_filters(
1266
-                            'FHEE__Single_Page_Checkout___check_form_submission__request_params',
1267
-                            EE_Registry::instance()->REQ->params(),
1268
-                            $this->checkout
1269
-                        )
1270
-                    );
1271
-                    // validate submitted form data
1272
-                    if (! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) {
1273
-                        // thou shall not pass !!!
1274
-                        $this->checkout->continue_reg = false;
1275
-                        // any form validation errors?
1276
-                        if ($this->checkout->current_step->reg_form->submission_error_message() !== '') {
1277
-                            EE_Error::add_error(
1278
-                                $this->checkout->current_step->reg_form->submission_error_message(),
1279
-                                __FILE__,
1280
-                                __FUNCTION__,
1281
-                                __LINE__
1282
-                            );
1283
-                        }
1284
-                        // well not really... what will happen is
1285
-                        // we'll just get redirected back to redo the current step
1286
-                        $this->go_to_next_step();
1287
-                        return false;
1288
-                    }
1289
-                }
1290
-            } catch (EE_Error $e) {
1291
-                $e->get_error();
1292
-            }
1293
-        }
1294
-        return true;
1295
-    }
1296
-
1297
-
1298
-    /**
1299
-     * _process_action
1300
-     *
1301
-     * @access private
1302
-     * @return void
1303
-     * @throws EE_Error
1304
-     */
1305
-    private function _process_form_action()
1306
-    {
1307
-        // what cha wanna do?
1308
-        switch ($this->checkout->action) {
1309
-            // AJAX next step reg form
1310
-            case 'display_spco_reg_step':
1311
-                $this->checkout->redirect = false;
1312
-                if (EE_Registry::instance()->REQ->ajax) {
1313
-                    $this->checkout->json_response->set_reg_step_html(
1314
-                        $this->checkout->current_step->display_reg_form()
1315
-                    );
1316
-                }
1317
-                break;
1318
-            default:
1319
-                // meh... do one of those other steps first
1320
-                if (! empty($this->checkout->action)
1321
-                    && is_callable(array($this->checkout->current_step, $this->checkout->action))
1322
-                ) {
1323
-                    // dynamically creates hook point like:
1324
-                    //   AHEE__Single_Page_Checkout__before_attendee_information__process_reg_step
1325
-                    do_action(
1326
-                        "AHEE__Single_Page_Checkout__before_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1327
-                        $this->checkout->current_step
1328
-                    );
1329
-                    // call action on current step
1330
-                    if (call_user_func(array($this->checkout->current_step, $this->checkout->action))) {
1331
-                        // good registrant, you get to proceed
1332
-                        if ($this->checkout->current_step->success_message() !== ''
1333
-                            && apply_filters(
1334
-                                'FHEE__Single_Page_Checkout___process_form_action__display_success',
1335
-                                false
1336
-                            )
1337
-                        ) {
1338
-                            EE_Error::add_success(
1339
-                                $this->checkout->current_step->success_message()
1340
-                                . '<br />' . $this->checkout->next_step->_instructions()
1341
-                            );
1342
-                        }
1343
-                        // pack it up, pack it in...
1344
-                        $this->_setup_redirect();
1345
-                    }
1346
-                    // dynamically creates hook point like:
1347
-                    //  AHEE__Single_Page_Checkout__after_payment_options__process_reg_step
1348
-                    do_action(
1349
-                        "AHEE__Single_Page_Checkout__after_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1350
-                        $this->checkout->current_step
1351
-                    );
1352
-                } else {
1353
-                    EE_Error::add_error(
1354
-                        sprintf(
1355
-                            esc_html__(
1356
-                                'The requested form action "%s" does not exist for the current "%s" registration step.',
1357
-                                'event_espresso'
1358
-                            ),
1359
-                            $this->checkout->action,
1360
-                            $this->checkout->current_step->name()
1361
-                        ),
1362
-                        __FILE__,
1363
-                        __FUNCTION__,
1364
-                        __LINE__
1365
-                    );
1366
-                }
1367
-            // end default
1368
-        }
1369
-        // store our progress so far
1370
-        $this->checkout->stash_transaction_and_checkout();
1371
-        // advance to the next step! If you pass GO, collect $200
1372
-        $this->go_to_next_step();
1373
-    }
1374
-
1375
-
1376
-    /**
1377
-     *        add_styles_and_scripts
1378
-     *
1379
-     * @access        public
1380
-     * @return        void
1381
-     */
1382
-    public function add_styles_and_scripts()
1383
-    {
1384
-        // i18n
1385
-        $this->translate_js_strings();
1386
-        if ($this->checkout->admin_request) {
1387
-            add_action('admin_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1388
-        } else {
1389
-            add_action('wp_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1390
-        }
1391
-    }
1392
-
1393
-
1394
-    /**
1395
-     *        translate_js_strings
1396
-     *
1397
-     * @access        public
1398
-     * @return        void
1399
-     */
1400
-    public function translate_js_strings()
1401
-    {
1402
-        EE_Registry::$i18n_js_strings['revisit'] = $this->checkout->revisit;
1403
-        EE_Registry::$i18n_js_strings['e_reg_url_link'] = $this->checkout->reg_url_link;
1404
-        EE_Registry::$i18n_js_strings['server_error'] = esc_html__(
1405
-            'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.',
1406
-            'event_espresso'
1407
-        );
1408
-        EE_Registry::$i18n_js_strings['invalid_json_response'] = esc_html__(
1409
-            'An invalid response was returned from the server while attempting to process your request. Please refresh the page and try again or contact support.',
1410
-            'event_espresso'
1411
-        );
1412
-        EE_Registry::$i18n_js_strings['validation_error'] = esc_html__(
1413
-            'There appears to be a problem with the form validation configuration! Please check the admin settings or contact support.',
1414
-            'event_espresso'
1415
-        );
1416
-        EE_Registry::$i18n_js_strings['invalid_payment_method'] = esc_html__(
1417
-            'There appears to be a problem with the payment method configuration! Please refresh the page and try again or contact support.',
1418
-            'event_espresso'
1419
-        );
1420
-        EE_Registry::$i18n_js_strings['reg_step_error'] = esc_html__(
1421
-            'This registration step could not be completed. Please refresh the page and try again.',
1422
-            'event_espresso'
1423
-        );
1424
-        EE_Registry::$i18n_js_strings['invalid_coupon'] = esc_html__(
1425
-            'We\'re sorry but that coupon code does not appear to be valid. If this is incorrect, please contact the site administrator.',
1426
-            'event_espresso'
1427
-        );
1428
-        EE_Registry::$i18n_js_strings['process_registration'] = sprintf(
1429
-            esc_html__(
1430
-                'Please wait while we process your registration.%sDo not refresh the page or navigate away while this is happening.%sThank you for your patience.',
1431
-                'event_espresso'
1432
-            ),
1433
-            '<br/>',
1434
-            '<br/>'
1435
-        );
1436
-        EE_Registry::$i18n_js_strings['language'] = get_bloginfo('language');
1437
-        EE_Registry::$i18n_js_strings['EESID'] = EE_Registry::instance()->SSN->id();
1438
-        EE_Registry::$i18n_js_strings['currency'] = EE_Registry::instance()->CFG->currency;
1439
-        EE_Registry::$i18n_js_strings['datepicker_yearRange'] = '-150:+20';
1440
-        EE_Registry::$i18n_js_strings['timer_years'] = esc_html__('years', 'event_espresso');
1441
-        EE_Registry::$i18n_js_strings['timer_months'] = esc_html__('months', 'event_espresso');
1442
-        EE_Registry::$i18n_js_strings['timer_weeks'] = esc_html__('weeks', 'event_espresso');
1443
-        EE_Registry::$i18n_js_strings['timer_days'] = esc_html__('days', 'event_espresso');
1444
-        EE_Registry::$i18n_js_strings['timer_hours'] = esc_html__('hours', 'event_espresso');
1445
-        EE_Registry::$i18n_js_strings['timer_minutes'] = esc_html__('minutes', 'event_espresso');
1446
-        EE_Registry::$i18n_js_strings['timer_seconds'] = esc_html__('seconds', 'event_espresso');
1447
-        EE_Registry::$i18n_js_strings['timer_year'] = esc_html__('year', 'event_espresso');
1448
-        EE_Registry::$i18n_js_strings['timer_month'] = esc_html__('month', 'event_espresso');
1449
-        EE_Registry::$i18n_js_strings['timer_week'] = esc_html__('week', 'event_espresso');
1450
-        EE_Registry::$i18n_js_strings['timer_day'] = esc_html__('day', 'event_espresso');
1451
-        EE_Registry::$i18n_js_strings['timer_hour'] = esc_html__('hour', 'event_espresso');
1452
-        EE_Registry::$i18n_js_strings['timer_minute'] = esc_html__('minute', 'event_espresso');
1453
-        EE_Registry::$i18n_js_strings['timer_second'] = esc_html__('second', 'event_espresso');
1454
-        EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice(
1455
-        );
1456
-        EE_Registry::$i18n_js_strings['ajax_submit'] = apply_filters(
1457
-            'FHEE__Single_Page_Checkout__translate_js_strings__ajax_submit',
1458
-            true
1459
-        );
1460
-        EE_Registry::$i18n_js_strings['session_extension'] = absint(
1461
-            apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS)
1462
-        );
1463
-        EE_Registry::$i18n_js_strings['session_expiration'] = gmdate(
1464
-            'M d, Y H:i:s',
1465
-            EE_Registry::instance()->SSN->expiration() + (get_option('gmt_offset') * HOUR_IN_SECONDS)
1466
-        );
1467
-    }
1468
-
1469
-
1470
-    /**
1471
-     *    enqueue_styles_and_scripts
1472
-     *
1473
-     * @access        public
1474
-     * @return        void
1475
-     * @throws EE_Error
1476
-     */
1477
-    public function enqueue_styles_and_scripts()
1478
-    {
1479
-        // load css
1480
-        wp_register_style(
1481
-            'single_page_checkout',
1482
-            SPCO_CSS_URL . 'single_page_checkout.css',
1483
-            array('espresso_default'),
1484
-            EVENT_ESPRESSO_VERSION
1485
-        );
1486
-        wp_enqueue_style('single_page_checkout');
1487
-        // load JS
1488
-        wp_register_script(
1489
-            'jquery_plugin',
1490
-            EE_THIRD_PARTY_URL . 'jquery	.plugin.min.js',
1491
-            array('jquery'),
1492
-            '1.0.1',
1493
-            true
1494
-        );
1495
-        wp_register_script(
1496
-            'jquery_countdown',
1497
-            EE_THIRD_PARTY_URL . 'jquery	.countdown.min.js',
1498
-            array('jquery_plugin'),
1499
-            '2.1.0',
1500
-            true
1501
-        );
1502
-        wp_register_script(
1503
-            'single_page_checkout',
1504
-            SPCO_JS_URL . 'single_page_checkout.js',
1505
-            array('espresso_core', 'underscore', 'ee_form_section_validation'),
1506
-            EVENT_ESPRESSO_VERSION,
1507
-            true
1508
-        );
1509
-        if ($this->checkout->registration_form instanceof EE_Form_Section_Proper) {
1510
-            $this->checkout->registration_form->enqueue_js();
1511
-        }
1512
-        if ($this->checkout->current_step->reg_form instanceof EE_Form_Section_Proper) {
1513
-            $this->checkout->current_step->reg_form->enqueue_js();
1514
-        }
1515
-        wp_enqueue_script('single_page_checkout');
1516
-        if (apply_filters('FHEE__registration_page_wrapper_template__display_time_limit', false)) {
1517
-            wp_enqueue_script('jquery_countdown');
1518
-        }
1519
-        /**
1520
-         * global action hook for enqueueing styles and scripts with
1521
-         * spco calls.
1522
-         */
1523
-        do_action('AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts', $this);
1524
-        /**
1525
-         * dynamic action hook for enqueueing styles and scripts with spco calls.
1526
-         * The hook will end up being something like:
1527
-         *      AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information
1528
-         */
1529
-        do_action(
1530
-            'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(),
1531
-            $this
1532
-        );
1533
-    }
1534
-
1535
-
1536
-    /**
1537
-     *    display the Registration Single Page Checkout Form
1538
-     *
1539
-     * @access    private
1540
-     * @return    void
1541
-     * @throws EE_Error
1542
-     */
1543
-    private function _display_spco_reg_form()
1544
-    {
1545
-        // if registering via the admin, just display the reg form for the current step
1546
-        if ($this->checkout->admin_request) {
1547
-            EE_Registry::instance()->REQ->add_output($this->checkout->current_step->display_reg_form());
1548
-        } else {
1549
-            // add powered by EE msg
1550
-            add_action('AHEE__SPCO__reg_form_footer', array('EED_Single_Page_Checkout', 'display_registration_footer'));
1551
-            $empty_cart = count($this->checkout->transaction
1552
-                                    ->registrations($this->checkout->reg_cache_where_params)) < 1;
1553
-            EE_Registry::$i18n_js_strings['empty_cart'] = $empty_cart;
1554
-            $cookies_not_set_msg = '';
1555
-            if ($empty_cart) {
1556
-                $cookies_not_set_msg = apply_filters(
1557
-                    'FHEE__Single_Page_Checkout__display_spco_reg_form__cookies_not_set_msg',
1558
-                    sprintf(
1559
-                        esc_html__(
1560
-                            '%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',
1561
-                            'event_espresso'
1562
-                        ),
1563
-                        '<div class="ee-attention hidden" id="ee-cookies-not-set-msg">',
1564
-                        '</div>',
1565
-                        '<h6 class="important-notice">',
1566
-                        '</h6>',
1567
-                        '<p>',
1568
-                        '</p>',
1569
-                        '<br />',
1570
-                        '<a href="http://www.whatarecookies.com/enable.asp" target="_blank" rel="noopener noreferrer">',
1571
-                        '</a>'
1572
-                    )
1573
-                );
1574
-            }
1575
-            $this->checkout->registration_form = new EE_Form_Section_Proper(
1576
-                array(
1577
-                    'name'            => 'single-page-checkout',
1578
-                    'html_id'         => 'ee-single-page-checkout-dv',
1579
-                    'layout_strategy' =>
1580
-                        new EE_Template_Layout(
1581
-                            array(
1582
-                                'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php',
1583
-                                'template_args'        => array(
1584
-                                    'empty_cart'              => $empty_cart,
1585
-                                    'revisit'                 => $this->checkout->revisit,
1586
-                                    'reg_steps'               => $this->checkout->reg_steps,
1587
-                                    'next_step'               => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
1588
-                                        ? $this->checkout->next_step->slug()
1589
-                                        : '',
1590
-                                    'empty_msg'               => apply_filters(
1591
-                                        'FHEE__Single_Page_Checkout__display_spco_reg_form__empty_msg',
1592
-                                        sprintf(
1593
-                                            esc_html__(
1594
-                                                'You need to %1$sReturn to Events list%2$sselect at least one event%3$s before you can proceed with the registration process.',
1595
-                                                'event_espresso'
1596
-                                            ),
1597
-                                            '<a href="'
1598
-                                            . get_post_type_archive_link('espresso_events')
1599
-                                            . '" title="',
1600
-                                            '">',
1601
-                                            '</a>'
1602
-                                        )
1603
-                                    ),
1604
-                                    'cookies_not_set_msg'     => $cookies_not_set_msg,
1605
-                                    'registration_time_limit' => $this->checkout->get_registration_time_limit(),
1606
-                                    'session_expiration'      => gmdate(
1607
-                                        'M d, Y H:i:s',
1608
-                                        EE_Registry::instance()->SSN->expiration()
1609
-                                        + (get_option('gmt_offset') * HOUR_IN_SECONDS)
1610
-                                    ),
1611
-                                ),
1612
-                            )
1613
-                        ),
1614
-                )
1615
-            );
1616
-            // load template and add to output sent that gets filtered into the_content()
1617
-            EE_Registry::instance()->REQ->add_output($this->checkout->registration_form->get_html());
1618
-        }
1619
-    }
1620
-
1621
-
1622
-    /**
1623
-     *    add_extra_finalize_registration_inputs
1624
-     *
1625
-     * @access    public
1626
-     * @param $next_step
1627
-     * @internal  param string $label
1628
-     * @return void
1629
-     */
1630
-    public function add_extra_finalize_registration_inputs($next_step)
1631
-    {
1632
-        if ($next_step === 'finalize_registration') {
1633
-            echo '<div id="spco-extra-finalize_registration-inputs-dv"></div>';
1634
-        }
1635
-    }
1636
-
1637
-
1638
-    /**
1639
-     *    display_registration_footer
1640
-     *
1641
-     * @access    public
1642
-     * @return    string
1643
-     */
1644
-    public static function display_registration_footer()
1645
-    {
1646
-        if (apply_filters(
1647
-            'FHEE__EE_Front__Controller__show_reg_footer',
1648
-            EE_Registry::instance()->CFG->admin->show_reg_footer
1649
-        )) {
1650
-            add_filter(
1651
-                'FHEE__EEH_Template__powered_by_event_espresso__url',
1652
-                function ($url) {
1653
-                    return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url);
1654
-                }
1655
-            );
1656
-            echo apply_filters(
1657
-                'FHEE__EE_Front_Controller__display_registration_footer',
1658
-                \EEH_Template::powered_by_event_espresso(
1659
-                    '',
1660
-                    'espresso-registration-footer-dv',
1661
-                    array('utm_content' => 'registration_checkout')
1662
-                )
1663
-            );
1664
-        }
1665
-        return '';
1666
-    }
1667
-
1668
-
1669
-    /**
1670
-     *    unlock_transaction
1671
-     *
1672
-     * @access    public
1673
-     * @return    void
1674
-     * @throws EE_Error
1675
-     */
1676
-    public function unlock_transaction()
1677
-    {
1678
-        if ($this->checkout->transaction instanceof EE_Transaction) {
1679
-            $this->checkout->transaction->unlock();
1680
-        }
1681
-    }
1682
-
1683
-
1684
-    /**
1685
-     *        _setup_redirect
1686
-     *
1687
-     * @access    private
1688
-     * @return void
1689
-     */
1690
-    private function _setup_redirect()
1691
-    {
1692
-        if ($this->checkout->continue_reg && $this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
1693
-            $this->checkout->redirect = true;
1694
-            if (empty($this->checkout->redirect_url)) {
1695
-                $this->checkout->redirect_url = $this->checkout->next_step->reg_step_url();
1696
-            }
1697
-            $this->checkout->redirect_url = apply_filters(
1698
-                'FHEE__EED_Single_Page_Checkout___setup_redirect__checkout_redirect_url',
1699
-                $this->checkout->redirect_url,
1700
-                $this->checkout
1701
-            );
1702
-        }
1703
-    }
1704
-
1705
-
1706
-    /**
1707
-     *   handle ajax message responses and redirects
1708
-     *
1709
-     * @access public
1710
-     * @return void
1711
-     * @throws EE_Error
1712
-     */
1713
-    public function go_to_next_step()
1714
-    {
1715
-        if (EE_Registry::instance()->REQ->ajax) {
1716
-            // capture contents of output buffer we started earlier in the request, and insert into JSON response
1717
-            $this->checkout->json_response->set_unexpected_errors(ob_get_clean());
1718
-        }
1719
-        $this->unlock_transaction();
1720
-        // just return for these conditions
1721
-        if ($this->checkout->admin_request
1722
-            || $this->checkout->action === 'redirect_form'
1723
-            || $this->checkout->action === 'update_checkout'
1724
-        ) {
1725
-            return;
1726
-        }
1727
-        // AJAX response
1728
-        $this->_handle_json_response();
1729
-        // redirect to next step or the Thank You page
1730
-        $this->_handle_html_redirects();
1731
-        // hmmm... must be something wrong, so let's just display the form again !
1732
-        $this->_display_spco_reg_form();
1733
-    }
1734
-
1735
-
1736
-    /**
1737
-     *   _handle_json_response
1738
-     *
1739
-     * @access protected
1740
-     * @return void
1741
-     */
1742
-    protected function _handle_json_response()
1743
-    {
1744
-        // if this is an ajax request
1745
-        if (EE_Registry::instance()->REQ->ajax) {
1746
-            $this->checkout->json_response->set_registration_time_limit(
1747
-                $this->checkout->get_registration_time_limit()
1748
-            );
1749
-            $this->checkout->json_response->set_payment_amount($this->checkout->amount_owing);
1750
-            // just send the ajax (
1751
-            $json_response = apply_filters(
1752
-                'FHEE__EE_Single_Page_Checkout__JSON_response',
1753
-                $this->checkout->json_response
1754
-            );
1755
-            echo $json_response;
1756
-            exit();
1757
-        }
1758
-    }
1759
-
1760
-
1761
-    /**
1762
-     *   _handle_redirects
1763
-     *
1764
-     * @access protected
1765
-     * @return void
1766
-     */
1767
-    protected function _handle_html_redirects()
1768
-    {
1769
-        // going somewhere ?
1770
-        if ($this->checkout->redirect && ! empty($this->checkout->redirect_url)) {
1771
-            // store notices in a transient
1772
-            EE_Error::get_notices(false, true, true);
1773
-            wp_safe_redirect($this->checkout->redirect_url);
1774
-            exit();
1775
-        }
1776
-    }
1777
-
1778
-
1779
-    /**
1780
-     *   set_checkout_anchor
1781
-     *
1782
-     * @access public
1783
-     * @return void
1784
-     */
1785
-    public function set_checkout_anchor()
1786
-    {
1787
-        echo '<a id="checkout" style="float: left; margin-left: -999em;"></a>';
1788
-    }
1789
-
1790
-    /**
1791
-     *    getRegistrationExpirationNotice
1792
-     *
1793
-     * @since     4.9.59.p
1794
-     * @access    public
1795
-     * @return    string
1796
-     */
1797
-    public static function getRegistrationExpirationNotice()
1798
-    {
1799
-        return sprintf(
1800
-            esc_html__(
1801
-                '%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 accept our apologies for any inconvenience this may have caused.%8$s',
1802
-                'event_espresso'
1803
-            ),
1804
-            '<h4 class="important-notice">',
1805
-            '</h4>',
1806
-            '<br />',
1807
-            '<p>',
1808
-            '<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
1809
-            '">',
1810
-            '</a>',
1811
-            '</p>'
1812
-        );
1813
-    }
18
+	/**
19
+	 * $_initialized - has the SPCO controller already been initialized ?
20
+	 *
21
+	 * @access private
22
+	 * @var bool $_initialized
23
+	 */
24
+	private static $_initialized = false;
25
+
26
+
27
+	/**
28
+	 * $_checkout_verified - is the EE_Checkout verified as correct for this request ?
29
+	 *
30
+	 * @access private
31
+	 * @var bool $_valid_checkout
32
+	 */
33
+	private static $_checkout_verified = true;
34
+
35
+	/**
36
+	 *    $_reg_steps_array - holds initial array of reg steps
37
+	 *
38
+	 * @access private
39
+	 * @var array $_reg_steps_array
40
+	 */
41
+	private static $_reg_steps_array = array();
42
+
43
+	/**
44
+	 *    $checkout - EE_Checkout object for handling the properties of the current checkout process
45
+	 *
46
+	 * @access public
47
+	 * @var EE_Checkout $checkout
48
+	 */
49
+	public $checkout;
50
+
51
+
52
+	/**
53
+	 * @return EED_Module|EED_Single_Page_Checkout
54
+	 */
55
+	public static function instance()
56
+	{
57
+		add_filter('EED_Single_Page_Checkout__SPCO_active', '__return_true');
58
+		return parent::get_instance(__CLASS__);
59
+	}
60
+
61
+
62
+	/**
63
+	 * @return EE_CART
64
+	 */
65
+	public function cart()
66
+	{
67
+		return $this->checkout->cart;
68
+	}
69
+
70
+
71
+	/**
72
+	 * @return EE_Transaction
73
+	 */
74
+	public function transaction()
75
+	{
76
+		return $this->checkout->transaction;
77
+	}
78
+
79
+
80
+	/**
81
+	 *    set_hooks - for hooking into EE Core, other modules, etc
82
+	 *
83
+	 * @access    public
84
+	 * @return    void
85
+	 * @throws EE_Error
86
+	 */
87
+	public static function set_hooks()
88
+	{
89
+		EED_Single_Page_Checkout::set_definitions();
90
+	}
91
+
92
+
93
+	/**
94
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
95
+	 *
96
+	 * @access    public
97
+	 * @return    void
98
+	 * @throws EE_Error
99
+	 */
100
+	public static function set_hooks_admin()
101
+	{
102
+		EED_Single_Page_Checkout::set_definitions();
103
+		if (! (defined('DOING_AJAX') && DOING_AJAX)) {
104
+			return;
105
+		}
106
+		// going to start an output buffer in case anything gets accidentally output
107
+		// that might disrupt our JSON response
108
+		ob_start();
109
+		EED_Single_Page_Checkout::load_request_handler();
110
+		EED_Single_Page_Checkout::load_reg_steps();
111
+		// set ajax hooks
112
+		add_action('wp_ajax_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
113
+		add_action('wp_ajax_nopriv_process_reg_step', array('EED_Single_Page_Checkout', 'process_reg_step'));
114
+		add_action('wp_ajax_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
115
+		add_action('wp_ajax_nopriv_display_spco_reg_step', array('EED_Single_Page_Checkout', 'display_reg_step'));
116
+		add_action('wp_ajax_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
117
+		add_action('wp_ajax_nopriv_update_reg_step', array('EED_Single_Page_Checkout', 'update_reg_step'));
118
+	}
119
+
120
+
121
+	/**
122
+	 *    process ajax request
123
+	 *
124
+	 * @param string $ajax_action
125
+	 * @throws EE_Error
126
+	 */
127
+	public static function process_ajax_request($ajax_action)
128
+	{
129
+		EE_Registry::instance()->REQ->set('action', $ajax_action);
130
+		EED_Single_Page_Checkout::instance()->_initialize();
131
+	}
132
+
133
+
134
+	/**
135
+	 *    ajax display registration step
136
+	 *
137
+	 * @throws EE_Error
138
+	 */
139
+	public static function display_reg_step()
140
+	{
141
+		EED_Single_Page_Checkout::process_ajax_request('display_spco_reg_step');
142
+	}
143
+
144
+
145
+	/**
146
+	 *    ajax process registration step
147
+	 *
148
+	 * @throws EE_Error
149
+	 */
150
+	public static function process_reg_step()
151
+	{
152
+		EED_Single_Page_Checkout::process_ajax_request('process_reg_step');
153
+	}
154
+
155
+
156
+	/**
157
+	 *    ajax process registration step
158
+	 *
159
+	 * @throws EE_Error
160
+	 */
161
+	public static function update_reg_step()
162
+	{
163
+		EED_Single_Page_Checkout::process_ajax_request('update_reg_step');
164
+	}
165
+
166
+
167
+	/**
168
+	 *   update_checkout
169
+	 *
170
+	 * @access public
171
+	 * @return void
172
+	 * @throws EE_Error
173
+	 */
174
+	public static function update_checkout()
175
+	{
176
+		EED_Single_Page_Checkout::process_ajax_request('update_checkout');
177
+	}
178
+
179
+
180
+	/**
181
+	 *    load_request_handler
182
+	 *
183
+	 * @access    public
184
+	 * @return    void
185
+	 */
186
+	public static function load_request_handler()
187
+	{
188
+		// load core Request_Handler class
189
+		if (EE_Registry::instance()->REQ !== null) {
190
+			EE_Registry::instance()->load_core('Request_Handler');
191
+		}
192
+	}
193
+
194
+
195
+	/**
196
+	 *    set_definitions
197
+	 *
198
+	 * @access    public
199
+	 * @return    void
200
+	 * @throws EE_Error
201
+	 */
202
+	public static function set_definitions()
203
+	{
204
+		if (defined('SPCO_BASE_PATH')) {
205
+			return;
206
+		}
207
+		define(
208
+			'SPCO_BASE_PATH',
209
+			rtrim(str_replace(array('\\', '/'), '/', plugin_dir_path(__FILE__)), '/') . '/'
210
+		);
211
+		define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css/');
212
+		define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img/');
213
+		define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js/');
214
+		define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc/');
215
+		define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps/');
216
+		define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates/');
217
+		EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true);
218
+		EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice(
219
+		);
220
+	}
221
+
222
+
223
+	/**
224
+	 * load_reg_steps
225
+	 * loads and instantiates each reg step based on the EE_Registry::instance()->CFG->registration->reg_steps array
226
+	 *
227
+	 * @access    private
228
+	 * @throws EE_Error
229
+	 */
230
+	public static function load_reg_steps()
231
+	{
232
+		static $reg_steps_loaded = false;
233
+		if ($reg_steps_loaded) {
234
+			return;
235
+		}
236
+		// filter list of reg_steps
237
+		$reg_steps_to_load = (array) apply_filters(
238
+			'AHEE__SPCO__load_reg_steps__reg_steps_to_load',
239
+			EED_Single_Page_Checkout::get_reg_steps()
240
+		);
241
+		// sort by key (order)
242
+		ksort($reg_steps_to_load);
243
+		// loop through folders
244
+		foreach ($reg_steps_to_load as $order => $reg_step) {
245
+			// we need a
246
+			if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
247
+				// copy over to the reg_steps_array
248
+				EED_Single_Page_Checkout::$_reg_steps_array[ $order ] = $reg_step;
249
+				// register custom key route for each reg step
250
+				// ie: step=>"slug" - this is the entire reason we load the reg steps array now
251
+				EE_Config::register_route(
252
+					$reg_step['slug'],
253
+					'EED_Single_Page_Checkout',
254
+					'run',
255
+					'step'
256
+				);
257
+				// add AJAX or other hooks
258
+				if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) {
259
+					// setup autoloaders if necessary
260
+					if (! class_exists($reg_step['class_name'])) {
261
+						EEH_Autoloader::register_autoloaders_for_each_file_in_folder(
262
+							$reg_step['file_path'],
263
+							true
264
+						);
265
+					}
266
+					if (is_callable($reg_step['class_name'], 'set_hooks')) {
267
+						call_user_func(array($reg_step['class_name'], 'set_hooks'));
268
+					}
269
+				}
270
+			}
271
+		}
272
+		$reg_steps_loaded = true;
273
+	}
274
+
275
+
276
+	/**
277
+	 *    get_reg_steps
278
+	 *
279
+	 * @access    public
280
+	 * @return    array
281
+	 */
282
+	public static function get_reg_steps()
283
+	{
284
+		$reg_steps = EE_Registry::instance()->CFG->registration->reg_steps;
285
+		if (empty($reg_steps)) {
286
+			$reg_steps = array(
287
+				10  => array(
288
+					'file_path'  => SPCO_REG_STEPS_PATH . 'attendee_information',
289
+					'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information',
290
+					'slug'       => 'attendee_information',
291
+					'has_hooks'  => false,
292
+				),
293
+				30  => array(
294
+					'file_path'  => SPCO_REG_STEPS_PATH . 'payment_options',
295
+					'class_name' => 'EE_SPCO_Reg_Step_Payment_Options',
296
+					'slug'       => 'payment_options',
297
+					'has_hooks'  => true,
298
+				),
299
+				999 => array(
300
+					'file_path'  => SPCO_REG_STEPS_PATH . 'finalize_registration',
301
+					'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration',
302
+					'slug'       => 'finalize_registration',
303
+					'has_hooks'  => false,
304
+				),
305
+			);
306
+		}
307
+		return $reg_steps;
308
+	}
309
+
310
+
311
+	/**
312
+	 *    registration_checkout_for_admin
313
+	 *
314
+	 * @access    public
315
+	 * @return    string
316
+	 * @throws EE_Error
317
+	 */
318
+	public static function registration_checkout_for_admin()
319
+	{
320
+		EED_Single_Page_Checkout::load_request_handler();
321
+		EE_Registry::instance()->REQ->set('step', 'attendee_information');
322
+		EE_Registry::instance()->REQ->set('action', 'display_spco_reg_step');
323
+		EE_Registry::instance()->REQ->set('process_form_submission', false);
324
+		EED_Single_Page_Checkout::instance()->_initialize();
325
+		EED_Single_Page_Checkout::instance()->_display_spco_reg_form();
326
+		return EE_Registry::instance()->REQ->get_output();
327
+	}
328
+
329
+
330
+	/**
331
+	 * process_registration_from_admin
332
+	 *
333
+	 * @access public
334
+	 * @return \EE_Transaction
335
+	 * @throws EE_Error
336
+	 */
337
+	public static function process_registration_from_admin()
338
+	{
339
+		EED_Single_Page_Checkout::load_request_handler();
340
+		EE_Registry::instance()->REQ->set('step', 'attendee_information');
341
+		EE_Registry::instance()->REQ->set('action', 'process_reg_step');
342
+		EE_Registry::instance()->REQ->set('process_form_submission', true);
343
+		EED_Single_Page_Checkout::instance()->_initialize();
344
+		if (EED_Single_Page_Checkout::instance()->checkout->current_step->completed()) {
345
+			$final_reg_step = end(EED_Single_Page_Checkout::instance()->checkout->reg_steps);
346
+			if ($final_reg_step instanceof EE_SPCO_Reg_Step_Finalize_Registration) {
347
+				EED_Single_Page_Checkout::instance()->checkout->set_reg_step_initiated($final_reg_step);
348
+				if ($final_reg_step->process_reg_step()) {
349
+					$final_reg_step->set_completed();
350
+					EED_Single_Page_Checkout::instance()->checkout->update_txn_reg_steps_array();
351
+					return EED_Single_Page_Checkout::instance()->checkout->transaction;
352
+				}
353
+			}
354
+		}
355
+		return null;
356
+	}
357
+
358
+
359
+	/**
360
+	 *    run
361
+	 *
362
+	 * @access    public
363
+	 * @param WP_Query $WP_Query
364
+	 * @return    void
365
+	 * @throws EE_Error
366
+	 */
367
+	public function run($WP_Query)
368
+	{
369
+		if ($WP_Query instanceof WP_Query
370
+			&& $WP_Query->is_main_query()
371
+			&& apply_filters('FHEE__EED_Single_Page_Checkout__run', true)
372
+			&& $this->_is_reg_checkout()
373
+		) {
374
+			$this->_initialize();
375
+		}
376
+	}
377
+
378
+
379
+	/**
380
+	 * determines whether current url matches reg page url
381
+	 *
382
+	 * @return bool
383
+	 */
384
+	protected function _is_reg_checkout()
385
+	{
386
+		// get current permalink for reg page without any extra query args
387
+		$reg_page_url = \get_permalink(EE_Config::instance()->core->reg_page_id);
388
+		// get request URI for current request, but without the scheme or host
389
+		$current_request_uri = \EEH_URL::filter_input_server_url('REQUEST_URI');
390
+		$current_request_uri = html_entity_decode($current_request_uri);
391
+		// get array of query args from the current request URI
392
+		$query_args = \EEH_URL::get_query_string($current_request_uri);
393
+		// grab page id if it is set
394
+		$page_id = isset($query_args['page_id']) ? absint($query_args['page_id']) : 0;
395
+		// and remove the page id from the query args (we will re-add it later)
396
+		unset($query_args['page_id']);
397
+		// now strip all query args from current request URI
398
+		$current_request_uri = remove_query_arg(array_keys($query_args), $current_request_uri);
399
+		// and re-add the page id if it was set
400
+		if ($page_id) {
401
+			$current_request_uri = add_query_arg('page_id', $page_id, $current_request_uri);
402
+		}
403
+		// remove slashes and ?
404
+		$current_request_uri = trim($current_request_uri, '?/');
405
+		// is current request URI part of the known full reg page URL ?
406
+		return ! empty($current_request_uri) && strpos($reg_page_url, $current_request_uri) !== false;
407
+	}
408
+
409
+
410
+	/**
411
+	 * @param WP_Query $wp_query
412
+	 * @return    void
413
+	 * @throws EE_Error
414
+	 */
415
+	public static function init($wp_query)
416
+	{
417
+		EED_Single_Page_Checkout::instance()->run($wp_query);
418
+	}
419
+
420
+
421
+	/**
422
+	 *    _initialize - initial module setup
423
+	 *
424
+	 * @access    private
425
+	 * @throws EE_Error
426
+	 * @return    void
427
+	 */
428
+	private function _initialize()
429
+	{
430
+		// ensure SPCO doesn't run twice
431
+		if (EED_Single_Page_Checkout::$_initialized) {
432
+			return;
433
+		}
434
+		try {
435
+			EED_Single_Page_Checkout::load_reg_steps();
436
+			$this->_verify_session();
437
+			// setup the EE_Checkout object
438
+			$this->checkout = $this->_initialize_checkout();
439
+			// filter checkout
440
+			$this->checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize__checkout', $this->checkout);
441
+			// get the $_GET
442
+			$this->_get_request_vars();
443
+			if ($this->_block_bots()) {
444
+				return;
445
+			}
446
+			// filter continue_reg
447
+			$this->checkout->continue_reg = apply_filters(
448
+				'FHEE__EED_Single_Page_Checkout__init___continue_reg',
449
+				true,
450
+				$this->checkout
451
+			);
452
+			// load the reg steps array
453
+			if (! $this->_load_and_instantiate_reg_steps()) {
454
+				EED_Single_Page_Checkout::$_initialized = true;
455
+				return;
456
+			}
457
+			// set the current step
458
+			$this->checkout->set_current_step($this->checkout->step);
459
+			// and the next step
460
+			$this->checkout->set_next_step();
461
+			// verify that everything has been setup correctly
462
+			if (! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) {
463
+				EED_Single_Page_Checkout::$_initialized = true;
464
+				return;
465
+			}
466
+			// lock the transaction
467
+			$this->checkout->transaction->lock();
468
+			// make sure all of our cached objects are added to their respective model entity mappers
469
+			$this->checkout->refresh_all_entities();
470
+			// set amount owing
471
+			$this->checkout->amount_owing = $this->checkout->transaction->remaining();
472
+			// initialize each reg step, which gives them the chance to potentially alter the process
473
+			$this->_initialize_reg_steps();
474
+			// DEBUG LOG
475
+			// $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
476
+			// get reg form
477
+			if (! $this->_check_form_submission()) {
478
+				EED_Single_Page_Checkout::$_initialized = true;
479
+				return;
480
+			}
481
+			// checkout the action!!!
482
+			$this->_process_form_action();
483
+			// add some style and make it dance
484
+			$this->add_styles_and_scripts();
485
+			// kk... SPCO has successfully run
486
+			EED_Single_Page_Checkout::$_initialized = true;
487
+			// set no cache headers and constants
488
+			EE_System::do_not_cache();
489
+			// add anchor
490
+			add_action('loop_start', array($this, 'set_checkout_anchor'), 1);
491
+			// remove transaction lock
492
+			add_action('shutdown', array($this, 'unlock_transaction'), 1);
493
+		} catch (Exception $e) {
494
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
495
+		}
496
+	}
497
+
498
+
499
+	/**
500
+	 *    _verify_session
501
+	 * checks that the session is valid and not expired
502
+	 *
503
+	 * @access    private
504
+	 * @throws EE_Error
505
+	 */
506
+	private function _verify_session()
507
+	{
508
+		if (! EE_Registry::instance()->SSN instanceof EE_Session) {
509
+			throw new EE_Error(esc_html__('The EE_Session class could not be loaded.', 'event_espresso'));
510
+		}
511
+		$clear_session_requested = filter_var(
512
+			EE_Registry::instance()->REQ->get('clear_session', false),
513
+			FILTER_VALIDATE_BOOLEAN
514
+		);
515
+		// is session still valid ?
516
+		if ($clear_session_requested
517
+			|| (EE_Registry::instance()->SSN->expired()
518
+				&& EE_Registry::instance()->REQ->get('e_reg_url_link', '') === ''
519
+			)
520
+		) {
521
+			$this->checkout = new EE_Checkout();
522
+			EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
523
+			// EE_Registry::instance()->SSN->reset_cart();
524
+			// EE_Registry::instance()->SSN->reset_checkout();
525
+			// EE_Registry::instance()->SSN->reset_transaction();
526
+			if (! $clear_session_requested) {
527
+				EE_Error::add_attention(
528
+					EE_Registry::$i18n_js_strings['registration_expiration_notice'],
529
+					__FILE__,
530
+					__FUNCTION__,
531
+					__LINE__
532
+				);
533
+			}
534
+			// EE_Registry::instance()->SSN->reset_expired();
535
+		}
536
+	}
537
+
538
+
539
+	/**
540
+	 *    _initialize_checkout
541
+	 * loads and instantiates EE_Checkout
542
+	 *
543
+	 * @access    private
544
+	 * @throws EE_Error
545
+	 * @return EE_Checkout
546
+	 */
547
+	private function _initialize_checkout()
548
+	{
549
+		// look in session for existing checkout
550
+		/** @type EE_Checkout $checkout */
551
+		$checkout = EE_Registry::instance()->SSN->checkout();
552
+		// verify
553
+		if (! $checkout instanceof EE_Checkout) {
554
+			// instantiate EE_Checkout object for handling the properties of the current checkout process
555
+			$checkout = EE_Registry::instance()->load_file(
556
+				SPCO_INC_PATH,
557
+				'EE_Checkout',
558
+				'class',
559
+				array(),
560
+				false
561
+			);
562
+		} else {
563
+			if ($checkout->current_step->is_final_step() && $checkout->exit_spco() === true) {
564
+				$this->unlock_transaction();
565
+				wp_safe_redirect($checkout->redirect_url);
566
+				exit();
567
+			}
568
+		}
569
+		$checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout);
570
+		// verify again
571
+		if (! $checkout instanceof EE_Checkout) {
572
+			throw new EE_Error(esc_html__('The EE_Checkout class could not be loaded.', 'event_espresso'));
573
+		}
574
+		// reset anything that needs a clean slate for each request
575
+		$checkout->reset_for_current_request();
576
+		return $checkout;
577
+	}
578
+
579
+
580
+	/**
581
+	 *    _get_request_vars
582
+	 *
583
+	 * @access    private
584
+	 * @return    void
585
+	 * @throws EE_Error
586
+	 */
587
+	private function _get_request_vars()
588
+	{
589
+		// load classes
590
+		EED_Single_Page_Checkout::load_request_handler();
591
+		// make sure this request is marked as belonging to EE
592
+		EE_Registry::instance()->REQ->set_espresso_page(true);
593
+		// which step is being requested ?
594
+		$this->checkout->step = EE_Registry::instance()->REQ->get('step', $this->_get_first_step());
595
+		// which step is being edited ?
596
+		$this->checkout->edit_step = EE_Registry::instance()->REQ->get('edit_step', '');
597
+		// and what we're doing on the current step
598
+		$this->checkout->action = EE_Registry::instance()->REQ->get('action', 'display_spco_reg_step');
599
+		// timestamp
600
+		$this->checkout->uts = EE_Registry::instance()->REQ->get('uts', 0);
601
+		// returning to edit ?
602
+		$this->checkout->reg_url_link = EE_Registry::instance()->REQ->get('e_reg_url_link', '');
603
+		// add reg url link to registration query params
604
+		if ($this->checkout->reg_url_link && strpos($this->checkout->reg_url_link, '1-') !== 0) {
605
+			$this->checkout->reg_cache_where_params[0]['REG_url_link'] = $this->checkout->reg_url_link;
606
+		}
607
+		// or some other kind of revisit ?
608
+		$this->checkout->revisit = filter_var(
609
+			EE_Registry::instance()->REQ->get('revisit', false),
610
+			FILTER_VALIDATE_BOOLEAN
611
+		);
612
+		// and whether or not to generate a reg form for this request
613
+		$this->checkout->generate_reg_form = filter_var(
614
+			EE_Registry::instance()->REQ->get('generate_reg_form', true),
615
+			FILTER_VALIDATE_BOOLEAN
616
+		);
617
+		// and whether or not to process a reg form submission for this request
618
+		$this->checkout->process_form_submission = filter_var(
619
+			EE_Registry::instance()->REQ->get(
620
+				'process_form_submission',
621
+				$this->checkout->action === 'process_reg_step'
622
+			),
623
+			FILTER_VALIDATE_BOOLEAN
624
+		);
625
+		$this->checkout->process_form_submission = filter_var(
626
+			$this->checkout->action !== 'display_spco_reg_step'
627
+				? $this->checkout->process_form_submission
628
+				: false,
629
+			FILTER_VALIDATE_BOOLEAN
630
+		);
631
+		// $this->_display_request_vars();
632
+	}
633
+
634
+
635
+	/**
636
+	 *  _display_request_vars
637
+	 *
638
+	 * @access    protected
639
+	 * @return    void
640
+	 */
641
+	protected function _display_request_vars()
642
+	{
643
+		if (! WP_DEBUG) {
644
+			return;
645
+		}
646
+		EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__);
647
+		EEH_Debug_Tools::printr($this->checkout->step, '$this->checkout->step', __FILE__, __LINE__);
648
+		EEH_Debug_Tools::printr($this->checkout->edit_step, '$this->checkout->edit_step', __FILE__, __LINE__);
649
+		EEH_Debug_Tools::printr($this->checkout->action, '$this->checkout->action', __FILE__, __LINE__);
650
+		EEH_Debug_Tools::printr($this->checkout->reg_url_link, '$this->checkout->reg_url_link', __FILE__, __LINE__);
651
+		EEH_Debug_Tools::printr($this->checkout->revisit, '$this->checkout->revisit', __FILE__, __LINE__);
652
+		EEH_Debug_Tools::printr(
653
+			$this->checkout->generate_reg_form,
654
+			'$this->checkout->generate_reg_form',
655
+			__FILE__,
656
+			__LINE__
657
+		);
658
+		EEH_Debug_Tools::printr(
659
+			$this->checkout->process_form_submission,
660
+			'$this->checkout->process_form_submission',
661
+			__FILE__,
662
+			__LINE__
663
+		);
664
+	}
665
+
666
+
667
+	/**
668
+	 * _block_bots
669
+	 * checks that the incoming request has either of the following set:
670
+	 *  a uts (unix timestamp) which indicates that the request was redirected from the Ticket Selector
671
+	 *  a REG URL Link, which indicates that the request is a return visit to SPCO for a valid TXN
672
+	 * so if you're not coming from the Ticket Selector nor returning for a valid IP...
673
+	 * then where you coming from man?
674
+	 *
675
+	 * @return boolean
676
+	 */
677
+	private function _block_bots()
678
+	{
679
+		$invalid_checkout_access = EED_Invalid_Checkout_Access::getInvalidCheckoutAccess();
680
+		if ($invalid_checkout_access->checkoutAccessIsInvalid($this->checkout)) {
681
+			return true;
682
+		}
683
+		return false;
684
+	}
685
+
686
+
687
+	/**
688
+	 *    _get_first_step
689
+	 *  gets slug for first step in $_reg_steps_array
690
+	 *
691
+	 * @access    private
692
+	 * @throws EE_Error
693
+	 * @return    string
694
+	 */
695
+	private function _get_first_step()
696
+	{
697
+		$first_step = reset(EED_Single_Page_Checkout::$_reg_steps_array);
698
+		return isset($first_step['slug']) ? $first_step['slug'] : 'attendee_information';
699
+	}
700
+
701
+
702
+	/**
703
+	 * instantiates each reg step based on the loaded reg_steps array
704
+	 *
705
+	 * @return    bool
706
+	 * @throws EE_Error
707
+	 * @throws InvalidArgumentException
708
+	 * @throws InvalidDataTypeException
709
+	 * @throws InvalidInterfaceException
710
+	 */
711
+	private function _load_and_instantiate_reg_steps()
712
+	{
713
+		do_action('AHEE__Single_Page_Checkout___load_and_instantiate_reg_steps__start', $this->checkout);
714
+		// have reg_steps already been instantiated ?
715
+		if (empty($this->checkout->reg_steps)
716
+			|| apply_filters('FHEE__Single_Page_Checkout__load_reg_steps__reload_reg_steps', false, $this->checkout)
717
+		) {
718
+			// if not, then loop through raw reg steps array
719
+			foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) {
720
+				if (! $this->_load_and_instantiate_reg_step($reg_step, $order)) {
721
+					return false;
722
+				}
723
+			}
724
+			if (isset($this->checkout->reg_steps['registration_confirmation'])) {
725
+				// skip the registration_confirmation page ?
726
+				if (EE_Registry::instance()->CFG->registration->skip_reg_confirmation) {
727
+					// just remove it from the reg steps array
728
+					$this->checkout->remove_reg_step('registration_confirmation', false);
729
+				} elseif (EE_Registry::instance()->CFG->registration->reg_confirmation_last
730
+				) {
731
+					// set the order to something big like 100
732
+					$this->checkout->set_reg_step_order('registration_confirmation', 100);
733
+				}
734
+			}
735
+			// filter the array for good luck
736
+			$this->checkout->reg_steps = apply_filters(
737
+				'FHEE__Single_Page_Checkout__load_reg_steps__reg_steps',
738
+				$this->checkout->reg_steps
739
+			);
740
+			// finally re-sort based on the reg step class order properties
741
+			$this->checkout->sort_reg_steps();
742
+		} else {
743
+			foreach ($this->checkout->reg_steps as $reg_step) {
744
+				// set all current step stati to FALSE
745
+				$reg_step->set_is_current_step(false);
746
+			}
747
+		}
748
+		if (empty($this->checkout->reg_steps)) {
749
+			EE_Error::add_error(
750
+				esc_html__('No Reg Steps were loaded..', 'event_espresso'),
751
+				__FILE__,
752
+				__FUNCTION__,
753
+				__LINE__
754
+			);
755
+			return false;
756
+		}
757
+		// make reg step details available to JS
758
+		$this->checkout->set_reg_step_JSON_info();
759
+		return true;
760
+	}
761
+
762
+
763
+	/**
764
+	 *     _load_and_instantiate_reg_step
765
+	 *
766
+	 * @access    private
767
+	 * @param array $reg_step
768
+	 * @param int   $order
769
+	 * @return bool
770
+	 */
771
+	private function _load_and_instantiate_reg_step($reg_step = array(), $order = 0)
772
+	{
773
+		// we need a file_path, class_name, and slug to add a reg step
774
+		if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
775
+			// if editing a specific step, but this is NOT that step... (and it's not the 'finalize_registration' step)
776
+			if ($this->checkout->reg_url_link
777
+				&& $this->checkout->step !== $reg_step['slug']
778
+				&& $reg_step['slug'] !== 'finalize_registration'
779
+				// normally at this point we would NOT load the reg step, but this filter can change that
780
+				&& apply_filters(
781
+					'FHEE__Single_Page_Checkout___load_and_instantiate_reg_step__bypass_reg_step',
782
+					true,
783
+					$reg_step,
784
+					$this->checkout
785
+				)
786
+			) {
787
+				return true;
788
+			}
789
+			// instantiate step class using file path and class name
790
+			$reg_step_obj = EE_Registry::instance()->load_file(
791
+				$reg_step['file_path'],
792
+				$reg_step['class_name'],
793
+				'class',
794
+				$this->checkout,
795
+				false
796
+			);
797
+			// did we gets the goods ?
798
+			if ($reg_step_obj instanceof EE_SPCO_Reg_Step) {
799
+				// set reg step order based on config
800
+				$reg_step_obj->set_order($order);
801
+				// add instantiated reg step object to the master reg steps array
802
+				$this->checkout->add_reg_step($reg_step_obj);
803
+			} else {
804
+				EE_Error::add_error(
805
+					esc_html__('The current step could not be set.', 'event_espresso'),
806
+					__FILE__,
807
+					__FUNCTION__,
808
+					__LINE__
809
+				);
810
+				return false;
811
+			}
812
+		} else {
813
+			if (WP_DEBUG) {
814
+				EE_Error::add_error(
815
+					sprintf(
816
+						esc_html__(
817
+							'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',
818
+							'event_espresso'
819
+						),
820
+						isset($reg_step['file_path']) ? $reg_step['file_path'] : '',
821
+						isset($reg_step['class_name']) ? $reg_step['class_name'] : '',
822
+						isset($reg_step['slug']) ? $reg_step['slug'] : '',
823
+						'<ul>',
824
+						'<li>',
825
+						'</li>',
826
+						'</ul>'
827
+					),
828
+					__FILE__,
829
+					__FUNCTION__,
830
+					__LINE__
831
+				);
832
+			}
833
+			return false;
834
+		}
835
+		return true;
836
+	}
837
+
838
+
839
+	/**
840
+	 * _verify_transaction_and_get_registrations
841
+	 *
842
+	 * @access private
843
+	 * @return bool
844
+	 * @throws InvalidDataTypeException
845
+	 * @throws InvalidEntityException
846
+	 * @throws EE_Error
847
+	 */
848
+	private function _verify_transaction_and_get_registrations()
849
+	{
850
+		// was there already a valid transaction in the checkout from the session ?
851
+		if (! $this->checkout->transaction instanceof EE_Transaction) {
852
+			// get transaction from db or session
853
+			$this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin()
854
+				? $this->_get_transaction_and_cart_for_previous_visit()
855
+				: $this->_get_cart_for_current_session_and_setup_new_transaction();
856
+			if (! $this->checkout->transaction instanceof EE_Transaction) {
857
+				EE_Error::add_error(
858
+					esc_html__(
859
+						'Your Registration and Transaction information could not be retrieved from the db.',
860
+						'event_espresso'
861
+					),
862
+					__FILE__,
863
+					__FUNCTION__,
864
+					__LINE__
865
+				);
866
+				$this->checkout->transaction = EE_Transaction::new_instance();
867
+				// add some style and make it dance
868
+				$this->add_styles_and_scripts();
869
+				EED_Single_Page_Checkout::$_initialized = true;
870
+				return false;
871
+			}
872
+			// and the registrations for the transaction
873
+			$this->_get_registrations($this->checkout->transaction);
874
+		}
875
+		return true;
876
+	}
877
+
878
+
879
+	/**
880
+	 * _get_transaction_and_cart_for_previous_visit
881
+	 *
882
+	 * @access private
883
+	 * @return mixed EE_Transaction|NULL
884
+	 */
885
+	private function _get_transaction_and_cart_for_previous_visit()
886
+	{
887
+		/** @var $TXN_model EEM_Transaction */
888
+		$TXN_model = EE_Registry::instance()->load_model('Transaction');
889
+		// because the reg_url_link is present in the request,
890
+		// this is a return visit to SPCO, so we'll get the transaction data from the db
891
+		$transaction = $TXN_model->get_transaction_from_reg_url_link($this->checkout->reg_url_link);
892
+		// verify transaction
893
+		if ($transaction instanceof EE_Transaction) {
894
+			// and get the cart that was used for that transaction
895
+			$this->checkout->cart = $this->_get_cart_for_transaction($transaction);
896
+			return $transaction;
897
+		}
898
+		EE_Error::add_error(
899
+			esc_html__('Your Registration and Transaction information could not be retrieved from the db.', 'event_espresso'),
900
+			__FILE__,
901
+			__FUNCTION__,
902
+			__LINE__
903
+		);
904
+		return null;
905
+	}
906
+
907
+
908
+	/**
909
+	 * _get_cart_for_transaction
910
+	 *
911
+	 * @access private
912
+	 * @param EE_Transaction $transaction
913
+	 * @return EE_Cart
914
+	 */
915
+	private function _get_cart_for_transaction($transaction)
916
+	{
917
+		return $this->checkout->get_cart_for_transaction($transaction);
918
+	}
919
+
920
+
921
+	/**
922
+	 * get_cart_for_transaction
923
+	 *
924
+	 * @access public
925
+	 * @param EE_Transaction $transaction
926
+	 * @return EE_Cart
927
+	 */
928
+	public function get_cart_for_transaction(EE_Transaction $transaction)
929
+	{
930
+		return $this->checkout->get_cart_for_transaction($transaction);
931
+	}
932
+
933
+
934
+	/**
935
+	 * _get_transaction_and_cart_for_current_session
936
+	 *    generates a new EE_Transaction object and adds it to the $_transaction property.
937
+	 *
938
+	 * @access private
939
+	 * @return EE_Transaction
940
+	 * @throws EE_Error
941
+	 */
942
+	private function _get_cart_for_current_session_and_setup_new_transaction()
943
+	{
944
+		//  if there's no transaction, then this is the FIRST visit to SPCO
945
+		// so load up the cart ( passing nothing for the TXN because it doesn't exist yet )
946
+		$this->checkout->cart = $this->_get_cart_for_transaction(null);
947
+		// and then create a new transaction
948
+		$transaction = $this->_initialize_transaction();
949
+		// verify transaction
950
+		if ($transaction instanceof EE_Transaction) {
951
+			// save it so that we have an ID for other objects to use
952
+			$transaction->save();
953
+			// and save TXN data to the cart
954
+			$this->checkout->cart->get_grand_total()->save_this_and_descendants_to_txn($transaction->ID());
955
+		} else {
956
+			EE_Error::add_error(
957
+				esc_html__('A Valid Transaction could not be initialized.', 'event_espresso'),
958
+				__FILE__,
959
+				__FUNCTION__,
960
+				__LINE__
961
+			);
962
+		}
963
+		return $transaction;
964
+	}
965
+
966
+
967
+	/**
968
+	 *    generates a new EE_Transaction object and adds it to the $_transaction property.
969
+	 *
970
+	 * @access private
971
+	 * @return mixed EE_Transaction|NULL
972
+	 */
973
+	private function _initialize_transaction()
974
+	{
975
+		try {
976
+			// ensure cart totals have been calculated
977
+			$this->checkout->cart->get_grand_total()->recalculate_total_including_taxes();
978
+			// grab the cart grand total
979
+			$cart_total = $this->checkout->cart->get_cart_grand_total();
980
+			// create new TXN
981
+			$transaction = EE_Transaction::new_instance(
982
+				array(
983
+					'TXN_reg_steps' => $this->checkout->initialize_txn_reg_steps_array(),
984
+					'TXN_total'     => $cart_total > 0 ? $cart_total : 0,
985
+					'TXN_paid'      => 0,
986
+					'STS_ID'        => EEM_Transaction::failed_status_code,
987
+				)
988
+			);
989
+			// save it so that we have an ID for other objects to use
990
+			$transaction->save();
991
+			// set cron job for following up on TXNs after their session has expired
992
+			EE_Cron_Tasks::schedule_expired_transaction_check(
993
+				EE_Registry::instance()->SSN->expiration() + 1,
994
+				$transaction->ID()
995
+			);
996
+			return $transaction;
997
+		} catch (Exception $e) {
998
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
999
+		}
1000
+		return null;
1001
+	}
1002
+
1003
+
1004
+	/**
1005
+	 * _get_registrations
1006
+	 *
1007
+	 * @access private
1008
+	 * @param EE_Transaction $transaction
1009
+	 * @return void
1010
+	 * @throws InvalidDataTypeException
1011
+	 * @throws InvalidEntityException
1012
+	 * @throws EE_Error
1013
+	 */
1014
+	private function _get_registrations(EE_Transaction $transaction)
1015
+	{
1016
+		// first step: grab the registrants  { : o
1017
+		$registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false);
1018
+		$this->checkout->total_ticket_count = count($registrations);
1019
+		// verify registrations have been set
1020
+		if (empty($registrations)) {
1021
+			// if no cached registrations, then check the db
1022
+			$registrations = $transaction->registrations($this->checkout->reg_cache_where_params, false);
1023
+			// still nothing ? well as long as this isn't a revisit
1024
+			if (empty($registrations) && ! $this->checkout->revisit) {
1025
+				// generate new registrations from scratch
1026
+				$registrations = $this->_initialize_registrations($transaction);
1027
+			}
1028
+		}
1029
+		// sort by their original registration order
1030
+		usort($registrations, array('EED_Single_Page_Checkout', 'sort_registrations_by_REG_count'));
1031
+		// then loop thru the array
1032
+		foreach ($registrations as $registration) {
1033
+			// verify each registration
1034
+			if ($registration instanceof EE_Registration) {
1035
+				// we display all attendee info for the primary registrant
1036
+				if ($this->checkout->reg_url_link === $registration->reg_url_link()
1037
+					&& $registration->is_primary_registrant()
1038
+				) {
1039
+					$this->checkout->primary_revisit = true;
1040
+					break;
1041
+				}
1042
+				if ($this->checkout->revisit && $this->checkout->reg_url_link !== $registration->reg_url_link()) {
1043
+					// but hide info if it doesn't belong to you
1044
+					$transaction->clear_cache('Registration', $registration->ID());
1045
+					$this->checkout->total_ticket_count--;
1046
+				}
1047
+				$this->checkout->set_reg_status_updated($registration->ID(), false);
1048
+			}
1049
+		}
1050
+	}
1051
+
1052
+
1053
+	/**
1054
+	 *    adds related EE_Registration objects for each ticket in the cart to the current EE_Transaction object
1055
+	 *
1056
+	 * @access private
1057
+	 * @param EE_Transaction $transaction
1058
+	 * @return    array
1059
+	 * @throws InvalidDataTypeException
1060
+	 * @throws InvalidEntityException
1061
+	 * @throws EE_Error
1062
+	 */
1063
+	private function _initialize_registrations(EE_Transaction $transaction)
1064
+	{
1065
+		$att_nmbr = 0;
1066
+		$registrations = array();
1067
+		if ($transaction instanceof EE_Transaction) {
1068
+			/** @type EE_Registration_Processor $registration_processor */
1069
+			$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
1070
+			$this->checkout->total_ticket_count = $this->checkout->cart->all_ticket_quantity_count();
1071
+			// now let's add the cart items to the $transaction
1072
+			foreach ($this->checkout->cart->get_tickets() as $line_item) {
1073
+				// do the following for each ticket of this type they selected
1074
+				for ($x = 1; $x <= $line_item->quantity(); $x++) {
1075
+					$att_nmbr++;
1076
+					/** @var EventEspresso\core\services\commands\registration\CreateRegistrationCommand $CreateRegistrationCommand */
1077
+					$CreateRegistrationCommand = EE_Registry::instance()->create(
1078
+						'EventEspresso\core\services\commands\registration\CreateRegistrationCommand',
1079
+						array(
1080
+							$transaction,
1081
+							$line_item,
1082
+							$att_nmbr,
1083
+							$this->checkout->total_ticket_count,
1084
+						)
1085
+					);
1086
+					// override capabilities for frontend registrations
1087
+					if (! is_admin()) {
1088
+						$CreateRegistrationCommand->setCapCheck(
1089
+							new PublicCapabilities('', 'create_new_registration')
1090
+						);
1091
+					}
1092
+					$registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand);
1093
+					if (! $registration instanceof EE_Registration) {
1094
+						throw new InvalidEntityException($registration, 'EE_Registration');
1095
+					}
1096
+					$registrations[ $registration->ID() ] = $registration;
1097
+				}
1098
+			}
1099
+			$registration_processor->fix_reg_final_price_rounding_issue($transaction);
1100
+		}
1101
+		return $registrations;
1102
+	}
1103
+
1104
+
1105
+	/**
1106
+	 * sorts registrations by REG_count
1107
+	 *
1108
+	 * @access public
1109
+	 * @param EE_Registration $reg_A
1110
+	 * @param EE_Registration $reg_B
1111
+	 * @return int
1112
+	 */
1113
+	public static function sort_registrations_by_REG_count(EE_Registration $reg_A, EE_Registration $reg_B)
1114
+	{
1115
+		// this shouldn't ever happen within the same TXN, but oh well
1116
+		if ($reg_A->count() === $reg_B->count()) {
1117
+			return 0;
1118
+		}
1119
+		return ($reg_A->count() > $reg_B->count()) ? 1 : -1;
1120
+	}
1121
+
1122
+
1123
+	/**
1124
+	 *    _final_verifications
1125
+	 * just makes sure that everything is set up correctly before proceeding
1126
+	 *
1127
+	 * @access    private
1128
+	 * @return    bool
1129
+	 * @throws EE_Error
1130
+	 */
1131
+	private function _final_verifications()
1132
+	{
1133
+		// filter checkout
1134
+		$this->checkout = apply_filters(
1135
+			'FHEE__EED_Single_Page_Checkout___final_verifications__checkout',
1136
+			$this->checkout
1137
+		);
1138
+		// verify that current step is still set correctly
1139
+		if (! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) {
1140
+			EE_Error::add_error(
1141
+				esc_html__(
1142
+					'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.',
1143
+					'event_espresso'
1144
+				),
1145
+				__FILE__,
1146
+				__FUNCTION__,
1147
+				__LINE__
1148
+			);
1149
+			return false;
1150
+		}
1151
+		// if returning to SPCO, then verify that primary registrant is set
1152
+		if (! empty($this->checkout->reg_url_link)) {
1153
+			$valid_registrant = $this->checkout->transaction->primary_registration();
1154
+			if (! $valid_registrant instanceof EE_Registration) {
1155
+				EE_Error::add_error(
1156
+					esc_html__(
1157
+						'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.',
1158
+						'event_espresso'
1159
+					),
1160
+					__FILE__,
1161
+					__FUNCTION__,
1162
+					__LINE__
1163
+				);
1164
+				return false;
1165
+			}
1166
+			$valid_registrant = null;
1167
+			foreach ($this->checkout->transaction->registrations($this->checkout->reg_cache_where_params) as $registration) {
1168
+				if ($registration instanceof EE_Registration
1169
+					&& $registration->reg_url_link() === $this->checkout->reg_url_link
1170
+				) {
1171
+					$valid_registrant = $registration;
1172
+				}
1173
+			}
1174
+			if (! $valid_registrant instanceof EE_Registration) {
1175
+				// hmmm... maybe we have the wrong session because the user is opening multiple tabs ?
1176
+				if (EED_Single_Page_Checkout::$_checkout_verified) {
1177
+					// clear the session, mark the checkout as unverified, and try again
1178
+					EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
1179
+					EED_Single_Page_Checkout::$_initialized = false;
1180
+					EED_Single_Page_Checkout::$_checkout_verified = false;
1181
+					$this->_initialize();
1182
+					EE_Error::reset_notices();
1183
+					return false;
1184
+				}
1185
+				EE_Error::add_error(
1186
+					esc_html__(
1187
+						'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.',
1188
+						'event_espresso'
1189
+					),
1190
+					__FILE__,
1191
+					__FUNCTION__,
1192
+					__LINE__
1193
+				);
1194
+				return false;
1195
+			}
1196
+		}
1197
+		// now that things have been kinda sufficiently verified,
1198
+		// let's add the checkout to the session so that it's available to other systems
1199
+		EE_Registry::instance()->SSN->set_checkout($this->checkout);
1200
+		return true;
1201
+	}
1202
+
1203
+
1204
+	/**
1205
+	 *    _initialize_reg_steps
1206
+	 * first makes sure that EE_Transaction_Processor::set_reg_step_initiated() is called as required
1207
+	 * then loops thru all of the active reg steps and calls the initialize_reg_step() method
1208
+	 *
1209
+	 * @access    private
1210
+	 * @param bool $reinitializing
1211
+	 * @throws EE_Error
1212
+	 */
1213
+	private function _initialize_reg_steps($reinitializing = false)
1214
+	{
1215
+		$this->checkout->set_reg_step_initiated($this->checkout->current_step);
1216
+		// loop thru all steps to call their individual "initialize" methods and set i18n strings for JS
1217
+		foreach ($this->checkout->reg_steps as $reg_step) {
1218
+			if (! $reg_step->initialize_reg_step()) {
1219
+				// if not initialized then maybe this step is being removed...
1220
+				if (! $reinitializing && $reg_step->is_current_step()) {
1221
+					// if it was the current step, then we need to start over here
1222
+					$this->_initialize_reg_steps(true);
1223
+					return;
1224
+				}
1225
+				continue;
1226
+			}
1227
+			// add css and JS for current step
1228
+			$reg_step->enqueue_styles_and_scripts();
1229
+			// i18n
1230
+			$reg_step->translate_js_strings();
1231
+			if ($reg_step->is_current_step()) {
1232
+				// the text that appears on the reg step form submit button
1233
+				$reg_step->set_submit_button_text();
1234
+			}
1235
+		}
1236
+		// dynamically creates hook point like: AHEE__Single_Page_Checkout___initialize_reg_step__attendee_information
1237
+		do_action(
1238
+			"AHEE__Single_Page_Checkout___initialize_reg_step__{$this->checkout->current_step->slug()}",
1239
+			$this->checkout->current_step
1240
+		);
1241
+	}
1242
+
1243
+
1244
+	/**
1245
+	 * _check_form_submission
1246
+	 *
1247
+	 * @access private
1248
+	 * @return boolean
1249
+	 */
1250
+	private function _check_form_submission()
1251
+	{
1252
+		// does this request require the reg form to be generated ?
1253
+		if ($this->checkout->generate_reg_form) {
1254
+			// ever heard that song by Blue Rodeo ?
1255
+			try {
1256
+				$this->checkout->current_step->reg_form = $this->checkout->current_step->generate_reg_form();
1257
+				// if not displaying a form, then check for form submission
1258
+				if ($this->checkout->process_form_submission
1259
+					&& $this->checkout->current_step->reg_form->was_submitted()
1260
+				) {
1261
+					// clear out any old data in case this step is being run again
1262
+					$this->checkout->current_step->set_valid_data(array());
1263
+					// capture submitted form data
1264
+					$this->checkout->current_step->reg_form->receive_form_submission(
1265
+						apply_filters(
1266
+							'FHEE__Single_Page_Checkout___check_form_submission__request_params',
1267
+							EE_Registry::instance()->REQ->params(),
1268
+							$this->checkout
1269
+						)
1270
+					);
1271
+					// validate submitted form data
1272
+					if (! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) {
1273
+						// thou shall not pass !!!
1274
+						$this->checkout->continue_reg = false;
1275
+						// any form validation errors?
1276
+						if ($this->checkout->current_step->reg_form->submission_error_message() !== '') {
1277
+							EE_Error::add_error(
1278
+								$this->checkout->current_step->reg_form->submission_error_message(),
1279
+								__FILE__,
1280
+								__FUNCTION__,
1281
+								__LINE__
1282
+							);
1283
+						}
1284
+						// well not really... what will happen is
1285
+						// we'll just get redirected back to redo the current step
1286
+						$this->go_to_next_step();
1287
+						return false;
1288
+					}
1289
+				}
1290
+			} catch (EE_Error $e) {
1291
+				$e->get_error();
1292
+			}
1293
+		}
1294
+		return true;
1295
+	}
1296
+
1297
+
1298
+	/**
1299
+	 * _process_action
1300
+	 *
1301
+	 * @access private
1302
+	 * @return void
1303
+	 * @throws EE_Error
1304
+	 */
1305
+	private function _process_form_action()
1306
+	{
1307
+		// what cha wanna do?
1308
+		switch ($this->checkout->action) {
1309
+			// AJAX next step reg form
1310
+			case 'display_spco_reg_step':
1311
+				$this->checkout->redirect = false;
1312
+				if (EE_Registry::instance()->REQ->ajax) {
1313
+					$this->checkout->json_response->set_reg_step_html(
1314
+						$this->checkout->current_step->display_reg_form()
1315
+					);
1316
+				}
1317
+				break;
1318
+			default:
1319
+				// meh... do one of those other steps first
1320
+				if (! empty($this->checkout->action)
1321
+					&& is_callable(array($this->checkout->current_step, $this->checkout->action))
1322
+				) {
1323
+					// dynamically creates hook point like:
1324
+					//   AHEE__Single_Page_Checkout__before_attendee_information__process_reg_step
1325
+					do_action(
1326
+						"AHEE__Single_Page_Checkout__before_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1327
+						$this->checkout->current_step
1328
+					);
1329
+					// call action on current step
1330
+					if (call_user_func(array($this->checkout->current_step, $this->checkout->action))) {
1331
+						// good registrant, you get to proceed
1332
+						if ($this->checkout->current_step->success_message() !== ''
1333
+							&& apply_filters(
1334
+								'FHEE__Single_Page_Checkout___process_form_action__display_success',
1335
+								false
1336
+							)
1337
+						) {
1338
+							EE_Error::add_success(
1339
+								$this->checkout->current_step->success_message()
1340
+								. '<br />' . $this->checkout->next_step->_instructions()
1341
+							);
1342
+						}
1343
+						// pack it up, pack it in...
1344
+						$this->_setup_redirect();
1345
+					}
1346
+					// dynamically creates hook point like:
1347
+					//  AHEE__Single_Page_Checkout__after_payment_options__process_reg_step
1348
+					do_action(
1349
+						"AHEE__Single_Page_Checkout__after_{$this->checkout->current_step->slug()}__{$this->checkout->action}",
1350
+						$this->checkout->current_step
1351
+					);
1352
+				} else {
1353
+					EE_Error::add_error(
1354
+						sprintf(
1355
+							esc_html__(
1356
+								'The requested form action "%s" does not exist for the current "%s" registration step.',
1357
+								'event_espresso'
1358
+							),
1359
+							$this->checkout->action,
1360
+							$this->checkout->current_step->name()
1361
+						),
1362
+						__FILE__,
1363
+						__FUNCTION__,
1364
+						__LINE__
1365
+					);
1366
+				}
1367
+			// end default
1368
+		}
1369
+		// store our progress so far
1370
+		$this->checkout->stash_transaction_and_checkout();
1371
+		// advance to the next step! If you pass GO, collect $200
1372
+		$this->go_to_next_step();
1373
+	}
1374
+
1375
+
1376
+	/**
1377
+	 *        add_styles_and_scripts
1378
+	 *
1379
+	 * @access        public
1380
+	 * @return        void
1381
+	 */
1382
+	public function add_styles_and_scripts()
1383
+	{
1384
+		// i18n
1385
+		$this->translate_js_strings();
1386
+		if ($this->checkout->admin_request) {
1387
+			add_action('admin_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1388
+		} else {
1389
+			add_action('wp_enqueue_scripts', array($this, 'enqueue_styles_and_scripts'), 10);
1390
+		}
1391
+	}
1392
+
1393
+
1394
+	/**
1395
+	 *        translate_js_strings
1396
+	 *
1397
+	 * @access        public
1398
+	 * @return        void
1399
+	 */
1400
+	public function translate_js_strings()
1401
+	{
1402
+		EE_Registry::$i18n_js_strings['revisit'] = $this->checkout->revisit;
1403
+		EE_Registry::$i18n_js_strings['e_reg_url_link'] = $this->checkout->reg_url_link;
1404
+		EE_Registry::$i18n_js_strings['server_error'] = esc_html__(
1405
+			'An unknown error occurred on the server while attempting to process your request. Please refresh the page and try again or contact support.',
1406
+			'event_espresso'
1407
+		);
1408
+		EE_Registry::$i18n_js_strings['invalid_json_response'] = esc_html__(
1409
+			'An invalid response was returned from the server while attempting to process your request. Please refresh the page and try again or contact support.',
1410
+			'event_espresso'
1411
+		);
1412
+		EE_Registry::$i18n_js_strings['validation_error'] = esc_html__(
1413
+			'There appears to be a problem with the form validation configuration! Please check the admin settings or contact support.',
1414
+			'event_espresso'
1415
+		);
1416
+		EE_Registry::$i18n_js_strings['invalid_payment_method'] = esc_html__(
1417
+			'There appears to be a problem with the payment method configuration! Please refresh the page and try again or contact support.',
1418
+			'event_espresso'
1419
+		);
1420
+		EE_Registry::$i18n_js_strings['reg_step_error'] = esc_html__(
1421
+			'This registration step could not be completed. Please refresh the page and try again.',
1422
+			'event_espresso'
1423
+		);
1424
+		EE_Registry::$i18n_js_strings['invalid_coupon'] = esc_html__(
1425
+			'We\'re sorry but that coupon code does not appear to be valid. If this is incorrect, please contact the site administrator.',
1426
+			'event_espresso'
1427
+		);
1428
+		EE_Registry::$i18n_js_strings['process_registration'] = sprintf(
1429
+			esc_html__(
1430
+				'Please wait while we process your registration.%sDo not refresh the page or navigate away while this is happening.%sThank you for your patience.',
1431
+				'event_espresso'
1432
+			),
1433
+			'<br/>',
1434
+			'<br/>'
1435
+		);
1436
+		EE_Registry::$i18n_js_strings['language'] = get_bloginfo('language');
1437
+		EE_Registry::$i18n_js_strings['EESID'] = EE_Registry::instance()->SSN->id();
1438
+		EE_Registry::$i18n_js_strings['currency'] = EE_Registry::instance()->CFG->currency;
1439
+		EE_Registry::$i18n_js_strings['datepicker_yearRange'] = '-150:+20';
1440
+		EE_Registry::$i18n_js_strings['timer_years'] = esc_html__('years', 'event_espresso');
1441
+		EE_Registry::$i18n_js_strings['timer_months'] = esc_html__('months', 'event_espresso');
1442
+		EE_Registry::$i18n_js_strings['timer_weeks'] = esc_html__('weeks', 'event_espresso');
1443
+		EE_Registry::$i18n_js_strings['timer_days'] = esc_html__('days', 'event_espresso');
1444
+		EE_Registry::$i18n_js_strings['timer_hours'] = esc_html__('hours', 'event_espresso');
1445
+		EE_Registry::$i18n_js_strings['timer_minutes'] = esc_html__('minutes', 'event_espresso');
1446
+		EE_Registry::$i18n_js_strings['timer_seconds'] = esc_html__('seconds', 'event_espresso');
1447
+		EE_Registry::$i18n_js_strings['timer_year'] = esc_html__('year', 'event_espresso');
1448
+		EE_Registry::$i18n_js_strings['timer_month'] = esc_html__('month', 'event_espresso');
1449
+		EE_Registry::$i18n_js_strings['timer_week'] = esc_html__('week', 'event_espresso');
1450
+		EE_Registry::$i18n_js_strings['timer_day'] = esc_html__('day', 'event_espresso');
1451
+		EE_Registry::$i18n_js_strings['timer_hour'] = esc_html__('hour', 'event_espresso');
1452
+		EE_Registry::$i18n_js_strings['timer_minute'] = esc_html__('minute', 'event_espresso');
1453
+		EE_Registry::$i18n_js_strings['timer_second'] = esc_html__('second', 'event_espresso');
1454
+		EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice(
1455
+		);
1456
+		EE_Registry::$i18n_js_strings['ajax_submit'] = apply_filters(
1457
+			'FHEE__Single_Page_Checkout__translate_js_strings__ajax_submit',
1458
+			true
1459
+		);
1460
+		EE_Registry::$i18n_js_strings['session_extension'] = absint(
1461
+			apply_filters('FHEE__EE_Session__extend_expiration__seconds_added', 10 * MINUTE_IN_SECONDS)
1462
+		);
1463
+		EE_Registry::$i18n_js_strings['session_expiration'] = gmdate(
1464
+			'M d, Y H:i:s',
1465
+			EE_Registry::instance()->SSN->expiration() + (get_option('gmt_offset') * HOUR_IN_SECONDS)
1466
+		);
1467
+	}
1468
+
1469
+
1470
+	/**
1471
+	 *    enqueue_styles_and_scripts
1472
+	 *
1473
+	 * @access        public
1474
+	 * @return        void
1475
+	 * @throws EE_Error
1476
+	 */
1477
+	public function enqueue_styles_and_scripts()
1478
+	{
1479
+		// load css
1480
+		wp_register_style(
1481
+			'single_page_checkout',
1482
+			SPCO_CSS_URL . 'single_page_checkout.css',
1483
+			array('espresso_default'),
1484
+			EVENT_ESPRESSO_VERSION
1485
+		);
1486
+		wp_enqueue_style('single_page_checkout');
1487
+		// load JS
1488
+		wp_register_script(
1489
+			'jquery_plugin',
1490
+			EE_THIRD_PARTY_URL . 'jquery	.plugin.min.js',
1491
+			array('jquery'),
1492
+			'1.0.1',
1493
+			true
1494
+		);
1495
+		wp_register_script(
1496
+			'jquery_countdown',
1497
+			EE_THIRD_PARTY_URL . 'jquery	.countdown.min.js',
1498
+			array('jquery_plugin'),
1499
+			'2.1.0',
1500
+			true
1501
+		);
1502
+		wp_register_script(
1503
+			'single_page_checkout',
1504
+			SPCO_JS_URL . 'single_page_checkout.js',
1505
+			array('espresso_core', 'underscore', 'ee_form_section_validation'),
1506
+			EVENT_ESPRESSO_VERSION,
1507
+			true
1508
+		);
1509
+		if ($this->checkout->registration_form instanceof EE_Form_Section_Proper) {
1510
+			$this->checkout->registration_form->enqueue_js();
1511
+		}
1512
+		if ($this->checkout->current_step->reg_form instanceof EE_Form_Section_Proper) {
1513
+			$this->checkout->current_step->reg_form->enqueue_js();
1514
+		}
1515
+		wp_enqueue_script('single_page_checkout');
1516
+		if (apply_filters('FHEE__registration_page_wrapper_template__display_time_limit', false)) {
1517
+			wp_enqueue_script('jquery_countdown');
1518
+		}
1519
+		/**
1520
+		 * global action hook for enqueueing styles and scripts with
1521
+		 * spco calls.
1522
+		 */
1523
+		do_action('AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts', $this);
1524
+		/**
1525
+		 * dynamic action hook for enqueueing styles and scripts with spco calls.
1526
+		 * The hook will end up being something like:
1527
+		 *      AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information
1528
+		 */
1529
+		do_action(
1530
+			'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(),
1531
+			$this
1532
+		);
1533
+	}
1534
+
1535
+
1536
+	/**
1537
+	 *    display the Registration Single Page Checkout Form
1538
+	 *
1539
+	 * @access    private
1540
+	 * @return    void
1541
+	 * @throws EE_Error
1542
+	 */
1543
+	private function _display_spco_reg_form()
1544
+	{
1545
+		// if registering via the admin, just display the reg form for the current step
1546
+		if ($this->checkout->admin_request) {
1547
+			EE_Registry::instance()->REQ->add_output($this->checkout->current_step->display_reg_form());
1548
+		} else {
1549
+			// add powered by EE msg
1550
+			add_action('AHEE__SPCO__reg_form_footer', array('EED_Single_Page_Checkout', 'display_registration_footer'));
1551
+			$empty_cart = count($this->checkout->transaction
1552
+									->registrations($this->checkout->reg_cache_where_params)) < 1;
1553
+			EE_Registry::$i18n_js_strings['empty_cart'] = $empty_cart;
1554
+			$cookies_not_set_msg = '';
1555
+			if ($empty_cart) {
1556
+				$cookies_not_set_msg = apply_filters(
1557
+					'FHEE__Single_Page_Checkout__display_spco_reg_form__cookies_not_set_msg',
1558
+					sprintf(
1559
+						esc_html__(
1560
+							'%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',
1561
+							'event_espresso'
1562
+						),
1563
+						'<div class="ee-attention hidden" id="ee-cookies-not-set-msg">',
1564
+						'</div>',
1565
+						'<h6 class="important-notice">',
1566
+						'</h6>',
1567
+						'<p>',
1568
+						'</p>',
1569
+						'<br />',
1570
+						'<a href="http://www.whatarecookies.com/enable.asp" target="_blank" rel="noopener noreferrer">',
1571
+						'</a>'
1572
+					)
1573
+				);
1574
+			}
1575
+			$this->checkout->registration_form = new EE_Form_Section_Proper(
1576
+				array(
1577
+					'name'            => 'single-page-checkout',
1578
+					'html_id'         => 'ee-single-page-checkout-dv',
1579
+					'layout_strategy' =>
1580
+						new EE_Template_Layout(
1581
+							array(
1582
+								'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php',
1583
+								'template_args'        => array(
1584
+									'empty_cart'              => $empty_cart,
1585
+									'revisit'                 => $this->checkout->revisit,
1586
+									'reg_steps'               => $this->checkout->reg_steps,
1587
+									'next_step'               => $this->checkout->next_step instanceof EE_SPCO_Reg_Step
1588
+										? $this->checkout->next_step->slug()
1589
+										: '',
1590
+									'empty_msg'               => apply_filters(
1591
+										'FHEE__Single_Page_Checkout__display_spco_reg_form__empty_msg',
1592
+										sprintf(
1593
+											esc_html__(
1594
+												'You need to %1$sReturn to Events list%2$sselect at least one event%3$s before you can proceed with the registration process.',
1595
+												'event_espresso'
1596
+											),
1597
+											'<a href="'
1598
+											. get_post_type_archive_link('espresso_events')
1599
+											. '" title="',
1600
+											'">',
1601
+											'</a>'
1602
+										)
1603
+									),
1604
+									'cookies_not_set_msg'     => $cookies_not_set_msg,
1605
+									'registration_time_limit' => $this->checkout->get_registration_time_limit(),
1606
+									'session_expiration'      => gmdate(
1607
+										'M d, Y H:i:s',
1608
+										EE_Registry::instance()->SSN->expiration()
1609
+										+ (get_option('gmt_offset') * HOUR_IN_SECONDS)
1610
+									),
1611
+								),
1612
+							)
1613
+						),
1614
+				)
1615
+			);
1616
+			// load template and add to output sent that gets filtered into the_content()
1617
+			EE_Registry::instance()->REQ->add_output($this->checkout->registration_form->get_html());
1618
+		}
1619
+	}
1620
+
1621
+
1622
+	/**
1623
+	 *    add_extra_finalize_registration_inputs
1624
+	 *
1625
+	 * @access    public
1626
+	 * @param $next_step
1627
+	 * @internal  param string $label
1628
+	 * @return void
1629
+	 */
1630
+	public function add_extra_finalize_registration_inputs($next_step)
1631
+	{
1632
+		if ($next_step === 'finalize_registration') {
1633
+			echo '<div id="spco-extra-finalize_registration-inputs-dv"></div>';
1634
+		}
1635
+	}
1636
+
1637
+
1638
+	/**
1639
+	 *    display_registration_footer
1640
+	 *
1641
+	 * @access    public
1642
+	 * @return    string
1643
+	 */
1644
+	public static function display_registration_footer()
1645
+	{
1646
+		if (apply_filters(
1647
+			'FHEE__EE_Front__Controller__show_reg_footer',
1648
+			EE_Registry::instance()->CFG->admin->show_reg_footer
1649
+		)) {
1650
+			add_filter(
1651
+				'FHEE__EEH_Template__powered_by_event_espresso__url',
1652
+				function ($url) {
1653
+					return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url);
1654
+				}
1655
+			);
1656
+			echo apply_filters(
1657
+				'FHEE__EE_Front_Controller__display_registration_footer',
1658
+				\EEH_Template::powered_by_event_espresso(
1659
+					'',
1660
+					'espresso-registration-footer-dv',
1661
+					array('utm_content' => 'registration_checkout')
1662
+				)
1663
+			);
1664
+		}
1665
+		return '';
1666
+	}
1667
+
1668
+
1669
+	/**
1670
+	 *    unlock_transaction
1671
+	 *
1672
+	 * @access    public
1673
+	 * @return    void
1674
+	 * @throws EE_Error
1675
+	 */
1676
+	public function unlock_transaction()
1677
+	{
1678
+		if ($this->checkout->transaction instanceof EE_Transaction) {
1679
+			$this->checkout->transaction->unlock();
1680
+		}
1681
+	}
1682
+
1683
+
1684
+	/**
1685
+	 *        _setup_redirect
1686
+	 *
1687
+	 * @access    private
1688
+	 * @return void
1689
+	 */
1690
+	private function _setup_redirect()
1691
+	{
1692
+		if ($this->checkout->continue_reg && $this->checkout->next_step instanceof EE_SPCO_Reg_Step) {
1693
+			$this->checkout->redirect = true;
1694
+			if (empty($this->checkout->redirect_url)) {
1695
+				$this->checkout->redirect_url = $this->checkout->next_step->reg_step_url();
1696
+			}
1697
+			$this->checkout->redirect_url = apply_filters(
1698
+				'FHEE__EED_Single_Page_Checkout___setup_redirect__checkout_redirect_url',
1699
+				$this->checkout->redirect_url,
1700
+				$this->checkout
1701
+			);
1702
+		}
1703
+	}
1704
+
1705
+
1706
+	/**
1707
+	 *   handle ajax message responses and redirects
1708
+	 *
1709
+	 * @access public
1710
+	 * @return void
1711
+	 * @throws EE_Error
1712
+	 */
1713
+	public function go_to_next_step()
1714
+	{
1715
+		if (EE_Registry::instance()->REQ->ajax) {
1716
+			// capture contents of output buffer we started earlier in the request, and insert into JSON response
1717
+			$this->checkout->json_response->set_unexpected_errors(ob_get_clean());
1718
+		}
1719
+		$this->unlock_transaction();
1720
+		// just return for these conditions
1721
+		if ($this->checkout->admin_request
1722
+			|| $this->checkout->action === 'redirect_form'
1723
+			|| $this->checkout->action === 'update_checkout'
1724
+		) {
1725
+			return;
1726
+		}
1727
+		// AJAX response
1728
+		$this->_handle_json_response();
1729
+		// redirect to next step or the Thank You page
1730
+		$this->_handle_html_redirects();
1731
+		// hmmm... must be something wrong, so let's just display the form again !
1732
+		$this->_display_spco_reg_form();
1733
+	}
1734
+
1735
+
1736
+	/**
1737
+	 *   _handle_json_response
1738
+	 *
1739
+	 * @access protected
1740
+	 * @return void
1741
+	 */
1742
+	protected function _handle_json_response()
1743
+	{
1744
+		// if this is an ajax request
1745
+		if (EE_Registry::instance()->REQ->ajax) {
1746
+			$this->checkout->json_response->set_registration_time_limit(
1747
+				$this->checkout->get_registration_time_limit()
1748
+			);
1749
+			$this->checkout->json_response->set_payment_amount($this->checkout->amount_owing);
1750
+			// just send the ajax (
1751
+			$json_response = apply_filters(
1752
+				'FHEE__EE_Single_Page_Checkout__JSON_response',
1753
+				$this->checkout->json_response
1754
+			);
1755
+			echo $json_response;
1756
+			exit();
1757
+		}
1758
+	}
1759
+
1760
+
1761
+	/**
1762
+	 *   _handle_redirects
1763
+	 *
1764
+	 * @access protected
1765
+	 * @return void
1766
+	 */
1767
+	protected function _handle_html_redirects()
1768
+	{
1769
+		// going somewhere ?
1770
+		if ($this->checkout->redirect && ! empty($this->checkout->redirect_url)) {
1771
+			// store notices in a transient
1772
+			EE_Error::get_notices(false, true, true);
1773
+			wp_safe_redirect($this->checkout->redirect_url);
1774
+			exit();
1775
+		}
1776
+	}
1777
+
1778
+
1779
+	/**
1780
+	 *   set_checkout_anchor
1781
+	 *
1782
+	 * @access public
1783
+	 * @return void
1784
+	 */
1785
+	public function set_checkout_anchor()
1786
+	{
1787
+		echo '<a id="checkout" style="float: left; margin-left: -999em;"></a>';
1788
+	}
1789
+
1790
+	/**
1791
+	 *    getRegistrationExpirationNotice
1792
+	 *
1793
+	 * @since     4.9.59.p
1794
+	 * @access    public
1795
+	 * @return    string
1796
+	 */
1797
+	public static function getRegistrationExpirationNotice()
1798
+	{
1799
+		return sprintf(
1800
+			esc_html__(
1801
+				'%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 accept our apologies for any inconvenience this may have caused.%8$s',
1802
+				'event_espresso'
1803
+			),
1804
+			'<h4 class="important-notice">',
1805
+			'</h4>',
1806
+			'<br />',
1807
+			'<p>',
1808
+			'<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
1809
+			'">',
1810
+			'</a>',
1811
+			'</p>'
1812
+		);
1813
+	}
1814 1814
 }
Please login to merge, or discard this patch.
Spacing   +44 added lines, -44 removed lines patch added patch discarded remove patch
@@ -100,7 +100,7 @@  discard block
 block discarded – undo
100 100
     public static function set_hooks_admin()
101 101
     {
102 102
         EED_Single_Page_Checkout::set_definitions();
103
-        if (! (defined('DOING_AJAX') && DOING_AJAX)) {
103
+        if ( ! (defined('DOING_AJAX') && DOING_AJAX)) {
104 104
             return;
105 105
         }
106 106
         // going to start an output buffer in case anything gets accidentally output
@@ -206,14 +206,14 @@  discard block
 block discarded – undo
206 206
         }
207 207
         define(
208 208
             'SPCO_BASE_PATH',
209
-            rtrim(str_replace(array('\\', '/'), '/', plugin_dir_path(__FILE__)), '/') . '/'
209
+            rtrim(str_replace(array('\\', '/'), '/', plugin_dir_path(__FILE__)), '/').'/'
210 210
         );
211
-        define('SPCO_CSS_URL', plugin_dir_url(__FILE__) . 'css/');
212
-        define('SPCO_IMG_URL', plugin_dir_url(__FILE__) . 'img/');
213
-        define('SPCO_JS_URL', plugin_dir_url(__FILE__) . 'js/');
214
-        define('SPCO_INC_PATH', SPCO_BASE_PATH . 'inc/');
215
-        define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH . 'reg_steps/');
216
-        define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH . 'templates/');
211
+        define('SPCO_CSS_URL', plugin_dir_url(__FILE__).'css/');
212
+        define('SPCO_IMG_URL', plugin_dir_url(__FILE__).'img/');
213
+        define('SPCO_JS_URL', plugin_dir_url(__FILE__).'js/');
214
+        define('SPCO_INC_PATH', SPCO_BASE_PATH.'inc/');
215
+        define('SPCO_REG_STEPS_PATH', SPCO_BASE_PATH.'reg_steps/');
216
+        define('SPCO_TEMPLATES_PATH', SPCO_BASE_PATH.'templates/');
217 217
         EEH_Autoloader::register_autoloaders_for_each_file_in_folder(SPCO_BASE_PATH, true);
218 218
         EE_Registry::$i18n_js_strings['registration_expiration_notice'] = EED_Single_Page_Checkout::getRegistrationExpirationNotice(
219 219
         );
@@ -245,7 +245,7 @@  discard block
 block discarded – undo
245 245
             // we need a
246 246
             if (isset($reg_step['file_path'], $reg_step['class_name'], $reg_step['slug'])) {
247 247
                 // copy over to the reg_steps_array
248
-                EED_Single_Page_Checkout::$_reg_steps_array[ $order ] = $reg_step;
248
+                EED_Single_Page_Checkout::$_reg_steps_array[$order] = $reg_step;
249 249
                 // register custom key route for each reg step
250 250
                 // ie: step=>"slug" - this is the entire reason we load the reg steps array now
251 251
                 EE_Config::register_route(
@@ -257,7 +257,7 @@  discard block
 block discarded – undo
257 257
                 // add AJAX or other hooks
258 258
                 if (isset($reg_step['has_hooks']) && $reg_step['has_hooks']) {
259 259
                     // setup autoloaders if necessary
260
-                    if (! class_exists($reg_step['class_name'])) {
260
+                    if ( ! class_exists($reg_step['class_name'])) {
261 261
                         EEH_Autoloader::register_autoloaders_for_each_file_in_folder(
262 262
                             $reg_step['file_path'],
263 263
                             true
@@ -285,19 +285,19 @@  discard block
 block discarded – undo
285 285
         if (empty($reg_steps)) {
286 286
             $reg_steps = array(
287 287
                 10  => array(
288
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'attendee_information',
288
+                    'file_path'  => SPCO_REG_STEPS_PATH.'attendee_information',
289 289
                     'class_name' => 'EE_SPCO_Reg_Step_Attendee_Information',
290 290
                     'slug'       => 'attendee_information',
291 291
                     'has_hooks'  => false,
292 292
                 ),
293 293
                 30  => array(
294
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'payment_options',
294
+                    'file_path'  => SPCO_REG_STEPS_PATH.'payment_options',
295 295
                     'class_name' => 'EE_SPCO_Reg_Step_Payment_Options',
296 296
                     'slug'       => 'payment_options',
297 297
                     'has_hooks'  => true,
298 298
                 ),
299 299
                 999 => array(
300
-                    'file_path'  => SPCO_REG_STEPS_PATH . 'finalize_registration',
300
+                    'file_path'  => SPCO_REG_STEPS_PATH.'finalize_registration',
301 301
                     'class_name' => 'EE_SPCO_Reg_Step_Finalize_Registration',
302 302
                     'slug'       => 'finalize_registration',
303 303
                     'has_hooks'  => false,
@@ -450,7 +450,7 @@  discard block
 block discarded – undo
450 450
                 $this->checkout
451 451
             );
452 452
             // load the reg steps array
453
-            if (! $this->_load_and_instantiate_reg_steps()) {
453
+            if ( ! $this->_load_and_instantiate_reg_steps()) {
454 454
                 EED_Single_Page_Checkout::$_initialized = true;
455 455
                 return;
456 456
             }
@@ -459,7 +459,7 @@  discard block
 block discarded – undo
459 459
             // and the next step
460 460
             $this->checkout->set_next_step();
461 461
             // verify that everything has been setup correctly
462
-            if (! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) {
462
+            if ( ! ($this->_verify_transaction_and_get_registrations() && $this->_final_verifications())) {
463 463
                 EED_Single_Page_Checkout::$_initialized = true;
464 464
                 return;
465 465
             }
@@ -474,7 +474,7 @@  discard block
 block discarded – undo
474 474
             // DEBUG LOG
475 475
             // $this->checkout->log( __CLASS__, __FUNCTION__, __LINE__ );
476 476
             // get reg form
477
-            if (! $this->_check_form_submission()) {
477
+            if ( ! $this->_check_form_submission()) {
478 478
                 EED_Single_Page_Checkout::$_initialized = true;
479 479
                 return;
480 480
             }
@@ -505,7 +505,7 @@  discard block
 block discarded – undo
505 505
      */
506 506
     private function _verify_session()
507 507
     {
508
-        if (! EE_Registry::instance()->SSN instanceof EE_Session) {
508
+        if ( ! EE_Registry::instance()->SSN instanceof EE_Session) {
509 509
             throw new EE_Error(esc_html__('The EE_Session class could not be loaded.', 'event_espresso'));
510 510
         }
511 511
         $clear_session_requested = filter_var(
@@ -523,7 +523,7 @@  discard block
 block discarded – undo
523 523
             // EE_Registry::instance()->SSN->reset_cart();
524 524
             // EE_Registry::instance()->SSN->reset_checkout();
525 525
             // EE_Registry::instance()->SSN->reset_transaction();
526
-            if (! $clear_session_requested) {
526
+            if ( ! $clear_session_requested) {
527 527
                 EE_Error::add_attention(
528 528
                     EE_Registry::$i18n_js_strings['registration_expiration_notice'],
529 529
                     __FILE__,
@@ -550,7 +550,7 @@  discard block
 block discarded – undo
550 550
         /** @type EE_Checkout $checkout */
551 551
         $checkout = EE_Registry::instance()->SSN->checkout();
552 552
         // verify
553
-        if (! $checkout instanceof EE_Checkout) {
553
+        if ( ! $checkout instanceof EE_Checkout) {
554 554
             // instantiate EE_Checkout object for handling the properties of the current checkout process
555 555
             $checkout = EE_Registry::instance()->load_file(
556 556
                 SPCO_INC_PATH,
@@ -568,7 +568,7 @@  discard block
 block discarded – undo
568 568
         }
569 569
         $checkout = apply_filters('FHEE__EED_Single_Page_Checkout___initialize_checkout__checkout', $checkout);
570 570
         // verify again
571
-        if (! $checkout instanceof EE_Checkout) {
571
+        if ( ! $checkout instanceof EE_Checkout) {
572 572
             throw new EE_Error(esc_html__('The EE_Checkout class could not be loaded.', 'event_espresso'));
573 573
         }
574 574
         // reset anything that needs a clean slate for each request
@@ -640,7 +640,7 @@  discard block
 block discarded – undo
640 640
      */
641 641
     protected function _display_request_vars()
642 642
     {
643
-        if (! WP_DEBUG) {
643
+        if ( ! WP_DEBUG) {
644 644
             return;
645 645
         }
646 646
         EEH_Debug_Tools::printr($_REQUEST, '$_REQUEST', __FILE__, __LINE__);
@@ -717,7 +717,7 @@  discard block
 block discarded – undo
717 717
         ) {
718 718
             // if not, then loop through raw reg steps array
719 719
             foreach (EED_Single_Page_Checkout::$_reg_steps_array as $order => $reg_step) {
720
-                if (! $this->_load_and_instantiate_reg_step($reg_step, $order)) {
720
+                if ( ! $this->_load_and_instantiate_reg_step($reg_step, $order)) {
721 721
                     return false;
722 722
                 }
723 723
             }
@@ -848,12 +848,12 @@  discard block
 block discarded – undo
848 848
     private function _verify_transaction_and_get_registrations()
849 849
     {
850 850
         // was there already a valid transaction in the checkout from the session ?
851
-        if (! $this->checkout->transaction instanceof EE_Transaction) {
851
+        if ( ! $this->checkout->transaction instanceof EE_Transaction) {
852 852
             // get transaction from db or session
853 853
             $this->checkout->transaction = $this->checkout->reg_url_link && ! is_admin()
854 854
                 ? $this->_get_transaction_and_cart_for_previous_visit()
855 855
                 : $this->_get_cart_for_current_session_and_setup_new_transaction();
856
-            if (! $this->checkout->transaction instanceof EE_Transaction) {
856
+            if ( ! $this->checkout->transaction instanceof EE_Transaction) {
857 857
                 EE_Error::add_error(
858 858
                     esc_html__(
859 859
                         'Your Registration and Transaction information could not be retrieved from the db.',
@@ -1084,16 +1084,16 @@  discard block
 block discarded – undo
1084 1084
                         )
1085 1085
                     );
1086 1086
                     // override capabilities for frontend registrations
1087
-                    if (! is_admin()) {
1087
+                    if ( ! is_admin()) {
1088 1088
                         $CreateRegistrationCommand->setCapCheck(
1089 1089
                             new PublicCapabilities('', 'create_new_registration')
1090 1090
                         );
1091 1091
                     }
1092 1092
                     $registration = EE_Registry::instance()->BUS->execute($CreateRegistrationCommand);
1093
-                    if (! $registration instanceof EE_Registration) {
1093
+                    if ( ! $registration instanceof EE_Registration) {
1094 1094
                         throw new InvalidEntityException($registration, 'EE_Registration');
1095 1095
                     }
1096
-                    $registrations[ $registration->ID() ] = $registration;
1096
+                    $registrations[$registration->ID()] = $registration;
1097 1097
                 }
1098 1098
             }
1099 1099
             $registration_processor->fix_reg_final_price_rounding_issue($transaction);
@@ -1136,7 +1136,7 @@  discard block
 block discarded – undo
1136 1136
             $this->checkout
1137 1137
         );
1138 1138
         // verify that current step is still set correctly
1139
-        if (! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) {
1139
+        if ( ! $this->checkout->current_step instanceof EE_SPCO_Reg_Step) {
1140 1140
             EE_Error::add_error(
1141 1141
                 esc_html__(
1142 1142
                     '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.',
@@ -1149,9 +1149,9 @@  discard block
 block discarded – undo
1149 1149
             return false;
1150 1150
         }
1151 1151
         // if returning to SPCO, then verify that primary registrant is set
1152
-        if (! empty($this->checkout->reg_url_link)) {
1152
+        if ( ! empty($this->checkout->reg_url_link)) {
1153 1153
             $valid_registrant = $this->checkout->transaction->primary_registration();
1154
-            if (! $valid_registrant instanceof EE_Registration) {
1154
+            if ( ! $valid_registrant instanceof EE_Registration) {
1155 1155
                 EE_Error::add_error(
1156 1156
                     esc_html__(
1157 1157
                         '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.',
@@ -1171,7 +1171,7 @@  discard block
 block discarded – undo
1171 1171
                     $valid_registrant = $registration;
1172 1172
                 }
1173 1173
             }
1174
-            if (! $valid_registrant instanceof EE_Registration) {
1174
+            if ( ! $valid_registrant instanceof EE_Registration) {
1175 1175
                 // hmmm... maybe we have the wrong session because the user is opening multiple tabs ?
1176 1176
                 if (EED_Single_Page_Checkout::$_checkout_verified) {
1177 1177
                     // clear the session, mark the checkout as unverified, and try again
@@ -1215,9 +1215,9 @@  discard block
 block discarded – undo
1215 1215
         $this->checkout->set_reg_step_initiated($this->checkout->current_step);
1216 1216
         // loop thru all steps to call their individual "initialize" methods and set i18n strings for JS
1217 1217
         foreach ($this->checkout->reg_steps as $reg_step) {
1218
-            if (! $reg_step->initialize_reg_step()) {
1218
+            if ( ! $reg_step->initialize_reg_step()) {
1219 1219
                 // if not initialized then maybe this step is being removed...
1220
-                if (! $reinitializing && $reg_step->is_current_step()) {
1220
+                if ( ! $reinitializing && $reg_step->is_current_step()) {
1221 1221
                     // if it was the current step, then we need to start over here
1222 1222
                     $this->_initialize_reg_steps(true);
1223 1223
                     return;
@@ -1269,7 +1269,7 @@  discard block
 block discarded – undo
1269 1269
                         )
1270 1270
                     );
1271 1271
                     // validate submitted form data
1272
-                    if (! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) {
1272
+                    if ( ! $this->checkout->continue_reg || ! $this->checkout->current_step->reg_form->is_valid()) {
1273 1273
                         // thou shall not pass !!!
1274 1274
                         $this->checkout->continue_reg = false;
1275 1275
                         // any form validation errors?
@@ -1317,7 +1317,7 @@  discard block
 block discarded – undo
1317 1317
                 break;
1318 1318
             default:
1319 1319
                 // meh... do one of those other steps first
1320
-                if (! empty($this->checkout->action)
1320
+                if ( ! empty($this->checkout->action)
1321 1321
                     && is_callable(array($this->checkout->current_step, $this->checkout->action))
1322 1322
                 ) {
1323 1323
                     // dynamically creates hook point like:
@@ -1337,7 +1337,7 @@  discard block
 block discarded – undo
1337 1337
                         ) {
1338 1338
                             EE_Error::add_success(
1339 1339
                                 $this->checkout->current_step->success_message()
1340
-                                . '<br />' . $this->checkout->next_step->_instructions()
1340
+                                . '<br />'.$this->checkout->next_step->_instructions()
1341 1341
                             );
1342 1342
                         }
1343 1343
                         // pack it up, pack it in...
@@ -1479,7 +1479,7 @@  discard block
 block discarded – undo
1479 1479
         // load css
1480 1480
         wp_register_style(
1481 1481
             'single_page_checkout',
1482
-            SPCO_CSS_URL . 'single_page_checkout.css',
1482
+            SPCO_CSS_URL.'single_page_checkout.css',
1483 1483
             array('espresso_default'),
1484 1484
             EVENT_ESPRESSO_VERSION
1485 1485
         );
@@ -1487,21 +1487,21 @@  discard block
 block discarded – undo
1487 1487
         // load JS
1488 1488
         wp_register_script(
1489 1489
             'jquery_plugin',
1490
-            EE_THIRD_PARTY_URL . 'jquery	.plugin.min.js',
1490
+            EE_THIRD_PARTY_URL.'jquery	.plugin.min.js',
1491 1491
             array('jquery'),
1492 1492
             '1.0.1',
1493 1493
             true
1494 1494
         );
1495 1495
         wp_register_script(
1496 1496
             'jquery_countdown',
1497
-            EE_THIRD_PARTY_URL . 'jquery	.countdown.min.js',
1497
+            EE_THIRD_PARTY_URL.'jquery	.countdown.min.js',
1498 1498
             array('jquery_plugin'),
1499 1499
             '2.1.0',
1500 1500
             true
1501 1501
         );
1502 1502
         wp_register_script(
1503 1503
             'single_page_checkout',
1504
-            SPCO_JS_URL . 'single_page_checkout.js',
1504
+            SPCO_JS_URL.'single_page_checkout.js',
1505 1505
             array('espresso_core', 'underscore', 'ee_form_section_validation'),
1506 1506
             EVENT_ESPRESSO_VERSION,
1507 1507
             true
@@ -1527,7 +1527,7 @@  discard block
 block discarded – undo
1527 1527
          *      AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__attendee_information
1528 1528
          */
1529 1529
         do_action(
1530
-            'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__' . $this->checkout->current_step->slug(),
1530
+            'AHEE__EED_Single_Page_Checkout__enqueue_styles_and_scripts__'.$this->checkout->current_step->slug(),
1531 1531
             $this
1532 1532
         );
1533 1533
     }
@@ -1579,7 +1579,7 @@  discard block
 block discarded – undo
1579 1579
                     'layout_strategy' =>
1580 1580
                         new EE_Template_Layout(
1581 1581
                             array(
1582
-                                'layout_template_file' => SPCO_TEMPLATES_PATH . 'registration_page_wrapper.template.php',
1582
+                                'layout_template_file' => SPCO_TEMPLATES_PATH.'registration_page_wrapper.template.php',
1583 1583
                                 'template_args'        => array(
1584 1584
                                     'empty_cart'              => $empty_cart,
1585 1585
                                     'revisit'                 => $this->checkout->revisit,
@@ -1649,7 +1649,7 @@  discard block
 block discarded – undo
1649 1649
         )) {
1650 1650
             add_filter(
1651 1651
                 'FHEE__EEH_Template__powered_by_event_espresso__url',
1652
-                function ($url) {
1652
+                function($url) {
1653 1653
                     return apply_filters('FHEE__EE_Front_Controller__registration_footer__url', $url);
1654 1654
                 }
1655 1655
             );
@@ -1805,7 +1805,7 @@  discard block
 block discarded – undo
1805 1805
             '</h4>',
1806 1806
             '<br />',
1807 1807
             '<p>',
1808
-            '<a href="' . get_post_type_archive_link('espresso_events') . '" title="',
1808
+            '<a href="'.get_post_type_archive_link('espresso_events').'" title="',
1809 1809
             '">',
1810 1810
             '</a>',
1811 1811
             '</p>'
Please login to merge, or discard this patch.
attendee_information/EE_SPCO_Reg_Step_Attendee_Information.class.php 2 patches
Indentation   +1421 added lines, -1421 removed lines patch added patch discarded remove patch
@@ -18,1428 +18,1428 @@
 block discarded – undo
18 18
 class EE_SPCO_Reg_Step_Attendee_Information extends EE_SPCO_Reg_Step
19 19
 {
20 20
 
21
-    /**
22
-     * @type bool $_print_copy_info
23
-     */
24
-    private $_print_copy_info = false;
25
-
26
-    /**
27
-     * @type array $_attendee_data
28
-     */
29
-    private $_attendee_data = array();
30
-
31
-    /**
32
-     * @type array $_required_questions
33
-     */
34
-    private $_required_questions = array();
35
-
36
-    /**
37
-     * @type array $_registration_answers
38
-     */
39
-    private $_registration_answers = array();
40
-
41
-
42
-    /**
43
-     *    class constructor
44
-     *
45
-     * @access    public
46
-     * @param    EE_Checkout $checkout
47
-     */
48
-    public function __construct(EE_Checkout $checkout)
49
-    {
50
-        $this->_slug = 'attendee_information';
51
-        $this->_name = esc_html__('Attendee Information', 'event_espresso');
52
-        $this->_template = SPCO_REG_STEPS_PATH . $this->_slug . '/attendee_info_main.template.php';
53
-        $this->checkout = $checkout;
54
-        $this->_reset_success_message();
55
-        $this->set_instructions(
56
-            esc_html__('Please answer the following registration questions before proceeding.', 'event_espresso')
57
-        );
58
-    }
59
-
60
-
61
-    public function translate_js_strings()
62
-    {
63
-        EE_Registry::$i18n_js_strings['required_field'] = esc_html__(
64
-            ' is a required question.',
65
-            'event_espresso'
66
-        );
67
-        EE_Registry::$i18n_js_strings['required_multi_field'] = esc_html__(
68
-            ' is a required question. Please enter a value for at least one of the options.',
69
-            'event_espresso'
70
-        );
71
-        EE_Registry::$i18n_js_strings['answer_required_questions'] = esc_html__(
72
-            'Please answer all required questions correctly before proceeding.',
73
-            'event_espresso'
74
-        );
75
-        EE_Registry::$i18n_js_strings['attendee_info_copied'] = sprintf(
76
-            esc_html_x(
77
-                'The attendee information was successfully copied.%sPlease ensure the rest of the registration form is completed before proceeding.',
78
-                'The attendee information was successfully copied.(line break)Please ensure the rest of the registration form is completed before proceeding.',
79
-                'event_espresso'
80
-            ),
81
-            '<br/>'
82
-        );
83
-        EE_Registry::$i18n_js_strings['attendee_info_copy_error'] = esc_html__(
84
-            'An unknown error occurred on the server while attempting to copy the attendee information. Please refresh the page and try again.',
85
-            'event_espresso'
86
-        );
87
-        EE_Registry::$i18n_js_strings['enter_valid_email'] = esc_html__(
88
-            'You must enter a valid email address.',
89
-            'event_espresso'
90
-        );
91
-        EE_Registry::$i18n_js_strings['valid_email_and_questions'] = esc_html__(
92
-            'You must enter a valid email address and answer all other required questions before you can proceed.',
93
-            'event_espresso'
94
-        );
95
-    }
96
-
97
-
98
-    public function enqueue_styles_and_scripts()
99
-    {
100
-    }
101
-
102
-
103
-    /**
104
-     * @return boolean
105
-     */
106
-    public function initialize_reg_step()
107
-    {
108
-        return true;
109
-    }
110
-
111
-
112
-    /**
113
-     * @return EE_Form_Section_Proper
114
-     * @throws DomainException
115
-     * @throws EE_Error
116
-     * @throws InvalidArgumentException
117
-     * @throws ReflectionException
118
-     * @throws EntityNotFoundException
119
-     * @throws InvalidDataTypeException
120
-     * @throws InvalidInterfaceException
121
-     */
122
-    public function generate_reg_form()
123
-    {
124
-        $this->_print_copy_info = false;
125
-        $primary_registrant = null;
126
-        // autoload Line_Item_Display classes
127
-        EEH_Autoloader::register_line_item_display_autoloaders();
128
-        $Line_Item_Display = new EE_Line_Item_Display();
129
-        // calculate taxes
130
-        $Line_Item_Display->display_line_item(
131
-            $this->checkout->cart->get_grand_total(),
132
-            array('set_tax_rate' => true)
133
-        );
134
-        /** @var $subsections EE_Form_Section_Proper[] */
135
-        $extra_inputs_section = $this->reg_step_hidden_inputs();
136
-        $subsections = array(
137
-            'default_hidden_inputs' => $extra_inputs_section,
138
-        );
139
-
140
-        /**
141
-         * @var $reg_config EE_Registration_Config
142
-         */
143
-        $reg_config = LoaderFactory::getLoader()->getShared('EE_Registration_Config');
144
-        // if this isn't a revisit, and they have the privacy consent box enalbed, add it
145
-        if (! $this->checkout->revisit && $reg_config->isConsentCheckboxEnabled()) {
146
-            $extra_inputs_section->add_subsections(
147
-                array(
148
-                    'consent_box' => new EE_Form_Section_Proper(
149
-                        array(
150
-                            'layout_strategy' =>
151
-                                new EE_Template_Layout(
152
-                                    array(
153
-                                        'input_template_file' => SPCO_REG_STEPS_PATH . $this->_slug . '/privacy_consent.template.php',
154
-                                    )
155
-                                ),
156
-                            'subsections'     => array(
157
-                                'consent' => new EE_Checkbox_Multi_Input(
158
-                                    array(
159
-                                        'consent' => $reg_config->getConsentCheckboxLabelText(),
160
-                                    ),
161
-                                    array(
162
-                                        'required'                          => true,
163
-                                        'required_validation_error_message' => esc_html__(
164
-                                            'You must consent to these terms in order to register.',
165
-                                            'event_espresso'
166
-                                        ),
167
-                                        'html_label_text'                   => '',
168
-                                    )
169
-                                ),
170
-                            ),
171
-                        )
172
-                    ),
173
-                ),
174
-                null,
175
-                false
176
-            );
177
-        }
178
-        $template_args = array(
179
-            'revisit'       => $this->checkout->revisit,
180
-            'registrations' => array(),
181
-            'ticket_count'  => array(),
182
-        );
183
-        // grab the saved registrations from the transaction
184
-        $registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
185
-        if ($registrations) {
186
-            foreach ($registrations as $registration) {
187
-                // can this registration be processed during this visit ?
188
-                if ($registration instanceof EE_Registration
189
-                    && $this->checkout->visit_allows_processing_of_this_registration($registration)
190
-                ) {
191
-                    $subsections[ $registration->reg_url_link() ] = $this->_registrations_reg_form($registration);
192
-                    if (! $this->checkout->admin_request) {
193
-                        $template_args['registrations'][ $registration->reg_url_link() ] = $registration;
194
-                        $template_args['ticket_count'][ $registration->ticket()->ID() ] = isset(
195
-                            $template_args['ticket_count'][ $registration->ticket()->ID() ]
196
-                        )
197
-                            ? $template_args['ticket_count'][ $registration->ticket()->ID() ] + 1
198
-                            : 1;
199
-                        $ticket_line_item = EEH_Line_Item::get_line_items_by_object_type_and_IDs(
200
-                            $this->checkout->cart->get_grand_total(),
201
-                            'Ticket',
202
-                            array($registration->ticket()->ID())
203
-                        );
204
-                        $ticket_line_item = is_array($ticket_line_item)
205
-                            ? reset($ticket_line_item)
206
-                            : $ticket_line_item;
207
-                        $template_args['ticket_line_item'][ $registration->ticket()->ID() ] =
208
-                            $Line_Item_Display->display_line_item($ticket_line_item);
209
-                    }
210
-                    if ($registration->is_primary_registrant()) {
211
-                        $primary_registrant = $registration->reg_url_link();
212
-                    }
213
-                }
214
-            }
215
-            // print_copy_info ?
216
-            if ($primary_registrant && ! $this->checkout->admin_request && count($registrations) > 1) {
217
-                // TODO: add admin option for toggling copy attendee info,
218
-                // then use that value to change $this->_print_copy_info
219
-                $copy_options['spco_copy_attendee_chk'] = $this->_print_copy_info
220
-                    ? $this->_copy_attendee_info_form()
221
-                    : $this->_auto_copy_attendee_info();
222
-                // generate hidden input
223
-                if (isset($subsections[ $primary_registrant ])
224
-                    && $subsections[ $primary_registrant ] instanceof EE_Form_Section_Proper
225
-                ) {
226
-                    $subsections[ $primary_registrant ]->add_subsections(
227
-                        $copy_options,
228
-                        'primary_registrant',
229
-                        false
230
-                    );
231
-                }
232
-            }
233
-        }
234
-        return new EE_Form_Section_Proper(
235
-            array(
236
-                'name'            => $this->reg_form_name(),
237
-                'html_id'         => $this->reg_form_name(),
238
-                'subsections'     => $subsections,
239
-                'layout_strategy' => $this->checkout->admin_request
240
-                    ?
241
-                    new EE_Div_Per_Section_Layout()
242
-                    :
243
-                    new EE_Template_Layout(
244
-                        array(
245
-                            'layout_template_file' => $this->_template, // layout_template
246
-                            'template_args'        => $template_args,
247
-                        )
248
-                    ),
249
-            )
250
-        );
251
-    }
252
-
253
-
254
-    /**
255
-     * @param EE_Registration $registration
256
-     * @return EE_Form_Section_Base
257
-     * @throws EE_Error
258
-     * @throws InvalidArgumentException
259
-     * @throws EntityNotFoundException
260
-     * @throws InvalidDataTypeException
261
-     * @throws InvalidInterfaceException
262
-     * @throws ReflectionException
263
-     */
264
-    private function _registrations_reg_form(EE_Registration $registration)
265
-    {
266
-        static $attendee_nmbr = 1;
267
-        $form_args = array();
268
-        // verify that registration has valid event
269
-        if ($registration->event() instanceof EE_Event) {
270
-            $field_name = 'Event_Question_Group.'
271
-                . EEM_Event_Question_Group::instance()->fieldNameForContext(
272
-                    $registration->is_primary_registrant()
273
-                );
274
-            $question_groups = $registration->event()->question_groups(
275
-                apply_filters(
276
-                    // @codingStandardsIgnoreStart
277
-                    'FHEE__EE_SPCO_Reg_Step_Attendee_Information___registrations_reg_form__question_groups_query_parameters',
278
-                    // @codingStandardsIgnoreEnd
279
-                    [
280
-                        [
281
-                            'Event.EVT_ID'                     => $registration->event()->ID(),
282
-                            $field_name => true,
283
-                        ],
284
-                        'order_by' => ['QSG_order' => 'ASC'],
285
-                    ],
286
-                    $registration,
287
-                    $this
288
-                )
289
-            );
290
-            if ($question_groups) {
291
-                // array of params to pass to parent constructor
292
-                $form_args = array(
293
-                    'html_id'         => 'ee-registration-' . $registration->reg_url_link(),
294
-                    'html_class'      => 'ee-reg-form-attendee-dv',
295
-                    'html_style'      => $this->checkout->admin_request
296
-                        ? 'padding:0em 2em 1em; margin:3em 0 0; border:1px solid #ddd;'
297
-                        : '',
298
-                    'subsections'     => array(),
299
-                    'layout_strategy' => new EE_Fieldset_Section_Layout(
300
-                        array(
301
-                            'legend_class' => 'spco-attendee-lgnd smaller-text lt-grey-text',
302
-                            'legend_text'  => sprintf(
303
-                                esc_html_x(
304
-                                    'Attendee %d',
305
-                                    'Attendee 123',
306
-                                    'event_espresso'
307
-                                ),
308
-                                $attendee_nmbr
309
-                            ),
310
-                        )
311
-                    ),
312
-                );
313
-                foreach ($question_groups as $question_group) {
314
-                    if ($question_group instanceof EE_Question_Group) {
315
-                        $form_args['subsections'][ $question_group->identifier() ] = $this->_question_group_reg_form(
316
-                            $registration,
317
-                            $question_group
318
-                        );
319
-                    }
320
-                }
321
-                // add hidden input
322
-                $form_args['subsections']['additional_attendee_reg_info'] = $this->_additional_attendee_reg_info_input(
323
-                    $registration
324
-                );
325
-                // if we have question groups for additional attendees, then display the copy options
326
-                $this->_print_copy_info = $attendee_nmbr > 1 ? true : $this->_print_copy_info;
327
-                if ($registration->is_primary_registrant()) {
328
-                    // generate hidden input
329
-                    $form_args['subsections']['primary_registrant'] = $this->_additional_primary_registrant_inputs(
330
-                        $registration
331
-                    );
332
-                }
333
-            }
334
-        }
335
-        $attendee_nmbr++;
336
-        return ! empty($form_args)
337
-            ? new EE_Form_Section_Proper($form_args)
338
-            : new EE_Form_Section_HTML();
339
-    }
340
-
341
-
342
-    /**
343
-     * @param EE_Registration $registration
344
-     * @param bool            $additional_attendee_reg_info
345
-     * @return EE_Form_Input_Base
346
-     * @throws EE_Error
347
-     */
348
-    private function _additional_attendee_reg_info_input(
349
-        EE_Registration $registration,
350
-        $additional_attendee_reg_info = true
351
-    ) {
352
-        // generate hidden input
353
-        return new EE_Hidden_Input(
354
-            array(
355
-                'html_id' => 'additional-attendee-reg-info-' . $registration->reg_url_link(),
356
-                'default' => $additional_attendee_reg_info,
357
-            )
358
-        );
359
-    }
360
-
361
-
362
-    /**
363
-     * @param EE_Registration   $registration
364
-     * @param EE_Question_Group $question_group
365
-     * @return EE_Form_Section_Proper
366
-     * @throws EE_Error
367
-     * @throws InvalidArgumentException
368
-     * @throws InvalidDataTypeException
369
-     * @throws InvalidInterfaceException
370
-     * @throws ReflectionException
371
-     */
372
-    private function _question_group_reg_form(EE_Registration $registration, EE_Question_Group $question_group)
373
-    {
374
-        // array of params to pass to parent constructor
375
-        $form_args = array(
376
-            'html_id'         => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-' . $registration->ID(),
377
-            'html_class'      => $this->checkout->admin_request
378
-                ? 'form-table ee-reg-form-qstn-grp-dv'
379
-                : 'ee-reg-form-qstn-grp-dv',
380
-            'html_label_id'   => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-'
381
-                                 . $registration->ID() . '-lbl',
382
-            'subsections'     => array(
383
-                'reg_form_qstn_grp_hdr' => $this->_question_group_header($question_group),
384
-            ),
385
-            'layout_strategy' => $this->checkout->admin_request
386
-                ? new EE_Admin_Two_Column_Layout()
387
-                : new EE_Div_Per_Section_Layout(),
388
-        );
389
-        // where params
390
-        $query_params = array('QST_deleted' => 0);
391
-        // don't load admin only questions on the frontend
392
-        if (! $this->checkout->admin_request) {
393
-            $query_params['QST_admin_only'] = array('!=', true);
394
-        }
395
-        $questions = $question_group->get_many_related(
396
-            'Question',
397
-            apply_filters(
398
-                'FHEE__EE_SPCO_Reg_Step_Attendee_Information___question_group_reg_form__related_questions_query_params',
399
-                array(
400
-                    $query_params,
401
-                    'order_by' => array(
402
-                        'Question_Group_Question.QGQ_order' => 'ASC',
403
-                    ),
404
-                ),
405
-                $question_group,
406
-                $registration,
407
-                $this
408
-            )
409
-        );
410
-        // filter for additional content before questions
411
-        $form_args['subsections']['reg_form_questions_before'] = new EE_Form_Section_HTML(
412
-            apply_filters(
413
-                'FHEE__EEH_Form_Fields__generate_question_groups_html__before_question_group_questions',
414
-                '',
415
-                $registration,
416
-                $question_group,
417
-                $this
418
-            )
419
-        );
420
-        // loop thru questions
421
-        foreach ($questions as $question) {
422
-            if ($question instanceof EE_Question) {
423
-                $identifier = $question->is_system_question()
424
-                    ? $question->system_ID()
425
-                    : $question->ID();
426
-                $form_args['subsections'][ $identifier ] = $this->reg_form_question($registration, $question);
427
-            }
428
-        }
429
-        $form_args['subsections'] = apply_filters(
430
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information__question_group_reg_form__subsections_array',
431
-            $form_args['subsections'],
432
-            $registration,
433
-            $question_group,
434
-            $this
435
-        );
436
-        // filter for additional content after questions
437
-        $form_args['subsections']['reg_form_questions_after'] = new EE_Form_Section_HTML(
438
-            apply_filters(
439
-                'FHEE__EEH_Form_Fields__generate_question_groups_html__after_question_group_questions',
440
-                '',
441
-                $registration,
442
-                $question_group,
443
-                $this
444
-            )
445
-        );
446
-        // d($form_args);
447
-        $question_group_reg_form = new EE_Form_Section_Proper($form_args);
448
-        return apply_filters(
449
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information___question_group_reg_form__question_group_reg_form',
450
-            $question_group_reg_form,
451
-            $registration,
452
-            $question_group,
453
-            $this
454
-        );
455
-    }
456
-
457
-
458
-    /**
459
-     * @param EE_Question_Group $question_group
460
-     * @return    EE_Form_Section_HTML
461
-     */
462
-    private function _question_group_header(EE_Question_Group $question_group)
463
-    {
464
-        $html = '';
465
-        // group_name
466
-        if ($question_group->show_group_name() && $question_group->name() !== '') {
467
-            if ($this->checkout->admin_request) {
468
-                $html .= EEH_HTML::br();
469
-                $html .= EEH_HTML::h3(
470
-                    $question_group->name(),
471
-                    '',
472
-                    'ee-reg-form-qstn-grp-title title',
473
-                    'font-size: 1.3em; padding-left:0;'
474
-                );
475
-            } else {
476
-                $html .= EEH_HTML::h4(
477
-                    $question_group->name(),
478
-                    '',
479
-                    'ee-reg-form-qstn-grp-title section-title'
480
-                );
481
-            }
482
-        }
483
-        // group_desc
484
-        if ($question_group->show_group_desc() && $question_group->desc() !== '') {
485
-            $html .= EEH_HTML::p(
486
-                $question_group->desc(),
487
-                '',
488
-                $this->checkout->admin_request
489
-                    ? 'ee-reg-form-qstn-grp-desc-pg'
490
-                    : 'ee-reg-form-qstn-grp-desc-pg small-text lt-grey-text'
491
-            );
492
-        }
493
-        return new EE_Form_Section_HTML($html);
494
-    }
495
-
496
-
497
-    /**
498
-     * @return    EE_Form_Section_Proper
499
-     * @throws EE_Error
500
-     * @throws InvalidArgumentException
501
-     * @throws ReflectionException
502
-     * @throws InvalidDataTypeException
503
-     * @throws InvalidInterfaceException
504
-     */
505
-    private function _copy_attendee_info_form()
506
-    {
507
-        // array of params to pass to parent constructor
508
-        return new EE_Form_Section_Proper(
509
-            array(
510
-                'subsections'     => $this->_copy_attendee_info_inputs(),
511
-                'layout_strategy' => new EE_Template_Layout(
512
-                    array(
513
-                        'layout_template_file'     => SPCO_REG_STEPS_PATH
514
-                                                      . $this->_slug
515
-                                                      . '/copy_attendee_info.template.php',
516
-                        'begin_template_file'      => null,
517
-                        'input_template_file'      => null,
518
-                        'subsection_template_file' => null,
519
-                        'end_template_file'        => null,
520
-                    )
521
-                ),
522
-            )
523
-        );
524
-    }
525
-
526
-
527
-    /**
528
-     * @return EE_Form_Section_HTML
529
-     * @throws DomainException
530
-     * @throws InvalidArgumentException
531
-     * @throws InvalidDataTypeException
532
-     * @throws InvalidInterfaceException
533
-     */
534
-    private function _auto_copy_attendee_info()
535
-    {
536
-        return new EE_Form_Section_HTML(
537
-            EEH_Template::locate_template(
538
-                SPCO_REG_STEPS_PATH . $this->_slug . '/_auto_copy_attendee_info.template.php',
539
-                apply_filters(
540
-                    'FHEE__EE_SPCO_Reg_Step_Attendee_Information__auto_copy_attendee_info__template_args',
541
-                    array()
542
-                ),
543
-                true,
544
-                true
545
-            )
546
-        );
547
-    }
548
-
549
-
550
-    /**
551
-     * @return array
552
-     * @throws EE_Error
553
-     * @throws InvalidArgumentException
554
-     * @throws ReflectionException
555
-     * @throws InvalidDataTypeException
556
-     * @throws InvalidInterfaceException
557
-     */
558
-    private function _copy_attendee_info_inputs()
559
-    {
560
-        $copy_attendee_info_inputs = array();
561
-        $prev_ticket = null;
562
-        // grab the saved registrations from the transaction
563
-        $registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
564
-        foreach ($registrations as $registration) {
565
-            // for all  attendees other than the primary attendee
566
-            if ($registration instanceof EE_Registration && ! $registration->is_primary_registrant()) {
567
-                // if this is a new ticket OR if this is the very first additional attendee after the primary attendee
568
-                if ($registration->ticket()->ID() !== $prev_ticket) {
569
-                    $item_name = $registration->ticket()->name();
570
-                    $item_name .= $registration->ticket()->description() !== ''
571
-                        ? ' - ' . $registration->ticket()->description()
572
-                        : '';
573
-                    $copy_attendee_info_inputs[ 'spco_copy_attendee_chk[ticket-' . $registration->ticket()->ID(
574
-                    ) . ']' ] =
575
-                        new EE_Form_Section_HTML(
576
-                            '<h6 class="spco-copy-attendee-event-hdr">' . $item_name . '</h6>'
577
-                        );
578
-                    $prev_ticket = $registration->ticket()->ID();
579
-                }
580
-
581
-                $copy_attendee_info_inputs[ 'spco_copy_attendee_chk[' . $registration->ID() . ']' ] =
582
-                    new EE_Checkbox_Multi_Input(
583
-                        array(
584
-                            $registration->ID() => sprintf(
585
-                                esc_html_x('Attendee #%s', 'Attendee #123', 'event_espresso'),
586
-                                $registration->count()
587
-                            ),
588
-                        ),
589
-                        array(
590
-                            'html_id'                 => 'spco-copy-attendee-chk-' . $registration->reg_url_link(),
591
-                            'html_class'              => 'spco-copy-attendee-chk ee-do-not-validate',
592
-                            'display_html_label_text' => false,
593
-                        )
594
-                    );
595
-            }
596
-        }
597
-        return $copy_attendee_info_inputs;
598
-    }
599
-
600
-
601
-    /**
602
-     * @param EE_Registration $registration
603
-     * @return    EE_Form_Input_Base
604
-     * @throws EE_Error
605
-     */
606
-    private function _additional_primary_registrant_inputs(EE_Registration $registration)
607
-    {
608
-        // generate hidden input
609
-        return new EE_Hidden_Input(
610
-            array(
611
-                'html_id' => 'primary_registrant',
612
-                'default' => $registration->reg_url_link(),
613
-            )
614
-        );
615
-    }
616
-
617
-
618
-    /**
619
-     * @param EE_Registration $registration
620
-     * @param EE_Question     $question
621
-     * @return EE_Form_Input_Base
622
-     * @throws EE_Error
623
-     * @throws InvalidArgumentException
624
-     * @throws InvalidDataTypeException
625
-     * @throws InvalidInterfaceException
626
-     * @throws ReflectionException
627
-     */
628
-    public function reg_form_question(EE_Registration $registration, EE_Question $question)
629
-    {
630
-
631
-        // if this question was for an attendee detail, then check for that answer
632
-        $answer_value = EEM_Answer::instance()->get_attendee_property_answer_value(
633
-            $registration,
634
-            $question->system_ID()
635
-        );
636
-        $answer = $answer_value === null
637
-            ? EEM_Answer::instance()->get_one(
638
-                array(array('QST_ID' => $question->ID(), 'REG_ID' => $registration->ID()))
639
-            )
640
-            : null;
641
-        // if NOT returning to edit an existing registration
642
-        // OR if this question is for an attendee property
643
-        // OR we still don't have an EE_Answer object
644
-        if ($answer_value || ! $answer instanceof EE_Answer || ! $registration->reg_url_link()) {
645
-            // create an EE_Answer object for storing everything in
646
-            $answer = EE_Answer::new_instance(
647
-                array(
648
-                    'QST_ID' => $question->ID(),
649
-                    'REG_ID' => $registration->ID(),
650
-                )
651
-            );
652
-        }
653
-        // verify instance
654
-        if ($answer instanceof EE_Answer) {
655
-            if (! empty($answer_value)) {
656
-                $answer->set('ANS_value', $answer_value);
657
-            }
658
-            $answer->cache('Question', $question);
659
-            // remember system ID had a bug where sometimes it could be null
660
-            $answer_cache_id = $question->is_system_question()
661
-                ? $question->system_ID() . '-' . $registration->reg_url_link()
662
-                : $question->ID() . '-' . $registration->reg_url_link();
663
-            $registration->cache('Answer', $answer, $answer_cache_id);
664
-        }
665
-        return $this->_generate_question_input($registration, $question, $answer);
666
-    }
667
-
668
-
669
-    /**
670
-     * @param EE_Registration $registration
671
-     * @param EE_Question     $question
672
-     * @param                 $answer
673
-     * @return EE_Form_Input_Base
674
-     * @throws EE_Error
675
-     * @throws InvalidArgumentException
676
-     * @throws ReflectionException
677
-     * @throws InvalidDataTypeException
678
-     * @throws InvalidInterfaceException
679
-     */
680
-    private function _generate_question_input(EE_Registration $registration, EE_Question $question, $answer)
681
-    {
682
-        $identifier = $question->is_system_question()
683
-            ? $question->system_ID()
684
-            : $question->ID();
685
-        $this->_required_questions[ $identifier ] = $question->required() ? true : false;
686
-        add_filter(
687
-            'FHEE__EE_Question__generate_form_input__country_options',
688
-            array($this, 'use_cached_countries_for_form_input'),
689
-            10,
690
-            4
691
-        );
692
-        add_filter(
693
-            'FHEE__EE_Question__generate_form_input__state_options',
694
-            array($this, 'use_cached_states_for_form_input'),
695
-            10,
696
-            4
697
-        );
698
-        $input_constructor_args = array(
699
-            'html_name'        => 'ee_reg_qstn[' . $registration->ID() . '][' . $identifier . ']',
700
-            'html_id'          => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
701
-            'html_class'       => 'ee-reg-qstn ee-reg-qstn-' . $identifier,
702
-            'html_label_id'    => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
703
-            'html_label_class' => 'ee-reg-qstn',
704
-        );
705
-        $input_constructor_args['html_label_id'] .= '-lbl';
706
-        if ($answer instanceof EE_Answer && $answer->ID()) {
707
-            $input_constructor_args['html_name'] .= '[' . $answer->ID() . ']';
708
-            $input_constructor_args['html_id'] .= '-' . $answer->ID();
709
-            $input_constructor_args['html_label_id'] .= '-' . $answer->ID();
710
-        }
711
-        $form_input = $question->generate_form_input(
712
-            $registration,
713
-            $answer,
714
-            $input_constructor_args
715
-        );
716
-        remove_filter(
717
-            'FHEE__EE_Question__generate_form_input__country_options',
718
-            array($this, 'use_cached_countries_for_form_input')
719
-        );
720
-        remove_filter(
721
-            'FHEE__EE_Question__generate_form_input__state_options',
722
-            array($this, 'use_cached_states_for_form_input')
723
-        );
724
-        return $form_input;
725
-    }
726
-
727
-
728
-    /**
729
-     * Gets the list of countries for the form input
730
-     *
731
-     * @param array|null      $countries_list
732
-     * @param EE_Question     $question
733
-     * @param EE_Registration $registration
734
-     * @param EE_Answer       $answer
735
-     * @return array 2d keys are country IDs, values are their names
736
-     * @throws EE_Error
737
-     * @throws InvalidArgumentException
738
-     * @throws InvalidDataTypeException
739
-     * @throws InvalidInterfaceException
740
-     * @throws ReflectionException
741
-     */
742
-    public function use_cached_countries_for_form_input(
743
-        $countries_list,
744
-        EE_Question $question = null,
745
-        EE_Registration $registration = null,
746
-        EE_Answer $answer = null
747
-    ) {
748
-        $country_options = array('' => '');
749
-        // get possibly cached list of countries
750
-        $countries = $this->checkout->action === 'process_reg_step'
751
-            ? EEM_Country::instance()->get_all_countries()
752
-            : EEM_Country::instance()->get_all_active_countries();
753
-        if (! empty($countries)) {
754
-            foreach ($countries as $country) {
755
-                if ($country instanceof EE_Country) {
756
-                    $country_options[ $country->ID() ] = $country->name();
757
-                }
758
-            }
759
-        }
760
-        if ($question instanceof EE_Question && $registration instanceof EE_Registration) {
761
-            $answer = EEM_Answer::instance()->get_one(
762
-                array(array('QST_ID' => $question->ID(), 'REG_ID' => $registration->ID()))
763
-            );
764
-        } else {
765
-            $answer = EE_Answer::new_instance();
766
-        }
767
-        $country_options = apply_filters(
768
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__country_options',
769
-            $country_options,
770
-            $this,
771
-            $registration,
772
-            $question,
773
-            $answer
774
-        );
775
-        return $country_options;
776
-    }
777
-
778
-
779
-    /**
780
-     * Gets the list of states for the form input
781
-     *
782
-     * @param array|null      $states_list
783
-     * @param EE_Question     $question
784
-     * @param EE_Registration $registration
785
-     * @param EE_Answer       $answer
786
-     * @return array 2d keys are state IDs, values are their names
787
-     * @throws EE_Error
788
-     * @throws InvalidArgumentException
789
-     * @throws InvalidDataTypeException
790
-     * @throws InvalidInterfaceException
791
-     * @throws ReflectionException
792
-     */
793
-    public function use_cached_states_for_form_input(
794
-        $states_list,
795
-        EE_Question $question = null,
796
-        EE_Registration $registration = null,
797
-        EE_Answer $answer = null
798
-    ) {
799
-        $state_options = array('' => array('' => ''));
800
-        $states = $this->checkout->action === 'process_reg_step'
801
-            ? EEM_State::instance()->get_all_states()
802
-            : EEM_State::instance()->get_all_active_states();
803
-        if (! empty($states)) {
804
-            foreach ($states as $state) {
805
-                if ($state instanceof EE_State) {
806
-                    $state_options[ $state->country()->name() ][ $state->ID() ] = $state->name();
807
-                }
808
-            }
809
-        }
810
-        $state_options = apply_filters(
811
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__state_options',
812
-            $state_options,
813
-            $this,
814
-            $registration,
815
-            $question,
816
-            $answer
817
-        );
818
-        return $state_options;
819
-    }
820
-
821
-
822
-    /********************************************************************************************************/
823
-    /****************************************  PROCESS REG STEP  ****************************************/
824
-    /********************************************************************************************************/
825
-
826
-
827
-    /**
828
-     * @return bool
829
-     * @throws EE_Error
830
-     * @throws InvalidArgumentException
831
-     * @throws ReflectionException
832
-     * @throws RuntimeException
833
-     * @throws InvalidDataTypeException
834
-     * @throws InvalidInterfaceException
835
-     */
836
-    public function process_reg_step()
837
-    {
838
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
839
-        // grab validated data from form
840
-        $valid_data = $this->checkout->current_step->valid_data();
841
-        // EEH_Debug_Tools::printr( $_REQUEST, '$_REQUEST', __FILE__, __LINE__ );
842
-        // EEH_Debug_Tools::printr( $valid_data, '$valid_data', __FILE__, __LINE__ );
843
-        // if we don't have any $valid_data then something went TERRIBLY WRONG !!!
844
-        if (empty($valid_data)) {
845
-            EE_Error::add_error(
846
-                esc_html__('No valid question responses were received.', 'event_espresso'),
847
-                __FILE__,
848
-                __FUNCTION__,
849
-                __LINE__
850
-            );
851
-            return false;
852
-        }
853
-        if (! $this->checkout->transaction instanceof EE_Transaction || ! $this->checkout->continue_reg) {
854
-            EE_Error::add_error(
855
-                esc_html__(
856
-                    'A valid transaction could not be initiated for processing your registrations.',
857
-                    'event_espresso'
858
-                ),
859
-                __FILE__,
860
-                __FUNCTION__,
861
-                __LINE__
862
-            );
863
-            return false;
864
-        }
865
-        // get cached registrations
866
-        $registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
867
-        // verify we got the goods
868
-        if (empty($registrations)) {
869
-            // combine the old translated string with a new one, in order to not break translations
870
-            $error_message = esc_html__(
871
-                'Your form data could not be applied to any valid registrations.',
872
-                'event_espresso'
873
-            )
874
-            . sprintf(
875
-                esc_html_x(
876
-                    '%3$sThis can sometimes happen if too much time has been taken to complete the registration process.%3$sPlease return to the %1$sEvent List%2$s and reselect your tickets. If the problem continues, please contact the site administrator.',
877
-                    '(line break)This can sometimes happen if too much time has been taken to complete the registration process.(line break)Please return to the (link)Event List(end link) and reselect your tickets. If the problem continues, please contact the site administrator.',
878
-                    'event_espresso'
879
-                ),
880
-                '<a href="' . get_post_type_archive_link('espresso_events') . '" >',
881
-                '</a>',
882
-                '<br />'
883
-            );
884
-            EE_Error::add_error(
885
-                $error_message,
886
-                __FILE__,
887
-                __FUNCTION__,
888
-                __LINE__
889
-            );
890
-            return false;
891
-        }
892
-        // extract attendee info from form data and save to model objects
893
-        $registrations_processed = $this->_process_registrations($registrations, $valid_data);
894
-        // if first pass thru SPCO,
895
-        // then let's check processed registrations against the total number of tickets in the cart
896
-        if ($registrations_processed === false) {
897
-            // but return immediately if the previous step exited early due to errors
898
-            return false;
899
-        }
900
-        if (! $this->checkout->revisit && $registrations_processed !== $this->checkout->total_ticket_count) {
901
-            // generate a correctly translated string for all possible singular/plural combinations
902
-            if ($this->checkout->total_ticket_count === 1 && $registrations_processed !== 1) {
903
-                $error_msg = sprintf(
904
-                    esc_html_x(
905
-                        'There was %1$d ticket in the Event Queue, but %2$ds registrations were processed',
906
-                        'There was 1 ticket in the Event Queue, but 2 registrations were processed',
907
-                        'event_espresso'
908
-                    ),
909
-                    $this->checkout->total_ticket_count,
910
-                    $registrations_processed
911
-                );
912
-            } elseif ($this->checkout->total_ticket_count !== 1 && $registrations_processed === 1) {
913
-                $error_msg = sprintf(
914
-                    esc_html_x(
915
-                        'There was a total of %1$d tickets in the Event Queue, but only %2$ds registration was processed',
916
-                        'There was a total of 2 tickets in the Event Queue, but only 1 registration was processed',
917
-                        'event_espresso'
918
-                    ),
919
-                    $this->checkout->total_ticket_count,
920
-                    $registrations_processed
921
-                );
922
-            } else {
923
-                $error_msg = sprintf(
924
-                    esc_html__(
925
-                        'There was a total of 2 tickets in the Event Queue, but 2 registrations were processed',
926
-                        'event_espresso'
927
-                    ),
928
-                    $this->checkout->total_ticket_count,
929
-                    $registrations_processed
930
-                );
931
-            }
932
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
933
-            return false;
934
-        }
935
-        // mark this reg step as completed
936
-        $this->set_completed();
937
-        $this->_set_success_message(
938
-            esc_html__('The Attendee Information Step has been successfully completed.', 'event_espresso')
939
-        );
940
-        // do action in case a plugin wants to do something with the data submitted in step 1.
941
-        // passes EE_Single_Page_Checkout, and it's posted data
942
-        do_action('AHEE__EE_Single_Page_Checkout__process_attendee_information__end', $this, $valid_data);
943
-        return true;
944
-    }
945
-
946
-
947
-    /**
948
-     *    _process_registrations
949
-     *
950
-     * @param EE_Registration[] $registrations
951
-     * @param array[][]         $valid_data
952
-     * @return bool|int
953
-     * @throws EntityNotFoundException
954
-     * @throws EE_Error
955
-     * @throws InvalidArgumentException
956
-     * @throws ReflectionException
957
-     * @throws RuntimeException
958
-     * @throws InvalidDataTypeException
959
-     * @throws InvalidInterfaceException
960
-     */
961
-    private function _process_registrations($registrations = array(), $valid_data = array())
962
-    {
963
-        // load resources and set some defaults
964
-        EE_Registry::instance()->load_model('Attendee');
965
-        // holder for primary registrant attendee object
966
-        $this->checkout->primary_attendee_obj = null;
967
-        // array for tracking reg form data for the primary registrant
968
-        $primary_registrant = array(
969
-            'line_item_id' => null,
970
-        );
971
-        $copy_primary = false;
972
-        // reg form sections that do not contain inputs
973
-        $non_input_form_sections = array(
974
-            'primary_registrant',
975
-            'additional_attendee_reg_info',
976
-            'spco_copy_attendee_chk',
977
-        );
978
-        // attendee counter
979
-        $att_nmbr = 0;
980
-        // grab the saved registrations from the transaction
981
-        foreach ($registrations as $registration) {
982
-            // verify EE_Registration object
983
-            if (! $registration instanceof EE_Registration) {
984
-                EE_Error::add_error(
985
-                    esc_html__(
986
-                        'An invalid Registration object was discovered when attempting to process your registration information.',
987
-                        'event_espresso'
988
-                    ),
989
-                    __FILE__,
990
-                    __FUNCTION__,
991
-                    __LINE__
992
-                );
993
-                return false;
994
-            }
995
-            /** @var string $reg_url_link */
996
-            $reg_url_link = $registration->reg_url_link();
997
-            // reg_url_link exists ?
998
-            if (! empty($reg_url_link)) {
999
-                // should this registration be processed during this visit ?
1000
-                if ($this->checkout->visit_allows_processing_of_this_registration($registration)) {
1001
-                    // if NOT revisiting, then let's save the registration now,
1002
-                    // so that we have a REG_ID to use when generating other objects
1003
-                    if (! $this->checkout->revisit) {
1004
-                        $registration->save();
1005
-                    }
1006
-                    /**
1007
-                     * This allows plugins to trigger a fail on processing of a
1008
-                     * registration for any conditions they may have for it to pass.
1009
-                     *
1010
-                     * @var bool   if true is returned by the plugin then the
1011
-                     *            registration processing is halted.
1012
-                     */
1013
-                    if (apply_filters(
1014
-                        'FHEE__EE_SPCO_Reg_Step_Attendee_Information___process_registrations__pre_registration_process',
1015
-                        false,
1016
-                        $att_nmbr,
1017
-                        $registration,
1018
-                        $registrations,
1019
-                        $valid_data,
1020
-                        $this
1021
-                    )) {
1022
-                        return false;
1023
-                    }
1024
-
1025
-                    // Houston, we have a registration!
1026
-                    $att_nmbr++;
1027
-                    $this->_attendee_data[ $reg_url_link ] = array();
1028
-                    // grab any existing related answer objects
1029
-                    $this->_registration_answers = $registration->answers();
1030
-                    // unset( $valid_data[ $reg_url_link ]['additional_attendee_reg_info'] );
1031
-                    if (isset($valid_data[ $reg_url_link ])) {
1032
-                        // do we need to copy basic info from primary attendee ?
1033
-                        $copy_primary = isset($valid_data[ $reg_url_link ]['additional_attendee_reg_info'])
1034
-                                        && absint($valid_data[ $reg_url_link ]['additional_attendee_reg_info']) === 0;
1035
-                        // filter form input data for this registration
1036
-                        $valid_data[ $reg_url_link ] = (array) apply_filters(
1037
-                            'FHEE__EE_Single_Page_Checkout__process_attendee_information__valid_data_line_item',
1038
-                            $valid_data[ $reg_url_link ]
1039
-                        );
1040
-                        if (isset($valid_data['primary_attendee'])) {
1041
-                            $primary_registrant['line_item_id'] = ! empty($valid_data['primary_attendee'])
1042
-                                ? $valid_data['primary_attendee']
1043
-                                : false;
1044
-                            unset($valid_data['primary_attendee']);
1045
-                        }
1046
-                        // now loop through our array of valid post data && process attendee reg forms
1047
-                        foreach ($valid_data[ $reg_url_link ] as $form_section => $form_inputs) {
1048
-                            if (! in_array($form_section, $non_input_form_sections, true)) {
1049
-                                foreach ($form_inputs as $form_input => $input_value) {
1050
-                                    // \EEH_Debug_Tools::printr( $input_value, $form_input, __FILE__, __LINE__ );
1051
-                                    // check for critical inputs
1052
-                                    if (! $this->_verify_critical_attendee_details_are_set_and_validate_email(
1053
-                                        $form_input,
1054
-                                        $input_value
1055
-                                    )
1056
-                                    ) {
1057
-                                        return false;
1058
-                                    }
1059
-                                    // store a bit of data about the primary attendee
1060
-                                    if ($att_nmbr === 1
1061
-                                        && ! empty($input_value)
1062
-                                        && $reg_url_link === $primary_registrant['line_item_id']
1063
-                                    ) {
1064
-                                        $primary_registrant[ $form_input ] = $input_value;
1065
-                                    } elseif ($copy_primary
1066
-                                              && $input_value === null
1067
-                                              && isset($primary_registrant[ $form_input ])
1068
-                                    ) {
1069
-                                        $input_value = $primary_registrant[ $form_input ];
1070
-                                    }
1071
-                                    // now attempt to save the input data
1072
-                                    if (! $this->_save_registration_form_input(
1073
-                                        $registration,
1074
-                                        $form_input,
1075
-                                        $input_value
1076
-                                    )
1077
-                                    ) {
1078
-                                        EE_Error::add_error(
1079
-                                            sprintf(
1080
-                                                esc_html_x(
1081
-                                                    'Unable to save registration form data for the form input: "%1$s" with the submitted value: "%2$s"',
1082
-                                                    'Unable to save registration form data for the form input: "form input name" with the submitted value: "form input value"',
1083
-                                                    'event_espresso'
1084
-                                                ),
1085
-                                                $form_input,
1086
-                                                $input_value
1087
-                                            ),
1088
-                                            __FILE__,
1089
-                                            __FUNCTION__,
1090
-                                            __LINE__
1091
-                                        );
1092
-                                        return false;
1093
-                                    }
1094
-                                }
1095
-                            }
1096
-                        }  // end of foreach ( $valid_data[ $reg_url_link ] as $form_section => $form_inputs )
1097
-                    }
1098
-                    // EEH_Debug_Tools::printr( $this->_attendee_data, '$this->_attendee_data', __FILE__, __LINE__ );
1099
-                    // this registration does not require additional attendee information ?
1100
-                    if ($copy_primary
1101
-                        && $att_nmbr > 1
1102
-                        && $this->checkout->primary_attendee_obj instanceof EE_Attendee
1103
-                    ) {
1104
-                        // just copy the primary registrant
1105
-                        $attendee = $this->checkout->primary_attendee_obj;
1106
-                    } else {
1107
-                        // ensure critical details are set for additional attendees
1108
-                        $this->_attendee_data[ $reg_url_link ] = $att_nmbr > 1
1109
-                            ? $this->_copy_critical_attendee_details_from_primary_registrant(
1110
-                                $this->_attendee_data[ $reg_url_link ]
1111
-                            )
1112
-                            : $this->_attendee_data[ $reg_url_link ];
1113
-                        // execute create attendee command (which may return an existing attendee)
1114
-                        $attendee = EE_Registry::instance()->BUS->execute(
1115
-                            new CreateAttendeeCommand(
1116
-                                $this->_attendee_data[ $reg_url_link ],
1117
-                                $registration
1118
-                            )
1119
-                        );
1120
-                        // who's #1 ?
1121
-                        if ($att_nmbr === 1) {
1122
-                            $this->checkout->primary_attendee_obj = $attendee;
1123
-                        }
1124
-                    }
1125
-                    // EEH_Debug_Tools::printr( $attendee, '$attendee', __FILE__, __LINE__ );
1126
-                    // add relation to registration, set attendee ID, and cache attendee
1127
-                    $this->_associate_attendee_with_registration($registration, $attendee);
1128
-                    // \EEH_Debug_Tools::printr( $registration, '$registration', __FILE__, __LINE__ );
1129
-                    if (! $registration->attendee() instanceof EE_Attendee) {
1130
-                        EE_Error::add_error(
1131
-                            sprintf(
1132
-                                esc_html_x(
1133
-                                    'Registration %s has an invalid or missing Attendee object.',
1134
-                                    'Registration 123-456-789 has an invalid or missing Attendee object.',
1135
-                                    'event_espresso'
1136
-                                ),
1137
-                                $reg_url_link
1138
-                            ),
1139
-                            __FILE__,
1140
-                            __FUNCTION__,
1141
-                            __LINE__
1142
-                        );
1143
-                        return false;
1144
-                    }
1145
-                    /** @type EE_Registration_Processor $registration_processor */
1146
-                    $registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
1147
-                    // at this point, we should have enough details about the registrant to consider the registration
1148
-                    // NOT incomplete
1149
-                    $registration_processor->toggle_incomplete_registration_status_to_default(
1150
-                        $registration,
1151
-                        false,
1152
-                        new Context(
1153
-                            'spco_reg_step_attendee_information_process_registrations',
1154
-                            esc_html__(
1155
-                                'Finished populating registration with details from the registration form after submitting the Attendee Information Reg Step.',
1156
-                                'event_espresso'
1157
-                            )
1158
-                        )
1159
-                    );
1160
-                    // we can also consider the TXN to not have been failed, so temporarily upgrade it's status to
1161
-                    // abandoned
1162
-                    $this->checkout->transaction->toggle_failed_transaction_status();
1163
-                    // if we've gotten this far, then let's save what we have
1164
-                    $registration->save();
1165
-                    // add relation between TXN and registration
1166
-                    $this->_associate_registration_with_transaction($registration);
1167
-                }
1168
-            } else {
1169
-                EE_Error::add_error(
1170
-                    esc_html__(
1171
-                        'An invalid or missing line item ID was encountered while attempting to process the registration form.',
1172
-                        'event_espresso'
1173
-                    ),
1174
-                    __FILE__,
1175
-                    __FUNCTION__,
1176
-                    __LINE__
1177
-                );
1178
-                // remove malformed data
1179
-                unset($valid_data[ $reg_url_link ]);
1180
-                return false;
1181
-            }
1182
-        } // end of foreach ( $this->checkout->transaction->registrations()  as $registration )
1183
-        return $att_nmbr;
1184
-    }
1185
-
1186
-
1187
-    /**
1188
-     *    _save_registration_form_input
1189
-     *
1190
-     * @param EE_Registration $registration
1191
-     * @param string          $form_input
1192
-     * @param string          $input_value
1193
-     * @return bool
1194
-     * @throws EE_Error
1195
-     * @throws InvalidArgumentException
1196
-     * @throws InvalidDataTypeException
1197
-     * @throws InvalidInterfaceException
1198
-     * @throws ReflectionException
1199
-     */
1200
-    private function _save_registration_form_input(
1201
-        EE_Registration $registration,
1202
-        $form_input = '',
1203
-        $input_value = ''
1204
-    ) {
1205
-        // \EEH_Debug_Tools::printr( __FUNCTION__, __CLASS__, __FILE__, __LINE__, 2 );
1206
-        // \EEH_Debug_Tools::printr( $form_input, '$form_input', __FILE__, __LINE__ );
1207
-        // \EEH_Debug_Tools::printr( $input_value, '$input_value', __FILE__, __LINE__ );
1208
-        // allow for plugins to hook in and do their own processing of the form input.
1209
-        // For plugins to bypass normal processing here, they just need to return a boolean value.
1210
-        if (apply_filters(
1211
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information___save_registration_form_input',
1212
-            false,
1213
-            $registration,
1214
-            $form_input,
1215
-            $input_value,
1216
-            $this
1217
-        )) {
1218
-            return true;
1219
-        }
1220
-        /*
21
+	/**
22
+	 * @type bool $_print_copy_info
23
+	 */
24
+	private $_print_copy_info = false;
25
+
26
+	/**
27
+	 * @type array $_attendee_data
28
+	 */
29
+	private $_attendee_data = array();
30
+
31
+	/**
32
+	 * @type array $_required_questions
33
+	 */
34
+	private $_required_questions = array();
35
+
36
+	/**
37
+	 * @type array $_registration_answers
38
+	 */
39
+	private $_registration_answers = array();
40
+
41
+
42
+	/**
43
+	 *    class constructor
44
+	 *
45
+	 * @access    public
46
+	 * @param    EE_Checkout $checkout
47
+	 */
48
+	public function __construct(EE_Checkout $checkout)
49
+	{
50
+		$this->_slug = 'attendee_information';
51
+		$this->_name = esc_html__('Attendee Information', 'event_espresso');
52
+		$this->_template = SPCO_REG_STEPS_PATH . $this->_slug . '/attendee_info_main.template.php';
53
+		$this->checkout = $checkout;
54
+		$this->_reset_success_message();
55
+		$this->set_instructions(
56
+			esc_html__('Please answer the following registration questions before proceeding.', 'event_espresso')
57
+		);
58
+	}
59
+
60
+
61
+	public function translate_js_strings()
62
+	{
63
+		EE_Registry::$i18n_js_strings['required_field'] = esc_html__(
64
+			' is a required question.',
65
+			'event_espresso'
66
+		);
67
+		EE_Registry::$i18n_js_strings['required_multi_field'] = esc_html__(
68
+			' is a required question. Please enter a value for at least one of the options.',
69
+			'event_espresso'
70
+		);
71
+		EE_Registry::$i18n_js_strings['answer_required_questions'] = esc_html__(
72
+			'Please answer all required questions correctly before proceeding.',
73
+			'event_espresso'
74
+		);
75
+		EE_Registry::$i18n_js_strings['attendee_info_copied'] = sprintf(
76
+			esc_html_x(
77
+				'The attendee information was successfully copied.%sPlease ensure the rest of the registration form is completed before proceeding.',
78
+				'The attendee information was successfully copied.(line break)Please ensure the rest of the registration form is completed before proceeding.',
79
+				'event_espresso'
80
+			),
81
+			'<br/>'
82
+		);
83
+		EE_Registry::$i18n_js_strings['attendee_info_copy_error'] = esc_html__(
84
+			'An unknown error occurred on the server while attempting to copy the attendee information. Please refresh the page and try again.',
85
+			'event_espresso'
86
+		);
87
+		EE_Registry::$i18n_js_strings['enter_valid_email'] = esc_html__(
88
+			'You must enter a valid email address.',
89
+			'event_espresso'
90
+		);
91
+		EE_Registry::$i18n_js_strings['valid_email_and_questions'] = esc_html__(
92
+			'You must enter a valid email address and answer all other required questions before you can proceed.',
93
+			'event_espresso'
94
+		);
95
+	}
96
+
97
+
98
+	public function enqueue_styles_and_scripts()
99
+	{
100
+	}
101
+
102
+
103
+	/**
104
+	 * @return boolean
105
+	 */
106
+	public function initialize_reg_step()
107
+	{
108
+		return true;
109
+	}
110
+
111
+
112
+	/**
113
+	 * @return EE_Form_Section_Proper
114
+	 * @throws DomainException
115
+	 * @throws EE_Error
116
+	 * @throws InvalidArgumentException
117
+	 * @throws ReflectionException
118
+	 * @throws EntityNotFoundException
119
+	 * @throws InvalidDataTypeException
120
+	 * @throws InvalidInterfaceException
121
+	 */
122
+	public function generate_reg_form()
123
+	{
124
+		$this->_print_copy_info = false;
125
+		$primary_registrant = null;
126
+		// autoload Line_Item_Display classes
127
+		EEH_Autoloader::register_line_item_display_autoloaders();
128
+		$Line_Item_Display = new EE_Line_Item_Display();
129
+		// calculate taxes
130
+		$Line_Item_Display->display_line_item(
131
+			$this->checkout->cart->get_grand_total(),
132
+			array('set_tax_rate' => true)
133
+		);
134
+		/** @var $subsections EE_Form_Section_Proper[] */
135
+		$extra_inputs_section = $this->reg_step_hidden_inputs();
136
+		$subsections = array(
137
+			'default_hidden_inputs' => $extra_inputs_section,
138
+		);
139
+
140
+		/**
141
+		 * @var $reg_config EE_Registration_Config
142
+		 */
143
+		$reg_config = LoaderFactory::getLoader()->getShared('EE_Registration_Config');
144
+		// if this isn't a revisit, and they have the privacy consent box enalbed, add it
145
+		if (! $this->checkout->revisit && $reg_config->isConsentCheckboxEnabled()) {
146
+			$extra_inputs_section->add_subsections(
147
+				array(
148
+					'consent_box' => new EE_Form_Section_Proper(
149
+						array(
150
+							'layout_strategy' =>
151
+								new EE_Template_Layout(
152
+									array(
153
+										'input_template_file' => SPCO_REG_STEPS_PATH . $this->_slug . '/privacy_consent.template.php',
154
+									)
155
+								),
156
+							'subsections'     => array(
157
+								'consent' => new EE_Checkbox_Multi_Input(
158
+									array(
159
+										'consent' => $reg_config->getConsentCheckboxLabelText(),
160
+									),
161
+									array(
162
+										'required'                          => true,
163
+										'required_validation_error_message' => esc_html__(
164
+											'You must consent to these terms in order to register.',
165
+											'event_espresso'
166
+										),
167
+										'html_label_text'                   => '',
168
+									)
169
+								),
170
+							),
171
+						)
172
+					),
173
+				),
174
+				null,
175
+				false
176
+			);
177
+		}
178
+		$template_args = array(
179
+			'revisit'       => $this->checkout->revisit,
180
+			'registrations' => array(),
181
+			'ticket_count'  => array(),
182
+		);
183
+		// grab the saved registrations from the transaction
184
+		$registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
185
+		if ($registrations) {
186
+			foreach ($registrations as $registration) {
187
+				// can this registration be processed during this visit ?
188
+				if ($registration instanceof EE_Registration
189
+					&& $this->checkout->visit_allows_processing_of_this_registration($registration)
190
+				) {
191
+					$subsections[ $registration->reg_url_link() ] = $this->_registrations_reg_form($registration);
192
+					if (! $this->checkout->admin_request) {
193
+						$template_args['registrations'][ $registration->reg_url_link() ] = $registration;
194
+						$template_args['ticket_count'][ $registration->ticket()->ID() ] = isset(
195
+							$template_args['ticket_count'][ $registration->ticket()->ID() ]
196
+						)
197
+							? $template_args['ticket_count'][ $registration->ticket()->ID() ] + 1
198
+							: 1;
199
+						$ticket_line_item = EEH_Line_Item::get_line_items_by_object_type_and_IDs(
200
+							$this->checkout->cart->get_grand_total(),
201
+							'Ticket',
202
+							array($registration->ticket()->ID())
203
+						);
204
+						$ticket_line_item = is_array($ticket_line_item)
205
+							? reset($ticket_line_item)
206
+							: $ticket_line_item;
207
+						$template_args['ticket_line_item'][ $registration->ticket()->ID() ] =
208
+							$Line_Item_Display->display_line_item($ticket_line_item);
209
+					}
210
+					if ($registration->is_primary_registrant()) {
211
+						$primary_registrant = $registration->reg_url_link();
212
+					}
213
+				}
214
+			}
215
+			// print_copy_info ?
216
+			if ($primary_registrant && ! $this->checkout->admin_request && count($registrations) > 1) {
217
+				// TODO: add admin option for toggling copy attendee info,
218
+				// then use that value to change $this->_print_copy_info
219
+				$copy_options['spco_copy_attendee_chk'] = $this->_print_copy_info
220
+					? $this->_copy_attendee_info_form()
221
+					: $this->_auto_copy_attendee_info();
222
+				// generate hidden input
223
+				if (isset($subsections[ $primary_registrant ])
224
+					&& $subsections[ $primary_registrant ] instanceof EE_Form_Section_Proper
225
+				) {
226
+					$subsections[ $primary_registrant ]->add_subsections(
227
+						$copy_options,
228
+						'primary_registrant',
229
+						false
230
+					);
231
+				}
232
+			}
233
+		}
234
+		return new EE_Form_Section_Proper(
235
+			array(
236
+				'name'            => $this->reg_form_name(),
237
+				'html_id'         => $this->reg_form_name(),
238
+				'subsections'     => $subsections,
239
+				'layout_strategy' => $this->checkout->admin_request
240
+					?
241
+					new EE_Div_Per_Section_Layout()
242
+					:
243
+					new EE_Template_Layout(
244
+						array(
245
+							'layout_template_file' => $this->_template, // layout_template
246
+							'template_args'        => $template_args,
247
+						)
248
+					),
249
+			)
250
+		);
251
+	}
252
+
253
+
254
+	/**
255
+	 * @param EE_Registration $registration
256
+	 * @return EE_Form_Section_Base
257
+	 * @throws EE_Error
258
+	 * @throws InvalidArgumentException
259
+	 * @throws EntityNotFoundException
260
+	 * @throws InvalidDataTypeException
261
+	 * @throws InvalidInterfaceException
262
+	 * @throws ReflectionException
263
+	 */
264
+	private function _registrations_reg_form(EE_Registration $registration)
265
+	{
266
+		static $attendee_nmbr = 1;
267
+		$form_args = array();
268
+		// verify that registration has valid event
269
+		if ($registration->event() instanceof EE_Event) {
270
+			$field_name = 'Event_Question_Group.'
271
+				. EEM_Event_Question_Group::instance()->fieldNameForContext(
272
+					$registration->is_primary_registrant()
273
+				);
274
+			$question_groups = $registration->event()->question_groups(
275
+				apply_filters(
276
+					// @codingStandardsIgnoreStart
277
+					'FHEE__EE_SPCO_Reg_Step_Attendee_Information___registrations_reg_form__question_groups_query_parameters',
278
+					// @codingStandardsIgnoreEnd
279
+					[
280
+						[
281
+							'Event.EVT_ID'                     => $registration->event()->ID(),
282
+							$field_name => true,
283
+						],
284
+						'order_by' => ['QSG_order' => 'ASC'],
285
+					],
286
+					$registration,
287
+					$this
288
+				)
289
+			);
290
+			if ($question_groups) {
291
+				// array of params to pass to parent constructor
292
+				$form_args = array(
293
+					'html_id'         => 'ee-registration-' . $registration->reg_url_link(),
294
+					'html_class'      => 'ee-reg-form-attendee-dv',
295
+					'html_style'      => $this->checkout->admin_request
296
+						? 'padding:0em 2em 1em; margin:3em 0 0; border:1px solid #ddd;'
297
+						: '',
298
+					'subsections'     => array(),
299
+					'layout_strategy' => new EE_Fieldset_Section_Layout(
300
+						array(
301
+							'legend_class' => 'spco-attendee-lgnd smaller-text lt-grey-text',
302
+							'legend_text'  => sprintf(
303
+								esc_html_x(
304
+									'Attendee %d',
305
+									'Attendee 123',
306
+									'event_espresso'
307
+								),
308
+								$attendee_nmbr
309
+							),
310
+						)
311
+					),
312
+				);
313
+				foreach ($question_groups as $question_group) {
314
+					if ($question_group instanceof EE_Question_Group) {
315
+						$form_args['subsections'][ $question_group->identifier() ] = $this->_question_group_reg_form(
316
+							$registration,
317
+							$question_group
318
+						);
319
+					}
320
+				}
321
+				// add hidden input
322
+				$form_args['subsections']['additional_attendee_reg_info'] = $this->_additional_attendee_reg_info_input(
323
+					$registration
324
+				);
325
+				// if we have question groups for additional attendees, then display the copy options
326
+				$this->_print_copy_info = $attendee_nmbr > 1 ? true : $this->_print_copy_info;
327
+				if ($registration->is_primary_registrant()) {
328
+					// generate hidden input
329
+					$form_args['subsections']['primary_registrant'] = $this->_additional_primary_registrant_inputs(
330
+						$registration
331
+					);
332
+				}
333
+			}
334
+		}
335
+		$attendee_nmbr++;
336
+		return ! empty($form_args)
337
+			? new EE_Form_Section_Proper($form_args)
338
+			: new EE_Form_Section_HTML();
339
+	}
340
+
341
+
342
+	/**
343
+	 * @param EE_Registration $registration
344
+	 * @param bool            $additional_attendee_reg_info
345
+	 * @return EE_Form_Input_Base
346
+	 * @throws EE_Error
347
+	 */
348
+	private function _additional_attendee_reg_info_input(
349
+		EE_Registration $registration,
350
+		$additional_attendee_reg_info = true
351
+	) {
352
+		// generate hidden input
353
+		return new EE_Hidden_Input(
354
+			array(
355
+				'html_id' => 'additional-attendee-reg-info-' . $registration->reg_url_link(),
356
+				'default' => $additional_attendee_reg_info,
357
+			)
358
+		);
359
+	}
360
+
361
+
362
+	/**
363
+	 * @param EE_Registration   $registration
364
+	 * @param EE_Question_Group $question_group
365
+	 * @return EE_Form_Section_Proper
366
+	 * @throws EE_Error
367
+	 * @throws InvalidArgumentException
368
+	 * @throws InvalidDataTypeException
369
+	 * @throws InvalidInterfaceException
370
+	 * @throws ReflectionException
371
+	 */
372
+	private function _question_group_reg_form(EE_Registration $registration, EE_Question_Group $question_group)
373
+	{
374
+		// array of params to pass to parent constructor
375
+		$form_args = array(
376
+			'html_id'         => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-' . $registration->ID(),
377
+			'html_class'      => $this->checkout->admin_request
378
+				? 'form-table ee-reg-form-qstn-grp-dv'
379
+				: 'ee-reg-form-qstn-grp-dv',
380
+			'html_label_id'   => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-'
381
+								 . $registration->ID() . '-lbl',
382
+			'subsections'     => array(
383
+				'reg_form_qstn_grp_hdr' => $this->_question_group_header($question_group),
384
+			),
385
+			'layout_strategy' => $this->checkout->admin_request
386
+				? new EE_Admin_Two_Column_Layout()
387
+				: new EE_Div_Per_Section_Layout(),
388
+		);
389
+		// where params
390
+		$query_params = array('QST_deleted' => 0);
391
+		// don't load admin only questions on the frontend
392
+		if (! $this->checkout->admin_request) {
393
+			$query_params['QST_admin_only'] = array('!=', true);
394
+		}
395
+		$questions = $question_group->get_many_related(
396
+			'Question',
397
+			apply_filters(
398
+				'FHEE__EE_SPCO_Reg_Step_Attendee_Information___question_group_reg_form__related_questions_query_params',
399
+				array(
400
+					$query_params,
401
+					'order_by' => array(
402
+						'Question_Group_Question.QGQ_order' => 'ASC',
403
+					),
404
+				),
405
+				$question_group,
406
+				$registration,
407
+				$this
408
+			)
409
+		);
410
+		// filter for additional content before questions
411
+		$form_args['subsections']['reg_form_questions_before'] = new EE_Form_Section_HTML(
412
+			apply_filters(
413
+				'FHEE__EEH_Form_Fields__generate_question_groups_html__before_question_group_questions',
414
+				'',
415
+				$registration,
416
+				$question_group,
417
+				$this
418
+			)
419
+		);
420
+		// loop thru questions
421
+		foreach ($questions as $question) {
422
+			if ($question instanceof EE_Question) {
423
+				$identifier = $question->is_system_question()
424
+					? $question->system_ID()
425
+					: $question->ID();
426
+				$form_args['subsections'][ $identifier ] = $this->reg_form_question($registration, $question);
427
+			}
428
+		}
429
+		$form_args['subsections'] = apply_filters(
430
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information__question_group_reg_form__subsections_array',
431
+			$form_args['subsections'],
432
+			$registration,
433
+			$question_group,
434
+			$this
435
+		);
436
+		// filter for additional content after questions
437
+		$form_args['subsections']['reg_form_questions_after'] = new EE_Form_Section_HTML(
438
+			apply_filters(
439
+				'FHEE__EEH_Form_Fields__generate_question_groups_html__after_question_group_questions',
440
+				'',
441
+				$registration,
442
+				$question_group,
443
+				$this
444
+			)
445
+		);
446
+		// d($form_args);
447
+		$question_group_reg_form = new EE_Form_Section_Proper($form_args);
448
+		return apply_filters(
449
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information___question_group_reg_form__question_group_reg_form',
450
+			$question_group_reg_form,
451
+			$registration,
452
+			$question_group,
453
+			$this
454
+		);
455
+	}
456
+
457
+
458
+	/**
459
+	 * @param EE_Question_Group $question_group
460
+	 * @return    EE_Form_Section_HTML
461
+	 */
462
+	private function _question_group_header(EE_Question_Group $question_group)
463
+	{
464
+		$html = '';
465
+		// group_name
466
+		if ($question_group->show_group_name() && $question_group->name() !== '') {
467
+			if ($this->checkout->admin_request) {
468
+				$html .= EEH_HTML::br();
469
+				$html .= EEH_HTML::h3(
470
+					$question_group->name(),
471
+					'',
472
+					'ee-reg-form-qstn-grp-title title',
473
+					'font-size: 1.3em; padding-left:0;'
474
+				);
475
+			} else {
476
+				$html .= EEH_HTML::h4(
477
+					$question_group->name(),
478
+					'',
479
+					'ee-reg-form-qstn-grp-title section-title'
480
+				);
481
+			}
482
+		}
483
+		// group_desc
484
+		if ($question_group->show_group_desc() && $question_group->desc() !== '') {
485
+			$html .= EEH_HTML::p(
486
+				$question_group->desc(),
487
+				'',
488
+				$this->checkout->admin_request
489
+					? 'ee-reg-form-qstn-grp-desc-pg'
490
+					: 'ee-reg-form-qstn-grp-desc-pg small-text lt-grey-text'
491
+			);
492
+		}
493
+		return new EE_Form_Section_HTML($html);
494
+	}
495
+
496
+
497
+	/**
498
+	 * @return    EE_Form_Section_Proper
499
+	 * @throws EE_Error
500
+	 * @throws InvalidArgumentException
501
+	 * @throws ReflectionException
502
+	 * @throws InvalidDataTypeException
503
+	 * @throws InvalidInterfaceException
504
+	 */
505
+	private function _copy_attendee_info_form()
506
+	{
507
+		// array of params to pass to parent constructor
508
+		return new EE_Form_Section_Proper(
509
+			array(
510
+				'subsections'     => $this->_copy_attendee_info_inputs(),
511
+				'layout_strategy' => new EE_Template_Layout(
512
+					array(
513
+						'layout_template_file'     => SPCO_REG_STEPS_PATH
514
+													  . $this->_slug
515
+													  . '/copy_attendee_info.template.php',
516
+						'begin_template_file'      => null,
517
+						'input_template_file'      => null,
518
+						'subsection_template_file' => null,
519
+						'end_template_file'        => null,
520
+					)
521
+				),
522
+			)
523
+		);
524
+	}
525
+
526
+
527
+	/**
528
+	 * @return EE_Form_Section_HTML
529
+	 * @throws DomainException
530
+	 * @throws InvalidArgumentException
531
+	 * @throws InvalidDataTypeException
532
+	 * @throws InvalidInterfaceException
533
+	 */
534
+	private function _auto_copy_attendee_info()
535
+	{
536
+		return new EE_Form_Section_HTML(
537
+			EEH_Template::locate_template(
538
+				SPCO_REG_STEPS_PATH . $this->_slug . '/_auto_copy_attendee_info.template.php',
539
+				apply_filters(
540
+					'FHEE__EE_SPCO_Reg_Step_Attendee_Information__auto_copy_attendee_info__template_args',
541
+					array()
542
+				),
543
+				true,
544
+				true
545
+			)
546
+		);
547
+	}
548
+
549
+
550
+	/**
551
+	 * @return array
552
+	 * @throws EE_Error
553
+	 * @throws InvalidArgumentException
554
+	 * @throws ReflectionException
555
+	 * @throws InvalidDataTypeException
556
+	 * @throws InvalidInterfaceException
557
+	 */
558
+	private function _copy_attendee_info_inputs()
559
+	{
560
+		$copy_attendee_info_inputs = array();
561
+		$prev_ticket = null;
562
+		// grab the saved registrations from the transaction
563
+		$registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
564
+		foreach ($registrations as $registration) {
565
+			// for all  attendees other than the primary attendee
566
+			if ($registration instanceof EE_Registration && ! $registration->is_primary_registrant()) {
567
+				// if this is a new ticket OR if this is the very first additional attendee after the primary attendee
568
+				if ($registration->ticket()->ID() !== $prev_ticket) {
569
+					$item_name = $registration->ticket()->name();
570
+					$item_name .= $registration->ticket()->description() !== ''
571
+						? ' - ' . $registration->ticket()->description()
572
+						: '';
573
+					$copy_attendee_info_inputs[ 'spco_copy_attendee_chk[ticket-' . $registration->ticket()->ID(
574
+					) . ']' ] =
575
+						new EE_Form_Section_HTML(
576
+							'<h6 class="spco-copy-attendee-event-hdr">' . $item_name . '</h6>'
577
+						);
578
+					$prev_ticket = $registration->ticket()->ID();
579
+				}
580
+
581
+				$copy_attendee_info_inputs[ 'spco_copy_attendee_chk[' . $registration->ID() . ']' ] =
582
+					new EE_Checkbox_Multi_Input(
583
+						array(
584
+							$registration->ID() => sprintf(
585
+								esc_html_x('Attendee #%s', 'Attendee #123', 'event_espresso'),
586
+								$registration->count()
587
+							),
588
+						),
589
+						array(
590
+							'html_id'                 => 'spco-copy-attendee-chk-' . $registration->reg_url_link(),
591
+							'html_class'              => 'spco-copy-attendee-chk ee-do-not-validate',
592
+							'display_html_label_text' => false,
593
+						)
594
+					);
595
+			}
596
+		}
597
+		return $copy_attendee_info_inputs;
598
+	}
599
+
600
+
601
+	/**
602
+	 * @param EE_Registration $registration
603
+	 * @return    EE_Form_Input_Base
604
+	 * @throws EE_Error
605
+	 */
606
+	private function _additional_primary_registrant_inputs(EE_Registration $registration)
607
+	{
608
+		// generate hidden input
609
+		return new EE_Hidden_Input(
610
+			array(
611
+				'html_id' => 'primary_registrant',
612
+				'default' => $registration->reg_url_link(),
613
+			)
614
+		);
615
+	}
616
+
617
+
618
+	/**
619
+	 * @param EE_Registration $registration
620
+	 * @param EE_Question     $question
621
+	 * @return EE_Form_Input_Base
622
+	 * @throws EE_Error
623
+	 * @throws InvalidArgumentException
624
+	 * @throws InvalidDataTypeException
625
+	 * @throws InvalidInterfaceException
626
+	 * @throws ReflectionException
627
+	 */
628
+	public function reg_form_question(EE_Registration $registration, EE_Question $question)
629
+	{
630
+
631
+		// if this question was for an attendee detail, then check for that answer
632
+		$answer_value = EEM_Answer::instance()->get_attendee_property_answer_value(
633
+			$registration,
634
+			$question->system_ID()
635
+		);
636
+		$answer = $answer_value === null
637
+			? EEM_Answer::instance()->get_one(
638
+				array(array('QST_ID' => $question->ID(), 'REG_ID' => $registration->ID()))
639
+			)
640
+			: null;
641
+		// if NOT returning to edit an existing registration
642
+		// OR if this question is for an attendee property
643
+		// OR we still don't have an EE_Answer object
644
+		if ($answer_value || ! $answer instanceof EE_Answer || ! $registration->reg_url_link()) {
645
+			// create an EE_Answer object for storing everything in
646
+			$answer = EE_Answer::new_instance(
647
+				array(
648
+					'QST_ID' => $question->ID(),
649
+					'REG_ID' => $registration->ID(),
650
+				)
651
+			);
652
+		}
653
+		// verify instance
654
+		if ($answer instanceof EE_Answer) {
655
+			if (! empty($answer_value)) {
656
+				$answer->set('ANS_value', $answer_value);
657
+			}
658
+			$answer->cache('Question', $question);
659
+			// remember system ID had a bug where sometimes it could be null
660
+			$answer_cache_id = $question->is_system_question()
661
+				? $question->system_ID() . '-' . $registration->reg_url_link()
662
+				: $question->ID() . '-' . $registration->reg_url_link();
663
+			$registration->cache('Answer', $answer, $answer_cache_id);
664
+		}
665
+		return $this->_generate_question_input($registration, $question, $answer);
666
+	}
667
+
668
+
669
+	/**
670
+	 * @param EE_Registration $registration
671
+	 * @param EE_Question     $question
672
+	 * @param                 $answer
673
+	 * @return EE_Form_Input_Base
674
+	 * @throws EE_Error
675
+	 * @throws InvalidArgumentException
676
+	 * @throws ReflectionException
677
+	 * @throws InvalidDataTypeException
678
+	 * @throws InvalidInterfaceException
679
+	 */
680
+	private function _generate_question_input(EE_Registration $registration, EE_Question $question, $answer)
681
+	{
682
+		$identifier = $question->is_system_question()
683
+			? $question->system_ID()
684
+			: $question->ID();
685
+		$this->_required_questions[ $identifier ] = $question->required() ? true : false;
686
+		add_filter(
687
+			'FHEE__EE_Question__generate_form_input__country_options',
688
+			array($this, 'use_cached_countries_for_form_input'),
689
+			10,
690
+			4
691
+		);
692
+		add_filter(
693
+			'FHEE__EE_Question__generate_form_input__state_options',
694
+			array($this, 'use_cached_states_for_form_input'),
695
+			10,
696
+			4
697
+		);
698
+		$input_constructor_args = array(
699
+			'html_name'        => 'ee_reg_qstn[' . $registration->ID() . '][' . $identifier . ']',
700
+			'html_id'          => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
701
+			'html_class'       => 'ee-reg-qstn ee-reg-qstn-' . $identifier,
702
+			'html_label_id'    => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
703
+			'html_label_class' => 'ee-reg-qstn',
704
+		);
705
+		$input_constructor_args['html_label_id'] .= '-lbl';
706
+		if ($answer instanceof EE_Answer && $answer->ID()) {
707
+			$input_constructor_args['html_name'] .= '[' . $answer->ID() . ']';
708
+			$input_constructor_args['html_id'] .= '-' . $answer->ID();
709
+			$input_constructor_args['html_label_id'] .= '-' . $answer->ID();
710
+		}
711
+		$form_input = $question->generate_form_input(
712
+			$registration,
713
+			$answer,
714
+			$input_constructor_args
715
+		);
716
+		remove_filter(
717
+			'FHEE__EE_Question__generate_form_input__country_options',
718
+			array($this, 'use_cached_countries_for_form_input')
719
+		);
720
+		remove_filter(
721
+			'FHEE__EE_Question__generate_form_input__state_options',
722
+			array($this, 'use_cached_states_for_form_input')
723
+		);
724
+		return $form_input;
725
+	}
726
+
727
+
728
+	/**
729
+	 * Gets the list of countries for the form input
730
+	 *
731
+	 * @param array|null      $countries_list
732
+	 * @param EE_Question     $question
733
+	 * @param EE_Registration $registration
734
+	 * @param EE_Answer       $answer
735
+	 * @return array 2d keys are country IDs, values are their names
736
+	 * @throws EE_Error
737
+	 * @throws InvalidArgumentException
738
+	 * @throws InvalidDataTypeException
739
+	 * @throws InvalidInterfaceException
740
+	 * @throws ReflectionException
741
+	 */
742
+	public function use_cached_countries_for_form_input(
743
+		$countries_list,
744
+		EE_Question $question = null,
745
+		EE_Registration $registration = null,
746
+		EE_Answer $answer = null
747
+	) {
748
+		$country_options = array('' => '');
749
+		// get possibly cached list of countries
750
+		$countries = $this->checkout->action === 'process_reg_step'
751
+			? EEM_Country::instance()->get_all_countries()
752
+			: EEM_Country::instance()->get_all_active_countries();
753
+		if (! empty($countries)) {
754
+			foreach ($countries as $country) {
755
+				if ($country instanceof EE_Country) {
756
+					$country_options[ $country->ID() ] = $country->name();
757
+				}
758
+			}
759
+		}
760
+		if ($question instanceof EE_Question && $registration instanceof EE_Registration) {
761
+			$answer = EEM_Answer::instance()->get_one(
762
+				array(array('QST_ID' => $question->ID(), 'REG_ID' => $registration->ID()))
763
+			);
764
+		} else {
765
+			$answer = EE_Answer::new_instance();
766
+		}
767
+		$country_options = apply_filters(
768
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__country_options',
769
+			$country_options,
770
+			$this,
771
+			$registration,
772
+			$question,
773
+			$answer
774
+		);
775
+		return $country_options;
776
+	}
777
+
778
+
779
+	/**
780
+	 * Gets the list of states for the form input
781
+	 *
782
+	 * @param array|null      $states_list
783
+	 * @param EE_Question     $question
784
+	 * @param EE_Registration $registration
785
+	 * @param EE_Answer       $answer
786
+	 * @return array 2d keys are state IDs, values are their names
787
+	 * @throws EE_Error
788
+	 * @throws InvalidArgumentException
789
+	 * @throws InvalidDataTypeException
790
+	 * @throws InvalidInterfaceException
791
+	 * @throws ReflectionException
792
+	 */
793
+	public function use_cached_states_for_form_input(
794
+		$states_list,
795
+		EE_Question $question = null,
796
+		EE_Registration $registration = null,
797
+		EE_Answer $answer = null
798
+	) {
799
+		$state_options = array('' => array('' => ''));
800
+		$states = $this->checkout->action === 'process_reg_step'
801
+			? EEM_State::instance()->get_all_states()
802
+			: EEM_State::instance()->get_all_active_states();
803
+		if (! empty($states)) {
804
+			foreach ($states as $state) {
805
+				if ($state instanceof EE_State) {
806
+					$state_options[ $state->country()->name() ][ $state->ID() ] = $state->name();
807
+				}
808
+			}
809
+		}
810
+		$state_options = apply_filters(
811
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information___generate_question_input__state_options',
812
+			$state_options,
813
+			$this,
814
+			$registration,
815
+			$question,
816
+			$answer
817
+		);
818
+		return $state_options;
819
+	}
820
+
821
+
822
+	/********************************************************************************************************/
823
+	/****************************************  PROCESS REG STEP  ****************************************/
824
+	/********************************************************************************************************/
825
+
826
+
827
+	/**
828
+	 * @return bool
829
+	 * @throws EE_Error
830
+	 * @throws InvalidArgumentException
831
+	 * @throws ReflectionException
832
+	 * @throws RuntimeException
833
+	 * @throws InvalidDataTypeException
834
+	 * @throws InvalidInterfaceException
835
+	 */
836
+	public function process_reg_step()
837
+	{
838
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
839
+		// grab validated data from form
840
+		$valid_data = $this->checkout->current_step->valid_data();
841
+		// EEH_Debug_Tools::printr( $_REQUEST, '$_REQUEST', __FILE__, __LINE__ );
842
+		// EEH_Debug_Tools::printr( $valid_data, '$valid_data', __FILE__, __LINE__ );
843
+		// if we don't have any $valid_data then something went TERRIBLY WRONG !!!
844
+		if (empty($valid_data)) {
845
+			EE_Error::add_error(
846
+				esc_html__('No valid question responses were received.', 'event_espresso'),
847
+				__FILE__,
848
+				__FUNCTION__,
849
+				__LINE__
850
+			);
851
+			return false;
852
+		}
853
+		if (! $this->checkout->transaction instanceof EE_Transaction || ! $this->checkout->continue_reg) {
854
+			EE_Error::add_error(
855
+				esc_html__(
856
+					'A valid transaction could not be initiated for processing your registrations.',
857
+					'event_espresso'
858
+				),
859
+				__FILE__,
860
+				__FUNCTION__,
861
+				__LINE__
862
+			);
863
+			return false;
864
+		}
865
+		// get cached registrations
866
+		$registrations = $this->checkout->transaction->registrations($this->checkout->reg_cache_where_params);
867
+		// verify we got the goods
868
+		if (empty($registrations)) {
869
+			// combine the old translated string with a new one, in order to not break translations
870
+			$error_message = esc_html__(
871
+				'Your form data could not be applied to any valid registrations.',
872
+				'event_espresso'
873
+			)
874
+			. sprintf(
875
+				esc_html_x(
876
+					'%3$sThis can sometimes happen if too much time has been taken to complete the registration process.%3$sPlease return to the %1$sEvent List%2$s and reselect your tickets. If the problem continues, please contact the site administrator.',
877
+					'(line break)This can sometimes happen if too much time has been taken to complete the registration process.(line break)Please return to the (link)Event List(end link) and reselect your tickets. If the problem continues, please contact the site administrator.',
878
+					'event_espresso'
879
+				),
880
+				'<a href="' . get_post_type_archive_link('espresso_events') . '" >',
881
+				'</a>',
882
+				'<br />'
883
+			);
884
+			EE_Error::add_error(
885
+				$error_message,
886
+				__FILE__,
887
+				__FUNCTION__,
888
+				__LINE__
889
+			);
890
+			return false;
891
+		}
892
+		// extract attendee info from form data and save to model objects
893
+		$registrations_processed = $this->_process_registrations($registrations, $valid_data);
894
+		// if first pass thru SPCO,
895
+		// then let's check processed registrations against the total number of tickets in the cart
896
+		if ($registrations_processed === false) {
897
+			// but return immediately if the previous step exited early due to errors
898
+			return false;
899
+		}
900
+		if (! $this->checkout->revisit && $registrations_processed !== $this->checkout->total_ticket_count) {
901
+			// generate a correctly translated string for all possible singular/plural combinations
902
+			if ($this->checkout->total_ticket_count === 1 && $registrations_processed !== 1) {
903
+				$error_msg = sprintf(
904
+					esc_html_x(
905
+						'There was %1$d ticket in the Event Queue, but %2$ds registrations were processed',
906
+						'There was 1 ticket in the Event Queue, but 2 registrations were processed',
907
+						'event_espresso'
908
+					),
909
+					$this->checkout->total_ticket_count,
910
+					$registrations_processed
911
+				);
912
+			} elseif ($this->checkout->total_ticket_count !== 1 && $registrations_processed === 1) {
913
+				$error_msg = sprintf(
914
+					esc_html_x(
915
+						'There was a total of %1$d tickets in the Event Queue, but only %2$ds registration was processed',
916
+						'There was a total of 2 tickets in the Event Queue, but only 1 registration was processed',
917
+						'event_espresso'
918
+					),
919
+					$this->checkout->total_ticket_count,
920
+					$registrations_processed
921
+				);
922
+			} else {
923
+				$error_msg = sprintf(
924
+					esc_html__(
925
+						'There was a total of 2 tickets in the Event Queue, but 2 registrations were processed',
926
+						'event_espresso'
927
+					),
928
+					$this->checkout->total_ticket_count,
929
+					$registrations_processed
930
+				);
931
+			}
932
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
933
+			return false;
934
+		}
935
+		// mark this reg step as completed
936
+		$this->set_completed();
937
+		$this->_set_success_message(
938
+			esc_html__('The Attendee Information Step has been successfully completed.', 'event_espresso')
939
+		);
940
+		// do action in case a plugin wants to do something with the data submitted in step 1.
941
+		// passes EE_Single_Page_Checkout, and it's posted data
942
+		do_action('AHEE__EE_Single_Page_Checkout__process_attendee_information__end', $this, $valid_data);
943
+		return true;
944
+	}
945
+
946
+
947
+	/**
948
+	 *    _process_registrations
949
+	 *
950
+	 * @param EE_Registration[] $registrations
951
+	 * @param array[][]         $valid_data
952
+	 * @return bool|int
953
+	 * @throws EntityNotFoundException
954
+	 * @throws EE_Error
955
+	 * @throws InvalidArgumentException
956
+	 * @throws ReflectionException
957
+	 * @throws RuntimeException
958
+	 * @throws InvalidDataTypeException
959
+	 * @throws InvalidInterfaceException
960
+	 */
961
+	private function _process_registrations($registrations = array(), $valid_data = array())
962
+	{
963
+		// load resources and set some defaults
964
+		EE_Registry::instance()->load_model('Attendee');
965
+		// holder for primary registrant attendee object
966
+		$this->checkout->primary_attendee_obj = null;
967
+		// array for tracking reg form data for the primary registrant
968
+		$primary_registrant = array(
969
+			'line_item_id' => null,
970
+		);
971
+		$copy_primary = false;
972
+		// reg form sections that do not contain inputs
973
+		$non_input_form_sections = array(
974
+			'primary_registrant',
975
+			'additional_attendee_reg_info',
976
+			'spco_copy_attendee_chk',
977
+		);
978
+		// attendee counter
979
+		$att_nmbr = 0;
980
+		// grab the saved registrations from the transaction
981
+		foreach ($registrations as $registration) {
982
+			// verify EE_Registration object
983
+			if (! $registration instanceof EE_Registration) {
984
+				EE_Error::add_error(
985
+					esc_html__(
986
+						'An invalid Registration object was discovered when attempting to process your registration information.',
987
+						'event_espresso'
988
+					),
989
+					__FILE__,
990
+					__FUNCTION__,
991
+					__LINE__
992
+				);
993
+				return false;
994
+			}
995
+			/** @var string $reg_url_link */
996
+			$reg_url_link = $registration->reg_url_link();
997
+			// reg_url_link exists ?
998
+			if (! empty($reg_url_link)) {
999
+				// should this registration be processed during this visit ?
1000
+				if ($this->checkout->visit_allows_processing_of_this_registration($registration)) {
1001
+					// if NOT revisiting, then let's save the registration now,
1002
+					// so that we have a REG_ID to use when generating other objects
1003
+					if (! $this->checkout->revisit) {
1004
+						$registration->save();
1005
+					}
1006
+					/**
1007
+					 * This allows plugins to trigger a fail on processing of a
1008
+					 * registration for any conditions they may have for it to pass.
1009
+					 *
1010
+					 * @var bool   if true is returned by the plugin then the
1011
+					 *            registration processing is halted.
1012
+					 */
1013
+					if (apply_filters(
1014
+						'FHEE__EE_SPCO_Reg_Step_Attendee_Information___process_registrations__pre_registration_process',
1015
+						false,
1016
+						$att_nmbr,
1017
+						$registration,
1018
+						$registrations,
1019
+						$valid_data,
1020
+						$this
1021
+					)) {
1022
+						return false;
1023
+					}
1024
+
1025
+					// Houston, we have a registration!
1026
+					$att_nmbr++;
1027
+					$this->_attendee_data[ $reg_url_link ] = array();
1028
+					// grab any existing related answer objects
1029
+					$this->_registration_answers = $registration->answers();
1030
+					// unset( $valid_data[ $reg_url_link ]['additional_attendee_reg_info'] );
1031
+					if (isset($valid_data[ $reg_url_link ])) {
1032
+						// do we need to copy basic info from primary attendee ?
1033
+						$copy_primary = isset($valid_data[ $reg_url_link ]['additional_attendee_reg_info'])
1034
+										&& absint($valid_data[ $reg_url_link ]['additional_attendee_reg_info']) === 0;
1035
+						// filter form input data for this registration
1036
+						$valid_data[ $reg_url_link ] = (array) apply_filters(
1037
+							'FHEE__EE_Single_Page_Checkout__process_attendee_information__valid_data_line_item',
1038
+							$valid_data[ $reg_url_link ]
1039
+						);
1040
+						if (isset($valid_data['primary_attendee'])) {
1041
+							$primary_registrant['line_item_id'] = ! empty($valid_data['primary_attendee'])
1042
+								? $valid_data['primary_attendee']
1043
+								: false;
1044
+							unset($valid_data['primary_attendee']);
1045
+						}
1046
+						// now loop through our array of valid post data && process attendee reg forms
1047
+						foreach ($valid_data[ $reg_url_link ] as $form_section => $form_inputs) {
1048
+							if (! in_array($form_section, $non_input_form_sections, true)) {
1049
+								foreach ($form_inputs as $form_input => $input_value) {
1050
+									// \EEH_Debug_Tools::printr( $input_value, $form_input, __FILE__, __LINE__ );
1051
+									// check for critical inputs
1052
+									if (! $this->_verify_critical_attendee_details_are_set_and_validate_email(
1053
+										$form_input,
1054
+										$input_value
1055
+									)
1056
+									) {
1057
+										return false;
1058
+									}
1059
+									// store a bit of data about the primary attendee
1060
+									if ($att_nmbr === 1
1061
+										&& ! empty($input_value)
1062
+										&& $reg_url_link === $primary_registrant['line_item_id']
1063
+									) {
1064
+										$primary_registrant[ $form_input ] = $input_value;
1065
+									} elseif ($copy_primary
1066
+											  && $input_value === null
1067
+											  && isset($primary_registrant[ $form_input ])
1068
+									) {
1069
+										$input_value = $primary_registrant[ $form_input ];
1070
+									}
1071
+									// now attempt to save the input data
1072
+									if (! $this->_save_registration_form_input(
1073
+										$registration,
1074
+										$form_input,
1075
+										$input_value
1076
+									)
1077
+									) {
1078
+										EE_Error::add_error(
1079
+											sprintf(
1080
+												esc_html_x(
1081
+													'Unable to save registration form data for the form input: "%1$s" with the submitted value: "%2$s"',
1082
+													'Unable to save registration form data for the form input: "form input name" with the submitted value: "form input value"',
1083
+													'event_espresso'
1084
+												),
1085
+												$form_input,
1086
+												$input_value
1087
+											),
1088
+											__FILE__,
1089
+											__FUNCTION__,
1090
+											__LINE__
1091
+										);
1092
+										return false;
1093
+									}
1094
+								}
1095
+							}
1096
+						}  // end of foreach ( $valid_data[ $reg_url_link ] as $form_section => $form_inputs )
1097
+					}
1098
+					// EEH_Debug_Tools::printr( $this->_attendee_data, '$this->_attendee_data', __FILE__, __LINE__ );
1099
+					// this registration does not require additional attendee information ?
1100
+					if ($copy_primary
1101
+						&& $att_nmbr > 1
1102
+						&& $this->checkout->primary_attendee_obj instanceof EE_Attendee
1103
+					) {
1104
+						// just copy the primary registrant
1105
+						$attendee = $this->checkout->primary_attendee_obj;
1106
+					} else {
1107
+						// ensure critical details are set for additional attendees
1108
+						$this->_attendee_data[ $reg_url_link ] = $att_nmbr > 1
1109
+							? $this->_copy_critical_attendee_details_from_primary_registrant(
1110
+								$this->_attendee_data[ $reg_url_link ]
1111
+							)
1112
+							: $this->_attendee_data[ $reg_url_link ];
1113
+						// execute create attendee command (which may return an existing attendee)
1114
+						$attendee = EE_Registry::instance()->BUS->execute(
1115
+							new CreateAttendeeCommand(
1116
+								$this->_attendee_data[ $reg_url_link ],
1117
+								$registration
1118
+							)
1119
+						);
1120
+						// who's #1 ?
1121
+						if ($att_nmbr === 1) {
1122
+							$this->checkout->primary_attendee_obj = $attendee;
1123
+						}
1124
+					}
1125
+					// EEH_Debug_Tools::printr( $attendee, '$attendee', __FILE__, __LINE__ );
1126
+					// add relation to registration, set attendee ID, and cache attendee
1127
+					$this->_associate_attendee_with_registration($registration, $attendee);
1128
+					// \EEH_Debug_Tools::printr( $registration, '$registration', __FILE__, __LINE__ );
1129
+					if (! $registration->attendee() instanceof EE_Attendee) {
1130
+						EE_Error::add_error(
1131
+							sprintf(
1132
+								esc_html_x(
1133
+									'Registration %s has an invalid or missing Attendee object.',
1134
+									'Registration 123-456-789 has an invalid or missing Attendee object.',
1135
+									'event_espresso'
1136
+								),
1137
+								$reg_url_link
1138
+							),
1139
+							__FILE__,
1140
+							__FUNCTION__,
1141
+							__LINE__
1142
+						);
1143
+						return false;
1144
+					}
1145
+					/** @type EE_Registration_Processor $registration_processor */
1146
+					$registration_processor = EE_Registry::instance()->load_class('Registration_Processor');
1147
+					// at this point, we should have enough details about the registrant to consider the registration
1148
+					// NOT incomplete
1149
+					$registration_processor->toggle_incomplete_registration_status_to_default(
1150
+						$registration,
1151
+						false,
1152
+						new Context(
1153
+							'spco_reg_step_attendee_information_process_registrations',
1154
+							esc_html__(
1155
+								'Finished populating registration with details from the registration form after submitting the Attendee Information Reg Step.',
1156
+								'event_espresso'
1157
+							)
1158
+						)
1159
+					);
1160
+					// we can also consider the TXN to not have been failed, so temporarily upgrade it's status to
1161
+					// abandoned
1162
+					$this->checkout->transaction->toggle_failed_transaction_status();
1163
+					// if we've gotten this far, then let's save what we have
1164
+					$registration->save();
1165
+					// add relation between TXN and registration
1166
+					$this->_associate_registration_with_transaction($registration);
1167
+				}
1168
+			} else {
1169
+				EE_Error::add_error(
1170
+					esc_html__(
1171
+						'An invalid or missing line item ID was encountered while attempting to process the registration form.',
1172
+						'event_espresso'
1173
+					),
1174
+					__FILE__,
1175
+					__FUNCTION__,
1176
+					__LINE__
1177
+				);
1178
+				// remove malformed data
1179
+				unset($valid_data[ $reg_url_link ]);
1180
+				return false;
1181
+			}
1182
+		} // end of foreach ( $this->checkout->transaction->registrations()  as $registration )
1183
+		return $att_nmbr;
1184
+	}
1185
+
1186
+
1187
+	/**
1188
+	 *    _save_registration_form_input
1189
+	 *
1190
+	 * @param EE_Registration $registration
1191
+	 * @param string          $form_input
1192
+	 * @param string          $input_value
1193
+	 * @return bool
1194
+	 * @throws EE_Error
1195
+	 * @throws InvalidArgumentException
1196
+	 * @throws InvalidDataTypeException
1197
+	 * @throws InvalidInterfaceException
1198
+	 * @throws ReflectionException
1199
+	 */
1200
+	private function _save_registration_form_input(
1201
+		EE_Registration $registration,
1202
+		$form_input = '',
1203
+		$input_value = ''
1204
+	) {
1205
+		// \EEH_Debug_Tools::printr( __FUNCTION__, __CLASS__, __FILE__, __LINE__, 2 );
1206
+		// \EEH_Debug_Tools::printr( $form_input, '$form_input', __FILE__, __LINE__ );
1207
+		// \EEH_Debug_Tools::printr( $input_value, '$input_value', __FILE__, __LINE__ );
1208
+		// allow for plugins to hook in and do their own processing of the form input.
1209
+		// For plugins to bypass normal processing here, they just need to return a boolean value.
1210
+		if (apply_filters(
1211
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information___save_registration_form_input',
1212
+			false,
1213
+			$registration,
1214
+			$form_input,
1215
+			$input_value,
1216
+			$this
1217
+		)) {
1218
+			return true;
1219
+		}
1220
+		/*
1221 1221
          * $answer_cache_id is the key used to find the EE_Answer we want
1222 1222
          * @see https://events.codebasehq.com/projects/event-espresso/tickets/10477
1223 1223
          */
1224
-        $answer_cache_id = $this->checkout->reg_url_link
1225
-            ? $form_input . '-' . $registration->reg_url_link()
1226
-            : $form_input;
1227
-        $answer_is_obj = isset($this->_registration_answers[ $answer_cache_id ])
1228
-                         && $this->_registration_answers[ $answer_cache_id ] instanceof EE_Answer;
1229
-        // rename form_inputs if they are EE_Attendee properties
1230
-        switch ((string) $form_input) {
1231
-            case 'state':
1232
-            case 'STA_ID':
1233
-                $attendee_property = true;
1234
-                $form_input = 'STA_ID';
1235
-                break;
1236
-
1237
-            case 'country':
1238
-            case 'CNT_ISO':
1239
-                $attendee_property = true;
1240
-                $form_input = 'CNT_ISO';
1241
-                break;
1242
-
1243
-            default:
1244
-                $ATT_input = 'ATT_' . $form_input;
1245
-                // EEH_Debug_Tools::printr( $ATT_input, '$ATT_input', __FILE__, __LINE__ );
1246
-                $attendee_property = EEM_Attendee::instance()->has_field($ATT_input) ? true : false;
1247
-                $form_input = $attendee_property ? 'ATT_' . $form_input : $form_input;
1248
-        }
1249
-        // EEH_Debug_Tools::printr( $answer_cache_id, '$answer_cache_id', __FILE__, __LINE__ );
1250
-        // EEH_Debug_Tools::printr( $attendee_property, '$attendee_property', __FILE__, __LINE__ );
1251
-        // EEH_Debug_Tools::printr( $answer_is_obj, '$answer_is_obj', __FILE__, __LINE__ );
1252
-        // if this form input has a corresponding attendee property
1253
-        if ($attendee_property) {
1254
-            $this->_attendee_data[ $registration->reg_url_link() ][ $form_input ] = $input_value;
1255
-            if ($answer_is_obj) {
1256
-                // and delete the corresponding answer since we won't be storing this data in that object
1257
-                $registration->_remove_relation_to($this->_registration_answers[ $answer_cache_id ], 'Answer');
1258
-                $this->_registration_answers[ $answer_cache_id ]->delete_permanently();
1259
-            }
1260
-            return true;
1261
-        }
1262
-        if ($answer_is_obj) {
1263
-            // save this data to the answer object
1264
-            $this->_registration_answers[ $answer_cache_id ]->set_value($input_value);
1265
-            $result = $this->_registration_answers[ $answer_cache_id ]->save();
1266
-            return $result !== false;
1267
-        }
1268
-        foreach ($this->_registration_answers as $answer) {
1269
-            if ($answer instanceof EE_Answer && $answer->question_ID() === $answer_cache_id) {
1270
-                $answer->set_value($input_value);
1271
-                $result = $answer->save();
1272
-                return $result !== false;
1273
-            }
1274
-        }
1275
-        return false;
1276
-    }
1277
-
1278
-
1279
-    /**
1280
-     *    _verify_critical_attendee_details_are_set
1281
-     *
1282
-     * @param string $form_input
1283
-     * @param string $input_value
1284
-     * @return boolean
1285
-     */
1286
-    private function _verify_critical_attendee_details_are_set_and_validate_email(
1287
-        $form_input = '',
1288
-        $input_value = ''
1289
-    ) {
1290
-        if (empty($input_value)) {
1291
-            // if the form input isn't marked as being required, then just return
1292
-            if (! isset($this->_required_questions[ $form_input ]) || ! $this->_required_questions[ $form_input ]) {
1293
-                return true;
1294
-            }
1295
-            switch ($form_input) {
1296
-                case 'fname':
1297
-                    EE_Error::add_error(
1298
-                        esc_html__('First Name is a required value.', 'event_espresso'),
1299
-                        __FILE__,
1300
-                        __FUNCTION__,
1301
-                        __LINE__
1302
-                    );
1303
-                    return false;
1304
-                    break;
1305
-                case 'lname':
1306
-                    EE_Error::add_error(
1307
-                        esc_html__('Last Name is a required value.', 'event_espresso'),
1308
-                        __FILE__,
1309
-                        __FUNCTION__,
1310
-                        __LINE__
1311
-                    );
1312
-                    return false;
1313
-                    break;
1314
-                case 'email':
1315
-                    EE_Error::add_error(
1316
-                        esc_html__('Please enter a valid email address.', 'event_espresso'),
1317
-                        __FILE__,
1318
-                        __FUNCTION__,
1319
-                        __LINE__
1320
-                    );
1321
-                    return false;
1322
-                    break;
1323
-            }
1324
-        }
1325
-        return true;
1326
-    }
1327
-
1328
-
1329
-    /**
1330
-     *    _associate_attendee_with_registration
1331
-     *
1332
-     * @param EE_Registration $registration
1333
-     * @param EE_Attendee     $attendee
1334
-     * @return void
1335
-     * @throws EE_Error
1336
-     * @throws InvalidArgumentException
1337
-     * @throws ReflectionException
1338
-     * @throws RuntimeException
1339
-     * @throws InvalidDataTypeException
1340
-     * @throws InvalidInterfaceException
1341
-     */
1342
-    private function _associate_attendee_with_registration(EE_Registration $registration, EE_Attendee $attendee)
1343
-    {
1344
-        // add relation to attendee
1345
-        $registration->_add_relation_to($attendee, 'Attendee');
1346
-        $registration->set_attendee_id($attendee->ID());
1347
-        $registration->update_cache_after_object_save('Attendee', $attendee);
1348
-    }
1349
-
1350
-
1351
-    /**
1352
-     *    _associate_registration_with_transaction
1353
-     *
1354
-     * @param EE_Registration $registration
1355
-     * @return void
1356
-     * @throws EE_Error
1357
-     * @throws InvalidArgumentException
1358
-     * @throws ReflectionException
1359
-     * @throws InvalidDataTypeException
1360
-     * @throws InvalidInterfaceException
1361
-     */
1362
-    private function _associate_registration_with_transaction(EE_Registration $registration)
1363
-    {
1364
-        // add relation to registration
1365
-        $this->checkout->transaction->_add_relation_to($registration, 'Registration');
1366
-        $this->checkout->transaction->update_cache_after_object_save('Registration', $registration);
1367
-    }
1368
-
1369
-
1370
-    /**
1371
-     *    _copy_critical_attendee_details_from_primary_registrant
1372
-     *    ensures that all attendees at least have data for first name, last name, and email address
1373
-     *
1374
-     * @param array $attendee_data
1375
-     * @return array
1376
-     * @throws EE_Error
1377
-     * @throws InvalidArgumentException
1378
-     * @throws ReflectionException
1379
-     * @throws InvalidDataTypeException
1380
-     * @throws InvalidInterfaceException
1381
-     */
1382
-    private function _copy_critical_attendee_details_from_primary_registrant($attendee_data = array())
1383
-    {
1384
-        // bare minimum critical details include first name, last name, email address
1385
-        $critical_attendee_details = array('ATT_fname', 'ATT_lname', 'ATT_email');
1386
-        // add address info to critical details?
1387
-        if (apply_filters(
1388
-            'FHEE__EE_SPCO_Reg_Step_Attendee_Information__merge_address_details_with_critical_attendee_details',
1389
-            false
1390
-        )) {
1391
-            $address_details = array(
1392
-                'ATT_address',
1393
-                'ATT_address2',
1394
-                'ATT_city',
1395
-                'STA_ID',
1396
-                'CNT_ISO',
1397
-                'ATT_zip',
1398
-                'ATT_phone',
1399
-            );
1400
-            $critical_attendee_details = array_merge($critical_attendee_details, $address_details);
1401
-        }
1402
-        foreach ($critical_attendee_details as $critical_attendee_detail) {
1403
-            if (! isset($attendee_data[ $critical_attendee_detail ])
1404
-                || empty($attendee_data[ $critical_attendee_detail ])
1405
-            ) {
1406
-                $attendee_data[ $critical_attendee_detail ] = $this->checkout->primary_attendee_obj->get(
1407
-                    $critical_attendee_detail
1408
-                );
1409
-            }
1410
-        }
1411
-        return $attendee_data;
1412
-    }
1413
-
1414
-
1415
-    /**
1416
-     *    update_reg_step
1417
-     *    this is the final step after a user  revisits the site to edit their attendee information
1418
-     *    this gets called AFTER the process_reg_step() method above
1419
-     *
1420
-     * @return bool
1421
-     * @throws EE_Error
1422
-     * @throws InvalidArgumentException
1423
-     * @throws ReflectionException
1424
-     * @throws RuntimeException
1425
-     * @throws InvalidDataTypeException
1426
-     * @throws InvalidInterfaceException
1427
-     */
1428
-    public function update_reg_step()
1429
-    {
1430
-        // save everything
1431
-        if ($this->process_reg_step()) {
1432
-            $this->checkout->redirect = true;
1433
-            $this->checkout->redirect_url = add_query_arg(
1434
-                array(
1435
-                    'e_reg_url_link' => $this->checkout->reg_url_link,
1436
-                    'revisit'        => true,
1437
-                ),
1438
-                $this->checkout->thank_you_page_url
1439
-            );
1440
-            $this->checkout->json_response->set_redirect_url($this->checkout->redirect_url);
1441
-            return true;
1442
-        }
1443
-        return false;
1444
-    }
1224
+		$answer_cache_id = $this->checkout->reg_url_link
1225
+			? $form_input . '-' . $registration->reg_url_link()
1226
+			: $form_input;
1227
+		$answer_is_obj = isset($this->_registration_answers[ $answer_cache_id ])
1228
+						 && $this->_registration_answers[ $answer_cache_id ] instanceof EE_Answer;
1229
+		// rename form_inputs if they are EE_Attendee properties
1230
+		switch ((string) $form_input) {
1231
+			case 'state':
1232
+			case 'STA_ID':
1233
+				$attendee_property = true;
1234
+				$form_input = 'STA_ID';
1235
+				break;
1236
+
1237
+			case 'country':
1238
+			case 'CNT_ISO':
1239
+				$attendee_property = true;
1240
+				$form_input = 'CNT_ISO';
1241
+				break;
1242
+
1243
+			default:
1244
+				$ATT_input = 'ATT_' . $form_input;
1245
+				// EEH_Debug_Tools::printr( $ATT_input, '$ATT_input', __FILE__, __LINE__ );
1246
+				$attendee_property = EEM_Attendee::instance()->has_field($ATT_input) ? true : false;
1247
+				$form_input = $attendee_property ? 'ATT_' . $form_input : $form_input;
1248
+		}
1249
+		// EEH_Debug_Tools::printr( $answer_cache_id, '$answer_cache_id', __FILE__, __LINE__ );
1250
+		// EEH_Debug_Tools::printr( $attendee_property, '$attendee_property', __FILE__, __LINE__ );
1251
+		// EEH_Debug_Tools::printr( $answer_is_obj, '$answer_is_obj', __FILE__, __LINE__ );
1252
+		// if this form input has a corresponding attendee property
1253
+		if ($attendee_property) {
1254
+			$this->_attendee_data[ $registration->reg_url_link() ][ $form_input ] = $input_value;
1255
+			if ($answer_is_obj) {
1256
+				// and delete the corresponding answer since we won't be storing this data in that object
1257
+				$registration->_remove_relation_to($this->_registration_answers[ $answer_cache_id ], 'Answer');
1258
+				$this->_registration_answers[ $answer_cache_id ]->delete_permanently();
1259
+			}
1260
+			return true;
1261
+		}
1262
+		if ($answer_is_obj) {
1263
+			// save this data to the answer object
1264
+			$this->_registration_answers[ $answer_cache_id ]->set_value($input_value);
1265
+			$result = $this->_registration_answers[ $answer_cache_id ]->save();
1266
+			return $result !== false;
1267
+		}
1268
+		foreach ($this->_registration_answers as $answer) {
1269
+			if ($answer instanceof EE_Answer && $answer->question_ID() === $answer_cache_id) {
1270
+				$answer->set_value($input_value);
1271
+				$result = $answer->save();
1272
+				return $result !== false;
1273
+			}
1274
+		}
1275
+		return false;
1276
+	}
1277
+
1278
+
1279
+	/**
1280
+	 *    _verify_critical_attendee_details_are_set
1281
+	 *
1282
+	 * @param string $form_input
1283
+	 * @param string $input_value
1284
+	 * @return boolean
1285
+	 */
1286
+	private function _verify_critical_attendee_details_are_set_and_validate_email(
1287
+		$form_input = '',
1288
+		$input_value = ''
1289
+	) {
1290
+		if (empty($input_value)) {
1291
+			// if the form input isn't marked as being required, then just return
1292
+			if (! isset($this->_required_questions[ $form_input ]) || ! $this->_required_questions[ $form_input ]) {
1293
+				return true;
1294
+			}
1295
+			switch ($form_input) {
1296
+				case 'fname':
1297
+					EE_Error::add_error(
1298
+						esc_html__('First Name is a required value.', 'event_espresso'),
1299
+						__FILE__,
1300
+						__FUNCTION__,
1301
+						__LINE__
1302
+					);
1303
+					return false;
1304
+					break;
1305
+				case 'lname':
1306
+					EE_Error::add_error(
1307
+						esc_html__('Last Name is a required value.', 'event_espresso'),
1308
+						__FILE__,
1309
+						__FUNCTION__,
1310
+						__LINE__
1311
+					);
1312
+					return false;
1313
+					break;
1314
+				case 'email':
1315
+					EE_Error::add_error(
1316
+						esc_html__('Please enter a valid email address.', 'event_espresso'),
1317
+						__FILE__,
1318
+						__FUNCTION__,
1319
+						__LINE__
1320
+					);
1321
+					return false;
1322
+					break;
1323
+			}
1324
+		}
1325
+		return true;
1326
+	}
1327
+
1328
+
1329
+	/**
1330
+	 *    _associate_attendee_with_registration
1331
+	 *
1332
+	 * @param EE_Registration $registration
1333
+	 * @param EE_Attendee     $attendee
1334
+	 * @return void
1335
+	 * @throws EE_Error
1336
+	 * @throws InvalidArgumentException
1337
+	 * @throws ReflectionException
1338
+	 * @throws RuntimeException
1339
+	 * @throws InvalidDataTypeException
1340
+	 * @throws InvalidInterfaceException
1341
+	 */
1342
+	private function _associate_attendee_with_registration(EE_Registration $registration, EE_Attendee $attendee)
1343
+	{
1344
+		// add relation to attendee
1345
+		$registration->_add_relation_to($attendee, 'Attendee');
1346
+		$registration->set_attendee_id($attendee->ID());
1347
+		$registration->update_cache_after_object_save('Attendee', $attendee);
1348
+	}
1349
+
1350
+
1351
+	/**
1352
+	 *    _associate_registration_with_transaction
1353
+	 *
1354
+	 * @param EE_Registration $registration
1355
+	 * @return void
1356
+	 * @throws EE_Error
1357
+	 * @throws InvalidArgumentException
1358
+	 * @throws ReflectionException
1359
+	 * @throws InvalidDataTypeException
1360
+	 * @throws InvalidInterfaceException
1361
+	 */
1362
+	private function _associate_registration_with_transaction(EE_Registration $registration)
1363
+	{
1364
+		// add relation to registration
1365
+		$this->checkout->transaction->_add_relation_to($registration, 'Registration');
1366
+		$this->checkout->transaction->update_cache_after_object_save('Registration', $registration);
1367
+	}
1368
+
1369
+
1370
+	/**
1371
+	 *    _copy_critical_attendee_details_from_primary_registrant
1372
+	 *    ensures that all attendees at least have data for first name, last name, and email address
1373
+	 *
1374
+	 * @param array $attendee_data
1375
+	 * @return array
1376
+	 * @throws EE_Error
1377
+	 * @throws InvalidArgumentException
1378
+	 * @throws ReflectionException
1379
+	 * @throws InvalidDataTypeException
1380
+	 * @throws InvalidInterfaceException
1381
+	 */
1382
+	private function _copy_critical_attendee_details_from_primary_registrant($attendee_data = array())
1383
+	{
1384
+		// bare minimum critical details include first name, last name, email address
1385
+		$critical_attendee_details = array('ATT_fname', 'ATT_lname', 'ATT_email');
1386
+		// add address info to critical details?
1387
+		if (apply_filters(
1388
+			'FHEE__EE_SPCO_Reg_Step_Attendee_Information__merge_address_details_with_critical_attendee_details',
1389
+			false
1390
+		)) {
1391
+			$address_details = array(
1392
+				'ATT_address',
1393
+				'ATT_address2',
1394
+				'ATT_city',
1395
+				'STA_ID',
1396
+				'CNT_ISO',
1397
+				'ATT_zip',
1398
+				'ATT_phone',
1399
+			);
1400
+			$critical_attendee_details = array_merge($critical_attendee_details, $address_details);
1401
+		}
1402
+		foreach ($critical_attendee_details as $critical_attendee_detail) {
1403
+			if (! isset($attendee_data[ $critical_attendee_detail ])
1404
+				|| empty($attendee_data[ $critical_attendee_detail ])
1405
+			) {
1406
+				$attendee_data[ $critical_attendee_detail ] = $this->checkout->primary_attendee_obj->get(
1407
+					$critical_attendee_detail
1408
+				);
1409
+			}
1410
+		}
1411
+		return $attendee_data;
1412
+	}
1413
+
1414
+
1415
+	/**
1416
+	 *    update_reg_step
1417
+	 *    this is the final step after a user  revisits the site to edit their attendee information
1418
+	 *    this gets called AFTER the process_reg_step() method above
1419
+	 *
1420
+	 * @return bool
1421
+	 * @throws EE_Error
1422
+	 * @throws InvalidArgumentException
1423
+	 * @throws ReflectionException
1424
+	 * @throws RuntimeException
1425
+	 * @throws InvalidDataTypeException
1426
+	 * @throws InvalidInterfaceException
1427
+	 */
1428
+	public function update_reg_step()
1429
+	{
1430
+		// save everything
1431
+		if ($this->process_reg_step()) {
1432
+			$this->checkout->redirect = true;
1433
+			$this->checkout->redirect_url = add_query_arg(
1434
+				array(
1435
+					'e_reg_url_link' => $this->checkout->reg_url_link,
1436
+					'revisit'        => true,
1437
+				),
1438
+				$this->checkout->thank_you_page_url
1439
+			);
1440
+			$this->checkout->json_response->set_redirect_url($this->checkout->redirect_url);
1441
+			return true;
1442
+		}
1443
+		return false;
1444
+	}
1445 1445
 }
Please login to merge, or discard this patch.
Spacing   +82 added lines, -82 removed lines patch added patch discarded remove patch
@@ -49,7 +49,7 @@  discard block
 block discarded – undo
49 49
     {
50 50
         $this->_slug = 'attendee_information';
51 51
         $this->_name = esc_html__('Attendee Information', 'event_espresso');
52
-        $this->_template = SPCO_REG_STEPS_PATH . $this->_slug . '/attendee_info_main.template.php';
52
+        $this->_template = SPCO_REG_STEPS_PATH.$this->_slug.'/attendee_info_main.template.php';
53 53
         $this->checkout = $checkout;
54 54
         $this->_reset_success_message();
55 55
         $this->set_instructions(
@@ -142,7 +142,7 @@  discard block
 block discarded – undo
142 142
          */
143 143
         $reg_config = LoaderFactory::getLoader()->getShared('EE_Registration_Config');
144 144
         // if this isn't a revisit, and they have the privacy consent box enalbed, add it
145
-        if (! $this->checkout->revisit && $reg_config->isConsentCheckboxEnabled()) {
145
+        if ( ! $this->checkout->revisit && $reg_config->isConsentCheckboxEnabled()) {
146 146
             $extra_inputs_section->add_subsections(
147 147
                 array(
148 148
                     'consent_box' => new EE_Form_Section_Proper(
@@ -150,7 +150,7 @@  discard block
 block discarded – undo
150 150
                             'layout_strategy' =>
151 151
                                 new EE_Template_Layout(
152 152
                                     array(
153
-                                        'input_template_file' => SPCO_REG_STEPS_PATH . $this->_slug . '/privacy_consent.template.php',
153
+                                        'input_template_file' => SPCO_REG_STEPS_PATH.$this->_slug.'/privacy_consent.template.php',
154 154
                                     )
155 155
                                 ),
156 156
                             'subsections'     => array(
@@ -188,13 +188,13 @@  discard block
 block discarded – undo
188 188
                 if ($registration instanceof EE_Registration
189 189
                     && $this->checkout->visit_allows_processing_of_this_registration($registration)
190 190
                 ) {
191
-                    $subsections[ $registration->reg_url_link() ] = $this->_registrations_reg_form($registration);
192
-                    if (! $this->checkout->admin_request) {
193
-                        $template_args['registrations'][ $registration->reg_url_link() ] = $registration;
194
-                        $template_args['ticket_count'][ $registration->ticket()->ID() ] = isset(
195
-                            $template_args['ticket_count'][ $registration->ticket()->ID() ]
191
+                    $subsections[$registration->reg_url_link()] = $this->_registrations_reg_form($registration);
192
+                    if ( ! $this->checkout->admin_request) {
193
+                        $template_args['registrations'][$registration->reg_url_link()] = $registration;
194
+                        $template_args['ticket_count'][$registration->ticket()->ID()] = isset(
195
+                            $template_args['ticket_count'][$registration->ticket()->ID()]
196 196
                         )
197
-                            ? $template_args['ticket_count'][ $registration->ticket()->ID() ] + 1
197
+                            ? $template_args['ticket_count'][$registration->ticket()->ID()] + 1
198 198
                             : 1;
199 199
                         $ticket_line_item = EEH_Line_Item::get_line_items_by_object_type_and_IDs(
200 200
                             $this->checkout->cart->get_grand_total(),
@@ -204,7 +204,7 @@  discard block
 block discarded – undo
204 204
                         $ticket_line_item = is_array($ticket_line_item)
205 205
                             ? reset($ticket_line_item)
206 206
                             : $ticket_line_item;
207
-                        $template_args['ticket_line_item'][ $registration->ticket()->ID() ] =
207
+                        $template_args['ticket_line_item'][$registration->ticket()->ID()] =
208 208
                             $Line_Item_Display->display_line_item($ticket_line_item);
209 209
                     }
210 210
                     if ($registration->is_primary_registrant()) {
@@ -220,10 +220,10 @@  discard block
 block discarded – undo
220 220
                     ? $this->_copy_attendee_info_form()
221 221
                     : $this->_auto_copy_attendee_info();
222 222
                 // generate hidden input
223
-                if (isset($subsections[ $primary_registrant ])
224
-                    && $subsections[ $primary_registrant ] instanceof EE_Form_Section_Proper
223
+                if (isset($subsections[$primary_registrant])
224
+                    && $subsections[$primary_registrant] instanceof EE_Form_Section_Proper
225 225
                 ) {
226
-                    $subsections[ $primary_registrant ]->add_subsections(
226
+                    $subsections[$primary_registrant]->add_subsections(
227 227
                         $copy_options,
228 228
                         'primary_registrant',
229 229
                         false
@@ -290,7 +290,7 @@  discard block
 block discarded – undo
290 290
             if ($question_groups) {
291 291
                 // array of params to pass to parent constructor
292 292
                 $form_args = array(
293
-                    'html_id'         => 'ee-registration-' . $registration->reg_url_link(),
293
+                    'html_id'         => 'ee-registration-'.$registration->reg_url_link(),
294 294
                     'html_class'      => 'ee-reg-form-attendee-dv',
295 295
                     'html_style'      => $this->checkout->admin_request
296 296
                         ? 'padding:0em 2em 1em; margin:3em 0 0; border:1px solid #ddd;'
@@ -312,7 +312,7 @@  discard block
 block discarded – undo
312 312
                 );
313 313
                 foreach ($question_groups as $question_group) {
314 314
                     if ($question_group instanceof EE_Question_Group) {
315
-                        $form_args['subsections'][ $question_group->identifier() ] = $this->_question_group_reg_form(
315
+                        $form_args['subsections'][$question_group->identifier()] = $this->_question_group_reg_form(
316 316
                             $registration,
317 317
                             $question_group
318 318
                         );
@@ -352,7 +352,7 @@  discard block
 block discarded – undo
352 352
         // generate hidden input
353 353
         return new EE_Hidden_Input(
354 354
             array(
355
-                'html_id' => 'additional-attendee-reg-info-' . $registration->reg_url_link(),
355
+                'html_id' => 'additional-attendee-reg-info-'.$registration->reg_url_link(),
356 356
                 'default' => $additional_attendee_reg_info,
357 357
             )
358 358
         );
@@ -373,12 +373,12 @@  discard block
 block discarded – undo
373 373
     {
374 374
         // array of params to pass to parent constructor
375 375
         $form_args = array(
376
-            'html_id'         => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-' . $registration->ID(),
376
+            'html_id'         => 'ee-reg-form-qstn-grp-'.$question_group->identifier().'-'.$registration->ID(),
377 377
             'html_class'      => $this->checkout->admin_request
378 378
                 ? 'form-table ee-reg-form-qstn-grp-dv'
379 379
                 : 'ee-reg-form-qstn-grp-dv',
380
-            'html_label_id'   => 'ee-reg-form-qstn-grp-' . $question_group->identifier() . '-'
381
-                                 . $registration->ID() . '-lbl',
380
+            'html_label_id'   => 'ee-reg-form-qstn-grp-'.$question_group->identifier().'-'
381
+                                 . $registration->ID().'-lbl',
382 382
             'subsections'     => array(
383 383
                 'reg_form_qstn_grp_hdr' => $this->_question_group_header($question_group),
384 384
             ),
@@ -389,7 +389,7 @@  discard block
 block discarded – undo
389 389
         // where params
390 390
         $query_params = array('QST_deleted' => 0);
391 391
         // don't load admin only questions on the frontend
392
-        if (! $this->checkout->admin_request) {
392
+        if ( ! $this->checkout->admin_request) {
393 393
             $query_params['QST_admin_only'] = array('!=', true);
394 394
         }
395 395
         $questions = $question_group->get_many_related(
@@ -423,7 +423,7 @@  discard block
 block discarded – undo
423 423
                 $identifier = $question->is_system_question()
424 424
                     ? $question->system_ID()
425 425
                     : $question->ID();
426
-                $form_args['subsections'][ $identifier ] = $this->reg_form_question($registration, $question);
426
+                $form_args['subsections'][$identifier] = $this->reg_form_question($registration, $question);
427 427
             }
428 428
         }
429 429
         $form_args['subsections'] = apply_filters(
@@ -535,7 +535,7 @@  discard block
 block discarded – undo
535 535
     {
536 536
         return new EE_Form_Section_HTML(
537 537
             EEH_Template::locate_template(
538
-                SPCO_REG_STEPS_PATH . $this->_slug . '/_auto_copy_attendee_info.template.php',
538
+                SPCO_REG_STEPS_PATH.$this->_slug.'/_auto_copy_attendee_info.template.php',
539 539
                 apply_filters(
540 540
                     'FHEE__EE_SPCO_Reg_Step_Attendee_Information__auto_copy_attendee_info__template_args',
541 541
                     array()
@@ -568,17 +568,17 @@  discard block
 block discarded – undo
568 568
                 if ($registration->ticket()->ID() !== $prev_ticket) {
569 569
                     $item_name = $registration->ticket()->name();
570 570
                     $item_name .= $registration->ticket()->description() !== ''
571
-                        ? ' - ' . $registration->ticket()->description()
571
+                        ? ' - '.$registration->ticket()->description()
572 572
                         : '';
573
-                    $copy_attendee_info_inputs[ 'spco_copy_attendee_chk[ticket-' . $registration->ticket()->ID(
574
-                    ) . ']' ] =
573
+                    $copy_attendee_info_inputs['spco_copy_attendee_chk[ticket-'.$registration->ticket()->ID(
574
+                    ).']'] =
575 575
                         new EE_Form_Section_HTML(
576
-                            '<h6 class="spco-copy-attendee-event-hdr">' . $item_name . '</h6>'
576
+                            '<h6 class="spco-copy-attendee-event-hdr">'.$item_name.'</h6>'
577 577
                         );
578 578
                     $prev_ticket = $registration->ticket()->ID();
579 579
                 }
580 580
 
581
-                $copy_attendee_info_inputs[ 'spco_copy_attendee_chk[' . $registration->ID() . ']' ] =
581
+                $copy_attendee_info_inputs['spco_copy_attendee_chk['.$registration->ID().']'] =
582 582
                     new EE_Checkbox_Multi_Input(
583 583
                         array(
584 584
                             $registration->ID() => sprintf(
@@ -587,7 +587,7 @@  discard block
 block discarded – undo
587 587
                             ),
588 588
                         ),
589 589
                         array(
590
-                            'html_id'                 => 'spco-copy-attendee-chk-' . $registration->reg_url_link(),
590
+                            'html_id'                 => 'spco-copy-attendee-chk-'.$registration->reg_url_link(),
591 591
                             'html_class'              => 'spco-copy-attendee-chk ee-do-not-validate',
592 592
                             'display_html_label_text' => false,
593 593
                         )
@@ -652,14 +652,14 @@  discard block
 block discarded – undo
652 652
         }
653 653
         // verify instance
654 654
         if ($answer instanceof EE_Answer) {
655
-            if (! empty($answer_value)) {
655
+            if ( ! empty($answer_value)) {
656 656
                 $answer->set('ANS_value', $answer_value);
657 657
             }
658 658
             $answer->cache('Question', $question);
659 659
             // remember system ID had a bug where sometimes it could be null
660 660
             $answer_cache_id = $question->is_system_question()
661
-                ? $question->system_ID() . '-' . $registration->reg_url_link()
662
-                : $question->ID() . '-' . $registration->reg_url_link();
661
+                ? $question->system_ID().'-'.$registration->reg_url_link()
662
+                : $question->ID().'-'.$registration->reg_url_link();
663 663
             $registration->cache('Answer', $answer, $answer_cache_id);
664 664
         }
665 665
         return $this->_generate_question_input($registration, $question, $answer);
@@ -682,7 +682,7 @@  discard block
 block discarded – undo
682 682
         $identifier = $question->is_system_question()
683 683
             ? $question->system_ID()
684 684
             : $question->ID();
685
-        $this->_required_questions[ $identifier ] = $question->required() ? true : false;
685
+        $this->_required_questions[$identifier] = $question->required() ? true : false;
686 686
         add_filter(
687 687
             'FHEE__EE_Question__generate_form_input__country_options',
688 688
             array($this, 'use_cached_countries_for_form_input'),
@@ -696,17 +696,17 @@  discard block
 block discarded – undo
696 696
             4
697 697
         );
698 698
         $input_constructor_args = array(
699
-            'html_name'        => 'ee_reg_qstn[' . $registration->ID() . '][' . $identifier . ']',
700
-            'html_id'          => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
701
-            'html_class'       => 'ee-reg-qstn ee-reg-qstn-' . $identifier,
702
-            'html_label_id'    => 'ee_reg_qstn-' . $registration->ID() . '-' . $identifier,
699
+            'html_name'        => 'ee_reg_qstn['.$registration->ID().']['.$identifier.']',
700
+            'html_id'          => 'ee_reg_qstn-'.$registration->ID().'-'.$identifier,
701
+            'html_class'       => 'ee-reg-qstn ee-reg-qstn-'.$identifier,
702
+            'html_label_id'    => 'ee_reg_qstn-'.$registration->ID().'-'.$identifier,
703 703
             'html_label_class' => 'ee-reg-qstn',
704 704
         );
705 705
         $input_constructor_args['html_label_id'] .= '-lbl';
706 706
         if ($answer instanceof EE_Answer && $answer->ID()) {
707
-            $input_constructor_args['html_name'] .= '[' . $answer->ID() . ']';
708
-            $input_constructor_args['html_id'] .= '-' . $answer->ID();
709
-            $input_constructor_args['html_label_id'] .= '-' . $answer->ID();
707
+            $input_constructor_args['html_name'] .= '['.$answer->ID().']';
708
+            $input_constructor_args['html_id'] .= '-'.$answer->ID();
709
+            $input_constructor_args['html_label_id'] .= '-'.$answer->ID();
710 710
         }
711 711
         $form_input = $question->generate_form_input(
712 712
             $registration,
@@ -750,10 +750,10 @@  discard block
 block discarded – undo
750 750
         $countries = $this->checkout->action === 'process_reg_step'
751 751
             ? EEM_Country::instance()->get_all_countries()
752 752
             : EEM_Country::instance()->get_all_active_countries();
753
-        if (! empty($countries)) {
753
+        if ( ! empty($countries)) {
754 754
             foreach ($countries as $country) {
755 755
                 if ($country instanceof EE_Country) {
756
-                    $country_options[ $country->ID() ] = $country->name();
756
+                    $country_options[$country->ID()] = $country->name();
757 757
                 }
758 758
             }
759 759
         }
@@ -800,10 +800,10 @@  discard block
 block discarded – undo
800 800
         $states = $this->checkout->action === 'process_reg_step'
801 801
             ? EEM_State::instance()->get_all_states()
802 802
             : EEM_State::instance()->get_all_active_states();
803
-        if (! empty($states)) {
803
+        if ( ! empty($states)) {
804 804
             foreach ($states as $state) {
805 805
                 if ($state instanceof EE_State) {
806
-                    $state_options[ $state->country()->name() ][ $state->ID() ] = $state->name();
806
+                    $state_options[$state->country()->name()][$state->ID()] = $state->name();
807 807
                 }
808 808
             }
809 809
         }
@@ -850,7 +850,7 @@  discard block
 block discarded – undo
850 850
             );
851 851
             return false;
852 852
         }
853
-        if (! $this->checkout->transaction instanceof EE_Transaction || ! $this->checkout->continue_reg) {
853
+        if ( ! $this->checkout->transaction instanceof EE_Transaction || ! $this->checkout->continue_reg) {
854 854
             EE_Error::add_error(
855 855
                 esc_html__(
856 856
                     'A valid transaction could not be initiated for processing your registrations.',
@@ -877,7 +877,7 @@  discard block
 block discarded – undo
877 877
                     '(line break)This can sometimes happen if too much time has been taken to complete the registration process.(line break)Please return to the (link)Event List(end link) and reselect your tickets. If the problem continues, please contact the site administrator.',
878 878
                     'event_espresso'
879 879
                 ),
880
-                '<a href="' . get_post_type_archive_link('espresso_events') . '" >',
880
+                '<a href="'.get_post_type_archive_link('espresso_events').'" >',
881 881
                 '</a>',
882 882
                 '<br />'
883 883
             );
@@ -897,7 +897,7 @@  discard block
 block discarded – undo
897 897
             // but return immediately if the previous step exited early due to errors
898 898
             return false;
899 899
         }
900
-        if (! $this->checkout->revisit && $registrations_processed !== $this->checkout->total_ticket_count) {
900
+        if ( ! $this->checkout->revisit && $registrations_processed !== $this->checkout->total_ticket_count) {
901 901
             // generate a correctly translated string for all possible singular/plural combinations
902 902
             if ($this->checkout->total_ticket_count === 1 && $registrations_processed !== 1) {
903 903
                 $error_msg = sprintf(
@@ -980,7 +980,7 @@  discard block
 block discarded – undo
980 980
         // grab the saved registrations from the transaction
981 981
         foreach ($registrations as $registration) {
982 982
             // verify EE_Registration object
983
-            if (! $registration instanceof EE_Registration) {
983
+            if ( ! $registration instanceof EE_Registration) {
984 984
                 EE_Error::add_error(
985 985
                     esc_html__(
986 986
                         'An invalid Registration object was discovered when attempting to process your registration information.',
@@ -995,12 +995,12 @@  discard block
 block discarded – undo
995 995
             /** @var string $reg_url_link */
996 996
             $reg_url_link = $registration->reg_url_link();
997 997
             // reg_url_link exists ?
998
-            if (! empty($reg_url_link)) {
998
+            if ( ! empty($reg_url_link)) {
999 999
                 // should this registration be processed during this visit ?
1000 1000
                 if ($this->checkout->visit_allows_processing_of_this_registration($registration)) {
1001 1001
                     // if NOT revisiting, then let's save the registration now,
1002 1002
                     // so that we have a REG_ID to use when generating other objects
1003
-                    if (! $this->checkout->revisit) {
1003
+                    if ( ! $this->checkout->revisit) {
1004 1004
                         $registration->save();
1005 1005
                     }
1006 1006
                     /**
@@ -1024,18 +1024,18 @@  discard block
 block discarded – undo
1024 1024
 
1025 1025
                     // Houston, we have a registration!
1026 1026
                     $att_nmbr++;
1027
-                    $this->_attendee_data[ $reg_url_link ] = array();
1027
+                    $this->_attendee_data[$reg_url_link] = array();
1028 1028
                     // grab any existing related answer objects
1029 1029
                     $this->_registration_answers = $registration->answers();
1030 1030
                     // unset( $valid_data[ $reg_url_link ]['additional_attendee_reg_info'] );
1031
-                    if (isset($valid_data[ $reg_url_link ])) {
1031
+                    if (isset($valid_data[$reg_url_link])) {
1032 1032
                         // do we need to copy basic info from primary attendee ?
1033
-                        $copy_primary = isset($valid_data[ $reg_url_link ]['additional_attendee_reg_info'])
1034
-                                        && absint($valid_data[ $reg_url_link ]['additional_attendee_reg_info']) === 0;
1033
+                        $copy_primary = isset($valid_data[$reg_url_link]['additional_attendee_reg_info'])
1034
+                                        && absint($valid_data[$reg_url_link]['additional_attendee_reg_info']) === 0;
1035 1035
                         // filter form input data for this registration
1036
-                        $valid_data[ $reg_url_link ] = (array) apply_filters(
1036
+                        $valid_data[$reg_url_link] = (array) apply_filters(
1037 1037
                             'FHEE__EE_Single_Page_Checkout__process_attendee_information__valid_data_line_item',
1038
-                            $valid_data[ $reg_url_link ]
1038
+                            $valid_data[$reg_url_link]
1039 1039
                         );
1040 1040
                         if (isset($valid_data['primary_attendee'])) {
1041 1041
                             $primary_registrant['line_item_id'] = ! empty($valid_data['primary_attendee'])
@@ -1044,12 +1044,12 @@  discard block
 block discarded – undo
1044 1044
                             unset($valid_data['primary_attendee']);
1045 1045
                         }
1046 1046
                         // now loop through our array of valid post data && process attendee reg forms
1047
-                        foreach ($valid_data[ $reg_url_link ] as $form_section => $form_inputs) {
1048
-                            if (! in_array($form_section, $non_input_form_sections, true)) {
1047
+                        foreach ($valid_data[$reg_url_link] as $form_section => $form_inputs) {
1048
+                            if ( ! in_array($form_section, $non_input_form_sections, true)) {
1049 1049
                                 foreach ($form_inputs as $form_input => $input_value) {
1050 1050
                                     // \EEH_Debug_Tools::printr( $input_value, $form_input, __FILE__, __LINE__ );
1051 1051
                                     // check for critical inputs
1052
-                                    if (! $this->_verify_critical_attendee_details_are_set_and_validate_email(
1052
+                                    if ( ! $this->_verify_critical_attendee_details_are_set_and_validate_email(
1053 1053
                                         $form_input,
1054 1054
                                         $input_value
1055 1055
                                     )
@@ -1061,15 +1061,15 @@  discard block
 block discarded – undo
1061 1061
                                         && ! empty($input_value)
1062 1062
                                         && $reg_url_link === $primary_registrant['line_item_id']
1063 1063
                                     ) {
1064
-                                        $primary_registrant[ $form_input ] = $input_value;
1064
+                                        $primary_registrant[$form_input] = $input_value;
1065 1065
                                     } elseif ($copy_primary
1066 1066
                                               && $input_value === null
1067
-                                              && isset($primary_registrant[ $form_input ])
1067
+                                              && isset($primary_registrant[$form_input])
1068 1068
                                     ) {
1069
-                                        $input_value = $primary_registrant[ $form_input ];
1069
+                                        $input_value = $primary_registrant[$form_input];
1070 1070
                                     }
1071 1071
                                     // now attempt to save the input data
1072
-                                    if (! $this->_save_registration_form_input(
1072
+                                    if ( ! $this->_save_registration_form_input(
1073 1073
                                         $registration,
1074 1074
                                         $form_input,
1075 1075
                                         $input_value
@@ -1105,15 +1105,15 @@  discard block
 block discarded – undo
1105 1105
                         $attendee = $this->checkout->primary_attendee_obj;
1106 1106
                     } else {
1107 1107
                         // ensure critical details are set for additional attendees
1108
-                        $this->_attendee_data[ $reg_url_link ] = $att_nmbr > 1
1108
+                        $this->_attendee_data[$reg_url_link] = $att_nmbr > 1
1109 1109
                             ? $this->_copy_critical_attendee_details_from_primary_registrant(
1110
-                                $this->_attendee_data[ $reg_url_link ]
1110
+                                $this->_attendee_data[$reg_url_link]
1111 1111
                             )
1112
-                            : $this->_attendee_data[ $reg_url_link ];
1112
+                            : $this->_attendee_data[$reg_url_link];
1113 1113
                         // execute create attendee command (which may return an existing attendee)
1114 1114
                         $attendee = EE_Registry::instance()->BUS->execute(
1115 1115
                             new CreateAttendeeCommand(
1116
-                                $this->_attendee_data[ $reg_url_link ],
1116
+                                $this->_attendee_data[$reg_url_link],
1117 1117
                                 $registration
1118 1118
                             )
1119 1119
                         );
@@ -1126,7 +1126,7 @@  discard block
 block discarded – undo
1126 1126
                     // add relation to registration, set attendee ID, and cache attendee
1127 1127
                     $this->_associate_attendee_with_registration($registration, $attendee);
1128 1128
                     // \EEH_Debug_Tools::printr( $registration, '$registration', __FILE__, __LINE__ );
1129
-                    if (! $registration->attendee() instanceof EE_Attendee) {
1129
+                    if ( ! $registration->attendee() instanceof EE_Attendee) {
1130 1130
                         EE_Error::add_error(
1131 1131
                             sprintf(
1132 1132
                                 esc_html_x(
@@ -1176,7 +1176,7 @@  discard block
 block discarded – undo
1176 1176
                     __LINE__
1177 1177
                 );
1178 1178
                 // remove malformed data
1179
-                unset($valid_data[ $reg_url_link ]);
1179
+                unset($valid_data[$reg_url_link]);
1180 1180
                 return false;
1181 1181
             }
1182 1182
         } // end of foreach ( $this->checkout->transaction->registrations()  as $registration )
@@ -1222,10 +1222,10 @@  discard block
 block discarded – undo
1222 1222
          * @see https://events.codebasehq.com/projects/event-espresso/tickets/10477
1223 1223
          */
1224 1224
         $answer_cache_id = $this->checkout->reg_url_link
1225
-            ? $form_input . '-' . $registration->reg_url_link()
1225
+            ? $form_input.'-'.$registration->reg_url_link()
1226 1226
             : $form_input;
1227
-        $answer_is_obj = isset($this->_registration_answers[ $answer_cache_id ])
1228
-                         && $this->_registration_answers[ $answer_cache_id ] instanceof EE_Answer;
1227
+        $answer_is_obj = isset($this->_registration_answers[$answer_cache_id])
1228
+                         && $this->_registration_answers[$answer_cache_id] instanceof EE_Answer;
1229 1229
         // rename form_inputs if they are EE_Attendee properties
1230 1230
         switch ((string) $form_input) {
1231 1231
             case 'state':
@@ -1241,28 +1241,28 @@  discard block
 block discarded – undo
1241 1241
                 break;
1242 1242
 
1243 1243
             default:
1244
-                $ATT_input = 'ATT_' . $form_input;
1244
+                $ATT_input = 'ATT_'.$form_input;
1245 1245
                 // EEH_Debug_Tools::printr( $ATT_input, '$ATT_input', __FILE__, __LINE__ );
1246 1246
                 $attendee_property = EEM_Attendee::instance()->has_field($ATT_input) ? true : false;
1247
-                $form_input = $attendee_property ? 'ATT_' . $form_input : $form_input;
1247
+                $form_input = $attendee_property ? 'ATT_'.$form_input : $form_input;
1248 1248
         }
1249 1249
         // EEH_Debug_Tools::printr( $answer_cache_id, '$answer_cache_id', __FILE__, __LINE__ );
1250 1250
         // EEH_Debug_Tools::printr( $attendee_property, '$attendee_property', __FILE__, __LINE__ );
1251 1251
         // EEH_Debug_Tools::printr( $answer_is_obj, '$answer_is_obj', __FILE__, __LINE__ );
1252 1252
         // if this form input has a corresponding attendee property
1253 1253
         if ($attendee_property) {
1254
-            $this->_attendee_data[ $registration->reg_url_link() ][ $form_input ] = $input_value;
1254
+            $this->_attendee_data[$registration->reg_url_link()][$form_input] = $input_value;
1255 1255
             if ($answer_is_obj) {
1256 1256
                 // and delete the corresponding answer since we won't be storing this data in that object
1257
-                $registration->_remove_relation_to($this->_registration_answers[ $answer_cache_id ], 'Answer');
1258
-                $this->_registration_answers[ $answer_cache_id ]->delete_permanently();
1257
+                $registration->_remove_relation_to($this->_registration_answers[$answer_cache_id], 'Answer');
1258
+                $this->_registration_answers[$answer_cache_id]->delete_permanently();
1259 1259
             }
1260 1260
             return true;
1261 1261
         }
1262 1262
         if ($answer_is_obj) {
1263 1263
             // save this data to the answer object
1264
-            $this->_registration_answers[ $answer_cache_id ]->set_value($input_value);
1265
-            $result = $this->_registration_answers[ $answer_cache_id ]->save();
1264
+            $this->_registration_answers[$answer_cache_id]->set_value($input_value);
1265
+            $result = $this->_registration_answers[$answer_cache_id]->save();
1266 1266
             return $result !== false;
1267 1267
         }
1268 1268
         foreach ($this->_registration_answers as $answer) {
@@ -1289,7 +1289,7 @@  discard block
 block discarded – undo
1289 1289
     ) {
1290 1290
         if (empty($input_value)) {
1291 1291
             // if the form input isn't marked as being required, then just return
1292
-            if (! isset($this->_required_questions[ $form_input ]) || ! $this->_required_questions[ $form_input ]) {
1292
+            if ( ! isset($this->_required_questions[$form_input]) || ! $this->_required_questions[$form_input]) {
1293 1293
                 return true;
1294 1294
             }
1295 1295
             switch ($form_input) {
@@ -1400,10 +1400,10 @@  discard block
 block discarded – undo
1400 1400
             $critical_attendee_details = array_merge($critical_attendee_details, $address_details);
1401 1401
         }
1402 1402
         foreach ($critical_attendee_details as $critical_attendee_detail) {
1403
-            if (! isset($attendee_data[ $critical_attendee_detail ])
1404
-                || empty($attendee_data[ $critical_attendee_detail ])
1403
+            if ( ! isset($attendee_data[$critical_attendee_detail])
1404
+                || empty($attendee_data[$critical_attendee_detail])
1405 1405
             ) {
1406
-                $attendee_data[ $critical_attendee_detail ] = $this->checkout->primary_attendee_obj->get(
1406
+                $attendee_data[$critical_attendee_detail] = $this->checkout->primary_attendee_obj->get(
1407 1407
                     $critical_attendee_detail
1408 1408
                 );
1409 1409
             }
Please login to merge, or discard this patch.
modules/event_single/EED_Event_Single.module.php 2 patches
Indentation   +467 added lines, -467 removed lines patch added patch discarded remove patch
@@ -14,472 +14,472 @@  discard block
 block discarded – undo
14 14
 class EED_Event_Single extends EED_Module
15 15
 {
16 16
 
17
-    const EVENT_DETAILS_PRIORITY = 100;
18
-    const EVENT_DATETIMES_PRIORITY = 110;
19
-    const EVENT_TICKETS_PRIORITY = 120;
20
-    const EVENT_VENUES_PRIORITY = 130;
21
-
22
-    /**
23
-     * @type bool $using_get_the_excerpt
24
-     */
25
-    protected static $using_get_the_excerpt = false;
26
-
27
-
28
-    /**
29
-     * @type EE_Template_Part_Manager $template_parts
30
-     */
31
-    protected $template_parts;
32
-
33
-
34
-    /**
35
-     * @return EED_Module|EED_Event_Single
36
-     */
37
-    public static function instance()
38
-    {
39
-        return parent::get_instance(__CLASS__);
40
-    }
41
-
42
-
43
-    /**
44
-     * set_hooks - for hooking into EE Core, other modules, etc
45
-     *
46
-     * @return void
47
-     * @throws InvalidArgumentException
48
-     * @throws InvalidDataTypeException
49
-     * @throws InvalidInterfaceException
50
-     */
51
-    public static function set_hooks()
52
-    {
53
-        add_filter('FHEE_run_EE_wp', '__return_true');
54
-        add_action('wp_loaded', array('EED_Event_Single', 'set_definitions'), 2);
55
-        /** @var EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions $custom_post_type_definitions */
56
-        $custom_post_type_definitions = LoaderFactory::getLoader()->getShared(
57
-            'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'
58
-        );
59
-        $custom_post_types = $custom_post_type_definitions->getDefinitions();
60
-        EE_Config::register_route(
61
-            $custom_post_types['espresso_events']['singular_slug'],
62
-            'Event_Single',
63
-            'run'
64
-        );
65
-    }
66
-
67
-    /**
68
-     * set_hooks_admin - for hooking into EE Admin Core, other modules, etc
69
-     *
70
-     * @return    void
71
-     */
72
-    public static function set_hooks_admin()
73
-    {
74
-        add_action('wp_loaded', array('EED_Event_Single', 'set_definitions'), 2);
75
-    }
76
-
77
-
78
-    /**
79
-     * set_definitions
80
-     *
81
-     * @static
82
-     * @return void
83
-     */
84
-    public static function set_definitions()
85
-    {
86
-        define('EVENT_SINGLE_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
87
-        define('EVENT_SINGLE_TEMPLATES_PATH', plugin_dir_path(__FILE__) . 'templates/');
88
-    }
89
-
90
-
91
-    /**
92
-     * set_config
93
-     *
94
-     * @void
95
-     */
96
-    protected function set_config()
97
-    {
98
-        $this->set_config_section('template_settings');
99
-        $this->set_config_class('EE_Event_Single_Config');
100
-        $this->set_config_name('EED_Event_Single');
101
-    }
102
-
103
-
104
-    /**
105
-     * initialize_template_parts
106
-     *
107
-     * @param EE_Config_Base|EE_Event_Single_Config $config
108
-     * @return EE_Template_Part_Manager
109
-     */
110
-    public function initialize_template_parts(EE_Event_Single_Config $config = null)
111
-    {
112
-        /** @type EE_Event_Single_Config $config */
113
-        $config = $config instanceof EE_Event_Single_Config ? $config : $this->config();
114
-        EEH_Autoloader::instance()->register_template_part_autoloaders();
115
-        $template_parts = new EE_Template_Part_Manager();
116
-        $template_parts->add_template_part(
117
-            'tickets',
118
-            __('Ticket Selector', 'event_espresso'),
119
-            'content-espresso_events-tickets.php',
120
-            $config->display_order_tickets
121
-        );
122
-        $template_parts->add_template_part(
123
-            'datetimes',
124
-            __('Dates and Times', 'event_espresso'),
125
-            'content-espresso_events-datetimes.php',
126
-            $config->display_order_datetimes
127
-        );
128
-        $template_parts->add_template_part(
129
-            'event',
130
-            __('Event Description', 'event_espresso'),
131
-            'content-espresso_events-details.php',
132
-            $config->display_order_event
133
-        );
134
-        $template_parts->add_template_part(
135
-            'venue',
136
-            __('Venue Information', 'event_espresso'),
137
-            'content-espresso_events-venues.php',
138
-            $config->display_order_venue
139
-        );
140
-        do_action('AHEE__EED_Event_Single__initialize_template_parts', $template_parts);
141
-        return $template_parts;
142
-    }
143
-
144
-
145
-    /**
146
-     * run - initial module setup
147
-     *
148
-     * @param WP $WP
149
-     * @return    void
150
-     */
151
-    public function run($WP)
152
-    {
153
-        // ensure valid EE_Events_Single_Config() object exists
154
-        $this->set_config();
155
-        // check what template is loaded
156
-        add_filter('template_include', array($this, 'template_include'), 999, 1);
157
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
158
-        // load css
159
-        add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
160
-    }
161
-
162
-
163
-    /**
164
-     * template_include
165
-     *
166
-     * @param    string $template
167
-     * @return    string
168
-     */
169
-    public function template_include($template)
170
-    {
171
-        global $post;
172
-        /** @type EE_Event_Single_Config $config */
173
-        $config = $this->config();
174
-        if ($config->display_status_banner_single) {
175
-            add_filter('the_title', array('EED_Event_Single', 'the_title'), 100, 2);
176
-        }
177
-        // not a custom template?
178
-        if (! post_password_required($post)
179
-            && (
180
-                apply_filters('FHEE__EED_Event_Single__template_include__allow_custom_selected_template', false)
181
-                || EE_Registry::instance()
182
-                              ->load_core('Front_Controller')
183
-                              ->get_selected_template() !== 'single-espresso_events.php'
184
-            )
185
-
186
-        ) {
187
-            EEH_Template::load_espresso_theme_functions();
188
-            // then add extra event data via hooks
189
-            add_action('loop_start', array('EED_Event_Single', 'loop_start'));
190
-            add_filter('get_the_excerpt', array('EED_Event_Single', 'get_the_excerpt'), 1, 1);
191
-            add_filter(
192
-                'the_content',
193
-                array('EED_Event_Single', 'event_details'),
194
-                EED_Event_Single::EVENT_DETAILS_PRIORITY
195
-            );
196
-            add_action('loop_end', array('EED_Event_Single', 'loop_end'));
197
-            // don't display entry meta because the existing theme will take car of that
198
-            add_filter('FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false');
199
-        }
200
-        return $template;
201
-    }
202
-
203
-
204
-    /**
205
-     * loop_start
206
-     *
207
-     * @param    array $wp_query_array an array containing the WP_Query object
208
-     * @return    void
209
-     */
210
-    public static function loop_start($wp_query_array)
211
-    {
212
-        global $post;
213
-        do_action('AHEE_event_details_before_post', $post, $wp_query_array);
214
-    }
215
-
216
-
217
-    /**
218
-     * the_title
219
-     *
220
-     * @param    string $title
221
-     * @param    int    $id
222
-     * @return    string
223
-     */
224
-    public static function the_title($title = '', $id = 0)
225
-    {
226
-        global $post;
227
-        return in_the_loop() && $post->ID === (int) $id
228
-            ? espresso_event_status_banner($post->ID) . $title
229
-            : $title;
230
-    }
231
-
232
-
233
-    /**
234
-     * get_the_excerpt
235
-     * kinda hacky, but if a theme is using get_the_excerpt(),
236
-     * then we need to remove our filters on the_content()
237
-     *
238
-     * @param        string $excerpt
239
-     * @return        string
240
-     */
241
-    public static function get_the_excerpt($excerpt = '')
242
-    {
243
-        EED_Event_Single::$using_get_the_excerpt = true;
244
-        add_filter('wp_trim_excerpt', array('EED_Event_Single', 'end_get_the_excerpt'), 999, 1);
245
-        return $excerpt;
246
-    }
247
-
248
-
249
-    /**
250
-     * end_get_the_excerpt
251
-     *
252
-     * @param  string $text
253
-     * @return string
254
-     */
255
-    public static function end_get_the_excerpt($text = '')
256
-    {
257
-        EED_Event_Single::$using_get_the_excerpt = false;
258
-        return $text;
259
-    }
260
-
261
-
262
-    /**
263
-     * event_details
264
-     *
265
-     * @param    string $content
266
-     * @return    string
267
-     */
268
-    public static function event_details($content)
269
-    {
270
-        global $post;
271
-        static $current_post_ID = 0;
272
-        if ($current_post_ID !== $post->ID
273
-            && $post->post_type === 'espresso_events'
274
-            && ! EED_Event_Single::$using_get_the_excerpt
275
-            && ! post_password_required()
276
-        ) {
277
-            // Set current post ID to prevent showing content twice, but only if headers have definitely been sent.
278
-            // Reason being is that some plugins, like Yoast, need to run through a copy of the loop early
279
-            // BEFORE headers are sent in order to examine the post content and generate content for the HTML header.
280
-            // We want to allow those plugins to still do their thing and have access to our content, but depending on
281
-            // how your event content is being displayed (shortcode, CPT route, etc), this filter can get applied twice,
282
-            // so the following allows this filter to be applied multiple times, but only once for real
283
-            $current_post_ID = did_action('loop_start') ? $post->ID : 0;
284
-            if (EE_Registry::instance()->CFG->template_settings->EED_Event_Single->use_sortable_display_order) {
285
-                // we need to first remove this callback from being applied to the_content()
286
-                // (otherwise it will recurse and blow up the interweb)
287
-                remove_filter(
288
-                    'the_content',
289
-                    array('EED_Event_Single', 'event_details'),
290
-                    EED_Event_Single::EVENT_DETAILS_PRIORITY
291
-                );
292
-                EED_Event_Single::instance()->template_parts = EED_Event_Single::instance()->initialize_template_parts(
293
-                );
294
-                $content = EEH_Template::locate_template('content-espresso_events-details.php');
295
-                $content = EED_Event_Single::instance()->template_parts->apply_template_part_filters($content);
296
-                add_filter(
297
-                    'the_content',
298
-                    array('EED_Event_Single', 'event_details'),
299
-                    EED_Event_Single::EVENT_DETAILS_PRIORITY
300
-                );
301
-            } else {
302
-                $content = EED_Event_Single::use_filterable_display_order();
303
-            }
304
-        }
305
-        return $content;
306
-    }
307
-
308
-
309
-    /**
310
-     * use_filterable_display_order
311
-     *
312
-     * @return string
313
-     */
314
-    protected static function use_filterable_display_order()
315
-    {
316
-        // since the 'content-espresso_events-details.php' template might be used directly from within a theme,
317
-        // it uses the_content() for displaying the $post->post_content
318
-        // so in order to load a template that uses the_content()
319
-        // from within a callback being used to filter the_content(),
320
-        // we need to first remove this callback from being applied to the_content()
321
-        // (otherwise it will recurse and blow up the interweb)
322
-        remove_filter(
323
-            'the_content',
324
-            array('EED_Event_Single', 'event_details'),
325
-            EED_Event_Single::EVENT_DETAILS_PRIORITY
326
-        );
327
-        // now add additional content
328
-        add_filter(
329
-            'the_content',
330
-            array('EED_Event_Single', 'event_datetimes'),
331
-            EED_Event_Single::EVENT_DATETIMES_PRIORITY,
332
-            1
333
-        );
334
-        add_filter(
335
-            'the_content',
336
-            array('EED_Event_Single', 'event_tickets'),
337
-            EED_Event_Single::EVENT_TICKETS_PRIORITY,
338
-            1
339
-        );
340
-        add_filter(
341
-            'the_content',
342
-            array('EED_Event_Single', 'event_venues'),
343
-            EED_Event_Single::EVENT_VENUES_PRIORITY,
344
-            1
345
-        );
346
-        do_action('AHEE__EED_Event_Single__use_filterable_display_order__after_add_filters');
347
-        // now load our template
348
-        $content = EEH_Template::locate_template('content-espresso_events-details.php');
349
-        // now add our filter back in, plus some others
350
-        add_filter(
351
-            'the_content',
352
-            array('EED_Event_Single', 'event_details'),
353
-            EED_Event_Single::EVENT_DETAILS_PRIORITY
354
-        );
355
-        remove_filter(
356
-            'the_content',
357
-            array('EED_Event_Single', 'event_datetimes'),
358
-            EED_Event_Single::EVENT_DATETIMES_PRIORITY
359
-        );
360
-        remove_filter(
361
-            'the_content',
362
-            array('EED_Event_Single', 'event_tickets'),
363
-            EED_Event_Single::EVENT_TICKETS_PRIORITY
364
-        );
365
-        remove_filter(
366
-            'the_content',
367
-            array('EED_Event_Single', 'event_venues'),
368
-            EED_Event_Single::EVENT_VENUES_PRIORITY
369
-        );
370
-        do_action('AHEE__EED_Event_Single__use_filterable_display_order__after_remove_filters');
371
-        // we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt)
372
-        return $content;
373
-    }
374
-
375
-
376
-    /**
377
-     * event_datetimes - adds datetimes ABOVE content
378
-     *
379
-     * @param        string $content
380
-     * @return        string
381
-     */
382
-    public static function event_datetimes($content)
383
-    {
384
-        return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
385
-    }
386
-
387
-
388
-    /**
389
-     * event_tickets - adds tickets ABOVE content (which includes datetimes)
390
-     *
391
-     * @param        string $content
392
-     * @return        string
393
-     */
394
-    public static function event_tickets($content)
395
-    {
396
-        return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
397
-    }
398
-
399
-
400
-    /**
401
-     * event_venues
402
-     *
403
-     * @param    string $content
404
-     * @return    string
405
-     */
406
-    public static function event_venue($content)
407
-    {
408
-        return EED_Event_Single::event_venues($content);
409
-    }
410
-
411
-
412
-    /**
413
-     * event_venues - adds venues BELOW content
414
-     *
415
-     * @param        string $content
416
-     * @return        string
417
-     */
418
-    public static function event_venues($content)
419
-    {
420
-        return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
421
-    }
422
-
423
-
424
-    /**
425
-     * loop_end
426
-     *
427
-     * @param        array $wp_query_array an array containing the WP_Query object
428
-     * @return        void
429
-     */
430
-    public static function loop_end($wp_query_array)
431
-    {
432
-        global $post;
433
-        do_action('AHEE_event_details_after_post', $post, $wp_query_array);
434
-    }
435
-
436
-
437
-    /**
438
-     * wp_enqueue_scripts
439
-     *
440
-     * @return    void
441
-     */
442
-    public function wp_enqueue_scripts()
443
-    {
444
-        // get some style
445
-        if (apply_filters('FHEE_enable_default_espresso_css', true)
446
-            && apply_filters('FHEE__EED_Event_Single__wp_enqueue_scripts__enable_css', true)
447
-        ) {
448
-            // first check uploads folder
449
-            if (is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
450
-                wp_register_style(
451
-                    $this->theme,
452
-                    get_stylesheet_directory_uri() . $this->theme . '/style.css',
453
-                    array('dashicons', 'espresso_default')
454
-                );
455
-            } else {
456
-                wp_register_style(
457
-                    $this->theme,
458
-                    EE_TEMPLATES_URL . $this->theme . '/style.css',
459
-                    array('dashicons', 'espresso_default')
460
-                );
461
-            }
462
-            wp_enqueue_script($this->theme);
463
-            if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
464
-                add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
465
-            }
466
-        }
467
-    }
468
-
469
-
470
-    /**
471
-     * display_venue
472
-     *
473
-     * @return    bool
474
-     */
475
-    public static function display_venue()
476
-    {
477
-        /** @type EE_Event_Single_Config $config */
478
-        $config = EED_Event_Single::instance()->config();
479
-        $display_venue = $config->display_venue === null ? true : $config->display_venue;
480
-        $venue_name = EEH_Venue_View::venue_name();
481
-        return $display_venue && ! empty($venue_name);
482
-    }
17
+	const EVENT_DETAILS_PRIORITY = 100;
18
+	const EVENT_DATETIMES_PRIORITY = 110;
19
+	const EVENT_TICKETS_PRIORITY = 120;
20
+	const EVENT_VENUES_PRIORITY = 130;
21
+
22
+	/**
23
+	 * @type bool $using_get_the_excerpt
24
+	 */
25
+	protected static $using_get_the_excerpt = false;
26
+
27
+
28
+	/**
29
+	 * @type EE_Template_Part_Manager $template_parts
30
+	 */
31
+	protected $template_parts;
32
+
33
+
34
+	/**
35
+	 * @return EED_Module|EED_Event_Single
36
+	 */
37
+	public static function instance()
38
+	{
39
+		return parent::get_instance(__CLASS__);
40
+	}
41
+
42
+
43
+	/**
44
+	 * set_hooks - for hooking into EE Core, other modules, etc
45
+	 *
46
+	 * @return void
47
+	 * @throws InvalidArgumentException
48
+	 * @throws InvalidDataTypeException
49
+	 * @throws InvalidInterfaceException
50
+	 */
51
+	public static function set_hooks()
52
+	{
53
+		add_filter('FHEE_run_EE_wp', '__return_true');
54
+		add_action('wp_loaded', array('EED_Event_Single', 'set_definitions'), 2);
55
+		/** @var EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions $custom_post_type_definitions */
56
+		$custom_post_type_definitions = LoaderFactory::getLoader()->getShared(
57
+			'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions'
58
+		);
59
+		$custom_post_types = $custom_post_type_definitions->getDefinitions();
60
+		EE_Config::register_route(
61
+			$custom_post_types['espresso_events']['singular_slug'],
62
+			'Event_Single',
63
+			'run'
64
+		);
65
+	}
66
+
67
+	/**
68
+	 * set_hooks_admin - for hooking into EE Admin Core, other modules, etc
69
+	 *
70
+	 * @return    void
71
+	 */
72
+	public static function set_hooks_admin()
73
+	{
74
+		add_action('wp_loaded', array('EED_Event_Single', 'set_definitions'), 2);
75
+	}
76
+
77
+
78
+	/**
79
+	 * set_definitions
80
+	 *
81
+	 * @static
82
+	 * @return void
83
+	 */
84
+	public static function set_definitions()
85
+	{
86
+		define('EVENT_SINGLE_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
87
+		define('EVENT_SINGLE_TEMPLATES_PATH', plugin_dir_path(__FILE__) . 'templates/');
88
+	}
89
+
90
+
91
+	/**
92
+	 * set_config
93
+	 *
94
+	 * @void
95
+	 */
96
+	protected function set_config()
97
+	{
98
+		$this->set_config_section('template_settings');
99
+		$this->set_config_class('EE_Event_Single_Config');
100
+		$this->set_config_name('EED_Event_Single');
101
+	}
102
+
103
+
104
+	/**
105
+	 * initialize_template_parts
106
+	 *
107
+	 * @param EE_Config_Base|EE_Event_Single_Config $config
108
+	 * @return EE_Template_Part_Manager
109
+	 */
110
+	public function initialize_template_parts(EE_Event_Single_Config $config = null)
111
+	{
112
+		/** @type EE_Event_Single_Config $config */
113
+		$config = $config instanceof EE_Event_Single_Config ? $config : $this->config();
114
+		EEH_Autoloader::instance()->register_template_part_autoloaders();
115
+		$template_parts = new EE_Template_Part_Manager();
116
+		$template_parts->add_template_part(
117
+			'tickets',
118
+			__('Ticket Selector', 'event_espresso'),
119
+			'content-espresso_events-tickets.php',
120
+			$config->display_order_tickets
121
+		);
122
+		$template_parts->add_template_part(
123
+			'datetimes',
124
+			__('Dates and Times', 'event_espresso'),
125
+			'content-espresso_events-datetimes.php',
126
+			$config->display_order_datetimes
127
+		);
128
+		$template_parts->add_template_part(
129
+			'event',
130
+			__('Event Description', 'event_espresso'),
131
+			'content-espresso_events-details.php',
132
+			$config->display_order_event
133
+		);
134
+		$template_parts->add_template_part(
135
+			'venue',
136
+			__('Venue Information', 'event_espresso'),
137
+			'content-espresso_events-venues.php',
138
+			$config->display_order_venue
139
+		);
140
+		do_action('AHEE__EED_Event_Single__initialize_template_parts', $template_parts);
141
+		return $template_parts;
142
+	}
143
+
144
+
145
+	/**
146
+	 * run - initial module setup
147
+	 *
148
+	 * @param WP $WP
149
+	 * @return    void
150
+	 */
151
+	public function run($WP)
152
+	{
153
+		// ensure valid EE_Events_Single_Config() object exists
154
+		$this->set_config();
155
+		// check what template is loaded
156
+		add_filter('template_include', array($this, 'template_include'), 999, 1);
157
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
158
+		// load css
159
+		add_action('wp_enqueue_scripts', array($this, 'wp_enqueue_scripts'), 10);
160
+	}
161
+
162
+
163
+	/**
164
+	 * template_include
165
+	 *
166
+	 * @param    string $template
167
+	 * @return    string
168
+	 */
169
+	public function template_include($template)
170
+	{
171
+		global $post;
172
+		/** @type EE_Event_Single_Config $config */
173
+		$config = $this->config();
174
+		if ($config->display_status_banner_single) {
175
+			add_filter('the_title', array('EED_Event_Single', 'the_title'), 100, 2);
176
+		}
177
+		// not a custom template?
178
+		if (! post_password_required($post)
179
+			&& (
180
+				apply_filters('FHEE__EED_Event_Single__template_include__allow_custom_selected_template', false)
181
+				|| EE_Registry::instance()
182
+							  ->load_core('Front_Controller')
183
+							  ->get_selected_template() !== 'single-espresso_events.php'
184
+			)
185
+
186
+		) {
187
+			EEH_Template::load_espresso_theme_functions();
188
+			// then add extra event data via hooks
189
+			add_action('loop_start', array('EED_Event_Single', 'loop_start'));
190
+			add_filter('get_the_excerpt', array('EED_Event_Single', 'get_the_excerpt'), 1, 1);
191
+			add_filter(
192
+				'the_content',
193
+				array('EED_Event_Single', 'event_details'),
194
+				EED_Event_Single::EVENT_DETAILS_PRIORITY
195
+			);
196
+			add_action('loop_end', array('EED_Event_Single', 'loop_end'));
197
+			// don't display entry meta because the existing theme will take car of that
198
+			add_filter('FHEE__content_espresso_events_details_template__display_entry_meta', '__return_false');
199
+		}
200
+		return $template;
201
+	}
202
+
203
+
204
+	/**
205
+	 * loop_start
206
+	 *
207
+	 * @param    array $wp_query_array an array containing the WP_Query object
208
+	 * @return    void
209
+	 */
210
+	public static function loop_start($wp_query_array)
211
+	{
212
+		global $post;
213
+		do_action('AHEE_event_details_before_post', $post, $wp_query_array);
214
+	}
215
+
216
+
217
+	/**
218
+	 * the_title
219
+	 *
220
+	 * @param    string $title
221
+	 * @param    int    $id
222
+	 * @return    string
223
+	 */
224
+	public static function the_title($title = '', $id = 0)
225
+	{
226
+		global $post;
227
+		return in_the_loop() && $post->ID === (int) $id
228
+			? espresso_event_status_banner($post->ID) . $title
229
+			: $title;
230
+	}
231
+
232
+
233
+	/**
234
+	 * get_the_excerpt
235
+	 * kinda hacky, but if a theme is using get_the_excerpt(),
236
+	 * then we need to remove our filters on the_content()
237
+	 *
238
+	 * @param        string $excerpt
239
+	 * @return        string
240
+	 */
241
+	public static function get_the_excerpt($excerpt = '')
242
+	{
243
+		EED_Event_Single::$using_get_the_excerpt = true;
244
+		add_filter('wp_trim_excerpt', array('EED_Event_Single', 'end_get_the_excerpt'), 999, 1);
245
+		return $excerpt;
246
+	}
247
+
248
+
249
+	/**
250
+	 * end_get_the_excerpt
251
+	 *
252
+	 * @param  string $text
253
+	 * @return string
254
+	 */
255
+	public static function end_get_the_excerpt($text = '')
256
+	{
257
+		EED_Event_Single::$using_get_the_excerpt = false;
258
+		return $text;
259
+	}
260
+
261
+
262
+	/**
263
+	 * event_details
264
+	 *
265
+	 * @param    string $content
266
+	 * @return    string
267
+	 */
268
+	public static function event_details($content)
269
+	{
270
+		global $post;
271
+		static $current_post_ID = 0;
272
+		if ($current_post_ID !== $post->ID
273
+			&& $post->post_type === 'espresso_events'
274
+			&& ! EED_Event_Single::$using_get_the_excerpt
275
+			&& ! post_password_required()
276
+		) {
277
+			// Set current post ID to prevent showing content twice, but only if headers have definitely been sent.
278
+			// Reason being is that some plugins, like Yoast, need to run through a copy of the loop early
279
+			// BEFORE headers are sent in order to examine the post content and generate content for the HTML header.
280
+			// We want to allow those plugins to still do their thing and have access to our content, but depending on
281
+			// how your event content is being displayed (shortcode, CPT route, etc), this filter can get applied twice,
282
+			// so the following allows this filter to be applied multiple times, but only once for real
283
+			$current_post_ID = did_action('loop_start') ? $post->ID : 0;
284
+			if (EE_Registry::instance()->CFG->template_settings->EED_Event_Single->use_sortable_display_order) {
285
+				// we need to first remove this callback from being applied to the_content()
286
+				// (otherwise it will recurse and blow up the interweb)
287
+				remove_filter(
288
+					'the_content',
289
+					array('EED_Event_Single', 'event_details'),
290
+					EED_Event_Single::EVENT_DETAILS_PRIORITY
291
+				);
292
+				EED_Event_Single::instance()->template_parts = EED_Event_Single::instance()->initialize_template_parts(
293
+				);
294
+				$content = EEH_Template::locate_template('content-espresso_events-details.php');
295
+				$content = EED_Event_Single::instance()->template_parts->apply_template_part_filters($content);
296
+				add_filter(
297
+					'the_content',
298
+					array('EED_Event_Single', 'event_details'),
299
+					EED_Event_Single::EVENT_DETAILS_PRIORITY
300
+				);
301
+			} else {
302
+				$content = EED_Event_Single::use_filterable_display_order();
303
+			}
304
+		}
305
+		return $content;
306
+	}
307
+
308
+
309
+	/**
310
+	 * use_filterable_display_order
311
+	 *
312
+	 * @return string
313
+	 */
314
+	protected static function use_filterable_display_order()
315
+	{
316
+		// since the 'content-espresso_events-details.php' template might be used directly from within a theme,
317
+		// it uses the_content() for displaying the $post->post_content
318
+		// so in order to load a template that uses the_content()
319
+		// from within a callback being used to filter the_content(),
320
+		// we need to first remove this callback from being applied to the_content()
321
+		// (otherwise it will recurse and blow up the interweb)
322
+		remove_filter(
323
+			'the_content',
324
+			array('EED_Event_Single', 'event_details'),
325
+			EED_Event_Single::EVENT_DETAILS_PRIORITY
326
+		);
327
+		// now add additional content
328
+		add_filter(
329
+			'the_content',
330
+			array('EED_Event_Single', 'event_datetimes'),
331
+			EED_Event_Single::EVENT_DATETIMES_PRIORITY,
332
+			1
333
+		);
334
+		add_filter(
335
+			'the_content',
336
+			array('EED_Event_Single', 'event_tickets'),
337
+			EED_Event_Single::EVENT_TICKETS_PRIORITY,
338
+			1
339
+		);
340
+		add_filter(
341
+			'the_content',
342
+			array('EED_Event_Single', 'event_venues'),
343
+			EED_Event_Single::EVENT_VENUES_PRIORITY,
344
+			1
345
+		);
346
+		do_action('AHEE__EED_Event_Single__use_filterable_display_order__after_add_filters');
347
+		// now load our template
348
+		$content = EEH_Template::locate_template('content-espresso_events-details.php');
349
+		// now add our filter back in, plus some others
350
+		add_filter(
351
+			'the_content',
352
+			array('EED_Event_Single', 'event_details'),
353
+			EED_Event_Single::EVENT_DETAILS_PRIORITY
354
+		);
355
+		remove_filter(
356
+			'the_content',
357
+			array('EED_Event_Single', 'event_datetimes'),
358
+			EED_Event_Single::EVENT_DATETIMES_PRIORITY
359
+		);
360
+		remove_filter(
361
+			'the_content',
362
+			array('EED_Event_Single', 'event_tickets'),
363
+			EED_Event_Single::EVENT_TICKETS_PRIORITY
364
+		);
365
+		remove_filter(
366
+			'the_content',
367
+			array('EED_Event_Single', 'event_venues'),
368
+			EED_Event_Single::EVENT_VENUES_PRIORITY
369
+		);
370
+		do_action('AHEE__EED_Event_Single__use_filterable_display_order__after_remove_filters');
371
+		// we're not returning the $content directly because the template we are loading uses the_content (or the_excerpt)
372
+		return $content;
373
+	}
374
+
375
+
376
+	/**
377
+	 * event_datetimes - adds datetimes ABOVE content
378
+	 *
379
+	 * @param        string $content
380
+	 * @return        string
381
+	 */
382
+	public static function event_datetimes($content)
383
+	{
384
+		return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
385
+	}
386
+
387
+
388
+	/**
389
+	 * event_tickets - adds tickets ABOVE content (which includes datetimes)
390
+	 *
391
+	 * @param        string $content
392
+	 * @return        string
393
+	 */
394
+	public static function event_tickets($content)
395
+	{
396
+		return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
397
+	}
398
+
399
+
400
+	/**
401
+	 * event_venues
402
+	 *
403
+	 * @param    string $content
404
+	 * @return    string
405
+	 */
406
+	public static function event_venue($content)
407
+	{
408
+		return EED_Event_Single::event_venues($content);
409
+	}
410
+
411
+
412
+	/**
413
+	 * event_venues - adds venues BELOW content
414
+	 *
415
+	 * @param        string $content
416
+	 * @return        string
417
+	 */
418
+	public static function event_venues($content)
419
+	{
420
+		return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
421
+	}
422
+
423
+
424
+	/**
425
+	 * loop_end
426
+	 *
427
+	 * @param        array $wp_query_array an array containing the WP_Query object
428
+	 * @return        void
429
+	 */
430
+	public static function loop_end($wp_query_array)
431
+	{
432
+		global $post;
433
+		do_action('AHEE_event_details_after_post', $post, $wp_query_array);
434
+	}
435
+
436
+
437
+	/**
438
+	 * wp_enqueue_scripts
439
+	 *
440
+	 * @return    void
441
+	 */
442
+	public function wp_enqueue_scripts()
443
+	{
444
+		// get some style
445
+		if (apply_filters('FHEE_enable_default_espresso_css', true)
446
+			&& apply_filters('FHEE__EED_Event_Single__wp_enqueue_scripts__enable_css', true)
447
+		) {
448
+			// first check uploads folder
449
+			if (is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
450
+				wp_register_style(
451
+					$this->theme,
452
+					get_stylesheet_directory_uri() . $this->theme . '/style.css',
453
+					array('dashicons', 'espresso_default')
454
+				);
455
+			} else {
456
+				wp_register_style(
457
+					$this->theme,
458
+					EE_TEMPLATES_URL . $this->theme . '/style.css',
459
+					array('dashicons', 'espresso_default')
460
+				);
461
+			}
462
+			wp_enqueue_script($this->theme);
463
+			if (EE_Registry::instance()->CFG->map_settings->use_google_maps) {
464
+				add_action('wp_enqueue_scripts', array('EEH_Maps', 'espresso_google_map_js'), 11);
465
+			}
466
+		}
467
+	}
468
+
469
+
470
+	/**
471
+	 * display_venue
472
+	 *
473
+	 * @return    bool
474
+	 */
475
+	public static function display_venue()
476
+	{
477
+		/** @type EE_Event_Single_Config $config */
478
+		$config = EED_Event_Single::instance()->config();
479
+		$display_venue = $config->display_venue === null ? true : $config->display_venue;
480
+		$venue_name = EEH_Venue_View::venue_name();
481
+		return $display_venue && ! empty($venue_name);
482
+	}
483 483
 }
484 484
 
485 485
 
@@ -491,5 +491,5 @@  discard block
 block discarded – undo
491 491
  */
492 492
 function espresso_display_venue_in_event_details()
493 493
 {
494
-    return EED_Event_Single::display_venue();
494
+	return EED_Event_Single::display_venue();
495 495
 }
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -83,8 +83,8 @@  discard block
 block discarded – undo
83 83
      */
84 84
     public static function set_definitions()
85 85
     {
86
-        define('EVENT_SINGLE_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
87
-        define('EVENT_SINGLE_TEMPLATES_PATH', plugin_dir_path(__FILE__) . 'templates/');
86
+        define('EVENT_SINGLE_ASSETS_URL', plugin_dir_url(__FILE__).'assets/');
87
+        define('EVENT_SINGLE_TEMPLATES_PATH', plugin_dir_path(__FILE__).'templates/');
88 88
     }
89 89
 
90 90
 
@@ -175,7 +175,7 @@  discard block
 block discarded – undo
175 175
             add_filter('the_title', array('EED_Event_Single', 'the_title'), 100, 2);
176 176
         }
177 177
         // not a custom template?
178
-        if (! post_password_required($post)
178
+        if ( ! post_password_required($post)
179 179
             && (
180 180
                 apply_filters('FHEE__EED_Event_Single__template_include__allow_custom_selected_template', false)
181 181
                 || EE_Registry::instance()
@@ -225,7 +225,7 @@  discard block
 block discarded – undo
225 225
     {
226 226
         global $post;
227 227
         return in_the_loop() && $post->ID === (int) $id
228
-            ? espresso_event_status_banner($post->ID) . $title
228
+            ? espresso_event_status_banner($post->ID).$title
229 229
             : $title;
230 230
     }
231 231
 
@@ -381,7 +381,7 @@  discard block
 block discarded – undo
381 381
      */
382 382
     public static function event_datetimes($content)
383 383
     {
384
-        return EEH_Template::locate_template('content-espresso_events-datetimes.php') . $content;
384
+        return EEH_Template::locate_template('content-espresso_events-datetimes.php').$content;
385 385
     }
386 386
 
387 387
 
@@ -393,7 +393,7 @@  discard block
 block discarded – undo
393 393
      */
394 394
     public static function event_tickets($content)
395 395
     {
396
-        return EEH_Template::locate_template('content-espresso_events-tickets.php') . $content;
396
+        return EEH_Template::locate_template('content-espresso_events-tickets.php').$content;
397 397
     }
398 398
 
399 399
 
@@ -417,7 +417,7 @@  discard block
 block discarded – undo
417 417
      */
418 418
     public static function event_venues($content)
419 419
     {
420
-        return $content . EEH_Template::locate_template('content-espresso_events-venues.php');
420
+        return $content.EEH_Template::locate_template('content-espresso_events-venues.php');
421 421
     }
422 422
 
423 423
 
@@ -446,16 +446,16 @@  discard block
 block discarded – undo
446 446
             && apply_filters('FHEE__EED_Event_Single__wp_enqueue_scripts__enable_css', true)
447 447
         ) {
448 448
             // first check uploads folder
449
-            if (is_readable(get_stylesheet_directory() . $this->theme . '/style.css')) {
449
+            if (is_readable(get_stylesheet_directory().$this->theme.'/style.css')) {
450 450
                 wp_register_style(
451 451
                     $this->theme,
452
-                    get_stylesheet_directory_uri() . $this->theme . '/style.css',
452
+                    get_stylesheet_directory_uri().$this->theme.'/style.css',
453 453
                     array('dashicons', 'espresso_default')
454 454
                 );
455 455
             } else {
456 456
                 wp_register_style(
457 457
                     $this->theme,
458
-                    EE_TEMPLATES_URL . $this->theme . '/style.css',
458
+                    EE_TEMPLATES_URL.$this->theme.'/style.css',
459 459
                     array('dashicons', 'espresso_default')
460 460
                 );
461 461
             }
Please login to merge, or discard this patch.
modules/batch/EED_Batch.module.php 2 patches
Indentation   +330 added lines, -330 removed lines patch added patch discarded remove patch
@@ -29,358 +29,358 @@
 block discarded – undo
29 29
 class EED_Batch extends EED_Module
30 30
 {
31 31
 
32
-    /**
33
-     * Possibly value for $_REQUEST[ 'batch' ]. Indicates to run a job that
34
-     * processes data only
35
-     */
36
-    const batch_job = 'job';
37
-    /**
38
-     * Possibly value for $_REQUEST[ 'batch' ]. Indicates to run a job that
39
-     * produces a file for download
40
-     */
41
-    const batch_file_job = 'file';
42
-    /**
43
-     * Possibly value for $_REQUEST[ 'batch' ]. Indicates this request is NOT
44
-     * for a batch job. It's the same as not providing the $_REQUEST[ 'batch' ]
45
-     * at all
46
-     */
47
-    const batch_not_job = 'none';
32
+	/**
33
+	 * Possibly value for $_REQUEST[ 'batch' ]. Indicates to run a job that
34
+	 * processes data only
35
+	 */
36
+	const batch_job = 'job';
37
+	/**
38
+	 * Possibly value for $_REQUEST[ 'batch' ]. Indicates to run a job that
39
+	 * produces a file for download
40
+	 */
41
+	const batch_file_job = 'file';
42
+	/**
43
+	 * Possibly value for $_REQUEST[ 'batch' ]. Indicates this request is NOT
44
+	 * for a batch job. It's the same as not providing the $_REQUEST[ 'batch' ]
45
+	 * at all
46
+	 */
47
+	const batch_not_job = 'none';
48 48
 
49
-    /**
50
-     *
51
-     * @var string 'file', or 'job', or false to indicate its not a batch request at all
52
-     */
53
-    protected $_batch_request_type = null;
49
+	/**
50
+	 *
51
+	 * @var string 'file', or 'job', or false to indicate its not a batch request at all
52
+	 */
53
+	protected $_batch_request_type = null;
54 54
 
55
-    /**
56
-     * Because we want to use the response in both the localized JS and in the body
57
-     * we need to make this response available between method calls
58
-     *
59
-     * @var \EventEspressoBatchRequest\Helpers\JobStepResponse
60
-     */
61
-    protected $_job_step_response = null;
55
+	/**
56
+	 * Because we want to use the response in both the localized JS and in the body
57
+	 * we need to make this response available between method calls
58
+	 *
59
+	 * @var \EventEspressoBatchRequest\Helpers\JobStepResponse
60
+	 */
61
+	protected $_job_step_response = null;
62 62
 
63
-    /**
64
-     * @var LoaderInterface
65
-     */
66
-    protected $loader;
63
+	/**
64
+	 * @var LoaderInterface
65
+	 */
66
+	protected $loader;
67 67
 
68
-    /**
69
-     * Gets the batch instance
70
-     *
71
-     * @return EED_Batch
72
-     */
73
-    public static function instance()
74
-    {
75
-        return self::get_instance();
76
-    }
68
+	/**
69
+	 * Gets the batch instance
70
+	 *
71
+	 * @return EED_Batch
72
+	 */
73
+	public static function instance()
74
+	{
75
+		return self::get_instance();
76
+	}
77 77
 
78
-    /**
79
-     * Sets hooks to enable batch jobs on the frontend. Disabled by default
80
-     * because it's an attack vector and there are currently no implementations
81
-     */
82
-    public static function set_hooks()
83
-    {
84
-        // because this is a possibel attack vector, let's have this disabled until
85
-        // we at least have a real use for it on the frontend
86
-        if (apply_filters('FHEE__EED_Batch__set_hooks__enable_frontend_batch', false)) {
87
-            add_action('wp_enqueue_scripts', array(self::instance(), 'enqueue_scripts'));
88
-            add_filter('template_include', array(self::instance(), 'override_template'), 99);
89
-        }
90
-    }
78
+	/**
79
+	 * Sets hooks to enable batch jobs on the frontend. Disabled by default
80
+	 * because it's an attack vector and there are currently no implementations
81
+	 */
82
+	public static function set_hooks()
83
+	{
84
+		// because this is a possibel attack vector, let's have this disabled until
85
+		// we at least have a real use for it on the frontend
86
+		if (apply_filters('FHEE__EED_Batch__set_hooks__enable_frontend_batch', false)) {
87
+			add_action('wp_enqueue_scripts', array(self::instance(), 'enqueue_scripts'));
88
+			add_filter('template_include', array(self::instance(), 'override_template'), 99);
89
+		}
90
+	}
91 91
 
92
-    /**
93
-     * Initializes some hooks for the admin in order to run batch jobs
94
-     */
95
-    public static function set_hooks_admin()
96
-    {
97
-        add_action('admin_menu', array(self::instance(), 'register_admin_pages'));
98
-        add_action('admin_enqueue_scripts', array(self::instance(), 'enqueue_scripts'));
92
+	/**
93
+	 * Initializes some hooks for the admin in order to run batch jobs
94
+	 */
95
+	public static function set_hooks_admin()
96
+	{
97
+		add_action('admin_menu', array(self::instance(), 'register_admin_pages'));
98
+		add_action('admin_enqueue_scripts', array(self::instance(), 'enqueue_scripts'));
99 99
 
100
-        // ajax
101
-        add_action('wp_ajax_espresso_batch_continue', array(self::instance(), 'batch_continue'));
102
-        add_action('wp_ajax_espresso_batch_cleanup', array(self::instance(), 'batch_cleanup'));
103
-        add_action('wp_ajax_nopriv_espresso_batch_continue', array(self::instance(), 'batch_continue'));
104
-        add_action('wp_ajax_nopriv_espresso_batch_cleanup', array(self::instance(), 'batch_cleanup'));
105
-    }
100
+		// ajax
101
+		add_action('wp_ajax_espresso_batch_continue', array(self::instance(), 'batch_continue'));
102
+		add_action('wp_ajax_espresso_batch_cleanup', array(self::instance(), 'batch_cleanup'));
103
+		add_action('wp_ajax_nopriv_espresso_batch_continue', array(self::instance(), 'batch_continue'));
104
+		add_action('wp_ajax_nopriv_espresso_batch_cleanup', array(self::instance(), 'batch_cleanup'));
105
+	}
106 106
 
107
-    /**
108
-     * @since 4.9.80.p
109
-     * @return LoaderInterface
110
-     * @throws InvalidArgumentException
111
-     * @throws InvalidDataTypeException
112
-     * @throws InvalidInterfaceException
113
-     */
114
-    protected function getLoader()
115
-    {
116
-        if (!$this->loader instanceof LoaderInterface) {
117
-            $this->loader = LoaderFactory::getLoader();
118
-        }
119
-        return $this->loader;
120
-    }
107
+	/**
108
+	 * @since 4.9.80.p
109
+	 * @return LoaderInterface
110
+	 * @throws InvalidArgumentException
111
+	 * @throws InvalidDataTypeException
112
+	 * @throws InvalidInterfaceException
113
+	 */
114
+	protected function getLoader()
115
+	{
116
+		if (!$this->loader instanceof LoaderInterface) {
117
+			$this->loader = LoaderFactory::getLoader();
118
+		}
119
+		return $this->loader;
120
+	}
121 121
 
122
-    /**
123
-     * Enqueues batch scripts on the frontend or admin, and creates a job
124
-     */
125
-    public function enqueue_scripts()
126
-    {
127
-        if (isset($_REQUEST['espresso_batch'])
128
-            ||
129
-            (
130
-                isset($_REQUEST['page'])
131
-                && $_REQUEST['page'] == 'espresso_batch'
132
-            )
133
-        ) {
134
-            if (! isset($_REQUEST['default_nonce']) || ! wp_verify_nonce($_REQUEST['default_nonce'], 'default_nonce')) {
135
-                wp_die(esc_html__('The link you clicked to start the batch job has expired. Please go back and refresh the previous page.', 'event_espresso'));
136
-            }
137
-            switch ($this->batch_request_type()) {
138
-                case self::batch_job:
139
-                    $this->enqueue_scripts_styles_batch_create();
140
-                    break;
141
-                case self::batch_file_job:
142
-                    $this->enqueue_scripts_styles_batch_file_create();
143
-                    break;
144
-            }
145
-        }
146
-    }
122
+	/**
123
+	 * Enqueues batch scripts on the frontend or admin, and creates a job
124
+	 */
125
+	public function enqueue_scripts()
126
+	{
127
+		if (isset($_REQUEST['espresso_batch'])
128
+			||
129
+			(
130
+				isset($_REQUEST['page'])
131
+				&& $_REQUEST['page'] == 'espresso_batch'
132
+			)
133
+		) {
134
+			if (! isset($_REQUEST['default_nonce']) || ! wp_verify_nonce($_REQUEST['default_nonce'], 'default_nonce')) {
135
+				wp_die(esc_html__('The link you clicked to start the batch job has expired. Please go back and refresh the previous page.', 'event_espresso'));
136
+			}
137
+			switch ($this->batch_request_type()) {
138
+				case self::batch_job:
139
+					$this->enqueue_scripts_styles_batch_create();
140
+					break;
141
+				case self::batch_file_job:
142
+					$this->enqueue_scripts_styles_batch_file_create();
143
+					break;
144
+			}
145
+		}
146
+	}
147 147
 
148
-    /**
149
-     * Create a batch job, enqueues a script to run it, and localizes some data for it
150
-     */
151
-    public function enqueue_scripts_styles_batch_create()
152
-    {
153
-        $job_response = $this->_enqueue_batch_job_scripts_and_styles_and_start_job();
154
-        wp_enqueue_script(
155
-            'batch_runner_init',
156
-            BATCH_URL . 'assets/batch_runner_init.js',
157
-            array('batch_runner'),
158
-            EVENT_ESPRESSO_VERSION,
159
-            true
160
-        );
161
-        wp_localize_script('batch_runner_init', 'ee_job_response', $job_response->to_array());
162
-        wp_localize_script(
163
-            'batch_runner_init',
164
-            'ee_job_i18n',
165
-            array(
166
-                'return_url' => $_REQUEST['return_url'],
167
-            )
168
-        );
169
-    }
148
+	/**
149
+	 * Create a batch job, enqueues a script to run it, and localizes some data for it
150
+	 */
151
+	public function enqueue_scripts_styles_batch_create()
152
+	{
153
+		$job_response = $this->_enqueue_batch_job_scripts_and_styles_and_start_job();
154
+		wp_enqueue_script(
155
+			'batch_runner_init',
156
+			BATCH_URL . 'assets/batch_runner_init.js',
157
+			array('batch_runner'),
158
+			EVENT_ESPRESSO_VERSION,
159
+			true
160
+		);
161
+		wp_localize_script('batch_runner_init', 'ee_job_response', $job_response->to_array());
162
+		wp_localize_script(
163
+			'batch_runner_init',
164
+			'ee_job_i18n',
165
+			array(
166
+				'return_url' => $_REQUEST['return_url'],
167
+			)
168
+		);
169
+	}
170 170
 
171
-    /**
172
-     * Creates a batch job which will download a file, enqueues a script to run the job, and localizes some data for it
173
-     */
174
-    public function enqueue_scripts_styles_batch_file_create()
175
-    {
176
-        // creates a job based on the request variable
177
-        $job_response = $this->_enqueue_batch_job_scripts_and_styles_and_start_job();
178
-        wp_enqueue_script(
179
-            'batch_file_runner_init',
180
-            BATCH_URL . 'assets/batch_file_runner_init.js',
181
-            array('batch_runner'),
182
-            EVENT_ESPRESSO_VERSION,
183
-            true
184
-        );
185
-        wp_localize_script('batch_file_runner_init', 'ee_job_response', $job_response->to_array());
186
-        wp_localize_script(
187
-            'batch_file_runner_init',
188
-            'ee_job_i18n',
189
-            array(
190
-                'download_and_redirecting' => sprintf(
191
-                    __('File Generation complete. Downloading, and %1$sredirecting%2$s...', 'event_espresso'),
192
-                    '<a href="' . $_REQUEST['return_url'] . '">',
193
-                    '</a>'
194
-                ),
195
-                'return_url'               => $_REQUEST['return_url'],
196
-            )
197
-        );
198
-    }
171
+	/**
172
+	 * Creates a batch job which will download a file, enqueues a script to run the job, and localizes some data for it
173
+	 */
174
+	public function enqueue_scripts_styles_batch_file_create()
175
+	{
176
+		// creates a job based on the request variable
177
+		$job_response = $this->_enqueue_batch_job_scripts_and_styles_and_start_job();
178
+		wp_enqueue_script(
179
+			'batch_file_runner_init',
180
+			BATCH_URL . 'assets/batch_file_runner_init.js',
181
+			array('batch_runner'),
182
+			EVENT_ESPRESSO_VERSION,
183
+			true
184
+		);
185
+		wp_localize_script('batch_file_runner_init', 'ee_job_response', $job_response->to_array());
186
+		wp_localize_script(
187
+			'batch_file_runner_init',
188
+			'ee_job_i18n',
189
+			array(
190
+				'download_and_redirecting' => sprintf(
191
+					__('File Generation complete. Downloading, and %1$sredirecting%2$s...', 'event_espresso'),
192
+					'<a href="' . $_REQUEST['return_url'] . '">',
193
+					'</a>'
194
+				),
195
+				'return_url'               => $_REQUEST['return_url'],
196
+			)
197
+		);
198
+	}
199 199
 
200
-    /**
201
-     * Enqueues scripts and styles common to any batch job, and creates
202
-     * a job from the request data, and stores the response in the
203
-     * $this->_job_step_response property
204
-     *
205
-     * @return \EventEspressoBatchRequest\Helpers\JobStepResponse
206
-     */
207
-    protected function _enqueue_batch_job_scripts_and_styles_and_start_job()
208
-    {
209
-        // just copy the bits of EE admin's eei18n that we need in the JS
210
-        EE_Registry::$i18n_js_strings['batchJobError'] =  esc_html__(
211
-            'An error occurred and the job has been stopped. Please refresh the page to try again.',
212
-            'event_espresso'
213
-        );
214
-        wp_register_script(
215
-            'progress_bar',
216
-            EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/progress_bar.js',
217
-            array('jquery'),
218
-            EVENT_ESPRESSO_VERSION,
219
-            true
220
-        );
221
-        wp_enqueue_style(
222
-            'progress_bar',
223
-            EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/progress_bar.css',
224
-            array(),
225
-            EVENT_ESPRESSO_VERSION
226
-        );
227
-        wp_enqueue_script(
228
-            'batch_runner',
229
-            EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/batch_runner.js',
230
-            array('progress_bar', CoreAssetManager::JS_HANDLE_CORE),
231
-            EVENT_ESPRESSO_VERSION,
232
-            true
233
-        );
234
-        $job_handler_classname = stripslashes($_GET['job_handler']);
235
-        $request_data = array_diff_key(
236
-            $_REQUEST,
237
-            array_flip(array('action', 'page', 'ee', 'batch'))
238
-        );
239
-        $batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
240
-        // eg 'EventEspressoBatchRequest\JobHandlers\RegistrationsReport'
241
-        $job_response = $batch_runner->create_job($job_handler_classname, $request_data);
242
-        // remember the response for later. We need it to display the page body
243
-        $this->_job_step_response = $job_response;
244
-        return $job_response;
245
-    }
200
+	/**
201
+	 * Enqueues scripts and styles common to any batch job, and creates
202
+	 * a job from the request data, and stores the response in the
203
+	 * $this->_job_step_response property
204
+	 *
205
+	 * @return \EventEspressoBatchRequest\Helpers\JobStepResponse
206
+	 */
207
+	protected function _enqueue_batch_job_scripts_and_styles_and_start_job()
208
+	{
209
+		// just copy the bits of EE admin's eei18n that we need in the JS
210
+		EE_Registry::$i18n_js_strings['batchJobError'] =  esc_html__(
211
+			'An error occurred and the job has been stopped. Please refresh the page to try again.',
212
+			'event_espresso'
213
+		);
214
+		wp_register_script(
215
+			'progress_bar',
216
+			EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/progress_bar.js',
217
+			array('jquery'),
218
+			EVENT_ESPRESSO_VERSION,
219
+			true
220
+		);
221
+		wp_enqueue_style(
222
+			'progress_bar',
223
+			EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/progress_bar.css',
224
+			array(),
225
+			EVENT_ESPRESSO_VERSION
226
+		);
227
+		wp_enqueue_script(
228
+			'batch_runner',
229
+			EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/batch_runner.js',
230
+			array('progress_bar', CoreAssetManager::JS_HANDLE_CORE),
231
+			EVENT_ESPRESSO_VERSION,
232
+			true
233
+		);
234
+		$job_handler_classname = stripslashes($_GET['job_handler']);
235
+		$request_data = array_diff_key(
236
+			$_REQUEST,
237
+			array_flip(array('action', 'page', 'ee', 'batch'))
238
+		);
239
+		$batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
240
+		// eg 'EventEspressoBatchRequest\JobHandlers\RegistrationsReport'
241
+		$job_response = $batch_runner->create_job($job_handler_classname, $request_data);
242
+		// remember the response for later. We need it to display the page body
243
+		$this->_job_step_response = $job_response;
244
+		return $job_response;
245
+	}
246 246
 
247
-    /**
248
-     * If we are doing a frontend batch job, this makes it so WP shows our template's HTML
249
-     *
250
-     * @param string $template
251
-     * @return string
252
-     */
253
-    public function override_template($template)
254
-    {
255
-        if (isset($_REQUEST['espresso_batch']) && isset($_REQUEST['batch'])) {
256
-            return EE_MODULES . 'batch/templates/batch_frontend_wrapper.template.html';
257
-        }
258
-        return $template;
259
-    }
247
+	/**
248
+	 * If we are doing a frontend batch job, this makes it so WP shows our template's HTML
249
+	 *
250
+	 * @param string $template
251
+	 * @return string
252
+	 */
253
+	public function override_template($template)
254
+	{
255
+		if (isset($_REQUEST['espresso_batch']) && isset($_REQUEST['batch'])) {
256
+			return EE_MODULES . 'batch/templates/batch_frontend_wrapper.template.html';
257
+		}
258
+		return $template;
259
+	}
260 260
 
261
-    /**
262
-     * Adds an admin page which doesn't appear in the admin menu
263
-     */
264
-    public function register_admin_pages()
265
-    {
266
-        add_submenu_page(
267
-            '', // parent slug. we don't want this to actually appear in the menu
268
-            __('Batch Job', 'event_espresso'), // page title
269
-            'n/a', // menu title
270
-            'read', // we want this page to actually be accessible to anyone,
271
-            'espresso_batch', // menu slug
272
-            array(self::instance(), 'show_admin_page')
273
-        );
274
-    }
261
+	/**
262
+	 * Adds an admin page which doesn't appear in the admin menu
263
+	 */
264
+	public function register_admin_pages()
265
+	{
266
+		add_submenu_page(
267
+			'', // parent slug. we don't want this to actually appear in the menu
268
+			__('Batch Job', 'event_espresso'), // page title
269
+			'n/a', // menu title
270
+			'read', // we want this page to actually be accessible to anyone,
271
+			'espresso_batch', // menu slug
272
+			array(self::instance(), 'show_admin_page')
273
+		);
274
+	}
275 275
 
276
-    /**
277
-     * Renders the admin page, after most of the work was already done during enqueuing scripts
278
-     * of creating the job and localizing some data
279
-     */
280
-    public function show_admin_page()
281
-    {
282
-        echo EEH_Template::locate_template(
283
-            EE_MODULES . 'batch/templates/batch_wrapper.template.html',
284
-            array('batch_request_type' => $this->batch_request_type())
285
-        );
286
-    }
276
+	/**
277
+	 * Renders the admin page, after most of the work was already done during enqueuing scripts
278
+	 * of creating the job and localizing some data
279
+	 */
280
+	public function show_admin_page()
281
+	{
282
+		echo EEH_Template::locate_template(
283
+			EE_MODULES . 'batch/templates/batch_wrapper.template.html',
284
+			array('batch_request_type' => $this->batch_request_type())
285
+		);
286
+	}
287 287
 
288
-    /**
289
-     * Receives ajax calls for continuing a job
290
-     */
291
-    public function batch_continue()
292
-    {
293
-        $job_id = sanitize_text_field($_REQUEST['job_id']);
294
-        $batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
295
-        $response_obj = $batch_runner->continue_job($job_id);
296
-        $this->_return_json($response_obj->to_array());
297
-    }
288
+	/**
289
+	 * Receives ajax calls for continuing a job
290
+	 */
291
+	public function batch_continue()
292
+	{
293
+		$job_id = sanitize_text_field($_REQUEST['job_id']);
294
+		$batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
295
+		$response_obj = $batch_runner->continue_job($job_id);
296
+		$this->_return_json($response_obj->to_array());
297
+	}
298 298
 
299
-    /**
300
-     * Receives the ajax call to cleanup a job
301
-     *
302
-     * @return type
303
-     */
304
-    public function batch_cleanup()
305
-    {
306
-        $job_id = sanitize_text_field($_REQUEST['job_id']);
307
-        $batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
308
-        $response_obj = $batch_runner->cleanup_job($job_id);
309
-        $this->_return_json($response_obj->to_array());
310
-    }
299
+	/**
300
+	 * Receives the ajax call to cleanup a job
301
+	 *
302
+	 * @return type
303
+	 */
304
+	public function batch_cleanup()
305
+	{
306
+		$job_id = sanitize_text_field($_REQUEST['job_id']);
307
+		$batch_runner = $this->getLoader()->getShared('EventEspressoBatchRequest\BatchRequestProcessor');
308
+		$response_obj = $batch_runner->cleanup_job($job_id);
309
+		$this->_return_json($response_obj->to_array());
310
+	}
311 311
 
312 312
 
313
-    /**
314
-     * Returns a json response
315
-     *
316
-     * @param array $data The data we want to send echo via in the JSON response's "data" element
317
-     *
318
-     * The returned json object is created from an array in the following format:
319
-     * array(
320
-     *    'notices' => '', // - contains any EE_Error formatted notices
321
-     *    'data' => array() //this can be any key/value pairs that a method returns for later json parsing by the js.
322
-     *    We're also going to include the template args with every package (so js can pick out any specific template
323
-     *    args that might be included in here)
324
-     *    'isEEajax' => true,//indicates this is a response from EE
325
-     * )
326
-     */
327
-    protected function _return_json($data)
328
-    {
329
-        $json = array(
330
-            'notices'  => EE_Error::get_notices(),
331
-            'data'     => $data,
332
-            'isEEajax' => true
333
-            // special flag so any ajax.Success methods in js can identify this return package as a EEajax package.
334
-        );
313
+	/**
314
+	 * Returns a json response
315
+	 *
316
+	 * @param array $data The data we want to send echo via in the JSON response's "data" element
317
+	 *
318
+	 * The returned json object is created from an array in the following format:
319
+	 * array(
320
+	 *    'notices' => '', // - contains any EE_Error formatted notices
321
+	 *    'data' => array() //this can be any key/value pairs that a method returns for later json parsing by the js.
322
+	 *    We're also going to include the template args with every package (so js can pick out any specific template
323
+	 *    args that might be included in here)
324
+	 *    'isEEajax' => true,//indicates this is a response from EE
325
+	 * )
326
+	 */
327
+	protected function _return_json($data)
328
+	{
329
+		$json = array(
330
+			'notices'  => EE_Error::get_notices(),
331
+			'data'     => $data,
332
+			'isEEajax' => true
333
+			// special flag so any ajax.Success methods in js can identify this return package as a EEajax package.
334
+		);
335 335
 
336 336
 
337
-        // make sure there are no php errors or headers_sent.  Then we can set correct json header.
338
-        if (null === error_get_last() || ! headers_sent()) {
339
-            header('Content-Type: application/json; charset=UTF-8');
340
-        }
341
-        echo wp_json_encode($json);
342
-        exit();
343
-    }
337
+		// make sure there are no php errors or headers_sent.  Then we can set correct json header.
338
+		if (null === error_get_last() || ! headers_sent()) {
339
+			header('Content-Type: application/json; charset=UTF-8');
340
+		}
341
+		echo wp_json_encode($json);
342
+		exit();
343
+	}
344 344
 
345
-    /**
346
-     * Gets the job step response which was done during the enqueuing of scripts
347
-     *
348
-     * @return \EventEspressoBatchRequest\Helpers\JobStepResponse
349
-     */
350
-    public function job_step_response()
351
-    {
352
-        return $this->_job_step_response;
353
-    }
345
+	/**
346
+	 * Gets the job step response which was done during the enqueuing of scripts
347
+	 *
348
+	 * @return \EventEspressoBatchRequest\Helpers\JobStepResponse
349
+	 */
350
+	public function job_step_response()
351
+	{
352
+		return $this->_job_step_response;
353
+	}
354 354
 
355
-    /**
356
-     * Gets the batch request type indicated in the $_REQUEST
357
-     *
358
-     * @return string: EED_Batch::batch_job, EED_Batch::batch_file_job, EED_Batch::batch_not_job
359
-     */
360
-    public function batch_request_type()
361
-    {
362
-        if ($this->_batch_request_type === null) {
363
-            if (isset($_GET['batch'])) {
364
-                if ($_GET['batch'] == self::batch_job) {
365
-                    $this->_batch_request_type = self::batch_job;
366
-                } elseif ($_GET['batch'] == self::batch_file_job) {
367
-                    $this->_batch_request_type = self::batch_file_job;
368
-                }
369
-            }
370
-            // if we didn't find that it was a batch request, indicate it wasn't
371
-            if ($this->_batch_request_type === null) {
372
-                $this->_batch_request_type = self::batch_not_job;
373
-            }
374
-        }
375
-        return $this->_batch_request_type;
376
-    }
355
+	/**
356
+	 * Gets the batch request type indicated in the $_REQUEST
357
+	 *
358
+	 * @return string: EED_Batch::batch_job, EED_Batch::batch_file_job, EED_Batch::batch_not_job
359
+	 */
360
+	public function batch_request_type()
361
+	{
362
+		if ($this->_batch_request_type === null) {
363
+			if (isset($_GET['batch'])) {
364
+				if ($_GET['batch'] == self::batch_job) {
365
+					$this->_batch_request_type = self::batch_job;
366
+				} elseif ($_GET['batch'] == self::batch_file_job) {
367
+					$this->_batch_request_type = self::batch_file_job;
368
+				}
369
+			}
370
+			// if we didn't find that it was a batch request, indicate it wasn't
371
+			if ($this->_batch_request_type === null) {
372
+				$this->_batch_request_type = self::batch_not_job;
373
+			}
374
+		}
375
+		return $this->_batch_request_type;
376
+	}
377 377
 
378
-    /**
379
-     * Unnecessary
380
-     *
381
-     * @param type $WP
382
-     */
383
-    public function run($WP)
384
-    {
385
-    }
378
+	/**
379
+	 * Unnecessary
380
+	 *
381
+	 * @param type $WP
382
+	 */
383
+	public function run($WP)
384
+	{
385
+	}
386 386
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -113,7 +113,7 @@  discard block
 block discarded – undo
113 113
      */
114 114
     protected function getLoader()
115 115
     {
116
-        if (!$this->loader instanceof LoaderInterface) {
116
+        if ( ! $this->loader instanceof LoaderInterface) {
117 117
             $this->loader = LoaderFactory::getLoader();
118 118
         }
119 119
         return $this->loader;
@@ -131,7 +131,7 @@  discard block
 block discarded – undo
131 131
                 && $_REQUEST['page'] == 'espresso_batch'
132 132
             )
133 133
         ) {
134
-            if (! isset($_REQUEST['default_nonce']) || ! wp_verify_nonce($_REQUEST['default_nonce'], 'default_nonce')) {
134
+            if ( ! isset($_REQUEST['default_nonce']) || ! wp_verify_nonce($_REQUEST['default_nonce'], 'default_nonce')) {
135 135
                 wp_die(esc_html__('The link you clicked to start the batch job has expired. Please go back and refresh the previous page.', 'event_espresso'));
136 136
             }
137 137
             switch ($this->batch_request_type()) {
@@ -153,7 +153,7 @@  discard block
 block discarded – undo
153 153
         $job_response = $this->_enqueue_batch_job_scripts_and_styles_and_start_job();
154 154
         wp_enqueue_script(
155 155
             'batch_runner_init',
156
-            BATCH_URL . 'assets/batch_runner_init.js',
156
+            BATCH_URL.'assets/batch_runner_init.js',
157 157
             array('batch_runner'),
158 158
             EVENT_ESPRESSO_VERSION,
159 159
             true
@@ -177,7 +177,7 @@  discard block
 block discarded – undo
177 177
         $job_response = $this->_enqueue_batch_job_scripts_and_styles_and_start_job();
178 178
         wp_enqueue_script(
179 179
             'batch_file_runner_init',
180
-            BATCH_URL . 'assets/batch_file_runner_init.js',
180
+            BATCH_URL.'assets/batch_file_runner_init.js',
181 181
             array('batch_runner'),
182 182
             EVENT_ESPRESSO_VERSION,
183 183
             true
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
             array(
190 190
                 'download_and_redirecting' => sprintf(
191 191
                     __('File Generation complete. Downloading, and %1$sredirecting%2$s...', 'event_espresso'),
192
-                    '<a href="' . $_REQUEST['return_url'] . '">',
192
+                    '<a href="'.$_REQUEST['return_url'].'">',
193 193
                     '</a>'
194 194
                 ),
195 195
                 'return_url'               => $_REQUEST['return_url'],
@@ -207,26 +207,26 @@  discard block
 block discarded – undo
207 207
     protected function _enqueue_batch_job_scripts_and_styles_and_start_job()
208 208
     {
209 209
         // just copy the bits of EE admin's eei18n that we need in the JS
210
-        EE_Registry::$i18n_js_strings['batchJobError'] =  esc_html__(
210
+        EE_Registry::$i18n_js_strings['batchJobError'] = esc_html__(
211 211
             'An error occurred and the job has been stopped. Please refresh the page to try again.',
212 212
             'event_espresso'
213 213
         );
214 214
         wp_register_script(
215 215
             'progress_bar',
216
-            EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/progress_bar.js',
216
+            EE_PLUGIN_DIR_URL.'core/libraries/batch/Assets/progress_bar.js',
217 217
             array('jquery'),
218 218
             EVENT_ESPRESSO_VERSION,
219 219
             true
220 220
         );
221 221
         wp_enqueue_style(
222 222
             'progress_bar',
223
-            EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/progress_bar.css',
223
+            EE_PLUGIN_DIR_URL.'core/libraries/batch/Assets/progress_bar.css',
224 224
             array(),
225 225
             EVENT_ESPRESSO_VERSION
226 226
         );
227 227
         wp_enqueue_script(
228 228
             'batch_runner',
229
-            EE_PLUGIN_DIR_URL . 'core/libraries/batch/Assets/batch_runner.js',
229
+            EE_PLUGIN_DIR_URL.'core/libraries/batch/Assets/batch_runner.js',
230 230
             array('progress_bar', CoreAssetManager::JS_HANDLE_CORE),
231 231
             EVENT_ESPRESSO_VERSION,
232 232
             true
@@ -253,7 +253,7 @@  discard block
 block discarded – undo
253 253
     public function override_template($template)
254 254
     {
255 255
         if (isset($_REQUEST['espresso_batch']) && isset($_REQUEST['batch'])) {
256
-            return EE_MODULES . 'batch/templates/batch_frontend_wrapper.template.html';
256
+            return EE_MODULES.'batch/templates/batch_frontend_wrapper.template.html';
257 257
         }
258 258
         return $template;
259 259
     }
@@ -280,7 +280,7 @@  discard block
 block discarded – undo
280 280
     public function show_admin_page()
281 281
     {
282 282
         echo EEH_Template::locate_template(
283
-            EE_MODULES . 'batch/templates/batch_wrapper.template.html',
283
+            EE_MODULES.'batch/templates/batch_wrapper.template.html',
284 284
             array('batch_request_type' => $this->batch_request_type())
285 285
         );
286 286
     }
Please login to merge, or discard this patch.
modules/feeds/EED_Feeds.module.php 2 patches
Indentation   +213 added lines, -213 removed lines patch added patch discarded remove patch
@@ -12,217 +12,217 @@
 block discarded – undo
12 12
 {
13 13
 
14 14
 
15
-    /**
16
-     * @return EED_Feeds
17
-     */
18
-    public static function instance()
19
-    {
20
-        return parent::get_instance(__CLASS__);
21
-    }
22
-
23
-
24
-    /**
25
-     *    set_hooks - for hooking into EE Core, other modules, etc
26
-     *
27
-     * @access    public
28
-     * @return    void
29
-     */
30
-    public static function set_hooks()
31
-    {
32
-        add_action('parse_request', array('EED_Feeds', 'parse_request'), 10);
33
-        add_filter('default_feed', array('EED_Feeds', 'default_feed'), 10, 1);
34
-        add_filter('comment_feed_join', array('EED_Feeds', 'comment_feed_join'), 10, 2);
35
-        add_filter('comment_feed_where', array('EED_Feeds', 'comment_feed_where'), 10, 2);
36
-    }
37
-
38
-    /**
39
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
40
-     *
41
-     * @access    public
42
-     * @return    void
43
-     */
44
-    public static function set_hooks_admin()
45
-    {
46
-    }
47
-
48
-
49
-    /**
50
-     *    run - initial module setup
51
-     *
52
-     * @access    public
53
-     * @return    void
54
-     */
55
-    public function run($WP)
56
-    {
57
-    }
58
-
59
-
60
-    /**
61
-     *    default_feed
62
-     *
63
-     * @access    public
64
-     * @param    type    rss2, atom, rss, rdf, rssjs
65
-     * @return    string
66
-     */
67
-    public static function default_feed($type = 'rss2')
68
-    {
69
-        // rss2, atom, rss, rdf, rssjs
70
-        $type = 'rss2';
71
-        return $type;
72
-    }
73
-
74
-
75
-    /**
76
-     *    parse_request
77
-     *
78
-     * @access    public
79
-     * @return    void
80
-     */
81
-    public static function parse_request()
82
-    {
83
-        if (EE_Registry::instance()->REQ->is_set('post_type')) {
84
-            // define path to templates
85
-            define('RSS_FEEDS_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/');
86
-            // what kinda post_type are we dealing with ?
87
-            switch (EE_Registry::instance()->REQ->get('post_type')) {
88
-                case 'espresso_events':
89
-                    // for rss2, atom, rss, rdf
90
-                    add_filter('the_excerpt_rss', array('EED_Feeds', 'the_event_feed'), 10, 1);
91
-                    add_filter('the_content_feed', array('EED_Feeds', 'the_event_feed'), 10, 1);
92
-                    // for json ( also uses the above filter )
93
-                    add_filter('rssjs_feed_item', array('EED_Feeds', 'the_event_rssjs_feed'), 10, 1);
94
-                    break;
95
-                case 'espresso_venues':
96
-                    // for rss2, atom, rss, rdf
97
-                    add_filter('the_excerpt_rss', array('EED_Feeds', 'the_venue_feed'), 10, 1);
98
-                    add_filter('the_content_feed', array('EED_Feeds', 'the_venue_feed'), 10, 1);
99
-                    // for json ( also uses the above filter )
100
-                    add_filter('rssjs_feed_item', array('EED_Feeds', 'the_venue_rssjs_feed'), 10, 1);
101
-                    break;
102
-            }
103
-        }
104
-    }
105
-
106
-
107
-    /**
108
-     *    comment_feed_join - EVEN THOUGH... our espresso_attendees custom post type is set to NOT PUBLIC
109
-     *    WordPress thought it would be a good idea to display the comments for them in the RSS feeds... we think NOT
110
-     *    so this little snippet of SQL taps into the comment feed query and removes comments for the
111
-     *    espresso_attendees post_type
112
-     *
113
-     * @access    public
114
-     * @param    string $SQL the JOIN clause for the comment feed query
115
-     * @return    void
116
-     */
117
-    public static function comment_feed_join($SQL)
118
-    {
119
-        global $wpdb;
120
-        // check for wp_posts table in JOIN clause
121
-        if (strpos($SQL, $wpdb->posts) !== false) {
122
-            add_filter('EED_Feeds__comment_feed_where__espresso_attendees', '__return_true');
123
-        }
124
-        return $SQL;
125
-    }
126
-
127
-
128
-    /**
129
-     *    comment_feed_where - EVEN THOUGH... our espresso_attendees custom post type is set to NOT PUBLIC
130
-     *    WordPress thought it would be a good idea to display the comments for them in the RSS feeds... we think NOT
131
-     *    so this little snippet of SQL taps into the comment feed query and removes comments for the
132
-     *    espresso_attendees post_type
133
-     *
134
-     * @access    public
135
-     * @param    string $SQL the WHERE clause for the comment feed query
136
-     * @return    void
137
-     */
138
-    public static function comment_feed_where($SQL)
139
-    {
140
-        global $wp_query, $wpdb;
141
-        if ($wp_query->is_comment_feed && apply_filters('EED_Feeds__comment_feed_where__espresso_attendees', false)) {
142
-            $SQL .= " AND $wpdb->posts.post_type != 'espresso_attendees'";
143
-        }
144
-        return $SQL;
145
-    }
146
-
147
-
148
-    /**
149
-     *    the_event_feed
150
-     *
151
-     * @access    public
152
-     * @param    string $content
153
-     * @return    void
154
-     */
155
-    public static function the_event_feed($content)
156
-    {
157
-        if (is_feed() && is_readable(RSS_FEEDS_TEMPLATES_PATH . 'espresso_events_feed.template.php')) {
158
-            global $post;
159
-            $template_args = array(
160
-                'EVT_ID'            => $post->ID,
161
-                'event_description' => get_option('rss_use_excerpt') ? $post->post_excerpt : $post->post_content,
162
-            );
163
-            $content = EEH_Template::display_template(
164
-                RSS_FEEDS_TEMPLATES_PATH . 'espresso_events_feed.template.php',
165
-                $template_args,
166
-                true
167
-            );
168
-        }
169
-        return $content;
170
-    }
171
-
172
-
173
-    /**
174
-     *    the_event_rssjs_feed
175
-     *
176
-     * @access    public
177
-     * @param    object $item
178
-     * @return    void
179
-     */
180
-    public static function the_event_rssjs_feed($item)
181
-    {
182
-        if (is_feed() && isset($item->description)) {
183
-            $item->description = EED_Feeds::the_event_feed($item->description);
184
-        }
185
-        return $item;
186
-    }
187
-
188
-
189
-    /**
190
-     *    the_venue_feed
191
-     *
192
-     * @access    public
193
-     * @param    string $content
194
-     * @return    void
195
-     */
196
-    public static function the_venue_feed($content)
197
-    {
198
-        if (is_feed() && is_readable(RSS_FEEDS_TEMPLATES_PATH . 'espresso_venues_feed.template.php')) {
199
-            global $post;
200
-            $template_args = array(
201
-                'VNU_ID'            => $post->ID,
202
-                'venue_description' => get_option('rss_use_excerpt') ? $post->post_excerpt : $post->post_content,
203
-            );
204
-            $content = EEH_Template::display_template(
205
-                RSS_FEEDS_TEMPLATES_PATH . 'espresso_venues_feed.template.php',
206
-                $template_args,
207
-                true
208
-            );
209
-        }
210
-        return $content;
211
-    }
212
-
213
-
214
-    /**
215
-     *    the_venue_rssjs_feed
216
-     *
217
-     * @access    public
218
-     * @param    object $item
219
-     * @return    void
220
-     */
221
-    public static function the_venue_rssjs_feed($item)
222
-    {
223
-        if (is_feed() && isset($item->description)) {
224
-            $item->description = EED_Feeds::the_venue_feed($item->description);
225
-        }
226
-        return $item;
227
-    }
15
+	/**
16
+	 * @return EED_Feeds
17
+	 */
18
+	public static function instance()
19
+	{
20
+		return parent::get_instance(__CLASS__);
21
+	}
22
+
23
+
24
+	/**
25
+	 *    set_hooks - for hooking into EE Core, other modules, etc
26
+	 *
27
+	 * @access    public
28
+	 * @return    void
29
+	 */
30
+	public static function set_hooks()
31
+	{
32
+		add_action('parse_request', array('EED_Feeds', 'parse_request'), 10);
33
+		add_filter('default_feed', array('EED_Feeds', 'default_feed'), 10, 1);
34
+		add_filter('comment_feed_join', array('EED_Feeds', 'comment_feed_join'), 10, 2);
35
+		add_filter('comment_feed_where', array('EED_Feeds', 'comment_feed_where'), 10, 2);
36
+	}
37
+
38
+	/**
39
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
40
+	 *
41
+	 * @access    public
42
+	 * @return    void
43
+	 */
44
+	public static function set_hooks_admin()
45
+	{
46
+	}
47
+
48
+
49
+	/**
50
+	 *    run - initial module setup
51
+	 *
52
+	 * @access    public
53
+	 * @return    void
54
+	 */
55
+	public function run($WP)
56
+	{
57
+	}
58
+
59
+
60
+	/**
61
+	 *    default_feed
62
+	 *
63
+	 * @access    public
64
+	 * @param    type    rss2, atom, rss, rdf, rssjs
65
+	 * @return    string
66
+	 */
67
+	public static function default_feed($type = 'rss2')
68
+	{
69
+		// rss2, atom, rss, rdf, rssjs
70
+		$type = 'rss2';
71
+		return $type;
72
+	}
73
+
74
+
75
+	/**
76
+	 *    parse_request
77
+	 *
78
+	 * @access    public
79
+	 * @return    void
80
+	 */
81
+	public static function parse_request()
82
+	{
83
+		if (EE_Registry::instance()->REQ->is_set('post_type')) {
84
+			// define path to templates
85
+			define('RSS_FEEDS_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/');
86
+			// what kinda post_type are we dealing with ?
87
+			switch (EE_Registry::instance()->REQ->get('post_type')) {
88
+				case 'espresso_events':
89
+					// for rss2, atom, rss, rdf
90
+					add_filter('the_excerpt_rss', array('EED_Feeds', 'the_event_feed'), 10, 1);
91
+					add_filter('the_content_feed', array('EED_Feeds', 'the_event_feed'), 10, 1);
92
+					// for json ( also uses the above filter )
93
+					add_filter('rssjs_feed_item', array('EED_Feeds', 'the_event_rssjs_feed'), 10, 1);
94
+					break;
95
+				case 'espresso_venues':
96
+					// for rss2, atom, rss, rdf
97
+					add_filter('the_excerpt_rss', array('EED_Feeds', 'the_venue_feed'), 10, 1);
98
+					add_filter('the_content_feed', array('EED_Feeds', 'the_venue_feed'), 10, 1);
99
+					// for json ( also uses the above filter )
100
+					add_filter('rssjs_feed_item', array('EED_Feeds', 'the_venue_rssjs_feed'), 10, 1);
101
+					break;
102
+			}
103
+		}
104
+	}
105
+
106
+
107
+	/**
108
+	 *    comment_feed_join - EVEN THOUGH... our espresso_attendees custom post type is set to NOT PUBLIC
109
+	 *    WordPress thought it would be a good idea to display the comments for them in the RSS feeds... we think NOT
110
+	 *    so this little snippet of SQL taps into the comment feed query and removes comments for the
111
+	 *    espresso_attendees post_type
112
+	 *
113
+	 * @access    public
114
+	 * @param    string $SQL the JOIN clause for the comment feed query
115
+	 * @return    void
116
+	 */
117
+	public static function comment_feed_join($SQL)
118
+	{
119
+		global $wpdb;
120
+		// check for wp_posts table in JOIN clause
121
+		if (strpos($SQL, $wpdb->posts) !== false) {
122
+			add_filter('EED_Feeds__comment_feed_where__espresso_attendees', '__return_true');
123
+		}
124
+		return $SQL;
125
+	}
126
+
127
+
128
+	/**
129
+	 *    comment_feed_where - EVEN THOUGH... our espresso_attendees custom post type is set to NOT PUBLIC
130
+	 *    WordPress thought it would be a good idea to display the comments for them in the RSS feeds... we think NOT
131
+	 *    so this little snippet of SQL taps into the comment feed query and removes comments for the
132
+	 *    espresso_attendees post_type
133
+	 *
134
+	 * @access    public
135
+	 * @param    string $SQL the WHERE clause for the comment feed query
136
+	 * @return    void
137
+	 */
138
+	public static function comment_feed_where($SQL)
139
+	{
140
+		global $wp_query, $wpdb;
141
+		if ($wp_query->is_comment_feed && apply_filters('EED_Feeds__comment_feed_where__espresso_attendees', false)) {
142
+			$SQL .= " AND $wpdb->posts.post_type != 'espresso_attendees'";
143
+		}
144
+		return $SQL;
145
+	}
146
+
147
+
148
+	/**
149
+	 *    the_event_feed
150
+	 *
151
+	 * @access    public
152
+	 * @param    string $content
153
+	 * @return    void
154
+	 */
155
+	public static function the_event_feed($content)
156
+	{
157
+		if (is_feed() && is_readable(RSS_FEEDS_TEMPLATES_PATH . 'espresso_events_feed.template.php')) {
158
+			global $post;
159
+			$template_args = array(
160
+				'EVT_ID'            => $post->ID,
161
+				'event_description' => get_option('rss_use_excerpt') ? $post->post_excerpt : $post->post_content,
162
+			);
163
+			$content = EEH_Template::display_template(
164
+				RSS_FEEDS_TEMPLATES_PATH . 'espresso_events_feed.template.php',
165
+				$template_args,
166
+				true
167
+			);
168
+		}
169
+		return $content;
170
+	}
171
+
172
+
173
+	/**
174
+	 *    the_event_rssjs_feed
175
+	 *
176
+	 * @access    public
177
+	 * @param    object $item
178
+	 * @return    void
179
+	 */
180
+	public static function the_event_rssjs_feed($item)
181
+	{
182
+		if (is_feed() && isset($item->description)) {
183
+			$item->description = EED_Feeds::the_event_feed($item->description);
184
+		}
185
+		return $item;
186
+	}
187
+
188
+
189
+	/**
190
+	 *    the_venue_feed
191
+	 *
192
+	 * @access    public
193
+	 * @param    string $content
194
+	 * @return    void
195
+	 */
196
+	public static function the_venue_feed($content)
197
+	{
198
+		if (is_feed() && is_readable(RSS_FEEDS_TEMPLATES_PATH . 'espresso_venues_feed.template.php')) {
199
+			global $post;
200
+			$template_args = array(
201
+				'VNU_ID'            => $post->ID,
202
+				'venue_description' => get_option('rss_use_excerpt') ? $post->post_excerpt : $post->post_content,
203
+			);
204
+			$content = EEH_Template::display_template(
205
+				RSS_FEEDS_TEMPLATES_PATH . 'espresso_venues_feed.template.php',
206
+				$template_args,
207
+				true
208
+			);
209
+		}
210
+		return $content;
211
+	}
212
+
213
+
214
+	/**
215
+	 *    the_venue_rssjs_feed
216
+	 *
217
+	 * @access    public
218
+	 * @param    object $item
219
+	 * @return    void
220
+	 */
221
+	public static function the_venue_rssjs_feed($item)
222
+	{
223
+		if (is_feed() && isset($item->description)) {
224
+			$item->description = EED_Feeds::the_venue_feed($item->description);
225
+		}
226
+		return $item;
227
+	}
228 228
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -82,7 +82,7 @@  discard block
 block discarded – undo
82 82
     {
83 83
         if (EE_Registry::instance()->REQ->is_set('post_type')) {
84 84
             // define path to templates
85
-            define('RSS_FEEDS_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/');
85
+            define('RSS_FEEDS_TEMPLATES_PATH', str_replace('\\', '/', plugin_dir_path(__FILE__)).'templates/');
86 86
             // what kinda post_type are we dealing with ?
87 87
             switch (EE_Registry::instance()->REQ->get('post_type')) {
88 88
                 case 'espresso_events':
@@ -154,14 +154,14 @@  discard block
 block discarded – undo
154 154
      */
155 155
     public static function the_event_feed($content)
156 156
     {
157
-        if (is_feed() && is_readable(RSS_FEEDS_TEMPLATES_PATH . 'espresso_events_feed.template.php')) {
157
+        if (is_feed() && is_readable(RSS_FEEDS_TEMPLATES_PATH.'espresso_events_feed.template.php')) {
158 158
             global $post;
159 159
             $template_args = array(
160 160
                 'EVT_ID'            => $post->ID,
161 161
                 'event_description' => get_option('rss_use_excerpt') ? $post->post_excerpt : $post->post_content,
162 162
             );
163 163
             $content = EEH_Template::display_template(
164
-                RSS_FEEDS_TEMPLATES_PATH . 'espresso_events_feed.template.php',
164
+                RSS_FEEDS_TEMPLATES_PATH.'espresso_events_feed.template.php',
165 165
                 $template_args,
166 166
                 true
167 167
             );
@@ -195,14 +195,14 @@  discard block
 block discarded – undo
195 195
      */
196 196
     public static function the_venue_feed($content)
197 197
     {
198
-        if (is_feed() && is_readable(RSS_FEEDS_TEMPLATES_PATH . 'espresso_venues_feed.template.php')) {
198
+        if (is_feed() && is_readable(RSS_FEEDS_TEMPLATES_PATH.'espresso_venues_feed.template.php')) {
199 199
             global $post;
200 200
             $template_args = array(
201 201
                 'VNU_ID'            => $post->ID,
202 202
                 'venue_description' => get_option('rss_use_excerpt') ? $post->post_excerpt : $post->post_content,
203 203
             );
204 204
             $content = EEH_Template::display_template(
205
-                RSS_FEEDS_TEMPLATES_PATH . 'espresso_venues_feed.template.php',
205
+                RSS_FEEDS_TEMPLATES_PATH.'espresso_venues_feed.template.php',
206 206
                 $template_args,
207 207
                 true
208 208
             );
Please login to merge, or discard this patch.