Completed
Branch BUG-10532-replace-hooks-for-ts (65130e)
by
unknown
28:48 queued 15:20
created
core/services/assets/Registry.php 1 patch
Indentation   +226 added lines, -226 removed lines patch added patch discarded remove patch
@@ -16,234 +16,234 @@
 block discarded – undo
16 16
 class Registry
17 17
 {
18 18
 
19
-    /**
20
-     * This holds the jsdata data object that will be exposed on pages that enqueue the `eejs-core` script.
21
-     * @var array
22
-     */
23
-    protected $jsdata = array();
24
-
25
-
26
-    /**
27
-     * Registry constructor.
28
-     * Hooking into WP actions for script registry.
29
-     */
30
-    public function __construct()
31
-    {
32
-        add_action('wp_enqueue_scripts', array($this, 'scripts'), 100);
33
-        add_action('admin_enqueue_scripts', array($this, 'scripts'), 100);
34
-        add_action('wp_print_footer_scripts', array($this, 'enqueueData'), 1);
35
-        add_action('admin_print_footer_scripts', array($this, 'enqueueData'), 1);
36
-    }
37
-
38
-
39
-    /**
40
-     * Callback for the WP script actions.
41
-     * Used to register globally accessible core scripts.
42
-     * Also used to add the eejs.data object to the source for any js having eejs-core as a dependency.
43
-     */
44
-    public function scripts()
45
-    {
46
-        global $wp_version;
47
-        wp_register_script(
48
-            'eejs-core',
49
-            EE_PLUGIN_DIR_URL . 'core/services/assets/core_assets/eejs-core.js',
50
-            array(),
51
-            espresso_version(),
52
-            true
53
-        );
54
-        //only run this if WordPress 4.4.0 > is in use.
55
-        if (version_compare($wp_version, '4.4.0', '>')) {
56
-            //js.api
57
-            wp_register_script(
58
-                'eejs-api',
59
-                EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
60
-                array('underscore', 'eejs-core'),
61
-                espresso_version(),
62
-                true
63
-            );
64
-            $this->jsdata['eejs_api_nonce'] = wp_create_nonce('wp_rest');
65
-            $this->jsdata['paths'] = array('rest_route' => rest_url('ee/v4.8.36/'));
66
-        }
67
-    }
68
-
69
-
70
-    /**
71
-     * Call back for the script print in frontend and backend.
72
-     * Used to call wp_localize_scripts so that data can be added throughout the runtime until this later hookpoint.
73
-     * @since 4.9.31.rc.015
74
-     */
75
-    public function enqueueData()
76
-    {
77
-        wp_localize_script('eejs-core', 'eejs', array('data' => $this->jsdata));
78
-    }
79
-
80
-
81
-    /**
82
-     * Used to add data to eejs.data object.
83
-     *
84
-     * Note:  Overriding existing data is not allowed.
85
-     *
86
-     * Data will be accessible as a javascript object when you list `eejs-core` as a dependency for your javascript.
87
-     * If the data you add is something like this:
88
-     *
89
-     *  $this->addData( 'my_plugin_data', array( 'foo' => 'gar' ) );
90
-     *
91
-     * It will be exposed in the page source as:
92
-     *
93
-     *  eejs.data.my_plugin_data.foo == gar
94
-     *
95
-     * @param string       $key   Key used to access your data
96
-     * @param string|array $value Value to attach to key
97
-     * @throws InvalidArgumentException
98
-     */
99
-    public function addData($key, $value)
100
-    {
101
-        if ($this->verifyDataNotExisting($key)) {
102
-            $this->jsdata[$key] = $value;
103
-        }
104
-    }
105
-
106
-
107
-    /**
108
-     * Similar to addData except this allows for users to push values to an existing key where the values on key are
109
-     * elements in an array.
110
-     *
111
-     * When you use this method, the value you include will be appended to the end of an array on $key.
112
-     *
113
-     * So if the $key was 'test' and you added a value of 'my_data' then it would be represented in the javascript object
114
-     * like this,
115
-     *
116
-     * eejs.data.test = [
117
-     *     my_data,
118
-     * ]
119
-     *
120
-     * If there has already been a scalar value attached to the data object given key, then
121
-     * this will throw an exception.
122
-     *
123
-     * @param string $key          Key to attach data to.
124
-     * @param string|array $value  Value being registered.
125
-     * @throws InvalidArgumentException
126
-     */
127
-    public function pushData($key, $value)
128
-    {
129
-        if (isset($this->jsdata[$key])
130
-            && ! is_array($this->jsdata[$key])
131
-        ) {
132
-            throw new invalidArgumentException(
133
-                sprintf(
134
-                    __(
135
-                        'The value for %1$s is already set and it is not an array. The %2$s method can only be used to
19
+	/**
20
+	 * This holds the jsdata data object that will be exposed on pages that enqueue the `eejs-core` script.
21
+	 * @var array
22
+	 */
23
+	protected $jsdata = array();
24
+
25
+
26
+	/**
27
+	 * Registry constructor.
28
+	 * Hooking into WP actions for script registry.
29
+	 */
30
+	public function __construct()
31
+	{
32
+		add_action('wp_enqueue_scripts', array($this, 'scripts'), 100);
33
+		add_action('admin_enqueue_scripts', array($this, 'scripts'), 100);
34
+		add_action('wp_print_footer_scripts', array($this, 'enqueueData'), 1);
35
+		add_action('admin_print_footer_scripts', array($this, 'enqueueData'), 1);
36
+	}
37
+
38
+
39
+	/**
40
+	 * Callback for the WP script actions.
41
+	 * Used to register globally accessible core scripts.
42
+	 * Also used to add the eejs.data object to the source for any js having eejs-core as a dependency.
43
+	 */
44
+	public function scripts()
45
+	{
46
+		global $wp_version;
47
+		wp_register_script(
48
+			'eejs-core',
49
+			EE_PLUGIN_DIR_URL . 'core/services/assets/core_assets/eejs-core.js',
50
+			array(),
51
+			espresso_version(),
52
+			true
53
+		);
54
+		//only run this if WordPress 4.4.0 > is in use.
55
+		if (version_compare($wp_version, '4.4.0', '>')) {
56
+			//js.api
57
+			wp_register_script(
58
+				'eejs-api',
59
+				EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
60
+				array('underscore', 'eejs-core'),
61
+				espresso_version(),
62
+				true
63
+			);
64
+			$this->jsdata['eejs_api_nonce'] = wp_create_nonce('wp_rest');
65
+			$this->jsdata['paths'] = array('rest_route' => rest_url('ee/v4.8.36/'));
66
+		}
67
+	}
68
+
69
+
70
+	/**
71
+	 * Call back for the script print in frontend and backend.
72
+	 * Used to call wp_localize_scripts so that data can be added throughout the runtime until this later hookpoint.
73
+	 * @since 4.9.31.rc.015
74
+	 */
75
+	public function enqueueData()
76
+	{
77
+		wp_localize_script('eejs-core', 'eejs', array('data' => $this->jsdata));
78
+	}
79
+
80
+
81
+	/**
82
+	 * Used to add data to eejs.data object.
83
+	 *
84
+	 * Note:  Overriding existing data is not allowed.
85
+	 *
86
+	 * Data will be accessible as a javascript object when you list `eejs-core` as a dependency for your javascript.
87
+	 * If the data you add is something like this:
88
+	 *
89
+	 *  $this->addData( 'my_plugin_data', array( 'foo' => 'gar' ) );
90
+	 *
91
+	 * It will be exposed in the page source as:
92
+	 *
93
+	 *  eejs.data.my_plugin_data.foo == gar
94
+	 *
95
+	 * @param string       $key   Key used to access your data
96
+	 * @param string|array $value Value to attach to key
97
+	 * @throws InvalidArgumentException
98
+	 */
99
+	public function addData($key, $value)
100
+	{
101
+		if ($this->verifyDataNotExisting($key)) {
102
+			$this->jsdata[$key] = $value;
103
+		}
104
+	}
105
+
106
+
107
+	/**
108
+	 * Similar to addData except this allows for users to push values to an existing key where the values on key are
109
+	 * elements in an array.
110
+	 *
111
+	 * When you use this method, the value you include will be appended to the end of an array on $key.
112
+	 *
113
+	 * So if the $key was 'test' and you added a value of 'my_data' then it would be represented in the javascript object
114
+	 * like this,
115
+	 *
116
+	 * eejs.data.test = [
117
+	 *     my_data,
118
+	 * ]
119
+	 *
120
+	 * If there has already been a scalar value attached to the data object given key, then
121
+	 * this will throw an exception.
122
+	 *
123
+	 * @param string $key          Key to attach data to.
124
+	 * @param string|array $value  Value being registered.
125
+	 * @throws InvalidArgumentException
126
+	 */
127
+	public function pushData($key, $value)
128
+	{
129
+		if (isset($this->jsdata[$key])
130
+			&& ! is_array($this->jsdata[$key])
131
+		) {
132
+			throw new invalidArgumentException(
133
+				sprintf(
134
+					__(
135
+						'The value for %1$s is already set and it is not an array. The %2$s method can only be used to
136 136
                          push values to this data element when it is an array.',
137
-                        'event_espresso'
138
-                    ),
139
-                    $key,
140
-                    __METHOD__
141
-                )
142
-            );
143
-        }
144
-
145
-        $this->jsdata[$key][] = $value;
146
-    }
147
-
148
-
149
-    /**
150
-     * Used to set content used by javascript for a template.
151
-     * Note: Overrides of existing registered templates are not allowed.
152
-     *
153
-     * @param string $template_reference
154
-     * @param string $template_content
155
-     * @throws InvalidArgumentException
156
-     */
157
-    public function addTemplate($template_reference, $template_content)
158
-    {
159
-        if (! isset($this->jsdata['templates'])) {
160
-            $this->jsdata['templates'] = array();
161
-        }
162
-
163
-        //no overrides allowed.
164
-        if (isset($this->jsdata['templates'][$template_reference])) {
165
-            throw new invalidArgumentException(
166
-                sprintf(
167
-                    __(
168
-                        'The %1$s key already exists for the templates array in the js data array.  No overrides are allowed.',
169
-                        'event_espresso'
170
-                    ),
171
-                    $template_reference
172
-                )
173
-            );
174
-        } else {
175
-            $this->jsdata['templates'][$template_reference] = $template_content;
176
-        }
177
-    }
178
-
179
-
180
-    /**
181
-     * Retrieve the template content already registered for the given reference.
182
-     * @param string $template_reference
183
-     * @return string
184
-     */
185
-    public function getTemplate($template_reference)
186
-    {
187
-        return isset($this->jsdata['templates'], $this->jsdata['templates'][$template_reference])
188
-            ? $this->jsdata['templates'][$template_reference]
189
-            : '';
190
-    }
191
-
192
-
193
-    /**
194
-     * Retrieve registered data.
195
-     *
196
-     * @param string $key           Name of key to attach data to.
197
-     * @return mixed                If there is no for the given key, then false is returned.
198
-     */
199
-    public function getData($key)
200
-    {
201
-        return isset($this->jsdata[$key])
202
-            ? $this->jsdata[$key]
203
-            : false;
204
-    }
205
-
206
-
207
-
208
-
209
-    /**
210
-     * Verifies whether the given data exists already on the jsdata array.
211
-     *
212
-     * Overriding data is not allowed.
213
-     *
214
-     * @param string       $key          Index for data.
215
-     * @return bool        If valid then return true.
216
-     * @throws InvalidArgumentException if data already exists.
217
-     */
218
-    protected function verifyDataNotExisting($key)
219
-    {
220
-        if (isset($this->jsdata[$key])) {
221
-            if (is_array($this->jsdata[$key])) {
222
-                throw new InvalidArgumentException(
223
-                    sprintf(
224
-                        __(
225
-                            'The value for %1$s already exists in the Registry::eejs object.
137
+						'event_espresso'
138
+					),
139
+					$key,
140
+					__METHOD__
141
+				)
142
+			);
143
+		}
144
+
145
+		$this->jsdata[$key][] = $value;
146
+	}
147
+
148
+
149
+	/**
150
+	 * Used to set content used by javascript for a template.
151
+	 * Note: Overrides of existing registered templates are not allowed.
152
+	 *
153
+	 * @param string $template_reference
154
+	 * @param string $template_content
155
+	 * @throws InvalidArgumentException
156
+	 */
157
+	public function addTemplate($template_reference, $template_content)
158
+	{
159
+		if (! isset($this->jsdata['templates'])) {
160
+			$this->jsdata['templates'] = array();
161
+		}
162
+
163
+		//no overrides allowed.
164
+		if (isset($this->jsdata['templates'][$template_reference])) {
165
+			throw new invalidArgumentException(
166
+				sprintf(
167
+					__(
168
+						'The %1$s key already exists for the templates array in the js data array.  No overrides are allowed.',
169
+						'event_espresso'
170
+					),
171
+					$template_reference
172
+				)
173
+			);
174
+		} else {
175
+			$this->jsdata['templates'][$template_reference] = $template_content;
176
+		}
177
+	}
178
+
179
+
180
+	/**
181
+	 * Retrieve the template content already registered for the given reference.
182
+	 * @param string $template_reference
183
+	 * @return string
184
+	 */
185
+	public function getTemplate($template_reference)
186
+	{
187
+		return isset($this->jsdata['templates'], $this->jsdata['templates'][$template_reference])
188
+			? $this->jsdata['templates'][$template_reference]
189
+			: '';
190
+	}
191
+
192
+
193
+	/**
194
+	 * Retrieve registered data.
195
+	 *
196
+	 * @param string $key           Name of key to attach data to.
197
+	 * @return mixed                If there is no for the given key, then false is returned.
198
+	 */
199
+	public function getData($key)
200
+	{
201
+		return isset($this->jsdata[$key])
202
+			? $this->jsdata[$key]
203
+			: false;
204
+	}
205
+
206
+
207
+
208
+
209
+	/**
210
+	 * Verifies whether the given data exists already on the jsdata array.
211
+	 *
212
+	 * Overriding data is not allowed.
213
+	 *
214
+	 * @param string       $key          Index for data.
215
+	 * @return bool        If valid then return true.
216
+	 * @throws InvalidArgumentException if data already exists.
217
+	 */
218
+	protected function verifyDataNotExisting($key)
219
+	{
220
+		if (isset($this->jsdata[$key])) {
221
+			if (is_array($this->jsdata[$key])) {
222
+				throw new InvalidArgumentException(
223
+					sprintf(
224
+						__(
225
+							'The value for %1$s already exists in the Registry::eejs object.
226 226
                             Overrides are not allowed. Since the value of this data is an array, you may want to use the
227 227
                             %2$s method to push your value to the array.',
228
-                            'event_espresso'
229
-                        ),
230
-                        $key,
231
-                        'pushData()'
232
-                    )
233
-                );
234
-            } else {
235
-                throw new InvalidArgumentException(
236
-                    sprintf(
237
-                        __(
238
-                            'The value for %1$s already exists in the Registry::eejs object. Overrides are not
228
+							'event_espresso'
229
+						),
230
+						$key,
231
+						'pushData()'
232
+					)
233
+				);
234
+			} else {
235
+				throw new InvalidArgumentException(
236
+					sprintf(
237
+						__(
238
+							'The value for %1$s already exists in the Registry::eejs object. Overrides are not
239 239
                             allowed.  Consider attaching your value to a different key',
240
-                            'event_espresso'
241
-                        ),
242
-                        $key
243
-                    )
244
-                );
245
-            }
246
-        }
247
-        return true;
248
-    }
240
+							'event_espresso'
241
+						),
242
+						$key
243
+					)
244
+				);
245
+			}
246
+		}
247
+		return true;
248
+	}
249 249
 }
Please login to merge, or discard this patch.
admin_pages/maintenance/Maintenance_Admin_Page.core.php 2 patches
Indentation   +613 added lines, -613 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
3
-    exit('NO direct script access allowed');
3
+	exit('NO direct script access allowed');
4 4
 }
5 5
 
6 6
 
@@ -28,633 +28,633 @@  discard block
 block discarded – undo
28 28
 {
29 29
 
30 30
 
31
-    public function __construct($routing = true)
32
-    {
33
-        parent::__construct($routing);
34
-    }
35
-
36
-
37
-
38
-    protected function _init_page_props()
39
-    {
40
-        $this->page_slug = EE_MAINTENANCE_PG_SLUG;
41
-        $this->page_label = EE_MAINTENANCE_LABEL;
42
-        $this->_admin_base_url = EE_MAINTENANCE_ADMIN_URL;
43
-        $this->_admin_base_path = EE_MAINTENANCE_ADMIN;
44
-    }
45
-
46
-
47
-
48
-    protected function _ajax_hooks()
49
-    {
50
-        add_action('wp_ajax_migration_step', array($this, 'migration_step'));
51
-        add_action('wp_ajax_add_error_to_migrations_ran', array($this, 'add_error_to_migrations_ran'));
52
-    }
53
-
54
-
55
-
56
-    protected function _define_page_props()
57
-    {
58
-        $this->_admin_page_title = EE_MAINTENANCE_LABEL;
59
-        $this->_labels = array(
60
-            'buttons' => array(
61
-                'reset_reservations' => esc_html__('Reset Ticket and Datetime Reserved Counts', 'event_espresso'),
62
-                'reset_capabilities' => esc_html__('Reset Event Espresso Capabilities', 'event_espresso'),
63
-            ),
64
-        );
65
-    }
66
-
67
-
68
-
69
-    protected function _set_page_routes()
70
-    {
71
-        $this->_page_routes = array(
72
-            'default'                             => array(
73
-                'func'       => '_maintenance',
74
-                'capability' => 'manage_options',
75
-            ),
76
-            'change_maintenance_level'            => array(
77
-                'func'       => '_change_maintenance_level',
78
-                'capability' => 'manage_options',
79
-                'noheader'   => true,
80
-            ),
81
-            'system_status'                       => array(
82
-                'func'       => '_system_status',
83
-                'capability' => 'manage_options',
84
-            ),
85
-            'download_system_status' => array(
86
-                'func'       => '_download_system_status',
87
-                'capability' => 'manage_options',
88
-                'noheader'   => true,
89
-            ),
90
-            'send_migration_crash_report'         => array(
91
-                'func'       => '_send_migration_crash_report',
92
-                'capability' => 'manage_options',
93
-                'noheader'   => true,
94
-            ),
95
-            'confirm_migration_crash_report_sent' => array(
96
-                'func'       => '_confirm_migration_crash_report_sent',
97
-                'capability' => 'manage_options',
98
-            ),
99
-            'data_reset'                          => array(
100
-                'func'       => '_data_reset_and_delete',
101
-                'capability' => 'manage_options',
102
-            ),
103
-            'reset_db'                            => array(
104
-                'func'       => '_reset_db',
105
-                'capability' => 'manage_options',
106
-                'noheader'   => true,
107
-                'args'       => array('nuke_old_ee4_data' => true),
108
-            ),
109
-            'start_with_fresh_ee4_db'             => array(
110
-                'func'       => '_reset_db',
111
-                'capability' => 'manage_options',
112
-                'noheader'   => true,
113
-                'args'       => array('nuke_old_ee4_data' => false),
114
-            ),
115
-            'delete_db'                           => array(
116
-                'func'       => '_delete_db',
117
-                'capability' => 'manage_options',
118
-                'noheader'   => true,
119
-            ),
120
-            'rerun_migration_from_ee3'            => array(
121
-                'func'       => '_rerun_migration_from_ee3',
122
-                'capability' => 'manage_options',
123
-                'noheader'   => true,
124
-            ),
125
-            'reset_reservations'                  => array(
126
-                'func'       => '_reset_reservations',
127
-                'capability' => 'manage_options',
128
-                'noheader'   => true,
129
-            ),
130
-            'reset_capabilities'                  => array(
131
-                'func'       => '_reset_capabilities',
132
-                'capability' => 'manage_options',
133
-                'noheader'   => true,
134
-            ),
135
-            'reattempt_migration'                 => array(
136
-                'func'       => '_reattempt_migration',
137
-                'capability' => 'manage_options',
138
-                'noheader'   => true,
139
-            ),
140
-        );
141
-    }
142
-
143
-
144
-
145
-    protected function _set_page_config()
146
-    {
147
-        $this->_page_config = array(
148
-            'default'       => array(
149
-                'nav'           => array(
150
-                    'label' => esc_html__('Maintenance', 'event_espresso'),
151
-                    'order' => 10,
152
-                ),
153
-                'require_nonce' => false,
154
-            ),
155
-            'data_reset'    => array(
156
-                'nav'           => array(
157
-                    'label' => esc_html__('Reset/Delete Data', 'event_espresso'),
158
-                    'order' => 20,
159
-                ),
160
-                'require_nonce' => false,
161
-            ),
162
-            'system_status' => array(
163
-                'nav'           => array(
164
-                    'label' => esc_html__("System Information", "event_espresso"),
165
-                    'order' => 30,
166
-                ),
167
-                'require_nonce' => false,
168
-            ),
169
-        );
170
-    }
171
-
172
-
173
-
174
-    /**
175
-     * default maintenance page. If we're in maintenance mode level 2, then we need to show
176
-     * the migration scripts and all that UI.
177
-     */
178
-    public function _maintenance()
179
-    {
180
-        //it all depends if we're in maintenance model level 1 (frontend-only) or
181
-        //level 2 (everything except maintenance page)
182
-        try {
183
-            //get the current maintenance level and check if
184
-            //we are removed
185
-            $mm = EE_Maintenance_Mode::instance()->level();
186
-            $placed_in_mm = EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
187
-            if ($mm == EE_Maintenance_Mode::level_2_complete_maintenance && ! $placed_in_mm) {
188
-                //we just took the site out of maintenance mode, so notify the user.
189
-                //unfortunately this message appears to be echoed on the NEXT page load...
190
-                //oh well, we should really be checking for this on addon deactivation anyways
191
-                EE_Error::add_attention(__('Site taken out of maintenance mode because no data migration scripts are required',
192
-                    'event_espresso'));
193
-                $this->_process_notices(array('page' => 'espresso_maintenance_settings'), false);
194
-            }
195
-            //in case an exception is thrown while trying to handle migrations
196
-            switch (EE_Maintenance_Mode::instance()->level()) {
197
-                case EE_Maintenance_Mode::level_0_not_in_maintenance:
198
-                case EE_Maintenance_Mode::level_1_frontend_only_maintenance:
199
-                    $show_maintenance_switch = true;
200
-                    $show_backup_db_text = false;
201
-                    $show_migration_progress = false;
202
-                    $script_names = array();
203
-                    $addons_should_be_upgraded_first = false;
204
-                    break;
205
-                case EE_Maintenance_Mode::level_2_complete_maintenance:
206
-                    $show_maintenance_switch = false;
207
-                    $show_migration_progress = true;
208
-                    if (isset($this->_req_data['continue_migration'])) {
209
-                        $show_backup_db_text = false;
210
-                    } else {
211
-                        $show_backup_db_text = true;
212
-                    }
213
-                    $scripts_needing_to_run = EE_Data_Migration_Manager::instance()
214
-                                                                       ->check_for_applicable_data_migration_scripts();
215
-                    $addons_should_be_upgraded_first = EE_Data_Migration_Manager::instance()->addons_need_updating();
216
-                    $script_names = array();
217
-                    $current_script = null;
218
-                    foreach ($scripts_needing_to_run as $script) {
219
-                        if ($script instanceof EE_Data_Migration_Script_Base) {
220
-                            if ( ! $current_script) {
221
-                                $current_script = $script;
222
-                                $current_script->migration_page_hooks();
223
-                            }
224
-                            $script_names[] = $script->pretty_name();
225
-                        }
226
-                    }
227
-                    break;
228
-            }
229
-            $most_recent_migration = EE_Data_Migration_Manager::instance()->get_last_ran_script(true);
230
-            $exception_thrown = false;
231
-        } catch (EE_Error $e) {
232
-            EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($e->getMessage());
233
-            //now, just so we can display the page correctly, make a error migration script stage object
234
-            //and also put the error on it. It only persists for the duration of this request
235
-            $most_recent_migration = new EE_DMS_Unknown_1_0_0();
236
-            $most_recent_migration->add_error($e->getMessage());
237
-            $exception_thrown = true;
238
-        }
239
-        $current_db_state = EE_Data_Migration_Manager::instance()->ensure_current_database_state_is_set();
240
-        $current_db_state = str_replace('.decaf', '', $current_db_state);
241
-        if ($exception_thrown
242
-            || ($most_recent_migration
243
-                && $most_recent_migration instanceof EE_Data_Migration_Script_Base
244
-                && $most_recent_migration->is_broken()
245
-            )
246
-        ) {
247
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_was_borked_page.template.php';
248
-            $this->_template_args['support_url'] = 'http://eventespresso.com/support/forums/';
249
-            $this->_template_args['next_url'] = EEH_URL::add_query_args_and_nonce(array('action'  => 'confirm_migration_crash_report_sent',
250
-                                                                                        'success' => '0',
251
-            ), EE_MAINTENANCE_ADMIN_URL);
252
-        } elseif ($addons_should_be_upgraded_first) {
253
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_upgrade_addons_before_migrating.template.php';
254
-        } else {
255
-            if ($most_recent_migration
256
-                && $most_recent_migration instanceof EE_Data_Migration_Script_Base
257
-                && $most_recent_migration->can_continue()
258
-            ) {
259
-                $show_backup_db_text = false;
260
-                $show_continue_current_migration_script = true;
261
-                $show_most_recent_migration = true;
262
-            } elseif (isset($this->_req_data['continue_migration'])) {
263
-                $show_most_recent_migration = true;
264
-                $show_continue_current_migration_script = false;
265
-            } else {
266
-                $show_most_recent_migration = false;
267
-                $show_continue_current_migration_script = false;
268
-            }
269
-            if (isset($current_script)) {
270
-                $migrates_to = $current_script->migrates_to_version();
271
-                $plugin_slug = $migrates_to['slug'];
272
-                $new_version = $migrates_to['version'];
273
-                $this->_template_args = array_merge($this->_template_args, array(
274
-                    'current_db_state' => sprintf(__("EE%s (%s)", "event_espresso"),
275
-                        isset($current_db_state[$plugin_slug]) ? $current_db_state[$plugin_slug] : 3, $plugin_slug),
276
-                    'next_db_state'    => isset($current_script) ? sprintf(__("EE%s (%s)", 'event_espresso'),
277
-                        $new_version, $plugin_slug) : null,
278
-                ));
279
-            }
280
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_page.template.php';
281
-            $this->_template_args = array_merge(
282
-                $this->_template_args,
283
-                array(
284
-                    'show_most_recent_migration'             => $show_most_recent_migration,
285
-                    //flag for showing the most recent migration's status and/or errors
286
-                    'show_migration_progress'                => $show_migration_progress,
287
-                    //flag for showing the option to run migrations and see their progress
288
-                    'show_backup_db_text'                    => $show_backup_db_text,
289
-                    //flag for showing text telling the user to backup their DB
290
-                    'show_maintenance_switch'                => $show_maintenance_switch,
291
-                    //flag for showing the option to change maintenance mode between levels 0 and 1
292
-                    'script_names'                           => $script_names,
293
-                    //array of names of scripts that have run
294
-                    'show_continue_current_migration_script' => $show_continue_current_migration_script,
295
-                    //flag to change wording to indicating that we're only CONTINUING a migration script (somehow it got interrupted0
296
-                    'reset_db_page_link'                     => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reset_db'),
297
-                        EE_MAINTENANCE_ADMIN_URL),
298
-                    'data_reset_page'                        => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'data_reset'),
299
-                        EE_MAINTENANCE_ADMIN_URL),
300
-                    'update_migration_script_page_link'      => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'change_maintenance_level'),
301
-                        EE_MAINTENANCE_ADMIN_URL),
302
-                    'ultimate_db_state'                      => sprintf(__("EE%s", 'event_espresso'),
303
-                        espresso_version()),
304
-                )
305
-            );
306
-            //make sure we have the form fields helper available. It usually is, but sometimes it isn't
307
-            //localize script stuff
308
-            wp_localize_script('ee-maintenance', 'ee_maintenance', array(
309
-                'migrating'                        => esc_html__("Updating Database...", "event_espresso"),
310
-                'next'                             => esc_html__("Next", "event_espresso"),
311
-                'fatal_error'                      => esc_html__("A Fatal Error Has Occurred", "event_espresso"),
312
-                'click_next_when_ready'            => esc_html__("The current Database Update has ended. Click 'next' when ready to proceed",
313
-                    "event_espresso"),
314
-                'status_no_more_migration_scripts' => EE_Data_Migration_Manager::status_no_more_migration_scripts,
315
-                'status_fatal_error'               => EE_Data_Migration_Manager::status_fatal_error,
316
-                'status_completed'                 => EE_Data_Migration_Manager::status_completed,
317
-            ));
318
-        }
319
-        $this->_template_args['most_recent_migration'] = $most_recent_migration;//the actual most recently ran migration
320
-        //now render the migration options part, and put it in a variable
321
-        $migration_options_template_file = apply_filters(
322
-            'FHEE__ee_migration_page__migration_options_template',
323
-            EE_MAINTENANCE_TEMPLATE_PATH . 'migration_options_from_ee4.template.php'
324
-        );
325
-        $migration_options_html = EEH_Template::display_template($migration_options_template_file, $this->_template_args,true);
326
-        $this->_template_args['migration_options_html'] = $migration_options_html;
327
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
328
-            $this->_template_args, true);
329
-        $this->display_admin_page_with_sidebar();
330
-    }
331
-
332
-
333
-
334
-    /**
335
-     * returns JSON and executes another step of the currently-executing data migration (called via ajax)
336
-     */
337
-    public function migration_step()
338
-    {
339
-        $this->_template_args['data'] = EE_Data_Migration_Manager::instance()->response_to_migration_ajax_request();
340
-        $this->_return_json();
341
-    }
342
-
343
-
344
-
345
-    /**
346
-     * Can be used by js when it notices a response with HTML in it in order
347
-     * to log the malformed response
348
-     */
349
-    public function add_error_to_migrations_ran()
350
-    {
351
-        EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($this->_req_data['message']);
352
-        $this->_template_args['data'] = array('ok' => true);
353
-        $this->_return_json();
354
-    }
355
-
356
-
357
-
358
-    /**
359
-     * changes the maintenance level, provided there are still no migration scripts that should run
360
-     */
361
-    public function _change_maintenance_level()
362
-    {
363
-        $new_level = absint($this->_req_data['maintenance_mode_level']);
364
-        if ( ! EE_Data_Migration_Manager::instance()->check_for_applicable_data_migration_scripts()) {
365
-            EE_Maintenance_Mode::instance()->set_maintenance_level($new_level);
366
-            $success = true;
367
-        } else {
368
-            EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
369
-            $success = false;
370
-        }
371
-        $this->_redirect_after_action($success, 'Maintenance Mode', esc_html__("Updated", "event_espresso"));
372
-    }
373
-
374
-
375
-
376
-    /**
377
-     * a tab with options for resetting and/or deleting EE data
378
-     *
379
-     * @throws \EE_Error
380
-     * @throws \DomainException
381
-     */
382
-    public function _data_reset_and_delete()
383
-    {
384
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_data_reset_and_delete.template.php';
385
-        $this->_template_args['reset_reservations_button'] = $this->get_action_link_or_button(
386
-            'reset_reservations',
387
-            'reset_reservations',
388
-            array(),
389
-            'button button-primary',
390
-            '',
391
-            false
392
-        );
393
-        $this->_template_args['reset_capabilities_button'] = $this->get_action_link_or_button(
394
-            'reset_capabilities',
395
-            'reset_capabilities',
396
-            array(),
397
-            'button button-primary',
398
-            '',
399
-            false
400
-        );
401
-        $this->_template_args['delete_db_url'] = EE_Admin_Page::add_query_args_and_nonce(
402
-            array('action' => 'delete_db'),
403
-            EE_MAINTENANCE_ADMIN_URL
404
-        );
405
-        $this->_template_args['reset_db_url'] = EE_Admin_Page::add_query_args_and_nonce(
406
-            array('action' => 'reset_db'),
407
-            EE_MAINTENANCE_ADMIN_URL
408
-        );
409
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
410
-            $this->_template_path,
411
-            $this->_template_args,
412
-            true
413
-        );
414
-        $this->display_admin_page_with_sidebar();
415
-    }
416
-
417
-
418
-
419
-    protected function _reset_reservations()
420
-    {
421
-        if(\EED_Ticket_Sales_Monitor::reset_reservation_counts()) {
422
-            EE_Error::add_success(
423
-                __(
424
-                    'Ticket and datetime reserved counts have been successfully reset.',
425
-                    'event_espresso'
426
-                )
427
-            );
428
-        } else {
429
-            EE_Error::add_success(
430
-                __(
431
-                    'Ticket and datetime reserved counts were correct and did not need resetting.',
432
-                    'event_espresso'
433
-                )
434
-            );
435
-        }
436
-        $this->_redirect_after_action(true, '', '', array('action' => 'data_reset'), true);
437
-    }
438
-
439
-
440
-
441
-    protected function _reset_capabilities()
442
-    {
443
-        EE_Registry::instance()->CAP->init_caps(true);
444
-        EE_Error::add_success(__('Default Event Espresso capabilities have been restored for all current roles.',
445
-            'event_espresso'));
446
-        $this->_redirect_after_action(false, '', '', array('action' => 'data_reset'), true);
447
-    }
448
-
449
-
450
-
451
-    /**
452
-     * resets the DMSs so we can attempt to continue migrating after a fatal error
453
-     * (only a good idea when someone has somehow tried ot fix whatever caused
454
-     * the fatal error in teh first place)
455
-     */
456
-    protected function _reattempt_migration()
457
-    {
458
-        EE_Data_Migration_Manager::instance()->reattempt();
459
-        $this->_redirect_after_action(false, '', '', array('action' => 'default'), true);
460
-    }
461
-
462
-
463
-
464
-    /**
465
-     * shows the big ol' System Information page
466
-     */
467
-    public function _system_status()
468
-    {
469
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_system_stati_page.template.php';
470
-        $this->_template_args['system_stati'] = EEM_System_Status::instance()->get_system_stati();
471
-        $this->_template_args['download_system_status_url'] = EE_Admin_Page::add_query_args_and_nonce(
472
-            array(
473
-                'action' => 'download_system_status',
474
-            ),
475
-            EE_MAINTENANCE_ADMIN_URL
476
-        );
477
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
478
-            $this->_template_args, true);
479
-        $this->display_admin_page_with_sidebar();
480
-    }
481
-
482
-    /**
483
-     * Downloads an HTML file of the system status that can be easily stored or emailed
484
-     */
485
-    public function _download_system_status()
486
-    {
487
-        $status_info = EEM_System_Status::instance()->get_system_stati();
488
-        header( 'Content-Disposition: attachment' );
489
-        header( "Content-Disposition: attachment; filename=system_status_" . sanitize_key( site_url() ) . ".html" );
490
-        echo "<style>table{border:1px solid darkgrey;}td{vertical-align:top}</style>";
491
-        echo "<h1>System Information for " . site_url() . "</h1>";
492
-        echo EEH_Template::layout_array_as_table( $status_info );
493
-        die;
494
-    }
495
-
496
-
497
-
498
-    public function _send_migration_crash_report()
499
-    {
500
-        $from = $this->_req_data['from'];
501
-        $from_name = $this->_req_data['from_name'];
502
-        $body = $this->_req_data['body'];
503
-        try {
504
-            $success = wp_mail(EE_SUPPORT_EMAIL,
505
-                'Migration Crash Report',
506
-                $body . "/r/n<br>" . print_r(EEM_System_Status::instance()->get_system_stati(), true),
507
-                array(
508
-                    "from:$from_name<$from>",
509
-                    //					'content-type:text/html charset=UTF-8'
510
-                ));
511
-        } catch (Exception $e) {
512
-            $success = false;
513
-        }
514
-        $this->_redirect_after_action($success, esc_html__("Migration Crash Report", "event_espresso"),
515
-            esc_html__("sent", "event_espresso"),
516
-            array('success' => $success, 'action' => 'confirm_migration_crash_report_sent'));
517
-    }
518
-
519
-
520
-
521
-    public function _confirm_migration_crash_report_sent()
522
-    {
523
-        try {
524
-            $most_recent_migration = EE_Data_Migration_Manager::instance()->get_last_ran_script(true);
525
-        } catch (EE_Error $e) {
526
-            EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($e->getMessage());
527
-            //now, just so we can display the page correctly, make a error migration script stage object
528
-            //and also put the error on it. It only persists for the duration of this request
529
-            $most_recent_migration = new EE_DMS_Unknown_1_0_0();
530
-            $most_recent_migration->add_error($e->getMessage());
531
-        }
532
-        $success = $this->_req_data['success'] == '1' ? true : false;
533
-        $this->_template_args['success'] = $success;
534
-        $this->_template_args['most_recent_migration'] = $most_recent_migration;
535
-        $this->_template_args['reset_db_action_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reset_db'),
536
-            EE_MAINTENANCE_ADMIN_URL);
537
-        $this->_template_args['reset_db_page_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'data_reset'),
538
-            EE_MAINTENANCE_ADMIN_URL);
539
-        $this->_template_args['reattempt_action_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reattempt_migration'),
540
-            EE_MAINTENANCE_ADMIN_URL);
541
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_confirm_migration_crash_report_sent.template.php';
542
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
543
-            $this->_template_args, true);
544
-        $this->display_admin_page_with_sidebar();
545
-    }
546
-
547
-
548
-
549
-    /**
550
-     * Resets the entire EE4 database.
551
-     * Currently basically only sets up ee4 database for a fresh install- doesn't
552
-     * actually clean out the old wp options, or cpts (although does erase old ee table data)
553
-     *
554
-     * @param boolean $nuke_old_ee4_data controls whether or not we
555
-     *                                   destroy the old ee4 data, or just try initializing ee4 default data
556
-     */
557
-    public function _reset_db($nuke_old_ee4_data = true)
558
-    {
559
-        EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
560
-        if ($nuke_old_ee4_data) {
561
-            EEH_Activation::delete_all_espresso_cpt_data();
562
-            EEH_Activation::delete_all_espresso_tables_and_data(false);
563
-            EEH_Activation::remove_cron_tasks();
564
-        }
565
-        //make sure when we reset the registry's config that it
566
-        //switches to using the new singleton
567
-        EE_Registry::instance()->CFG = EE_Registry::instance()->CFG->reset(true);
568
-        EE_System::instance()->initialize_db_if_no_migrations_required(true);
569
-        EE_System::instance()->redirect_to_about_ee();
570
-    }
571
-
572
-
573
-
574
-    /**
575
-     * Deletes ALL EE tables, Records, and Options from the database.
576
-     */
577
-    public function _delete_db()
578
-    {
579
-        EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
580
-        EEH_Activation::delete_all_espresso_cpt_data();
581
-        EEH_Activation::delete_all_espresso_tables_and_data();
582
-        EEH_Activation::remove_cron_tasks();
583
-        EEH_Activation::deactivate_event_espresso();
584
-        wp_safe_redirect(admin_url('plugins.php'));
585
-        exit;
586
-    }
587
-
588
-
589
-
590
-    /**
591
-     * sets up EE4 to rerun the migrations from ee3 to ee4
592
-     */
593
-    public function _rerun_migration_from_ee3()
594
-    {
595
-        EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
596
-        EEH_Activation::delete_all_espresso_cpt_data();
597
-        EEH_Activation::delete_all_espresso_tables_and_data(false);
598
-        //set the db state to something that will require migrations
599
-        update_option(EE_Data_Migration_Manager::current_database_state, '3.1.36.0');
600
-        EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_2_complete_maintenance);
601
-        $this->_redirect_after_action(true, esc_html__("Database", 'event_espresso'), esc_html__("reset", 'event_espresso'));
602
-    }
603
-
604
-
605
-
606
-    //none of the below group are currently used for Gateway Settings
607
-    protected function _add_screen_options()
608
-    {
609
-    }
610
-
611
-
612
-
613
-    protected function _add_feature_pointers()
614
-    {
615
-    }
616
-
31
+	public function __construct($routing = true)
32
+	{
33
+		parent::__construct($routing);
34
+	}
35
+
36
+
37
+
38
+	protected function _init_page_props()
39
+	{
40
+		$this->page_slug = EE_MAINTENANCE_PG_SLUG;
41
+		$this->page_label = EE_MAINTENANCE_LABEL;
42
+		$this->_admin_base_url = EE_MAINTENANCE_ADMIN_URL;
43
+		$this->_admin_base_path = EE_MAINTENANCE_ADMIN;
44
+	}
45
+
46
+
47
+
48
+	protected function _ajax_hooks()
49
+	{
50
+		add_action('wp_ajax_migration_step', array($this, 'migration_step'));
51
+		add_action('wp_ajax_add_error_to_migrations_ran', array($this, 'add_error_to_migrations_ran'));
52
+	}
53
+
54
+
55
+
56
+	protected function _define_page_props()
57
+	{
58
+		$this->_admin_page_title = EE_MAINTENANCE_LABEL;
59
+		$this->_labels = array(
60
+			'buttons' => array(
61
+				'reset_reservations' => esc_html__('Reset Ticket and Datetime Reserved Counts', 'event_espresso'),
62
+				'reset_capabilities' => esc_html__('Reset Event Espresso Capabilities', 'event_espresso'),
63
+			),
64
+		);
65
+	}
66
+
67
+
68
+
69
+	protected function _set_page_routes()
70
+	{
71
+		$this->_page_routes = array(
72
+			'default'                             => array(
73
+				'func'       => '_maintenance',
74
+				'capability' => 'manage_options',
75
+			),
76
+			'change_maintenance_level'            => array(
77
+				'func'       => '_change_maintenance_level',
78
+				'capability' => 'manage_options',
79
+				'noheader'   => true,
80
+			),
81
+			'system_status'                       => array(
82
+				'func'       => '_system_status',
83
+				'capability' => 'manage_options',
84
+			),
85
+			'download_system_status' => array(
86
+				'func'       => '_download_system_status',
87
+				'capability' => 'manage_options',
88
+				'noheader'   => true,
89
+			),
90
+			'send_migration_crash_report'         => array(
91
+				'func'       => '_send_migration_crash_report',
92
+				'capability' => 'manage_options',
93
+				'noheader'   => true,
94
+			),
95
+			'confirm_migration_crash_report_sent' => array(
96
+				'func'       => '_confirm_migration_crash_report_sent',
97
+				'capability' => 'manage_options',
98
+			),
99
+			'data_reset'                          => array(
100
+				'func'       => '_data_reset_and_delete',
101
+				'capability' => 'manage_options',
102
+			),
103
+			'reset_db'                            => array(
104
+				'func'       => '_reset_db',
105
+				'capability' => 'manage_options',
106
+				'noheader'   => true,
107
+				'args'       => array('nuke_old_ee4_data' => true),
108
+			),
109
+			'start_with_fresh_ee4_db'             => array(
110
+				'func'       => '_reset_db',
111
+				'capability' => 'manage_options',
112
+				'noheader'   => true,
113
+				'args'       => array('nuke_old_ee4_data' => false),
114
+			),
115
+			'delete_db'                           => array(
116
+				'func'       => '_delete_db',
117
+				'capability' => 'manage_options',
118
+				'noheader'   => true,
119
+			),
120
+			'rerun_migration_from_ee3'            => array(
121
+				'func'       => '_rerun_migration_from_ee3',
122
+				'capability' => 'manage_options',
123
+				'noheader'   => true,
124
+			),
125
+			'reset_reservations'                  => array(
126
+				'func'       => '_reset_reservations',
127
+				'capability' => 'manage_options',
128
+				'noheader'   => true,
129
+			),
130
+			'reset_capabilities'                  => array(
131
+				'func'       => '_reset_capabilities',
132
+				'capability' => 'manage_options',
133
+				'noheader'   => true,
134
+			),
135
+			'reattempt_migration'                 => array(
136
+				'func'       => '_reattempt_migration',
137
+				'capability' => 'manage_options',
138
+				'noheader'   => true,
139
+			),
140
+		);
141
+	}
142
+
143
+
144
+
145
+	protected function _set_page_config()
146
+	{
147
+		$this->_page_config = array(
148
+			'default'       => array(
149
+				'nav'           => array(
150
+					'label' => esc_html__('Maintenance', 'event_espresso'),
151
+					'order' => 10,
152
+				),
153
+				'require_nonce' => false,
154
+			),
155
+			'data_reset'    => array(
156
+				'nav'           => array(
157
+					'label' => esc_html__('Reset/Delete Data', 'event_espresso'),
158
+					'order' => 20,
159
+				),
160
+				'require_nonce' => false,
161
+			),
162
+			'system_status' => array(
163
+				'nav'           => array(
164
+					'label' => esc_html__("System Information", "event_espresso"),
165
+					'order' => 30,
166
+				),
167
+				'require_nonce' => false,
168
+			),
169
+		);
170
+	}
171
+
172
+
173
+
174
+	/**
175
+	 * default maintenance page. If we're in maintenance mode level 2, then we need to show
176
+	 * the migration scripts and all that UI.
177
+	 */
178
+	public function _maintenance()
179
+	{
180
+		//it all depends if we're in maintenance model level 1 (frontend-only) or
181
+		//level 2 (everything except maintenance page)
182
+		try {
183
+			//get the current maintenance level and check if
184
+			//we are removed
185
+			$mm = EE_Maintenance_Mode::instance()->level();
186
+			$placed_in_mm = EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
187
+			if ($mm == EE_Maintenance_Mode::level_2_complete_maintenance && ! $placed_in_mm) {
188
+				//we just took the site out of maintenance mode, so notify the user.
189
+				//unfortunately this message appears to be echoed on the NEXT page load...
190
+				//oh well, we should really be checking for this on addon deactivation anyways
191
+				EE_Error::add_attention(__('Site taken out of maintenance mode because no data migration scripts are required',
192
+					'event_espresso'));
193
+				$this->_process_notices(array('page' => 'espresso_maintenance_settings'), false);
194
+			}
195
+			//in case an exception is thrown while trying to handle migrations
196
+			switch (EE_Maintenance_Mode::instance()->level()) {
197
+				case EE_Maintenance_Mode::level_0_not_in_maintenance:
198
+				case EE_Maintenance_Mode::level_1_frontend_only_maintenance:
199
+					$show_maintenance_switch = true;
200
+					$show_backup_db_text = false;
201
+					$show_migration_progress = false;
202
+					$script_names = array();
203
+					$addons_should_be_upgraded_first = false;
204
+					break;
205
+				case EE_Maintenance_Mode::level_2_complete_maintenance:
206
+					$show_maintenance_switch = false;
207
+					$show_migration_progress = true;
208
+					if (isset($this->_req_data['continue_migration'])) {
209
+						$show_backup_db_text = false;
210
+					} else {
211
+						$show_backup_db_text = true;
212
+					}
213
+					$scripts_needing_to_run = EE_Data_Migration_Manager::instance()
214
+																	   ->check_for_applicable_data_migration_scripts();
215
+					$addons_should_be_upgraded_first = EE_Data_Migration_Manager::instance()->addons_need_updating();
216
+					$script_names = array();
217
+					$current_script = null;
218
+					foreach ($scripts_needing_to_run as $script) {
219
+						if ($script instanceof EE_Data_Migration_Script_Base) {
220
+							if ( ! $current_script) {
221
+								$current_script = $script;
222
+								$current_script->migration_page_hooks();
223
+							}
224
+							$script_names[] = $script->pretty_name();
225
+						}
226
+					}
227
+					break;
228
+			}
229
+			$most_recent_migration = EE_Data_Migration_Manager::instance()->get_last_ran_script(true);
230
+			$exception_thrown = false;
231
+		} catch (EE_Error $e) {
232
+			EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($e->getMessage());
233
+			//now, just so we can display the page correctly, make a error migration script stage object
234
+			//and also put the error on it. It only persists for the duration of this request
235
+			$most_recent_migration = new EE_DMS_Unknown_1_0_0();
236
+			$most_recent_migration->add_error($e->getMessage());
237
+			$exception_thrown = true;
238
+		}
239
+		$current_db_state = EE_Data_Migration_Manager::instance()->ensure_current_database_state_is_set();
240
+		$current_db_state = str_replace('.decaf', '', $current_db_state);
241
+		if ($exception_thrown
242
+			|| ($most_recent_migration
243
+				&& $most_recent_migration instanceof EE_Data_Migration_Script_Base
244
+				&& $most_recent_migration->is_broken()
245
+			)
246
+		) {
247
+			$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_was_borked_page.template.php';
248
+			$this->_template_args['support_url'] = 'http://eventespresso.com/support/forums/';
249
+			$this->_template_args['next_url'] = EEH_URL::add_query_args_and_nonce(array('action'  => 'confirm_migration_crash_report_sent',
250
+																						'success' => '0',
251
+			), EE_MAINTENANCE_ADMIN_URL);
252
+		} elseif ($addons_should_be_upgraded_first) {
253
+			$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_upgrade_addons_before_migrating.template.php';
254
+		} else {
255
+			if ($most_recent_migration
256
+				&& $most_recent_migration instanceof EE_Data_Migration_Script_Base
257
+				&& $most_recent_migration->can_continue()
258
+			) {
259
+				$show_backup_db_text = false;
260
+				$show_continue_current_migration_script = true;
261
+				$show_most_recent_migration = true;
262
+			} elseif (isset($this->_req_data['continue_migration'])) {
263
+				$show_most_recent_migration = true;
264
+				$show_continue_current_migration_script = false;
265
+			} else {
266
+				$show_most_recent_migration = false;
267
+				$show_continue_current_migration_script = false;
268
+			}
269
+			if (isset($current_script)) {
270
+				$migrates_to = $current_script->migrates_to_version();
271
+				$plugin_slug = $migrates_to['slug'];
272
+				$new_version = $migrates_to['version'];
273
+				$this->_template_args = array_merge($this->_template_args, array(
274
+					'current_db_state' => sprintf(__("EE%s (%s)", "event_espresso"),
275
+						isset($current_db_state[$plugin_slug]) ? $current_db_state[$plugin_slug] : 3, $plugin_slug),
276
+					'next_db_state'    => isset($current_script) ? sprintf(__("EE%s (%s)", 'event_espresso'),
277
+						$new_version, $plugin_slug) : null,
278
+				));
279
+			}
280
+			$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_page.template.php';
281
+			$this->_template_args = array_merge(
282
+				$this->_template_args,
283
+				array(
284
+					'show_most_recent_migration'             => $show_most_recent_migration,
285
+					//flag for showing the most recent migration's status and/or errors
286
+					'show_migration_progress'                => $show_migration_progress,
287
+					//flag for showing the option to run migrations and see their progress
288
+					'show_backup_db_text'                    => $show_backup_db_text,
289
+					//flag for showing text telling the user to backup their DB
290
+					'show_maintenance_switch'                => $show_maintenance_switch,
291
+					//flag for showing the option to change maintenance mode between levels 0 and 1
292
+					'script_names'                           => $script_names,
293
+					//array of names of scripts that have run
294
+					'show_continue_current_migration_script' => $show_continue_current_migration_script,
295
+					//flag to change wording to indicating that we're only CONTINUING a migration script (somehow it got interrupted0
296
+					'reset_db_page_link'                     => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reset_db'),
297
+						EE_MAINTENANCE_ADMIN_URL),
298
+					'data_reset_page'                        => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'data_reset'),
299
+						EE_MAINTENANCE_ADMIN_URL),
300
+					'update_migration_script_page_link'      => EE_Admin_Page::add_query_args_and_nonce(array('action' => 'change_maintenance_level'),
301
+						EE_MAINTENANCE_ADMIN_URL),
302
+					'ultimate_db_state'                      => sprintf(__("EE%s", 'event_espresso'),
303
+						espresso_version()),
304
+				)
305
+			);
306
+			//make sure we have the form fields helper available. It usually is, but sometimes it isn't
307
+			//localize script stuff
308
+			wp_localize_script('ee-maintenance', 'ee_maintenance', array(
309
+				'migrating'                        => esc_html__("Updating Database...", "event_espresso"),
310
+				'next'                             => esc_html__("Next", "event_espresso"),
311
+				'fatal_error'                      => esc_html__("A Fatal Error Has Occurred", "event_espresso"),
312
+				'click_next_when_ready'            => esc_html__("The current Database Update has ended. Click 'next' when ready to proceed",
313
+					"event_espresso"),
314
+				'status_no_more_migration_scripts' => EE_Data_Migration_Manager::status_no_more_migration_scripts,
315
+				'status_fatal_error'               => EE_Data_Migration_Manager::status_fatal_error,
316
+				'status_completed'                 => EE_Data_Migration_Manager::status_completed,
317
+			));
318
+		}
319
+		$this->_template_args['most_recent_migration'] = $most_recent_migration;//the actual most recently ran migration
320
+		//now render the migration options part, and put it in a variable
321
+		$migration_options_template_file = apply_filters(
322
+			'FHEE__ee_migration_page__migration_options_template',
323
+			EE_MAINTENANCE_TEMPLATE_PATH . 'migration_options_from_ee4.template.php'
324
+		);
325
+		$migration_options_html = EEH_Template::display_template($migration_options_template_file, $this->_template_args,true);
326
+		$this->_template_args['migration_options_html'] = $migration_options_html;
327
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
328
+			$this->_template_args, true);
329
+		$this->display_admin_page_with_sidebar();
330
+	}
331
+
332
+
333
+
334
+	/**
335
+	 * returns JSON and executes another step of the currently-executing data migration (called via ajax)
336
+	 */
337
+	public function migration_step()
338
+	{
339
+		$this->_template_args['data'] = EE_Data_Migration_Manager::instance()->response_to_migration_ajax_request();
340
+		$this->_return_json();
341
+	}
342
+
343
+
344
+
345
+	/**
346
+	 * Can be used by js when it notices a response with HTML in it in order
347
+	 * to log the malformed response
348
+	 */
349
+	public function add_error_to_migrations_ran()
350
+	{
351
+		EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($this->_req_data['message']);
352
+		$this->_template_args['data'] = array('ok' => true);
353
+		$this->_return_json();
354
+	}
355
+
356
+
357
+
358
+	/**
359
+	 * changes the maintenance level, provided there are still no migration scripts that should run
360
+	 */
361
+	public function _change_maintenance_level()
362
+	{
363
+		$new_level = absint($this->_req_data['maintenance_mode_level']);
364
+		if ( ! EE_Data_Migration_Manager::instance()->check_for_applicable_data_migration_scripts()) {
365
+			EE_Maintenance_Mode::instance()->set_maintenance_level($new_level);
366
+			$success = true;
367
+		} else {
368
+			EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
369
+			$success = false;
370
+		}
371
+		$this->_redirect_after_action($success, 'Maintenance Mode', esc_html__("Updated", "event_espresso"));
372
+	}
373
+
374
+
375
+
376
+	/**
377
+	 * a tab with options for resetting and/or deleting EE data
378
+	 *
379
+	 * @throws \EE_Error
380
+	 * @throws \DomainException
381
+	 */
382
+	public function _data_reset_and_delete()
383
+	{
384
+		$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_data_reset_and_delete.template.php';
385
+		$this->_template_args['reset_reservations_button'] = $this->get_action_link_or_button(
386
+			'reset_reservations',
387
+			'reset_reservations',
388
+			array(),
389
+			'button button-primary',
390
+			'',
391
+			false
392
+		);
393
+		$this->_template_args['reset_capabilities_button'] = $this->get_action_link_or_button(
394
+			'reset_capabilities',
395
+			'reset_capabilities',
396
+			array(),
397
+			'button button-primary',
398
+			'',
399
+			false
400
+		);
401
+		$this->_template_args['delete_db_url'] = EE_Admin_Page::add_query_args_and_nonce(
402
+			array('action' => 'delete_db'),
403
+			EE_MAINTENANCE_ADMIN_URL
404
+		);
405
+		$this->_template_args['reset_db_url'] = EE_Admin_Page::add_query_args_and_nonce(
406
+			array('action' => 'reset_db'),
407
+			EE_MAINTENANCE_ADMIN_URL
408
+		);
409
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
410
+			$this->_template_path,
411
+			$this->_template_args,
412
+			true
413
+		);
414
+		$this->display_admin_page_with_sidebar();
415
+	}
416
+
417
+
418
+
419
+	protected function _reset_reservations()
420
+	{
421
+		if(\EED_Ticket_Sales_Monitor::reset_reservation_counts()) {
422
+			EE_Error::add_success(
423
+				__(
424
+					'Ticket and datetime reserved counts have been successfully reset.',
425
+					'event_espresso'
426
+				)
427
+			);
428
+		} else {
429
+			EE_Error::add_success(
430
+				__(
431
+					'Ticket and datetime reserved counts were correct and did not need resetting.',
432
+					'event_espresso'
433
+				)
434
+			);
435
+		}
436
+		$this->_redirect_after_action(true, '', '', array('action' => 'data_reset'), true);
437
+	}
438
+
439
+
440
+
441
+	protected function _reset_capabilities()
442
+	{
443
+		EE_Registry::instance()->CAP->init_caps(true);
444
+		EE_Error::add_success(__('Default Event Espresso capabilities have been restored for all current roles.',
445
+			'event_espresso'));
446
+		$this->_redirect_after_action(false, '', '', array('action' => 'data_reset'), true);
447
+	}
448
+
449
+
450
+
451
+	/**
452
+	 * resets the DMSs so we can attempt to continue migrating after a fatal error
453
+	 * (only a good idea when someone has somehow tried ot fix whatever caused
454
+	 * the fatal error in teh first place)
455
+	 */
456
+	protected function _reattempt_migration()
457
+	{
458
+		EE_Data_Migration_Manager::instance()->reattempt();
459
+		$this->_redirect_after_action(false, '', '', array('action' => 'default'), true);
460
+	}
461
+
462
+
463
+
464
+	/**
465
+	 * shows the big ol' System Information page
466
+	 */
467
+	public function _system_status()
468
+	{
469
+		$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_system_stati_page.template.php';
470
+		$this->_template_args['system_stati'] = EEM_System_Status::instance()->get_system_stati();
471
+		$this->_template_args['download_system_status_url'] = EE_Admin_Page::add_query_args_and_nonce(
472
+			array(
473
+				'action' => 'download_system_status',
474
+			),
475
+			EE_MAINTENANCE_ADMIN_URL
476
+		);
477
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
478
+			$this->_template_args, true);
479
+		$this->display_admin_page_with_sidebar();
480
+	}
481
+
482
+	/**
483
+	 * Downloads an HTML file of the system status that can be easily stored or emailed
484
+	 */
485
+	public function _download_system_status()
486
+	{
487
+		$status_info = EEM_System_Status::instance()->get_system_stati();
488
+		header( 'Content-Disposition: attachment' );
489
+		header( "Content-Disposition: attachment; filename=system_status_" . sanitize_key( site_url() ) . ".html" );
490
+		echo "<style>table{border:1px solid darkgrey;}td{vertical-align:top}</style>";
491
+		echo "<h1>System Information for " . site_url() . "</h1>";
492
+		echo EEH_Template::layout_array_as_table( $status_info );
493
+		die;
494
+	}
495
+
496
+
497
+
498
+	public function _send_migration_crash_report()
499
+	{
500
+		$from = $this->_req_data['from'];
501
+		$from_name = $this->_req_data['from_name'];
502
+		$body = $this->_req_data['body'];
503
+		try {
504
+			$success = wp_mail(EE_SUPPORT_EMAIL,
505
+				'Migration Crash Report',
506
+				$body . "/r/n<br>" . print_r(EEM_System_Status::instance()->get_system_stati(), true),
507
+				array(
508
+					"from:$from_name<$from>",
509
+					//					'content-type:text/html charset=UTF-8'
510
+				));
511
+		} catch (Exception $e) {
512
+			$success = false;
513
+		}
514
+		$this->_redirect_after_action($success, esc_html__("Migration Crash Report", "event_espresso"),
515
+			esc_html__("sent", "event_espresso"),
516
+			array('success' => $success, 'action' => 'confirm_migration_crash_report_sent'));
517
+	}
518
+
519
+
520
+
521
+	public function _confirm_migration_crash_report_sent()
522
+	{
523
+		try {
524
+			$most_recent_migration = EE_Data_Migration_Manager::instance()->get_last_ran_script(true);
525
+		} catch (EE_Error $e) {
526
+			EE_Data_Migration_Manager::instance()->add_error_to_migrations_ran($e->getMessage());
527
+			//now, just so we can display the page correctly, make a error migration script stage object
528
+			//and also put the error on it. It only persists for the duration of this request
529
+			$most_recent_migration = new EE_DMS_Unknown_1_0_0();
530
+			$most_recent_migration->add_error($e->getMessage());
531
+		}
532
+		$success = $this->_req_data['success'] == '1' ? true : false;
533
+		$this->_template_args['success'] = $success;
534
+		$this->_template_args['most_recent_migration'] = $most_recent_migration;
535
+		$this->_template_args['reset_db_action_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reset_db'),
536
+			EE_MAINTENANCE_ADMIN_URL);
537
+		$this->_template_args['reset_db_page_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'data_reset'),
538
+			EE_MAINTENANCE_ADMIN_URL);
539
+		$this->_template_args['reattempt_action_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reattempt_migration'),
540
+			EE_MAINTENANCE_ADMIN_URL);
541
+		$this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_confirm_migration_crash_report_sent.template.php';
542
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
543
+			$this->_template_args, true);
544
+		$this->display_admin_page_with_sidebar();
545
+	}
546
+
547
+
548
+
549
+	/**
550
+	 * Resets the entire EE4 database.
551
+	 * Currently basically only sets up ee4 database for a fresh install- doesn't
552
+	 * actually clean out the old wp options, or cpts (although does erase old ee table data)
553
+	 *
554
+	 * @param boolean $nuke_old_ee4_data controls whether or not we
555
+	 *                                   destroy the old ee4 data, or just try initializing ee4 default data
556
+	 */
557
+	public function _reset_db($nuke_old_ee4_data = true)
558
+	{
559
+		EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
560
+		if ($nuke_old_ee4_data) {
561
+			EEH_Activation::delete_all_espresso_cpt_data();
562
+			EEH_Activation::delete_all_espresso_tables_and_data(false);
563
+			EEH_Activation::remove_cron_tasks();
564
+		}
565
+		//make sure when we reset the registry's config that it
566
+		//switches to using the new singleton
567
+		EE_Registry::instance()->CFG = EE_Registry::instance()->CFG->reset(true);
568
+		EE_System::instance()->initialize_db_if_no_migrations_required(true);
569
+		EE_System::instance()->redirect_to_about_ee();
570
+	}
571
+
572
+
573
+
574
+	/**
575
+	 * Deletes ALL EE tables, Records, and Options from the database.
576
+	 */
577
+	public function _delete_db()
578
+	{
579
+		EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
580
+		EEH_Activation::delete_all_espresso_cpt_data();
581
+		EEH_Activation::delete_all_espresso_tables_and_data();
582
+		EEH_Activation::remove_cron_tasks();
583
+		EEH_Activation::deactivate_event_espresso();
584
+		wp_safe_redirect(admin_url('plugins.php'));
585
+		exit;
586
+	}
587
+
588
+
589
+
590
+	/**
591
+	 * sets up EE4 to rerun the migrations from ee3 to ee4
592
+	 */
593
+	public function _rerun_migration_from_ee3()
594
+	{
595
+		EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_0_not_in_maintenance);
596
+		EEH_Activation::delete_all_espresso_cpt_data();
597
+		EEH_Activation::delete_all_espresso_tables_and_data(false);
598
+		//set the db state to something that will require migrations
599
+		update_option(EE_Data_Migration_Manager::current_database_state, '3.1.36.0');
600
+		EE_Maintenance_Mode::instance()->set_maintenance_level(EE_Maintenance_Mode::level_2_complete_maintenance);
601
+		$this->_redirect_after_action(true, esc_html__("Database", 'event_espresso'), esc_html__("reset", 'event_espresso'));
602
+	}
603
+
604
+
605
+
606
+	//none of the below group are currently used for Gateway Settings
607
+	protected function _add_screen_options()
608
+	{
609
+	}
610
+
611
+
612
+
613
+	protected function _add_feature_pointers()
614
+	{
615
+	}
616
+
617 617
 
618 618
 
619
-    public function admin_init()
620
-    {
621
-    }
622
-
623
-
624
-
625
-    public function admin_notices()
626
-    {
627
-    }
628
-
619
+	public function admin_init()
620
+	{
621
+	}
622
+
623
+
624
+
625
+	public function admin_notices()
626
+	{
627
+	}
628
+
629 629
 
630 630
 
631
-    public function admin_footer_scripts()
632
-    {
633
-    }
631
+	public function admin_footer_scripts()
632
+	{
633
+	}
634 634
 
635 635
 
636 636
 
637
-    public function load_scripts_styles()
638
-    {
639
-        wp_enqueue_script('ee_admin_js');
637
+	public function load_scripts_styles()
638
+	{
639
+		wp_enqueue_script('ee_admin_js');
640 640
 //		wp_enqueue_media();
641 641
 //		wp_enqueue_script('media-upload');
642
-        wp_enqueue_script('ee-maintenance', EE_MAINTENANCE_ASSETS_URL . '/ee-maintenance.js', array('jquery'),
643
-            EVENT_ESPRESSO_VERSION, true);
644
-        wp_register_style('espresso_maintenance', EE_MAINTENANCE_ASSETS_URL . 'ee-maintenance.css', array(),
645
-            EVENT_ESPRESSO_VERSION);
646
-        wp_enqueue_style('espresso_maintenance');
647
-    }
642
+		wp_enqueue_script('ee-maintenance', EE_MAINTENANCE_ASSETS_URL . '/ee-maintenance.js', array('jquery'),
643
+			EVENT_ESPRESSO_VERSION, true);
644
+		wp_register_style('espresso_maintenance', EE_MAINTENANCE_ASSETS_URL . 'ee-maintenance.css', array(),
645
+			EVENT_ESPRESSO_VERSION);
646
+		wp_enqueue_style('espresso_maintenance');
647
+	}
648 648
 
649 649
 
650 650
 
651
-    public function load_scripts_styles_default()
652
-    {
653
-        //styles
651
+	public function load_scripts_styles_default()
652
+	{
653
+		//styles
654 654
 //		wp_enqueue_style('ee-text-links');
655 655
 //		//scripts
656 656
 //		wp_enqueue_script('ee-text-links');
657
-    }
657
+	}
658 658
 
659 659
 
660 660
 
Please login to merge, or discard this patch.
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -244,13 +244,13 @@  discard block
 block discarded – undo
244 244
                 && $most_recent_migration->is_broken()
245 245
             )
246 246
         ) {
247
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_was_borked_page.template.php';
247
+            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_migration_was_borked_page.template.php';
248 248
             $this->_template_args['support_url'] = 'http://eventespresso.com/support/forums/';
249 249
             $this->_template_args['next_url'] = EEH_URL::add_query_args_and_nonce(array('action'  => 'confirm_migration_crash_report_sent',
250 250
                                                                                         'success' => '0',
251 251
             ), EE_MAINTENANCE_ADMIN_URL);
252 252
         } elseif ($addons_should_be_upgraded_first) {
253
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_upgrade_addons_before_migrating.template.php';
253
+            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_upgrade_addons_before_migrating.template.php';
254 254
         } else {
255 255
             if ($most_recent_migration
256 256
                 && $most_recent_migration instanceof EE_Data_Migration_Script_Base
@@ -277,7 +277,7 @@  discard block
 block discarded – undo
277 277
                         $new_version, $plugin_slug) : null,
278 278
                 ));
279 279
             }
280
-            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_migration_page.template.php';
280
+            $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_migration_page.template.php';
281 281
             $this->_template_args = array_merge(
282 282
                 $this->_template_args,
283 283
                 array(
@@ -316,13 +316,13 @@  discard block
 block discarded – undo
316 316
                 'status_completed'                 => EE_Data_Migration_Manager::status_completed,
317 317
             ));
318 318
         }
319
-        $this->_template_args['most_recent_migration'] = $most_recent_migration;//the actual most recently ran migration
319
+        $this->_template_args['most_recent_migration'] = $most_recent_migration; //the actual most recently ran migration
320 320
         //now render the migration options part, and put it in a variable
321 321
         $migration_options_template_file = apply_filters(
322 322
             'FHEE__ee_migration_page__migration_options_template',
323
-            EE_MAINTENANCE_TEMPLATE_PATH . 'migration_options_from_ee4.template.php'
323
+            EE_MAINTENANCE_TEMPLATE_PATH.'migration_options_from_ee4.template.php'
324 324
         );
325
-        $migration_options_html = EEH_Template::display_template($migration_options_template_file, $this->_template_args,true);
325
+        $migration_options_html = EEH_Template::display_template($migration_options_template_file, $this->_template_args, true);
326 326
         $this->_template_args['migration_options_html'] = $migration_options_html;
327 327
         $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
328 328
             $this->_template_args, true);
@@ -381,7 +381,7 @@  discard block
 block discarded – undo
381 381
      */
382 382
     public function _data_reset_and_delete()
383 383
     {
384
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_data_reset_and_delete.template.php';
384
+        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_data_reset_and_delete.template.php';
385 385
         $this->_template_args['reset_reservations_button'] = $this->get_action_link_or_button(
386 386
             'reset_reservations',
387 387
             'reset_reservations',
@@ -418,7 +418,7 @@  discard block
 block discarded – undo
418 418
 
419 419
     protected function _reset_reservations()
420 420
     {
421
-        if(\EED_Ticket_Sales_Monitor::reset_reservation_counts()) {
421
+        if (\EED_Ticket_Sales_Monitor::reset_reservation_counts()) {
422 422
             EE_Error::add_success(
423 423
                 __(
424 424
                     'Ticket and datetime reserved counts have been successfully reset.',
@@ -466,7 +466,7 @@  discard block
 block discarded – undo
466 466
      */
467 467
     public function _system_status()
468 468
     {
469
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_system_stati_page.template.php';
469
+        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_system_stati_page.template.php';
470 470
         $this->_template_args['system_stati'] = EEM_System_Status::instance()->get_system_stati();
471 471
         $this->_template_args['download_system_status_url'] = EE_Admin_Page::add_query_args_and_nonce(
472 472
             array(
@@ -485,11 +485,11 @@  discard block
 block discarded – undo
485 485
     public function _download_system_status()
486 486
     {
487 487
         $status_info = EEM_System_Status::instance()->get_system_stati();
488
-        header( 'Content-Disposition: attachment' );
489
-        header( "Content-Disposition: attachment; filename=system_status_" . sanitize_key( site_url() ) . ".html" );
488
+        header('Content-Disposition: attachment');
489
+        header("Content-Disposition: attachment; filename=system_status_".sanitize_key(site_url()).".html");
490 490
         echo "<style>table{border:1px solid darkgrey;}td{vertical-align:top}</style>";
491
-        echo "<h1>System Information for " . site_url() . "</h1>";
492
-        echo EEH_Template::layout_array_as_table( $status_info );
491
+        echo "<h1>System Information for ".site_url()."</h1>";
492
+        echo EEH_Template::layout_array_as_table($status_info);
493 493
         die;
494 494
     }
495 495
 
@@ -503,7 +503,7 @@  discard block
 block discarded – undo
503 503
         try {
504 504
             $success = wp_mail(EE_SUPPORT_EMAIL,
505 505
                 'Migration Crash Report',
506
-                $body . "/r/n<br>" . print_r(EEM_System_Status::instance()->get_system_stati(), true),
506
+                $body."/r/n<br>".print_r(EEM_System_Status::instance()->get_system_stati(), true),
507 507
                 array(
508 508
                     "from:$from_name<$from>",
509 509
                     //					'content-type:text/html charset=UTF-8'
@@ -538,7 +538,7 @@  discard block
 block discarded – undo
538 538
             EE_MAINTENANCE_ADMIN_URL);
539 539
         $this->_template_args['reattempt_action_url'] = EE_Admin_Page::add_query_args_and_nonce(array('action' => 'reattempt_migration'),
540 540
             EE_MAINTENANCE_ADMIN_URL);
541
-        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH . 'ee_confirm_migration_crash_report_sent.template.php';
541
+        $this->_template_path = EE_MAINTENANCE_TEMPLATE_PATH.'ee_confirm_migration_crash_report_sent.template.php';
542 542
         $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
543 543
             $this->_template_args, true);
544 544
         $this->display_admin_page_with_sidebar();
@@ -639,9 +639,9 @@  discard block
 block discarded – undo
639 639
         wp_enqueue_script('ee_admin_js');
640 640
 //		wp_enqueue_media();
641 641
 //		wp_enqueue_script('media-upload');
642
-        wp_enqueue_script('ee-maintenance', EE_MAINTENANCE_ASSETS_URL . '/ee-maintenance.js', array('jquery'),
642
+        wp_enqueue_script('ee-maintenance', EE_MAINTENANCE_ASSETS_URL.'/ee-maintenance.js', array('jquery'),
643 643
             EVENT_ESPRESSO_VERSION, true);
644
-        wp_register_style('espresso_maintenance', EE_MAINTENANCE_ASSETS_URL . 'ee-maintenance.css', array(),
644
+        wp_register_style('espresso_maintenance', EE_MAINTENANCE_ASSETS_URL.'ee-maintenance.css', array(),
645 645
             EVENT_ESPRESSO_VERSION);
646 646
         wp_enqueue_style('espresso_maintenance');
647 647
     }
Please login to merge, or discard this patch.
core/entities/models/JsonModelSchema.php 1 patch
Indentation   +116 added lines, -116 removed lines patch added patch discarded remove patch
@@ -25,120 +25,120 @@
 block discarded – undo
25 25
 class JsonModelSchema
26 26
 {
27 27
 
28
-    /**
29
-     * @var \EEM_Base
30
-     */
31
-    protected $model;
32
-
33
-    /**
34
-     * JsonModelSchema constructor.
35
-     *
36
-     * @param \EEM_Base $model
37
-     */
38
-    public function __construct(EEM_Base $model)
39
-    {
40
-        $this->model = $model;
41
-    }
42
-
43
-    /**
44
-     * Return the schema for a given model from a given model.
45
-     * @param \EEM_Base $model
46
-     * @return array
47
-     */
48
-    public function getModelSchema()
49
-    {
50
-        return $this->getModelSchemaForRelations(
51
-            $this->model->relation_settings(),
52
-            $this->getModelSchemaForFields(
53
-                $this->model->field_settings(),
54
-                $this->getInitialSchemaStructure()
55
-            )
56
-        );
57
-    }
58
-
59
-
60
-    /**
61
-     * Get the schema for a given set of model fields.
62
-     * @param \EE_Model_Field_Base[]     $model_fields
63
-     * @return array
64
-     */
65
-    public function getModelSchemaForFields(array $model_fields, array $schema)
66
-    {
67
-        foreach ($model_fields as $field => $model_field) {
68
-            if (! $model_field instanceof EE_Model_Field_Base) {
69
-                continue;
70
-            }
71
-            $schema['properties'][$field] = $model_field->getSchema();
72
-
73
-            //if this is a primary key field add the primary key item
74
-            if ($model_field instanceof EE_Primary_Key_Field_Base) {
75
-                $schema['properties'][$field]['primary_key'] = true;
76
-                if ($model_field instanceof EE_Primary_Key_Int_Field) {
77
-                    $schema['properties'][$field]['readonly'] = true;
78
-                }
79
-            }
80
-
81
-            //if this is a foreign key field add the foreign key item
82
-            if ($model_field instanceof EE_Foreign_Key_Field_Base) {
83
-                $schema['properties'][$field]['foreign_key'] = array(
84
-                    'description' => esc_html__('This is a foreign key the points to the given models.', 'event_espresso'),
85
-                    'type' => 'array',
86
-                    'enum' => $model_field->get_model_class_names_pointed_to()
87
-                );
88
-            }
89
-        }
90
-        return $schema;
91
-    }
92
-
93
-
94
-    /**
95
-     * Get the schema for a given set of model relations
96
-     * @param EE_Model_Relation_Base[] $relations_on_model
97
-     * @return array
98
-     */
99
-    public function getModelSchemaForRelations(array $relations_on_model, array $schema)
100
-    {
101
-        foreach ($relations_on_model as $model_name => $relation) {
102
-            if (! $relation instanceof EE_Model_Relation_Base) {
103
-                continue;
104
-            }
105
-            $model_name_for_schema = $relation instanceof EE_Belongs_To_Relation
106
-                ? strtolower($model_name)
107
-                : EEH_Inflector::pluralize_and_lower($model_name);
108
-            $schema['properties'][$model_name_for_schema] = $relation->getSchema();
109
-            $schema['properties'][$model_name_for_schema]['relation_model'] = $model_name;
110
-        }
111
-        return $schema;
112
-    }
113
-
114
-
115
-    /**
116
-     * Outputs the schema header for a model.
117
-     * @param \EEM_Base $model
118
-     * @return array
119
-     */
120
-    public function getInitialSchemaStructure()
121
-    {
122
-        return array(
123
-            '$schema' => 'http://json-schema.org/draft-04/schema#',
124
-            'title' => $this->model->get_this_model_name(),
125
-            'type' => 'object',
126
-            'properties' => array()
127
-        );
128
-    }
129
-
130
-
131
-    /**
132
-     * Allows one to just use the object as a string to get the json.
133
-     * eg.
134
-     *
135
-     * $json_schema = new JsonModelSchema(EEM_Event::instance());
136
-     * echo $json_schema; //outputs the schema as a json formatted string.
137
-     *
138
-     * @return bool|false|mixed|string
139
-     */
140
-    public function __toString()
141
-    {
142
-        return wp_json_encode($this->getModelSchema());
143
-    }
28
+	/**
29
+	 * @var \EEM_Base
30
+	 */
31
+	protected $model;
32
+
33
+	/**
34
+	 * JsonModelSchema constructor.
35
+	 *
36
+	 * @param \EEM_Base $model
37
+	 */
38
+	public function __construct(EEM_Base $model)
39
+	{
40
+		$this->model = $model;
41
+	}
42
+
43
+	/**
44
+	 * Return the schema for a given model from a given model.
45
+	 * @param \EEM_Base $model
46
+	 * @return array
47
+	 */
48
+	public function getModelSchema()
49
+	{
50
+		return $this->getModelSchemaForRelations(
51
+			$this->model->relation_settings(),
52
+			$this->getModelSchemaForFields(
53
+				$this->model->field_settings(),
54
+				$this->getInitialSchemaStructure()
55
+			)
56
+		);
57
+	}
58
+
59
+
60
+	/**
61
+	 * Get the schema for a given set of model fields.
62
+	 * @param \EE_Model_Field_Base[]     $model_fields
63
+	 * @return array
64
+	 */
65
+	public function getModelSchemaForFields(array $model_fields, array $schema)
66
+	{
67
+		foreach ($model_fields as $field => $model_field) {
68
+			if (! $model_field instanceof EE_Model_Field_Base) {
69
+				continue;
70
+			}
71
+			$schema['properties'][$field] = $model_field->getSchema();
72
+
73
+			//if this is a primary key field add the primary key item
74
+			if ($model_field instanceof EE_Primary_Key_Field_Base) {
75
+				$schema['properties'][$field]['primary_key'] = true;
76
+				if ($model_field instanceof EE_Primary_Key_Int_Field) {
77
+					$schema['properties'][$field]['readonly'] = true;
78
+				}
79
+			}
80
+
81
+			//if this is a foreign key field add the foreign key item
82
+			if ($model_field instanceof EE_Foreign_Key_Field_Base) {
83
+				$schema['properties'][$field]['foreign_key'] = array(
84
+					'description' => esc_html__('This is a foreign key the points to the given models.', 'event_espresso'),
85
+					'type' => 'array',
86
+					'enum' => $model_field->get_model_class_names_pointed_to()
87
+				);
88
+			}
89
+		}
90
+		return $schema;
91
+	}
92
+
93
+
94
+	/**
95
+	 * Get the schema for a given set of model relations
96
+	 * @param EE_Model_Relation_Base[] $relations_on_model
97
+	 * @return array
98
+	 */
99
+	public function getModelSchemaForRelations(array $relations_on_model, array $schema)
100
+	{
101
+		foreach ($relations_on_model as $model_name => $relation) {
102
+			if (! $relation instanceof EE_Model_Relation_Base) {
103
+				continue;
104
+			}
105
+			$model_name_for_schema = $relation instanceof EE_Belongs_To_Relation
106
+				? strtolower($model_name)
107
+				: EEH_Inflector::pluralize_and_lower($model_name);
108
+			$schema['properties'][$model_name_for_schema] = $relation->getSchema();
109
+			$schema['properties'][$model_name_for_schema]['relation_model'] = $model_name;
110
+		}
111
+		return $schema;
112
+	}
113
+
114
+
115
+	/**
116
+	 * Outputs the schema header for a model.
117
+	 * @param \EEM_Base $model
118
+	 * @return array
119
+	 */
120
+	public function getInitialSchemaStructure()
121
+	{
122
+		return array(
123
+			'$schema' => 'http://json-schema.org/draft-04/schema#',
124
+			'title' => $this->model->get_this_model_name(),
125
+			'type' => 'object',
126
+			'properties' => array()
127
+		);
128
+	}
129
+
130
+
131
+	/**
132
+	 * Allows one to just use the object as a string to get the json.
133
+	 * eg.
134
+	 *
135
+	 * $json_schema = new JsonModelSchema(EEM_Event::instance());
136
+	 * echo $json_schema; //outputs the schema as a json formatted string.
137
+	 *
138
+	 * @return bool|false|mixed|string
139
+	 */
140
+	public function __toString()
141
+	{
142
+		return wp_json_encode($this->getModelSchema());
143
+	}
144 144
 }
Please login to merge, or discard this patch.
core/db_models/EEM_Ticket.model.php 2 patches
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -129,13 +129,13 @@  discard block
 block discarded – undo
129 129
 
130 130
 
131 131
 
132
-    /**
133
-     * Updates the TKT_sold quantity on all the tickets matching $query_params
134
-     *
135
-     * @param EE_Ticket[] $tickets
136
-     * @return void
137
-     * @throws \EE_Error
138
-     */
132
+	/**
133
+	 * Updates the TKT_sold quantity on all the tickets matching $query_params
134
+	 *
135
+	 * @param EE_Ticket[] $tickets
136
+	 * @return void
137
+	 * @throws \EE_Error
138
+	 */
139 139
 	public function update_tickets_sold($tickets){
140 140
 		foreach($tickets as $ticket){
141 141
 			/* @var  $ticket EE_Ticket */
@@ -145,41 +145,41 @@  discard block
 block discarded – undo
145 145
 
146 146
 
147 147
 
148
-    /**
149
-     * returns an array of EE_Ticket objects with a non-zero value for TKT_reserved
150
-     *
151
-     * @return EE_Base_Class[]|EE_Ticket[]
152
-     * @throws \EE_Error
153
-     */
154
-    public function get_tickets_with_reservations()
155
-    {
156
-        return $this->get_all(
157
-            array(
158
-                array(
159
-                    'TKT_reserved' => array( '>', 0 )
160
-                )
161
-            )
162
-        );
148
+	/**
149
+	 * returns an array of EE_Ticket objects with a non-zero value for TKT_reserved
150
+	 *
151
+	 * @return EE_Base_Class[]|EE_Ticket[]
152
+	 * @throws \EE_Error
153
+	 */
154
+	public function get_tickets_with_reservations()
155
+	{
156
+		return $this->get_all(
157
+			array(
158
+				array(
159
+					'TKT_reserved' => array( '>', 0 )
160
+				)
161
+			)
162
+		);
163 163
 	}
164 164
 
165 165
 
166 166
 
167
-    /**
168
-     * returns an array of EE_Ticket objects matching the supplied list of IDs
169
-     *
170
-     * @param array $ticket_IDs
171
-     * @return EE_Base_Class[]|EE_Ticket[]
172
-     * @throws \EE_Error
173
-     */
174
-    public function get_tickets_with_IDs(array $ticket_IDs)
175
-    {
176
-        return $this->get_all(
177
-            array(
178
-                array(
179
-                    'TKT_ID' => array( 'IN', $ticket_IDs )
180
-                )
181
-            )
182
-        );
167
+	/**
168
+	 * returns an array of EE_Ticket objects matching the supplied list of IDs
169
+	 *
170
+	 * @param array $ticket_IDs
171
+	 * @return EE_Base_Class[]|EE_Ticket[]
172
+	 * @throws \EE_Error
173
+	 */
174
+	public function get_tickets_with_IDs(array $ticket_IDs)
175
+	{
176
+		return $this->get_all(
177
+			array(
178
+				array(
179
+					'TKT_ID' => array( 'IN', $ticket_IDs )
180
+				)
181
+			)
182
+		);
183 183
 	}
184 184
 
185 185
 
Please login to merge, or discard this patch.
Spacing   +39 added lines, -39 removed lines patch added patch discarded remove patch
@@ -21,8 +21,8 @@  discard block
 block discarded – undo
21 21
  *
22 22
  * ------------------------------------------------------------------------
23 23
  */
24
-require_once ( EE_MODELS . 'EEM_Soft_Delete_Base.model.php' );
25
-require_once ( EE_CLASSES . 'EE_Ticket.class.php' );
24
+require_once (EE_MODELS.'EEM_Soft_Delete_Base.model.php');
25
+require_once (EE_CLASSES.'EE_Ticket.class.php');
26 26
 
27 27
 class EEM_Ticket extends EEM_Soft_Delete_Base {
28 28
 
@@ -35,36 +35,36 @@  discard block
 block discarded – undo
35 35
 	 *		@access private
36 36
 	 *		@param string $timezone string representing the timezone we want to set for returned Date Time Strings (and any incoming timezone data that gets saved).  Note this just sends the timezone info to the date time model field objects.  Default is NULL (and will be assumed using the set timezone in the 'timezone_string' wp option)
37 37
 	 */
38
-	protected function __construct( $timezone ) {
39
-		$this->singular_item = __('Ticket','event_espresso');
40
-		$this->plural_item = __('Tickets','event_espresso');
38
+	protected function __construct($timezone) {
39
+		$this->singular_item = __('Ticket', 'event_espresso');
40
+		$this->plural_item = __('Tickets', 'event_espresso');
41 41
 
42 42
 		$this->_tables = array(
43 43
 			'Ticket'=> new EE_Primary_Table('esp_ticket', 'TKT_ID')
44 44
 		);
45 45
 		$this->_fields = array(
46 46
 			'Ticket'=>array(
47
-				'TKT_ID'=> new EE_Primary_Key_Int_Field('TKT_ID', __('Ticket ID','event_espresso')),
48
-				'TTM_ID'=>new EE_Foreign_Key_Int_Field('TTM_ID', __('Ticket Template ID','event_espresso'), false, 0, 'Ticket_Template'),
47
+				'TKT_ID'=> new EE_Primary_Key_Int_Field('TKT_ID', __('Ticket ID', 'event_espresso')),
48
+				'TTM_ID'=>new EE_Foreign_Key_Int_Field('TTM_ID', __('Ticket Template ID', 'event_espresso'), false, 0, 'Ticket_Template'),
49 49
 				'TKT_name'=>new EE_Plain_Text_Field('TKT_name', __('Ticket Name', 'event_espresso'), false, ''),
50
-				'TKT_description'=>new EE_Post_Content_Field('TKT_description', __('Description of Ticket', 'event_espresso'), false, '' ),
51
-				'TKT_start_date'=>new EE_Datetime_Field('TKT_start_date', __('Start time/date of Ticket','event_espresso'), false, EE_Datetime_Field::now, $timezone ),
52
-				'TKT_end_date'=>new EE_Datetime_Field('TKT_end_date', __('End time/date of Ticket','event_espresso'), false, EE_Datetime_Field::now, $timezone ),
53
-				'TKT_min'=>new EE_Integer_Field('TKT_min', __('Minimum quantity of this ticket that must be purchased', 'event_espresso'), false, 0 ),
54
-				'TKT_max'=>new EE_Infinite_Integer_Field('TKT_max', __('Maximum quantity of this ticket that can be purchased in one transaction', 'event_espresso'), false, EE_INF ),
50
+				'TKT_description'=>new EE_Post_Content_Field('TKT_description', __('Description of Ticket', 'event_espresso'), false, ''),
51
+				'TKT_start_date'=>new EE_Datetime_Field('TKT_start_date', __('Start time/date of Ticket', 'event_espresso'), false, EE_Datetime_Field::now, $timezone),
52
+				'TKT_end_date'=>new EE_Datetime_Field('TKT_end_date', __('End time/date of Ticket', 'event_espresso'), false, EE_Datetime_Field::now, $timezone),
53
+				'TKT_min'=>new EE_Integer_Field('TKT_min', __('Minimum quantity of this ticket that must be purchased', 'event_espresso'), false, 0),
54
+				'TKT_max'=>new EE_Infinite_Integer_Field('TKT_max', __('Maximum quantity of this ticket that can be purchased in one transaction', 'event_espresso'), false, EE_INF),
55 55
 				'TKT_price'=> new EE_Money_Field('TKT_price', 'Final calculated price for ticket', false, 0),
56 56
 				'TKT_sold' => new EE_Integer_Field('TKT_sold', __('Number of this ticket sold', 'event_espresso'), false, 0),
57
-				'TKT_qty'=>new EE_Infinite_Integer_Field('TKT_qty', __('Quantity of this ticket that is available','event_espresso'), false, EE_INF),
58
-				'TKT_reserved'=>new EE_Integer_Field('TKT_reserved', __('Quantity of this ticket that is reserved, but not yet fully purchased','event_espresso'), false, 0 ),
59
-				'TKT_uses'=>new EE_Infinite_Integer_Field('TKT_uses', __('Number of datetimes this ticket can be used at', 'event_espresso'), false, EE_INF ),
60
-				'TKT_required'=>new EE_Boolean_Field('TKT_required', __("Flag indicating whether this ticket must be purchased with a transaction", "event_espresso"), false, false ),
61
-				'TKT_taxable'=>new EE_Boolean_Field('TKT_taxable', __("Flag indicating whether there is tax applied on this ticket", "event_espresso"), false,false),
62
-				'TKT_is_default'=>new EE_Boolean_Field('TKT_is_default', __('Flag indicating that this ticket is a default ticket', 'event_espresso'), false, false ),
57
+				'TKT_qty'=>new EE_Infinite_Integer_Field('TKT_qty', __('Quantity of this ticket that is available', 'event_espresso'), false, EE_INF),
58
+				'TKT_reserved'=>new EE_Integer_Field('TKT_reserved', __('Quantity of this ticket that is reserved, but not yet fully purchased', 'event_espresso'), false, 0),
59
+				'TKT_uses'=>new EE_Infinite_Integer_Field('TKT_uses', __('Number of datetimes this ticket can be used at', 'event_espresso'), false, EE_INF),
60
+				'TKT_required'=>new EE_Boolean_Field('TKT_required', __("Flag indicating whether this ticket must be purchased with a transaction", "event_espresso"), false, false),
61
+				'TKT_taxable'=>new EE_Boolean_Field('TKT_taxable', __("Flag indicating whether there is tax applied on this ticket", "event_espresso"), false, false),
62
+				'TKT_is_default'=>new EE_Boolean_Field('TKT_is_default', __('Flag indicating that this ticket is a default ticket', 'event_espresso'), false, false),
63 63
 				'TKT_order' => new EE_Integer_Field('TKT_order', __('The order in which the Ticket is displayed in the editor (used for autosaves when the form doesn\'t have the ticket ID yet)', 'event_espresso'), false, 0),
64
-				'TKT_row' => new EE_Integer_Field('TKT_row', __('How tickets are displayed in the ui', 'event_espresso'), false, 0 ),
64
+				'TKT_row' => new EE_Integer_Field('TKT_row', __('How tickets are displayed in the ui', 'event_espresso'), false, 0),
65 65
 				'TKT_deleted' => new EE_Trashed_Flag_Field('TKT_deleted', __('Flag indicating if this has been archived or not', 'event_espresso'), false, false),
66
-				'TKT_wp_user' => new EE_WP_User_Field('TKT_wp_user', __('Ticket Creator ID', 'event_espresso'), FALSE ),
67
-				'TKT_parent' => new EE_Integer_Field('TKT_parent', __('Indicates what TKT_ID is the parent of this TKT_ID (used in autosaves/revisions)'), true, 0 )
66
+				'TKT_wp_user' => new EE_WP_User_Field('TKT_wp_user', __('Ticket Creator ID', 'event_espresso'), FALSE),
67
+				'TKT_parent' => new EE_Integer_Field('TKT_parent', __('Indicates what TKT_ID is the parent of this TKT_ID (used in autosaves/revisions)'), true, 0)
68 68
 			));
69 69
 		$this->_model_relations = array(
70 70
 			'Datetime'=>new EE_HABTM_Relation('Datetime_Ticket'),
@@ -76,12 +76,12 @@  discard block
 block discarded – undo
76 76
 		);
77 77
 
78 78
 		//this model is generally available for reading
79
-		$this->_cap_restriction_generators[ EEM_Base::caps_read ] = new EE_Restriction_Generator_Default_Public('TKT_is_default', 'Datetime.Event');
79
+		$this->_cap_restriction_generators[EEM_Base::caps_read] = new EE_Restriction_Generator_Default_Public('TKT_is_default', 'Datetime.Event');
80 80
 		//account for default tickets in the caps
81
-		$this->_cap_restriction_generators[ EEM_Base::caps_read_admin ] = new EE_Restriction_Generator_Default_Protected( 'TKT_is_default', 'Datetime.Event' );
82
-		$this->_cap_restriction_generators[ EEM_Base::caps_edit ] = new EE_Restriction_Generator_Default_Protected( 'TKT_is_default', 'Datetime.Event' );
83
-		$this->_cap_restriction_generators[ EEM_Base::caps_delete ] = new EE_Restriction_Generator_Default_Protected( 'TKT_is_default', 'Datetime.Event' );
84
-		parent::__construct( $timezone );
81
+		$this->_cap_restriction_generators[EEM_Base::caps_read_admin] = new EE_Restriction_Generator_Default_Protected('TKT_is_default', 'Datetime.Event');
82
+		$this->_cap_restriction_generators[EEM_Base::caps_edit] = new EE_Restriction_Generator_Default_Protected('TKT_is_default', 'Datetime.Event');
83
+		$this->_cap_restriction_generators[EEM_Base::caps_delete] = new EE_Restriction_Generator_Default_Protected('TKT_is_default', 'Datetime.Event');
84
+		parent::__construct($timezone);
85 85
 	}
86 86
 
87 87
 
@@ -92,9 +92,9 @@  discard block
 block discarded – undo
92 92
 	 */
93 93
 	public function get_all_default_tickets() {
94 94
 		/** @type EE_Ticket[] $tickets */
95
-		$tickets = $this->get_all( array( array('TKT_is_default' => 1), 'order_by' => array('TKT_ID' => 'ASC')) );
95
+		$tickets = $this->get_all(array(array('TKT_is_default' => 1), 'order_by' => array('TKT_ID' => 'ASC')));
96 96
 		//we need to set the start date and end date to today's date and the start of the default dtt
97
-		return $this->_set_default_dates( $tickets );
97
+		return $this->_set_default_dates($tickets);
98 98
 	}
99 99
 
100 100
 
@@ -104,11 +104,11 @@  discard block
 block discarded – undo
104 104
 	 * @param EE_Ticket[] $tickets
105 105
 	 * @return EE_Ticket[]
106 106
 	 */
107
-	private function _set_default_dates( $tickets ) {
108
-		foreach ( $tickets as $ticket ) {
109
-			$ticket->set('TKT_start_date', (int)$this->current_time_for_query('TKT_start_date', true) );
110
-			$ticket->set('TKT_end_date', (int)$this->current_time_for_query( 'TKT_end_date', true ) + (60 * 60 * 24 * 30 ) );
111
-			$ticket->set_end_time( $this->convert_datetime_for_query( 'TKT_end_date', '11:59 pm', 'g:i a', $this->_timezone ) );
107
+	private function _set_default_dates($tickets) {
108
+		foreach ($tickets as $ticket) {
109
+			$ticket->set('TKT_start_date', (int) $this->current_time_for_query('TKT_start_date', true));
110
+			$ticket->set('TKT_end_date', (int) $this->current_time_for_query('TKT_end_date', true) + (60 * 60 * 24 * 30));
111
+			$ticket->set_end_time($this->convert_datetime_for_query('TKT_end_date', '11:59 pm', 'g:i a', $this->_timezone));
112 112
 		}
113 113
 
114 114
 		return $tickets;
@@ -123,8 +123,8 @@  discard block
 block discarded – undo
123 123
 	 * @param array $query_params
124 124
 	 * @return int
125 125
 	 */
126
-	public function sum_tickets_currently_available_at_datetime($DTT_ID, $query_params = array()){
127
-		return EEM_Datetime::instance()->sum_tickets_currently_available_at_datetime( $DTT_ID, $query_params );
126
+	public function sum_tickets_currently_available_at_datetime($DTT_ID, $query_params = array()) {
127
+		return EEM_Datetime::instance()->sum_tickets_currently_available_at_datetime($DTT_ID, $query_params);
128 128
 	}
129 129
 
130 130
 
@@ -136,8 +136,8 @@  discard block
 block discarded – undo
136 136
      * @return void
137 137
      * @throws \EE_Error
138 138
      */
139
-	public function update_tickets_sold($tickets){
140
-		foreach($tickets as $ticket){
139
+	public function update_tickets_sold($tickets) {
140
+		foreach ($tickets as $ticket) {
141 141
 			/* @var  $ticket EE_Ticket */
142 142
 			$ticket->update_tickets_sold();
143 143
 		}
@@ -156,7 +156,7 @@  discard block
 block discarded – undo
156 156
         return $this->get_all(
157 157
             array(
158 158
                 array(
159
-                    'TKT_reserved' => array( '>', 0 )
159
+                    'TKT_reserved' => array('>', 0)
160 160
                 )
161 161
             )
162 162
         );
@@ -176,7 +176,7 @@  discard block
 block discarded – undo
176 176
         return $this->get_all(
177 177
             array(
178 178
                 array(
179
-                    'TKT_ID' => array( 'IN', $ticket_IDs )
179
+                    'TKT_ID' => array('IN', $ticket_IDs)
180 180
                 )
181 181
             )
182 182
         );
Please login to merge, or discard this patch.
admin_pages/registrations/Registrations_Admin_Page.core.php 2 patches
Indentation   +2955 added lines, -2955 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if ( ! defined('EVENT_ESPRESSO_VERSION')) {
2
-    exit('No direct script access allowed');
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 
5 5
 
@@ -23,1844 +23,1844 @@  discard block
 block discarded – undo
23 23
 class Registrations_Admin_Page extends EE_Admin_Page_CPT
24 24
 {
25 25
 
26
-    /**
27
-     * @var EE_Registration
28
-     */
29
-    private $_registration;
30
-
31
-    /**
32
-     * @var EE_Event
33
-     */
34
-    private $_reg_event;
35
-
36
-    /**
37
-     * @var EE_Session
38
-     */
39
-    private $_session;
40
-
41
-    private static $_reg_status;
42
-
43
-    /**
44
-     * Form for displaying the custom questions for this registration.
45
-     * This gets used a few times throughout the request so its best to cache it
46
-     *
47
-     * @var EE_Registration_Custom_Questions_Form
48
-     */
49
-    protected $_reg_custom_questions_form = null;
50
-
51
-
52
-    /**
53
-     *        constructor
54
-     *
55
-     * @Constructor
56
-     * @access public
57
-     * @param bool $routing
58
-     * @return Registrations_Admin_Page
59
-     */
60
-    public function __construct($routing = true)
61
-    {
62
-        parent::__construct($routing);
63
-        add_action('wp_loaded', array($this, 'wp_loaded'));
64
-    }
65
-
66
-
67
-    public function wp_loaded()
68
-    {
69
-        // when adding a new registration...
70
-        if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71
-            EE_System::do_not_cache();
72
-            if ( ! isset($this->_req_data['processing_registration'])
73
-                 || absint($this->_req_data['processing_registration']) !== 1
74
-            ) {
75
-                // and it's NOT the attendee information reg step
76
-                // force cookie expiration by setting time to last week
77
-                setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
78
-                // and update the global
79
-                $_COOKIE['ee_registration_added'] = 0;
80
-            }
81
-        }
82
-    }
83
-
84
-
85
-    protected function _init_page_props()
86
-    {
87
-        $this->page_slug        = REG_PG_SLUG;
88
-        $this->_admin_base_url  = REG_ADMIN_URL;
89
-        $this->_admin_base_path = REG_ADMIN;
90
-        $this->page_label       = __('Registrations', 'event_espresso');
91
-        $this->_cpt_routes      = array(
92
-            'add_new_attendee' => 'espresso_attendees',
93
-            'edit_attendee'    => 'espresso_attendees',
94
-            'insert_attendee'  => 'espresso_attendees',
95
-            'update_attendee'  => 'espresso_attendees',
96
-        );
97
-        $this->_cpt_model_names = array(
98
-            'add_new_attendee' => 'EEM_Attendee',
99
-            'edit_attendee'    => 'EEM_Attendee',
100
-        );
101
-        $this->_cpt_edit_routes = array(
102
-            'espresso_attendees' => 'edit_attendee',
103
-        );
104
-        $this->_pagenow_map     = array(
105
-            'add_new_attendee' => 'post-new.php',
106
-            'edit_attendee'    => 'post.php',
107
-            'trash'            => 'post.php',
108
-        );
109
-        add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
110
-        //add filters so that the comment urls don't take users to a confusing 404 page
111
-        add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
112
-    }
113
-
114
-
115
-    public function clear_comment_link($link, $comment, $args)
116
-    {
117
-        //gotta make sure this only happens on this route
118
-        $post_type = get_post_type($comment->comment_post_ID);
119
-        if ($post_type === 'espresso_attendees') {
120
-            return '#commentsdiv';
121
-        }
122
-        return $link;
123
-    }
124
-
125
-
126
-    protected function _ajax_hooks()
127
-    {
128
-        //todo: all hooks for registrations ajax goes in here
129
-        add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
130
-    }
131
-
132
-
133
-    protected function _define_page_props()
134
-    {
135
-        $this->_admin_page_title = $this->page_label;
136
-        $this->_labels           = array(
137
-            'buttons'                      => array(
138
-                'add-registrant'      => __('Add New Registration', 'event_espresso'),
139
-                'add-attendee'        => __('Add Contact', 'event_espresso'),
140
-                'edit'                => __('Edit Contact', 'event_espresso'),
141
-                'report'              => __("Event Registrations CSV Report", "event_espresso"),
142
-                'report_all'          => __('All Registrations CSV Report', 'event_espresso'),
143
-                'report_filtered'     => __('Filtered CSV Report', 'event_espresso'),
144
-                'contact_list_report' => __('Contact List Report', 'event_espresso'),
145
-                'contact_list_export' => __("Export Data", "event_espresso"),
146
-            ),
147
-            'publishbox'                   => array(
148
-                'add_new_attendee' => __("Add Contact Record", 'event_espresso'),
149
-                'edit_attendee'    => __("Update Contact Record", 'event_espresso'),
150
-            ),
151
-            'hide_add_button_on_cpt_route' => array(
152
-                'edit_attendee' => true,
153
-            ),
154
-        );
155
-    }
156
-
157
-
158
-    /**
159
-     *        grab url requests and route them
160
-     *
161
-     * @access private
162
-     * @return void
163
-     */
164
-    public function _set_page_routes()
165
-    {
166
-        $this->_get_registration_status_array();
167
-        $reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
168
-            ? $this->_req_data['_REG_ID'] : 0;
169
-        $att_id             = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
170
-            ? $this->_req_data['ATT_ID'] : 0;
171
-        $att_id             = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post']) ? $this->_req_data['post']
172
-            : $att_id;
173
-        $this->_page_routes = array(
174
-            'default'                            => array(
175
-                'func'       => '_registrations_overview_list_table',
176
-                'capability' => 'ee_read_registrations',
177
-            ),
178
-            'view_registration'                  => array(
179
-                'func'       => '_registration_details',
180
-                'capability' => 'ee_read_registration',
181
-                'obj_id'     => $reg_id,
182
-            ),
183
-            'edit_registration'                  => array(
184
-                'func'               => '_update_attendee_registration_form',
185
-                'noheader'           => true,
186
-                'headers_sent_route' => 'view_registration',
187
-                'capability'         => 'ee_edit_registration',
188
-                'obj_id'             => $reg_id,
189
-                '_REG_ID'            => $reg_id,
190
-            ),
191
-            'trash_registrations'                => array(
192
-                'func'       => '_trash_or_restore_registrations',
193
-                'args'       => array('trash' => true),
194
-                'noheader'   => true,
195
-                'capability' => 'ee_delete_registrations',
196
-            ),
197
-            'restore_registrations'              => array(
198
-                'func'       => '_trash_or_restore_registrations',
199
-                'args'       => array('trash' => false),
200
-                'noheader'   => true,
201
-                'capability' => 'ee_delete_registrations',
202
-            ),
203
-            'delete_registrations'               => array(
204
-                'func'       => '_delete_registrations',
205
-                'noheader'   => true,
206
-                'capability' => 'ee_delete_registrations',
207
-            ),
208
-            'new_registration'                   => array(
209
-                'func'       => 'new_registration',
210
-                'capability' => 'ee_edit_registrations',
211
-            ),
212
-            'process_reg_step'                   => array(
213
-                'func'       => 'process_reg_step',
214
-                'noheader'   => true,
215
-                'capability' => 'ee_edit_registrations',
216
-            ),
217
-            'redirect_to_txn'                    => array(
218
-                'func'       => 'redirect_to_txn',
219
-                'noheader'   => true,
220
-                'capability' => 'ee_edit_registrations',
221
-            ),
222
-            'change_reg_status'                  => array(
223
-                'func'       => '_change_reg_status',
224
-                'noheader'   => true,
225
-                'capability' => 'ee_edit_registration',
226
-                'obj_id'     => $reg_id,
227
-            ),
228
-            'approve_registration'               => array(
229
-                'func'       => 'approve_registration',
230
-                'noheader'   => true,
231
-                'capability' => 'ee_edit_registration',
232
-                'obj_id'     => $reg_id,
233
-            ),
234
-            'approve_and_notify_registration'    => array(
235
-                'func'       => 'approve_registration',
236
-                'noheader'   => true,
237
-                'args'       => array(true),
238
-                'capability' => 'ee_edit_registration',
239
-                'obj_id'     => $reg_id,
240
-            ),
241
-            'decline_registration'               => array(
242
-                'func'       => 'decline_registration',
243
-                'noheader'   => true,
244
-                'capability' => 'ee_edit_registration',
245
-                'obj_id'     => $reg_id,
246
-            ),
247
-            'decline_and_notify_registration'    => array(
248
-                'func'       => 'decline_registration',
249
-                'noheader'   => true,
250
-                'args'       => array(true),
251
-                'capability' => 'ee_edit_registration',
252
-                'obj_id'     => $reg_id,
253
-            ),
254
-            'pending_registration'               => array(
255
-                'func'       => 'pending_registration',
256
-                'noheader'   => true,
257
-                'capability' => 'ee_edit_registration',
258
-                'obj_id'     => $reg_id,
259
-            ),
260
-            'pending_and_notify_registration'    => array(
261
-                'func'       => 'pending_registration',
262
-                'noheader'   => true,
263
-                'args'       => array(true),
264
-                'capability' => 'ee_edit_registration',
265
-                'obj_id'     => $reg_id,
266
-            ),
267
-            'no_approve_registration'            => array(
268
-                'func'       => 'not_approve_registration',
269
-                'noheader'   => true,
270
-                'capability' => 'ee_edit_registration',
271
-                'obj_id'     => $reg_id,
272
-            ),
273
-            'no_approve_and_notify_registration' => array(
274
-                'func'       => 'not_approve_registration',
275
-                'noheader'   => true,
276
-                'args'       => array(true),
277
-                'capability' => 'ee_edit_registration',
278
-                'obj_id'     => $reg_id,
279
-            ),
280
-            'cancel_registration'                => array(
281
-                'func'       => 'cancel_registration',
282
-                'noheader'   => true,
283
-                'capability' => 'ee_edit_registration',
284
-                'obj_id'     => $reg_id,
285
-            ),
286
-            'cancel_and_notify_registration'     => array(
287
-                'func'       => 'cancel_registration',
288
-                'noheader'   => true,
289
-                'args'       => array(true),
290
-                'capability' => 'ee_edit_registration',
291
-                'obj_id'     => $reg_id,
292
-            ),
293
-            'contact_list'                       => array(
294
-                'func'       => '_attendee_contact_list_table',
295
-                'capability' => 'ee_read_contacts',
296
-            ),
297
-            'add_new_attendee'                   => array(
298
-                'func' => '_create_new_cpt_item',
299
-                'args' => array(
300
-                    'new_attendee' => true,
301
-                    'capability'   => 'ee_edit_contacts',
302
-                ),
303
-            ),
304
-            'edit_attendee'                      => array(
305
-                'func'       => '_edit_cpt_item',
306
-                'capability' => 'ee_edit_contacts',
307
-                'obj_id'     => $att_id,
308
-            ),
309
-            'duplicate_attendee'                 => array(
310
-                'func'       => '_duplicate_attendee',
311
-                'noheader'   => true,
312
-                'capability' => 'ee_edit_contacts',
313
-                'obj_id'     => $att_id,
314
-            ),
315
-            'insert_attendee'                    => array(
316
-                'func'       => '_insert_or_update_attendee',
317
-                'args'       => array(
318
-                    'new_attendee' => true,
319
-                ),
320
-                'noheader'   => true,
321
-                'capability' => 'ee_edit_contacts',
322
-            ),
323
-            'update_attendee'                    => array(
324
-                'func'       => '_insert_or_update_attendee',
325
-                'args'       => array(
326
-                    'new_attendee' => false,
327
-                ),
328
-                'noheader'   => true,
329
-                'capability' => 'ee_edit_contacts',
330
-                'obj_id'     => $att_id,
331
-            ),
332
-            'trash_attendees'                    => array(
333
-                'func'       => '_trash_or_restore_attendees',
334
-                'args'       => array(
335
-                    'trash' => true,
336
-                ),
337
-                'noheader'   => true,
338
-                'capability' => 'ee_delete_contacts',
339
-                'obj_id'     => $att_id,
340
-            ),
341
-            'restore_attendees'                  => array(
342
-                'func'       => '_trash_or_restore_attendees',
343
-                'args'       => array(
344
-                    'trash' => false,
345
-                ),
346
-                'noheader'   => true,
347
-                'capability' => 'ee_delete_contacts',
348
-                'obj_id'     => $att_id,
349
-            ),
350
-            'resend_registration'                => array(
351
-                'func'       => '_resend_registration',
352
-                'noheader'   => true,
353
-                'capability' => 'ee_send_message',
354
-            ),
355
-            'registrations_report'               => array(
356
-                'func'       => '_registrations_report',
357
-                'noheader'   => true,
358
-                'capability' => 'ee_read_registrations',
359
-            ),
360
-            'contact_list_export'                => array(
361
-                'func'       => '_contact_list_export',
362
-                'noheader'   => true,
363
-                'capability' => 'export',
364
-            ),
365
-            'contact_list_report'                => array(
366
-                'func'       => '_contact_list_report',
367
-                'noheader'   => true,
368
-                'capability' => 'ee_read_contacts',
369
-            ),
370
-        );
371
-    }
372
-
373
-
374
-    protected function _set_page_config()
375
-    {
376
-        $this->_page_config = array(
377
-            'default'           => array(
378
-                'nav'           => array(
379
-                    'label' => __('Overview', 'event_espresso'),
380
-                    'order' => 5,
381
-                ),
382
-                'help_tabs'     => array(
383
-                    'registrations_overview_help_tab'                       => array(
384
-                        'title'    => __('Registrations Overview', 'event_espresso'),
385
-                        'filename' => 'registrations_overview',
386
-                    ),
387
-                    'registrations_overview_table_column_headings_help_tab' => array(
388
-                        'title'    => __('Registrations Table Column Headings', 'event_espresso'),
389
-                        'filename' => 'registrations_overview_table_column_headings',
390
-                    ),
391
-                    'registrations_overview_filters_help_tab'               => array(
392
-                        'title'    => __('Registration Filters', 'event_espresso'),
393
-                        'filename' => 'registrations_overview_filters',
394
-                    ),
395
-                    'registrations_overview_views_help_tab'                 => array(
396
-                        'title'    => __('Registration Views', 'event_espresso'),
397
-                        'filename' => 'registrations_overview_views',
398
-                    ),
399
-                    'registrations_regoverview_other_help_tab'              => array(
400
-                        'title'    => __('Registrations Other', 'event_espresso'),
401
-                        'filename' => 'registrations_overview_other',
402
-                    ),
403
-                ),
404
-                'help_tour'     => array('Registration_Overview_Help_Tour'),
405
-                'qtips'         => array('Registration_List_Table_Tips'),
406
-                'list_table'    => 'EE_Registrations_List_Table',
407
-                'require_nonce' => false,
408
-            ),
409
-            'view_registration' => array(
410
-                'nav'           => array(
411
-                    'label'      => __('REG Details', 'event_espresso'),
412
-                    'order'      => 15,
413
-                    'url'        => isset($this->_req_data['_REG_ID'])
414
-                        ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
415
-                        : $this->_admin_base_url,
416
-                    'persistent' => false,
417
-                ),
418
-                'help_tabs'     => array(
419
-                    'registrations_details_help_tab'                    => array(
420
-                        'title'    => __('Registration Details', 'event_espresso'),
421
-                        'filename' => 'registrations_details',
422
-                    ),
423
-                    'registrations_details_table_help_tab'              => array(
424
-                        'title'    => __('Registration Details Table', 'event_espresso'),
425
-                        'filename' => 'registrations_details_table',
426
-                    ),
427
-                    'registrations_details_form_answers_help_tab'       => array(
428
-                        'title'    => __('Registration Form Answers', 'event_espresso'),
429
-                        'filename' => 'registrations_details_form_answers',
430
-                    ),
431
-                    'registrations_details_registrant_details_help_tab' => array(
432
-                        'title'    => __('Contact Details', 'event_espresso'),
433
-                        'filename' => 'registrations_details_registrant_details',
434
-                    ),
435
-                ),
436
-                'help_tour'     => array('Registration_Details_Help_Tour'),
437
-                'metaboxes'     => array_merge($this->_default_espresso_metaboxes,
438
-                    array('_registration_details_metaboxes')),
439
-                'require_nonce' => false,
440
-            ),
441
-            'new_registration'  => array(
442
-                'nav'           => array(
443
-                    'label'      => __('Add New Registration', 'event_espresso'),
444
-                    'url'        => '#',
445
-                    'order'      => 15,
446
-                    'persistent' => false,
447
-                ),
448
-                'metaboxes'     => $this->_default_espresso_metaboxes,
449
-                'labels'        => array(
450
-                    'publishbox' => __('Save Registration', 'event_espresso'),
451
-                ),
452
-                'require_nonce' => false,
453
-            ),
454
-            'add_new_attendee'  => array(
455
-                'nav'           => array(
456
-                    'label'      => __('Add Contact', 'event_espresso'),
457
-                    'order'      => 15,
458
-                    'persistent' => false,
459
-                ),
460
-                'metaboxes'     => array_merge($this->_default_espresso_metaboxes,
461
-                    array('_publish_post_box', 'attendee_editor_metaboxes')),
462
-                'require_nonce' => false,
463
-            ),
464
-            'edit_attendee'     => array(
465
-                'nav'           => array(
466
-                    'label'      => __('Edit Contact', 'event_espresso'),
467
-                    'order'      => 15,
468
-                    'persistent' => false,
469
-                    'url'        => isset($this->_req_data['ATT_ID'])
470
-                        ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
471
-                        : $this->_admin_base_url,
472
-                ),
473
-                'metaboxes'     => array('attendee_editor_metaboxes'),
474
-                'require_nonce' => false,
475
-            ),
476
-            'contact_list'      => array(
477
-                'nav'           => array(
478
-                    'label' => __('Contact List', 'event_espresso'),
479
-                    'order' => 20,
480
-                ),
481
-                'list_table'    => 'EE_Attendee_Contact_List_Table',
482
-                'help_tabs'     => array(
483
-                    'registrations_contact_list_help_tab'                       => array(
484
-                        'title'    => __('Registrations Contact List', 'event_espresso'),
485
-                        'filename' => 'registrations_contact_list',
486
-                    ),
487
-                    'registrations_contact-list_table_column_headings_help_tab' => array(
488
-                        'title'    => __('Contact List Table Column Headings', 'event_espresso'),
489
-                        'filename' => 'registrations_contact_list_table_column_headings',
490
-                    ),
491
-                    'registrations_contact_list_views_help_tab'                 => array(
492
-                        'title'    => __('Contact List Views', 'event_espresso'),
493
-                        'filename' => 'registrations_contact_list_views',
494
-                    ),
495
-                    'registrations_contact_list_other_help_tab'                 => array(
496
-                        'title'    => __('Contact List Other', 'event_espresso'),
497
-                        'filename' => 'registrations_contact_list_other',
498
-                    ),
499
-                ),
500
-                'help_tour'     => array('Contact_List_Help_Tour'),
501
-                'metaboxes'     => array(),
502
-                'require_nonce' => false,
503
-            ),
504
-            //override default cpt routes
505
-            'create_new'        => '',
506
-            'edit'              => '',
507
-        );
508
-    }
509
-
510
-
511
-    /**
512
-     * The below methods aren't used by this class currently
513
-     */
514
-    protected function _add_screen_options()
515
-    {
516
-    }
517
-
518
-
519
-    protected function _add_feature_pointers()
520
-    {
521
-    }
522
-
523
-
524
-    public function admin_init()
525
-    {
526
-        EE_Registry::$i18n_js_strings['update_att_qstns'] = __('click "Update Registration Questions" to save your changes',
527
-            'event_espresso');
528
-    }
529
-
530
-
531
-    public function admin_notices()
532
-    {
533
-    }
534
-
535
-
536
-    public function admin_footer_scripts()
537
-    {
538
-    }
539
-
540
-
541
-    /**
542
-     *        get list of registration statuses
543
-     *
544
-     * @access private
545
-     * @return void
546
-     */
547
-    private function _get_registration_status_array()
548
-    {
549
-        self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
550
-    }
551
-
552
-
553
-    protected function _add_screen_options_default()
554
-    {
555
-        $this->_per_page_screen_option();
556
-    }
557
-
558
-
559
-    protected function _add_screen_options_contact_list()
560
-    {
561
-        $page_title              = $this->_admin_page_title;
562
-        $this->_admin_page_title = __("Contacts", 'event_espresso');
563
-        $this->_per_page_screen_option();
564
-        $this->_admin_page_title = $page_title;
565
-    }
566
-
567
-
568
-    public function load_scripts_styles()
569
-    {
570
-        //style
571
-        //wp_register_style('espresso_attendees', ATT_ASSETS_URL . 'espresso_attendees_admin.css', array(), EVENT_ESPRESSO_VERSION );
572
-        wp_register_style('espresso_reg', REG_ASSETS_URL . 'espresso_registrations_admin.css', array('ee-admin-css'),
573
-            EVENT_ESPRESSO_VERSION);
574
-        wp_enqueue_style('espresso_reg');
575
-        //script
576
-        wp_register_script('espresso_reg', REG_ASSETS_URL . 'espresso_registrations_admin.js',
577
-            array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'), EVENT_ESPRESSO_VERSION, true);
578
-        wp_enqueue_script('espresso_reg');
579
-    }
580
-
581
-
582
-    public function load_scripts_styles_edit_attendee()
583
-    {
584
-        //stuff to only show up on our attendee edit details page.
585
-        $attendee_details_translations = array(
586
-            'att_publish_text' => sprintf(__('Created on: <b>%1$s</b>', 'event_espresso'),
587
-                $this->_cpt_model_obj->get_datetime('ATT_created')),
588
-        );
589
-        wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
590
-        wp_enqueue_script('jquery-validate');
591
-    }
592
-
593
-
594
-    public function load_scripts_styles_view_registration()
595
-    {
596
-        //styles
597
-        wp_enqueue_style('espresso-ui-theme');
598
-        //scripts
599
-        $this->_get_reg_custom_questions_form($this->_registration->ID());
600
-        $this->_reg_custom_questions_form->wp_enqueue_scripts(true);
601
-    }
602
-
603
-
604
-    public function load_scripts_styles_contact_list()
605
-    {
606
-        wp_deregister_style('espresso_reg');
607
-        wp_register_style('espresso_att', REG_ASSETS_URL . 'espresso_attendees_admin.css', array('ee-admin-css'),
608
-            EVENT_ESPRESSO_VERSION);
609
-        wp_enqueue_style('espresso_att');
610
-    }
611
-
612
-
613
-    public function load_scripts_styles_new_registration()
614
-    {
615
-        wp_register_script('ee-spco-for-admin', REG_ASSETS_URL . 'spco_for_admin.js', array('underscore', 'jquery'),
616
-            EVENT_ESPRESSO_VERSION, true);
617
-        wp_enqueue_script('ee-spco-for-admin');
618
-        add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
619
-        EE_Form_Section_Proper::wp_enqueue_scripts();
620
-        EED_Ticket_Selector::load_tckt_slctr_assets();
621
-        EE_Datepicker_Input::enqueue_styles_and_scripts();
622
-    }
623
-
624
-
625
-    public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
626
-    {
627
-        add_filter('FHEE_load_EE_messages', '__return_true');
628
-    }
629
-
630
-
631
-    public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
632
-    {
633
-        add_filter('FHEE_load_EE_messages', '__return_true');
634
-    }
635
-
636
-
637
-    protected function _set_list_table_views_default()
638
-    {
639
-        //for notification related bulk actions we need to make sure only active messengers have an option.
640
-        EED_Messages::set_autoloaders();
641
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
642
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
643
-        $active_mts               = $message_resource_manager->list_of_active_message_types();
644
-        //key= bulk_action_slug, value= message type.
645
-        $match_array = array(
646
-            'approve_registration'    => 'registration',
647
-            'decline_registration'    => 'declined_registration',
648
-            'pending_registration'    => 'pending_approval',
649
-            'no_approve_registration' => 'not_approved_registration',
650
-            'cancel_registration'     => 'cancelled_registration',
651
-        );
652
-        /** setup reg status bulk actions **/
653
-        $def_reg_status_actions['approve_registration'] = __('Approve Registrations', 'event_espresso');
654
-        if (in_array($match_array['approve_registration'], $active_mts)
655
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
656
-        ) {
657
-            $def_reg_status_actions['approve_and_notify_registration'] = __('Approve and Notify Registrations',
658
-                'event_espresso');
659
-        }
660
-        $def_reg_status_actions['decline_registration'] = __('Decline Registrations', 'event_espresso');
661
-        if (in_array($match_array['decline_registration'], $active_mts)
662
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
663
-        ) {
664
-            $def_reg_status_actions['decline_and_notify_registration'] = __('Decline and Notify Registrations',
665
-                'event_espresso');
666
-        }
667
-        $def_reg_status_actions['pending_registration'] = __('Set Registrations to Pending Payment', 'event_espresso');
668
-        if (in_array($match_array['pending_registration'], $active_mts)
669
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
670
-        ) {
671
-            $def_reg_status_actions['pending_and_notify_registration'] = __('Set Registrations to Pending Payment and Notify',
672
-                'event_espresso');
673
-        }
674
-        $def_reg_status_actions['no_approve_registration'] = __('Set Registrations to Not Approved', 'event_espresso');
675
-        if (in_array($match_array['no_approve_registration'], $active_mts)
676
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
677
-        ) {
678
-            $def_reg_status_actions['no_approve_and_notify_registration'] = __('Set Registrations to Not Approved and Notify',
679
-                'event_espresso');
680
-        }
681
-        $def_reg_status_actions['cancel_registration'] = __('Cancel Registrations', 'event_espresso');
682
-        if (in_array($match_array['cancel_registration'], $active_mts)
683
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
684
-        ) {
685
-            $def_reg_status_actions['cancel_and_notify_registration'] = __('Cancel Registrations and Notify',
686
-                'event_espresso');
687
-        }
688
-        $this->_views = array(
689
-            'all'   => array(
690
-                'slug'        => 'all',
691
-                'label'       => __('View All Registrations', 'event_espresso'),
692
-                'count'       => 0,
693
-                'bulk_action' => array_merge($def_reg_status_actions, array(
694
-                    'trash_registrations' => __('Trash Registrations', 'event_espresso'),
695
-                )),
696
-            ),
697
-            'month' => array(
698
-                'slug'        => 'month',
699
-                'label'       => __('This Month', 'event_espresso'),
700
-                'count'       => 0,
701
-                'bulk_action' => array_merge($def_reg_status_actions, array(
702
-                    'trash_registrations' => __('Trash Registrations', 'event_espresso'),
703
-                )),
704
-            ),
705
-            'today' => array(
706
-                'slug'        => 'today',
707
-                'label'       => sprintf(__('Today - %s', 'event_espresso'), date('M d, Y', current_time('timestamp'))),
708
-                'count'       => 0,
709
-                'bulk_action' => array_merge($def_reg_status_actions, array(
710
-                    'trash_registrations' => __('Trash Registrations', 'event_espresso'),
711
-                )),
712
-            ),
713
-        );
714
-        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_registrations',
715
-            'espresso_registrations_delete_registration')
716
-        ) {
717
-            $this->_views['incomplete'] = array(
718
-                'slug'        => 'incomplete',
719
-                'label'       => __('Incomplete', 'event_espresso'),
720
-                'count'       => 0,
721
-                'bulk_action' => array(
722
-                    'trash_registrations' => __('Trash Registrations', 'event_espresso'),
723
-                ),
724
-            );
725
-            $this->_views['trash']      = array(
726
-                'slug'        => 'trash',
727
-                'label'       => __('Trash', 'event_espresso'),
728
-                'count'       => 0,
729
-                'bulk_action' => array(
730
-                    'restore_registrations' => __('Restore Registrations', 'event_espresso'),
731
-                    'delete_registrations'  => __('Delete Registrations Permanently', 'event_espresso'),
732
-                ),
733
-            );
734
-        }
735
-    }
736
-
737
-
738
-    protected function _set_list_table_views_contact_list()
739
-    {
740
-        $this->_views = array(
741
-            'in_use' => array(
742
-                'slug'        => 'in_use',
743
-                'label'       => __('In Use', 'event_espresso'),
744
-                'count'       => 0,
745
-                'bulk_action' => array(
746
-                    'trash_attendees' => __('Move to Trash', 'event_espresso'),
747
-                ),
748
-            ),
749
-        );
750
-        if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts',
751
-            'espresso_registrations_trash_attendees')
752
-        ) {
753
-            $this->_views['trash'] = array(
754
-                'slug'        => 'trash',
755
-                'label'       => __('Trash', 'event_espresso'),
756
-                'count'       => 0,
757
-                'bulk_action' => array(
758
-                    'restore_attendees' => __('Restore from Trash', 'event_espresso'),
759
-                ),
760
-            );
761
-        }
762
-    }
763
-
764
-
765
-    protected function _registration_legend_items()
766
-    {
767
-        $fc_items = array(
768
-            'star-icon'        => array(
769
-                'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
770
-                'desc'  => __('This is the Primary Registrant', 'event_espresso'),
771
-            ),
772
-            'view_details'     => array(
773
-                'class' => 'dashicons dashicons-clipboard',
774
-                'desc'  => __('View Registration Details', 'event_espresso'),
775
-            ),
776
-            'edit_attendee'    => array(
777
-                'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
778
-                'desc'  => __('Edit Contact Details', 'event_espresso'),
779
-            ),
780
-            'view_transaction' => array(
781
-                'class' => 'dashicons dashicons-cart',
782
-                'desc'  => __('View Transaction Details', 'event_espresso'),
783
-            ),
784
-            'view_invoice'     => array(
785
-                'class' => 'dashicons dashicons-media-spreadsheet',
786
-                'desc'  => __('View Transaction Invoice', 'event_espresso'),
787
-            ),
788
-        );
789
-        if (EE_Registry::instance()->CAP->current_user_can('ee_send_message',
790
-            'espresso_registrations_resend_registration')
791
-        ) {
792
-            $fc_items['resend_registration'] = array(
793
-                'class' => 'dashicons dashicons-email-alt',
794
-                'desc'  => __('Resend Registration Details', 'event_espresso'),
795
-            );
796
-        } else {
797
-            $fc_items['blank'] = array('class' => 'blank', 'desc' => '');
798
-        }
799
-        if (EE_Registry::instance()->CAP->current_user_can('ee_read_global_messages', 'view_filtered_messages')) {
800
-            $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
801
-            if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
802
-                $fc_items['view_related_messages'] = array(
803
-                    'class' => $related_for_icon['css_class'],
804
-                    'desc'  => $related_for_icon['label'],
805
-                );
806
-            }
807
-        }
808
-        $sc_items = array(
809
-            'approved_status'   => array(
810
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
811
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
812
-            ),
813
-            'pending_status'    => array(
814
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
815
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
816
-            ),
817
-            'wait_list'         => array(
818
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
819
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
820
-            ),
821
-            'incomplete_status' => array(
822
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
823
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_incomplete, false, 'sentence'),
824
-            ),
825
-            'not_approved'      => array(
826
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
827
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
828
-            ),
829
-            'declined_status'   => array(
830
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
831
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
832
-            ),
833
-            'cancelled_status'  => array(
834
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
835
-                'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
836
-            ),
837
-        );
838
-        return array_merge($fc_items, $sc_items);
839
-    }
840
-
841
-
842
-
843
-    /***************************************        REGISTRATION OVERVIEW        **************************************/
844
-    /**
845
-     * @throws \EE_Error
846
-     */
847
-    protected function _registrations_overview_list_table()
848
-    {
849
-        $this->_template_args['admin_page_header'] = '';
850
-        $EVT_ID                                    = ! empty($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : 0;
851
-        if ($EVT_ID) {
852
-            if (EE_Registry::instance()->CAP->current_user_can('ee_edit_registrations',
853
-                'espresso_registrations_new_registration', $EVT_ID)
854
-            ) {
855
-                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button('new_registration', 'add-registrant',
856
-                        array('event_id' => $EVT_ID), 'add-new-h2');
857
-            }
858
-            $event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
859
-            if ($event instanceof EE_Event) {
860
-                $this->_template_args['admin_page_header'] = sprintf(__('%s Viewing registrations for the event: %s%s',
861
-                    'event_espresso'), '<h3 style="line-height:1.5em;">',
862
-                    '<br /><a href="' . EE_Admin_Page::add_query_args_and_nonce(array(
863
-                        'action' => 'edit',
864
-                        'post'   => $event->ID(),
865
-                    ), EVENTS_ADMIN_URL) . '">&nbsp;' . $event->get('EVT_name') . '&nbsp;</a>&nbsp;', '</h3>');
866
-            }
867
-            $DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
868
-            $datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
869
-            if ($datetime instanceof EE_Datetime && $this->_template_args['admin_page_header'] !== '') {
870
-                $this->_template_args['admin_page_header'] = substr($this->_template_args['admin_page_header'], 0, -5);
871
-                $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
872
-                $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
873
-                $this->_template_args['admin_page_header'] .= $datetime->name();
874
-                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
875
-                $this->_template_args['admin_page_header'] .= '</span></h3>';
876
-            }
877
-        }
878
-        $this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
879
-        $this->display_admin_list_table_page_with_no_sidebar();
880
-    }
881
-
882
-
883
-    /**
884
-     * This sets the _registration property for the registration details screen
885
-     *
886
-     * @access private
887
-     * @return bool
888
-     */
889
-    private function _set_registration_object()
890
-    {
891
-        //get out if we've already set the object
892
-        if (is_object($this->_registration)) {
893
-            return true;
894
-        }
895
-        $REG    = EEM_Registration::instance();
896
-        $REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
897
-        if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
898
-            return true;
899
-        } else {
900
-            $error_msg = sprintf(__('An error occurred and the details for Registration ID #%s could not be retrieved.',
901
-                'event_espresso'), $REG_ID);
902
-            EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
903
-            $this->_registration = null;
904
-            return false;
905
-        }
906
-    }
907
-
908
-
909
-    /**
910
-     * Used to retrieve registrations for the list table.
911
-     *
912
-     * @param int    $per_page
913
-     * @param bool   $count
914
-     * @param bool   $this_month
915
-     * @param bool   $today
916
-     * @return \EE_Registration[]|int
917
-     */
918
-    public function get_registrations(
919
-        $per_page = 10,
920
-        $count = false,
921
-        $this_month = false,
922
-        $today = false
923
-    ) {
924
-        if( $this_month ) {
925
-            $this->_req_data['status'] = 'month';
926
-        }
927
-        if( $today ) {
928
-            $this->_req_data['status'] = 'today';
929
-        }
930
-        $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
931
-        /**
932
-         * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
933
-         * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
934
-         * @see EEM_Base::get_all()
935
-         */
936
-        $query_params['group_by'] = '';
937
-
938
-        return $count
939
-            ? EEM_Registration::instance()->count($query_params)
940
-            /** @type EE_Registration[] */
941
-            : EEM_Registration::instance()->get_all($query_params);
942
-    }
943
-
944
-
945
-
946
-    /**
947
-     * Retrieves the query parameters to be used by the Registration model for getting registrations.
948
-     * Note: this listens to values on the request for some of the query parameters.
949
-     *
950
-     * @param array $request
951
-     * @param int    $per_page
952
-     * @param bool   $count
953
-     * @return array
954
-     */
955
-    protected function _get_registration_query_parameters(
956
-        $request = array(),
957
-        $per_page = 10,
958
-        $count = false
959
-    ) {
960
-
961
-        $query_params = array(
962
-            0                          => $this->_get_where_conditions_for_registrations_query(
963
-                $request
964
-            ),
965
-            'caps'                     => EEM_Registration::caps_read_admin,
966
-            'default_where_conditions' => 'this_model_only',
967
-        );
968
-        if ( ! $count) {
969
-            $query_params = array_merge(
970
-                $query_params,
971
-                $this->_get_orderby_for_registrations_query(),
972
-                $this->_get_limit($per_page)
973
-            );
974
-        }
975
-
976
-        return $query_params;
977
-    }
978
-
979
-
980
-    /**
981
-     * This will add EVT_ID to the provided $where array for EE model query parameters.
982
-     *
983
-     * @param array $request usually the same as $this->_req_data but not necessarily
984
-     * @return array
985
-     */
986
-    protected function _add_event_id_to_where_conditions(array $request)
987
-    {
988
-        $where = array();
989
-        if ( ! empty($request['event_id'])) {
990
-            $where['EVT_ID'] = absint($request['event_id']);
991
-        }
992
-        return $where;
993
-    }
994
-
995
-
996
-    /**
997
-     * Adds category ID if it exists in the request to the where conditions for the registrations query.
998
-     *
999
-     * @param array $request usually the same as $this->_req_data but not necessarily
1000
-     * @return array
1001
-     */
1002
-    protected function _add_category_id_to_where_conditions(array $request)
1003
-    {
1004
-        $where = array();
1005
-        if ( ! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1006
-            $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1007
-        }
1008
-        return $where;
1009
-    }
1010
-
1011
-
1012
-    /**
1013
-     * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1014
-     *
1015
-     * @param array $request usually the same as $this->_req_data but not necessarily
1016
-     * @return array
1017
-     */
1018
-    protected function _add_datetime_id_to_where_conditions(array $request)
1019
-    {
1020
-        $where = array();
1021
-        if ( ! empty($request['datetime_id'])) {
1022
-            $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1023
-        }
1024
-        if( ! empty($request['DTT_ID'])){
1025
-            $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1026
-        }
1027
-        return $where;
1028
-    }
1029
-
1030
-
1031
-    /**
1032
-     * Adds the correct registration status to the where conditions for the registrations query.
1033
-     *
1034
-     * @param array $request usually the same as $this->_req_data but not necessarily
1035
-     * @return array
1036
-     */
1037
-    protected function _add_registration_status_to_where_conditions(array $request)
1038
-    {
1039
-        $where = array();
1040
-        $view  = EEH_Array::is_set( $request, 'status', '' );
1041
-        $registration_status = ! empty($request['_reg_status'])
1042
-            ? sanitize_text_field($request['_reg_status'])
1043
-            : '';
1044
-
1045
-        /*
26
+	/**
27
+	 * @var EE_Registration
28
+	 */
29
+	private $_registration;
30
+
31
+	/**
32
+	 * @var EE_Event
33
+	 */
34
+	private $_reg_event;
35
+
36
+	/**
37
+	 * @var EE_Session
38
+	 */
39
+	private $_session;
40
+
41
+	private static $_reg_status;
42
+
43
+	/**
44
+	 * Form for displaying the custom questions for this registration.
45
+	 * This gets used a few times throughout the request so its best to cache it
46
+	 *
47
+	 * @var EE_Registration_Custom_Questions_Form
48
+	 */
49
+	protected $_reg_custom_questions_form = null;
50
+
51
+
52
+	/**
53
+	 *        constructor
54
+	 *
55
+	 * @Constructor
56
+	 * @access public
57
+	 * @param bool $routing
58
+	 * @return Registrations_Admin_Page
59
+	 */
60
+	public function __construct($routing = true)
61
+	{
62
+		parent::__construct($routing);
63
+		add_action('wp_loaded', array($this, 'wp_loaded'));
64
+	}
65
+
66
+
67
+	public function wp_loaded()
68
+	{
69
+		// when adding a new registration...
70
+		if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') {
71
+			EE_System::do_not_cache();
72
+			if ( ! isset($this->_req_data['processing_registration'])
73
+				 || absint($this->_req_data['processing_registration']) !== 1
74
+			) {
75
+				// and it's NOT the attendee information reg step
76
+				// force cookie expiration by setting time to last week
77
+				setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/');
78
+				// and update the global
79
+				$_COOKIE['ee_registration_added'] = 0;
80
+			}
81
+		}
82
+	}
83
+
84
+
85
+	protected function _init_page_props()
86
+	{
87
+		$this->page_slug        = REG_PG_SLUG;
88
+		$this->_admin_base_url  = REG_ADMIN_URL;
89
+		$this->_admin_base_path = REG_ADMIN;
90
+		$this->page_label       = __('Registrations', 'event_espresso');
91
+		$this->_cpt_routes      = array(
92
+			'add_new_attendee' => 'espresso_attendees',
93
+			'edit_attendee'    => 'espresso_attendees',
94
+			'insert_attendee'  => 'espresso_attendees',
95
+			'update_attendee'  => 'espresso_attendees',
96
+		);
97
+		$this->_cpt_model_names = array(
98
+			'add_new_attendee' => 'EEM_Attendee',
99
+			'edit_attendee'    => 'EEM_Attendee',
100
+		);
101
+		$this->_cpt_edit_routes = array(
102
+			'espresso_attendees' => 'edit_attendee',
103
+		);
104
+		$this->_pagenow_map     = array(
105
+			'add_new_attendee' => 'post-new.php',
106
+			'edit_attendee'    => 'post.php',
107
+			'trash'            => 'post.php',
108
+		);
109
+		add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10);
110
+		//add filters so that the comment urls don't take users to a confusing 404 page
111
+		add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3);
112
+	}
113
+
114
+
115
+	public function clear_comment_link($link, $comment, $args)
116
+	{
117
+		//gotta make sure this only happens on this route
118
+		$post_type = get_post_type($comment->comment_post_ID);
119
+		if ($post_type === 'espresso_attendees') {
120
+			return '#commentsdiv';
121
+		}
122
+		return $link;
123
+	}
124
+
125
+
126
+	protected function _ajax_hooks()
127
+	{
128
+		//todo: all hooks for registrations ajax goes in here
129
+		add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status'));
130
+	}
131
+
132
+
133
+	protected function _define_page_props()
134
+	{
135
+		$this->_admin_page_title = $this->page_label;
136
+		$this->_labels           = array(
137
+			'buttons'                      => array(
138
+				'add-registrant'      => __('Add New Registration', 'event_espresso'),
139
+				'add-attendee'        => __('Add Contact', 'event_espresso'),
140
+				'edit'                => __('Edit Contact', 'event_espresso'),
141
+				'report'              => __("Event Registrations CSV Report", "event_espresso"),
142
+				'report_all'          => __('All Registrations CSV Report', 'event_espresso'),
143
+				'report_filtered'     => __('Filtered CSV Report', 'event_espresso'),
144
+				'contact_list_report' => __('Contact List Report', 'event_espresso'),
145
+				'contact_list_export' => __("Export Data", "event_espresso"),
146
+			),
147
+			'publishbox'                   => array(
148
+				'add_new_attendee' => __("Add Contact Record", 'event_espresso'),
149
+				'edit_attendee'    => __("Update Contact Record", 'event_espresso'),
150
+			),
151
+			'hide_add_button_on_cpt_route' => array(
152
+				'edit_attendee' => true,
153
+			),
154
+		);
155
+	}
156
+
157
+
158
+	/**
159
+	 *        grab url requests and route them
160
+	 *
161
+	 * @access private
162
+	 * @return void
163
+	 */
164
+	public function _set_page_routes()
165
+	{
166
+		$this->_get_registration_status_array();
167
+		$reg_id             = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID'])
168
+			? $this->_req_data['_REG_ID'] : 0;
169
+		$att_id             = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID'])
170
+			? $this->_req_data['ATT_ID'] : 0;
171
+		$att_id             = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post']) ? $this->_req_data['post']
172
+			: $att_id;
173
+		$this->_page_routes = array(
174
+			'default'                            => array(
175
+				'func'       => '_registrations_overview_list_table',
176
+				'capability' => 'ee_read_registrations',
177
+			),
178
+			'view_registration'                  => array(
179
+				'func'       => '_registration_details',
180
+				'capability' => 'ee_read_registration',
181
+				'obj_id'     => $reg_id,
182
+			),
183
+			'edit_registration'                  => array(
184
+				'func'               => '_update_attendee_registration_form',
185
+				'noheader'           => true,
186
+				'headers_sent_route' => 'view_registration',
187
+				'capability'         => 'ee_edit_registration',
188
+				'obj_id'             => $reg_id,
189
+				'_REG_ID'            => $reg_id,
190
+			),
191
+			'trash_registrations'                => array(
192
+				'func'       => '_trash_or_restore_registrations',
193
+				'args'       => array('trash' => true),
194
+				'noheader'   => true,
195
+				'capability' => 'ee_delete_registrations',
196
+			),
197
+			'restore_registrations'              => array(
198
+				'func'       => '_trash_or_restore_registrations',
199
+				'args'       => array('trash' => false),
200
+				'noheader'   => true,
201
+				'capability' => 'ee_delete_registrations',
202
+			),
203
+			'delete_registrations'               => array(
204
+				'func'       => '_delete_registrations',
205
+				'noheader'   => true,
206
+				'capability' => 'ee_delete_registrations',
207
+			),
208
+			'new_registration'                   => array(
209
+				'func'       => 'new_registration',
210
+				'capability' => 'ee_edit_registrations',
211
+			),
212
+			'process_reg_step'                   => array(
213
+				'func'       => 'process_reg_step',
214
+				'noheader'   => true,
215
+				'capability' => 'ee_edit_registrations',
216
+			),
217
+			'redirect_to_txn'                    => array(
218
+				'func'       => 'redirect_to_txn',
219
+				'noheader'   => true,
220
+				'capability' => 'ee_edit_registrations',
221
+			),
222
+			'change_reg_status'                  => array(
223
+				'func'       => '_change_reg_status',
224
+				'noheader'   => true,
225
+				'capability' => 'ee_edit_registration',
226
+				'obj_id'     => $reg_id,
227
+			),
228
+			'approve_registration'               => array(
229
+				'func'       => 'approve_registration',
230
+				'noheader'   => true,
231
+				'capability' => 'ee_edit_registration',
232
+				'obj_id'     => $reg_id,
233
+			),
234
+			'approve_and_notify_registration'    => array(
235
+				'func'       => 'approve_registration',
236
+				'noheader'   => true,
237
+				'args'       => array(true),
238
+				'capability' => 'ee_edit_registration',
239
+				'obj_id'     => $reg_id,
240
+			),
241
+			'decline_registration'               => array(
242
+				'func'       => 'decline_registration',
243
+				'noheader'   => true,
244
+				'capability' => 'ee_edit_registration',
245
+				'obj_id'     => $reg_id,
246
+			),
247
+			'decline_and_notify_registration'    => array(
248
+				'func'       => 'decline_registration',
249
+				'noheader'   => true,
250
+				'args'       => array(true),
251
+				'capability' => 'ee_edit_registration',
252
+				'obj_id'     => $reg_id,
253
+			),
254
+			'pending_registration'               => array(
255
+				'func'       => 'pending_registration',
256
+				'noheader'   => true,
257
+				'capability' => 'ee_edit_registration',
258
+				'obj_id'     => $reg_id,
259
+			),
260
+			'pending_and_notify_registration'    => array(
261
+				'func'       => 'pending_registration',
262
+				'noheader'   => true,
263
+				'args'       => array(true),
264
+				'capability' => 'ee_edit_registration',
265
+				'obj_id'     => $reg_id,
266
+			),
267
+			'no_approve_registration'            => array(
268
+				'func'       => 'not_approve_registration',
269
+				'noheader'   => true,
270
+				'capability' => 'ee_edit_registration',
271
+				'obj_id'     => $reg_id,
272
+			),
273
+			'no_approve_and_notify_registration' => array(
274
+				'func'       => 'not_approve_registration',
275
+				'noheader'   => true,
276
+				'args'       => array(true),
277
+				'capability' => 'ee_edit_registration',
278
+				'obj_id'     => $reg_id,
279
+			),
280
+			'cancel_registration'                => array(
281
+				'func'       => 'cancel_registration',
282
+				'noheader'   => true,
283
+				'capability' => 'ee_edit_registration',
284
+				'obj_id'     => $reg_id,
285
+			),
286
+			'cancel_and_notify_registration'     => array(
287
+				'func'       => 'cancel_registration',
288
+				'noheader'   => true,
289
+				'args'       => array(true),
290
+				'capability' => 'ee_edit_registration',
291
+				'obj_id'     => $reg_id,
292
+			),
293
+			'contact_list'                       => array(
294
+				'func'       => '_attendee_contact_list_table',
295
+				'capability' => 'ee_read_contacts',
296
+			),
297
+			'add_new_attendee'                   => array(
298
+				'func' => '_create_new_cpt_item',
299
+				'args' => array(
300
+					'new_attendee' => true,
301
+					'capability'   => 'ee_edit_contacts',
302
+				),
303
+			),
304
+			'edit_attendee'                      => array(
305
+				'func'       => '_edit_cpt_item',
306
+				'capability' => 'ee_edit_contacts',
307
+				'obj_id'     => $att_id,
308
+			),
309
+			'duplicate_attendee'                 => array(
310
+				'func'       => '_duplicate_attendee',
311
+				'noheader'   => true,
312
+				'capability' => 'ee_edit_contacts',
313
+				'obj_id'     => $att_id,
314
+			),
315
+			'insert_attendee'                    => array(
316
+				'func'       => '_insert_or_update_attendee',
317
+				'args'       => array(
318
+					'new_attendee' => true,
319
+				),
320
+				'noheader'   => true,
321
+				'capability' => 'ee_edit_contacts',
322
+			),
323
+			'update_attendee'                    => array(
324
+				'func'       => '_insert_or_update_attendee',
325
+				'args'       => array(
326
+					'new_attendee' => false,
327
+				),
328
+				'noheader'   => true,
329
+				'capability' => 'ee_edit_contacts',
330
+				'obj_id'     => $att_id,
331
+			),
332
+			'trash_attendees'                    => array(
333
+				'func'       => '_trash_or_restore_attendees',
334
+				'args'       => array(
335
+					'trash' => true,
336
+				),
337
+				'noheader'   => true,
338
+				'capability' => 'ee_delete_contacts',
339
+				'obj_id'     => $att_id,
340
+			),
341
+			'restore_attendees'                  => array(
342
+				'func'       => '_trash_or_restore_attendees',
343
+				'args'       => array(
344
+					'trash' => false,
345
+				),
346
+				'noheader'   => true,
347
+				'capability' => 'ee_delete_contacts',
348
+				'obj_id'     => $att_id,
349
+			),
350
+			'resend_registration'                => array(
351
+				'func'       => '_resend_registration',
352
+				'noheader'   => true,
353
+				'capability' => 'ee_send_message',
354
+			),
355
+			'registrations_report'               => array(
356
+				'func'       => '_registrations_report',
357
+				'noheader'   => true,
358
+				'capability' => 'ee_read_registrations',
359
+			),
360
+			'contact_list_export'                => array(
361
+				'func'       => '_contact_list_export',
362
+				'noheader'   => true,
363
+				'capability' => 'export',
364
+			),
365
+			'contact_list_report'                => array(
366
+				'func'       => '_contact_list_report',
367
+				'noheader'   => true,
368
+				'capability' => 'ee_read_contacts',
369
+			),
370
+		);
371
+	}
372
+
373
+
374
+	protected function _set_page_config()
375
+	{
376
+		$this->_page_config = array(
377
+			'default'           => array(
378
+				'nav'           => array(
379
+					'label' => __('Overview', 'event_espresso'),
380
+					'order' => 5,
381
+				),
382
+				'help_tabs'     => array(
383
+					'registrations_overview_help_tab'                       => array(
384
+						'title'    => __('Registrations Overview', 'event_espresso'),
385
+						'filename' => 'registrations_overview',
386
+					),
387
+					'registrations_overview_table_column_headings_help_tab' => array(
388
+						'title'    => __('Registrations Table Column Headings', 'event_espresso'),
389
+						'filename' => 'registrations_overview_table_column_headings',
390
+					),
391
+					'registrations_overview_filters_help_tab'               => array(
392
+						'title'    => __('Registration Filters', 'event_espresso'),
393
+						'filename' => 'registrations_overview_filters',
394
+					),
395
+					'registrations_overview_views_help_tab'                 => array(
396
+						'title'    => __('Registration Views', 'event_espresso'),
397
+						'filename' => 'registrations_overview_views',
398
+					),
399
+					'registrations_regoverview_other_help_tab'              => array(
400
+						'title'    => __('Registrations Other', 'event_espresso'),
401
+						'filename' => 'registrations_overview_other',
402
+					),
403
+				),
404
+				'help_tour'     => array('Registration_Overview_Help_Tour'),
405
+				'qtips'         => array('Registration_List_Table_Tips'),
406
+				'list_table'    => 'EE_Registrations_List_Table',
407
+				'require_nonce' => false,
408
+			),
409
+			'view_registration' => array(
410
+				'nav'           => array(
411
+					'label'      => __('REG Details', 'event_espresso'),
412
+					'order'      => 15,
413
+					'url'        => isset($this->_req_data['_REG_ID'])
414
+						? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url)
415
+						: $this->_admin_base_url,
416
+					'persistent' => false,
417
+				),
418
+				'help_tabs'     => array(
419
+					'registrations_details_help_tab'                    => array(
420
+						'title'    => __('Registration Details', 'event_espresso'),
421
+						'filename' => 'registrations_details',
422
+					),
423
+					'registrations_details_table_help_tab'              => array(
424
+						'title'    => __('Registration Details Table', 'event_espresso'),
425
+						'filename' => 'registrations_details_table',
426
+					),
427
+					'registrations_details_form_answers_help_tab'       => array(
428
+						'title'    => __('Registration Form Answers', 'event_espresso'),
429
+						'filename' => 'registrations_details_form_answers',
430
+					),
431
+					'registrations_details_registrant_details_help_tab' => array(
432
+						'title'    => __('Contact Details', 'event_espresso'),
433
+						'filename' => 'registrations_details_registrant_details',
434
+					),
435
+				),
436
+				'help_tour'     => array('Registration_Details_Help_Tour'),
437
+				'metaboxes'     => array_merge($this->_default_espresso_metaboxes,
438
+					array('_registration_details_metaboxes')),
439
+				'require_nonce' => false,
440
+			),
441
+			'new_registration'  => array(
442
+				'nav'           => array(
443
+					'label'      => __('Add New Registration', 'event_espresso'),
444
+					'url'        => '#',
445
+					'order'      => 15,
446
+					'persistent' => false,
447
+				),
448
+				'metaboxes'     => $this->_default_espresso_metaboxes,
449
+				'labels'        => array(
450
+					'publishbox' => __('Save Registration', 'event_espresso'),
451
+				),
452
+				'require_nonce' => false,
453
+			),
454
+			'add_new_attendee'  => array(
455
+				'nav'           => array(
456
+					'label'      => __('Add Contact', 'event_espresso'),
457
+					'order'      => 15,
458
+					'persistent' => false,
459
+				),
460
+				'metaboxes'     => array_merge($this->_default_espresso_metaboxes,
461
+					array('_publish_post_box', 'attendee_editor_metaboxes')),
462
+				'require_nonce' => false,
463
+			),
464
+			'edit_attendee'     => array(
465
+				'nav'           => array(
466
+					'label'      => __('Edit Contact', 'event_espresso'),
467
+					'order'      => 15,
468
+					'persistent' => false,
469
+					'url'        => isset($this->_req_data['ATT_ID'])
470
+						? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url)
471
+						: $this->_admin_base_url,
472
+				),
473
+				'metaboxes'     => array('attendee_editor_metaboxes'),
474
+				'require_nonce' => false,
475
+			),
476
+			'contact_list'      => array(
477
+				'nav'           => array(
478
+					'label' => __('Contact List', 'event_espresso'),
479
+					'order' => 20,
480
+				),
481
+				'list_table'    => 'EE_Attendee_Contact_List_Table',
482
+				'help_tabs'     => array(
483
+					'registrations_contact_list_help_tab'                       => array(
484
+						'title'    => __('Registrations Contact List', 'event_espresso'),
485
+						'filename' => 'registrations_contact_list',
486
+					),
487
+					'registrations_contact-list_table_column_headings_help_tab' => array(
488
+						'title'    => __('Contact List Table Column Headings', 'event_espresso'),
489
+						'filename' => 'registrations_contact_list_table_column_headings',
490
+					),
491
+					'registrations_contact_list_views_help_tab'                 => array(
492
+						'title'    => __('Contact List Views', 'event_espresso'),
493
+						'filename' => 'registrations_contact_list_views',
494
+					),
495
+					'registrations_contact_list_other_help_tab'                 => array(
496
+						'title'    => __('Contact List Other', 'event_espresso'),
497
+						'filename' => 'registrations_contact_list_other',
498
+					),
499
+				),
500
+				'help_tour'     => array('Contact_List_Help_Tour'),
501
+				'metaboxes'     => array(),
502
+				'require_nonce' => false,
503
+			),
504
+			//override default cpt routes
505
+			'create_new'        => '',
506
+			'edit'              => '',
507
+		);
508
+	}
509
+
510
+
511
+	/**
512
+	 * The below methods aren't used by this class currently
513
+	 */
514
+	protected function _add_screen_options()
515
+	{
516
+	}
517
+
518
+
519
+	protected function _add_feature_pointers()
520
+	{
521
+	}
522
+
523
+
524
+	public function admin_init()
525
+	{
526
+		EE_Registry::$i18n_js_strings['update_att_qstns'] = __('click "Update Registration Questions" to save your changes',
527
+			'event_espresso');
528
+	}
529
+
530
+
531
+	public function admin_notices()
532
+	{
533
+	}
534
+
535
+
536
+	public function admin_footer_scripts()
537
+	{
538
+	}
539
+
540
+
541
+	/**
542
+	 *        get list of registration statuses
543
+	 *
544
+	 * @access private
545
+	 * @return void
546
+	 */
547
+	private function _get_registration_status_array()
548
+	{
549
+		self::$_reg_status = EEM_Registration::reg_status_array(array(), true);
550
+	}
551
+
552
+
553
+	protected function _add_screen_options_default()
554
+	{
555
+		$this->_per_page_screen_option();
556
+	}
557
+
558
+
559
+	protected function _add_screen_options_contact_list()
560
+	{
561
+		$page_title              = $this->_admin_page_title;
562
+		$this->_admin_page_title = __("Contacts", 'event_espresso');
563
+		$this->_per_page_screen_option();
564
+		$this->_admin_page_title = $page_title;
565
+	}
566
+
567
+
568
+	public function load_scripts_styles()
569
+	{
570
+		//style
571
+		//wp_register_style('espresso_attendees', ATT_ASSETS_URL . 'espresso_attendees_admin.css', array(), EVENT_ESPRESSO_VERSION );
572
+		wp_register_style('espresso_reg', REG_ASSETS_URL . 'espresso_registrations_admin.css', array('ee-admin-css'),
573
+			EVENT_ESPRESSO_VERSION);
574
+		wp_enqueue_style('espresso_reg');
575
+		//script
576
+		wp_register_script('espresso_reg', REG_ASSETS_URL . 'espresso_registrations_admin.js',
577
+			array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'), EVENT_ESPRESSO_VERSION, true);
578
+		wp_enqueue_script('espresso_reg');
579
+	}
580
+
581
+
582
+	public function load_scripts_styles_edit_attendee()
583
+	{
584
+		//stuff to only show up on our attendee edit details page.
585
+		$attendee_details_translations = array(
586
+			'att_publish_text' => sprintf(__('Created on: <b>%1$s</b>', 'event_espresso'),
587
+				$this->_cpt_model_obj->get_datetime('ATT_created')),
588
+		);
589
+		wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations);
590
+		wp_enqueue_script('jquery-validate');
591
+	}
592
+
593
+
594
+	public function load_scripts_styles_view_registration()
595
+	{
596
+		//styles
597
+		wp_enqueue_style('espresso-ui-theme');
598
+		//scripts
599
+		$this->_get_reg_custom_questions_form($this->_registration->ID());
600
+		$this->_reg_custom_questions_form->wp_enqueue_scripts(true);
601
+	}
602
+
603
+
604
+	public function load_scripts_styles_contact_list()
605
+	{
606
+		wp_deregister_style('espresso_reg');
607
+		wp_register_style('espresso_att', REG_ASSETS_URL . 'espresso_attendees_admin.css', array('ee-admin-css'),
608
+			EVENT_ESPRESSO_VERSION);
609
+		wp_enqueue_style('espresso_att');
610
+	}
611
+
612
+
613
+	public function load_scripts_styles_new_registration()
614
+	{
615
+		wp_register_script('ee-spco-for-admin', REG_ASSETS_URL . 'spco_for_admin.js', array('underscore', 'jquery'),
616
+			EVENT_ESPRESSO_VERSION, true);
617
+		wp_enqueue_script('ee-spco-for-admin');
618
+		add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
619
+		EE_Form_Section_Proper::wp_enqueue_scripts();
620
+		EED_Ticket_Selector::load_tckt_slctr_assets();
621
+		EE_Datepicker_Input::enqueue_styles_and_scripts();
622
+	}
623
+
624
+
625
+	public function AHEE__EE_Admin_Page__route_admin_request_resend_registration()
626
+	{
627
+		add_filter('FHEE_load_EE_messages', '__return_true');
628
+	}
629
+
630
+
631
+	public function AHEE__EE_Admin_Page__route_admin_request_approve_registration()
632
+	{
633
+		add_filter('FHEE_load_EE_messages', '__return_true');
634
+	}
635
+
636
+
637
+	protected function _set_list_table_views_default()
638
+	{
639
+		//for notification related bulk actions we need to make sure only active messengers have an option.
640
+		EED_Messages::set_autoloaders();
641
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
642
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
643
+		$active_mts               = $message_resource_manager->list_of_active_message_types();
644
+		//key= bulk_action_slug, value= message type.
645
+		$match_array = array(
646
+			'approve_registration'    => 'registration',
647
+			'decline_registration'    => 'declined_registration',
648
+			'pending_registration'    => 'pending_approval',
649
+			'no_approve_registration' => 'not_approved_registration',
650
+			'cancel_registration'     => 'cancelled_registration',
651
+		);
652
+		/** setup reg status bulk actions **/
653
+		$def_reg_status_actions['approve_registration'] = __('Approve Registrations', 'event_espresso');
654
+		if (in_array($match_array['approve_registration'], $active_mts)
655
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
656
+		) {
657
+			$def_reg_status_actions['approve_and_notify_registration'] = __('Approve and Notify Registrations',
658
+				'event_espresso');
659
+		}
660
+		$def_reg_status_actions['decline_registration'] = __('Decline Registrations', 'event_espresso');
661
+		if (in_array($match_array['decline_registration'], $active_mts)
662
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
663
+		) {
664
+			$def_reg_status_actions['decline_and_notify_registration'] = __('Decline and Notify Registrations',
665
+				'event_espresso');
666
+		}
667
+		$def_reg_status_actions['pending_registration'] = __('Set Registrations to Pending Payment', 'event_espresso');
668
+		if (in_array($match_array['pending_registration'], $active_mts)
669
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
670
+		) {
671
+			$def_reg_status_actions['pending_and_notify_registration'] = __('Set Registrations to Pending Payment and Notify',
672
+				'event_espresso');
673
+		}
674
+		$def_reg_status_actions['no_approve_registration'] = __('Set Registrations to Not Approved', 'event_espresso');
675
+		if (in_array($match_array['no_approve_registration'], $active_mts)
676
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
677
+		) {
678
+			$def_reg_status_actions['no_approve_and_notify_registration'] = __('Set Registrations to Not Approved and Notify',
679
+				'event_espresso');
680
+		}
681
+		$def_reg_status_actions['cancel_registration'] = __('Cancel Registrations', 'event_espresso');
682
+		if (in_array($match_array['cancel_registration'], $active_mts)
683
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message', 'batch_send_messages')
684
+		) {
685
+			$def_reg_status_actions['cancel_and_notify_registration'] = __('Cancel Registrations and Notify',
686
+				'event_espresso');
687
+		}
688
+		$this->_views = array(
689
+			'all'   => array(
690
+				'slug'        => 'all',
691
+				'label'       => __('View All Registrations', 'event_espresso'),
692
+				'count'       => 0,
693
+				'bulk_action' => array_merge($def_reg_status_actions, array(
694
+					'trash_registrations' => __('Trash Registrations', 'event_espresso'),
695
+				)),
696
+			),
697
+			'month' => array(
698
+				'slug'        => 'month',
699
+				'label'       => __('This Month', 'event_espresso'),
700
+				'count'       => 0,
701
+				'bulk_action' => array_merge($def_reg_status_actions, array(
702
+					'trash_registrations' => __('Trash Registrations', 'event_espresso'),
703
+				)),
704
+			),
705
+			'today' => array(
706
+				'slug'        => 'today',
707
+				'label'       => sprintf(__('Today - %s', 'event_espresso'), date('M d, Y', current_time('timestamp'))),
708
+				'count'       => 0,
709
+				'bulk_action' => array_merge($def_reg_status_actions, array(
710
+					'trash_registrations' => __('Trash Registrations', 'event_espresso'),
711
+				)),
712
+			),
713
+		);
714
+		if (EE_Registry::instance()->CAP->current_user_can('ee_delete_registrations',
715
+			'espresso_registrations_delete_registration')
716
+		) {
717
+			$this->_views['incomplete'] = array(
718
+				'slug'        => 'incomplete',
719
+				'label'       => __('Incomplete', 'event_espresso'),
720
+				'count'       => 0,
721
+				'bulk_action' => array(
722
+					'trash_registrations' => __('Trash Registrations', 'event_espresso'),
723
+				),
724
+			);
725
+			$this->_views['trash']      = array(
726
+				'slug'        => 'trash',
727
+				'label'       => __('Trash', 'event_espresso'),
728
+				'count'       => 0,
729
+				'bulk_action' => array(
730
+					'restore_registrations' => __('Restore Registrations', 'event_espresso'),
731
+					'delete_registrations'  => __('Delete Registrations Permanently', 'event_espresso'),
732
+				),
733
+			);
734
+		}
735
+	}
736
+
737
+
738
+	protected function _set_list_table_views_contact_list()
739
+	{
740
+		$this->_views = array(
741
+			'in_use' => array(
742
+				'slug'        => 'in_use',
743
+				'label'       => __('In Use', 'event_espresso'),
744
+				'count'       => 0,
745
+				'bulk_action' => array(
746
+					'trash_attendees' => __('Move to Trash', 'event_espresso'),
747
+				),
748
+			),
749
+		);
750
+		if (EE_Registry::instance()->CAP->current_user_can('ee_delete_contacts',
751
+			'espresso_registrations_trash_attendees')
752
+		) {
753
+			$this->_views['trash'] = array(
754
+				'slug'        => 'trash',
755
+				'label'       => __('Trash', 'event_espresso'),
756
+				'count'       => 0,
757
+				'bulk_action' => array(
758
+					'restore_attendees' => __('Restore from Trash', 'event_espresso'),
759
+				),
760
+			);
761
+		}
762
+	}
763
+
764
+
765
+	protected function _registration_legend_items()
766
+	{
767
+		$fc_items = array(
768
+			'star-icon'        => array(
769
+				'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8',
770
+				'desc'  => __('This is the Primary Registrant', 'event_espresso'),
771
+			),
772
+			'view_details'     => array(
773
+				'class' => 'dashicons dashicons-clipboard',
774
+				'desc'  => __('View Registration Details', 'event_espresso'),
775
+			),
776
+			'edit_attendee'    => array(
777
+				'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16',
778
+				'desc'  => __('Edit Contact Details', 'event_espresso'),
779
+			),
780
+			'view_transaction' => array(
781
+				'class' => 'dashicons dashicons-cart',
782
+				'desc'  => __('View Transaction Details', 'event_espresso'),
783
+			),
784
+			'view_invoice'     => array(
785
+				'class' => 'dashicons dashicons-media-spreadsheet',
786
+				'desc'  => __('View Transaction Invoice', 'event_espresso'),
787
+			),
788
+		);
789
+		if (EE_Registry::instance()->CAP->current_user_can('ee_send_message',
790
+			'espresso_registrations_resend_registration')
791
+		) {
792
+			$fc_items['resend_registration'] = array(
793
+				'class' => 'dashicons dashicons-email-alt',
794
+				'desc'  => __('Resend Registration Details', 'event_espresso'),
795
+			);
796
+		} else {
797
+			$fc_items['blank'] = array('class' => 'blank', 'desc' => '');
798
+		}
799
+		if (EE_Registry::instance()->CAP->current_user_can('ee_read_global_messages', 'view_filtered_messages')) {
800
+			$related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
801
+			if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
802
+				$fc_items['view_related_messages'] = array(
803
+					'class' => $related_for_icon['css_class'],
804
+					'desc'  => $related_for_icon['label'],
805
+				);
806
+			}
807
+		}
808
+		$sc_items = array(
809
+			'approved_status'   => array(
810
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
811
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
812
+			),
813
+			'pending_status'    => array(
814
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
815
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
816
+			),
817
+			'wait_list'         => array(
818
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
819
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
820
+			),
821
+			'incomplete_status' => array(
822
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
823
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_incomplete, false, 'sentence'),
824
+			),
825
+			'not_approved'      => array(
826
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
827
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
828
+			),
829
+			'declined_status'   => array(
830
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
831
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
832
+			),
833
+			'cancelled_status'  => array(
834
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
835
+				'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
836
+			),
837
+		);
838
+		return array_merge($fc_items, $sc_items);
839
+	}
840
+
841
+
842
+
843
+	/***************************************        REGISTRATION OVERVIEW        **************************************/
844
+	/**
845
+	 * @throws \EE_Error
846
+	 */
847
+	protected function _registrations_overview_list_table()
848
+	{
849
+		$this->_template_args['admin_page_header'] = '';
850
+		$EVT_ID                                    = ! empty($this->_req_data['event_id']) ? absint($this->_req_data['event_id']) : 0;
851
+		if ($EVT_ID) {
852
+			if (EE_Registry::instance()->CAP->current_user_can('ee_edit_registrations',
853
+				'espresso_registrations_new_registration', $EVT_ID)
854
+			) {
855
+				$this->_admin_page_title .= ' ' . $this->get_action_link_or_button('new_registration', 'add-registrant',
856
+						array('event_id' => $EVT_ID), 'add-new-h2');
857
+			}
858
+			$event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
859
+			if ($event instanceof EE_Event) {
860
+				$this->_template_args['admin_page_header'] = sprintf(__('%s Viewing registrations for the event: %s%s',
861
+					'event_espresso'), '<h3 style="line-height:1.5em;">',
862
+					'<br /><a href="' . EE_Admin_Page::add_query_args_and_nonce(array(
863
+						'action' => 'edit',
864
+						'post'   => $event->ID(),
865
+					), EVENTS_ADMIN_URL) . '">&nbsp;' . $event->get('EVT_name') . '&nbsp;</a>&nbsp;', '</h3>');
866
+			}
867
+			$DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
868
+			$datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
869
+			if ($datetime instanceof EE_Datetime && $this->_template_args['admin_page_header'] !== '') {
870
+				$this->_template_args['admin_page_header'] = substr($this->_template_args['admin_page_header'], 0, -5);
871
+				$this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
872
+				$this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
873
+				$this->_template_args['admin_page_header'] .= $datetime->name();
874
+				$this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
875
+				$this->_template_args['admin_page_header'] .= '</span></h3>';
876
+			}
877
+		}
878
+		$this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items());
879
+		$this->display_admin_list_table_page_with_no_sidebar();
880
+	}
881
+
882
+
883
+	/**
884
+	 * This sets the _registration property for the registration details screen
885
+	 *
886
+	 * @access private
887
+	 * @return bool
888
+	 */
889
+	private function _set_registration_object()
890
+	{
891
+		//get out if we've already set the object
892
+		if (is_object($this->_registration)) {
893
+			return true;
894
+		}
895
+		$REG    = EEM_Registration::instance();
896
+		$REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false;
897
+		if ($this->_registration = $REG->get_one_by_ID($REG_ID)) {
898
+			return true;
899
+		} else {
900
+			$error_msg = sprintf(__('An error occurred and the details for Registration ID #%s could not be retrieved.',
901
+				'event_espresso'), $REG_ID);
902
+			EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__);
903
+			$this->_registration = null;
904
+			return false;
905
+		}
906
+	}
907
+
908
+
909
+	/**
910
+	 * Used to retrieve registrations for the list table.
911
+	 *
912
+	 * @param int    $per_page
913
+	 * @param bool   $count
914
+	 * @param bool   $this_month
915
+	 * @param bool   $today
916
+	 * @return \EE_Registration[]|int
917
+	 */
918
+	public function get_registrations(
919
+		$per_page = 10,
920
+		$count = false,
921
+		$this_month = false,
922
+		$today = false
923
+	) {
924
+		if( $this_month ) {
925
+			$this->_req_data['status'] = 'month';
926
+		}
927
+		if( $today ) {
928
+			$this->_req_data['status'] = 'today';
929
+		}
930
+		$query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
931
+		/**
932
+		 * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected
933
+		 * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093
934
+		 * @see EEM_Base::get_all()
935
+		 */
936
+		$query_params['group_by'] = '';
937
+
938
+		return $count
939
+			? EEM_Registration::instance()->count($query_params)
940
+			/** @type EE_Registration[] */
941
+			: EEM_Registration::instance()->get_all($query_params);
942
+	}
943
+
944
+
945
+
946
+	/**
947
+	 * Retrieves the query parameters to be used by the Registration model for getting registrations.
948
+	 * Note: this listens to values on the request for some of the query parameters.
949
+	 *
950
+	 * @param array $request
951
+	 * @param int    $per_page
952
+	 * @param bool   $count
953
+	 * @return array
954
+	 */
955
+	protected function _get_registration_query_parameters(
956
+		$request = array(),
957
+		$per_page = 10,
958
+		$count = false
959
+	) {
960
+
961
+		$query_params = array(
962
+			0                          => $this->_get_where_conditions_for_registrations_query(
963
+				$request
964
+			),
965
+			'caps'                     => EEM_Registration::caps_read_admin,
966
+			'default_where_conditions' => 'this_model_only',
967
+		);
968
+		if ( ! $count) {
969
+			$query_params = array_merge(
970
+				$query_params,
971
+				$this->_get_orderby_for_registrations_query(),
972
+				$this->_get_limit($per_page)
973
+			);
974
+		}
975
+
976
+		return $query_params;
977
+	}
978
+
979
+
980
+	/**
981
+	 * This will add EVT_ID to the provided $where array for EE model query parameters.
982
+	 *
983
+	 * @param array $request usually the same as $this->_req_data but not necessarily
984
+	 * @return array
985
+	 */
986
+	protected function _add_event_id_to_where_conditions(array $request)
987
+	{
988
+		$where = array();
989
+		if ( ! empty($request['event_id'])) {
990
+			$where['EVT_ID'] = absint($request['event_id']);
991
+		}
992
+		return $where;
993
+	}
994
+
995
+
996
+	/**
997
+	 * Adds category ID if it exists in the request to the where conditions for the registrations query.
998
+	 *
999
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1000
+	 * @return array
1001
+	 */
1002
+	protected function _add_category_id_to_where_conditions(array $request)
1003
+	{
1004
+		$where = array();
1005
+		if ( ! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1006
+			$where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1007
+		}
1008
+		return $where;
1009
+	}
1010
+
1011
+
1012
+	/**
1013
+	 * Adds the datetime ID if it exists in the request to the where conditions for the registrations query.
1014
+	 *
1015
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1016
+	 * @return array
1017
+	 */
1018
+	protected function _add_datetime_id_to_where_conditions(array $request)
1019
+	{
1020
+		$where = array();
1021
+		if ( ! empty($request['datetime_id'])) {
1022
+			$where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1023
+		}
1024
+		if( ! empty($request['DTT_ID'])){
1025
+			$where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1026
+		}
1027
+		return $where;
1028
+	}
1029
+
1030
+
1031
+	/**
1032
+	 * Adds the correct registration status to the where conditions for the registrations query.
1033
+	 *
1034
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1035
+	 * @return array
1036
+	 */
1037
+	protected function _add_registration_status_to_where_conditions(array $request)
1038
+	{
1039
+		$where = array();
1040
+		$view  = EEH_Array::is_set( $request, 'status', '' );
1041
+		$registration_status = ! empty($request['_reg_status'])
1042
+			? sanitize_text_field($request['_reg_status'])
1043
+			: '';
1044
+
1045
+		/*
1046 1046
          * If filtering by registration status, then we show registrations matching that status.
1047 1047
          * If not filtering by specified status, then we show all registrations excluding incomplete registrations UNLESS
1048 1048
          * viewing trashed registrations.
1049 1049
          */
1050
-        if ( ! empty($registration_status)) {
1051
-            $where['STS_ID'] = $registration_status;
1052
-        } else {
1053
-            //make sure we exclude incomplete registrations, but only if not trashed.
1054
-            if ($view === 'trash') {
1055
-                $where['REG_deleted'] = true;
1056
-            } else if ($view === 'incomplete') {
1057
-                $where['STS_ID'] = EEM_Registration::status_id_incomplete;
1058
-            } else {
1059
-                $where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1060
-            }
1061
-        }
1062
-        return $where;
1063
-    }
1064
-
1065
-
1066
-    /**
1067
-     * Adds any provided date restraints to the where conditions for the registrations query.
1068
-     *
1069
-     * @param array $request usually the same as $this->_req_data but not necessarily
1070
-     * @return array
1071
-     */
1072
-    protected function _add_date_to_where_conditions(array $request)
1073
-    {
1074
-        $where = array();
1075
-        $view  = EEH_Array::is_set( $request, 'status', '' );
1076
-        $month_range             = ! empty($request['month_range'])
1077
-            ? sanitize_text_field($request['month_range'])
1078
-            : '';
1079
-        $retrieve_for_today      = $view === 'today';
1080
-        $retrieve_for_this_month = $view === 'month';
1081
-
1082
-        if ($retrieve_for_today) {
1083
-            $now               = date('Y-m-d', current_time('timestamp'));
1084
-            $where['REG_date'] = array(
1085
-                'BETWEEN',
1086
-                array(
1087
-                    EEM_Registration::instance()->convert_datetime_for_query(
1088
-                        'REG_date',
1089
-                        $now . ' 00:00:00',
1090
-                        'Y-m-d H:i:s'
1091
-                    ),
1092
-                    EEM_Registration::instance()->convert_datetime_for_query(
1093
-                        'REG_date',
1094
-                        $now . ' 23:59:59',
1095
-                        'Y-m-d H:i:s'
1096
-                    ),
1097
-                ),
1098
-            );
1099
-        } elseif ($retrieve_for_this_month) {
1100
-            $current_year_and_month = date('Y-m', current_time('timestamp'));
1101
-            $days_this_month        = date('t', current_time('timestamp'));
1102
-            $where['REG_date']      = array(
1103
-                'BETWEEN',
1104
-                array(
1105
-                    EEM_Registration::instance()->convert_datetime_for_query(
1106
-                        'REG_date',
1107
-                        $current_year_and_month . '-01 00:00:00',
1108
-                        'Y-m-d H:i:s'
1109
-                    ),
1110
-                    EEM_Registration::instance()->convert_datetime_for_query(
1111
-                        'REG_date',
1112
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1113
-                        'Y-m-d H:i:s'
1114
-                    ),
1115
-                ),
1116
-            );
1117
-        } elseif ($month_range) {
1118
-            $pieces          = explode(' ', $month_range, 3);
1119
-            $month_requested = ! empty($pieces[0])
1120
-                ? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1121
-                : '';
1122
-            $year_requested  = ! empty($pieces[1])
1123
-                ? $pieces[1]
1124
-                : '';
1125
-            //if there is not a month or year then we can't go further
1126
-            if ($month_requested && $year_requested) {
1127
-                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1128
-                $where['REG_date'] = array(
1129
-                    'BETWEEN',
1130
-                    array(
1131
-                        EEM_Registration::instance()->convert_datetime_for_query(
1132
-                            'REG_date',
1133
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1134
-                            'Y-m-d H:i:s'
1135
-                        ),
1136
-                        EEM_Registration::instance()->convert_datetime_for_query(
1137
-                            'REG_date',
1138
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1139
-                            'Y-m-d H:i:s'
1140
-                        ),
1141
-                    ),
1142
-                );
1143
-            }
1144
-        }
1145
-        return $where;
1146
-    }
1147
-
1148
-
1149
-    /**
1150
-     * Adds any provided search restraints to the where conditions for the registrations query
1151
-     *
1152
-     * @param array $request usually the same as $this->_req_data but not necessarily
1153
-     * @return array
1154
-     */
1155
-    protected function _add_search_to_where_conditions(array $request)
1156
-    {
1157
-        $where = array();
1158
-        if ( ! empty($request['s'])) {
1159
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1160
-            $where['OR'] = array(
1161
-                'Event.EVT_name'                          => array('LIKE', $search_string),
1162
-                'Event.EVT_desc'                          => array('LIKE', $search_string),
1163
-                'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1164
-                'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1165
-                'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1166
-                'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1167
-                'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1168
-                'Attendee.ATT_email'                      => array('LIKE', $search_string),
1169
-                'Attendee.ATT_address'                    => array('LIKE', $search_string),
1170
-                'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1171
-                'Attendee.ATT_city'                       => array('LIKE', $search_string),
1172
-                'REG_final_price'                         => array('LIKE', $search_string),
1173
-                'REG_code'                                => array('LIKE', $search_string),
1174
-                'REG_count'                               => array('LIKE', $search_string),
1175
-                'REG_group_size'                          => array('LIKE', $search_string),
1176
-                'Ticket.TKT_name'                         => array('LIKE', $search_string),
1177
-                'Ticket.TKT_description'                  => array('LIKE', $search_string),
1178
-                'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1179
-            );
1180
-        }
1181
-        return $where;
1182
-    }
1183
-
1184
-
1185
-    /**
1186
-     * Sets up the where conditions for the registrations query.
1187
-     *
1188
-     * @param array $request
1189
-     * @return array
1190
-     */
1191
-    protected function _get_where_conditions_for_registrations_query($request)
1192
-    {
1193
-        return array_merge(
1194
-            $this->_add_event_id_to_where_conditions($request),
1195
-            $this->_add_category_id_to_where_conditions($request),
1196
-            $this->_add_datetime_id_to_where_conditions($request),
1197
-            $this->_add_registration_status_to_where_conditions($request),
1198
-            $this->_add_date_to_where_conditions($request),
1199
-            $this->_add_search_to_where_conditions($request)
1200
-        );
1201
-    }
1202
-
1203
-
1204
-    /**
1205
-     * Sets up the orderby for the registrations query.
1206
-     *
1207
-     * @return array
1208
-     */
1209
-    protected function _get_orderby_for_registrations_query()
1210
-    {
1211
-        $orderby_field = ! empty($this->_req_data['orderby'])
1212
-            ? sanitize_text_field($this->_req_data['orderby'])
1213
-            : '';
1214
-        switch ($orderby_field) {
1215
-            case '_REG_ID':
1216
-                $orderby_field = 'REG_ID';
1217
-                break;
1218
-            case '_Reg_status':
1219
-                $orderby_field = 'STS_ID';
1220
-                break;
1221
-            case 'ATT_fname':
1222
-                $orderby_field = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1223
-                break;
1224
-            case 'ATT_lname' :
1225
-                $orderby_field = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1226
-                break;
1227
-            case 'event_name':
1228
-                $orderby_field = 'Event.EVT_name';
1229
-                break;
1230
-            case 'DTT_EVT_start':
1231
-                $orderby_field = 'Event.Datetime.DTT_EVT_start';
1232
-                break;
1233
-            default: //'REG_date'
1234
-                $orderby_field = 'REG_date';
1235
-        }
1236
-
1237
-        //order
1238
-        $order = ! empty($this->_req_data['order'])
1239
-            ? sanitize_text_field($this->_req_data['order'])
1240
-            : 'DESC';
1241
-
1242
-        //mutate orderby_field
1243
-        $orderby_field = array_combine(
1244
-                (array) $orderby_field,
1245
-                array_fill(0, count($orderby_field), $order)
1246
-            );
1247
-        return array('order_by' => $orderby_field);
1248
-    }
1249
-
1250
-
1251
-    /**
1252
-     * Sets up the limit for the registrations query.
1253
-     *
1254
-     * @param $per_page
1255
-     * @return array
1256
-     */
1257
-    protected function _get_limit($per_page)
1258
-    {
1259
-        $current_page = ! empty($this->_req_data['paged'])
1260
-            ? absint($this->_req_data['paged'])
1261
-            : 1;
1262
-        $per_page     = ! empty($this->_req_data['perpage'])
1263
-            ? $this->_req_data['perpage']
1264
-            : $per_page;
1265
-
1266
-        //-1 means return all results so get out if that's set.
1267
-        if ((int)$per_page === -1) {
1268
-            return array();
1269
-        }
1270
-        $per_page = absint($per_page);
1271
-        $offset   = ($current_page - 1) * $per_page;
1272
-        return array('limit' => array($offset, $per_page));
1273
-    }
1274
-
1275
-
1276
-    public function get_registration_status_array()
1277
-    {
1278
-        return self::$_reg_status;
1279
-    }
1280
-
1281
-
1282
-
1283
-
1284
-    /***************************************        REGISTRATION DETAILS        ***************************************/
1285
-    /**
1286
-     *        generates HTML for the View Registration Details Admin page
1287
-     *
1288
-     * @access protected
1289
-     * @return void
1290
-     */
1291
-    protected function _registration_details()
1292
-    {
1293
-        $this->_template_args = array();
1294
-        $this->_set_registration_object();
1295
-        if (is_object($this->_registration)) {
1296
-            $transaction                                   = $this->_registration->transaction() ? $this->_registration->transaction()
1297
-                : EE_Transaction::new_instance();
1298
-            $this->_session                                = $transaction->session_data();
1299
-            $event_id                                      = $this->_registration->event_ID();
1300
-            $this->_template_args['reg_nmbr']['value']     = $this->_registration->ID();
1301
-            $this->_template_args['reg_nmbr']['label']     = __('Registration Number', 'event_espresso');
1302
-            $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1303
-            $this->_template_args['reg_datetime']['label'] = __('Date', 'event_espresso');
1304
-            $this->_template_args['grand_total']           = $transaction->total();
1305
-            $this->_template_args['currency_sign']         = EE_Registry::instance()->CFG->currency->sign;
1306
-            // link back to overview
1307
-            $this->_template_args['reg_overview_url']            = REG_ADMIN_URL;
1308
-            $this->_template_args['registration']                = $this->_registration;
1309
-            $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(array(
1310
-                'action'   => 'default',
1311
-                'event_id' => $event_id,
1312
-            ), REG_ADMIN_URL);
1313
-            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
1314
-                'action' => 'default',
1315
-                'EVT_ID' => $event_id,
1316
-                'page'   => 'espresso_transactions',
1317
-            ), admin_url('admin.php'));
1318
-            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(array(
1319
-                'page'   => 'espresso_events',
1320
-                'action' => 'edit',
1321
-                'post'   => $event_id,
1322
-            ), admin_url('admin.php'));
1323
-            //next and previous links
1324
-            $next_reg                                      = $this->_registration->next(null, array(), 'REG_ID');
1325
-            $this->_template_args['next_registration']     = $next_reg
1326
-                ? $this->_next_link(EE_Admin_Page::add_query_args_and_nonce(array(
1327
-                    'action'  => 'view_registration',
1328
-                    '_REG_ID' => $next_reg['REG_ID'],
1329
-                ), REG_ADMIN_URL), 'dashicons dashicons-arrow-right ee-icon-size-22') : '';
1330
-            $previous_reg                                  = $this->_registration->previous(null, array(), 'REG_ID');
1331
-            $this->_template_args['previous_registration'] = $previous_reg
1332
-                ? $this->_previous_link(EE_Admin_Page::add_query_args_and_nonce(array(
1333
-                    'action'  => 'view_registration',
1334
-                    '_REG_ID' => $previous_reg['REG_ID'],
1335
-                ), REG_ADMIN_URL), 'dashicons dashicons-arrow-left ee-icon-size-22') : '';
1336
-            // grab header
1337
-            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1338
-            $this->_template_args['REG_ID']            = $this->_registration->ID();
1339
-            $this->_template_args['admin_page_header'] = EEH_Template::display_template($template_path,
1340
-                $this->_template_args, true);
1341
-        } else {
1342
-            $this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1343
-        }
1344
-        // the details template wrapper
1345
-        $this->display_admin_page_with_sidebar();
1346
-    }
1347
-
1348
-
1349
-    protected function _registration_details_metaboxes()
1350
-    {
1351
-        do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1352
-        $this->_set_registration_object();
1353
-        $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1354
-        add_meta_box('edit-reg-status-mbox', __('Registration Status', 'event_espresso'),
1355
-            array($this, 'set_reg_status_buttons_metabox'), $this->wp_page_slug, 'normal', 'high');
1356
-        add_meta_box('edit-reg-details-mbox', __('Registration Details', 'event_espresso'),
1357
-            array($this, '_reg_details_meta_box'), $this->wp_page_slug, 'normal', 'high');
1358
-        if ($attendee instanceof EE_Attendee
1359
-            && EE_Registry::instance()->CAP->current_user_can('ee_edit_registration', 'edit-reg-questions-mbox')
1360
-        ) {
1361
-            add_meta_box('edit-reg-questions-mbox', __('Registration Form Answers', 'event_espresso'),
1362
-                array($this, '_reg_questions_meta_box'), $this->wp_page_slug, 'normal', 'high');
1363
-        }
1364
-        add_meta_box('edit-reg-registrant-mbox', __('Contact Details', 'event_espresso'),
1365
-            array($this, '_reg_registrant_side_meta_box'), $this->wp_page_slug, 'side', 'high');
1366
-        if ($this->_registration->group_size() > 1) {
1367
-            add_meta_box('edit-reg-attendees-mbox', __('Other Registrations in this Transaction', 'event_espresso'),
1368
-                array($this, '_reg_attendees_meta_box'), $this->wp_page_slug, 'normal', 'high');
1369
-        }
1370
-    }
1371
-
1372
-
1373
-    /**
1374
-     * set_reg_status_buttons_metabox
1375
-     *
1376
-     * @access protected
1377
-     * @return string
1378
-     * @throws \EE_Error
1379
-     */
1380
-    public function set_reg_status_buttons_metabox()
1381
-    {
1382
-        $this->_set_registration_object();
1383
-        $change_reg_status_form = $this->_generate_reg_status_change_form();
1384
-        echo $change_reg_status_form->form_open(self::add_query_args_and_nonce(array(
1385
-            'action' => 'change_reg_status',
1386
-        ), REG_ADMIN_URL));
1387
-        echo $change_reg_status_form->get_html();
1388
-        echo $change_reg_status_form->form_close();
1389
-    }
1390
-
1391
-
1392
-    /**
1393
-     * @return EE_Form_Section_Proper
1394
-     */
1395
-    protected function _generate_reg_status_change_form()
1396
-    {
1397
-        return new EE_Form_Section_Proper(array(
1398
-            'name'            => 'reg_status_change_form',
1399
-            'html_id'         => 'reg-status-change-form',
1400
-            'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1401
-            'subsections'     => array(
1402
-                'return'             => new EE_Hidden_Input(array(
1403
-                    'name'    => 'return',
1404
-                    'default' => 'view_registration',
1405
-                )),
1406
-                'REG_ID'             => new EE_Hidden_Input(array(
1407
-                    'name'    => 'REG_ID',
1408
-                    'default' => $this->_registration->ID(),
1409
-                )),
1410
-                'current_status'     => new EE_Form_Section_HTML(EEH_HTML::tr(EEH_HTML::th(EEH_HTML::label(EEH_HTML::strong(__('Current Registration Status',
1411
-                        'event_espresso')))) . EEH_HTML::td(EEH_HTML::strong($this->_registration->pretty_status(),
1412
-                        '', 'status-' . $this->_registration->status_ID(),
1413
-                        'line-height: 1em; font-size: 1.5em; font-weight: bold;')))),
1414
-                'reg_status'         => new EE_Select_Input($this->_get_reg_statuses(), array(
1415
-                    'html_label_text' => __('Change Registration Status to', 'event_espresso'),
1416
-                    'default'         => $this->_registration->status_ID(),
1417
-                )),
1418
-                'send_notifications' => new EE_Yes_No_Input(array(
1419
-                    'html_label_text' => __('Send Related Messages', 'event_espresso'),
1420
-                    'default'         => false,
1421
-                    'html_help_text'  => __('If set to "Yes", then the related messages will be sent to the registrant.',
1422
-                        'event_espresso'),
1423
-                )),
1424
-                'submit'             => new EE_Submit_Input(array(
1425
-                    'html_class'      => 'button-primary',
1426
-                    'html_label_text' => '&nbsp;',
1427
-                    'default'         => __('Update Registration Status', 'event_espresso'),
1428
-                )),
1429
-            ),
1430
-        ));
1431
-    }
1432
-
1433
-
1434
-
1435
-    /**
1436
-     * Returns an array of all the buttons for the various statuses and switch status actions
1437
-     *
1438
-     * @return array
1439
-     */
1440
-    protected function _get_reg_statuses()
1441
-    {
1442
-        $reg_status_array = EEM_Registration::instance()->reg_status_array();
1443
-        unset ($reg_status_array[EEM_Registration::status_id_incomplete]);
1444
-        // get current reg status
1445
-        $current_status = $this->_registration->status_ID();
1446
-        // is registration for free event? This will determine whether to display the pending payment option
1447
-        if ($current_status != EEM_Registration::status_id_pending_payment
1448
-            && $this->_registration->transaction()
1449
-                                   ->is_free()
1450
-        ) {
1451
-            unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1452
-        }
1453
-        return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1454
-    }
1455
-
1456
-
1457
-    /**
1458
-     * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1459
-     *
1460
-     * @param bool $status REG status given for changing registrations to.
1461
-     * @param bool $notify Whether to send messages notifications or not.
1462
-     * @return array  (array with reg_id(s) updated and whether update was successful.
1463
-     */
1464
-    protected function _set_registration_status_from_request($status = false, $notify = false)
1465
-    {
1466
-        if (isset($this->_req_data['reg_status_change_form'])) {
1467
-            $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1468
-                ? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1469
-        } else {
1470
-            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1471
-        }
1472
-        $success = $this->_set_registration_status($REG_IDs, $status);
1473
-        //notify?
1474
-        if ($success
1475
-            && $notify
1476
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message',
1477
-                'espresso_registrations_resend_registration')
1478
-        ) {
1479
-            $this->_process_resend_registration();
1480
-        }
1481
-        return $success;
1482
-    }
1483
-
1484
-
1485
-    /**
1486
-     * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1487
-     * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1488
-     *
1489
-     * @param array $REG_IDs
1490
-     * @param bool  $status
1491
-     * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1492
-     *               the array of updated registrations).
1493
-     */
1494
-    protected function _set_registration_status($REG_IDs = array(), $status = false)
1495
-    {
1496
-        $success = false;
1497
-        // typecast $REG_IDs
1498
-        $REG_IDs = (array)$REG_IDs;
1499
-        if ( ! empty($REG_IDs)) {
1500
-            $success = true;
1501
-            // set default status if none is passed
1502
-            $status = $status ? $status : EEM_Registration::status_id_pending_payment;
1503
-            // sanitize $REG_IDs
1504
-            $REG_IDs = array_filter($REG_IDs, 'absint');
1505
-            //loop through REG_ID's and change status
1506
-            foreach ($REG_IDs as $REG_ID) {
1507
-                $registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1508
-                if ($registration instanceof EE_Registration) {
1509
-                    $registration->set_status($status);
1510
-                    $result = $registration->save();
1511
-                    // verifying explicit fails because update *may* just return 0 for 0 rows affected
1512
-                    $success = $result !== false ? $success : false;
1513
-                }
1514
-            }
1515
-        }
1516
-        //reset _req_data['_REG_ID'] for any potential future messages notifications
1517
-        $this->_req_data['_REG_ID'] = $REG_IDs;
1518
-        //return $success and processed registrations
1519
-        return array('REG_ID' => $REG_IDs, 'success' => $success);
1520
-    }
1521
-
1522
-
1523
-    /**
1524
-     * Common logic for setting up success message and redirecting to appropriate route
1525
-     *
1526
-     * @param  string $STS_ID status id for the registration changed to
1527
-     * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1528
-     * @return void
1529
-     */
1530
-    protected function _reg_status_change_return($STS_ID, $notify = false)
1531
-    {
1532
-        $result  = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1533
-            : array('success' => false);
1534
-        $success = isset($result['success']) && $result['success'];
1535
-        //setup success message
1536
-        if ($success) {
1537
-            if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1538
-                $msg = sprintf(__('Registration status has been set to %s', 'event_espresso'),
1539
-                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1540
-            } else {
1541
-                $msg = sprintf(__('Registrations have been set to %s.', 'event_espresso'),
1542
-                    EEH_Template::pretty_status($STS_ID, false, 'lower'));
1543
-            }
1544
-            EE_Error::add_success($msg);
1545
-        } else {
1546
-            EE_Error::add_error(__('Something went wrong, and the status was not changed', 'event_espresso'), __FILE__,
1547
-                __LINE__, __FUNCTION__);
1548
-        }
1549
-        if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
1550
-            $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1551
-        } else {
1552
-            $route = array('action' => 'default');
1553
-        }
1554
-        //unset nonces
1555
-        foreach ($this->_req_data as $ref => $value) {
1556
-            if (strpos($ref, 'nonce') !== false) {
1557
-                unset($this->_req_data[$ref]);
1558
-                continue;
1559
-            }
1560
-            $value                 = is_array($value) ? array_map('urlencode', $value) : urlencode($value);
1561
-            $this->_req_data[$ref] = $value;
1562
-        }
1563
-        //merge request vars so that the reloaded list table contains any existing filter query params
1564
-        $route = array_merge($this->_req_data, $route);
1565
-        $this->_redirect_after_action($success, '', '', $route, true);
1566
-    }
1567
-
1568
-
1569
-    /**
1570
-     * incoming reg status change from reg details page.
1571
-     *
1572
-     * @return void
1573
-     */
1574
-    protected function _change_reg_status()
1575
-    {
1576
-        $this->_req_data['return'] = 'view_registration';
1577
-        //set notify based on whether the send notifications toggle is set or not
1578
-        $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1579
-        //$notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1580
-        $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1581
-            ? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1582
-        switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1583
-            case EEM_Registration::status_id_approved :
1584
-            case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence') :
1585
-                $this->approve_registration($notify);
1586
-                break;
1587
-            case EEM_Registration::status_id_pending_payment :
1588
-            case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence') :
1589
-                $this->pending_registration($notify);
1590
-                break;
1591
-            case EEM_Registration::status_id_not_approved :
1592
-            case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence') :
1593
-                $this->not_approve_registration($notify);
1594
-                break;
1595
-            case EEM_Registration::status_id_declined :
1596
-            case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence') :
1597
-                $this->decline_registration($notify);
1598
-                break;
1599
-            case EEM_Registration::status_id_cancelled :
1600
-            case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence') :
1601
-                $this->cancel_registration($notify);
1602
-                break;
1603
-            case EEM_Registration::status_id_wait_list :
1604
-            case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence') :
1605
-                $this->waitlist_registration($notify);
1606
-                break;
1607
-            case EEM_Registration::status_id_incomplete :
1608
-            default :
1609
-                $result['success'] = false;
1610
-                unset($this->_req_data['return']);
1611
-                $this->_reg_status_change_return('', false);
1612
-                break;
1613
-        }
1614
-    }
1615
-
1616
-
1617
-    /**
1618
-     * approve_registration
1619
-     *
1620
-     * @access protected
1621
-     * @param bool $notify whether or not to notify the registrant about their approval.
1622
-     * @return void
1623
-     */
1624
-    protected function approve_registration($notify = false)
1625
-    {
1626
-        $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1627
-    }
1628
-
1629
-
1630
-    /**
1631
-     *        decline_registration
1632
-     *
1633
-     * @access protected
1634
-     * @param bool $notify whether or not to notify the registrant about their status change.
1635
-     * @return void
1636
-     */
1637
-    protected function decline_registration($notify = false)
1638
-    {
1639
-        $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1640
-    }
1641
-
1642
-
1643
-    /**
1644
-     *        cancel_registration
1645
-     *
1646
-     * @access protected
1647
-     * @param bool $notify whether or not to notify the registrant about their status change.
1648
-     * @return void
1649
-     */
1650
-    protected function cancel_registration($notify = false)
1651
-    {
1652
-        $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1653
-    }
1654
-
1655
-
1656
-    /**
1657
-     *        not_approve_registration
1658
-     *
1659
-     * @access protected
1660
-     * @param bool $notify whether or not to notify the registrant about their status change.
1661
-     * @return void
1662
-     */
1663
-    protected function not_approve_registration($notify = false)
1664
-    {
1665
-        $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1666
-    }
1667
-
1668
-
1669
-    /**
1670
-     *        decline_registration
1671
-     *
1672
-     * @access protected
1673
-     * @param bool $notify whether or not to notify the registrant about their status change.
1674
-     * @return void
1675
-     */
1676
-    protected function pending_registration($notify = false)
1677
-    {
1678
-        $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1679
-    }
1680
-
1681
-
1682
-    /**
1683
-     * waitlist_registration
1684
-     *
1685
-     * @access protected
1686
-     * @param bool $notify whether or not to notify the registrant about their status change.
1687
-     * @return void
1688
-     */
1689
-    protected function waitlist_registration($notify = false)
1690
-    {
1691
-        $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
1692
-    }
1693
-
1694
-
1695
-    /**
1696
-     *        generates HTML for the Registration main meta box
1697
-     *
1698
-     * @access public
1699
-     * @return void
1700
-     */
1701
-    public function _reg_details_meta_box()
1702
-    {
1703
-        EEH_Autoloader::register_line_item_display_autoloaders();
1704
-        EEH_Autoloader::register_line_item_filter_autoloaders();
1705
-        EE_Registry::instance()->load_helper('Line_Item');
1706
-        $transaction    = $this->_registration->transaction() ? $this->_registration->transaction()
1707
-            : EE_Transaction::new_instance();
1708
-        $this->_session = $transaction->session_data();
1709
-        $filters        = new EE_Line_Item_Filter_Collection();
1710
-        //$filters->add( new EE_Non_Zero_Line_Item_Filter() );
1711
-        $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
1712
-        $line_item_filter_processor              = new EE_Line_Item_Filter_Processor($filters,
1713
-            $transaction->total_line_item());
1714
-        $filtered_line_item_tree                 = $line_item_filter_processor->process();
1715
-        $line_item_display                       = new EE_Line_Item_Display('reg_admin_table',
1716
-            'EE_Admin_Table_Registration_Line_Item_Display_Strategy');
1717
-        $this->_template_args['line_item_table'] = $line_item_display->display_line_item($filtered_line_item_tree,
1718
-            array('EE_Registration' => $this->_registration));
1719
-        $attendee                                = $this->_registration->attendee();
1720
-        if (EE_Registry::instance()->CAP->current_user_can('ee_read_transaction',
1721
-            'espresso_transactions_view_transaction')
1722
-        ) {
1723
-            $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(EE_Admin_Page::add_query_args_and_nonce(array(
1724
-                'action' => 'view_transaction',
1725
-                'TXN_ID' => $transaction->ID(),
1726
-            ), TXN_ADMIN_URL), esc_html__(' View Transaction'), 'button secondary-button right',
1727
-                'dashicons dashicons-cart');
1728
-        } else {
1729
-            $this->_template_args['view_transaction_button'] = '';
1730
-        }
1731
-        if ($attendee instanceof EE_Attendee
1732
-            && EE_Registry::instance()->CAP->current_user_can('ee_send_message',
1733
-                'espresso_registrations_resend_registration')
1734
-        ) {
1735
-            $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(EE_Admin_Page::add_query_args_and_nonce(array(
1736
-                'action'      => 'resend_registration',
1737
-                '_REG_ID'     => $this->_registration->ID(),
1738
-                'redirect_to' => 'view_registration',
1739
-            ), REG_ADMIN_URL), esc_html__(' Resend Registration'), 'button secondary-button right',
1740
-                'dashicons dashicons-email-alt');
1741
-        } else {
1742
-            $this->_template_args['resend_registration_button'] = '';
1743
-        }
1744
-        $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1745
-        $payment                               = $transaction->get_first_related('Payment');
1746
-        $payment                               = ! $payment instanceof EE_Payment ? EE_Payment::new_instance() : $payment;
1747
-        $payment_method                        = $payment->get_first_related('Payment_Method');
1748
-        $payment_method                        = ! $payment_method instanceof EE_Payment_Method ? EE_Payment_Method::new_instance()
1749
-            : $payment_method;
1750
-        $reg_details                           = array(
1751
-            'payment_method'       => $payment_method->name(),
1752
-            'response_msg'         => $payment->gateway_response(),
1753
-            'registration_id'      => $this->_registration->get('REG_code'),
1754
-            'registration_session' => $this->_registration->session_ID(),
1755
-            'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
1756
-            'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
1757
-        );
1758
-        if (isset($reg_details['registration_id'])) {
1759
-            $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
1760
-            $this->_template_args['reg_details']['registration_id']['label'] = __('Registration ID', 'event_espresso');
1761
-            $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
1762
-        }
1763
-        if (isset($reg_details['payment_method'])) {
1764
-            $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
1765
-            $this->_template_args['reg_details']['payment_method']['label'] = __('Most Recent Payment Method',
1766
-                'event_espresso');
1767
-            $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
1768
-            $this->_template_args['reg_details']['response_msg']['value']   = $reg_details['response_msg'];
1769
-            $this->_template_args['reg_details']['response_msg']['label']   = __('Payment method response',
1770
-                'event_espresso');
1771
-            $this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
1772
-        }
1773
-        $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
1774
-        $this->_template_args['reg_details']['registration_session']['label'] = __('Registration Session',
1775
-            'event_espresso');
1776
-        $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
1777
-        $this->_template_args['reg_details']['ip_address']['value']           = $reg_details['ip_address'];
1778
-        $this->_template_args['reg_details']['ip_address']['label']           = __('Registration placed from IP',
1779
-            'event_espresso');
1780
-        $this->_template_args['reg_details']['ip_address']['class']           = 'regular-text';
1781
-        $this->_template_args['reg_details']['user_agent']['value']           = $reg_details['user_agent'];
1782
-        $this->_template_args['reg_details']['user_agent']['label']           = __('Registrant User Agent',
1783
-            'event_espresso');
1784
-        $this->_template_args['reg_details']['user_agent']['class']           = 'large-text';
1785
-        $this->_template_args['event_link']                                   = EE_Admin_Page::add_query_args_and_nonce(array(
1786
-            'action'   => 'default',
1787
-            'event_id' => $this->_registration->event_ID(),
1788
-        ), REG_ADMIN_URL);
1789
-        $this->_template_args['REG_ID']                                       = $this->_registration->ID();
1790
-        $this->_template_args['event_id']                                     = $this->_registration->event_ID();
1791
-        $template_path                                                        = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
1792
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
1793
-    }
1794
-
1795
-
1796
-    /**
1797
-     * generates HTML for the Registration Questions meta box.
1798
-     * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
1799
-     * otherwise uses new forms system
1800
-     *
1801
-     * @access public
1802
-     * @return void
1803
-     */
1804
-    public function _reg_questions_meta_box()
1805
-    {
1806
-        //allow someone to override this method entirely
1807
-        if (apply_filters('FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', true, $this,
1808
-            $this->_registration)) {
1809
-            $form                                              = $this->_get_reg_custom_questions_form($this->_registration->ID());
1810
-            $this->_template_args['att_questions']             = count($form->subforms()) > 0 ? $form->get_html_and_js() : '';
1811
-            $this->_template_args['reg_questions_form_action'] = 'edit_registration';
1812
-            $this->_template_args['REG_ID']                    = $this->_registration->ID();
1813
-            $template_path                                     = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
1814
-            echo EEH_Template::display_template($template_path, $this->_template_args, true);
1815
-        }
1816
-    }
1817
-
1818
-
1819
-    /**
1820
-     * form_before_question_group
1821
-     *
1822
-     * @deprecated    as of 4.8.32.rc.000
1823
-     * @access        public
1824
-     * @param        string $output
1825
-     * @return        string
1826
-     */
1827
-    public function form_before_question_group($output)
1828
-    {
1829
-        EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1830
-            __('This method would have been protected but was used on a filter callback'
1831
-               . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1832
-            '4.8.32.rc.000');
1833
-        return '
1050
+		if ( ! empty($registration_status)) {
1051
+			$where['STS_ID'] = $registration_status;
1052
+		} else {
1053
+			//make sure we exclude incomplete registrations, but only if not trashed.
1054
+			if ($view === 'trash') {
1055
+				$where['REG_deleted'] = true;
1056
+			} else if ($view === 'incomplete') {
1057
+				$where['STS_ID'] = EEM_Registration::status_id_incomplete;
1058
+			} else {
1059
+				$where['STS_ID'] = array('!=', EEM_Registration::status_id_incomplete);
1060
+			}
1061
+		}
1062
+		return $where;
1063
+	}
1064
+
1065
+
1066
+	/**
1067
+	 * Adds any provided date restraints to the where conditions for the registrations query.
1068
+	 *
1069
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1070
+	 * @return array
1071
+	 */
1072
+	protected function _add_date_to_where_conditions(array $request)
1073
+	{
1074
+		$where = array();
1075
+		$view  = EEH_Array::is_set( $request, 'status', '' );
1076
+		$month_range             = ! empty($request['month_range'])
1077
+			? sanitize_text_field($request['month_range'])
1078
+			: '';
1079
+		$retrieve_for_today      = $view === 'today';
1080
+		$retrieve_for_this_month = $view === 'month';
1081
+
1082
+		if ($retrieve_for_today) {
1083
+			$now               = date('Y-m-d', current_time('timestamp'));
1084
+			$where['REG_date'] = array(
1085
+				'BETWEEN',
1086
+				array(
1087
+					EEM_Registration::instance()->convert_datetime_for_query(
1088
+						'REG_date',
1089
+						$now . ' 00:00:00',
1090
+						'Y-m-d H:i:s'
1091
+					),
1092
+					EEM_Registration::instance()->convert_datetime_for_query(
1093
+						'REG_date',
1094
+						$now . ' 23:59:59',
1095
+						'Y-m-d H:i:s'
1096
+					),
1097
+				),
1098
+			);
1099
+		} elseif ($retrieve_for_this_month) {
1100
+			$current_year_and_month = date('Y-m', current_time('timestamp'));
1101
+			$days_this_month        = date('t', current_time('timestamp'));
1102
+			$where['REG_date']      = array(
1103
+				'BETWEEN',
1104
+				array(
1105
+					EEM_Registration::instance()->convert_datetime_for_query(
1106
+						'REG_date',
1107
+						$current_year_and_month . '-01 00:00:00',
1108
+						'Y-m-d H:i:s'
1109
+					),
1110
+					EEM_Registration::instance()->convert_datetime_for_query(
1111
+						'REG_date',
1112
+						$current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1113
+						'Y-m-d H:i:s'
1114
+					),
1115
+				),
1116
+			);
1117
+		} elseif ($month_range) {
1118
+			$pieces          = explode(' ', $month_range, 3);
1119
+			$month_requested = ! empty($pieces[0])
1120
+				? date('m', \EEH_DTT_Helper::first_of_month_timestamp($pieces[0]))
1121
+				: '';
1122
+			$year_requested  = ! empty($pieces[1])
1123
+				? $pieces[1]
1124
+				: '';
1125
+			//if there is not a month or year then we can't go further
1126
+			if ($month_requested && $year_requested) {
1127
+				$days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1128
+				$where['REG_date'] = array(
1129
+					'BETWEEN',
1130
+					array(
1131
+						EEM_Registration::instance()->convert_datetime_for_query(
1132
+							'REG_date',
1133
+							$year_requested . '-' . $month_requested . '-01 00:00:00',
1134
+							'Y-m-d H:i:s'
1135
+						),
1136
+						EEM_Registration::instance()->convert_datetime_for_query(
1137
+							'REG_date',
1138
+							$year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1139
+							'Y-m-d H:i:s'
1140
+						),
1141
+					),
1142
+				);
1143
+			}
1144
+		}
1145
+		return $where;
1146
+	}
1147
+
1148
+
1149
+	/**
1150
+	 * Adds any provided search restraints to the where conditions for the registrations query
1151
+	 *
1152
+	 * @param array $request usually the same as $this->_req_data but not necessarily
1153
+	 * @return array
1154
+	 */
1155
+	protected function _add_search_to_where_conditions(array $request)
1156
+	{
1157
+		$where = array();
1158
+		if ( ! empty($request['s'])) {
1159
+			$search_string = '%' . sanitize_text_field($request['s']) . '%';
1160
+			$where['OR'] = array(
1161
+				'Event.EVT_name'                          => array('LIKE', $search_string),
1162
+				'Event.EVT_desc'                          => array('LIKE', $search_string),
1163
+				'Event.EVT_short_desc'                    => array('LIKE', $search_string),
1164
+				'Attendee.ATT_full_name'                  => array('LIKE', $search_string),
1165
+				'Attendee.ATT_fname'                      => array('LIKE', $search_string),
1166
+				'Attendee.ATT_lname'                      => array('LIKE', $search_string),
1167
+				'Attendee.ATT_short_bio'                  => array('LIKE', $search_string),
1168
+				'Attendee.ATT_email'                      => array('LIKE', $search_string),
1169
+				'Attendee.ATT_address'                    => array('LIKE', $search_string),
1170
+				'Attendee.ATT_address2'                   => array('LIKE', $search_string),
1171
+				'Attendee.ATT_city'                       => array('LIKE', $search_string),
1172
+				'REG_final_price'                         => array('LIKE', $search_string),
1173
+				'REG_code'                                => array('LIKE', $search_string),
1174
+				'REG_count'                               => array('LIKE', $search_string),
1175
+				'REG_group_size'                          => array('LIKE', $search_string),
1176
+				'Ticket.TKT_name'                         => array('LIKE', $search_string),
1177
+				'Ticket.TKT_description'                  => array('LIKE', $search_string),
1178
+				'Transaction.Payment.PAY_txn_id_chq_nmbr' => array('LIKE', $search_string),
1179
+			);
1180
+		}
1181
+		return $where;
1182
+	}
1183
+
1184
+
1185
+	/**
1186
+	 * Sets up the where conditions for the registrations query.
1187
+	 *
1188
+	 * @param array $request
1189
+	 * @return array
1190
+	 */
1191
+	protected function _get_where_conditions_for_registrations_query($request)
1192
+	{
1193
+		return array_merge(
1194
+			$this->_add_event_id_to_where_conditions($request),
1195
+			$this->_add_category_id_to_where_conditions($request),
1196
+			$this->_add_datetime_id_to_where_conditions($request),
1197
+			$this->_add_registration_status_to_where_conditions($request),
1198
+			$this->_add_date_to_where_conditions($request),
1199
+			$this->_add_search_to_where_conditions($request)
1200
+		);
1201
+	}
1202
+
1203
+
1204
+	/**
1205
+	 * Sets up the orderby for the registrations query.
1206
+	 *
1207
+	 * @return array
1208
+	 */
1209
+	protected function _get_orderby_for_registrations_query()
1210
+	{
1211
+		$orderby_field = ! empty($this->_req_data['orderby'])
1212
+			? sanitize_text_field($this->_req_data['orderby'])
1213
+			: '';
1214
+		switch ($orderby_field) {
1215
+			case '_REG_ID':
1216
+				$orderby_field = 'REG_ID';
1217
+				break;
1218
+			case '_Reg_status':
1219
+				$orderby_field = 'STS_ID';
1220
+				break;
1221
+			case 'ATT_fname':
1222
+				$orderby_field = array('Attendee.ATT_fname', 'Attendee.ATT_lname');
1223
+				break;
1224
+			case 'ATT_lname' :
1225
+				$orderby_field = array('Attendee.ATT_lname', 'Attendee.ATT_fname');
1226
+				break;
1227
+			case 'event_name':
1228
+				$orderby_field = 'Event.EVT_name';
1229
+				break;
1230
+			case 'DTT_EVT_start':
1231
+				$orderby_field = 'Event.Datetime.DTT_EVT_start';
1232
+				break;
1233
+			default: //'REG_date'
1234
+				$orderby_field = 'REG_date';
1235
+		}
1236
+
1237
+		//order
1238
+		$order = ! empty($this->_req_data['order'])
1239
+			? sanitize_text_field($this->_req_data['order'])
1240
+			: 'DESC';
1241
+
1242
+		//mutate orderby_field
1243
+		$orderby_field = array_combine(
1244
+				(array) $orderby_field,
1245
+				array_fill(0, count($orderby_field), $order)
1246
+			);
1247
+		return array('order_by' => $orderby_field);
1248
+	}
1249
+
1250
+
1251
+	/**
1252
+	 * Sets up the limit for the registrations query.
1253
+	 *
1254
+	 * @param $per_page
1255
+	 * @return array
1256
+	 */
1257
+	protected function _get_limit($per_page)
1258
+	{
1259
+		$current_page = ! empty($this->_req_data['paged'])
1260
+			? absint($this->_req_data['paged'])
1261
+			: 1;
1262
+		$per_page     = ! empty($this->_req_data['perpage'])
1263
+			? $this->_req_data['perpage']
1264
+			: $per_page;
1265
+
1266
+		//-1 means return all results so get out if that's set.
1267
+		if ((int)$per_page === -1) {
1268
+			return array();
1269
+		}
1270
+		$per_page = absint($per_page);
1271
+		$offset   = ($current_page - 1) * $per_page;
1272
+		return array('limit' => array($offset, $per_page));
1273
+	}
1274
+
1275
+
1276
+	public function get_registration_status_array()
1277
+	{
1278
+		return self::$_reg_status;
1279
+	}
1280
+
1281
+
1282
+
1283
+
1284
+	/***************************************        REGISTRATION DETAILS        ***************************************/
1285
+	/**
1286
+	 *        generates HTML for the View Registration Details Admin page
1287
+	 *
1288
+	 * @access protected
1289
+	 * @return void
1290
+	 */
1291
+	protected function _registration_details()
1292
+	{
1293
+		$this->_template_args = array();
1294
+		$this->_set_registration_object();
1295
+		if (is_object($this->_registration)) {
1296
+			$transaction                                   = $this->_registration->transaction() ? $this->_registration->transaction()
1297
+				: EE_Transaction::new_instance();
1298
+			$this->_session                                = $transaction->session_data();
1299
+			$event_id                                      = $this->_registration->event_ID();
1300
+			$this->_template_args['reg_nmbr']['value']     = $this->_registration->ID();
1301
+			$this->_template_args['reg_nmbr']['label']     = __('Registration Number', 'event_espresso');
1302
+			$this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date');
1303
+			$this->_template_args['reg_datetime']['label'] = __('Date', 'event_espresso');
1304
+			$this->_template_args['grand_total']           = $transaction->total();
1305
+			$this->_template_args['currency_sign']         = EE_Registry::instance()->CFG->currency->sign;
1306
+			// link back to overview
1307
+			$this->_template_args['reg_overview_url']            = REG_ADMIN_URL;
1308
+			$this->_template_args['registration']                = $this->_registration;
1309
+			$this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce(array(
1310
+				'action'   => 'default',
1311
+				'event_id' => $event_id,
1312
+			), REG_ADMIN_URL);
1313
+			$this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
1314
+				'action' => 'default',
1315
+				'EVT_ID' => $event_id,
1316
+				'page'   => 'espresso_transactions',
1317
+			), admin_url('admin.php'));
1318
+			$this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(array(
1319
+				'page'   => 'espresso_events',
1320
+				'action' => 'edit',
1321
+				'post'   => $event_id,
1322
+			), admin_url('admin.php'));
1323
+			//next and previous links
1324
+			$next_reg                                      = $this->_registration->next(null, array(), 'REG_ID');
1325
+			$this->_template_args['next_registration']     = $next_reg
1326
+				? $this->_next_link(EE_Admin_Page::add_query_args_and_nonce(array(
1327
+					'action'  => 'view_registration',
1328
+					'_REG_ID' => $next_reg['REG_ID'],
1329
+				), REG_ADMIN_URL), 'dashicons dashicons-arrow-right ee-icon-size-22') : '';
1330
+			$previous_reg                                  = $this->_registration->previous(null, array(), 'REG_ID');
1331
+			$this->_template_args['previous_registration'] = $previous_reg
1332
+				? $this->_previous_link(EE_Admin_Page::add_query_args_and_nonce(array(
1333
+					'action'  => 'view_registration',
1334
+					'_REG_ID' => $previous_reg['REG_ID'],
1335
+				), REG_ADMIN_URL), 'dashicons dashicons-arrow-left ee-icon-size-22') : '';
1336
+			// grab header
1337
+			$template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1338
+			$this->_template_args['REG_ID']            = $this->_registration->ID();
1339
+			$this->_template_args['admin_page_header'] = EEH_Template::display_template($template_path,
1340
+				$this->_template_args, true);
1341
+		} else {
1342
+			$this->_template_args['admin_page_header'] = $this->display_espresso_notices();
1343
+		}
1344
+		// the details template wrapper
1345
+		$this->display_admin_page_with_sidebar();
1346
+	}
1347
+
1348
+
1349
+	protected function _registration_details_metaboxes()
1350
+	{
1351
+		do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this);
1352
+		$this->_set_registration_object();
1353
+		$attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null;
1354
+		add_meta_box('edit-reg-status-mbox', __('Registration Status', 'event_espresso'),
1355
+			array($this, 'set_reg_status_buttons_metabox'), $this->wp_page_slug, 'normal', 'high');
1356
+		add_meta_box('edit-reg-details-mbox', __('Registration Details', 'event_espresso'),
1357
+			array($this, '_reg_details_meta_box'), $this->wp_page_slug, 'normal', 'high');
1358
+		if ($attendee instanceof EE_Attendee
1359
+			&& EE_Registry::instance()->CAP->current_user_can('ee_edit_registration', 'edit-reg-questions-mbox')
1360
+		) {
1361
+			add_meta_box('edit-reg-questions-mbox', __('Registration Form Answers', 'event_espresso'),
1362
+				array($this, '_reg_questions_meta_box'), $this->wp_page_slug, 'normal', 'high');
1363
+		}
1364
+		add_meta_box('edit-reg-registrant-mbox', __('Contact Details', 'event_espresso'),
1365
+			array($this, '_reg_registrant_side_meta_box'), $this->wp_page_slug, 'side', 'high');
1366
+		if ($this->_registration->group_size() > 1) {
1367
+			add_meta_box('edit-reg-attendees-mbox', __('Other Registrations in this Transaction', 'event_espresso'),
1368
+				array($this, '_reg_attendees_meta_box'), $this->wp_page_slug, 'normal', 'high');
1369
+		}
1370
+	}
1371
+
1372
+
1373
+	/**
1374
+	 * set_reg_status_buttons_metabox
1375
+	 *
1376
+	 * @access protected
1377
+	 * @return string
1378
+	 * @throws \EE_Error
1379
+	 */
1380
+	public function set_reg_status_buttons_metabox()
1381
+	{
1382
+		$this->_set_registration_object();
1383
+		$change_reg_status_form = $this->_generate_reg_status_change_form();
1384
+		echo $change_reg_status_form->form_open(self::add_query_args_and_nonce(array(
1385
+			'action' => 'change_reg_status',
1386
+		), REG_ADMIN_URL));
1387
+		echo $change_reg_status_form->get_html();
1388
+		echo $change_reg_status_form->form_close();
1389
+	}
1390
+
1391
+
1392
+	/**
1393
+	 * @return EE_Form_Section_Proper
1394
+	 */
1395
+	protected function _generate_reg_status_change_form()
1396
+	{
1397
+		return new EE_Form_Section_Proper(array(
1398
+			'name'            => 'reg_status_change_form',
1399
+			'html_id'         => 'reg-status-change-form',
1400
+			'layout_strategy' => new EE_Admin_Two_Column_Layout(),
1401
+			'subsections'     => array(
1402
+				'return'             => new EE_Hidden_Input(array(
1403
+					'name'    => 'return',
1404
+					'default' => 'view_registration',
1405
+				)),
1406
+				'REG_ID'             => new EE_Hidden_Input(array(
1407
+					'name'    => 'REG_ID',
1408
+					'default' => $this->_registration->ID(),
1409
+				)),
1410
+				'current_status'     => new EE_Form_Section_HTML(EEH_HTML::tr(EEH_HTML::th(EEH_HTML::label(EEH_HTML::strong(__('Current Registration Status',
1411
+						'event_espresso')))) . EEH_HTML::td(EEH_HTML::strong($this->_registration->pretty_status(),
1412
+						'', 'status-' . $this->_registration->status_ID(),
1413
+						'line-height: 1em; font-size: 1.5em; font-weight: bold;')))),
1414
+				'reg_status'         => new EE_Select_Input($this->_get_reg_statuses(), array(
1415
+					'html_label_text' => __('Change Registration Status to', 'event_espresso'),
1416
+					'default'         => $this->_registration->status_ID(),
1417
+				)),
1418
+				'send_notifications' => new EE_Yes_No_Input(array(
1419
+					'html_label_text' => __('Send Related Messages', 'event_espresso'),
1420
+					'default'         => false,
1421
+					'html_help_text'  => __('If set to "Yes", then the related messages will be sent to the registrant.',
1422
+						'event_espresso'),
1423
+				)),
1424
+				'submit'             => new EE_Submit_Input(array(
1425
+					'html_class'      => 'button-primary',
1426
+					'html_label_text' => '&nbsp;',
1427
+					'default'         => __('Update Registration Status', 'event_espresso'),
1428
+				)),
1429
+			),
1430
+		));
1431
+	}
1432
+
1433
+
1434
+
1435
+	/**
1436
+	 * Returns an array of all the buttons for the various statuses and switch status actions
1437
+	 *
1438
+	 * @return array
1439
+	 */
1440
+	protected function _get_reg_statuses()
1441
+	{
1442
+		$reg_status_array = EEM_Registration::instance()->reg_status_array();
1443
+		unset ($reg_status_array[EEM_Registration::status_id_incomplete]);
1444
+		// get current reg status
1445
+		$current_status = $this->_registration->status_ID();
1446
+		// is registration for free event? This will determine whether to display the pending payment option
1447
+		if ($current_status != EEM_Registration::status_id_pending_payment
1448
+			&& $this->_registration->transaction()
1449
+								   ->is_free()
1450
+		) {
1451
+			unset($reg_status_array[EEM_Registration::status_id_pending_payment]);
1452
+		}
1453
+		return EEM_Status::instance()->localized_status($reg_status_array, false, 'sentence');
1454
+	}
1455
+
1456
+
1457
+	/**
1458
+	 * This method is used when using _REG_ID from request which may or may not be an array of reg_ids.
1459
+	 *
1460
+	 * @param bool $status REG status given for changing registrations to.
1461
+	 * @param bool $notify Whether to send messages notifications or not.
1462
+	 * @return array  (array with reg_id(s) updated and whether update was successful.
1463
+	 */
1464
+	protected function _set_registration_status_from_request($status = false, $notify = false)
1465
+	{
1466
+		if (isset($this->_req_data['reg_status_change_form'])) {
1467
+			$REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1468
+				? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1469
+		} else {
1470
+			$REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1471
+		}
1472
+		$success = $this->_set_registration_status($REG_IDs, $status);
1473
+		//notify?
1474
+		if ($success
1475
+			&& $notify
1476
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message',
1477
+				'espresso_registrations_resend_registration')
1478
+		) {
1479
+			$this->_process_resend_registration();
1480
+		}
1481
+		return $success;
1482
+	}
1483
+
1484
+
1485
+	/**
1486
+	 * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an
1487
+	 * array). Note, this method does NOT take care of possible notifications.  That is required by calling code.
1488
+	 *
1489
+	 * @param array $REG_IDs
1490
+	 * @param bool  $status
1491
+	 * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as
1492
+	 *               the array of updated registrations).
1493
+	 */
1494
+	protected function _set_registration_status($REG_IDs = array(), $status = false)
1495
+	{
1496
+		$success = false;
1497
+		// typecast $REG_IDs
1498
+		$REG_IDs = (array)$REG_IDs;
1499
+		if ( ! empty($REG_IDs)) {
1500
+			$success = true;
1501
+			// set default status if none is passed
1502
+			$status = $status ? $status : EEM_Registration::status_id_pending_payment;
1503
+			// sanitize $REG_IDs
1504
+			$REG_IDs = array_filter($REG_IDs, 'absint');
1505
+			//loop through REG_ID's and change status
1506
+			foreach ($REG_IDs as $REG_ID) {
1507
+				$registration = EEM_Registration::instance()->get_one_by_ID($REG_ID);
1508
+				if ($registration instanceof EE_Registration) {
1509
+					$registration->set_status($status);
1510
+					$result = $registration->save();
1511
+					// verifying explicit fails because update *may* just return 0 for 0 rows affected
1512
+					$success = $result !== false ? $success : false;
1513
+				}
1514
+			}
1515
+		}
1516
+		//reset _req_data['_REG_ID'] for any potential future messages notifications
1517
+		$this->_req_data['_REG_ID'] = $REG_IDs;
1518
+		//return $success and processed registrations
1519
+		return array('REG_ID' => $REG_IDs, 'success' => $success);
1520
+	}
1521
+
1522
+
1523
+	/**
1524
+	 * Common logic for setting up success message and redirecting to appropriate route
1525
+	 *
1526
+	 * @param  string $STS_ID status id for the registration changed to
1527
+	 * @param   bool  $notify indicates whether the _set_registration_status_from_request does notifications or not.
1528
+	 * @return void
1529
+	 */
1530
+	protected function _reg_status_change_return($STS_ID, $notify = false)
1531
+	{
1532
+		$result  = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify)
1533
+			: array('success' => false);
1534
+		$success = isset($result['success']) && $result['success'];
1535
+		//setup success message
1536
+		if ($success) {
1537
+			if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) {
1538
+				$msg = sprintf(__('Registration status has been set to %s', 'event_espresso'),
1539
+					EEH_Template::pretty_status($STS_ID, false, 'lower'));
1540
+			} else {
1541
+				$msg = sprintf(__('Registrations have been set to %s.', 'event_espresso'),
1542
+					EEH_Template::pretty_status($STS_ID, false, 'lower'));
1543
+			}
1544
+			EE_Error::add_success($msg);
1545
+		} else {
1546
+			EE_Error::add_error(__('Something went wrong, and the status was not changed', 'event_espresso'), __FILE__,
1547
+				__LINE__, __FUNCTION__);
1548
+		}
1549
+		if (isset($this->_req_data['return']) && $this->_req_data['return'] == 'view_registration') {
1550
+			$route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID']));
1551
+		} else {
1552
+			$route = array('action' => 'default');
1553
+		}
1554
+		//unset nonces
1555
+		foreach ($this->_req_data as $ref => $value) {
1556
+			if (strpos($ref, 'nonce') !== false) {
1557
+				unset($this->_req_data[$ref]);
1558
+				continue;
1559
+			}
1560
+			$value                 = is_array($value) ? array_map('urlencode', $value) : urlencode($value);
1561
+			$this->_req_data[$ref] = $value;
1562
+		}
1563
+		//merge request vars so that the reloaded list table contains any existing filter query params
1564
+		$route = array_merge($this->_req_data, $route);
1565
+		$this->_redirect_after_action($success, '', '', $route, true);
1566
+	}
1567
+
1568
+
1569
+	/**
1570
+	 * incoming reg status change from reg details page.
1571
+	 *
1572
+	 * @return void
1573
+	 */
1574
+	protected function _change_reg_status()
1575
+	{
1576
+		$this->_req_data['return'] = 'view_registration';
1577
+		//set notify based on whether the send notifications toggle is set or not
1578
+		$notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']);
1579
+		//$notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] );
1580
+		$this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status'])
1581
+			? $this->_req_data['reg_status_change_form']['reg_status'] : '';
1582
+		switch ($this->_req_data['reg_status_change_form']['reg_status']) {
1583
+			case EEM_Registration::status_id_approved :
1584
+			case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence') :
1585
+				$this->approve_registration($notify);
1586
+				break;
1587
+			case EEM_Registration::status_id_pending_payment :
1588
+			case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence') :
1589
+				$this->pending_registration($notify);
1590
+				break;
1591
+			case EEM_Registration::status_id_not_approved :
1592
+			case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence') :
1593
+				$this->not_approve_registration($notify);
1594
+				break;
1595
+			case EEM_Registration::status_id_declined :
1596
+			case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence') :
1597
+				$this->decline_registration($notify);
1598
+				break;
1599
+			case EEM_Registration::status_id_cancelled :
1600
+			case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence') :
1601
+				$this->cancel_registration($notify);
1602
+				break;
1603
+			case EEM_Registration::status_id_wait_list :
1604
+			case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence') :
1605
+				$this->waitlist_registration($notify);
1606
+				break;
1607
+			case EEM_Registration::status_id_incomplete :
1608
+			default :
1609
+				$result['success'] = false;
1610
+				unset($this->_req_data['return']);
1611
+				$this->_reg_status_change_return('', false);
1612
+				break;
1613
+		}
1614
+	}
1615
+
1616
+
1617
+	/**
1618
+	 * approve_registration
1619
+	 *
1620
+	 * @access protected
1621
+	 * @param bool $notify whether or not to notify the registrant about their approval.
1622
+	 * @return void
1623
+	 */
1624
+	protected function approve_registration($notify = false)
1625
+	{
1626
+		$this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify);
1627
+	}
1628
+
1629
+
1630
+	/**
1631
+	 *        decline_registration
1632
+	 *
1633
+	 * @access protected
1634
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1635
+	 * @return void
1636
+	 */
1637
+	protected function decline_registration($notify = false)
1638
+	{
1639
+		$this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify);
1640
+	}
1641
+
1642
+
1643
+	/**
1644
+	 *        cancel_registration
1645
+	 *
1646
+	 * @access protected
1647
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1648
+	 * @return void
1649
+	 */
1650
+	protected function cancel_registration($notify = false)
1651
+	{
1652
+		$this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify);
1653
+	}
1654
+
1655
+
1656
+	/**
1657
+	 *        not_approve_registration
1658
+	 *
1659
+	 * @access protected
1660
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1661
+	 * @return void
1662
+	 */
1663
+	protected function not_approve_registration($notify = false)
1664
+	{
1665
+		$this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify);
1666
+	}
1667
+
1668
+
1669
+	/**
1670
+	 *        decline_registration
1671
+	 *
1672
+	 * @access protected
1673
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1674
+	 * @return void
1675
+	 */
1676
+	protected function pending_registration($notify = false)
1677
+	{
1678
+		$this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify);
1679
+	}
1680
+
1681
+
1682
+	/**
1683
+	 * waitlist_registration
1684
+	 *
1685
+	 * @access protected
1686
+	 * @param bool $notify whether or not to notify the registrant about their status change.
1687
+	 * @return void
1688
+	 */
1689
+	protected function waitlist_registration($notify = false)
1690
+	{
1691
+		$this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify);
1692
+	}
1693
+
1694
+
1695
+	/**
1696
+	 *        generates HTML for the Registration main meta box
1697
+	 *
1698
+	 * @access public
1699
+	 * @return void
1700
+	 */
1701
+	public function _reg_details_meta_box()
1702
+	{
1703
+		EEH_Autoloader::register_line_item_display_autoloaders();
1704
+		EEH_Autoloader::register_line_item_filter_autoloaders();
1705
+		EE_Registry::instance()->load_helper('Line_Item');
1706
+		$transaction    = $this->_registration->transaction() ? $this->_registration->transaction()
1707
+			: EE_Transaction::new_instance();
1708
+		$this->_session = $transaction->session_data();
1709
+		$filters        = new EE_Line_Item_Filter_Collection();
1710
+		//$filters->add( new EE_Non_Zero_Line_Item_Filter() );
1711
+		$filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration));
1712
+		$line_item_filter_processor              = new EE_Line_Item_Filter_Processor($filters,
1713
+			$transaction->total_line_item());
1714
+		$filtered_line_item_tree                 = $line_item_filter_processor->process();
1715
+		$line_item_display                       = new EE_Line_Item_Display('reg_admin_table',
1716
+			'EE_Admin_Table_Registration_Line_Item_Display_Strategy');
1717
+		$this->_template_args['line_item_table'] = $line_item_display->display_line_item($filtered_line_item_tree,
1718
+			array('EE_Registration' => $this->_registration));
1719
+		$attendee                                = $this->_registration->attendee();
1720
+		if (EE_Registry::instance()->CAP->current_user_can('ee_read_transaction',
1721
+			'espresso_transactions_view_transaction')
1722
+		) {
1723
+			$this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link(EE_Admin_Page::add_query_args_and_nonce(array(
1724
+				'action' => 'view_transaction',
1725
+				'TXN_ID' => $transaction->ID(),
1726
+			), TXN_ADMIN_URL), esc_html__(' View Transaction'), 'button secondary-button right',
1727
+				'dashicons dashicons-cart');
1728
+		} else {
1729
+			$this->_template_args['view_transaction_button'] = '';
1730
+		}
1731
+		if ($attendee instanceof EE_Attendee
1732
+			&& EE_Registry::instance()->CAP->current_user_can('ee_send_message',
1733
+				'espresso_registrations_resend_registration')
1734
+		) {
1735
+			$this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link(EE_Admin_Page::add_query_args_and_nonce(array(
1736
+				'action'      => 'resend_registration',
1737
+				'_REG_ID'     => $this->_registration->ID(),
1738
+				'redirect_to' => 'view_registration',
1739
+			), REG_ADMIN_URL), esc_html__(' Resend Registration'), 'button secondary-button right',
1740
+				'dashicons dashicons-email-alt');
1741
+		} else {
1742
+			$this->_template_args['resend_registration_button'] = '';
1743
+		}
1744
+		$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
1745
+		$payment                               = $transaction->get_first_related('Payment');
1746
+		$payment                               = ! $payment instanceof EE_Payment ? EE_Payment::new_instance() : $payment;
1747
+		$payment_method                        = $payment->get_first_related('Payment_Method');
1748
+		$payment_method                        = ! $payment_method instanceof EE_Payment_Method ? EE_Payment_Method::new_instance()
1749
+			: $payment_method;
1750
+		$reg_details                           = array(
1751
+			'payment_method'       => $payment_method->name(),
1752
+			'response_msg'         => $payment->gateway_response(),
1753
+			'registration_id'      => $this->_registration->get('REG_code'),
1754
+			'registration_session' => $this->_registration->session_ID(),
1755
+			'ip_address'           => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '',
1756
+			'user_agent'           => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '',
1757
+		);
1758
+		if (isset($reg_details['registration_id'])) {
1759
+			$this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id'];
1760
+			$this->_template_args['reg_details']['registration_id']['label'] = __('Registration ID', 'event_espresso');
1761
+			$this->_template_args['reg_details']['registration_id']['class'] = 'regular-text';
1762
+		}
1763
+		if (isset($reg_details['payment_method'])) {
1764
+			$this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method'];
1765
+			$this->_template_args['reg_details']['payment_method']['label'] = __('Most Recent Payment Method',
1766
+				'event_espresso');
1767
+			$this->_template_args['reg_details']['payment_method']['class'] = 'regular-text';
1768
+			$this->_template_args['reg_details']['response_msg']['value']   = $reg_details['response_msg'];
1769
+			$this->_template_args['reg_details']['response_msg']['label']   = __('Payment method response',
1770
+				'event_espresso');
1771
+			$this->_template_args['reg_details']['response_msg']['class']   = 'regular-text';
1772
+		}
1773
+		$this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session'];
1774
+		$this->_template_args['reg_details']['registration_session']['label'] = __('Registration Session',
1775
+			'event_espresso');
1776
+		$this->_template_args['reg_details']['registration_session']['class'] = 'regular-text';
1777
+		$this->_template_args['reg_details']['ip_address']['value']           = $reg_details['ip_address'];
1778
+		$this->_template_args['reg_details']['ip_address']['label']           = __('Registration placed from IP',
1779
+			'event_espresso');
1780
+		$this->_template_args['reg_details']['ip_address']['class']           = 'regular-text';
1781
+		$this->_template_args['reg_details']['user_agent']['value']           = $reg_details['user_agent'];
1782
+		$this->_template_args['reg_details']['user_agent']['label']           = __('Registrant User Agent',
1783
+			'event_espresso');
1784
+		$this->_template_args['reg_details']['user_agent']['class']           = 'large-text';
1785
+		$this->_template_args['event_link']                                   = EE_Admin_Page::add_query_args_and_nonce(array(
1786
+			'action'   => 'default',
1787
+			'event_id' => $this->_registration->event_ID(),
1788
+		), REG_ADMIN_URL);
1789
+		$this->_template_args['REG_ID']                                       = $this->_registration->ID();
1790
+		$this->_template_args['event_id']                                     = $this->_registration->event_ID();
1791
+		$template_path                                                        = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
1792
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
1793
+	}
1794
+
1795
+
1796
+	/**
1797
+	 * generates HTML for the Registration Questions meta box.
1798
+	 * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters),
1799
+	 * otherwise uses new forms system
1800
+	 *
1801
+	 * @access public
1802
+	 * @return void
1803
+	 */
1804
+	public function _reg_questions_meta_box()
1805
+	{
1806
+		//allow someone to override this method entirely
1807
+		if (apply_filters('FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', true, $this,
1808
+			$this->_registration)) {
1809
+			$form                                              = $this->_get_reg_custom_questions_form($this->_registration->ID());
1810
+			$this->_template_args['att_questions']             = count($form->subforms()) > 0 ? $form->get_html_and_js() : '';
1811
+			$this->_template_args['reg_questions_form_action'] = 'edit_registration';
1812
+			$this->_template_args['REG_ID']                    = $this->_registration->ID();
1813
+			$template_path                                     = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
1814
+			echo EEH_Template::display_template($template_path, $this->_template_args, true);
1815
+		}
1816
+	}
1817
+
1818
+
1819
+	/**
1820
+	 * form_before_question_group
1821
+	 *
1822
+	 * @deprecated    as of 4.8.32.rc.000
1823
+	 * @access        public
1824
+	 * @param        string $output
1825
+	 * @return        string
1826
+	 */
1827
+	public function form_before_question_group($output)
1828
+	{
1829
+		EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1830
+			__('This method would have been protected but was used on a filter callback'
1831
+			   . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1832
+			'4.8.32.rc.000');
1833
+		return '
1834 1834
 	<table class="form-table ee-width-100">
1835 1835
 		<tbody>
1836 1836
 			';
1837
-    }
1838
-
1839
-
1840
-    /**
1841
-     * form_after_question_group
1842
-     *
1843
-     * @deprecated    as of 4.8.32.rc.000
1844
-     * @access        public
1845
-     * @param        string $output
1846
-     * @return        string
1847
-     */
1848
-    public function form_after_question_group($output)
1849
-    {
1850
-        EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1851
-            __('This method would have been protected but was used on a filter callback'
1852
-               . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1853
-            '4.8.32.rc.000');
1854
-        return '
1837
+	}
1838
+
1839
+
1840
+	/**
1841
+	 * form_after_question_group
1842
+	 *
1843
+	 * @deprecated    as of 4.8.32.rc.000
1844
+	 * @access        public
1845
+	 * @param        string $output
1846
+	 * @return        string
1847
+	 */
1848
+	public function form_after_question_group($output)
1849
+	{
1850
+		EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1851
+			__('This method would have been protected but was used on a filter callback'
1852
+			   . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1853
+			'4.8.32.rc.000');
1854
+		return '
1855 1855
 			<tr class="hide-if-no-js">
1856 1856
 				<th> </th>
1857 1857
 				<td class="reg-admin-edit-attendee-question-td">
1858 1858
 					<a class="reg-admin-edit-attendee-question-lnk" href="#" title="'
1859
-               . esc_attr__('click to edit question', 'event_espresso')
1860
-               . '">
1859
+			   . esc_attr__('click to edit question', 'event_espresso')
1860
+			   . '">
1861 1861
 						<span class="reg-admin-edit-question-group-spn lt-grey-txt">'
1862
-               . __('edit the above question group', 'event_espresso')
1863
-               . '</span>
1862
+			   . __('edit the above question group', 'event_espresso')
1863
+			   . '</span>
1864 1864
 						<div class="dashicons dashicons-edit"></div>
1865 1865
 					</a>
1866 1866
 				</td>
@@ -1868,490 +1868,490 @@  discard block
 block discarded – undo
1868 1868
 		</tbody>
1869 1869
 	</table>
1870 1870
 ';
1871
-    }
1872
-
1873
-
1874
-    /**
1875
-     * form_form_field_label_wrap
1876
-     *
1877
-     * @deprecated    as of 4.8.32.rc.000
1878
-     * @access        public
1879
-     * @param        string $label
1880
-     * @return        string
1881
-     */
1882
-    public function form_form_field_label_wrap($label)
1883
-    {
1884
-        EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1885
-            __('This method would have been protected but was used on a filter callback'
1886
-               . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1887
-            '4.8.32.rc.000');
1888
-        return '
1871
+	}
1872
+
1873
+
1874
+	/**
1875
+	 * form_form_field_label_wrap
1876
+	 *
1877
+	 * @deprecated    as of 4.8.32.rc.000
1878
+	 * @access        public
1879
+	 * @param        string $label
1880
+	 * @return        string
1881
+	 */
1882
+	public function form_form_field_label_wrap($label)
1883
+	{
1884
+		EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1885
+			__('This method would have been protected but was used on a filter callback'
1886
+			   . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1887
+			'4.8.32.rc.000');
1888
+		return '
1889 1889
 			<tr>
1890 1890
 				<th>
1891 1891
 					' . $label . '
1892 1892
 				</th>';
1893
-    }
1894
-
1895
-
1896
-    /**
1897
-     * form_form_field_input__wrap
1898
-     *
1899
-     * @deprecated    as of 4.8.32.rc.000
1900
-     * @access        public
1901
-     * @param        string $input
1902
-     * @return        string
1903
-     */
1904
-    public function form_form_field_input__wrap($input)
1905
-    {
1906
-        EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1907
-            __('This method would have been protected but was used on a filter callback'
1908
-               . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1909
-            '4.8.32.rc.000');
1910
-        return '
1893
+	}
1894
+
1895
+
1896
+	/**
1897
+	 * form_form_field_input__wrap
1898
+	 *
1899
+	 * @deprecated    as of 4.8.32.rc.000
1900
+	 * @access        public
1901
+	 * @param        string $input
1902
+	 * @return        string
1903
+	 */
1904
+	public function form_form_field_input__wrap($input)
1905
+	{
1906
+		EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1907
+			__('This method would have been protected but was used on a filter callback'
1908
+			   . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1909
+			'4.8.32.rc.000');
1910
+		return '
1911 1911
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
1912 1912
 					' . $input . '
1913 1913
 				</td>
1914 1914
 			</tr>';
1915
-    }
1916
-
1917
-
1918
-    /**
1919
-     * Updates the registration's custom questions according to the form info, if the form is submitted.
1920
-     * If it's not a post, the "view_registrations" route will be called next on the SAME request
1921
-     * to display the page
1922
-     *
1923
-     * @access protected
1924
-     * @return void
1925
-     */
1926
-    protected function _update_attendee_registration_form()
1927
-    {
1928
-        do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
1929
-        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
1930
-            $REG_ID  = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
1931
-            $success = $this->_save_reg_custom_questions_form($REG_ID);
1932
-            if ($success) {
1933
-                $what  = __('Registration Form', 'event_espresso');
1934
-                $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
1935
-                    : array('action' => 'default');
1936
-                $this->_redirect_after_action($success, $what, __('updated', 'event_espresso'), $route);
1937
-            }
1938
-        }
1939
-    }
1940
-
1941
-
1942
-    /**
1943
-     * Gets the form for saving registrations custom questions (if done
1944
-     * previously retrieves the cached form object, which may have validation errors in it)
1945
-     *
1946
-     * @param int $REG_ID
1947
-     * @return EE_Registration_Custom_Questions_Form
1948
-     */
1949
-    protected function _get_reg_custom_questions_form($REG_ID)
1950
-    {
1951
-        if ( ! $this->_reg_custom_questions_form) {
1952
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
1953
-            $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
1954
-                EEM_Registration::instance()->get_one_by_ID($REG_ID)
1955
-            );
1956
-            $this->_reg_custom_questions_form->_construct_finalize(null, null);
1957
-        }
1958
-        return $this->_reg_custom_questions_form;
1959
-    }
1960
-
1961
-
1962
-    /**
1963
-     * Saves
1964
-     *
1965
-     * @access private
1966
-     * @param bool $REG_ID
1967
-     * @return bool
1968
-     */
1969
-    private function _save_reg_custom_questions_form($REG_ID = false)
1970
-    {
1971
-        if ( ! $REG_ID) {
1972
-            EE_Error::add_error(__('An error occurred. No registration ID was received.', 'event_espresso'), __FILE__,
1973
-                __FUNCTION__, __LINE__);
1974
-        }
1975
-        $form = $this->_get_reg_custom_questions_form($REG_ID);
1976
-        $form->receive_form_submission($this->_req_data);
1977
-        $success = false;
1978
-        if ($form->is_valid()) {
1979
-            foreach ($form->subforms() as $question_group_id => $question_group_form) {
1980
-                foreach ($question_group_form->inputs() as $question_id => $input) {
1981
-                    $where_conditions    = array(
1982
-                        'QST_ID' => $question_id,
1983
-                        'REG_ID' => $REG_ID,
1984
-                    );
1985
-                    $possibly_new_values = array(
1986
-                        'ANS_value' => $input->normalized_value(),
1987
-                    );
1988
-                    $answer              = EEM_Answer::instance()->get_one(array($where_conditions));
1989
-                    if ($answer instanceof EE_Answer) {
1990
-                        $success = $answer->save($possibly_new_values);
1991
-                    } else {
1992
-                        //insert it then
1993
-                        $cols_n_vals = array_merge($where_conditions, $possibly_new_values);
1994
-                        $answer      = EE_Answer::new_instance($cols_n_vals);
1995
-                        $success     = $answer->save();
1996
-                    }
1997
-                }
1998
-            }
1999
-        } else {
2000
-            EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2001
-        }
2002
-        return $success;
2003
-    }
2004
-
2005
-
2006
-    /**
2007
-     *        generates HTML for the Registration main meta box
2008
-     *
2009
-     * @access public
2010
-     * @return void
2011
-     */
2012
-    public function _reg_attendees_meta_box()
2013
-    {
2014
-        $REG = EEM_Registration::instance();
2015
-        //get all other registrations on this transaction, and cache
2016
-        //the attendees for them so we don't have to run another query using force_join
2017
-        $registrations                           = $REG->get_all(array(
2018
-            array(
2019
-                'TXN_ID' => $this->_registration->transaction_ID(),
2020
-                'REG_ID' => array('!=', $this->_registration->ID()),
2021
-            ),
2022
-            'force_join' => array('Attendee'),
2023
-        ));
2024
-        $this->_template_args['attendees']       = array();
2025
-        $this->_template_args['attendee_notice'] = '';
2026
-        if (empty($registrations)
2027
-            || (is_array($registrations)
2028
-                && ! EEH_Array::get_one_item_from_array($registrations))
2029
-        ) {
2030
-            EE_Error::add_error(__('There are no records attached to this registration. Something may have gone wrong with the registration',
2031
-                'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
2032
-            $this->_template_args['attendee_notice'] = EE_Error::get_notices();
2033
-        } else {
2034
-            $att_nmbr = 1;
2035
-            foreach ($registrations as $registration) {
2036
-                /* @var $registration EE_Registration */
2037
-                $attendee                                                    = $registration->attendee()
2038
-                    ? $registration->attendee()
2039
-                    : EEM_Attendee::instance()
2040
-                                  ->create_default_object();
2041
-                $this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2042
-                $this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();//( isset( $registration->ATT_fname ) & ! empty( $registration->ATT_fname ) ) ? $registration->ATT_fname : '';
2043
-                $this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();//( isset( $registration->ATT_lname ) & ! empty( $registration->ATT_lname ) ) ? $registration->ATT_lname : '';
2044
-                $this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();//( isset( $registration->ATT_email ) & ! empty( $registration->ATT_email ) ) ? $registration->ATT_email : '';
2045
-                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();//( isset( $registration->REG_final_price ) & ! empty( $registration->REG_final_price ) ) ? $registration->REG_final_price : '';
2046
-                $this->_template_args['attendees'][$att_nmbr]['address']     = implode(', ',
2047
-                    $attendee->full_address_as_array());
2048
-                $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(array(
2049
-                    'action' => 'edit_attendee',
2050
-                    'post'   => $attendee->ID(),
2051
-                ), REG_ADMIN_URL);
2052
-                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2053
-                $att_nmbr++;
2054
-            }
2055
-            //EEH_Debug_Tools::printr( $attendees, '$attendees  <br /><span style="font-size:10px;font-weight:normal;">( file: '. __FILE__ . ' - line no: ' . __LINE__ . ' )</span>', 'auto' );
2056
-            $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2057
-            //			$this->_template_args['registration_form_url'] = add_query_arg( array( 'action' => 'edit_registration', 'process' => 'attendees'  ), REG_ADMIN_URL );
2058
-        }
2059
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2060
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2061
-    }
2062
-
2063
-
2064
-    /**
2065
-     *        generates HTML for the Edit Registration side meta box
2066
-     *
2067
-     * @access public
2068
-     * @return void
2069
-     */
2070
-    public function _reg_registrant_side_meta_box()
2071
-    {
2072
-        /*@var $attendee EE_Attendee */
2073
-        $att_check = $this->_registration->attendee();
2074
-        $attendee  = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2075
-        //now let's determine if this is not the primary registration.  If it isn't then we set the primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the primary registration object (that way we know if we need to show create button or not)
2076
-        if ( ! $this->_registration->is_primary_registrant()) {
2077
-            $primary_registration = $this->_registration->get_primary_registration();
2078
-            $primary_attendee     = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2079
-                : null;
2080
-            if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2081
-                //in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own custom attendee object so let's not worry about the primary reg.
2082
-                $primary_registration = null;
2083
-            }
2084
-        } else {
2085
-            $primary_registration = null;
2086
-        }
2087
-        $this->_template_args['ATT_ID']            = $attendee->ID();
2088
-        $this->_template_args['fname']             = $attendee->fname();//$this->_registration->ATT_fname;
2089
-        $this->_template_args['lname']             = $attendee->lname();//$this->_registration->ATT_lname;
2090
-        $this->_template_args['email']             = $attendee->email();//$this->_registration->ATT_email;
2091
-        $this->_template_args['phone']             = $attendee->phone();
2092
-        $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2093
-        //edit link
2094
-        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2095
-            'action' => 'edit_attendee',
2096
-            'post'   => $attendee->ID(),
2097
-        ), REG_ADMIN_URL);
2098
-        $this->_template_args['att_edit_label'] = __('View/Edit Contact', 'event_espresso');
2099
-        //create link
2100
-        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2101
-            ? EE_Admin_Page::add_query_args_and_nonce(array(
2102
-                'action'  => 'duplicate_attendee',
2103
-                '_REG_ID' => $this->_registration->ID(),
2104
-            ), REG_ADMIN_URL) : '';
2105
-        $this->_template_args['create_label'] = __('Create Contact', 'event_espresso');
2106
-        $this->_template_args['att_check']    = $att_check;
2107
-        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2108
-        echo EEH_Template::display_template($template_path, $this->_template_args, true);
2109
-    }
2110
-
2111
-
2112
-
2113
-    /**
2114
-     * trash or restore registrations
2115
-     *
2116
-     * @param  boolean $trash whether to archive or restore
2117
-     * @access protected
2118
-     * @return void
2119
-     * @throws \EE_Error
2120
-     */
2121
-    protected function _trash_or_restore_registrations($trash = true)
2122
-    {
2123
-        //if empty _REG_ID then get out because there's nothing to do
2124
-        if (empty($this->_req_data['_REG_ID'])) {
2125
-            EE_Error::add_error(
2126
-                sprintf(
2127
-                    esc_html__(
2128
-                        'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2129
-                        'event_espresso'
2130
-                    ),
2131
-                    $trash ? 'trash' : 'restore'
2132
-                ),
2133
-                __FILE__, __LINE__, __FUNCTION__
2134
-            );
2135
-            $this->_redirect_after_action(false, '', '', array(), true);
2136
-        }
2137
-        $success = 0;
2138
-        $overwrite_msgs = false;
2139
-        //Checkboxes
2140
-        if ( ! is_array($this->_req_data['_REG_ID'])) {
2141
-            $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2142
-        }
2143
-        $reg_count = count($this->_req_data['_REG_ID']);
2144
-        // cycle thru checkboxes
2145
-        foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2146
-            /** @var EE_Registration $REG */
2147
-            $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2148
-            $payments = $REG->registration_payments();
2149
-            if (! empty($payments)) {
2150
-                $name = $REG->attendee() instanceof EE_Attendee
2151
-                    ? $REG->attendee()->full_name()
2152
-                    : __('Unknown Attendee', 'event_espresso');
2153
-                $overwrite_msgs = true;
2154
-                EE_Error::add_error(
2155
-                    sprintf(
2156
-                        __(
2157
-                            'The registration for %s could not be trashed because it has payments attached to the related transaction.  If you wish to trash this registration you must first delete the payments on the related transaction.',
2158
-                            'event_espresso'
2159
-                        ),
2160
-                        $name
2161
-                    ),
2162
-                    __FILE__, __FUNCTION__, __LINE__
2163
-                );
2164
-                //can't trash this registration because it has payments.
2165
-                continue;
2166
-            }
2167
-            $updated = $trash ? $REG->delete() : $REG->restore();
2168
-            if ($updated) {
2169
-                $success++;
2170
-            }
2171
-        }
2172
-        $this->_redirect_after_action(
2173
-            $success === $reg_count, // were ALL registrations affected?
2174
-            $success > 1 ? __('Registrations', 'event_espresso') : __('Registration', 'event_espresso'),
2175
-            $trash ? __('moved to the trash', 'event_espresso') : __('restored', 'event_espresso'),
2176
-            array('action' => 'default'),
2177
-            $overwrite_msgs
2178
-        );
2179
-    }
2180
-
2181
-
2182
-    /**
2183
-     * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2184
-     * registration but also.
2185
-     * 1. Removing relations to EE_Attendee
2186
-     * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2187
-     * ALSO trashed.
2188
-     * 3. Deleting permanently any related Line items but only if the above conditions are met.
2189
-     * 4. Removing relationships between all tickets and the related registrations
2190
-     * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2191
-     * 6. Deleting permanently any related Checkins.
2192
-     *
2193
-     * @return void
2194
-     */
2195
-    protected function _delete_registrations()
2196
-    {
2197
-        $REG_MDL = EEM_Registration::instance();
2198
-        $success = 1;
2199
-        //Checkboxes
2200
-        if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2201
-            // if array has more than one element than success message should be plural
2202
-            $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2203
-            // cycle thru checkboxes
2204
-            while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2205
-                $REG = $REG_MDL->get_one_by_ID($REG_ID);
2206
-                if ( ! $REG instanceof EE_Registration) {
2207
-                    continue;
2208
-                }
2209
-                $deleted = $this->_delete_registration($REG);
2210
-                if ( ! $deleted) {
2211
-                    $success = 0;
2212
-                }
2213
-            }
2214
-        } else {
2215
-            // grab single id and delete
2216
-            $REG_ID  = $this->_req_data['_REG_ID'];
2217
-            $REG     = $REG_MDL->get_one_by_ID($REG_ID);
2218
-            $deleted = $this->_delete_registration($REG);
2219
-            if ( ! $deleted) {
2220
-                $success = 0;
2221
-            }
2222
-        }
2223
-        $what        = $success > 1 ? __('Registrations', 'event_espresso') : __('Registration', 'event_espresso');
2224
-        $action_desc = __('permanently deleted.', 'event_espresso');
2225
-        $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'default'), true);
2226
-    }
2227
-
2228
-
2229
-    /**
2230
-     * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2231
-     * models get affected.
2232
-     *
2233
-     * @param  EE_Registration $REG registration to be deleted permenantly
2234
-     * @return boolean              true = successful deletion, false = fail.
2235
-     */
2236
-    protected function _delete_registration(EE_Registration $REG)
2237
-    {
2238
-        //first we start with the transaction... ultimately, we WILL not delete permanently if there are any related registrations on the transaction that are NOT trashed.
2239
-        $TXN         = $REG->get_first_related('Transaction');
2240
-        $REGS        = $TXN->get_many_related('Registration');
2241
-        $all_trashed = true;
2242
-        foreach ($REGS as $registration) {
2243
-            if ( ! $registration->get('REG_deleted')) {
2244
-                $all_trashed = false;
2245
-            }
2246
-        }
2247
-        if ( ! $all_trashed) {
2248
-            EE_Error::add_error(__('Unable to permanently delete this registration. Before this registration can be permanently deleted, all registrations made in the same transaction must be trashed as well.  These registrations will be permanently deleted in the same action.',
2249
-                'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
2250
-            return false;
2251
-        }
2252
-        //k made it here so that means we can delete all the related transactions and their answers (but let's do them separately from THIS one).
2253
-        foreach ($REGS as $registration) {
2254
-            //delete related answers
2255
-            $registration->delete_related_permanently('Answer');
2256
-            //remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2257
-            $attendee = $registration->get_first_related('Attendee');
2258
-            if ($attendee instanceof EE_Attendee) {
2259
-                $registration->_remove_relation_to($attendee, 'Attendee');
2260
-            }
2261
-            //now remove relationships to tickets on this registration.
2262
-            $registration->_remove_relations('Ticket');
2263
-            //now delete permanently the checkins related to this registration.
2264
-            $registration->delete_related_permanently('Checkin');
2265
-            if ($registration->ID() === $REG->ID()) {
2266
-                continue;
2267
-            } //we don't want to delete permanently the existing registration just yet.
2268
-            //remove relation to transaction for these registrations if NOT the existing registrations
2269
-            $registration->_remove_relations('Transaction');
2270
-            //delete permanently any related messages.
2271
-            $registration->delete_related_permanently('Message');
2272
-            //now delete this registration permanently
2273
-            $registration->delete_permanently();
2274
-        }
2275
-        //now all related registrations on the transaction are handled.  So let's just handle this registration itself (the transaction and line items should be all that's left).
2276
-        //delete the line items related to the transaction for this registration.
2277
-        $TXN->delete_related_permanently('Line_Item');
2278
-        //we need to remove all the relationships on the transaction
2279
-        $TXN->delete_related_permanently('Payment');
2280
-        $TXN->delete_related_permanently('Extra_Meta');
2281
-        $TXN->delete_related_permanently('Message');
2282
-        //now we can delete this REG permanently (and the transaction of course)
2283
-        $REG->delete_related_permanently('Transaction');
2284
-        return $REG->delete_permanently();
2285
-    }
2286
-
2287
-
2288
-    /**
2289
-     *    generates HTML for the Register New Attendee Admin page
2290
-     *
2291
-     * @access private
2292
-     * @throws \EE_Error
2293
-     * @return void
2294
-     */
2295
-    public function new_registration()
2296
-    {
2297
-        if ( ! $this->_set_reg_event()) {
2298
-            throw new EE_Error(__('Unable to continue with registering because there is no Event ID in the request',
2299
-                'event_espresso'));
2300
-        }
2301
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2302
-        // gotta start with a clean slate if we're not coming here via ajax
2303
-        if ( ! defined('DOING_AJAX')
2304
-             && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2305
-        ) {
2306
-            EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2307
-        }
2308
-        $this->_template_args['event_name'] = '';
2309
-        // event name
2310
-        if ($this->_reg_event) {
2311
-            $this->_template_args['event_name'] = $this->_reg_event->name();
2312
-            $edit_event_url                     = self::add_query_args_and_nonce(array(
2313
-                'action' => 'edit',
2314
-                'post'   => $this->_reg_event->ID(),
2315
-            ), EVENTS_ADMIN_URL);
2316
-            $edit_event_lnk                     = '<a href="'
2317
-                                                  . $edit_event_url
2318
-                                                  . '" title="'
2319
-                                                  . esc_attr__('Edit ', 'event_espresso')
2320
-                                                  . $this->_reg_event->name()
2321
-                                                  . '">'
2322
-                                                  . __('Edit Event', 'event_espresso')
2323
-                                                  . '</a>';
2324
-            $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2325
-                                                   . $edit_event_lnk
2326
-                                                   . '</span>';
2327
-        }
2328
-        $this->_template_args['step_content'] = $this->_get_registration_step_content();
2329
-        if (defined('DOING_AJAX')) {
2330
-            $this->_return_json();
2331
-        }
2332
-        // grab header
2333
-        $template_path                              = REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2334
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2335
-            $this->_template_args, true);
2336
-        //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2337
-        // the details template wrapper
2338
-        $this->display_admin_page_with_sidebar();
2339
-    }
2340
-
2341
-
2342
-    /**
2343
-     * This returns the content for a registration step
2344
-     *
2345
-     * @access protected
2346
-     * @return string html
2347
-     */
2348
-    protected function _get_registration_step_content()
2349
-    {
2350
-        if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2351
-            $warning_msg = sprintf(__('%2$sWARNING!!!%3$s%1$sPlease do not use the back button to return to this page for the purpose of adding another registration.%1$sThis can result in lost and/or corrupted data.%1$sIf you wish to add another registration, then please click the%1$s%7$s"Add Another New Registration to Event"%8$s button%1$son the Transaction details page, after you are redirected.%1$s%1$s%4$s redirecting in %5$s seconds %6$s',
2352
-                'event_espresso'), '<br />', '<h3 class="important-notice">', '</h3>', '<div class="float-right">',
2353
-                '<span id="redirect_timer" class="important-notice">30</span>', '</div>', '<b>', '</b>');
2354
-            return '
1915
+	}
1916
+
1917
+
1918
+	/**
1919
+	 * Updates the registration's custom questions according to the form info, if the form is submitted.
1920
+	 * If it's not a post, the "view_registrations" route will be called next on the SAME request
1921
+	 * to display the page
1922
+	 *
1923
+	 * @access protected
1924
+	 * @return void
1925
+	 */
1926
+	protected function _update_attendee_registration_form()
1927
+	{
1928
+		do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this);
1929
+		if ($_SERVER['REQUEST_METHOD'] == 'POST') {
1930
+			$REG_ID  = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false;
1931
+			$success = $this->_save_reg_custom_questions_form($REG_ID);
1932
+			if ($success) {
1933
+				$what  = __('Registration Form', 'event_espresso');
1934
+				$route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID)
1935
+					: array('action' => 'default');
1936
+				$this->_redirect_after_action($success, $what, __('updated', 'event_espresso'), $route);
1937
+			}
1938
+		}
1939
+	}
1940
+
1941
+
1942
+	/**
1943
+	 * Gets the form for saving registrations custom questions (if done
1944
+	 * previously retrieves the cached form object, which may have validation errors in it)
1945
+	 *
1946
+	 * @param int $REG_ID
1947
+	 * @return EE_Registration_Custom_Questions_Form
1948
+	 */
1949
+	protected function _get_reg_custom_questions_form($REG_ID)
1950
+	{
1951
+		if ( ! $this->_reg_custom_questions_form) {
1952
+			require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
1953
+			$this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
1954
+				EEM_Registration::instance()->get_one_by_ID($REG_ID)
1955
+			);
1956
+			$this->_reg_custom_questions_form->_construct_finalize(null, null);
1957
+		}
1958
+		return $this->_reg_custom_questions_form;
1959
+	}
1960
+
1961
+
1962
+	/**
1963
+	 * Saves
1964
+	 *
1965
+	 * @access private
1966
+	 * @param bool $REG_ID
1967
+	 * @return bool
1968
+	 */
1969
+	private function _save_reg_custom_questions_form($REG_ID = false)
1970
+	{
1971
+		if ( ! $REG_ID) {
1972
+			EE_Error::add_error(__('An error occurred. No registration ID was received.', 'event_espresso'), __FILE__,
1973
+				__FUNCTION__, __LINE__);
1974
+		}
1975
+		$form = $this->_get_reg_custom_questions_form($REG_ID);
1976
+		$form->receive_form_submission($this->_req_data);
1977
+		$success = false;
1978
+		if ($form->is_valid()) {
1979
+			foreach ($form->subforms() as $question_group_id => $question_group_form) {
1980
+				foreach ($question_group_form->inputs() as $question_id => $input) {
1981
+					$where_conditions    = array(
1982
+						'QST_ID' => $question_id,
1983
+						'REG_ID' => $REG_ID,
1984
+					);
1985
+					$possibly_new_values = array(
1986
+						'ANS_value' => $input->normalized_value(),
1987
+					);
1988
+					$answer              = EEM_Answer::instance()->get_one(array($where_conditions));
1989
+					if ($answer instanceof EE_Answer) {
1990
+						$success = $answer->save($possibly_new_values);
1991
+					} else {
1992
+						//insert it then
1993
+						$cols_n_vals = array_merge($where_conditions, $possibly_new_values);
1994
+						$answer      = EE_Answer::new_instance($cols_n_vals);
1995
+						$success     = $answer->save();
1996
+					}
1997
+				}
1998
+			}
1999
+		} else {
2000
+			EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__);
2001
+		}
2002
+		return $success;
2003
+	}
2004
+
2005
+
2006
+	/**
2007
+	 *        generates HTML for the Registration main meta box
2008
+	 *
2009
+	 * @access public
2010
+	 * @return void
2011
+	 */
2012
+	public function _reg_attendees_meta_box()
2013
+	{
2014
+		$REG = EEM_Registration::instance();
2015
+		//get all other registrations on this transaction, and cache
2016
+		//the attendees for them so we don't have to run another query using force_join
2017
+		$registrations                           = $REG->get_all(array(
2018
+			array(
2019
+				'TXN_ID' => $this->_registration->transaction_ID(),
2020
+				'REG_ID' => array('!=', $this->_registration->ID()),
2021
+			),
2022
+			'force_join' => array('Attendee'),
2023
+		));
2024
+		$this->_template_args['attendees']       = array();
2025
+		$this->_template_args['attendee_notice'] = '';
2026
+		if (empty($registrations)
2027
+			|| (is_array($registrations)
2028
+				&& ! EEH_Array::get_one_item_from_array($registrations))
2029
+		) {
2030
+			EE_Error::add_error(__('There are no records attached to this registration. Something may have gone wrong with the registration',
2031
+				'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
2032
+			$this->_template_args['attendee_notice'] = EE_Error::get_notices();
2033
+		} else {
2034
+			$att_nmbr = 1;
2035
+			foreach ($registrations as $registration) {
2036
+				/* @var $registration EE_Registration */
2037
+				$attendee                                                    = $registration->attendee()
2038
+					? $registration->attendee()
2039
+					: EEM_Attendee::instance()
2040
+								  ->create_default_object();
2041
+				$this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2042
+				$this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();//( isset( $registration->ATT_fname ) & ! empty( $registration->ATT_fname ) ) ? $registration->ATT_fname : '';
2043
+				$this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();//( isset( $registration->ATT_lname ) & ! empty( $registration->ATT_lname ) ) ? $registration->ATT_lname : '';
2044
+				$this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();//( isset( $registration->ATT_email ) & ! empty( $registration->ATT_email ) ) ? $registration->ATT_email : '';
2045
+				$this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();//( isset( $registration->REG_final_price ) & ! empty( $registration->REG_final_price ) ) ? $registration->REG_final_price : '';
2046
+				$this->_template_args['attendees'][$att_nmbr]['address']     = implode(', ',
2047
+					$attendee->full_address_as_array());
2048
+				$this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(array(
2049
+					'action' => 'edit_attendee',
2050
+					'post'   => $attendee->ID(),
2051
+				), REG_ADMIN_URL);
2052
+				$this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2053
+				$att_nmbr++;
2054
+			}
2055
+			//EEH_Debug_Tools::printr( $attendees, '$attendees  <br /><span style="font-size:10px;font-weight:normal;">( file: '. __FILE__ . ' - line no: ' . __LINE__ . ' )</span>', 'auto' );
2056
+			$this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2057
+			//			$this->_template_args['registration_form_url'] = add_query_arg( array( 'action' => 'edit_registration', 'process' => 'attendees'  ), REG_ADMIN_URL );
2058
+		}
2059
+		$template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2060
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2061
+	}
2062
+
2063
+
2064
+	/**
2065
+	 *        generates HTML for the Edit Registration side meta box
2066
+	 *
2067
+	 * @access public
2068
+	 * @return void
2069
+	 */
2070
+	public function _reg_registrant_side_meta_box()
2071
+	{
2072
+		/*@var $attendee EE_Attendee */
2073
+		$att_check = $this->_registration->attendee();
2074
+		$attendee  = $att_check instanceof EE_Attendee ? $att_check : EEM_Attendee::instance()->create_default_object();
2075
+		//now let's determine if this is not the primary registration.  If it isn't then we set the primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the primary registration object (that way we know if we need to show create button or not)
2076
+		if ( ! $this->_registration->is_primary_registrant()) {
2077
+			$primary_registration = $this->_registration->get_primary_registration();
2078
+			$primary_attendee     = $primary_registration instanceof EE_Registration ? $primary_registration->attendee()
2079
+				: null;
2080
+			if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) {
2081
+				//in here?  This means the displayed registration is not the primary registrant but ALREADY HAS its own custom attendee object so let's not worry about the primary reg.
2082
+				$primary_registration = null;
2083
+			}
2084
+		} else {
2085
+			$primary_registration = null;
2086
+		}
2087
+		$this->_template_args['ATT_ID']            = $attendee->ID();
2088
+		$this->_template_args['fname']             = $attendee->fname();//$this->_registration->ATT_fname;
2089
+		$this->_template_args['lname']             = $attendee->lname();//$this->_registration->ATT_lname;
2090
+		$this->_template_args['email']             = $attendee->email();//$this->_registration->ATT_email;
2091
+		$this->_template_args['phone']             = $attendee->phone();
2092
+		$this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2093
+		//edit link
2094
+		$this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2095
+			'action' => 'edit_attendee',
2096
+			'post'   => $attendee->ID(),
2097
+		), REG_ADMIN_URL);
2098
+		$this->_template_args['att_edit_label'] = __('View/Edit Contact', 'event_espresso');
2099
+		//create link
2100
+		$this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2101
+			? EE_Admin_Page::add_query_args_and_nonce(array(
2102
+				'action'  => 'duplicate_attendee',
2103
+				'_REG_ID' => $this->_registration->ID(),
2104
+			), REG_ADMIN_URL) : '';
2105
+		$this->_template_args['create_label'] = __('Create Contact', 'event_espresso');
2106
+		$this->_template_args['att_check']    = $att_check;
2107
+		$template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2108
+		echo EEH_Template::display_template($template_path, $this->_template_args, true);
2109
+	}
2110
+
2111
+
2112
+
2113
+	/**
2114
+	 * trash or restore registrations
2115
+	 *
2116
+	 * @param  boolean $trash whether to archive or restore
2117
+	 * @access protected
2118
+	 * @return void
2119
+	 * @throws \EE_Error
2120
+	 */
2121
+	protected function _trash_or_restore_registrations($trash = true)
2122
+	{
2123
+		//if empty _REG_ID then get out because there's nothing to do
2124
+		if (empty($this->_req_data['_REG_ID'])) {
2125
+			EE_Error::add_error(
2126
+				sprintf(
2127
+					esc_html__(
2128
+						'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.',
2129
+						'event_espresso'
2130
+					),
2131
+					$trash ? 'trash' : 'restore'
2132
+				),
2133
+				__FILE__, __LINE__, __FUNCTION__
2134
+			);
2135
+			$this->_redirect_after_action(false, '', '', array(), true);
2136
+		}
2137
+		$success = 0;
2138
+		$overwrite_msgs = false;
2139
+		//Checkboxes
2140
+		if ( ! is_array($this->_req_data['_REG_ID'])) {
2141
+			$this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']);
2142
+		}
2143
+		$reg_count = count($this->_req_data['_REG_ID']);
2144
+		// cycle thru checkboxes
2145
+		foreach ($this->_req_data['_REG_ID'] as $REG_ID) {
2146
+			/** @var EE_Registration $REG */
2147
+			$REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2148
+			$payments = $REG->registration_payments();
2149
+			if (! empty($payments)) {
2150
+				$name = $REG->attendee() instanceof EE_Attendee
2151
+					? $REG->attendee()->full_name()
2152
+					: __('Unknown Attendee', 'event_espresso');
2153
+				$overwrite_msgs = true;
2154
+				EE_Error::add_error(
2155
+					sprintf(
2156
+						__(
2157
+							'The registration for %s could not be trashed because it has payments attached to the related transaction.  If you wish to trash this registration you must first delete the payments on the related transaction.',
2158
+							'event_espresso'
2159
+						),
2160
+						$name
2161
+					),
2162
+					__FILE__, __FUNCTION__, __LINE__
2163
+				);
2164
+				//can't trash this registration because it has payments.
2165
+				continue;
2166
+			}
2167
+			$updated = $trash ? $REG->delete() : $REG->restore();
2168
+			if ($updated) {
2169
+				$success++;
2170
+			}
2171
+		}
2172
+		$this->_redirect_after_action(
2173
+			$success === $reg_count, // were ALL registrations affected?
2174
+			$success > 1 ? __('Registrations', 'event_espresso') : __('Registration', 'event_espresso'),
2175
+			$trash ? __('moved to the trash', 'event_espresso') : __('restored', 'event_espresso'),
2176
+			array('action' => 'default'),
2177
+			$overwrite_msgs
2178
+		);
2179
+	}
2180
+
2181
+
2182
+	/**
2183
+	 * This is used to permanently delete registrations.  Note, this will handle not only deleting permanently the
2184
+	 * registration but also.
2185
+	 * 1. Removing relations to EE_Attendee
2186
+	 * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are
2187
+	 * ALSO trashed.
2188
+	 * 3. Deleting permanently any related Line items but only if the above conditions are met.
2189
+	 * 4. Removing relationships between all tickets and the related registrations
2190
+	 * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.)
2191
+	 * 6. Deleting permanently any related Checkins.
2192
+	 *
2193
+	 * @return void
2194
+	 */
2195
+	protected function _delete_registrations()
2196
+	{
2197
+		$REG_MDL = EEM_Registration::instance();
2198
+		$success = 1;
2199
+		//Checkboxes
2200
+		if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) {
2201
+			// if array has more than one element than success message should be plural
2202
+			$success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1;
2203
+			// cycle thru checkboxes
2204
+			while (list($ind, $REG_ID) = each($this->_req_data['_REG_ID'])) {
2205
+				$REG = $REG_MDL->get_one_by_ID($REG_ID);
2206
+				if ( ! $REG instanceof EE_Registration) {
2207
+					continue;
2208
+				}
2209
+				$deleted = $this->_delete_registration($REG);
2210
+				if ( ! $deleted) {
2211
+					$success = 0;
2212
+				}
2213
+			}
2214
+		} else {
2215
+			// grab single id and delete
2216
+			$REG_ID  = $this->_req_data['_REG_ID'];
2217
+			$REG     = $REG_MDL->get_one_by_ID($REG_ID);
2218
+			$deleted = $this->_delete_registration($REG);
2219
+			if ( ! $deleted) {
2220
+				$success = 0;
2221
+			}
2222
+		}
2223
+		$what        = $success > 1 ? __('Registrations', 'event_espresso') : __('Registration', 'event_espresso');
2224
+		$action_desc = __('permanently deleted.', 'event_espresso');
2225
+		$this->_redirect_after_action($success, $what, $action_desc, array('action' => 'default'), true);
2226
+	}
2227
+
2228
+
2229
+	/**
2230
+	 * handles the permanent deletion of a registration.  See comments with _delete_registrations() for details on what
2231
+	 * models get affected.
2232
+	 *
2233
+	 * @param  EE_Registration $REG registration to be deleted permenantly
2234
+	 * @return boolean              true = successful deletion, false = fail.
2235
+	 */
2236
+	protected function _delete_registration(EE_Registration $REG)
2237
+	{
2238
+		//first we start with the transaction... ultimately, we WILL not delete permanently if there are any related registrations on the transaction that are NOT trashed.
2239
+		$TXN         = $REG->get_first_related('Transaction');
2240
+		$REGS        = $TXN->get_many_related('Registration');
2241
+		$all_trashed = true;
2242
+		foreach ($REGS as $registration) {
2243
+			if ( ! $registration->get('REG_deleted')) {
2244
+				$all_trashed = false;
2245
+			}
2246
+		}
2247
+		if ( ! $all_trashed) {
2248
+			EE_Error::add_error(__('Unable to permanently delete this registration. Before this registration can be permanently deleted, all registrations made in the same transaction must be trashed as well.  These registrations will be permanently deleted in the same action.',
2249
+				'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
2250
+			return false;
2251
+		}
2252
+		//k made it here so that means we can delete all the related transactions and their answers (but let's do them separately from THIS one).
2253
+		foreach ($REGS as $registration) {
2254
+			//delete related answers
2255
+			$registration->delete_related_permanently('Answer');
2256
+			//remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact)
2257
+			$attendee = $registration->get_first_related('Attendee');
2258
+			if ($attendee instanceof EE_Attendee) {
2259
+				$registration->_remove_relation_to($attendee, 'Attendee');
2260
+			}
2261
+			//now remove relationships to tickets on this registration.
2262
+			$registration->_remove_relations('Ticket');
2263
+			//now delete permanently the checkins related to this registration.
2264
+			$registration->delete_related_permanently('Checkin');
2265
+			if ($registration->ID() === $REG->ID()) {
2266
+				continue;
2267
+			} //we don't want to delete permanently the existing registration just yet.
2268
+			//remove relation to transaction for these registrations if NOT the existing registrations
2269
+			$registration->_remove_relations('Transaction');
2270
+			//delete permanently any related messages.
2271
+			$registration->delete_related_permanently('Message');
2272
+			//now delete this registration permanently
2273
+			$registration->delete_permanently();
2274
+		}
2275
+		//now all related registrations on the transaction are handled.  So let's just handle this registration itself (the transaction and line items should be all that's left).
2276
+		//delete the line items related to the transaction for this registration.
2277
+		$TXN->delete_related_permanently('Line_Item');
2278
+		//we need to remove all the relationships on the transaction
2279
+		$TXN->delete_related_permanently('Payment');
2280
+		$TXN->delete_related_permanently('Extra_Meta');
2281
+		$TXN->delete_related_permanently('Message');
2282
+		//now we can delete this REG permanently (and the transaction of course)
2283
+		$REG->delete_related_permanently('Transaction');
2284
+		return $REG->delete_permanently();
2285
+	}
2286
+
2287
+
2288
+	/**
2289
+	 *    generates HTML for the Register New Attendee Admin page
2290
+	 *
2291
+	 * @access private
2292
+	 * @throws \EE_Error
2293
+	 * @return void
2294
+	 */
2295
+	public function new_registration()
2296
+	{
2297
+		if ( ! $this->_set_reg_event()) {
2298
+			throw new EE_Error(__('Unable to continue with registering because there is no Event ID in the request',
2299
+				'event_espresso'));
2300
+		}
2301
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2302
+		// gotta start with a clean slate if we're not coming here via ajax
2303
+		if ( ! defined('DOING_AJAX')
2304
+			 && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error']))
2305
+		) {
2306
+			EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2307
+		}
2308
+		$this->_template_args['event_name'] = '';
2309
+		// event name
2310
+		if ($this->_reg_event) {
2311
+			$this->_template_args['event_name'] = $this->_reg_event->name();
2312
+			$edit_event_url                     = self::add_query_args_and_nonce(array(
2313
+				'action' => 'edit',
2314
+				'post'   => $this->_reg_event->ID(),
2315
+			), EVENTS_ADMIN_URL);
2316
+			$edit_event_lnk                     = '<a href="'
2317
+												  . $edit_event_url
2318
+												  . '" title="'
2319
+												  . esc_attr__('Edit ', 'event_espresso')
2320
+												  . $this->_reg_event->name()
2321
+												  . '">'
2322
+												  . __('Edit Event', 'event_espresso')
2323
+												  . '</a>';
2324
+			$this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">'
2325
+												   . $edit_event_lnk
2326
+												   . '</span>';
2327
+		}
2328
+		$this->_template_args['step_content'] = $this->_get_registration_step_content();
2329
+		if (defined('DOING_AJAX')) {
2330
+			$this->_return_json();
2331
+		}
2332
+		// grab header
2333
+		$template_path                              = REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2334
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2335
+			$this->_template_args, true);
2336
+		//$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
2337
+		// the details template wrapper
2338
+		$this->display_admin_page_with_sidebar();
2339
+	}
2340
+
2341
+
2342
+	/**
2343
+	 * This returns the content for a registration step
2344
+	 *
2345
+	 * @access protected
2346
+	 * @return string html
2347
+	 */
2348
+	protected function _get_registration_step_content()
2349
+	{
2350
+		if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) {
2351
+			$warning_msg = sprintf(__('%2$sWARNING!!!%3$s%1$sPlease do not use the back button to return to this page for the purpose of adding another registration.%1$sThis can result in lost and/or corrupted data.%1$sIf you wish to add another registration, then please click the%1$s%7$s"Add Another New Registration to Event"%8$s button%1$son the Transaction details page, after you are redirected.%1$s%1$s%4$s redirecting in %5$s seconds %6$s',
2352
+				'event_espresso'), '<br />', '<h3 class="important-notice">', '</h3>', '<div class="float-right">',
2353
+				'<span id="redirect_timer" class="important-notice">30</span>', '</div>', '<b>', '</b>');
2354
+			return '
2355 2355
 	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2356 2356
 	<script >
2357 2357
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
@@ -2364,658 +2364,658 @@  discard block
 block discarded – undo
2364 2364
 	        }
2365 2365
 	    }, 800 );
2366 2366
 	</script >';
2367
-        }
2368
-        $template_args = array(
2369
-            'title'                    => '',
2370
-            'content'                  => '',
2371
-            'step_button_text'         => '',
2372
-            'show_notification_toggle' => false,
2373
-        );
2374
-        //to indicate we're processing a new registration
2375
-        $hidden_fields = array(
2376
-            'processing_registration' => array(
2377
-                'type'  => 'hidden',
2378
-                'value' => 0,
2379
-            ),
2380
-            'event_id'                => array(
2381
-                'type'  => 'hidden',
2382
-                'value' => $this->_reg_event->ID(),
2383
-            ),
2384
-        );
2385
-        //if the cart is empty then we know we're at step one so we'll display ticket selector
2386
-        $cart = EE_Registry::instance()->SSN->cart();
2387
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2388
-        switch ($step) {
2389
-            case 'ticket' :
2390
-                $hidden_fields['processing_registration']['value'] = 1;
2391
-                $template_args['title']                            = __('Step One: Select the Ticket for this registration',
2392
-                    'event_espresso');
2393
-                $template_args['content']                          = EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2394
-                $template_args['step_button_text']                 = __('Add Tickets and Continue to Registrant Details',
2395
-                    'event_espresso');
2396
-                $template_args['show_notification_toggle']         = false;
2397
-                break;
2398
-            case 'questions' :
2399
-                $hidden_fields['processing_registration']['value'] = 2;
2400
-                $template_args['title']                            = __('Step Two: Add Registrant Details for this Registration',
2401
-                    'event_espresso');
2402
-                //in theory we should be able to run EED_SPCO at this point because the cart should have been setup properly by the first process_reg_step run.
2403
-                $template_args['content']                  = EED_Single_Page_Checkout::registration_checkout_for_admin();
2404
-                $template_args['step_button_text']         = __('Save Registration and Continue to Details',
2405
-                    'event_espresso');
2406
-                $template_args['show_notification_toggle'] = true;
2407
-                break;
2408
-        }
2409
-        $this->_set_add_edit_form_tags('process_reg_step',
2410
-            $hidden_fields); //we come back to the process_registration_step route.
2411
-        return EEH_Template::display_template(REG_TEMPLATE_PATH
2412
-                                              . 'reg_admin_register_new_attendee_step_content.template.php',
2413
-            $template_args, true);
2414
-    }
2415
-
2416
-
2417
-    /**
2418
-     *        set_reg_event
2419
-     *
2420
-     * @access private
2421
-     * @return boolean
2422
-     */
2423
-    private function _set_reg_event()
2424
-    {
2425
-        if (is_object($this->_reg_event)) {
2426
-            return true;
2427
-        }
2428
-        $EVT_ID = ( ! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2429
-        if ( ! $EVT_ID) {
2430
-            return false;
2431
-        }
2432
-        $this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2433
-        return true;
2434
-    }
2435
-
2436
-
2437
-    /**
2438
-     * process_reg_step
2439
-     *
2440
-     * @access        public
2441
-     * @return        string
2442
-     * @throws \RuntimeException
2443
-     * @throws \EE_Error
2444
-     */
2445
-    public function process_reg_step()
2446
-    {
2447
-        EE_System::do_not_cache();
2448
-        $this->_set_reg_event();
2449
-        EE_Registry::instance()->REQ->set_espresso_page(true);
2450
-        EE_Registry::instance()->REQ->set('uts', time());
2451
-        //what step are we on?
2452
-        $cart = EE_Registry::instance()->SSN->cart();
2453
-        $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2454
-        //if doing ajax then we need to verify the nonce
2455
-        if (defined('DOING_AJAX')) {
2456
-            $nonce = isset($this->_req_data[$this->_req_nonce])
2457
-                ? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
2458
-            $this->_verify_nonce($nonce, $this->_req_nonce);
2459
-        }
2460
-        switch ($step) {
2461
-            case 'ticket' :
2462
-                //process ticket selection
2463
-                $success = EED_Ticket_Selector::instance()->process_ticket_selections();
2464
-                if ($success) {
2465
-                    EE_Error::add_success(esc_html__('Tickets Selected. Now complete the registration.',
2466
-                        'event_espresso'));
2467
-                } else {
2468
-                    $query_args['step_error'] = $this->_req_data['step_error'] = true;
2469
-                }
2470
-                if (defined('DOING_AJAX')) {
2471
-                    $this->new_registration(); //display next step
2472
-                } else {
2473
-                    $query_args = array(
2474
-                        'action'                  => 'new_registration',
2475
-                        'processing_registration' => 1,
2476
-                        'event_id'                => $this->_reg_event->ID(),
2477
-                        'uts'                     => time(),
2478
-                    );
2479
-                    $this->_redirect_after_action(false, '', '', $query_args, true);
2480
-                }
2481
-                break;
2482
-            case 'questions' :
2483
-                if ( ! isset($this->_req_data['txn_reg_status_change'], $this->_req_data['txn_reg_status_change']['send_notifications'])) {
2484
-                    add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
2485
-                }
2486
-                //process registration
2487
-                $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
2488
-                if ($cart instanceof EE_Cart) {
2489
-                    $grand_total = $cart->get_cart_grand_total();
2490
-                    if ($grand_total instanceof EE_Line_Item) {
2491
-                        $grand_total->save_this_and_descendants_to_txn();
2492
-                    }
2493
-                }
2494
-                if ( ! $transaction instanceof EE_Transaction) {
2495
-                    $query_args = array(
2496
-                        'action'                  => 'new_registration',
2497
-                        'processing_registration' => 2,
2498
-                        'event_id'                => $this->_reg_event->ID(),
2499
-                        'uts'                     => time(),
2500
-                    );
2501
-                    if (defined('DOING_AJAX')) {
2502
-                        //display registration form again because there are errors (maybe validation?)
2503
-                        $this->new_registration();
2504
-                        return;
2505
-                    } else {
2506
-                        $this->_redirect_after_action(false, '', '', $query_args, true);
2507
-                        return;
2508
-                    }
2509
-                }
2510
-                // maybe update status, and make sure to save transaction if not done already
2511
-                if ( ! $transaction->update_status_based_on_total_paid()) {
2512
-                    $transaction->save();
2513
-                }
2514
-                EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2515
-                $this->_req_data = array();
2516
-                $query_args      = array(
2517
-                    'action'        => 'redirect_to_txn',
2518
-                    'TXN_ID'        => $transaction->ID(),
2519
-                    'EVT_ID'        => $this->_reg_event->ID(),
2520
-                    'event_name'    => urlencode($this->_reg_event->name()),
2521
-                    'redirect_from' => 'new_registration',
2522
-                );
2523
-                $this->_redirect_after_action(false, '', '', $query_args, true);
2524
-                break;
2525
-        }
2526
-        //what are you looking here for?  Should be nothing to do at this point.
2527
-    }
2528
-
2529
-
2530
-    /**
2531
-     * redirect_to_txn
2532
-     *
2533
-     * @access public
2534
-     * @return void
2535
-     */
2536
-    public function redirect_to_txn()
2537
-    {
2538
-        EE_System::do_not_cache();
2539
-        EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2540
-        $query_args = array(
2541
-            'action' => 'view_transaction',
2542
-            'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
2543
-            'page'   => 'espresso_transactions',
2544
-        );
2545
-        if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
2546
-            $query_args['EVT_ID']        = $this->_req_data['EVT_ID'];
2547
-            $query_args['event_name']    = urlencode($this->_req_data['event_name']);
2548
-            $query_args['redirect_from'] = $this->_req_data['redirect_from'];
2549
-        }
2550
-        EE_Error::add_success(__('Registration Created.  Please review the transaction and add any payments as necessary',
2551
-            'event_espresso'));
2552
-        $this->_redirect_after_action(false, '', '', $query_args, true);
2553
-    }
2554
-
2555
-
2556
-    /**
2557
-     *        generates HTML for the Attendee Contact List
2558
-     *
2559
-     * @access protected
2560
-     * @return void
2561
-     */
2562
-    protected function _attendee_contact_list_table()
2563
-    {
2564
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2565
-        $this->_search_btn_label = __('Contacts', 'event_espresso');
2566
-        $this->display_admin_list_table_page_with_no_sidebar();
2567
-    }
2568
-
2569
-
2570
-    /**
2571
-     *        get_attendees
2572
-     *
2573
-     * @param bool $count whether to return count or data.
2574
-     * @access public
2575
-     * @return array
2576
-     */
2577
-    public function get_attendees($per_page, $count = false, $trash = false)
2578
-    {
2579
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2580
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
2581
-        $ATT_MDL                    = EEM_Attendee::instance();
2582
-        $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
2583
-        switch ($this->_req_data['orderby']) {
2584
-            case 'ATT_ID':
2585
-                $orderby = 'ATT_ID';
2586
-                break;
2587
-            case 'ATT_fname':
2588
-                $orderby = 'ATT_fname';
2589
-                break;
2590
-            case 'ATT_email':
2591
-                $orderby = 'ATT_email';
2592
-                break;
2593
-            case 'ATT_city':
2594
-                $orderby = 'ATT_city';
2595
-                break;
2596
-            case 'STA_ID':
2597
-                $orderby = 'STA_ID';
2598
-                break;
2599
-            case 'CNT_ID':
2600
-                $orderby = 'CNT_ID';
2601
-                break;
2602
-            default:
2603
-                $orderby = 'ATT_lname';
2604
-        }
2605
-        $sort         = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order']
2606
-            : 'ASC';
2607
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
2608
-            ? $this->_req_data['paged'] : 1;
2609
-        $per_page     = isset($per_page) && ! empty($per_page) ? $per_page : 10;
2610
-        $per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
2611
-            ? $this->_req_data['perpage'] : $per_page;
2612
-        $_where       = array();
2613
-        if ( ! empty($this->_req_data['s'])) {
2614
-            $sstr         = '%' . $this->_req_data['s'] . '%';
2615
-            $_where['OR'] = array(
2616
-                'Registration.Event.EVT_name'       => array('LIKE', $sstr),
2617
-                'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
2618
-                'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
2619
-                'ATT_fname'                         => array('LIKE', $sstr),
2620
-                'ATT_lname'                         => array('LIKE', $sstr),
2621
-                'ATT_short_bio'                     => array('LIKE', $sstr),
2622
-                'ATT_email'                         => array('LIKE', $sstr),
2623
-                'ATT_address'                       => array('LIKE', $sstr),
2624
-                'ATT_address2'                      => array('LIKE', $sstr),
2625
-                'ATT_city'                          => array('LIKE', $sstr),
2626
-                'Country.CNT_name'                  => array('LIKE', $sstr),
2627
-                'State.STA_name'                    => array('LIKE', $sstr),
2628
-                'ATT_phone'                         => array('LIKE', $sstr),
2629
-                'Registration.REG_final_price'      => array('LIKE', $sstr),
2630
-                'Registration.REG_code'             => array('LIKE', $sstr),
2631
-                'Registration.REG_count'            => array('LIKE', $sstr),
2632
-                'Registration.REG_group_size'       => array('LIKE', $sstr),
2633
-            );
2634
-        }
2635
-        $offset = ($current_page - 1) * $per_page;
2636
-        $limit  = $count ? null : array($offset, $per_page);
2637
-        if ($trash) {
2638
-            $_where['status'] = array('!=', 'publish');
2639
-            $all_attendees    = $count
2640
-                ? $ATT_MDL->count(array(
2641
-                    $_where,
2642
-                    'order_by' => array($orderby => $sort),
2643
-                    'limit'    => $limit,
2644
-                ), 'ATT_ID', true)
2645
-                : $ATT_MDL->get_all(array(
2646
-                    $_where,
2647
-                    'order_by' => array($orderby => $sort),
2648
-                    'limit'    => $limit,
2649
-                ));
2650
-        } else {
2651
-            $_where['status'] = array('IN', array('publish'));
2652
-            $all_attendees    = $count
2653
-                ? $ATT_MDL->count(array(
2654
-                    $_where,
2655
-                    'order_by' => array($orderby => $sort),
2656
-                    'limit'    => $limit,
2657
-                ), 'ATT_ID', true)
2658
-                : $ATT_MDL->get_all(array(
2659
-                    $_where,
2660
-                    'order_by' => array($orderby => $sort),
2661
-                    'limit'    => $limit,
2662
-                ));
2663
-        }
2664
-        return $all_attendees;
2665
-    }
2666
-
2667
-
2668
-    /**
2669
-     * This is just taking care of resending the registration confirmation
2670
-     *
2671
-     * @access protected
2672
-     * @return void
2673
-     */
2674
-    protected function _resend_registration()
2675
-    {
2676
-        $this->_process_resend_registration();
2677
-        $query_args = isset($this->_req_data['redirect_to'])
2678
-            ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
2679
-            : array(
2680
-                'action' => 'default',
2681
-            );
2682
-        $this->_redirect_after_action(false, '', '', $query_args, true);
2683
-    }
2684
-
2685
-    /**
2686
-     * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
2687
-     * to use when selecting registrations
2688
-     * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
2689
-     *                                                     the query parameters from the request
2690
-     * @return void ends the request with a redirect or download
2691
-     */
2692
-    public function _registrations_report_base( $method_name_for_getting_query_params )
2693
-    {
2694
-        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
2695
-            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
2696
-                'page'        => 'espresso_batch',
2697
-                'batch'       => 'file',
2698
-                'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
2699
-                'filters'     => urlencode(
2700
-                    serialize(
2701
-                        call_user_func(
2702
-                            array( $this, $method_name_for_getting_query_params ),
2703
-                            EEH_Array::is_set(
2704
-                                $this->_req_data,
2705
-                                'filters',
2706
-                                array()
2707
-                            )
2708
-                        )
2709
-                    )
2710
-                ),
2711
-                'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
2712
-                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
2713
-                'return_url'  => urlencode($this->_req_data['return_url']),
2714
-            )));
2715
-        } else {
2716
-            $new_request_args = array(
2717
-                'export' => 'report',
2718
-                'action' => 'registrations_report_for_event',
2719
-                'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
2720
-            );
2721
-            $this->_req_data = array_merge($this->_req_data, $new_request_args);
2722
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
2723
-                require_once(EE_CLASSES . 'EE_Export.class.php');
2724
-                $EE_Export = EE_Export::instance($this->_req_data);
2725
-                $EE_Export->export();
2726
-            }
2727
-        }
2728
-    }
2729
-
2730
-
2731
-
2732
-    /**
2733
-     * Creates a registration report using only query parameters in the request
2734
-     * @return void
2735
-     */
2736
-    public function _registrations_report()
2737
-    {
2738
-        $this->_registrations_report_base( '_get_registration_query_parameters' );
2739
-    }
2740
-
2741
-
2742
-    public function _contact_list_export()
2743
-    {
2744
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
2745
-            require_once(EE_CLASSES . 'EE_Export.class.php');
2746
-            $EE_Export = EE_Export::instance($this->_req_data);
2747
-            $EE_Export->export_attendees();
2748
-        }
2749
-    }
2750
-
2751
-
2752
-    public function _contact_list_report()
2753
-    {
2754
-        if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
2755
-            wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
2756
-                'page'        => 'espresso_batch',
2757
-                'batch'       => 'file',
2758
-                'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
2759
-                'return_url'  => urlencode($this->_req_data['return_url']),
2760
-            )));
2761
-        } else {
2762
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
2763
-                require_once(EE_CLASSES . 'EE_Export.class.php');
2764
-                $EE_Export = EE_Export::instance($this->_req_data);
2765
-                $EE_Export->report_attendees();
2766
-            }
2767
-        }
2768
-    }
2769
-
2770
-
2771
-
2772
-
2773
-
2774
-    /***************************************        ATTENDEE DETAILS        ***************************************/
2775
-    /**
2776
-     * This duplicates the attendee object for the given incoming registration id and attendee_id.
2777
-     *
2778
-     * @return void
2779
-     */
2780
-    protected function _duplicate_attendee()
2781
-    {
2782
-        $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
2783
-        //verify we have necessary info
2784
-        if (empty($this->_req_data['_REG_ID'])) {
2785
-            EE_Error::add_error(__('Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
2786
-                'event_espresso'), __FILE__, __LINE__, __FUNCTION__);
2787
-            $query_args = array('action' => $action);
2788
-            $this->_redirect_after_action('', '', '', $query_args, true);
2789
-        }
2790
-        //okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
2791
-        $registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
2792
-        $attendee     = $registration->attendee();
2793
-        //remove relation of existing attendee on registration
2794
-        $registration->_remove_relation_to($attendee, 'Attendee');
2795
-        //new attendee
2796
-        $new_attendee = clone $attendee;
2797
-        $new_attendee->set('ATT_ID', 0);
2798
-        $new_attendee->save();
2799
-        //add new attendee to reg
2800
-        $registration->_add_relation_to($new_attendee, 'Attendee');
2801
-        EE_Error::add_success(__('New Contact record created.  Now make any edits you wish to make for this contact.',
2802
-            'event_espresso'));
2803
-        //redirect to edit page for attendee
2804
-        $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
2805
-        $this->_redirect_after_action('', '', '', $query_args, true);
2806
-    }
2807
-
2808
-
2809
-    //related to cpt routes
2810
-    protected function _insert_update_cpt_item($post_id, $post)
2811
-    {
2812
-        $success  = true;
2813
-        $attendee = EEM_Attendee::instance()->get_one_by_ID($post_id);
2814
-        //for attendee updates
2815
-        if ($post->post_type = 'espresso_attendees' && ! empty($attendee)) {
2816
-            //note we should only be UPDATING attendees at this point.
2817
-            $updated_fields = array(
2818
-                'ATT_fname'     => $this->_req_data['ATT_fname'],
2819
-                'ATT_lname'     => $this->_req_data['ATT_lname'],
2820
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
2821
-                'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
2822
-                'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
2823
-                'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
2824
-                'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
2825
-                'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
2826
-                'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
2827
-                'ATT_email'     => isset($this->_req_data['ATT_email']) ? $this->_req_data['ATT_email'] : '',
2828
-                'ATT_phone'     => isset($this->_req_data['ATT_phone']) ? $this->_req_data['ATT_phone'] : '',
2829
-            );
2830
-            foreach ($updated_fields as $field => $value) {
2831
-                $attendee->set($field, $value);
2832
-            }
2833
-            $success                   = $attendee->save();
2834
-            $attendee_update_callbacks = apply_filters('FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
2835
-                array());
2836
-            foreach ($attendee_update_callbacks as $a_callback) {
2837
-                if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
2838
-                    throw new EE_Error(sprintf(__('The %s callback given for the "FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update" filter is not a valid callback.  Please check the spelling.',
2839
-                        'event_espresso'), $a_callback));
2840
-                }
2841
-            }
2842
-        }
2843
-        if ($success === false) {
2844
-            EE_Error::add_error(__('Something went wrong with updating the meta table data for the registration.',
2845
-                'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
2846
-        }
2847
-    }
2848
-
2849
-
2850
-    public function trash_cpt_item($post_id)
2851
-    {
2852
-    }
2853
-
2854
-
2855
-    public function delete_cpt_item($post_id)
2856
-    {
2857
-    }
2858
-
2859
-
2860
-    public function restore_cpt_item($post_id)
2861
-    {
2862
-    }
2863
-
2864
-
2865
-    protected function _restore_cpt_item($post_id, $revision_id)
2866
-    {
2867
-    }
2868
-
2869
-
2870
-    public function attendee_editor_metaboxes()
2871
-    {
2872
-        $this->verify_cpt_object();
2873
-        remove_meta_box('postexcerpt', __('Excerpt'), 'post_excerpt_meta_box', $this->_cpt_routes[$this->_req_action],
2874
-            'normal', 'core');
2875
-        remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
2876
-        if (post_type_supports('espresso_attendees', 'excerpt')) {
2877
-            add_meta_box('postexcerpt', __('Short Biography', 'event_espresso'), 'post_excerpt_meta_box',
2878
-                $this->_cpt_routes[$this->_req_action], 'normal');
2879
-        }
2880
-        if (post_type_supports('espresso_attendees', 'comments')) {
2881
-            add_meta_box('commentsdiv', __('Notes on the Contact', 'event_espresso'), 'post_comment_meta_box',
2882
-                $this->_cpt_routes[$this->_req_action], 'normal', 'core');
2883
-        }
2884
-        add_meta_box('attendee_contact_info', __('Contact Info', 'event_espresso'),
2885
-            array($this, 'attendee_contact_info'), $this->_cpt_routes[$this->_req_action], 'side', 'core');
2886
-        add_meta_box('attendee_details_address', __('Address Details', 'event_espresso'),
2887
-            array($this, 'attendee_address_details'), $this->_cpt_routes[$this->_req_action], 'normal', 'core');
2888
-        add_meta_box('attendee_registrations', __('Registrations for this Contact', 'event_espresso'),
2889
-            array($this, 'attendee_registrations_meta_box'), $this->_cpt_routes[$this->_req_action], 'normal', 'high');
2890
-    }
2891
-
2892
-
2893
-    /**
2894
-     * Metabox for attendee contact info
2895
-     *
2896
-     * @param  WP_Post $post wp post object
2897
-     * @return string        attendee contact info ( and form )
2898
-     */
2899
-    public function attendee_contact_info($post)
2900
-    {
2901
-        //get attendee object ( should already have it )
2902
-        $this->_template_args['attendee'] = $this->_cpt_model_obj;
2903
-        $template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
2904
-        EEH_Template::display_template($template, $this->_template_args);
2905
-    }
2906
-
2907
-
2908
-    /**
2909
-     * Metabox for attendee details
2910
-     *
2911
-     * @param  WP_Post $post wp post object
2912
-     * @return string        attendee address details (and form)
2913
-     */
2914
-    public function attendee_address_details($post)
2915
-    {
2916
-        //get attendee object (should already have it)
2917
-        $this->_template_args['attendee']     = $this->_cpt_model_obj;
2918
-        $this->_template_args['state_html']   = EEH_Form_Fields::generate_form_input(new EE_Question_Form_Input(EE_Question::new_instance(array(
2919
-            'QST_ID'           => 0,
2920
-            'QST_display_text' => __('State/Province', 'event_espresso'),
2921
-            'QST_system'       => 'admin-state',
2922
-        )), EE_Answer::new_instance(array(
2923
-            'ANS_ID'    => 0,
2924
-            'ANS_value' => $this->_cpt_model_obj->state_ID(),
2925
-        )), array(
2926
-            'input_id'       => 'STA_ID',
2927
-            'input_name'     => 'STA_ID',
2928
-            'input_prefix'   => '',
2929
-            'append_qstn_id' => false,
2930
-        )));
2931
-        $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(new EE_Question_Form_Input(EE_Question::new_instance(array(
2932
-            'QST_ID'           => 0,
2933
-            'QST_display_text' => __('Country', 'event_espresso'),
2934
-            'QST_system'       => 'admin-country',
2935
-        )), EE_Answer::new_instance(array(
2936
-            'ANS_ID'    => 0,
2937
-            'ANS_value' => $this->_cpt_model_obj->country_ID(),
2938
-        )), array(
2939
-            'input_id'       => 'CNT_ISO',
2940
-            'input_name'     => 'CNT_ISO',
2941
-            'input_prefix'   => '',
2942
-            'append_qstn_id' => false,
2943
-        )));
2944
-        $template                             = REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
2945
-        EEH_Template::display_template($template, $this->_template_args);
2946
-    }
2947
-
2948
-
2949
-    /**
2950
-     *        _attendee_details
2951
-     *
2952
-     * @access protected
2953
-     * @return void
2954
-     */
2955
-    public function attendee_registrations_meta_box($post)
2956
-    {
2957
-        $this->_template_args['attendee']      = $this->_cpt_model_obj;
2958
-        $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
2959
-        $template                              = REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
2960
-        EEH_Template::display_template($template, $this->_template_args);
2961
-    }
2962
-
2963
-
2964
-    /**
2965
-     * add in the form fields for the attendee edit
2966
-     *
2967
-     * @param  WP_Post $post wp post object
2968
-     * @return string        html for new form.
2969
-     */
2970
-    public function after_title_form_fields($post)
2971
-    {
2972
-        if ($post->post_type == 'espresso_attendees') {
2973
-            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
2974
-            $template_args['attendee'] = $this->_cpt_model_obj;
2975
-            EEH_Template::display_template($template, $template_args);
2976
-        }
2977
-    }
2978
-
2979
-
2980
-    /**
2981
-     *        _trash_or_restore_attendee
2982
-     *
2983
-     * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
2984
-     * @access protected
2985
-     * @return void
2986
-     */
2987
-    protected function _trash_or_restore_attendees($trash = true)
2988
-    {
2989
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2990
-        $ATT_MDL = EEM_Attendee::instance();
2991
-        $success = 1;
2992
-        //Checkboxes
2993
-        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
2994
-            // if array has more than one element than success message should be plural
2995
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
2996
-            // cycle thru checkboxes
2997
-            while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
2998
-                $updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
2999
-                    : $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3000
-                if ( ! $updated) {
3001
-                    $success = 0;
3002
-                }
3003
-            }
3004
-        } else {
3005
-            // grab single id and delete
3006
-            $ATT_ID = absint($this->_req_data['ATT_ID']);
3007
-            //get attendee
3008
-            $att     = $ATT_MDL->get_one_by_ID($ATT_ID);
3009
-            $updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3010
-            $updated = $att->save();
3011
-            if ( ! $updated) {
3012
-                $success = 0;
3013
-            }
3014
-        }
3015
-        $what        = $success > 1 ? __('Contacts', 'event_espresso') : __('Contact', 'event_espresso');
3016
-        $action_desc = $trash ? __('moved to the trash', 'event_espresso') : __('restored', 'event_espresso');
3017
-        $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3018
-    }
2367
+		}
2368
+		$template_args = array(
2369
+			'title'                    => '',
2370
+			'content'                  => '',
2371
+			'step_button_text'         => '',
2372
+			'show_notification_toggle' => false,
2373
+		);
2374
+		//to indicate we're processing a new registration
2375
+		$hidden_fields = array(
2376
+			'processing_registration' => array(
2377
+				'type'  => 'hidden',
2378
+				'value' => 0,
2379
+			),
2380
+			'event_id'                => array(
2381
+				'type'  => 'hidden',
2382
+				'value' => $this->_reg_event->ID(),
2383
+			),
2384
+		);
2385
+		//if the cart is empty then we know we're at step one so we'll display ticket selector
2386
+		$cart = EE_Registry::instance()->SSN->cart();
2387
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2388
+		switch ($step) {
2389
+			case 'ticket' :
2390
+				$hidden_fields['processing_registration']['value'] = 1;
2391
+				$template_args['title']                            = __('Step One: Select the Ticket for this registration',
2392
+					'event_espresso');
2393
+				$template_args['content']                          = EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event);
2394
+				$template_args['step_button_text']                 = __('Add Tickets and Continue to Registrant Details',
2395
+					'event_espresso');
2396
+				$template_args['show_notification_toggle']         = false;
2397
+				break;
2398
+			case 'questions' :
2399
+				$hidden_fields['processing_registration']['value'] = 2;
2400
+				$template_args['title']                            = __('Step Two: Add Registrant Details for this Registration',
2401
+					'event_espresso');
2402
+				//in theory we should be able to run EED_SPCO at this point because the cart should have been setup properly by the first process_reg_step run.
2403
+				$template_args['content']                  = EED_Single_Page_Checkout::registration_checkout_for_admin();
2404
+				$template_args['step_button_text']         = __('Save Registration and Continue to Details',
2405
+					'event_espresso');
2406
+				$template_args['show_notification_toggle'] = true;
2407
+				break;
2408
+		}
2409
+		$this->_set_add_edit_form_tags('process_reg_step',
2410
+			$hidden_fields); //we come back to the process_registration_step route.
2411
+		return EEH_Template::display_template(REG_TEMPLATE_PATH
2412
+											  . 'reg_admin_register_new_attendee_step_content.template.php',
2413
+			$template_args, true);
2414
+	}
2415
+
2416
+
2417
+	/**
2418
+	 *        set_reg_event
2419
+	 *
2420
+	 * @access private
2421
+	 * @return boolean
2422
+	 */
2423
+	private function _set_reg_event()
2424
+	{
2425
+		if (is_object($this->_reg_event)) {
2426
+			return true;
2427
+		}
2428
+		$EVT_ID = ( ! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false;
2429
+		if ( ! $EVT_ID) {
2430
+			return false;
2431
+		}
2432
+		$this->_reg_event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
2433
+		return true;
2434
+	}
2435
+
2436
+
2437
+	/**
2438
+	 * process_reg_step
2439
+	 *
2440
+	 * @access        public
2441
+	 * @return        string
2442
+	 * @throws \RuntimeException
2443
+	 * @throws \EE_Error
2444
+	 */
2445
+	public function process_reg_step()
2446
+	{
2447
+		EE_System::do_not_cache();
2448
+		$this->_set_reg_event();
2449
+		EE_Registry::instance()->REQ->set_espresso_page(true);
2450
+		EE_Registry::instance()->REQ->set('uts', time());
2451
+		//what step are we on?
2452
+		$cart = EE_Registry::instance()->SSN->cart();
2453
+		$step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions';
2454
+		//if doing ajax then we need to verify the nonce
2455
+		if (defined('DOING_AJAX')) {
2456
+			$nonce = isset($this->_req_data[$this->_req_nonce])
2457
+				? sanitize_text_field($this->_req_data[$this->_req_nonce]) : '';
2458
+			$this->_verify_nonce($nonce, $this->_req_nonce);
2459
+		}
2460
+		switch ($step) {
2461
+			case 'ticket' :
2462
+				//process ticket selection
2463
+				$success = EED_Ticket_Selector::instance()->process_ticket_selections();
2464
+				if ($success) {
2465
+					EE_Error::add_success(esc_html__('Tickets Selected. Now complete the registration.',
2466
+						'event_espresso'));
2467
+				} else {
2468
+					$query_args['step_error'] = $this->_req_data['step_error'] = true;
2469
+				}
2470
+				if (defined('DOING_AJAX')) {
2471
+					$this->new_registration(); //display next step
2472
+				} else {
2473
+					$query_args = array(
2474
+						'action'                  => 'new_registration',
2475
+						'processing_registration' => 1,
2476
+						'event_id'                => $this->_reg_event->ID(),
2477
+						'uts'                     => time(),
2478
+					);
2479
+					$this->_redirect_after_action(false, '', '', $query_args, true);
2480
+				}
2481
+				break;
2482
+			case 'questions' :
2483
+				if ( ! isset($this->_req_data['txn_reg_status_change'], $this->_req_data['txn_reg_status_change']['send_notifications'])) {
2484
+					add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15);
2485
+				}
2486
+				//process registration
2487
+				$transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin();
2488
+				if ($cart instanceof EE_Cart) {
2489
+					$grand_total = $cart->get_cart_grand_total();
2490
+					if ($grand_total instanceof EE_Line_Item) {
2491
+						$grand_total->save_this_and_descendants_to_txn();
2492
+					}
2493
+				}
2494
+				if ( ! $transaction instanceof EE_Transaction) {
2495
+					$query_args = array(
2496
+						'action'                  => 'new_registration',
2497
+						'processing_registration' => 2,
2498
+						'event_id'                => $this->_reg_event->ID(),
2499
+						'uts'                     => time(),
2500
+					);
2501
+					if (defined('DOING_AJAX')) {
2502
+						//display registration form again because there are errors (maybe validation?)
2503
+						$this->new_registration();
2504
+						return;
2505
+					} else {
2506
+						$this->_redirect_after_action(false, '', '', $query_args, true);
2507
+						return;
2508
+					}
2509
+				}
2510
+				// maybe update status, and make sure to save transaction if not done already
2511
+				if ( ! $transaction->update_status_based_on_total_paid()) {
2512
+					$transaction->save();
2513
+				}
2514
+				EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2515
+				$this->_req_data = array();
2516
+				$query_args      = array(
2517
+					'action'        => 'redirect_to_txn',
2518
+					'TXN_ID'        => $transaction->ID(),
2519
+					'EVT_ID'        => $this->_reg_event->ID(),
2520
+					'event_name'    => urlencode($this->_reg_event->name()),
2521
+					'redirect_from' => 'new_registration',
2522
+				);
2523
+				$this->_redirect_after_action(false, '', '', $query_args, true);
2524
+				break;
2525
+		}
2526
+		//what are you looking here for?  Should be nothing to do at this point.
2527
+	}
2528
+
2529
+
2530
+	/**
2531
+	 * redirect_to_txn
2532
+	 *
2533
+	 * @access public
2534
+	 * @return void
2535
+	 */
2536
+	public function redirect_to_txn()
2537
+	{
2538
+		EE_System::do_not_cache();
2539
+		EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__);
2540
+		$query_args = array(
2541
+			'action' => 'view_transaction',
2542
+			'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0,
2543
+			'page'   => 'espresso_transactions',
2544
+		);
2545
+		if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) {
2546
+			$query_args['EVT_ID']        = $this->_req_data['EVT_ID'];
2547
+			$query_args['event_name']    = urlencode($this->_req_data['event_name']);
2548
+			$query_args['redirect_from'] = $this->_req_data['redirect_from'];
2549
+		}
2550
+		EE_Error::add_success(__('Registration Created.  Please review the transaction and add any payments as necessary',
2551
+			'event_espresso'));
2552
+		$this->_redirect_after_action(false, '', '', $query_args, true);
2553
+	}
2554
+
2555
+
2556
+	/**
2557
+	 *        generates HTML for the Attendee Contact List
2558
+	 *
2559
+	 * @access protected
2560
+	 * @return void
2561
+	 */
2562
+	protected function _attendee_contact_list_table()
2563
+	{
2564
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2565
+		$this->_search_btn_label = __('Contacts', 'event_espresso');
2566
+		$this->display_admin_list_table_page_with_no_sidebar();
2567
+	}
2568
+
2569
+
2570
+	/**
2571
+	 *        get_attendees
2572
+	 *
2573
+	 * @param bool $count whether to return count or data.
2574
+	 * @access public
2575
+	 * @return array
2576
+	 */
2577
+	public function get_attendees($per_page, $count = false, $trash = false)
2578
+	{
2579
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2580
+		require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
2581
+		$ATT_MDL                    = EEM_Attendee::instance();
2582
+		$this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
2583
+		switch ($this->_req_data['orderby']) {
2584
+			case 'ATT_ID':
2585
+				$orderby = 'ATT_ID';
2586
+				break;
2587
+			case 'ATT_fname':
2588
+				$orderby = 'ATT_fname';
2589
+				break;
2590
+			case 'ATT_email':
2591
+				$orderby = 'ATT_email';
2592
+				break;
2593
+			case 'ATT_city':
2594
+				$orderby = 'ATT_city';
2595
+				break;
2596
+			case 'STA_ID':
2597
+				$orderby = 'STA_ID';
2598
+				break;
2599
+			case 'CNT_ID':
2600
+				$orderby = 'CNT_ID';
2601
+				break;
2602
+			default:
2603
+				$orderby = 'ATT_lname';
2604
+		}
2605
+		$sort         = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order']
2606
+			: 'ASC';
2607
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
2608
+			? $this->_req_data['paged'] : 1;
2609
+		$per_page     = isset($per_page) && ! empty($per_page) ? $per_page : 10;
2610
+		$per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
2611
+			? $this->_req_data['perpage'] : $per_page;
2612
+		$_where       = array();
2613
+		if ( ! empty($this->_req_data['s'])) {
2614
+			$sstr         = '%' . $this->_req_data['s'] . '%';
2615
+			$_where['OR'] = array(
2616
+				'Registration.Event.EVT_name'       => array('LIKE', $sstr),
2617
+				'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
2618
+				'Registration.Event.EVT_short_desc' => array('LIKE', $sstr),
2619
+				'ATT_fname'                         => array('LIKE', $sstr),
2620
+				'ATT_lname'                         => array('LIKE', $sstr),
2621
+				'ATT_short_bio'                     => array('LIKE', $sstr),
2622
+				'ATT_email'                         => array('LIKE', $sstr),
2623
+				'ATT_address'                       => array('LIKE', $sstr),
2624
+				'ATT_address2'                      => array('LIKE', $sstr),
2625
+				'ATT_city'                          => array('LIKE', $sstr),
2626
+				'Country.CNT_name'                  => array('LIKE', $sstr),
2627
+				'State.STA_name'                    => array('LIKE', $sstr),
2628
+				'ATT_phone'                         => array('LIKE', $sstr),
2629
+				'Registration.REG_final_price'      => array('LIKE', $sstr),
2630
+				'Registration.REG_code'             => array('LIKE', $sstr),
2631
+				'Registration.REG_count'            => array('LIKE', $sstr),
2632
+				'Registration.REG_group_size'       => array('LIKE', $sstr),
2633
+			);
2634
+		}
2635
+		$offset = ($current_page - 1) * $per_page;
2636
+		$limit  = $count ? null : array($offset, $per_page);
2637
+		if ($trash) {
2638
+			$_where['status'] = array('!=', 'publish');
2639
+			$all_attendees    = $count
2640
+				? $ATT_MDL->count(array(
2641
+					$_where,
2642
+					'order_by' => array($orderby => $sort),
2643
+					'limit'    => $limit,
2644
+				), 'ATT_ID', true)
2645
+				: $ATT_MDL->get_all(array(
2646
+					$_where,
2647
+					'order_by' => array($orderby => $sort),
2648
+					'limit'    => $limit,
2649
+				));
2650
+		} else {
2651
+			$_where['status'] = array('IN', array('publish'));
2652
+			$all_attendees    = $count
2653
+				? $ATT_MDL->count(array(
2654
+					$_where,
2655
+					'order_by' => array($orderby => $sort),
2656
+					'limit'    => $limit,
2657
+				), 'ATT_ID', true)
2658
+				: $ATT_MDL->get_all(array(
2659
+					$_where,
2660
+					'order_by' => array($orderby => $sort),
2661
+					'limit'    => $limit,
2662
+				));
2663
+		}
2664
+		return $all_attendees;
2665
+	}
2666
+
2667
+
2668
+	/**
2669
+	 * This is just taking care of resending the registration confirmation
2670
+	 *
2671
+	 * @access protected
2672
+	 * @return void
2673
+	 */
2674
+	protected function _resend_registration()
2675
+	{
2676
+		$this->_process_resend_registration();
2677
+		$query_args = isset($this->_req_data['redirect_to'])
2678
+			? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID'])
2679
+			: array(
2680
+				'action' => 'default',
2681
+			);
2682
+		$this->_redirect_after_action(false, '', '', $query_args, true);
2683
+	}
2684
+
2685
+	/**
2686
+	 * Creates a registration report, but accepts the name of a method to use for preparing the query parameters
2687
+	 * to use when selecting registrations
2688
+	 * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing
2689
+	 *                                                     the query parameters from the request
2690
+	 * @return void ends the request with a redirect or download
2691
+	 */
2692
+	public function _registrations_report_base( $method_name_for_getting_query_params )
2693
+	{
2694
+		if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
2695
+			wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
2696
+				'page'        => 'espresso_batch',
2697
+				'batch'       => 'file',
2698
+				'EVT_ID'      => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
2699
+				'filters'     => urlencode(
2700
+					serialize(
2701
+						call_user_func(
2702
+							array( $this, $method_name_for_getting_query_params ),
2703
+							EEH_Array::is_set(
2704
+								$this->_req_data,
2705
+								'filters',
2706
+								array()
2707
+							)
2708
+						)
2709
+					)
2710
+				),
2711
+				'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false),
2712
+				'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'),
2713
+				'return_url'  => urlencode($this->_req_data['return_url']),
2714
+			)));
2715
+		} else {
2716
+			$new_request_args = array(
2717
+				'export' => 'report',
2718
+				'action' => 'registrations_report_for_event',
2719
+				'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
2720
+			);
2721
+			$this->_req_data = array_merge($this->_req_data, $new_request_args);
2722
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
2723
+				require_once(EE_CLASSES . 'EE_Export.class.php');
2724
+				$EE_Export = EE_Export::instance($this->_req_data);
2725
+				$EE_Export->export();
2726
+			}
2727
+		}
2728
+	}
2729
+
2730
+
2731
+
2732
+	/**
2733
+	 * Creates a registration report using only query parameters in the request
2734
+	 * @return void
2735
+	 */
2736
+	public function _registrations_report()
2737
+	{
2738
+		$this->_registrations_report_base( '_get_registration_query_parameters' );
2739
+	}
2740
+
2741
+
2742
+	public function _contact_list_export()
2743
+	{
2744
+		if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
2745
+			require_once(EE_CLASSES . 'EE_Export.class.php');
2746
+			$EE_Export = EE_Export::instance($this->_req_data);
2747
+			$EE_Export->export_attendees();
2748
+		}
2749
+	}
2750
+
2751
+
2752
+	public function _contact_list_report()
2753
+	{
2754
+		if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
2755
+			wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
2756
+				'page'        => 'espresso_batch',
2757
+				'batch'       => 'file',
2758
+				'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'),
2759
+				'return_url'  => urlencode($this->_req_data['return_url']),
2760
+			)));
2761
+		} else {
2762
+			if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
2763
+				require_once(EE_CLASSES . 'EE_Export.class.php');
2764
+				$EE_Export = EE_Export::instance($this->_req_data);
2765
+				$EE_Export->report_attendees();
2766
+			}
2767
+		}
2768
+	}
2769
+
2770
+
2771
+
2772
+
2773
+
2774
+	/***************************************        ATTENDEE DETAILS        ***************************************/
2775
+	/**
2776
+	 * This duplicates the attendee object for the given incoming registration id and attendee_id.
2777
+	 *
2778
+	 * @return void
2779
+	 */
2780
+	protected function _duplicate_attendee()
2781
+	{
2782
+		$action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default';
2783
+		//verify we have necessary info
2784
+		if (empty($this->_req_data['_REG_ID'])) {
2785
+			EE_Error::add_error(__('Unable to create the contact for the registration because the required parameters are not present (_REG_ID )',
2786
+				'event_espresso'), __FILE__, __LINE__, __FUNCTION__);
2787
+			$query_args = array('action' => $action);
2788
+			$this->_redirect_after_action('', '', '', $query_args, true);
2789
+		}
2790
+		//okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration.
2791
+		$registration = EEM_Registration::instance()->get_one_by_ID($this->_req_data['_REG_ID']);
2792
+		$attendee     = $registration->attendee();
2793
+		//remove relation of existing attendee on registration
2794
+		$registration->_remove_relation_to($attendee, 'Attendee');
2795
+		//new attendee
2796
+		$new_attendee = clone $attendee;
2797
+		$new_attendee->set('ATT_ID', 0);
2798
+		$new_attendee->save();
2799
+		//add new attendee to reg
2800
+		$registration->_add_relation_to($new_attendee, 'Attendee');
2801
+		EE_Error::add_success(__('New Contact record created.  Now make any edits you wish to make for this contact.',
2802
+			'event_espresso'));
2803
+		//redirect to edit page for attendee
2804
+		$query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee');
2805
+		$this->_redirect_after_action('', '', '', $query_args, true);
2806
+	}
2807
+
2808
+
2809
+	//related to cpt routes
2810
+	protected function _insert_update_cpt_item($post_id, $post)
2811
+	{
2812
+		$success  = true;
2813
+		$attendee = EEM_Attendee::instance()->get_one_by_ID($post_id);
2814
+		//for attendee updates
2815
+		if ($post->post_type = 'espresso_attendees' && ! empty($attendee)) {
2816
+			//note we should only be UPDATING attendees at this point.
2817
+			$updated_fields = array(
2818
+				'ATT_fname'     => $this->_req_data['ATT_fname'],
2819
+				'ATT_lname'     => $this->_req_data['ATT_lname'],
2820
+				'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
2821
+				'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
2822
+				'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
2823
+				'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
2824
+				'STA_ID'        => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '',
2825
+				'CNT_ISO'       => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '',
2826
+				'ATT_zip'       => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '',
2827
+				'ATT_email'     => isset($this->_req_data['ATT_email']) ? $this->_req_data['ATT_email'] : '',
2828
+				'ATT_phone'     => isset($this->_req_data['ATT_phone']) ? $this->_req_data['ATT_phone'] : '',
2829
+			);
2830
+			foreach ($updated_fields as $field => $value) {
2831
+				$attendee->set($field, $value);
2832
+			}
2833
+			$success                   = $attendee->save();
2834
+			$attendee_update_callbacks = apply_filters('FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update',
2835
+				array());
2836
+			foreach ($attendee_update_callbacks as $a_callback) {
2837
+				if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) {
2838
+					throw new EE_Error(sprintf(__('The %s callback given for the "FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update" filter is not a valid callback.  Please check the spelling.',
2839
+						'event_espresso'), $a_callback));
2840
+				}
2841
+			}
2842
+		}
2843
+		if ($success === false) {
2844
+			EE_Error::add_error(__('Something went wrong with updating the meta table data for the registration.',
2845
+				'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
2846
+		}
2847
+	}
2848
+
2849
+
2850
+	public function trash_cpt_item($post_id)
2851
+	{
2852
+	}
2853
+
2854
+
2855
+	public function delete_cpt_item($post_id)
2856
+	{
2857
+	}
2858
+
2859
+
2860
+	public function restore_cpt_item($post_id)
2861
+	{
2862
+	}
2863
+
2864
+
2865
+	protected function _restore_cpt_item($post_id, $revision_id)
2866
+	{
2867
+	}
2868
+
2869
+
2870
+	public function attendee_editor_metaboxes()
2871
+	{
2872
+		$this->verify_cpt_object();
2873
+		remove_meta_box('postexcerpt', __('Excerpt'), 'post_excerpt_meta_box', $this->_cpt_routes[$this->_req_action],
2874
+			'normal', 'core');
2875
+		remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core');
2876
+		if (post_type_supports('espresso_attendees', 'excerpt')) {
2877
+			add_meta_box('postexcerpt', __('Short Biography', 'event_espresso'), 'post_excerpt_meta_box',
2878
+				$this->_cpt_routes[$this->_req_action], 'normal');
2879
+		}
2880
+		if (post_type_supports('espresso_attendees', 'comments')) {
2881
+			add_meta_box('commentsdiv', __('Notes on the Contact', 'event_espresso'), 'post_comment_meta_box',
2882
+				$this->_cpt_routes[$this->_req_action], 'normal', 'core');
2883
+		}
2884
+		add_meta_box('attendee_contact_info', __('Contact Info', 'event_espresso'),
2885
+			array($this, 'attendee_contact_info'), $this->_cpt_routes[$this->_req_action], 'side', 'core');
2886
+		add_meta_box('attendee_details_address', __('Address Details', 'event_espresso'),
2887
+			array($this, 'attendee_address_details'), $this->_cpt_routes[$this->_req_action], 'normal', 'core');
2888
+		add_meta_box('attendee_registrations', __('Registrations for this Contact', 'event_espresso'),
2889
+			array($this, 'attendee_registrations_meta_box'), $this->_cpt_routes[$this->_req_action], 'normal', 'high');
2890
+	}
2891
+
2892
+
2893
+	/**
2894
+	 * Metabox for attendee contact info
2895
+	 *
2896
+	 * @param  WP_Post $post wp post object
2897
+	 * @return string        attendee contact info ( and form )
2898
+	 */
2899
+	public function attendee_contact_info($post)
2900
+	{
2901
+		//get attendee object ( should already have it )
2902
+		$this->_template_args['attendee'] = $this->_cpt_model_obj;
2903
+		$template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
2904
+		EEH_Template::display_template($template, $this->_template_args);
2905
+	}
2906
+
2907
+
2908
+	/**
2909
+	 * Metabox for attendee details
2910
+	 *
2911
+	 * @param  WP_Post $post wp post object
2912
+	 * @return string        attendee address details (and form)
2913
+	 */
2914
+	public function attendee_address_details($post)
2915
+	{
2916
+		//get attendee object (should already have it)
2917
+		$this->_template_args['attendee']     = $this->_cpt_model_obj;
2918
+		$this->_template_args['state_html']   = EEH_Form_Fields::generate_form_input(new EE_Question_Form_Input(EE_Question::new_instance(array(
2919
+			'QST_ID'           => 0,
2920
+			'QST_display_text' => __('State/Province', 'event_espresso'),
2921
+			'QST_system'       => 'admin-state',
2922
+		)), EE_Answer::new_instance(array(
2923
+			'ANS_ID'    => 0,
2924
+			'ANS_value' => $this->_cpt_model_obj->state_ID(),
2925
+		)), array(
2926
+			'input_id'       => 'STA_ID',
2927
+			'input_name'     => 'STA_ID',
2928
+			'input_prefix'   => '',
2929
+			'append_qstn_id' => false,
2930
+		)));
2931
+		$this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input(new EE_Question_Form_Input(EE_Question::new_instance(array(
2932
+			'QST_ID'           => 0,
2933
+			'QST_display_text' => __('Country', 'event_espresso'),
2934
+			'QST_system'       => 'admin-country',
2935
+		)), EE_Answer::new_instance(array(
2936
+			'ANS_ID'    => 0,
2937
+			'ANS_value' => $this->_cpt_model_obj->country_ID(),
2938
+		)), array(
2939
+			'input_id'       => 'CNT_ISO',
2940
+			'input_name'     => 'CNT_ISO',
2941
+			'input_prefix'   => '',
2942
+			'append_qstn_id' => false,
2943
+		)));
2944
+		$template                             = REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
2945
+		EEH_Template::display_template($template, $this->_template_args);
2946
+	}
2947
+
2948
+
2949
+	/**
2950
+	 *        _attendee_details
2951
+	 *
2952
+	 * @access protected
2953
+	 * @return void
2954
+	 */
2955
+	public function attendee_registrations_meta_box($post)
2956
+	{
2957
+		$this->_template_args['attendee']      = $this->_cpt_model_obj;
2958
+		$this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
2959
+		$template                              = REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
2960
+		EEH_Template::display_template($template, $this->_template_args);
2961
+	}
2962
+
2963
+
2964
+	/**
2965
+	 * add in the form fields for the attendee edit
2966
+	 *
2967
+	 * @param  WP_Post $post wp post object
2968
+	 * @return string        html for new form.
2969
+	 */
2970
+	public function after_title_form_fields($post)
2971
+	{
2972
+		if ($post->post_type == 'espresso_attendees') {
2973
+			$template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
2974
+			$template_args['attendee'] = $this->_cpt_model_obj;
2975
+			EEH_Template::display_template($template, $template_args);
2976
+		}
2977
+	}
2978
+
2979
+
2980
+	/**
2981
+	 *        _trash_or_restore_attendee
2982
+	 *
2983
+	 * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE)
2984
+	 * @access protected
2985
+	 * @return void
2986
+	 */
2987
+	protected function _trash_or_restore_attendees($trash = true)
2988
+	{
2989
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2990
+		$ATT_MDL = EEM_Attendee::instance();
2991
+		$success = 1;
2992
+		//Checkboxes
2993
+		if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
2994
+			// if array has more than one element than success message should be plural
2995
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
2996
+			// cycle thru checkboxes
2997
+			while (list($ATT_ID, $value) = each($this->_req_data['checkbox'])) {
2998
+				$updated = $trash ? $ATT_MDL->update_by_ID(array('status' => 'trash'), $ATT_ID)
2999
+					: $ATT_MDL->update_by_ID(array('status' => 'publish'), $ATT_ID);
3000
+				if ( ! $updated) {
3001
+					$success = 0;
3002
+				}
3003
+			}
3004
+		} else {
3005
+			// grab single id and delete
3006
+			$ATT_ID = absint($this->_req_data['ATT_ID']);
3007
+			//get attendee
3008
+			$att     = $ATT_MDL->get_one_by_ID($ATT_ID);
3009
+			$updated = $trash ? $att->set_status('trash') : $att->set_status('publish');
3010
+			$updated = $att->save();
3011
+			if ( ! $updated) {
3012
+				$success = 0;
3013
+			}
3014
+		}
3015
+		$what        = $success > 1 ? __('Contacts', 'event_espresso') : __('Contact', 'event_espresso');
3016
+		$action_desc = $trash ? __('moved to the trash', 'event_espresso') : __('restored', 'event_espresso');
3017
+		$this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list'));
3018
+	}
3019 3019
 
3020 3020
 }
3021 3021
 
Please login to merge, or discard this patch.
Spacing   +83 added lines, -83 removed lines patch added patch discarded remove patch
@@ -569,11 +569,11 @@  discard block
 block discarded – undo
569 569
     {
570 570
         //style
571 571
         //wp_register_style('espresso_attendees', ATT_ASSETS_URL . 'espresso_attendees_admin.css', array(), EVENT_ESPRESSO_VERSION );
572
-        wp_register_style('espresso_reg', REG_ASSETS_URL . 'espresso_registrations_admin.css', array('ee-admin-css'),
572
+        wp_register_style('espresso_reg', REG_ASSETS_URL.'espresso_registrations_admin.css', array('ee-admin-css'),
573 573
             EVENT_ESPRESSO_VERSION);
574 574
         wp_enqueue_style('espresso_reg');
575 575
         //script
576
-        wp_register_script('espresso_reg', REG_ASSETS_URL . 'espresso_registrations_admin.js',
576
+        wp_register_script('espresso_reg', REG_ASSETS_URL.'espresso_registrations_admin.js',
577 577
             array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'), EVENT_ESPRESSO_VERSION, true);
578 578
         wp_enqueue_script('espresso_reg');
579 579
     }
@@ -604,7 +604,7 @@  discard block
 block discarded – undo
604 604
     public function load_scripts_styles_contact_list()
605 605
     {
606 606
         wp_deregister_style('espresso_reg');
607
-        wp_register_style('espresso_att', REG_ASSETS_URL . 'espresso_attendees_admin.css', array('ee-admin-css'),
607
+        wp_register_style('espresso_att', REG_ASSETS_URL.'espresso_attendees_admin.css', array('ee-admin-css'),
608 608
             EVENT_ESPRESSO_VERSION);
609 609
         wp_enqueue_style('espresso_att');
610 610
     }
@@ -612,7 +612,7 @@  discard block
 block discarded – undo
612 612
 
613 613
     public function load_scripts_styles_new_registration()
614 614
     {
615
-        wp_register_script('ee-spco-for-admin', REG_ASSETS_URL . 'spco_for_admin.js', array('underscore', 'jquery'),
615
+        wp_register_script('ee-spco-for-admin', REG_ASSETS_URL.'spco_for_admin.js', array('underscore', 'jquery'),
616 616
             EVENT_ESPRESSO_VERSION, true);
617 617
         wp_enqueue_script('ee-spco-for-admin');
618 618
         add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true');
@@ -722,7 +722,7 @@  discard block
 block discarded – undo
722 722
                     'trash_registrations' => __('Trash Registrations', 'event_espresso'),
723 723
                 ),
724 724
             );
725
-            $this->_views['trash']      = array(
725
+            $this->_views['trash'] = array(
726 726
                 'slug'        => 'trash',
727 727
                 'label'       => __('Trash', 'event_espresso'),
728 728
                 'count'       => 0,
@@ -807,31 +807,31 @@  discard block
 block discarded – undo
807 807
         }
808 808
         $sc_items = array(
809 809
             'approved_status'   => array(
810
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved,
810
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved,
811 811
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'),
812 812
             ),
813 813
             'pending_status'    => array(
814
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment,
814
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment,
815 815
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'),
816 816
             ),
817 817
             'wait_list'         => array(
818
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list,
818
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list,
819 819
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'),
820 820
             ),
821 821
             'incomplete_status' => array(
822
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete,
822
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_incomplete,
823 823
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_incomplete, false, 'sentence'),
824 824
             ),
825 825
             'not_approved'      => array(
826
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved,
826
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved,
827 827
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'),
828 828
             ),
829 829
             'declined_status'   => array(
830
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined,
830
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined,
831 831
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'),
832 832
             ),
833 833
             'cancelled_status'  => array(
834
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled,
834
+                'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled,
835 835
                 'desc'  => EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'),
836 836
             ),
837 837
         );
@@ -852,17 +852,17 @@  discard block
 block discarded – undo
852 852
             if (EE_Registry::instance()->CAP->current_user_can('ee_edit_registrations',
853 853
                 'espresso_registrations_new_registration', $EVT_ID)
854 854
             ) {
855
-                $this->_admin_page_title .= ' ' . $this->get_action_link_or_button('new_registration', 'add-registrant',
855
+                $this->_admin_page_title .= ' '.$this->get_action_link_or_button('new_registration', 'add-registrant',
856 856
                         array('event_id' => $EVT_ID), 'add-new-h2');
857 857
             }
858 858
             $event = EEM_Event::instance()->get_one_by_ID($EVT_ID);
859 859
             if ($event instanceof EE_Event) {
860 860
                 $this->_template_args['admin_page_header'] = sprintf(__('%s Viewing registrations for the event: %s%s',
861 861
                     'event_espresso'), '<h3 style="line-height:1.5em;">',
862
-                    '<br /><a href="' . EE_Admin_Page::add_query_args_and_nonce(array(
862
+                    '<br /><a href="'.EE_Admin_Page::add_query_args_and_nonce(array(
863 863
                         'action' => 'edit',
864 864
                         'post'   => $event->ID(),
865
-                    ), EVENTS_ADMIN_URL) . '">&nbsp;' . $event->get('EVT_name') . '&nbsp;</a>&nbsp;', '</h3>');
865
+                    ), EVENTS_ADMIN_URL).'">&nbsp;'.$event->get('EVT_name').'&nbsp;</a>&nbsp;', '</h3>');
866 866
             }
867 867
             $DTT_ID   = ! empty($this->_req_data['datetime_id']) ? absint($this->_req_data['datetime_id']) : 0;
868 868
             $datetime = EEM_Datetime::instance()->get_one_by_ID($DTT_ID);
@@ -871,7 +871,7 @@  discard block
 block discarded – undo
871 871
                 $this->_template_args['admin_page_header'] .= ' &nbsp;<span class="drk-grey-text">';
872 872
                 $this->_template_args['admin_page_header'] .= '<span class="dashicons dashicons-calendar"></span>';
873 873
                 $this->_template_args['admin_page_header'] .= $datetime->name();
874
-                $this->_template_args['admin_page_header'] .= ' ( ' . $datetime->start_date() . ' )';
874
+                $this->_template_args['admin_page_header'] .= ' ( '.$datetime->start_date().' )';
875 875
                 $this->_template_args['admin_page_header'] .= '</span></h3>';
876 876
             }
877 877
         }
@@ -921,10 +921,10 @@  discard block
 block discarded – undo
921 921
         $this_month = false,
922 922
         $today = false
923 923
     ) {
924
-        if( $this_month ) {
924
+        if ($this_month) {
925 925
             $this->_req_data['status'] = 'month';
926 926
         }
927
-        if( $today ) {
927
+        if ($today) {
928 928
             $this->_req_data['status'] = 'today';
929 929
         }
930 930
         $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count);
@@ -1002,7 +1002,7 @@  discard block
 block discarded – undo
1002 1002
     protected function _add_category_id_to_where_conditions(array $request)
1003 1003
     {
1004 1004
         $where = array();
1005
-        if ( ! empty($request['EVT_CAT']) && (int)$request['EVT_CAT'] !== -1) {
1005
+        if ( ! empty($request['EVT_CAT']) && (int) $request['EVT_CAT'] !== -1) {
1006 1006
             $where['Event.Term_Taxonomy.term_id'] = absint($request['EVT_CAT']);
1007 1007
         }
1008 1008
         return $where;
@@ -1021,7 +1021,7 @@  discard block
 block discarded – undo
1021 1021
         if ( ! empty($request['datetime_id'])) {
1022 1022
             $where['Ticket.Datetime.DTT_ID'] = absint($request['datetime_id']);
1023 1023
         }
1024
-        if( ! empty($request['DTT_ID'])){
1024
+        if ( ! empty($request['DTT_ID'])) {
1025 1025
             $where['Ticket.Datetime.DTT_ID'] = absint($request['DTT_ID']);
1026 1026
         }
1027 1027
         return $where;
@@ -1037,7 +1037,7 @@  discard block
 block discarded – undo
1037 1037
     protected function _add_registration_status_to_where_conditions(array $request)
1038 1038
     {
1039 1039
         $where = array();
1040
-        $view  = EEH_Array::is_set( $request, 'status', '' );
1040
+        $view  = EEH_Array::is_set($request, 'status', '');
1041 1041
         $registration_status = ! empty($request['_reg_status'])
1042 1042
             ? sanitize_text_field($request['_reg_status'])
1043 1043
             : '';
@@ -1072,7 +1072,7 @@  discard block
 block discarded – undo
1072 1072
     protected function _add_date_to_where_conditions(array $request)
1073 1073
     {
1074 1074
         $where = array();
1075
-        $view  = EEH_Array::is_set( $request, 'status', '' );
1075
+        $view  = EEH_Array::is_set($request, 'status', '');
1076 1076
         $month_range             = ! empty($request['month_range'])
1077 1077
             ? sanitize_text_field($request['month_range'])
1078 1078
             : '';
@@ -1086,12 +1086,12 @@  discard block
 block discarded – undo
1086 1086
                 array(
1087 1087
                     EEM_Registration::instance()->convert_datetime_for_query(
1088 1088
                         'REG_date',
1089
-                        $now . ' 00:00:00',
1089
+                        $now.' 00:00:00',
1090 1090
                         'Y-m-d H:i:s'
1091 1091
                     ),
1092 1092
                     EEM_Registration::instance()->convert_datetime_for_query(
1093 1093
                         'REG_date',
1094
-                        $now . ' 23:59:59',
1094
+                        $now.' 23:59:59',
1095 1095
                         'Y-m-d H:i:s'
1096 1096
                     ),
1097 1097
                 ),
@@ -1104,12 +1104,12 @@  discard block
 block discarded – undo
1104 1104
                 array(
1105 1105
                     EEM_Registration::instance()->convert_datetime_for_query(
1106 1106
                         'REG_date',
1107
-                        $current_year_and_month . '-01 00:00:00',
1107
+                        $current_year_and_month.'-01 00:00:00',
1108 1108
                         'Y-m-d H:i:s'
1109 1109
                     ),
1110 1110
                     EEM_Registration::instance()->convert_datetime_for_query(
1111 1111
                         'REG_date',
1112
-                        $current_year_and_month . '-' . $days_this_month . ' 23:59:59',
1112
+                        $current_year_and_month.'-'.$days_this_month.' 23:59:59',
1113 1113
                         'Y-m-d H:i:s'
1114 1114
                     ),
1115 1115
                 ),
@@ -1124,18 +1124,18 @@  discard block
 block discarded – undo
1124 1124
                 : '';
1125 1125
             //if there is not a month or year then we can't go further
1126 1126
             if ($month_requested && $year_requested) {
1127
-                $days_in_month     = date('t', strtotime($year_requested . '-' . $month_requested . '-' . '01'));
1127
+                $days_in_month     = date('t', strtotime($year_requested.'-'.$month_requested.'-'.'01'));
1128 1128
                 $where['REG_date'] = array(
1129 1129
                     'BETWEEN',
1130 1130
                     array(
1131 1131
                         EEM_Registration::instance()->convert_datetime_for_query(
1132 1132
                             'REG_date',
1133
-                            $year_requested . '-' . $month_requested . '-01 00:00:00',
1133
+                            $year_requested.'-'.$month_requested.'-01 00:00:00',
1134 1134
                             'Y-m-d H:i:s'
1135 1135
                         ),
1136 1136
                         EEM_Registration::instance()->convert_datetime_for_query(
1137 1137
                             'REG_date',
1138
-                            $year_requested . '-' . $month_requested . '-' . $days_in_month . ' 23:59:59',
1138
+                            $year_requested.'-'.$month_requested.'-'.$days_in_month.' 23:59:59',
1139 1139
                             'Y-m-d H:i:s'
1140 1140
                         ),
1141 1141
                     ),
@@ -1156,7 +1156,7 @@  discard block
 block discarded – undo
1156 1156
     {
1157 1157
         $where = array();
1158 1158
         if ( ! empty($request['s'])) {
1159
-            $search_string = '%' . sanitize_text_field($request['s']) . '%';
1159
+            $search_string = '%'.sanitize_text_field($request['s']).'%';
1160 1160
             $where['OR'] = array(
1161 1161
                 'Event.EVT_name'                          => array('LIKE', $search_string),
1162 1162
                 'Event.EVT_desc'                          => array('LIKE', $search_string),
@@ -1264,7 +1264,7 @@  discard block
 block discarded – undo
1264 1264
             : $per_page;
1265 1265
 
1266 1266
         //-1 means return all results so get out if that's set.
1267
-        if ((int)$per_page === -1) {
1267
+        if ((int) $per_page === -1) {
1268 1268
             return array();
1269 1269
         }
1270 1270
         $per_page = absint($per_page);
@@ -1310,12 +1310,12 @@  discard block
 block discarded – undo
1310 1310
                 'action'   => 'default',
1311 1311
                 'event_id' => $event_id,
1312 1312
             ), REG_ADMIN_URL);
1313
-            $this->_template_args['filtered_transactions_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
1313
+            $this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce(array(
1314 1314
                 'action' => 'default',
1315 1315
                 'EVT_ID' => $event_id,
1316 1316
                 'page'   => 'espresso_transactions',
1317 1317
             ), admin_url('admin.php'));
1318
-            $this->_template_args['event_link']                  = EE_Admin_Page::add_query_args_and_nonce(array(
1318
+            $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce(array(
1319 1319
                 'page'   => 'espresso_events',
1320 1320
                 'action' => 'edit',
1321 1321
                 'post'   => $event_id,
@@ -1334,7 +1334,7 @@  discard block
 block discarded – undo
1334 1334
                     '_REG_ID' => $previous_reg['REG_ID'],
1335 1335
                 ), REG_ADMIN_URL), 'dashicons dashicons-arrow-left ee-icon-size-22') : '';
1336 1336
             // grab header
1337
-            $template_path                             = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php';
1337
+            $template_path                             = REG_TEMPLATE_PATH.'reg_admin_details_header.template.php';
1338 1338
             $this->_template_args['REG_ID']            = $this->_registration->ID();
1339 1339
             $this->_template_args['admin_page_header'] = EEH_Template::display_template($template_path,
1340 1340
                 $this->_template_args, true);
@@ -1408,8 +1408,8 @@  discard block
 block discarded – undo
1408 1408
                     'default' => $this->_registration->ID(),
1409 1409
                 )),
1410 1410
                 'current_status'     => new EE_Form_Section_HTML(EEH_HTML::tr(EEH_HTML::th(EEH_HTML::label(EEH_HTML::strong(__('Current Registration Status',
1411
-                        'event_espresso')))) . EEH_HTML::td(EEH_HTML::strong($this->_registration->pretty_status(),
1412
-                        '', 'status-' . $this->_registration->status_ID(),
1411
+                        'event_espresso')))).EEH_HTML::td(EEH_HTML::strong($this->_registration->pretty_status(),
1412
+                        '', 'status-'.$this->_registration->status_ID(),
1413 1413
                         'line-height: 1em; font-size: 1.5em; font-weight: bold;')))),
1414 1414
                 'reg_status'         => new EE_Select_Input($this->_get_reg_statuses(), array(
1415 1415
                     'html_label_text' => __('Change Registration Status to', 'event_espresso'),
@@ -1465,9 +1465,9 @@  discard block
 block discarded – undo
1465 1465
     {
1466 1466
         if (isset($this->_req_data['reg_status_change_form'])) {
1467 1467
             $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID'])
1468
-                ? (array)$this->_req_data['reg_status_change_form']['REG_ID'] : array();
1468
+                ? (array) $this->_req_data['reg_status_change_form']['REG_ID'] : array();
1469 1469
         } else {
1470
-            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array)$this->_req_data['_REG_ID'] : array();
1470
+            $REG_IDs = isset($this->_req_data['_REG_ID']) ? (array) $this->_req_data['_REG_ID'] : array();
1471 1471
         }
1472 1472
         $success = $this->_set_registration_status($REG_IDs, $status);
1473 1473
         //notify?
@@ -1495,7 +1495,7 @@  discard block
 block discarded – undo
1495 1495
     {
1496 1496
         $success = false;
1497 1497
         // typecast $REG_IDs
1498
-        $REG_IDs = (array)$REG_IDs;
1498
+        $REG_IDs = (array) $REG_IDs;
1499 1499
         if ( ! empty($REG_IDs)) {
1500 1500
             $success = true;
1501 1501
             // set default status if none is passed
@@ -1788,7 +1788,7 @@  discard block
 block discarded – undo
1788 1788
         ), REG_ADMIN_URL);
1789 1789
         $this->_template_args['REG_ID']                                       = $this->_registration->ID();
1790 1790
         $this->_template_args['event_id']                                     = $this->_registration->event_ID();
1791
-        $template_path                                                        = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php';
1791
+        $template_path                                                        = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_details.template.php';
1792 1792
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
1793 1793
     }
1794 1794
 
@@ -1810,7 +1810,7 @@  discard block
 block discarded – undo
1810 1810
             $this->_template_args['att_questions']             = count($form->subforms()) > 0 ? $form->get_html_and_js() : '';
1811 1811
             $this->_template_args['reg_questions_form_action'] = 'edit_registration';
1812 1812
             $this->_template_args['REG_ID']                    = $this->_registration->ID();
1813
-            $template_path                                     = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php';
1813
+            $template_path                                     = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_questions.template.php';
1814 1814
             echo EEH_Template::display_template($template_path, $this->_template_args, true);
1815 1815
         }
1816 1816
     }
@@ -1826,7 +1826,7 @@  discard block
 block discarded – undo
1826 1826
      */
1827 1827
     public function form_before_question_group($output)
1828 1828
     {
1829
-        EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1829
+        EE_Error::doing_it_wrong(__CLASS__.'::'.__FUNCTION__,
1830 1830
             __('This method would have been protected but was used on a filter callback'
1831 1831
                . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1832 1832
             '4.8.32.rc.000');
@@ -1847,7 +1847,7 @@  discard block
 block discarded – undo
1847 1847
      */
1848 1848
     public function form_after_question_group($output)
1849 1849
     {
1850
-        EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1850
+        EE_Error::doing_it_wrong(__CLASS__.'::'.__FUNCTION__,
1851 1851
             __('This method would have been protected but was used on a filter callback'
1852 1852
                . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1853 1853
             '4.8.32.rc.000');
@@ -1881,14 +1881,14 @@  discard block
 block discarded – undo
1881 1881
      */
1882 1882
     public function form_form_field_label_wrap($label)
1883 1883
     {
1884
-        EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1884
+        EE_Error::doing_it_wrong(__CLASS__.'::'.__FUNCTION__,
1885 1885
             __('This method would have been protected but was used on a filter callback'
1886 1886
                . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1887 1887
             '4.8.32.rc.000');
1888 1888
         return '
1889 1889
 			<tr>
1890 1890
 				<th>
1891
-					' . $label . '
1891
+					' . $label.'
1892 1892
 				</th>';
1893 1893
     }
1894 1894
 
@@ -1903,13 +1903,13 @@  discard block
 block discarded – undo
1903 1903
      */
1904 1904
     public function form_form_field_input__wrap($input)
1905 1905
     {
1906
-        EE_Error::doing_it_wrong(__CLASS__ . '::' . __FUNCTION__,
1906
+        EE_Error::doing_it_wrong(__CLASS__.'::'.__FUNCTION__,
1907 1907
             __('This method would have been protected but was used on a filter callback'
1908 1908
                . 'so needed to be public. Please discontinue usage as it will be removed soon.', 'event_espresso'),
1909 1909
             '4.8.32.rc.000');
1910 1910
         return '
1911 1911
 				<td class="reg-admin-attendee-questions-input-td disabled-input">
1912
-					' . $input . '
1912
+					' . $input.'
1913 1913
 				</td>
1914 1914
 			</tr>';
1915 1915
     }
@@ -1949,7 +1949,7 @@  discard block
 block discarded – undo
1949 1949
     protected function _get_reg_custom_questions_form($REG_ID)
1950 1950
     {
1951 1951
         if ( ! $this->_reg_custom_questions_form) {
1952
-            require_once(REG_ADMIN . 'form_sections' . DS . 'EE_Registration_Custom_Questions_Form.form.php');
1952
+            require_once(REG_ADMIN.'form_sections'.DS.'EE_Registration_Custom_Questions_Form.form.php');
1953 1953
             $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form(
1954 1954
                 EEM_Registration::instance()->get_one_by_ID($REG_ID)
1955 1955
             );
@@ -1978,7 +1978,7 @@  discard block
 block discarded – undo
1978 1978
         if ($form->is_valid()) {
1979 1979
             foreach ($form->subforms() as $question_group_id => $question_group_form) {
1980 1980
                 foreach ($question_group_form->inputs() as $question_id => $input) {
1981
-                    $where_conditions    = array(
1981
+                    $where_conditions = array(
1982 1982
                         'QST_ID' => $question_id,
1983 1983
                         'REG_ID' => $REG_ID,
1984 1984
                     );
@@ -2014,7 +2014,7 @@  discard block
 block discarded – undo
2014 2014
         $REG = EEM_Registration::instance();
2015 2015
         //get all other registrations on this transaction, and cache
2016 2016
         //the attendees for them so we don't have to run another query using force_join
2017
-        $registrations                           = $REG->get_all(array(
2017
+        $registrations = $REG->get_all(array(
2018 2018
             array(
2019 2019
                 'TXN_ID' => $this->_registration->transaction_ID(),
2020 2020
                 'REG_ID' => array('!=', $this->_registration->ID()),
@@ -2034,29 +2034,29 @@  discard block
 block discarded – undo
2034 2034
             $att_nmbr = 1;
2035 2035
             foreach ($registrations as $registration) {
2036 2036
                 /* @var $registration EE_Registration */
2037
-                $attendee                                                    = $registration->attendee()
2037
+                $attendee = $registration->attendee()
2038 2038
                     ? $registration->attendee()
2039 2039
                     : EEM_Attendee::instance()
2040 2040
                                   ->create_default_object();
2041 2041
                 $this->_template_args['attendees'][$att_nmbr]['STS_ID']      = $registration->status_ID();
2042
-                $this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname();//( isset( $registration->ATT_fname ) & ! empty( $registration->ATT_fname ) ) ? $registration->ATT_fname : '';
2043
-                $this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname();//( isset( $registration->ATT_lname ) & ! empty( $registration->ATT_lname ) ) ? $registration->ATT_lname : '';
2044
-                $this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email();//( isset( $registration->ATT_email ) & ! empty( $registration->ATT_email ) ) ? $registration->ATT_email : '';
2045
-                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price();//( isset( $registration->REG_final_price ) & ! empty( $registration->REG_final_price ) ) ? $registration->REG_final_price : '';
2042
+                $this->_template_args['attendees'][$att_nmbr]['fname']       = $attendee->fname(); //( isset( $registration->ATT_fname ) & ! empty( $registration->ATT_fname ) ) ? $registration->ATT_fname : '';
2043
+                $this->_template_args['attendees'][$att_nmbr]['lname']       = $attendee->lname(); //( isset( $registration->ATT_lname ) & ! empty( $registration->ATT_lname ) ) ? $registration->ATT_lname : '';
2044
+                $this->_template_args['attendees'][$att_nmbr]['email']       = $attendee->email(); //( isset( $registration->ATT_email ) & ! empty( $registration->ATT_email ) ) ? $registration->ATT_email : '';
2045
+                $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price(); //( isset( $registration->REG_final_price ) & ! empty( $registration->REG_final_price ) ) ? $registration->REG_final_price : '';
2046 2046
                 $this->_template_args['attendees'][$att_nmbr]['address']     = implode(', ',
2047 2047
                     $attendee->full_address_as_array());
2048 2048
                 $this->_template_args['attendees'][$att_nmbr]['att_link']    = self::add_query_args_and_nonce(array(
2049 2049
                     'action' => 'edit_attendee',
2050 2050
                     'post'   => $attendee->ID(),
2051 2051
                 ), REG_ADMIN_URL);
2052
-                $this->_template_args['attendees'][$att_nmbr]['event_name']  = $registration->event_obj()->name();
2052
+                $this->_template_args['attendees'][$att_nmbr]['event_name'] = $registration->event_obj()->name();
2053 2053
                 $att_nmbr++;
2054 2054
             }
2055 2055
             //EEH_Debug_Tools::printr( $attendees, '$attendees  <br /><span style="font-size:10px;font-weight:normal;">( file: '. __FILE__ . ' - line no: ' . __LINE__ . ' )</span>', 'auto' );
2056 2056
             $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign;
2057 2057
             //			$this->_template_args['registration_form_url'] = add_query_arg( array( 'action' => 'edit_registration', 'process' => 'attendees'  ), REG_ADMIN_URL );
2058 2058
         }
2059
-        $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php';
2059
+        $template_path = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_attendees.template.php';
2060 2060
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2061 2061
     }
2062 2062
 
@@ -2085,26 +2085,26 @@  discard block
 block discarded – undo
2085 2085
             $primary_registration = null;
2086 2086
         }
2087 2087
         $this->_template_args['ATT_ID']            = $attendee->ID();
2088
-        $this->_template_args['fname']             = $attendee->fname();//$this->_registration->ATT_fname;
2089
-        $this->_template_args['lname']             = $attendee->lname();//$this->_registration->ATT_lname;
2090
-        $this->_template_args['email']             = $attendee->email();//$this->_registration->ATT_email;
2088
+        $this->_template_args['fname']             = $attendee->fname(); //$this->_registration->ATT_fname;
2089
+        $this->_template_args['lname']             = $attendee->lname(); //$this->_registration->ATT_lname;
2090
+        $this->_template_args['email']             = $attendee->email(); //$this->_registration->ATT_email;
2091 2091
         $this->_template_args['phone']             = $attendee->phone();
2092 2092
         $this->_template_args['formatted_address'] = EEH_Address::format($attendee);
2093 2093
         //edit link
2094
-        $this->_template_args['att_edit_link']  = EE_Admin_Page::add_query_args_and_nonce(array(
2094
+        $this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce(array(
2095 2095
             'action' => 'edit_attendee',
2096 2096
             'post'   => $attendee->ID(),
2097 2097
         ), REG_ADMIN_URL);
2098 2098
         $this->_template_args['att_edit_label'] = __('View/Edit Contact', 'event_espresso');
2099 2099
         //create link
2100
-        $this->_template_args['create_link']  = $primary_registration instanceof EE_Registration
2100
+        $this->_template_args['create_link'] = $primary_registration instanceof EE_Registration
2101 2101
             ? EE_Admin_Page::add_query_args_and_nonce(array(
2102 2102
                 'action'  => 'duplicate_attendee',
2103 2103
                 '_REG_ID' => $this->_registration->ID(),
2104 2104
             ), REG_ADMIN_URL) : '';
2105 2105
         $this->_template_args['create_label'] = __('Create Contact', 'event_espresso');
2106 2106
         $this->_template_args['att_check']    = $att_check;
2107
-        $template_path                        = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php';
2107
+        $template_path                        = REG_TEMPLATE_PATH.'reg_admin_details_side_meta_box_registrant.template.php';
2108 2108
         echo EEH_Template::display_template($template_path, $this->_template_args, true);
2109 2109
     }
2110 2110
 
@@ -2146,7 +2146,7 @@  discard block
 block discarded – undo
2146 2146
             /** @var EE_Registration $REG */
2147 2147
             $REG = EEM_Registration::instance()->get_one_by_ID($REG_ID);
2148 2148
             $payments = $REG->registration_payments();
2149
-            if (! empty($payments)) {
2149
+            if ( ! empty($payments)) {
2150 2150
                 $name = $REG->attendee() instanceof EE_Attendee
2151 2151
                     ? $REG->attendee()->full_name()
2152 2152
                     : __('Unknown Attendee', 'event_espresso');
@@ -2313,7 +2313,7 @@  discard block
 block discarded – undo
2313 2313
                 'action' => 'edit',
2314 2314
                 'post'   => $this->_reg_event->ID(),
2315 2315
             ), EVENTS_ADMIN_URL);
2316
-            $edit_event_lnk                     = '<a href="'
2316
+            $edit_event_lnk = '<a href="'
2317 2317
                                                   . $edit_event_url
2318 2318
                                                   . '" title="'
2319 2319
                                                   . esc_attr__('Edit ', 'event_espresso')
@@ -2330,7 +2330,7 @@  discard block
 block discarded – undo
2330 2330
             $this->_return_json();
2331 2331
         }
2332 2332
         // grab header
2333
-        $template_path                              = REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php';
2333
+        $template_path                              = REG_TEMPLATE_PATH.'reg_admin_register_new_attendee.template.php';
2334 2334
         $this->_template_args['admin_page_content'] = EEH_Template::display_template($template_path,
2335 2335
             $this->_template_args, true);
2336 2336
         //$this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE );
@@ -2352,7 +2352,7 @@  discard block
 block discarded – undo
2352 2352
                 'event_espresso'), '<br />', '<h3 class="important-notice">', '</h3>', '<div class="float-right">',
2353 2353
                 '<span id="redirect_timer" class="important-notice">30</span>', '</div>', '<b>', '</b>');
2354 2354
             return '
2355
-	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div>
2355
+	<div id="ee-add-reg-back-button-dv"><p>' . $warning_msg.'</p></div>
2356 2356
 	<script >
2357 2357
 		// WHOAH !!! it appears that someone is using the back button from the Transaction admin page
2358 2358
 		// after just adding a new registration... we gotta try to put a stop to that !!!
@@ -2577,7 +2577,7 @@  discard block
 block discarded – undo
2577 2577
     public function get_attendees($per_page, $count = false, $trash = false)
2578 2578
     {
2579 2579
         do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2580
-        require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php');
2580
+        require_once(REG_ADMIN.'EE_Attendee_Contact_List_Table.class.php');
2581 2581
         $ATT_MDL                    = EEM_Attendee::instance();
2582 2582
         $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : '';
2583 2583
         switch ($this->_req_data['orderby']) {
@@ -2611,7 +2611,7 @@  discard block
 block discarded – undo
2611 2611
             ? $this->_req_data['perpage'] : $per_page;
2612 2612
         $_where       = array();
2613 2613
         if ( ! empty($this->_req_data['s'])) {
2614
-            $sstr         = '%' . $this->_req_data['s'] . '%';
2614
+            $sstr         = '%'.$this->_req_data['s'].'%';
2615 2615
             $_where['OR'] = array(
2616 2616
                 'Registration.Event.EVT_name'       => array('LIKE', $sstr),
2617 2617
                 'Registration.Event.EVT_desc'       => array('LIKE', $sstr),
@@ -2689,7 +2689,7 @@  discard block
 block discarded – undo
2689 2689
      *                                                     the query parameters from the request
2690 2690
      * @return void ends the request with a redirect or download
2691 2691
      */
2692
-    public function _registrations_report_base( $method_name_for_getting_query_params )
2692
+    public function _registrations_report_base($method_name_for_getting_query_params)
2693 2693
     {
2694 2694
         if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) {
2695 2695
             wp_redirect(EE_Admin_Page::add_query_args_and_nonce(array(
@@ -2699,7 +2699,7 @@  discard block
 block discarded – undo
2699 2699
                 'filters'     => urlencode(
2700 2700
                     serialize(
2701 2701
                         call_user_func(
2702
-                            array( $this, $method_name_for_getting_query_params ),
2702
+                            array($this, $method_name_for_getting_query_params),
2703 2703
                             EEH_Array::is_set(
2704 2704
                                 $this->_req_data,
2705 2705
                                 'filters',
@@ -2719,8 +2719,8 @@  discard block
 block discarded – undo
2719 2719
                 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null,
2720 2720
             );
2721 2721
             $this->_req_data = array_merge($this->_req_data, $new_request_args);
2722
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
2723
-                require_once(EE_CLASSES . 'EE_Export.class.php');
2722
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
2723
+                require_once(EE_CLASSES.'EE_Export.class.php');
2724 2724
                 $EE_Export = EE_Export::instance($this->_req_data);
2725 2725
                 $EE_Export->export();
2726 2726
             }
@@ -2735,14 +2735,14 @@  discard block
 block discarded – undo
2735 2735
      */
2736 2736
     public function _registrations_report()
2737 2737
     {
2738
-        $this->_registrations_report_base( '_get_registration_query_parameters' );
2738
+        $this->_registrations_report_base('_get_registration_query_parameters');
2739 2739
     }
2740 2740
 
2741 2741
 
2742 2742
     public function _contact_list_export()
2743 2743
     {
2744
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
2745
-            require_once(EE_CLASSES . 'EE_Export.class.php');
2744
+        if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
2745
+            require_once(EE_CLASSES.'EE_Export.class.php');
2746 2746
             $EE_Export = EE_Export::instance($this->_req_data);
2747 2747
             $EE_Export->export_attendees();
2748 2748
         }
@@ -2759,8 +2759,8 @@  discard block
 block discarded – undo
2759 2759
                 'return_url'  => urlencode($this->_req_data['return_url']),
2760 2760
             )));
2761 2761
         } else {
2762
-            if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
2763
-                require_once(EE_CLASSES . 'EE_Export.class.php');
2762
+            if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
2763
+                require_once(EE_CLASSES.'EE_Export.class.php');
2764 2764
                 $EE_Export = EE_Export::instance($this->_req_data);
2765 2765
                 $EE_Export->report_attendees();
2766 2766
             }
@@ -2817,7 +2817,7 @@  discard block
 block discarded – undo
2817 2817
             $updated_fields = array(
2818 2818
                 'ATT_fname'     => $this->_req_data['ATT_fname'],
2819 2819
                 'ATT_lname'     => $this->_req_data['ATT_lname'],
2820
-                'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'],
2820
+                'ATT_full_name' => $this->_req_data['ATT_fname'].' '.$this->_req_data['ATT_lname'],
2821 2821
                 'ATT_address'   => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '',
2822 2822
                 'ATT_address2'  => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '',
2823 2823
                 'ATT_city'      => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '',
@@ -2900,7 +2900,7 @@  discard block
 block discarded – undo
2900 2900
     {
2901 2901
         //get attendee object ( should already have it )
2902 2902
         $this->_template_args['attendee'] = $this->_cpt_model_obj;
2903
-        $template                         = REG_TEMPLATE_PATH . 'attendee_contact_info_metabox_content.template.php';
2903
+        $template                         = REG_TEMPLATE_PATH.'attendee_contact_info_metabox_content.template.php';
2904 2904
         EEH_Template::display_template($template, $this->_template_args);
2905 2905
     }
2906 2906
 
@@ -2941,7 +2941,7 @@  discard block
 block discarded – undo
2941 2941
             'input_prefix'   => '',
2942 2942
             'append_qstn_id' => false,
2943 2943
         )));
2944
-        $template                             = REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php';
2944
+        $template = REG_TEMPLATE_PATH.'attendee_address_details_metabox_content.template.php';
2945 2945
         EEH_Template::display_template($template, $this->_template_args);
2946 2946
     }
2947 2947
 
@@ -2956,7 +2956,7 @@  discard block
 block discarded – undo
2956 2956
     {
2957 2957
         $this->_template_args['attendee']      = $this->_cpt_model_obj;
2958 2958
         $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration');
2959
-        $template                              = REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php';
2959
+        $template                              = REG_TEMPLATE_PATH.'attendee_registrations_main_meta_box.template.php';
2960 2960
         EEH_Template::display_template($template, $this->_template_args);
2961 2961
     }
2962 2962
 
@@ -2970,7 +2970,7 @@  discard block
 block discarded – undo
2970 2970
     public function after_title_form_fields($post)
2971 2971
     {
2972 2972
         if ($post->post_type == 'espresso_attendees') {
2973
-            $template                  = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php';
2973
+            $template                  = REG_TEMPLATE_PATH.'attendee_details_after_title_form_fields.template.php';
2974 2974
             $template_args['attendee'] = $this->_cpt_model_obj;
2975 2975
             EEH_Template::display_template($template, $template_args);
2976 2976
         }
Please login to merge, or discard this patch.
messages/data_class/EE_Messages_Registrations_incoming_data.class.php 2 patches
Indentation   +114 added lines, -114 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if (! defined('EVENT_ESPRESSO_VERSION')) {
3
-    exit('No direct script access allowed');
3
+	exit('No direct script access allowed');
4 4
 }
5 5
 
6 6
 /**
@@ -16,117 +16,117 @@  discard block
 block discarded – undo
16 16
 {
17 17
 
18 18
 
19
-    /**
20
-     * Constructor.
21
-     *
22
-     * @param  EE_Registration[] $data expecting an array of EE_Registration objects.
23
-     * @throws EE_Error
24
-     * @access protected
25
-     */
26
-    public function __construct($data = array())
27
-    {
28
-
29
-        //validate that the first element in the array is an EE_Registration object.
30
-        if (! reset($data) instanceof EE_Registration) {
31
-            throw new EE_Error(__('The EE_Message_Registrations_incoming_data class expects an array of EE_Registration objects.',
32
-                'event_espresso'));
33
-        }
34
-        parent::__construct($data);
35
-    }
36
-
37
-
38
-    /**
39
-     * setup the data.
40
-     * Sets up the expected data object for the messages prep using incoming registration objects.
41
-     *
42
-     * @return void
43
-     * @access protected
44
-     */
45
-    protected function _setup_data()
46
-    {
47
-        //we'll loop through each contact and setup the data needed.  Note that many properties will just be set as empty
48
-        //because this data handler is for a very specific set of data (i.e. just what's related to the registration).
49
-
50
-        $this->reg_objs = $this->data();
51
-        $this->txn      = $this->_maybe_get_transaction();
52
-        $this->_assemble_data();
53
-    }
54
-
55
-
56
-    /**
57
-     * If the incoming registrations all share the same transaction then this will return the transaction object shared
58
-     * among the registrations. Otherwise the transaction object is set to null because its intended to only represent
59
-     * one transaction.
60
-     *
61
-     * @return EE_Transaction|null
62
-     */
63
-    protected function _maybe_get_transaction()
64
-    {
65
-        $transactions = array();
66
-        foreach ($this->reg_objs as $registration) {
67
-            if ($registration instanceof EE_Registration) {
68
-                $transaction = $registration->transaction();
69
-                if ($transaction instanceof EE_Transaction) {
70
-                    $transactions[$transaction->ID()] = $transaction;
71
-                }
72
-            }
73
-        }
74
-        return count($transactions) === 1 ? reset($transactions) : null;
75
-    }
76
-
77
-
78
-    /**
79
-     * Returns database safe representation of the data later used to when instantiating this object.
80
-     *
81
-     * @param array $registrations The incoming data to be prepped.
82
-     * @return EE_Registration[]   The data being prepared for the db
83
-     */
84
-    static public function convert_data_for_persistent_storage($registrations)
85
-    {
86
-        if (
87
-            ! is_array($registrations)
88
-            || ! reset($registrations) instanceof EE_Registration
89
-        ) {
90
-            return array();
91
-        }
92
-
93
-        $registration_ids = array();
94
-
95
-        $registration_ids = array_filter(
96
-            array_map(
97
-                function ($registration) {
98
-                    if ($registration instanceof EE_Registration) {
99
-                        return $registration->ID();
100
-                    }
101
-                    return false;
102
-                },
103
-                $registrations
104
-            )
105
-        );
106
-
107
-        return $registration_ids;
108
-    }
109
-
110
-
111
-    /**
112
-     * Data that has been stored in persistent storage that was prepped by _convert_data_for_persistent_storage
113
-     * can be sent into this method and converted back into the format used for instantiating with this data handler.
114
-     *
115
-     * @param array $data
116
-     * @return EE_Registration[]
117
-     */
118
-    static public function convert_data_from_persistent_storage($data)
119
-    {
120
-        //since this was added later, we need to account of possible back compat issues where data already queued for generation
121
-        //is in the old format, which is an array of EE_Registration objects.  So if that's the case, then let's just return them
122
-        //@see https://events.codebasehq.com/projects/event-espresso/tickets/10127
123
-        if (is_array($data) && reset($data) instanceof EE_Registration) {
124
-            return $data;
125
-        }
126
-
127
-        $registrations = is_array($data)
128
-            ? EEM_Registration::instance()->get_all(array(array('REG_ID' => array('IN', $data))))
129
-            : array();
130
-        return $registrations;
131
-    }
19
+	/**
20
+	 * Constructor.
21
+	 *
22
+	 * @param  EE_Registration[] $data expecting an array of EE_Registration objects.
23
+	 * @throws EE_Error
24
+	 * @access protected
25
+	 */
26
+	public function __construct($data = array())
27
+	{
28
+
29
+		//validate that the first element in the array is an EE_Registration object.
30
+		if (! reset($data) instanceof EE_Registration) {
31
+			throw new EE_Error(__('The EE_Message_Registrations_incoming_data class expects an array of EE_Registration objects.',
32
+				'event_espresso'));
33
+		}
34
+		parent::__construct($data);
35
+	}
36
+
37
+
38
+	/**
39
+	 * setup the data.
40
+	 * Sets up the expected data object for the messages prep using incoming registration objects.
41
+	 *
42
+	 * @return void
43
+	 * @access protected
44
+	 */
45
+	protected function _setup_data()
46
+	{
47
+		//we'll loop through each contact and setup the data needed.  Note that many properties will just be set as empty
48
+		//because this data handler is for a very specific set of data (i.e. just what's related to the registration).
49
+
50
+		$this->reg_objs = $this->data();
51
+		$this->txn      = $this->_maybe_get_transaction();
52
+		$this->_assemble_data();
53
+	}
54
+
55
+
56
+	/**
57
+	 * If the incoming registrations all share the same transaction then this will return the transaction object shared
58
+	 * among the registrations. Otherwise the transaction object is set to null because its intended to only represent
59
+	 * one transaction.
60
+	 *
61
+	 * @return EE_Transaction|null
62
+	 */
63
+	protected function _maybe_get_transaction()
64
+	{
65
+		$transactions = array();
66
+		foreach ($this->reg_objs as $registration) {
67
+			if ($registration instanceof EE_Registration) {
68
+				$transaction = $registration->transaction();
69
+				if ($transaction instanceof EE_Transaction) {
70
+					$transactions[$transaction->ID()] = $transaction;
71
+				}
72
+			}
73
+		}
74
+		return count($transactions) === 1 ? reset($transactions) : null;
75
+	}
76
+
77
+
78
+	/**
79
+	 * Returns database safe representation of the data later used to when instantiating this object.
80
+	 *
81
+	 * @param array $registrations The incoming data to be prepped.
82
+	 * @return EE_Registration[]   The data being prepared for the db
83
+	 */
84
+	static public function convert_data_for_persistent_storage($registrations)
85
+	{
86
+		if (
87
+			! is_array($registrations)
88
+			|| ! reset($registrations) instanceof EE_Registration
89
+		) {
90
+			return array();
91
+		}
92
+
93
+		$registration_ids = array();
94
+
95
+		$registration_ids = array_filter(
96
+			array_map(
97
+				function ($registration) {
98
+					if ($registration instanceof EE_Registration) {
99
+						return $registration->ID();
100
+					}
101
+					return false;
102
+				},
103
+				$registrations
104
+			)
105
+		);
106
+
107
+		return $registration_ids;
108
+	}
109
+
110
+
111
+	/**
112
+	 * Data that has been stored in persistent storage that was prepped by _convert_data_for_persistent_storage
113
+	 * can be sent into this method and converted back into the format used for instantiating with this data handler.
114
+	 *
115
+	 * @param array $data
116
+	 * @return EE_Registration[]
117
+	 */
118
+	static public function convert_data_from_persistent_storage($data)
119
+	{
120
+		//since this was added later, we need to account of possible back compat issues where data already queued for generation
121
+		//is in the old format, which is an array of EE_Registration objects.  So if that's the case, then let's just return them
122
+		//@see https://events.codebasehq.com/projects/event-espresso/tickets/10127
123
+		if (is_array($data) && reset($data) instanceof EE_Registration) {
124
+			return $data;
125
+		}
126
+
127
+		$registrations = is_array($data)
128
+			? EEM_Registration::instance()->get_all(array(array('REG_ID' => array('IN', $data))))
129
+			: array();
130
+		return $registrations;
131
+	}
132 132
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php
2
-if (! defined('EVENT_ESPRESSO_VERSION')) {
2
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
3 3
     exit('No direct script access allowed');
4 4
 }
5 5
 
@@ -27,7 +27,7 @@  discard block
 block discarded – undo
27 27
     {
28 28
 
29 29
         //validate that the first element in the array is an EE_Registration object.
30
-        if (! reset($data) instanceof EE_Registration) {
30
+        if ( ! reset($data) instanceof EE_Registration) {
31 31
             throw new EE_Error(__('The EE_Message_Registrations_incoming_data class expects an array of EE_Registration objects.',
32 32
                 'event_espresso'));
33 33
         }
@@ -94,7 +94,7 @@  discard block
 block discarded – undo
94 94
 
95 95
         $registration_ids = array_filter(
96 96
             array_map(
97
-                function ($registration) {
97
+                function($registration) {
98 98
                     if ($registration instanceof EE_Registration) {
99 99
                         return $registration->ID();
100 100
                     }
Please login to merge, or discard this patch.
core/helpers/EEH_Parse_Shortcodes.helper.php 2 patches
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-if (! defined('EVENT_ESPRESSO_VERSION')) {
3
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
4 4
     exit('NO direct script access allowed');
5 5
 }
6 6
 
@@ -186,7 +186,7 @@  discard block
 block discarded – undo
186 186
     {
187 187
         //now let's get a list of shortcodes that are found in the given template
188 188
         preg_match_all('/(\[.+?\])/', $this->_template, $matches);
189
-        $shortcodes = (array)$matches[0]; //this should be an array of shortcodes in the template string.
189
+        $shortcodes = (array) $matches[0]; //this should be an array of shortcodes in the template string.
190 190
 
191 191
         $matched_code = array();
192 192
         $sc_values    = array();
@@ -220,14 +220,14 @@  discard block
 block discarded – undo
220 220
                 if ($sc_obj instanceof EE_Shortcodes) {
221 221
                     //we need to setup any dynamic shortcodes so that they work with the array_key_exists
222 222
                     preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
223
-                    $sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
223
+                    $sc_to_verify = ! empty($matches[0]) ? $matches[0][0].']' : $shortcode;
224 224
 
225
-                    if (! array_key_exists($sc_to_verify, $sc_obj->get_shortcodes())) {
225
+                    if ( ! array_key_exists($sc_to_verify, $sc_obj->get_shortcodes())) {
226 226
                         continue; //the given shortcode isn't in this object
227 227
                     }
228 228
 
229 229
                     //if this isn't  a "list" type shortcode then we'll send along the data vanilla instead of in an array.
230
-                    if (! in_array($sc_to_verify, $list_type_shortcodes)) {
230
+                    if ( ! in_array($sc_to_verify, $list_type_shortcodes)) {
231 231
                         $data_send = ! is_object($this->_data) && isset($this->_data['data']) ? $this->_data['data'] : $this->_data;
232 232
                     } else {
233 233
                         $data_send = $this->_data;
@@ -261,7 +261,7 @@  discard block
 block discarded – undo
261 261
         foreach ($valid_shortcodes as $shortcode_ref) {
262 262
             $ref       = ucwords(str_replace('_', ' ', $shortcode_ref));
263 263
             $ref       = str_replace(' ', '_', $ref);
264
-            $classname = 'EE_' . $ref . '_Shortcodes';
264
+            $classname = 'EE_'.$ref.'_Shortcodes';
265 265
             if (class_exists($classname)) {
266 266
                 $this->_shortcode_objs[] = new $classname;
267 267
             }
Please login to merge, or discard this patch.
Indentation   +264 added lines, -264 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (! defined('EVENT_ESPRESSO_VERSION')) {
4
-    exit('NO direct script access allowed');
4
+	exit('NO direct script access allowed');
5 5
 }
6 6
 
7 7
 /**
@@ -26,269 +26,269 @@  discard block
 block discarded – undo
26 26
 {
27 27
 
28 28
 
29
-    /**
30
-     * holds the template
31
-     *
32
-     * @access private
33
-     * @var mixed (string|array)
34
-     */
35
-    private $_template;
36
-
37
-
38
-    /**
39
-     * holds the incoming data object
40
-     *
41
-     * @access private
42
-     * @var object
43
-     */
44
-    private $_data;
45
-
46
-
47
-    /**
48
-     * will hold an array of EE_Shortcodes library objects.
49
-     *
50
-     * @access private
51
-     * @var EE_Shortcodes[]
52
-     */
53
-    private $_shortcode_objs = array();
54
-
55
-
56
-    public function __construct()
57
-    {
58
-    }
59
-
60
-
61
-    /**
62
-     * This kicks off the parsing of shortcodes in message templates
63
-     *
64
-     * @param  string                $template         This is the incoming string to be parsed
65
-     * @param  EE_Messages_Addressee $data             This is the incoming data object
66
-     * @param  array                 $valid_shortcodes An array of strings that correspond to EE_Shortcode libraries
67
-     * @param EE_message_type        $message_type     The message type that called the parser
68
-     * @param EE_messenger           $messenger        The active messenger for this parsing session.
69
-     * @param EE_Message             $message
70
-     * @return string                   The parsed template string
71
-     */
72
-    public function parse_message_template(
73
-        $template,
74
-        EE_Messages_Addressee $data,
75
-        $valid_shortcodes,
76
-        EE_message_type $message_type,
77
-        EE_messenger $messenger,
78
-        EE_Message $message
79
-    ) {
80
-        $extra_data = array(
81
-            'messenger'    => $messenger,
82
-            'message_type' => $message_type,
83
-            'message'      => $message,
84
-        );
85
-        $this->_init_data($template, $data, $valid_shortcodes, $extra_data);
86
-        $this->_template = is_array($template) ? $template['main'] : $template;
87
-        return $this->_parse_message_template();
88
-    }
89
-
90
-
91
-    public function parse_attendee_list_template(
92
-        $template,
93
-        EE_Registration $registration,
94
-        $valid_shortcodes,
95
-        $extra_data = array()
96
-    ) {
97
-        $this->_init_data($template, $registration, $valid_shortcodes, $extra_data);
98
-        $this->_template = is_array($template) ? $template['attendee_list'] : $template;
99
-        return $this->_parse_message_template();
100
-    }
101
-
102
-    public function parse_event_list_template($template, EE_Event $event, $valid_shortcodes, $extra_data = array())
103
-    {
104
-        $this->_init_data($template, $event, $valid_shortcodes, $extra_data);
105
-        $this->_template = is_array($template) ? $template['event_list'] : $template;
106
-        return $this->_parse_message_template();
107
-    }
108
-
109
-
110
-    public function parse_ticket_list_template($template, EE_Ticket $ticket, $valid_shortcodes, $extra_data = array())
111
-    {
112
-        $this->_init_data($template, $ticket, $valid_shortcodes, $extra_data);
113
-        $this->_template = is_array($template) ? $template['ticket_list'] : $template;
114
-        return $this->_parse_message_template();
115
-    }
116
-
117
-
118
-    public function parse_line_item_list_template(
119
-        $template,
120
-        EE_Line_Item $line_item,
121
-        $valid_shortcodes,
122
-        $extra_data = array()
123
-    ) {
124
-        $this->_init_data($template, $line_item, $valid_shortcodes, $extra_data);
125
-        $this->_template = is_array($template) ? $template['ticket_line_item_no_pms'] : $template;
126
-        return $this->_parse_message_template();
127
-    }
128
-
129
-
130
-    public function parse_payment_list_template(
131
-        $template,
132
-        EE_Payment $payment_item,
133
-        $valid_shortcodes,
134
-        $extra_data = array()
135
-    ) {
136
-        $this->_init_data($template, $payment_item, $valid_shortcodes, $extra_data);
137
-        $this->_template = is_array($template) ? $template['payment_list'] : $template;
138
-        return $this->_parse_message_template();
139
-    }
140
-
141
-
142
-    public function parse_datetime_list_template(
143
-        $template,
144
-        EE_Datetime $datetime,
145
-        $valid_shortcodes,
146
-        $extra_data = array()
147
-    ) {
148
-        $this->_init_data($template, $datetime, $valid_shortcodes, $extra_data);
149
-        $this->_template = is_array($template) ? $template['datetime_list'] : $template;
150
-        return $this->_parse_message_template();
151
-    }
152
-
153
-
154
-    public function parse_question_list_template($template, EE_Answer $answer, $valid_shortcodes, $extra_data = array())
155
-    {
156
-        $this->_init_data($template, $answer, $valid_shortcodes, $extra_data);
157
-        $this->_template = is_array($template) ? $template['question_list'] : $template;
158
-        return $this->_parse_message_template();
159
-    }
160
-
161
-
162
-    private function _init_data($template, $data, $valid_shortcodes, $extra_data = array())
163
-    {
164
-        $this->_reset_props();
165
-        $this->_data['template']   = $template;
166
-        $this->_data['data']       = $data;
167
-        $this->_data['extra_data'] = $extra_data;
168
-        $this->_set_shortcodes($valid_shortcodes);
169
-    }
170
-
171
-
172
-    private function _reset_props()
173
-    {
174
-        $this->_template       = $this->_data = null;
175
-        $this->_shortcode_objs = array();
176
-    }
177
-
178
-
179
-    /**
180
-     * takes the given template and parses it with the $_shortcodes property
181
-     *
182
-     * @access private
183
-     * @return string
184
-     */
185
-    private function _parse_message_template()
186
-    {
187
-        //now let's get a list of shortcodes that are found in the given template
188
-        preg_match_all('/(\[.+?\])/', $this->_template, $matches);
189
-        $shortcodes = (array)$matches[0]; //this should be an array of shortcodes in the template string.
190
-
191
-        $matched_code = array();
192
-        $sc_values    = array();
193
-
194
-        $list_type_shortcodes = array(
195
-            '[ATTENDEE_LIST]',
196
-            '[EVENT_LIST]',
197
-            '[TICKET_LIST]',
198
-            '[DATETIME_LIST]',
199
-            '[QUESTION_LIST]',
200
-            '[RECIPIENT_QUESTION_LIST]',
201
-            '[PRIMARY_REGISTRANT_QUESTION_LIST]',
202
-            '[RECIPIENT_TICKET_LIST]',
203
-            '[PRIMARY_REGISTRANT_TICKET_LIST]',
204
-            '[RECIPIENT_DATETIME_LIST]',
205
-            '[PRIMARY_REGISTRANT_DATETIME_LIST]',
206
-            '[TICKET_LINE_ITEM_LIST]',
207
-            '[TAX_LINE_ITEM_LIST]',
208
-            '[ADDITIONAL_LINE_ITEM_LIST]',
209
-            '[PRICE_MODIFIER_LINE_ITEM_LIST]',
210
-            '[PAYMENT_LIST_*]',
211
-        );
212
-
213
-        $list_type_shortcodes = apply_filters('FHEE__EEH_Parse_Shortcodes___parse_message_template__list_type_shortcodes',
214
-            $list_type_shortcodes);
215
-
216
-        //now lets go ahead and loop through our parsers for each shortcode and setup the values
217
-        foreach ($shortcodes as $shortcode) {
218
-
219
-            foreach ($this->_shortcode_objs as $sc_obj) {
220
-                if ($sc_obj instanceof EE_Shortcodes) {
221
-                    //we need to setup any dynamic shortcodes so that they work with the array_key_exists
222
-                    preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
223
-                    $sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
224
-
225
-                    if (! array_key_exists($sc_to_verify, $sc_obj->get_shortcodes())) {
226
-                        continue; //the given shortcode isn't in this object
227
-                    }
228
-
229
-                    //if this isn't  a "list" type shortcode then we'll send along the data vanilla instead of in an array.
230
-                    if (! in_array($sc_to_verify, $list_type_shortcodes)) {
231
-                        $data_send = ! is_object($this->_data) && isset($this->_data['data']) ? $this->_data['data'] : $this->_data;
232
-                    } else {
233
-                        $data_send = $this->_data;
234
-                    }
235
-
236
-                    //is this a conditional type shortcode?  If it is then we actually parse the template here.
237
-                    if ($this->_is_conditional_shortcode($shortcode)) {
238
-                        //most shortcode parsers are not going to have a match for this shortcode and will return an
239
-                        //empty string so we need to make sure that we're only replacing the template when there is a non empty string.
240
-                        $parsed = $sc_obj->parser($shortcode, $data_send, $this->_data['extra_data']);
241
-                        if ($parsed) {
242
-                            $this->_template = $parsed;
243
-                        }
244
-                    }
245
-
246
-                    $parsed = $sc_obj->parser($shortcode, $data_send, $this->_data['extra_data']);
247
-
248
-                    $matched_code[] = $shortcode;
249
-                    $sc_values[]    = $parsed;
250
-                }
251
-            }
252
-        }
253
-
254
-        //now we've got parsed values for all the shortcodes in the template so we can go ahead and swap the shortcodes out.
255
-        $parsed = str_replace(array_values($matched_code), array_values($sc_values), $this->_template);
256
-        return $parsed;
257
-    }
258
-
259
-
260
-    /**
261
-     * Simply returns whether the given shortcode matches the structure for a conditional shortcode.
262
-     *
263
-     * Does it match this format: `[IF_`
264
-     *
265
-     * @param $shortcode
266
-     */
267
-    protected function _is_conditional_shortcode($shortcode)
268
-    {
269
-        return strpos($shortcode, '[IF_') === 0;
270
-    }
271
-
272
-
273
-    /**
274
-     * This sets the shortcodes property from the incoming array of valid shortcodes that corresponds to names of
275
-     * various EE_Shortcode library objects
276
-     *
277
-     * @access private
278
-     * @param array $valid_shortcodes an array of strings corresponding to EE_Shortcode Library objects
279
-     * @return void
280
-     */
281
-    private function _set_shortcodes($valid_shortcodes)
282
-    {
283
-        foreach ($valid_shortcodes as $shortcode_ref) {
284
-            $ref       = ucwords(str_replace('_', ' ', $shortcode_ref));
285
-            $ref       = str_replace(' ', '_', $ref);
286
-            $classname = 'EE_' . $ref . '_Shortcodes';
287
-            if (class_exists($classname)) {
288
-                $this->_shortcode_objs[] = new $classname;
289
-            }
290
-        }
291
-    }
29
+	/**
30
+	 * holds the template
31
+	 *
32
+	 * @access private
33
+	 * @var mixed (string|array)
34
+	 */
35
+	private $_template;
36
+
37
+
38
+	/**
39
+	 * holds the incoming data object
40
+	 *
41
+	 * @access private
42
+	 * @var object
43
+	 */
44
+	private $_data;
45
+
46
+
47
+	/**
48
+	 * will hold an array of EE_Shortcodes library objects.
49
+	 *
50
+	 * @access private
51
+	 * @var EE_Shortcodes[]
52
+	 */
53
+	private $_shortcode_objs = array();
54
+
55
+
56
+	public function __construct()
57
+	{
58
+	}
59
+
60
+
61
+	/**
62
+	 * This kicks off the parsing of shortcodes in message templates
63
+	 *
64
+	 * @param  string                $template         This is the incoming string to be parsed
65
+	 * @param  EE_Messages_Addressee $data             This is the incoming data object
66
+	 * @param  array                 $valid_shortcodes An array of strings that correspond to EE_Shortcode libraries
67
+	 * @param EE_message_type        $message_type     The message type that called the parser
68
+	 * @param EE_messenger           $messenger        The active messenger for this parsing session.
69
+	 * @param EE_Message             $message
70
+	 * @return string                   The parsed template string
71
+	 */
72
+	public function parse_message_template(
73
+		$template,
74
+		EE_Messages_Addressee $data,
75
+		$valid_shortcodes,
76
+		EE_message_type $message_type,
77
+		EE_messenger $messenger,
78
+		EE_Message $message
79
+	) {
80
+		$extra_data = array(
81
+			'messenger'    => $messenger,
82
+			'message_type' => $message_type,
83
+			'message'      => $message,
84
+		);
85
+		$this->_init_data($template, $data, $valid_shortcodes, $extra_data);
86
+		$this->_template = is_array($template) ? $template['main'] : $template;
87
+		return $this->_parse_message_template();
88
+	}
89
+
90
+
91
+	public function parse_attendee_list_template(
92
+		$template,
93
+		EE_Registration $registration,
94
+		$valid_shortcodes,
95
+		$extra_data = array()
96
+	) {
97
+		$this->_init_data($template, $registration, $valid_shortcodes, $extra_data);
98
+		$this->_template = is_array($template) ? $template['attendee_list'] : $template;
99
+		return $this->_parse_message_template();
100
+	}
101
+
102
+	public function parse_event_list_template($template, EE_Event $event, $valid_shortcodes, $extra_data = array())
103
+	{
104
+		$this->_init_data($template, $event, $valid_shortcodes, $extra_data);
105
+		$this->_template = is_array($template) ? $template['event_list'] : $template;
106
+		return $this->_parse_message_template();
107
+	}
108
+
109
+
110
+	public function parse_ticket_list_template($template, EE_Ticket $ticket, $valid_shortcodes, $extra_data = array())
111
+	{
112
+		$this->_init_data($template, $ticket, $valid_shortcodes, $extra_data);
113
+		$this->_template = is_array($template) ? $template['ticket_list'] : $template;
114
+		return $this->_parse_message_template();
115
+	}
116
+
117
+
118
+	public function parse_line_item_list_template(
119
+		$template,
120
+		EE_Line_Item $line_item,
121
+		$valid_shortcodes,
122
+		$extra_data = array()
123
+	) {
124
+		$this->_init_data($template, $line_item, $valid_shortcodes, $extra_data);
125
+		$this->_template = is_array($template) ? $template['ticket_line_item_no_pms'] : $template;
126
+		return $this->_parse_message_template();
127
+	}
128
+
129
+
130
+	public function parse_payment_list_template(
131
+		$template,
132
+		EE_Payment $payment_item,
133
+		$valid_shortcodes,
134
+		$extra_data = array()
135
+	) {
136
+		$this->_init_data($template, $payment_item, $valid_shortcodes, $extra_data);
137
+		$this->_template = is_array($template) ? $template['payment_list'] : $template;
138
+		return $this->_parse_message_template();
139
+	}
140
+
141
+
142
+	public function parse_datetime_list_template(
143
+		$template,
144
+		EE_Datetime $datetime,
145
+		$valid_shortcodes,
146
+		$extra_data = array()
147
+	) {
148
+		$this->_init_data($template, $datetime, $valid_shortcodes, $extra_data);
149
+		$this->_template = is_array($template) ? $template['datetime_list'] : $template;
150
+		return $this->_parse_message_template();
151
+	}
152
+
153
+
154
+	public function parse_question_list_template($template, EE_Answer $answer, $valid_shortcodes, $extra_data = array())
155
+	{
156
+		$this->_init_data($template, $answer, $valid_shortcodes, $extra_data);
157
+		$this->_template = is_array($template) ? $template['question_list'] : $template;
158
+		return $this->_parse_message_template();
159
+	}
160
+
161
+
162
+	private function _init_data($template, $data, $valid_shortcodes, $extra_data = array())
163
+	{
164
+		$this->_reset_props();
165
+		$this->_data['template']   = $template;
166
+		$this->_data['data']       = $data;
167
+		$this->_data['extra_data'] = $extra_data;
168
+		$this->_set_shortcodes($valid_shortcodes);
169
+	}
170
+
171
+
172
+	private function _reset_props()
173
+	{
174
+		$this->_template       = $this->_data = null;
175
+		$this->_shortcode_objs = array();
176
+	}
177
+
178
+
179
+	/**
180
+	 * takes the given template and parses it with the $_shortcodes property
181
+	 *
182
+	 * @access private
183
+	 * @return string
184
+	 */
185
+	private function _parse_message_template()
186
+	{
187
+		//now let's get a list of shortcodes that are found in the given template
188
+		preg_match_all('/(\[.+?\])/', $this->_template, $matches);
189
+		$shortcodes = (array)$matches[0]; //this should be an array of shortcodes in the template string.
190
+
191
+		$matched_code = array();
192
+		$sc_values    = array();
193
+
194
+		$list_type_shortcodes = array(
195
+			'[ATTENDEE_LIST]',
196
+			'[EVENT_LIST]',
197
+			'[TICKET_LIST]',
198
+			'[DATETIME_LIST]',
199
+			'[QUESTION_LIST]',
200
+			'[RECIPIENT_QUESTION_LIST]',
201
+			'[PRIMARY_REGISTRANT_QUESTION_LIST]',
202
+			'[RECIPIENT_TICKET_LIST]',
203
+			'[PRIMARY_REGISTRANT_TICKET_LIST]',
204
+			'[RECIPIENT_DATETIME_LIST]',
205
+			'[PRIMARY_REGISTRANT_DATETIME_LIST]',
206
+			'[TICKET_LINE_ITEM_LIST]',
207
+			'[TAX_LINE_ITEM_LIST]',
208
+			'[ADDITIONAL_LINE_ITEM_LIST]',
209
+			'[PRICE_MODIFIER_LINE_ITEM_LIST]',
210
+			'[PAYMENT_LIST_*]',
211
+		);
212
+
213
+		$list_type_shortcodes = apply_filters('FHEE__EEH_Parse_Shortcodes___parse_message_template__list_type_shortcodes',
214
+			$list_type_shortcodes);
215
+
216
+		//now lets go ahead and loop through our parsers for each shortcode and setup the values
217
+		foreach ($shortcodes as $shortcode) {
218
+
219
+			foreach ($this->_shortcode_objs as $sc_obj) {
220
+				if ($sc_obj instanceof EE_Shortcodes) {
221
+					//we need to setup any dynamic shortcodes so that they work with the array_key_exists
222
+					preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
223
+					$sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
224
+
225
+					if (! array_key_exists($sc_to_verify, $sc_obj->get_shortcodes())) {
226
+						continue; //the given shortcode isn't in this object
227
+					}
228
+
229
+					//if this isn't  a "list" type shortcode then we'll send along the data vanilla instead of in an array.
230
+					if (! in_array($sc_to_verify, $list_type_shortcodes)) {
231
+						$data_send = ! is_object($this->_data) && isset($this->_data['data']) ? $this->_data['data'] : $this->_data;
232
+					} else {
233
+						$data_send = $this->_data;
234
+					}
235
+
236
+					//is this a conditional type shortcode?  If it is then we actually parse the template here.
237
+					if ($this->_is_conditional_shortcode($shortcode)) {
238
+						//most shortcode parsers are not going to have a match for this shortcode and will return an
239
+						//empty string so we need to make sure that we're only replacing the template when there is a non empty string.
240
+						$parsed = $sc_obj->parser($shortcode, $data_send, $this->_data['extra_data']);
241
+						if ($parsed) {
242
+							$this->_template = $parsed;
243
+						}
244
+					}
245
+
246
+					$parsed = $sc_obj->parser($shortcode, $data_send, $this->_data['extra_data']);
247
+
248
+					$matched_code[] = $shortcode;
249
+					$sc_values[]    = $parsed;
250
+				}
251
+			}
252
+		}
253
+
254
+		//now we've got parsed values for all the shortcodes in the template so we can go ahead and swap the shortcodes out.
255
+		$parsed = str_replace(array_values($matched_code), array_values($sc_values), $this->_template);
256
+		return $parsed;
257
+	}
258
+
259
+
260
+	/**
261
+	 * Simply returns whether the given shortcode matches the structure for a conditional shortcode.
262
+	 *
263
+	 * Does it match this format: `[IF_`
264
+	 *
265
+	 * @param $shortcode
266
+	 */
267
+	protected function _is_conditional_shortcode($shortcode)
268
+	{
269
+		return strpos($shortcode, '[IF_') === 0;
270
+	}
271
+
272
+
273
+	/**
274
+	 * This sets the shortcodes property from the incoming array of valid shortcodes that corresponds to names of
275
+	 * various EE_Shortcode library objects
276
+	 *
277
+	 * @access private
278
+	 * @param array $valid_shortcodes an array of strings corresponding to EE_Shortcode Library objects
279
+	 * @return void
280
+	 */
281
+	private function _set_shortcodes($valid_shortcodes)
282
+	{
283
+		foreach ($valid_shortcodes as $shortcode_ref) {
284
+			$ref       = ucwords(str_replace('_', ' ', $shortcode_ref));
285
+			$ref       = str_replace(' ', '_', $ref);
286
+			$classname = 'EE_' . $ref . '_Shortcodes';
287
+			if (class_exists($classname)) {
288
+				$this->_shortcode_objs[] = new $classname;
289
+			}
290
+		}
291
+	}
292 292
 
293 293
 
294 294
 } //end EEH_Parse_Shortcodes
Please login to merge, or discard this patch.
core/db_classes/EE_Line_Item.class.php 2 patches
Spacing   +209 added lines, -209 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1
-<?php if ( !defined( 'EVENT_ESPRESSO_VERSION' ) ) {
2
-	exit( 'No direct script access allowed' );
1
+<?php if ( ! defined('EVENT_ESPRESSO_VERSION')) {
2
+	exit('No direct script access allowed');
3 3
 }
4 4
 /**
5 5
  * Event Espresso
@@ -50,9 +50,9 @@  discard block
 block discarded – undo
50 50
 	 *                             		    date_format and the second value is the time format
51 51
 	 * @return EE_Line_Item
52 52
 	 */
53
-	public static function new_instance( $props_n_values = array(), $timezone = null, $date_formats = array() ) {
54
-		$has_object = parent::_check_for_object( $props_n_values, __CLASS__, $timezone, $date_formats );
55
-		return $has_object ? $has_object : new self( $props_n_values, false, $timezone, $date_formats );
53
+	public static function new_instance($props_n_values = array(), $timezone = null, $date_formats = array()) {
54
+		$has_object = parent::_check_for_object($props_n_values, __CLASS__, $timezone, $date_formats);
55
+		return $has_object ? $has_object : new self($props_n_values, false, $timezone, $date_formats);
56 56
 	}
57 57
 
58 58
 
@@ -63,8 +63,8 @@  discard block
 block discarded – undo
63 63
 	 *                          		the website will be used.
64 64
 	 * @return EE_Line_Item
65 65
 	 */
66
-	public static function new_instance_from_db( $props_n_values = array(), $timezone = null ) {
67
-		return new self( $props_n_values, TRUE, $timezone );
66
+	public static function new_instance_from_db($props_n_values = array(), $timezone = null) {
67
+		return new self($props_n_values, TRUE, $timezone);
68 68
 	}
69 69
 
70 70
 
@@ -75,10 +75,10 @@  discard block
 block discarded – undo
75 75
 	 * @param bool   $bydb
76 76
 	 * @param string $timezone
77 77
 	 */
78
-	protected function __construct( $fieldValues = array(), $bydb = FALSE, $timezone = '' ) {
79
-		parent::__construct( $fieldValues, $bydb, $timezone );
80
-		if ( ! $this->get( 'LIN_code' ) ) {
81
-			$this->set_code( $this->generate_code() );
78
+	protected function __construct($fieldValues = array(), $bydb = FALSE, $timezone = '') {
79
+		parent::__construct($fieldValues, $bydb, $timezone);
80
+		if ( ! $this->get('LIN_code')) {
81
+			$this->set_code($this->generate_code());
82 82
 		}
83 83
 	}
84 84
 
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
 	 * @return int
90 90
 	 */
91 91
 	public function ID() {
92
-		return $this->get( 'LIN_ID' );
92
+		return $this->get('LIN_ID');
93 93
 	}
94 94
 
95 95
 
@@ -99,7 +99,7 @@  discard block
 block discarded – undo
99 99
 	 * @return int
100 100
 	 */
101 101
 	public function TXN_ID() {
102
-		return $this->get( 'TXN_ID' );
102
+		return $this->get('TXN_ID');
103 103
 	}
104 104
 
105 105
 
@@ -108,8 +108,8 @@  discard block
 block discarded – undo
108 108
 	 * Sets TXN_ID
109 109
 	 * @param int $TXN_ID
110 110
 	 */
111
-	public function set_TXN_ID( $TXN_ID ) {
112
-		$this->set( 'TXN_ID', $TXN_ID );
111
+	public function set_TXN_ID($TXN_ID) {
112
+		$this->set('TXN_ID', $TXN_ID);
113 113
 	}
114 114
 
115 115
 
@@ -119,9 +119,9 @@  discard block
 block discarded – undo
119 119
 	 * @return string
120 120
 	 */
121 121
 	public function name() {
122
-		$name =  $this->get( 'LIN_name' );
123
-		if( ! $name ){
124
-			$name = ucwords( str_replace( '-', ' ', $this->type() ) );
122
+		$name = $this->get('LIN_name');
123
+		if ( ! $name) {
124
+			$name = ucwords(str_replace('-', ' ', $this->type()));
125 125
 		}
126 126
 		return $name;
127 127
 	}
@@ -132,8 +132,8 @@  discard block
 block discarded – undo
132 132
 	 * Sets name
133 133
 	 * @param string $name
134 134
 	 */
135
-	public function set_name( $name ) {
136
-		$this->set( 'LIN_name', $name );
135
+	public function set_name($name) {
136
+		$this->set('LIN_name', $name);
137 137
 	}
138 138
 
139 139
 
@@ -143,7 +143,7 @@  discard block
 block discarded – undo
143 143
 	 * @return string
144 144
 	 */
145 145
 	public function desc() {
146
-		return $this->get( 'LIN_desc' );
146
+		return $this->get('LIN_desc');
147 147
 	}
148 148
 
149 149
 
@@ -152,8 +152,8 @@  discard block
 block discarded – undo
152 152
 	 * Sets desc
153 153
 	 * @param string $desc
154 154
 	 */
155
-	public function set_desc( $desc ) {
156
-		$this->set( 'LIN_desc', $desc );
155
+	public function set_desc($desc) {
156
+		$this->set('LIN_desc', $desc);
157 157
 	}
158 158
 
159 159
 
@@ -163,7 +163,7 @@  discard block
 block discarded – undo
163 163
 	 * @return int
164 164
 	 */
165 165
 	public function quantity() {
166
-		return $this->get( 'LIN_quantity' );
166
+		return $this->get('LIN_quantity');
167 167
 	}
168 168
 
169 169
 
@@ -172,8 +172,8 @@  discard block
 block discarded – undo
172 172
 	 * Sets quantity
173 173
 	 * @param int $quantity
174 174
 	 */
175
-    public function set_quantity( $quantity ) {
176
-		$this->set( 'LIN_quantity', max( $quantity, 0 ) );
175
+    public function set_quantity($quantity) {
176
+		$this->set('LIN_quantity', max($quantity, 0));
177 177
 	}
178 178
 
179 179
 
@@ -183,7 +183,7 @@  discard block
 block discarded – undo
183 183
 	 * @return string
184 184
 	 */
185 185
 	public function OBJ_ID() {
186
-		return $this->get( 'OBJ_ID' );
186
+		return $this->get('OBJ_ID');
187 187
 	}
188 188
 
189 189
 
@@ -192,8 +192,8 @@  discard block
 block discarded – undo
192 192
 	 * Sets item_id
193 193
 	 * @param string $item_id
194 194
 	 */
195
-	public function set_OBJ_ID( $item_id ) {
196
-		$this->set( 'OBJ_ID', $item_id );
195
+	public function set_OBJ_ID($item_id) {
196
+		$this->set('OBJ_ID', $item_id);
197 197
 	}
198 198
 
199 199
 
@@ -203,7 +203,7 @@  discard block
 block discarded – undo
203 203
 	 * @return string
204 204
 	 */
205 205
 	public function OBJ_type() {
206
-		return $this->get( 'OBJ_type' );
206
+		return $this->get('OBJ_type');
207 207
 	}
208 208
 
209 209
 
@@ -240,8 +240,8 @@  discard block
 block discarded – undo
240 240
 	 * Sets item_type
241 241
 	 * @param string $OBJ_type
242 242
 	 */
243
-	public function set_OBJ_type( $OBJ_type ) {
244
-		$this->set( 'OBJ_type', $OBJ_type );
243
+	public function set_OBJ_type($OBJ_type) {
244
+		$this->set('OBJ_type', $OBJ_type);
245 245
 	}
246 246
 
247 247
 
@@ -251,7 +251,7 @@  discard block
 block discarded – undo
251 251
 	 * @return float
252 252
 	 */
253 253
 	public function unit_price() {
254
-		return $this->get( 'LIN_unit_price' );
254
+		return $this->get('LIN_unit_price');
255 255
 	}
256 256
 
257 257
 
@@ -261,8 +261,8 @@  discard block
 block discarded – undo
261 261
 	 *
262 262
 	 * @param float $unit_price
263 263
 	 */
264
-	public function set_unit_price( $unit_price ) {
265
-		$this->set( 'LIN_unit_price', $unit_price );
264
+	public function set_unit_price($unit_price) {
265
+		$this->set('LIN_unit_price', $unit_price);
266 266
 	}
267 267
 
268 268
 
@@ -273,19 +273,19 @@  discard block
 block discarded – undo
273 273
 	 * @return boolean
274 274
 	 */
275 275
 	public function is_percent() {
276
-		if( $this->is_tax_sub_total() ) {
276
+		if ($this->is_tax_sub_total()) {
277 277
 			//tax subtotals HAVE a percent on them, that percentage only applies
278 278
 			//to taxable items, so its' an exception. Treat it like a flat line item
279 279
 			return false;
280 280
 		}
281
-		$unit_price = abs( $this->get( 'LIN_unit_price' ) );
282
-		$percent = abs( $this->get( 'LIN_percent' ) );
283
-		if ( $unit_price < .001 && $percent ) {
281
+		$unit_price = abs($this->get('LIN_unit_price'));
282
+		$percent = abs($this->get('LIN_percent'));
283
+		if ($unit_price < .001 && $percent) {
284 284
 			return TRUE;
285
-		} elseif ( $unit_price >= .001 && !$percent ) {
285
+		} elseif ($unit_price >= .001 && ! $percent) {
286 286
 			return FALSE;
287
-		} elseif ( $unit_price >= .001 && $percent ) {
288
-			throw new EE_Error( sprintf( __( "A Line Item can not have a unit price of (%s) AND a percent (%s)!", "event_espresso" ), $unit_price, $percent ) );
287
+		} elseif ($unit_price >= .001 && $percent) {
288
+			throw new EE_Error(sprintf(__("A Line Item can not have a unit price of (%s) AND a percent (%s)!", "event_espresso"), $unit_price, $percent));
289 289
 		} else {
290 290
 			// if they're both 0, assume its not a percent item
291 291
 			return FALSE;
@@ -299,7 +299,7 @@  discard block
 block discarded – undo
299 299
 	 * @return float
300 300
 	 */
301 301
 	public function percent() {
302
-		return $this->get( 'LIN_percent' );
302
+		return $this->get('LIN_percent');
303 303
 	}
304 304
 
305 305
 
@@ -308,8 +308,8 @@  discard block
 block discarded – undo
308 308
 	 * Sets percent (between 100-0.01)
309 309
 	 * @param float $percent
310 310
 	 */
311
-	public function set_percent( $percent ) {
312
-		$this->set( 'LIN_percent', $percent );
311
+	public function set_percent($percent) {
312
+		$this->set('LIN_percent', $percent);
313 313
 	}
314 314
 
315 315
 
@@ -319,7 +319,7 @@  discard block
 block discarded – undo
319 319
 	 * @return float
320 320
 	 */
321 321
 	public function total() {
322
-		return $this->get( 'LIN_total' );
322
+		return $this->get('LIN_total');
323 323
 	}
324 324
 
325 325
 
@@ -328,8 +328,8 @@  discard block
 block discarded – undo
328 328
 	 * Sets total
329 329
 	 * @param float $total
330 330
 	 */
331
-	public function set_total( $total ) {
332
-		$this->set( 'LIN_total', $total );
331
+	public function set_total($total) {
332
+		$this->set('LIN_total', $total);
333 333
 	}
334 334
 
335 335
 
@@ -339,7 +339,7 @@  discard block
 block discarded – undo
339 339
 	 * @return int
340 340
 	 */
341 341
 	public function order() {
342
-		return $this->get( 'LIN_order' );
342
+		return $this->get('LIN_order');
343 343
 	}
344 344
 
345 345
 
@@ -348,8 +348,8 @@  discard block
 block discarded – undo
348 348
 	 * Sets order
349 349
 	 * @param int $order
350 350
 	 */
351
-	public function set_order( $order ) {
352
-		$this->set( 'LIN_order', $order );
351
+	public function set_order($order) {
352
+		$this->set('LIN_order', $order);
353 353
 	}
354 354
 
355 355
 
@@ -359,7 +359,7 @@  discard block
 block discarded – undo
359 359
 	 * @return int
360 360
 	 */
361 361
 	public function parent_ID() {
362
-		return $this->get( 'LIN_parent' );
362
+		return $this->get('LIN_parent');
363 363
 	}
364 364
 
365 365
 
@@ -368,8 +368,8 @@  discard block
 block discarded – undo
368 368
 	 * Sets parent
369 369
 	 * @param int $parent
370 370
 	 */
371
-	public function set_parent_ID( $parent ) {
372
-		$this->set( 'LIN_parent', $parent );
371
+	public function set_parent_ID($parent) {
372
+		$this->set('LIN_parent', $parent);
373 373
 	}
374 374
 
375 375
 
@@ -379,7 +379,7 @@  discard block
 block discarded – undo
379 379
 	 * @return string
380 380
 	 */
381 381
 	public function type() {
382
-		return $this->get( 'LIN_type' );
382
+		return $this->get('LIN_type');
383 383
 	}
384 384
 
385 385
 
@@ -388,8 +388,8 @@  discard block
 block discarded – undo
388 388
 	 * Sets type
389 389
 	 * @param string $type
390 390
 	 */
391
-	public function set_type( $type ) {
392
-		$this->set( 'LIN_type', $type );
391
+	public function set_type($type) {
392
+		$this->set('LIN_type', $type);
393 393
 	}
394 394
 
395 395
 
@@ -402,8 +402,8 @@  discard block
 block discarded – undo
402 402
 	 * @return EE_Line_Item
403 403
 	 */
404 404
 	public function parent() {
405
-		if( $this->ID() ) {
406
-			return $this->get_model()->get_one_by_ID( $this->parent_ID() );
405
+		if ($this->ID()) {
406
+			return $this->get_model()->get_one_by_ID($this->parent_ID());
407 407
 		} else {
408 408
 			return $this->_parent;
409 409
 		}
@@ -416,13 +416,13 @@  discard block
 block discarded – undo
416 416
 	 * @return EE_Line_Item[]
417 417
 	 */
418 418
 	public function children() {
419
-		if ( $this->ID() ) {
419
+		if ($this->ID()) {
420 420
 			return $this->get_model()->get_all(
421 421
 					array(
422
-						array( 'LIN_parent' => $this->ID() ),
423
-						'order_by' => array( 'LIN_order' => 'ASC' ) ) );
422
+						array('LIN_parent' => $this->ID()),
423
+						'order_by' => array('LIN_order' => 'ASC') ) );
424 424
 		} else {
425
-			if ( ! is_array( $this->_children ) ) {
425
+			if ( ! is_array($this->_children)) {
426 426
 				$this->_children = array();
427 427
 			}
428 428
 			return $this->_children;
@@ -436,7 +436,7 @@  discard block
 block discarded – undo
436 436
 	 * @return string
437 437
 	 */
438 438
 	public function code() {
439
-		return $this->get( 'LIN_code' );
439
+		return $this->get('LIN_code');
440 440
 	}
441 441
 
442 442
 
@@ -445,8 +445,8 @@  discard block
 block discarded – undo
445 445
 	 * Sets code
446 446
 	 * @param string $code
447 447
 	 */
448
-	public function set_code( $code ) {
449
-		$this->set( 'LIN_code', $code );
448
+	public function set_code($code) {
449
+		$this->set('LIN_code', $code);
450 450
 	}
451 451
 
452 452
 
@@ -456,7 +456,7 @@  discard block
 block discarded – undo
456 456
 	 * @return boolean
457 457
 	 */
458 458
 	public function is_taxable() {
459
-		return $this->get( 'LIN_is_taxable' );
459
+		return $this->get('LIN_is_taxable');
460 460
 	}
461 461
 
462 462
 
@@ -465,8 +465,8 @@  discard block
 block discarded – undo
465 465
 	 * Sets is_taxable
466 466
 	 * @param boolean $is_taxable
467 467
 	 */
468
-	public function set_is_taxable( $is_taxable ) {
469
-		$this->set( 'LIN_is_taxable', $is_taxable );
468
+	public function set_is_taxable($is_taxable) {
469
+		$this->set('LIN_is_taxable', $is_taxable);
470 470
 	}
471 471
 
472 472
 
@@ -481,7 +481,7 @@  discard block
 block discarded – undo
481 481
 	 */
482 482
 	public function get_object() {
483 483
 		$model_name_of_related_obj = $this->OBJ_type();
484
-		return $this->get_model()->has_relation(  $model_name_of_related_obj ) ? $this->get_first_related( $model_name_of_related_obj ) : NULL;
484
+		return $this->get_model()->has_relation($model_name_of_related_obj) ? $this->get_first_related($model_name_of_related_obj) : NULL;
485 485
 	}
486 486
 
487 487
 
@@ -492,11 +492,11 @@  discard block
 block discarded – undo
492 492
 	 * @param array $query_params
493 493
 	 * @return EE_Ticket
494 494
 	 */
495
-	public function ticket( $query_params = array() ) {
495
+	public function ticket($query_params = array()) {
496 496
 		//we're going to assume that when this method is called we always want to receive the attached ticket EVEN if that ticket is archived.  This can be overridden via the incoming $query_params argument
497
-		$remove_defaults = array( 'default_where_conditions' => 'none' );
498
-		$query_params = array_merge( $remove_defaults, $query_params );
499
-		return $this->get_first_related( 'Ticket', $query_params );
497
+		$remove_defaults = array('default_where_conditions' => 'none');
498
+		$query_params = array_merge($remove_defaults, $query_params);
499
+		return $this->get_first_related('Ticket', $query_params);
500 500
 	}
501 501
 
502 502
 
@@ -506,11 +506,11 @@  discard block
 block discarded – undo
506 506
 	 * @return EE_Datetime | NULL
507 507
 	 */
508 508
 	public function get_ticket_datetime() {
509
-		if ( $this->OBJ_type() === 'Ticket' ) {
509
+		if ($this->OBJ_type() === 'Ticket') {
510 510
 			$ticket = $this->ticket();
511
-			if ( $ticket instanceof EE_Ticket ) {
511
+			if ($ticket instanceof EE_Ticket) {
512 512
 				$datetime = $ticket->first_datetime();
513
-				if ( $datetime instanceof EE_Datetime ) {
513
+				if ($datetime instanceof EE_Datetime) {
514 514
 					return $datetime;
515 515
 				}
516 516
 			}
@@ -526,9 +526,9 @@  discard block
 block discarded – undo
526 526
 	 * @return string
527 527
 	 */
528 528
 	public function ticket_event_name() {
529
-		$event_name = __( "Unknown", "event_espresso" );
529
+		$event_name = __("Unknown", "event_espresso");
530 530
 		$event = $this->ticket_event();
531
-		if ( $event instanceof EE_Event ) {
531
+		if ($event instanceof EE_Event) {
532 532
 			$event_name = $event->name();
533 533
 		}
534 534
 		return $event_name;
@@ -542,9 +542,9 @@  discard block
 block discarded – undo
542 542
 	public function ticket_event() {
543 543
 		$event = null;
544 544
 		$ticket = $this->ticket();
545
-		if ( $ticket instanceof EE_Ticket ) {
545
+		if ($ticket instanceof EE_Ticket) {
546 546
 			$datetime = $ticket->first_datetime();
547
-			if ( $datetime instanceof EE_Datetime ) {
547
+			if ($datetime instanceof EE_Datetime) {
548 548
 				$event = $datetime->event();
549 549
 			}
550 550
 		}
@@ -559,11 +559,11 @@  discard block
 block discarded – undo
559 559
 	 * @param string $time_format
560 560
 	 * @return string
561 561
 	 */
562
-	public function ticket_datetime_start( $date_format = '', $time_format = '' ) {
563
-		$first_datetime_string = __( "Unknown", "event_espresso" );
562
+	public function ticket_datetime_start($date_format = '', $time_format = '') {
563
+		$first_datetime_string = __("Unknown", "event_espresso");
564 564
 		$datetime = $this->get_ticket_datetime();
565
-		if ( $datetime ) {
566
-			$first_datetime_string = $datetime->start_date_and_time( $date_format, $time_format );
565
+		if ($datetime) {
566
+			$first_datetime_string = $datetime->start_date_and_time($date_format, $time_format);
567 567
 		}
568 568
 		return $first_datetime_string;
569 569
 	}
@@ -578,26 +578,26 @@  discard block
 block discarded – undo
578 578
 	 * @return bool success
579 579
 	 * @throws \EE_Error
580 580
 	 */
581
-	public function add_child_line_item( EEI_Line_Item $line_item, $set_order = true ) {
581
+	public function add_child_line_item(EEI_Line_Item $line_item, $set_order = true) {
582 582
 		// should we calculate the LIN_order for this line item ?
583
-		if ( $set_order || $line_item->order() === null ) {
584
-			$line_item->set_order( count( $this->children() ) );
583
+		if ($set_order || $line_item->order() === null) {
584
+			$line_item->set_order(count($this->children()));
585 585
 		}
586
-		if ( $this->ID() ) {
586
+		if ($this->ID()) {
587 587
 			//check for any duplicate line items (with the same code), if so, this replaces it
588
-			$line_item_with_same_code = $this->get_child_line_item(  $line_item->code() );
589
-			if( $line_item_with_same_code instanceof EE_Line_Item && $line_item_with_same_code !== $line_item ) {
590
-				$this->delete_child_line_item( $line_item_with_same_code->code() );
588
+			$line_item_with_same_code = $this->get_child_line_item($line_item->code());
589
+			if ($line_item_with_same_code instanceof EE_Line_Item && $line_item_with_same_code !== $line_item) {
590
+				$this->delete_child_line_item($line_item_with_same_code->code());
591 591
 			}
592
-			$line_item->set_parent_ID( $this->ID() );
593
-			if( $this->TXN_ID() ){
594
-				$line_item->set_TXN_ID( $this->TXN_ID() );
592
+			$line_item->set_parent_ID($this->ID());
593
+			if ($this->TXN_ID()) {
594
+				$line_item->set_TXN_ID($this->TXN_ID());
595 595
 			}
596 596
 			return $line_item->save();
597 597
 		} else {
598
-			$this->_children[ $line_item->code() ] = $line_item;
599
-			if( $line_item->parent() != $this ) {
600
-				$line_item->set_parent( $this );
598
+			$this->_children[$line_item->code()] = $line_item;
599
+			if ($line_item->parent() != $this) {
600
+				$line_item->set_parent($this);
601 601
 			}
602 602
 			return TRUE;
603 603
 		}
@@ -611,16 +611,16 @@  discard block
 block discarded – undo
611 611
 	 * @param EE_Line_Item $line_item
612 612
 	 *
613 613
 	 */
614
-	public function set_parent( $line_item ) {
615
-		if ( $this->ID() ) {
616
-			if( ! $line_item->ID() ) {
614
+	public function set_parent($line_item) {
615
+		if ($this->ID()) {
616
+			if ( ! $line_item->ID()) {
617 617
 				$line_item->save();
618 618
 			}
619
-			$this->set_parent_ID( $line_item->ID() );
619
+			$this->set_parent_ID($line_item->ID());
620 620
 			$this->save();
621 621
 		} else {
622 622
 			$this->_parent = $line_item;
623
-			$this->set_parent_ID( $line_item->ID() );
623
+			$this->set_parent_ID($line_item->ID());
624 624
 		}
625 625
 	}
626 626
 
@@ -633,11 +633,11 @@  discard block
 block discarded – undo
633 633
 	 * @param string $code
634 634
 	 * @return EE_Line_Item
635 635
 	 */
636
-	public function get_child_line_item( $code ) {
637
-		if ( $this->ID() ) {
638
-			return $this->get_model()->get_one( array( array( 'LIN_parent' => $this->ID(), 'LIN_code' => $code ) ) );
636
+	public function get_child_line_item($code) {
637
+		if ($this->ID()) {
638
+			return $this->get_model()->get_one(array(array('LIN_parent' => $this->ID(), 'LIN_code' => $code)));
639 639
 		} else {
640
-			return isset( $this->_children[ $code ] ) ? $this->_children[ $code ] : null;
640
+			return isset($this->_children[$code]) ? $this->_children[$code] : null;
641 641
 		}
642 642
 	}
643 643
 
@@ -648,10 +648,10 @@  discard block
 block discarded – undo
648 648
 	 * @return int
649 649
 	 */
650 650
 	public function delete_children_line_items() {
651
-		if ( $this->ID() ) {
652
-			return $this->get_model()->delete( array( array( 'LIN_parent' => $this->ID() ) ) );
651
+		if ($this->ID()) {
652
+			return $this->get_model()->delete(array(array('LIN_parent' => $this->ID())));
653 653
 		} else {
654
-			$count = count( $this->_children );
654
+			$count = count($this->_children);
655 655
 			$this->_children = array();
656 656
 			return $count;
657 657
 		}
@@ -668,25 +668,25 @@  discard block
 block discarded – undo
668 668
 	 * @param bool $stop_search_once_found
669 669
 	 * @return int count of items deleted (or simply removed from the line item's cache, if not has not been saved to the DB yet)
670 670
 	 */
671
-	public function delete_child_line_item( $code, $stop_search_once_found = true ) {
672
-		if ( $this->ID() ) {
671
+	public function delete_child_line_item($code, $stop_search_once_found = true) {
672
+		if ($this->ID()) {
673 673
 			$items_deleted = 0;
674
-			if( $this->code() == $code ) {
675
-				$items_deleted += EEH_Line_Item::delete_all_child_items( $this );
674
+			if ($this->code() == $code) {
675
+				$items_deleted += EEH_Line_Item::delete_all_child_items($this);
676 676
 				$items_deleted += (int) $this->delete();
677
-				if( $stop_search_once_found ){
677
+				if ($stop_search_once_found) {
678 678
 					return $items_deleted;
679 679
 				}
680 680
 			}
681
-			foreach( $this->children() as $child_line_item ) {
682
-				$items_deleted += $child_line_item->delete_child_line_item( $code, $stop_search_once_found );
681
+			foreach ($this->children() as $child_line_item) {
682
+				$items_deleted += $child_line_item->delete_child_line_item($code, $stop_search_once_found);
683 683
 			}
684 684
 			return $items_deleted;
685 685
 		} else {
686
-			if( isset( $this->_children[ $code ] ) ) {
687
-				unset( $this->_children[ $code ] );
686
+			if (isset($this->_children[$code])) {
687
+				unset($this->_children[$code]);
688 688
 				return 1;
689
-			}else{
689
+			} else {
690 690
 				return 0;
691 691
 			}
692 692
 		}
@@ -699,9 +699,9 @@  discard block
 block discarded – undo
699 699
 	 * @return boolean
700 700
 	 */
701 701
 	public function delete_if_childless_subtotal() {
702
-		if( $this->ID() &&
702
+		if ($this->ID() &&
703 703
 				$this->type() == EEM_Line_Item::type_sub_total &&
704
-				! $this->children() ) {
704
+				! $this->children()) {
705 705
 			return $this->delete();
706 706
 		} else {
707 707
 			return false;
@@ -716,7 +716,7 @@  discard block
 block discarded – undo
716 716
 	 */
717 717
 	public function generate_code() {
718 718
 		// each line item in the cart requires a unique identifier
719
-		return md5( $this->get( 'OBJ_type' ) . $this->get( 'OBJ_ID' ) . microtime() );
719
+		return md5($this->get('OBJ_type').$this->get('OBJ_ID').microtime());
720 720
 	}
721 721
 
722 722
 
@@ -799,7 +799,7 @@  discard block
 block discarded – undo
799 799
 	 * @return string like '2, 004.00', formatted according to the localized currency
800 800
 	 */
801 801
 	public function unit_price_no_code() {
802
-		return $this->get_pretty( 'LIN_unit_price', 'no_currency_code' );
802
+		return $this->get_pretty('LIN_unit_price', 'no_currency_code');
803 803
 	}
804 804
 
805 805
 
@@ -809,7 +809,7 @@  discard block
 block discarded – undo
809 809
 	 * @return string like '2, 004.00', formatted according to the localized currency
810 810
 	 */
811 811
 	public function total_no_code() {
812
-		return $this->get_pretty( 'LIN_total', 'no_currency_code' );
812
+		return $this->get_pretty('LIN_total', 'no_currency_code');
813 813
 	}
814 814
 
815 815
 
@@ -829,17 +829,17 @@  discard block
 block discarded – undo
829 829
 		$tax_total = $this->recalculate_taxes_and_tax_total();
830 830
 		$total = $pre_tax_total + $tax_total;
831 831
 		// no negative totals plz
832
-		$total = max( $total, 0 );
833
-		$this->set_total( $total );
832
+		$total = max($total, 0);
833
+		$this->set_total($total);
834 834
 		//only update the related transaction's total
835 835
 		//if we intend to save this line item and its a grand total
836
-		if(
836
+		if (
837 837
 			$this->allow_persist() &&
838 838
 			$this->type() === EEM_Line_Item::type_total &&
839 839
 			$this->transaction() instanceof EE_Transaction
840
-		){
841
-			$this->transaction()->set_total( $total );
842
-			if ( $this->transaction()->ID() ) {
840
+		) {
841
+			$this->transaction()->set_total($total);
842
+			if ($this->transaction()->ID()) {
843 843
 				$this->transaction()->save();
844 844
 			}
845 845
 		}
@@ -858,47 +858,47 @@  discard block
 block discarded – undo
858 858
 	public function recalculate_pre_tax_total() {
859 859
 		$total = 0;
860 860
 		$my_children = $this->children();
861
-		$has_children = ! empty( $my_children );
862
-		if ( $has_children && $this->is_line_item() ) {
863
-			$total = $this->_recalculate_pretax_total_for_line_item( $total, $my_children );
864
-		} elseif ( ! $has_children && ( $this->is_sub_line_item() || $this->is_line_item() ) ) {
861
+		$has_children = ! empty($my_children);
862
+		if ($has_children && $this->is_line_item()) {
863
+			$total = $this->_recalculate_pretax_total_for_line_item($total, $my_children);
864
+		} elseif ( ! $has_children && ($this->is_sub_line_item() || $this->is_line_item())) {
865 865
 			$total = $this->unit_price() * $this->quantity();
866
-		} elseif( $this->is_sub_total() || $this->is_total() ) {
867
-			$total = $this->_recalculate_pretax_total_for_subtotal( $total, $my_children );
868
-		} elseif ( $this->is_tax_sub_total() || $this->is_tax() || $this->is_cancelled() ) {
866
+		} elseif ($this->is_sub_total() || $this->is_total()) {
867
+			$total = $this->_recalculate_pretax_total_for_subtotal($total, $my_children);
868
+		} elseif ($this->is_tax_sub_total() || $this->is_tax() || $this->is_cancelled()) {
869 869
 			// completely ignore tax totals, tax sub-totals, and cancelled line items, when calculating the pre-tax-total
870 870
 			return 0;
871 871
 		}
872 872
 		// ensure all non-line items and non-sub-line-items have a quantity of 1 (except for Events)
873
-		if(
873
+		if (
874 874
 			! $this->is_line_item() &&
875 875
 			! $this->is_sub_line_item() &&
876 876
 			! $this->is_cancellation()
877 877
 		) {
878
-			if ( $this->OBJ_type() !== 'Event' ) {
879
-				$this->set_quantity( 1 );
878
+			if ($this->OBJ_type() !== 'Event') {
879
+				$this->set_quantity(1);
880 880
 			}
881
-			if( ! $this->is_percent() ) {
882
-				$this->set_unit_price( $this->total() );
881
+			if ( ! $this->is_percent()) {
882
+				$this->set_unit_price($this->total());
883 883
 			}
884 884
 		}
885 885
 
886 886
 		//we don't want to bother saving grand totals, because that needs to factor in taxes anyways
887 887
 		//so it ought to be
888
-		if( ! $this->is_total() ) {
889
-			$this->set_total( $total );
888
+		if ( ! $this->is_total()) {
889
+			$this->set_total($total);
890 890
 			//if not a percent line item, make sure we keep the unit price in sync
891
-			if(
891
+			if (
892 892
 				$has_children
893 893
 				&& $this->is_line_item()
894 894
 				&& ! $this->is_percent()
895 895
 			) {
896
-				if( $this->quantity() === 0 ){
896
+				if ($this->quantity() === 0) {
897 897
 					$new_unit_price = 0;
898 898
 				} else {
899 899
 					$new_unit_price = $this->total() / $this->quantity();
900 900
 				}
901
-				$this->set_unit_price( $new_unit_price );
901
+				$this->set_unit_price($new_unit_price);
902 902
 			}
903 903
 			$this->maybe_save();
904 904
 		}
@@ -918,39 +918,39 @@  discard block
 block discarded – undo
918 918
 	 * @return float
919 919
 	 * @throws \EE_Error
920 920
 	 */
921
-	protected function _recalculate_pretax_total_for_subtotal( $calculated_total_so_far, $my_children = null ) {
922
-		if( $my_children === null ) {
921
+	protected function _recalculate_pretax_total_for_subtotal($calculated_total_so_far, $my_children = null) {
922
+		if ($my_children === null) {
923 923
 			$my_children = $this->children();
924 924
 		}
925 925
 		//get the total of all its children
926
-		foreach ( $my_children as $child_line_item ) {
927
-			if ( $child_line_item instanceof EE_Line_Item && ! $child_line_item->is_cancellation() ) {
926
+		foreach ($my_children as $child_line_item) {
927
+			if ($child_line_item instanceof EE_Line_Item && ! $child_line_item->is_cancellation()) {
928 928
 				// percentage line items are based on total so far
929
-				if ( $child_line_item->is_percent() ) {
929
+				if ($child_line_item->is_percent()) {
930 930
 					//round as we go so that the line items add up ok
931 931
 					$percent_total = round(
932 932
 						$calculated_total_so_far * $child_line_item->percent() / 100,
933 933
 						EE_Registry::instance()->CFG->currency->dec_plc
934 934
 					);
935
-					$child_line_item->set_total( $percent_total );
935
+					$child_line_item->set_total($percent_total);
936 936
 					//so far all percent line items should have a quantity of 1
937 937
 					//(ie, no double percent discounts. Although that might be requested someday)
938
-					$child_line_item->set_quantity( 1 );
938
+					$child_line_item->set_quantity(1);
939 939
 					$child_line_item->maybe_save();
940 940
 					$calculated_total_so_far += $percent_total;
941 941
 				} else {
942 942
 					//verify flat sub-line-item quantities match their parent
943
-					if( $child_line_item->is_sub_line_item() ) {
944
-						$child_line_item->set_quantity( $this->quantity() );
943
+					if ($child_line_item->is_sub_line_item()) {
944
+						$child_line_item->set_quantity($this->quantity());
945 945
 					}
946 946
 					$calculated_total_so_far += $child_line_item->recalculate_pre_tax_total();
947 947
 				}
948 948
 			}
949 949
 		}
950 950
 
951
-		if( $this->is_sub_total() ){
951
+		if ($this->is_sub_total()) {
952 952
 			// no negative totals plz
953
-			$calculated_total_so_far = max( $calculated_total_so_far, 0 );
953
+			$calculated_total_so_far = max($calculated_total_so_far, 0);
954 954
 		}
955 955
 		return $calculated_total_so_far;
956 956
 	}
@@ -968,8 +968,8 @@  discard block
 block discarded – undo
968 968
 	 * @return float
969 969
 	 * @throws \EE_Error
970 970
 	 */
971
-	protected function _recalculate_pretax_total_for_line_item( $calculated_total_so_far, $my_children = null ) {
972
-		if( $my_children === null ) {
971
+	protected function _recalculate_pretax_total_for_line_item($calculated_total_so_far, $my_children = null) {
972
+		if ($my_children === null) {
973 973
 			$my_children = $this->children();
974 974
 		}
975 975
 		//we need to keep track of the running total for a single item,
@@ -977,10 +977,10 @@  discard block
 block discarded – undo
977 977
 		$unit_price_for_total = 0;
978 978
 		$quantity_for_total = 1;
979 979
 		//get the total of all its children
980
-		foreach ( $my_children as $child_line_item ) {
981
-			if ( $child_line_item instanceof EE_Line_Item &&
980
+		foreach ($my_children as $child_line_item) {
981
+			if ($child_line_item instanceof EE_Line_Item &&
982 982
 					! $child_line_item->is_cancellation()) {
983
-				if ( $child_line_item->is_percent() ) {
983
+				if ($child_line_item->is_percent()) {
984 984
 					//it should be the unit-price-so-far multiplied by teh percent multiplied by the quantity
985 985
 					//not total multiplied by percent, because that ignores rounding along-the-way
986 986
 					$percent_unit_price = round(
@@ -988,17 +988,17 @@  discard block
 block discarded – undo
988 988
 						EE_Registry::instance()->CFG->currency->dec_plc
989 989
 					);
990 990
 					$percent_total = $percent_unit_price * $quantity_for_total;
991
-					$child_line_item->set_total( $percent_total );
991
+					$child_line_item->set_total($percent_total);
992 992
 					//so far all percent line items should have a quantity of 1
993 993
 					//(ie, no double percent discounts. Although that might be requested someday)
994
-					$child_line_item->set_quantity( 1 );
994
+					$child_line_item->set_quantity(1);
995 995
 					$child_line_item->maybe_save();
996 996
 					$calculated_total_so_far += $percent_total;
997 997
 					$unit_price_for_total += $percent_unit_price;
998 998
 				} else {
999 999
 					//verify flat sub-line-item quantities match their parent
1000
-					if( $child_line_item->is_sub_line_item() ) {
1001
-						$child_line_item->set_quantity( $this->quantity() );
1000
+					if ($child_line_item->is_sub_line_item()) {
1001
+						$child_line_item->set_quantity($this->quantity());
1002 1002
 					}
1003 1003
 					$quantity_for_total = $child_line_item->quantity();
1004 1004
 					$calculated_total_so_far += $child_line_item->recalculate_pre_tax_total();
@@ -1022,10 +1022,10 @@  discard block
 block discarded – undo
1022 1022
 		//calculate the pretax total
1023 1023
 		$taxable_total = $this->taxable_total();
1024 1024
 		$tax_total = 0;
1025
-		foreach ( $taxes as $tax ) {
1025
+		foreach ($taxes as $tax) {
1026 1026
 			$total_on_this_tax = $taxable_total * $tax->percent() / 100;
1027 1027
 			//remember the total on this line item
1028
-			$tax->set_total( $total_on_this_tax );
1028
+			$tax->set_total($total_on_this_tax);
1029 1029
 			$tax_total += $tax->total();
1030 1030
 		}
1031 1031
 		$this->_recalculate_tax_sub_total();
@@ -1039,21 +1039,21 @@  discard block
 block discarded – undo
1039 1039
 	 * @return void
1040 1040
 	 */
1041 1041
 	private function _recalculate_tax_sub_total() {
1042
-		if ( $this->is_tax_sub_total() ) {
1042
+		if ($this->is_tax_sub_total()) {
1043 1043
 			$total = 0;
1044 1044
 			$total_percent = 0;
1045 1045
 			//simply loop through all its children (which should be taxes) and sum their total
1046
-			foreach ( $this->children() as $child_tax ) {
1047
-				if ( $child_tax instanceof EE_Line_Item ) {
1046
+			foreach ($this->children() as $child_tax) {
1047
+				if ($child_tax instanceof EE_Line_Item) {
1048 1048
 					$total += $child_tax->total();
1049 1049
 					$total_percent += $child_tax->percent();
1050 1050
 				}
1051 1051
 			}
1052
-			$this->set_total( $total );
1053
-			$this->set_percent( $total_percent );
1054
-		} elseif ( $this->is_total() ) {
1055
-			foreach ( $this->children() as $maybe_tax_subtotal ) {
1056
-				if ( $maybe_tax_subtotal instanceof EE_Line_Item ) {
1052
+			$this->set_total($total);
1053
+			$this->set_percent($total_percent);
1054
+		} elseif ($this->is_total()) {
1055
+			foreach ($this->children() as $maybe_tax_subtotal) {
1056
+				if ($maybe_tax_subtotal instanceof EE_Line_Item) {
1057 1057
 					$maybe_tax_subtotal->_recalculate_tax_sub_total();
1058 1058
 				}
1059 1059
 			}
@@ -1069,8 +1069,8 @@  discard block
 block discarded – undo
1069 1069
 	public function get_total_tax() {
1070 1070
 		$this->_recalculate_tax_sub_total();
1071 1071
 		$total = 0;
1072
-		foreach ( $this->tax_descendants() as $tax_line_item ) {
1073
-			if ( $tax_line_item instanceof EE_Line_Item ) {
1072
+		foreach ($this->tax_descendants() as $tax_line_item) {
1073
+			if ($tax_line_item instanceof EE_Line_Item) {
1074 1074
 				$total += $tax_line_item->total();
1075 1075
 			}
1076 1076
 		}
@@ -1084,15 +1084,15 @@  discard block
 block discarded – undo
1084 1084
 	 */
1085 1085
 	public function get_items_total() {
1086 1086
 		//by default, let's make sure we're consistent with the existing line item
1087
-		if( $this->is_total() ) {
1088
-			$pretax_subtotal_li = EEH_Line_Item::get_pre_tax_subtotal( $this );
1089
-			if( $pretax_subtotal_li instanceof EE_Line_Item ) {
1087
+		if ($this->is_total()) {
1088
+			$pretax_subtotal_li = EEH_Line_Item::get_pre_tax_subtotal($this);
1089
+			if ($pretax_subtotal_li instanceof EE_Line_Item) {
1090 1090
 				return $pretax_subtotal_li->total();
1091 1091
 			}
1092 1092
 		}
1093 1093
 		$total = 0;
1094
-		foreach ( $this->get_items() as $item ) {
1095
-			if ( $item instanceof EE_Line_Item ) {
1094
+		foreach ($this->get_items() as $item) {
1095
+			if ($item instanceof EE_Line_Item) {
1096 1096
 				$total += $item->total();
1097 1097
 			}
1098 1098
 		}
@@ -1107,7 +1107,7 @@  discard block
 block discarded – undo
1107 1107
 	 * @return EE_Line_Item[]
1108 1108
 	 */
1109 1109
 	public function tax_descendants() {
1110
-		return EEH_Line_Item::get_tax_descendants( $this );
1110
+		return EEH_Line_Item::get_tax_descendants($this);
1111 1111
 	}
1112 1112
 
1113 1113
 
@@ -1117,7 +1117,7 @@  discard block
 block discarded – undo
1117 1117
 	 * @return EE_Line_Item[]
1118 1118
 	 */
1119 1119
 	public function get_items() {
1120
-		return EEH_Line_Item::get_line_item_descendants( $this );
1120
+		return EEH_Line_Item::get_line_item_descendants($this);
1121 1121
 	}
1122 1122
 
1123 1123
 
@@ -1133,22 +1133,22 @@  discard block
 block discarded – undo
1133 1133
 	 */
1134 1134
 	public function taxable_total() {
1135 1135
 		$total = 0;
1136
-		if ( $this->children() ) {
1137
-			foreach ( $this->children() as $child_line_item ) {
1138
-				if ( $child_line_item->type() === EEM_Line_Item::type_line_item && $child_line_item->is_taxable()) {
1136
+		if ($this->children()) {
1137
+			foreach ($this->children() as $child_line_item) {
1138
+				if ($child_line_item->type() === EEM_Line_Item::type_line_item && $child_line_item->is_taxable()) {
1139 1139
 					//if it's a percent item, only take into account the percent
1140 1140
 					//that's taxable too (the taxable total so far)
1141
-					if( $child_line_item->is_percent() ) {
1142
-						$total = $total + ( $total * $child_line_item->percent() / 100 );
1143
-					}else{
1141
+					if ($child_line_item->is_percent()) {
1142
+						$total = $total + ($total * $child_line_item->percent() / 100);
1143
+					} else {
1144 1144
 						$total += $child_line_item->total();
1145 1145
 					}
1146
-				}elseif( $child_line_item->type() === EEM_Line_Item::type_sub_total ){
1146
+				}elseif ($child_line_item->type() === EEM_Line_Item::type_sub_total) {
1147 1147
 					$total += $child_line_item->taxable_total();
1148 1148
 				}
1149 1149
 			}
1150 1150
 		}
1151
-		return max( $total, 0 );
1151
+		return max($total, 0);
1152 1152
 	}
1153 1153
 
1154 1154
 
@@ -1158,7 +1158,7 @@  discard block
 block discarded – undo
1158 1158
 	 * @return EE_Transaction
1159 1159
 	 */
1160 1160
 	public function transaction() {
1161
-		return $this->get_first_related( 'Transaction' );
1161
+		return $this->get_first_related('Transaction');
1162 1162
 	}
1163 1163
 
1164 1164
 
@@ -1171,18 +1171,18 @@  discard block
 block discarded – undo
1171 1171
 	 * @param int $txn_id if none is provided, assumes $this->TXN_ID()
1172 1172
 	 * @return int count of items saved
1173 1173
 	 */
1174
-	public function save_this_and_descendants_to_txn( $txn_id = NULL ) {
1174
+	public function save_this_and_descendants_to_txn($txn_id = NULL) {
1175 1175
 		$count = 0;
1176
-		if ( ! $txn_id ) {
1176
+		if ( ! $txn_id) {
1177 1177
 			$txn_id = $this->TXN_ID();
1178 1178
 		}
1179
-		$this->set_TXN_ID( $txn_id );
1179
+		$this->set_TXN_ID($txn_id);
1180 1180
 		$children = $this->children();
1181 1181
 		$count += $this->save() ? 1 : 0;
1182
-		foreach ( $children as $child_line_item ) {
1183
-			if ( $child_line_item instanceof EE_Line_Item ) {
1184
-				$child_line_item->set_parent_ID( $this->ID() );
1185
-				$count += $child_line_item->save_this_and_descendants_to_txn( $txn_id );
1182
+		foreach ($children as $child_line_item) {
1183
+			if ($child_line_item instanceof EE_Line_Item) {
1184
+				$child_line_item->set_parent_ID($this->ID());
1185
+				$count += $child_line_item->save_this_and_descendants_to_txn($txn_id);
1186 1186
 			}
1187 1187
 		}
1188 1188
 		return $count;
@@ -1199,9 +1199,9 @@  discard block
 block discarded – undo
1199 1199
 		$count = 0;
1200 1200
 		$children = $this->children();
1201 1201
 		$count += $this->save() ? 1 : 0;
1202
-		foreach ( $children as $child_line_item ) {
1203
-			if ( $child_line_item instanceof EE_Line_Item ) {
1204
-				$child_line_item->set_parent_ID( $this->ID() );
1202
+		foreach ($children as $child_line_item) {
1203
+			if ($child_line_item instanceof EE_Line_Item) {
1204
+				$child_line_item->set_parent_ID($this->ID());
1205 1205
 				$count += $child_line_item->save_this_and_descendants();
1206 1206
 			}
1207 1207
 		}
@@ -1215,8 +1215,8 @@  discard block
 block discarded – undo
1215 1215
 	 * @return EE_Line_Item[]
1216 1216
 	 */
1217 1217
 	public function get_cancellations() {
1218
-		EE_Registry::instance()->load_helper( 'Line_Item' );
1219
-		return EEH_Line_Item::get_descendants_of_type( $this, EEM_Line_Item::type_cancellation );
1218
+		EE_Registry::instance()->load_helper('Line_Item');
1219
+		return EEH_Line_Item::get_descendants_of_type($this, EEM_Line_Item::type_cancellation);
1220 1220
 	}
1221 1221
 
1222 1222
 
@@ -1227,7 +1227,7 @@  discard block
 block discarded – undo
1227 1227
 	 * @return int count of items saved
1228 1228
 	 */
1229 1229
 	public function maybe_save() {
1230
-		if ( $this->ID() ) {
1230
+		if ($this->ID()) {
1231 1231
 			return $this->save();
1232 1232
 		}
1233 1233
 		return false;
Please login to merge, or discard this patch.
Indentation   +52 added lines, -52 removed lines patch added patch discarded remove patch
@@ -172,7 +172,7 @@  discard block
 block discarded – undo
172 172
 	 * Sets quantity
173 173
 	 * @param int $quantity
174 174
 	 */
175
-    public function set_quantity( $quantity ) {
175
+	public function set_quantity( $quantity ) {
176 176
 		$this->set( 'LIN_quantity', max( $quantity, 0 ) );
177 177
 	}
178 178
 
@@ -212,25 +212,25 @@  discard block
 block discarded – undo
212 212
 	 * Gets item_type
213 213
 	 * @return string
214 214
 	 */
215
-    public function OBJ_type_i18n() {
216
-	    $obj_type = $this->OBJ_type();
217
-        switch ($obj_type) {
218
-            case 'Event':
219
-                $obj_type = __('Event', 'event_espresso');
220
-                break;
221
-            case 'Price':
222
-                $obj_type = __('Price', 'event_espresso');
223
-                break;
224
-            case 'Promotion':
225
-                $obj_type = __('Promotion', 'event_espresso');
226
-                break;
227
-            case 'Ticket':
228
-                $obj_type = __('Ticket', 'event_espresso');
229
-                break;
230
-            case 'Transaction':
231
-                $obj_type = __('Transaction', 'event_espresso');
232
-                break;
233
-        }
215
+	public function OBJ_type_i18n() {
216
+		$obj_type = $this->OBJ_type();
217
+		switch ($obj_type) {
218
+			case 'Event':
219
+				$obj_type = __('Event', 'event_espresso');
220
+				break;
221
+			case 'Price':
222
+				$obj_type = __('Price', 'event_espresso');
223
+				break;
224
+			case 'Promotion':
225
+				$obj_type = __('Promotion', 'event_espresso');
226
+				break;
227
+			case 'Ticket':
228
+				$obj_type = __('Ticket', 'event_espresso');
229
+				break;
230
+			case 'Transaction':
231
+				$obj_type = __('Transaction', 'event_espresso');
232
+				break;
233
+		}
234 234
 		return apply_filters('FHEE__EE_Line_Item__OBJ_type_i18n', $obj_type, $this);
235 235
 	}
236 236
 
@@ -1244,48 +1244,48 @@  discard block
 block discarded – undo
1244 1244
 
1245 1245
 
1246 1246
 
1247
-    /**
1248
-     * @param bool $raw
1249
-     * @return int
1250
-     * @throws \EE_Error
1251
-     */
1252
-    public function timestamp($raw = false)
1253
-    {
1254
-        return $raw ? $this->get_raw('LIN_timestamp') : $this->get('LIN_timestamp');
1255
-    }
1247
+	/**
1248
+	 * @param bool $raw
1249
+	 * @return int
1250
+	 * @throws \EE_Error
1251
+	 */
1252
+	public function timestamp($raw = false)
1253
+	{
1254
+		return $raw ? $this->get_raw('LIN_timestamp') : $this->get('LIN_timestamp');
1255
+	}
1256 1256
 
1257 1257
 
1258 1258
 
1259 1259
 
1260
-    /************************* DEPRECATED *************************/
1260
+	/************************* DEPRECATED *************************/
1261 1261
 
1262 1262
 
1263 1263
 
1264
-    /**
1265
-     * @deprecated 4.6.0
1266
-     * @param string $type one of the constants on EEM_Line_Item
1267
-     * @return EE_Line_Item[]
1268
-     */
1269
-    protected function _get_descendants_of_type($type)
1270
-    {
1271
-        EE_Error::doing_it_wrong('EE_Line_Item::_get_descendants_of_type()',
1272
-            __('Method replaced with EEH_Line_Item::get_descendants_of_type()', 'event_espresso'), '4.6.0');
1273
-        return EEH_Line_Item::get_descendants_of_type($this, $type);
1274
-    }
1264
+	/**
1265
+	 * @deprecated 4.6.0
1266
+	 * @param string $type one of the constants on EEM_Line_Item
1267
+	 * @return EE_Line_Item[]
1268
+	 */
1269
+	protected function _get_descendants_of_type($type)
1270
+	{
1271
+		EE_Error::doing_it_wrong('EE_Line_Item::_get_descendants_of_type()',
1272
+			__('Method replaced with EEH_Line_Item::get_descendants_of_type()', 'event_espresso'), '4.6.0');
1273
+		return EEH_Line_Item::get_descendants_of_type($this, $type);
1274
+	}
1275 1275
 
1276 1276
 
1277 1277
 
1278
-    /**
1279
-     * @deprecated 4.6.0
1280
-     * @param string $type like one of the EEM_Line_Item::type_*
1281
-     * @return EE_Line_Item
1282
-     */
1283
-    public function get_nearest_descendant_of_type($type)
1284
-    {
1285
-        EE_Error::doing_it_wrong('EE_Line_Item::get_nearest_descendant_of_type()',
1286
-            __('Method replaced with EEH_Line_Item::get_nearest_descendant_of_type()', 'event_espresso'), '4.6.0');
1287
-        return EEH_Line_Item::get_nearest_descendant_of_type($this, $type);
1288
-    }
1278
+	/**
1279
+	 * @deprecated 4.6.0
1280
+	 * @param string $type like one of the EEM_Line_Item::type_*
1281
+	 * @return EE_Line_Item
1282
+	 */
1283
+	public function get_nearest_descendant_of_type($type)
1284
+	{
1285
+		EE_Error::doing_it_wrong('EE_Line_Item::get_nearest_descendant_of_type()',
1286
+			__('Method replaced with EEH_Line_Item::get_nearest_descendant_of_type()', 'event_espresso'), '4.6.0');
1287
+		return EEH_Line_Item::get_nearest_descendant_of_type($this, $type);
1288
+	}
1289 1289
 
1290 1290
 
1291 1291
 
Please login to merge, or discard this patch.
core/libraries/shortcodes/EE_Shortcodes.lib.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -352,7 +352,7 @@
 block discarded – undo
352 352
      *
353 353
      * Note: regex comes in part from the WP `get_shortcode_regex` expression in \wp-includes\shortcodes.php
354 354
      *
355
-     * @param $shortcode
355
+     * @param string $shortcode
356 356
      * @since 4.9.32
357 357
      * @return string
358 358
      */
Please login to merge, or discard this patch.
Indentation   +427 added lines, -427 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (! defined('EVENT_ESPRESSO_VERSION')) {
4
-    exit('NO direct script access allowed');
4
+	exit('NO direct script access allowed');
5 5
 }
6 6
 
7 7
 /**
@@ -30,432 +30,432 @@  discard block
 block discarded – undo
30 30
 abstract class EE_Shortcodes extends EE_Base
31 31
 {
32 32
 
33
-    /**
34
-     * holds label for library
35
-     * This is used for referencing the library label
36
-     *
37
-     * @access public
38
-     * @var string
39
-     */
40
-    public $label;
41
-
42
-
43
-    /**
44
-     * This property is used for referencing a short description of the library
45
-     *
46
-     * @access public
47
-     * @var string
48
-     */
49
-    public $description;
50
-
51
-
52
-    /**
53
-     * This will hold an array of shortcodes with the key as the shortcode ([shortcode]) and the value as a
54
-     * label/description for the shortcode.
55
-     *
56
-     * @access protected
57
-     * @var array
58
-     */
59
-    protected $_shortcodes;
60
-
61
-
62
-    /**
63
-     * This will hold the incoming data item sent to the parser method
64
-     *
65
-     * @access protected
66
-     * @var mixed (array|object)
67
-     */
68
-    protected $_data;
69
-
70
-
71
-    /**
72
-     * some shortcodes may require extra data to parse.  This property is provided for that.
73
-     *
74
-     * @var array
75
-     */
76
-    protected $_extra_data;
77
-
78
-
79
-    /**
80
-     * EE_messenger used to generate the template being parsed.
81
-     *
82
-     * @since 4.5.0
83
-     * @var EE_messenger
84
-     */
85
-    protected $_messenger;
86
-
87
-
88
-    /**
89
-     * message type used to generate the template being parsed.
90
-     *
91
-     * @since 4.5.0
92
-     * @var EE_message_type
93
-     */
94
-    protected $_message_type;
95
-
96
-
97
-    /**
98
-     * context used for the template being parsed
99
-     *
100
-     * @since 4.5.0
101
-     * @var string
102
-     */
103
-    protected $_context;
104
-
105
-
106
-    /**
107
-     * Specific Message Template Group ID
108
-     *
109
-     * @since 4.5.0
110
-     * @var int
111
-     */
112
-    protected $_GRP_ID;
113
-
114
-
115
-    /**
116
-     * @since 4.9.0
117
-     * @type EE_Message
118
-     */
119
-    protected $_message;
120
-
121
-
122
-    /**
123
-     * This will hold an instance of the EEH_Parse_Shortcodes helper that will be used when handling list type
124
-     * shortcodes
125
-     *
126
-     * @var EEH_Parse_Shortcodes
127
-     */
128
-    protected $_shortcode_helper;
129
-
130
-
131
-    public function __construct()
132
-    {
133
-        $this->_set_defaults();
134
-        $this->_init_props();
135
-    }
136
-
137
-
138
-    /**
139
-     * This sets the defaults for the properties.  Child classes will override these properties in their _init_props
140
-     * method
141
-     */
142
-    private function _set_defaults()
143
-    {
144
-        $this->name        = $this->description = '';
145
-        $this->_shortcodes = array();
146
-        $this->_set_shortcode_helper();
147
-    }
148
-
149
-
150
-    /**
151
-     * loads an instance of the EE_Shortcode_Parser helper when requested
152
-     */
153
-    protected function _set_shortcode_helper()
154
-    {
155
-        //get shortcode_replace instance- set when _get_messages is called in child...
156
-        $this->_shortcode_helper = new EEH_Parse_Shortcodes();
157
-    }
158
-
159
-
160
-    public function get_shortcode_helper()
161
-    {
162
-        if (! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
163
-            $this->_set_shortcode_helper();
164
-        }
165
-        return $this->_shortcode_helper;
166
-    }
167
-
168
-
169
-    /**
170
-     * This is the public method for kicking of the parser included with each child.  It can be overridden by child
171
-     * classes if necessary (see EE_Questions_Answers for example)
172
-     *
173
-     * @param  string               $shortcode  incoming shortcode to be parsed
174
-     * @param  mixed (object|array) $data       incoming data to be be used for parsing
175
-     * @param  mixed (object|array) $extra_data extra incoming data (usually EE_Messages_Addressee)
176
-     * @return string            parsed shortcode.
177
-     */
178
-    public function parser($shortcode, $data, $extra_data = array())
179
-    {
180
-
181
-        //filter setup shortcodes
182
-        $this->_shortcodes = $this->get_shortcodes();
183
-
184
-        //we need to setup any dynamic shortcodes so that they work with the array_key_exists
185
-        $sc           = preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
186
-        $sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
187
-
188
-        //first we want to make sure this is a valid shortcode
189
-        if (! array_key_exists($sc_to_verify, $this->_shortcodes)) {
190
-            return false;
191
-        } //get out, this parser doesn't handle the incoming shortcode.
192
-        $this->_data       = $data;
193
-        $this->_extra_data = $extra_data;
194
-        $this->_set_messages_properties();
195
-        $parsed = apply_filters('FHEE__' . get_class($this) . '__parser_after', $this->_parser($shortcode), $shortcode,
196
-            $data, $extra_data, $this);
197
-
198
-        //note the below filter applies to ALL shortcode parsers... be careful!
199
-        $parsed = apply_filters('FHEE__EE_Shortcodes__parser_after', $parsed, $shortcode, $data, $extra_data, $this);
200
-        return $parsed;
201
-    }
202
-
203
-
204
-    /**
205
-     * This method just returns the shortcodes in the $_shortcodes array property.
206
-     *
207
-     * @access public
208
-     * @return array array of shortcodes => description pairs
209
-     */
210
-    public function get_shortcodes()
211
-    {
212
-        $this->_shortcodes = apply_filters('FHEE__' . get_class($this) . '__shortcodes', $this->_shortcodes, $this);
213
-
214
-        //note the below filter applies to ALL shortcode parsers... be careful!
215
-        $this->_shortcodes = apply_filters('FHEE__EE_Shortcodes__shortcodes', $this->_shortcodes, $this);
216
-
217
-        return $this->_shortcodes;
218
-    }
219
-
220
-
221
-    /**
222
-     * Child classes use this method to set the $name, $description, and $_shortcodes properties.
223
-     *
224
-     * @abstract
225
-     * @access protected
226
-     * @return void
227
-     */
228
-    abstract protected function _init_props();
229
-
230
-
231
-    /**
232
-     * This method will give parsing instructions for each shortcode defined in the _shortcodes array.  Child methods
233
-     * will have to take care of handling.
234
-     *
235
-     * @abstract
236
-     * @access protected
237
-     * @param string               $shortcode the shortcode to be parsed.
238
-     * @param mixed (object|array) $data      incoming data for the parser.  The data could be either an object or
239
-     *                             array because there are some shortcodes that might be replaced by prepared data that
240
-     *                             has multiple items in a list (i.e. list of attendees in an event and we're showing
241
-     *                             fname/lname for each attendee).  In this case data will be in an array.  Otherwise
242
-     *                             the data shoudl be in a properly formatted object.  The
243
-     *                             EEH_Parse_Shortcodes.helper.php describes the data object we're expecting.
244
-     * @return string parsed shortcode
245
-     */
246
-    abstract protected function _parser($shortcode);
247
-
248
-
249
-    /**
250
-     * This just validates incoming data for list type shortcode parsers (and they call this method) to make sure it
251
-     * meets their requirements
252
-     *
253
-     * @return mixed (void|exception) If validation fails we'll throw an exception.
254
-     */
255
-    protected function _validate_list_requirements()
256
-    {
257
-
258
-        //first test to make sure we've got an array!
259
-        if (! is_array($this->_data)) {
260
-            throw new EE_Error(sprintf(__('Expecting an array for the data sent to %s. Instead it was %s',
261
-                'event_espresso'), get_class($this), gettype($this->_data)));
262
-        }
263
-
264
-        //next test to make sure we've got the required template in the index!
265
-        if (! isset($this->_data['template'])) {
266
-            throw new EE_Error(sprintf(__('The incoming data does not have the required template index in its array',
267
-                'event_espresso')));
268
-        }
269
-
270
-        //next test to make sure we've got got a data index in the incoming data array
271
-        if (! isset($this->_data['data'])) {
272
-            throw new EE_Error(__('The incoming data does not have the required data index in its array',
273
-                'event_espresso'));
274
-        }
275
-
276
-        //all is well let's make sure _extra_data always has the values needed.
277
-        //let's make sure that extra_data includes all templates (for later parsing if necessary)
278
-        if (empty($this->_extra_data) || (empty($this->_extra_data['data']) && empty($this->_extra_data['template']))) {
279
-            $this->_extra_data['data']     = $this->_data['data'];
280
-            $this->_extra_data['template'] = $this->_data['template'];
281
-        }
282
-
283
-    }
284
-
285
-
286
-    /**
287
-     * This returns any attributes that may be existing on an EE_Shortcode
288
-     *
289
-     * @since 4.5.0
290
-     * @param string $shortcode incoming shortcode
291
-     * @return array An array with the attributes
292
-     */
293
-    protected function _get_shortcode_attrs($shortcode)
294
-    {
295
-        //make sure the required wp helper function is present
296
-        //require the shortcode file if necessary
297
-        if (! function_exists('shortcode_parse_atts')) {
298
-            require_once(ABSPATH . WPINC . '/shortcodes.php');
299
-        }
300
-
301
-        //let's get any attributes that may be present and set the defaults.
302
-        $shortcode_to_parse = str_replace('[', '', str_replace(']', '', $shortcode));
303
-        return shortcode_parse_atts($shortcode_to_parse);
304
-    }
305
-
306
-
307
-    /**
308
-     * Conditional blocks are shortcode patterns with an opening conditional tag `[IF_*]` and a corresponding
309
-     * closing tag (eg `[/IF_*]`).  The content within the tags will be displayed/hidden depending on whatever conditions
310
-     * existed in the opening tag.  This method handles parsing the actual template to show/hide this conditional content.
311
-     *
312
-     * @since 4.9.32
313
-     *
314
-     * @param string $shortcode  This should be original shortcode as used in the template and passed to the parser.
315
-     * @param bool $show  true means the opening and closing tags are removed and the content is left showing, false
316
-     *                    means the opening and closing tags and the contained content are removed.
317
-     * @return string     The template for the shortcode is returned.
318
-     */
319
-    protected function _mutate_conditional_block_in_template($shortcode, $show = true)
320
-    {
321
-        //first let's get all the matches in the template for this particular shortcode.
322
-        preg_match_all('~' . $this->_get_conditional_block_regex($shortcode) . '~', $this->_data['template'], $matches);
323
-
324
-        if ($matches && is_array($matches[0]) && !empty($matches[0])) {
325
-            //we need to hide all instances of the matches
326
-            foreach ($matches[0] as $index => $content_to_show_or_hide) {
327
-                $content_to_show_or_hide = preg_quote($content_to_show_or_hide);
328
-                $replacement = $show ? $matches[4][$index] : '';
329
-                $this->_data['template'] = preg_replace(
330
-                    '~' . $content_to_show_or_hide . '~',
331
-                    $replacement,
332
-                    $this->_data['template']
333
-                );
334
-            }
335
-        }
336
-        //return $template
337
-        return $this->_data['template'];
338
-    }
339
-
340
-
341
-    /**
342
-     * This returns the regex pattern to use for conditional shortcodes parsing.
343
-     *
344
-     * Note: regex comes in part from the WP `get_shortcode_regex` expression in \wp-includes\shortcodes.php
345
-     *
346
-     * @param $shortcode
347
-     * @since 4.9.32
348
-     * @return string
349
-     */
350
-    private function _get_conditional_block_regex($shortcode)
351
-    {
352
-        //get just the shortcode tag for the match
353
-        preg_match('@\[([^<>&/\[\]\x00-\x20=]++)@', $shortcode, $shortcode_tag_matches);
354
-        if (empty($shortcode_tag_matches[1])) {
355
-            return $this->_data['template'];
356
-        }
357
-
358
-        $shortcode_tag = $shortcode_tag_matches[1];
359
-        //get attributes_part_of_tag
360
-        $attributes_part = preg_quote(str_replace(array($shortcode_tag,'[',']'), '', $shortcode));
361
-        //escape
362
-        $shortcode_tag = preg_quote($shortcode_tag);
363
-
364
-        return
365
-              '\['                                  //Opening Bracket
366
-            . "($shortcode_tag)$attributes_part"    //1: Shortcode Name
367
-            . '(?![\w-])'                           //Not followed by word character or hyphen
368
-            . '('                                   //2: Unroll the loop: Inside the opening shortcode tag
369
-            .   '[^\]\/]*'                          //Not a closing bracket or forward slash
370
-            .   '(?:'
371
-            .       '\/(?!\])'                      //A forward slash not followed by a closing bracket
372
-            .       '[^\]\/]*'                      //Not a closing bracket or forward slash.
373
-            .   ')*?'
374
-            . ')'
375
-            . '(?:'
376
-            .   '(\/)'                              //3. Self closing tag ...
377
-            .   '\]'                                // ... and closing bracket
378
-            . '|'
379
-            .   '\]'                                //Closing bracket
380
-            .   '(?:'
381
-            .       '('                             //4: Unroll the loop: Optionally, anything between the opening and closing brackets
382
-            .           '[^\[]*+'                   //Not an opening bracket
383
-            .           '(?:'
384
-            .               '\[(?!\/\1\])'          //An opening bracket not followed by the closing shortcode tag.
385
-            .               '[^\[]*+'               //Not an opening bracket
386
-            .           ')*+'
387
-            .       ')'
388
-            .       '\[\/\1\]'                      //Closing shortcode tag
389
-            .   ')?'
390
-            . ')';
391
-    }
392
-
393
-
394
-    /**
395
-     * This sets the properties related to the messages system
396
-     *
397
-     * @since 4.5.0
398
-     * @return void
399
-     */
400
-    protected function _set_messages_properties()
401
-    {
402
-        //should be in _extra_data
403
-        if (isset($this->_extra_data['messenger'])) {
404
-            $this->_messenger    = $this->_extra_data['messenger'];
405
-            $this->_message_type = $this->_extra_data['message_type'];
406
-            $this->_context      = $this->_extra_data['message'] instanceof EE_Message ? $this->_extra_data['message']->context() : '';
407
-            $this->_GRP_ID       = $this->_extra_data['message'] instanceof EE_Message ? $this->_extra_data['message']->GRP_ID() : 0;
408
-            $this->_message      = $this->_extra_data['message'] instanceof EE_Message ? $this->_extra_data['message'] : null;
409
-        }
410
-    }
411
-
412
-
413
-    /**
414
-     * This returns whatever the set message type object is that was set on this shortcode parser.
415
-     *
416
-     * @since 4.5.0
417
-     * @return EE_message_type
418
-     */
419
-    public function get_set_message_type()
420
-    {
421
-        return $this->_message_type;
422
-    }
423
-
424
-
425
-    /**
426
-     * This returns whatever the set messenger object is that was set on this shortcode parser
427
-     *
428
-     * @since 4.5.0
429
-     * @return EE_messenger
430
-     */
431
-    public function get_set_messenger()
432
-    {
433
-        return $this->_messenger;
434
-    }
435
-
436
-
437
-    /**
438
-     * This returns whatever the set context string is on this shortcode parser.
439
-     *
440
-     * @since 4.5.0
441
-     * @return string
442
-     */
443
-    public function get_set_context()
444
-    {
445
-        return $this->_context;
446
-    }
447
-
448
-
449
-    /**
450
-     * This returns whatever the set EE_Message object is on this shortcode.
451
-     *
452
-     * @since 4.9.0
453
-     * @return EE_Message
454
-     */
455
-    public function get_set_message()
456
-    {
457
-        return $this->_message;
458
-    }
33
+	/**
34
+	 * holds label for library
35
+	 * This is used for referencing the library label
36
+	 *
37
+	 * @access public
38
+	 * @var string
39
+	 */
40
+	public $label;
41
+
42
+
43
+	/**
44
+	 * This property is used for referencing a short description of the library
45
+	 *
46
+	 * @access public
47
+	 * @var string
48
+	 */
49
+	public $description;
50
+
51
+
52
+	/**
53
+	 * This will hold an array of shortcodes with the key as the shortcode ([shortcode]) and the value as a
54
+	 * label/description for the shortcode.
55
+	 *
56
+	 * @access protected
57
+	 * @var array
58
+	 */
59
+	protected $_shortcodes;
60
+
61
+
62
+	/**
63
+	 * This will hold the incoming data item sent to the parser method
64
+	 *
65
+	 * @access protected
66
+	 * @var mixed (array|object)
67
+	 */
68
+	protected $_data;
69
+
70
+
71
+	/**
72
+	 * some shortcodes may require extra data to parse.  This property is provided for that.
73
+	 *
74
+	 * @var array
75
+	 */
76
+	protected $_extra_data;
77
+
78
+
79
+	/**
80
+	 * EE_messenger used to generate the template being parsed.
81
+	 *
82
+	 * @since 4.5.0
83
+	 * @var EE_messenger
84
+	 */
85
+	protected $_messenger;
86
+
87
+
88
+	/**
89
+	 * message type used to generate the template being parsed.
90
+	 *
91
+	 * @since 4.5.0
92
+	 * @var EE_message_type
93
+	 */
94
+	protected $_message_type;
95
+
96
+
97
+	/**
98
+	 * context used for the template being parsed
99
+	 *
100
+	 * @since 4.5.0
101
+	 * @var string
102
+	 */
103
+	protected $_context;
104
+
105
+
106
+	/**
107
+	 * Specific Message Template Group ID
108
+	 *
109
+	 * @since 4.5.0
110
+	 * @var int
111
+	 */
112
+	protected $_GRP_ID;
113
+
114
+
115
+	/**
116
+	 * @since 4.9.0
117
+	 * @type EE_Message
118
+	 */
119
+	protected $_message;
120
+
121
+
122
+	/**
123
+	 * This will hold an instance of the EEH_Parse_Shortcodes helper that will be used when handling list type
124
+	 * shortcodes
125
+	 *
126
+	 * @var EEH_Parse_Shortcodes
127
+	 */
128
+	protected $_shortcode_helper;
129
+
130
+
131
+	public function __construct()
132
+	{
133
+		$this->_set_defaults();
134
+		$this->_init_props();
135
+	}
136
+
137
+
138
+	/**
139
+	 * This sets the defaults for the properties.  Child classes will override these properties in their _init_props
140
+	 * method
141
+	 */
142
+	private function _set_defaults()
143
+	{
144
+		$this->name        = $this->description = '';
145
+		$this->_shortcodes = array();
146
+		$this->_set_shortcode_helper();
147
+	}
148
+
149
+
150
+	/**
151
+	 * loads an instance of the EE_Shortcode_Parser helper when requested
152
+	 */
153
+	protected function _set_shortcode_helper()
154
+	{
155
+		//get shortcode_replace instance- set when _get_messages is called in child...
156
+		$this->_shortcode_helper = new EEH_Parse_Shortcodes();
157
+	}
158
+
159
+
160
+	public function get_shortcode_helper()
161
+	{
162
+		if (! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
163
+			$this->_set_shortcode_helper();
164
+		}
165
+		return $this->_shortcode_helper;
166
+	}
167
+
168
+
169
+	/**
170
+	 * This is the public method for kicking of the parser included with each child.  It can be overridden by child
171
+	 * classes if necessary (see EE_Questions_Answers for example)
172
+	 *
173
+	 * @param  string               $shortcode  incoming shortcode to be parsed
174
+	 * @param  mixed (object|array) $data       incoming data to be be used for parsing
175
+	 * @param  mixed (object|array) $extra_data extra incoming data (usually EE_Messages_Addressee)
176
+	 * @return string            parsed shortcode.
177
+	 */
178
+	public function parser($shortcode, $data, $extra_data = array())
179
+	{
180
+
181
+		//filter setup shortcodes
182
+		$this->_shortcodes = $this->get_shortcodes();
183
+
184
+		//we need to setup any dynamic shortcodes so that they work with the array_key_exists
185
+		$sc           = preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
186
+		$sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
187
+
188
+		//first we want to make sure this is a valid shortcode
189
+		if (! array_key_exists($sc_to_verify, $this->_shortcodes)) {
190
+			return false;
191
+		} //get out, this parser doesn't handle the incoming shortcode.
192
+		$this->_data       = $data;
193
+		$this->_extra_data = $extra_data;
194
+		$this->_set_messages_properties();
195
+		$parsed = apply_filters('FHEE__' . get_class($this) . '__parser_after', $this->_parser($shortcode), $shortcode,
196
+			$data, $extra_data, $this);
197
+
198
+		//note the below filter applies to ALL shortcode parsers... be careful!
199
+		$parsed = apply_filters('FHEE__EE_Shortcodes__parser_after', $parsed, $shortcode, $data, $extra_data, $this);
200
+		return $parsed;
201
+	}
202
+
203
+
204
+	/**
205
+	 * This method just returns the shortcodes in the $_shortcodes array property.
206
+	 *
207
+	 * @access public
208
+	 * @return array array of shortcodes => description pairs
209
+	 */
210
+	public function get_shortcodes()
211
+	{
212
+		$this->_shortcodes = apply_filters('FHEE__' . get_class($this) . '__shortcodes', $this->_shortcodes, $this);
213
+
214
+		//note the below filter applies to ALL shortcode parsers... be careful!
215
+		$this->_shortcodes = apply_filters('FHEE__EE_Shortcodes__shortcodes', $this->_shortcodes, $this);
216
+
217
+		return $this->_shortcodes;
218
+	}
219
+
220
+
221
+	/**
222
+	 * Child classes use this method to set the $name, $description, and $_shortcodes properties.
223
+	 *
224
+	 * @abstract
225
+	 * @access protected
226
+	 * @return void
227
+	 */
228
+	abstract protected function _init_props();
229
+
230
+
231
+	/**
232
+	 * This method will give parsing instructions for each shortcode defined in the _shortcodes array.  Child methods
233
+	 * will have to take care of handling.
234
+	 *
235
+	 * @abstract
236
+	 * @access protected
237
+	 * @param string               $shortcode the shortcode to be parsed.
238
+	 * @param mixed (object|array) $data      incoming data for the parser.  The data could be either an object or
239
+	 *                             array because there are some shortcodes that might be replaced by prepared data that
240
+	 *                             has multiple items in a list (i.e. list of attendees in an event and we're showing
241
+	 *                             fname/lname for each attendee).  In this case data will be in an array.  Otherwise
242
+	 *                             the data shoudl be in a properly formatted object.  The
243
+	 *                             EEH_Parse_Shortcodes.helper.php describes the data object we're expecting.
244
+	 * @return string parsed shortcode
245
+	 */
246
+	abstract protected function _parser($shortcode);
247
+
248
+
249
+	/**
250
+	 * This just validates incoming data for list type shortcode parsers (and they call this method) to make sure it
251
+	 * meets their requirements
252
+	 *
253
+	 * @return mixed (void|exception) If validation fails we'll throw an exception.
254
+	 */
255
+	protected function _validate_list_requirements()
256
+	{
257
+
258
+		//first test to make sure we've got an array!
259
+		if (! is_array($this->_data)) {
260
+			throw new EE_Error(sprintf(__('Expecting an array for the data sent to %s. Instead it was %s',
261
+				'event_espresso'), get_class($this), gettype($this->_data)));
262
+		}
263
+
264
+		//next test to make sure we've got the required template in the index!
265
+		if (! isset($this->_data['template'])) {
266
+			throw new EE_Error(sprintf(__('The incoming data does not have the required template index in its array',
267
+				'event_espresso')));
268
+		}
269
+
270
+		//next test to make sure we've got got a data index in the incoming data array
271
+		if (! isset($this->_data['data'])) {
272
+			throw new EE_Error(__('The incoming data does not have the required data index in its array',
273
+				'event_espresso'));
274
+		}
275
+
276
+		//all is well let's make sure _extra_data always has the values needed.
277
+		//let's make sure that extra_data includes all templates (for later parsing if necessary)
278
+		if (empty($this->_extra_data) || (empty($this->_extra_data['data']) && empty($this->_extra_data['template']))) {
279
+			$this->_extra_data['data']     = $this->_data['data'];
280
+			$this->_extra_data['template'] = $this->_data['template'];
281
+		}
282
+
283
+	}
284
+
285
+
286
+	/**
287
+	 * This returns any attributes that may be existing on an EE_Shortcode
288
+	 *
289
+	 * @since 4.5.0
290
+	 * @param string $shortcode incoming shortcode
291
+	 * @return array An array with the attributes
292
+	 */
293
+	protected function _get_shortcode_attrs($shortcode)
294
+	{
295
+		//make sure the required wp helper function is present
296
+		//require the shortcode file if necessary
297
+		if (! function_exists('shortcode_parse_atts')) {
298
+			require_once(ABSPATH . WPINC . '/shortcodes.php');
299
+		}
300
+
301
+		//let's get any attributes that may be present and set the defaults.
302
+		$shortcode_to_parse = str_replace('[', '', str_replace(']', '', $shortcode));
303
+		return shortcode_parse_atts($shortcode_to_parse);
304
+	}
305
+
306
+
307
+	/**
308
+	 * Conditional blocks are shortcode patterns with an opening conditional tag `[IF_*]` and a corresponding
309
+	 * closing tag (eg `[/IF_*]`).  The content within the tags will be displayed/hidden depending on whatever conditions
310
+	 * existed in the opening tag.  This method handles parsing the actual template to show/hide this conditional content.
311
+	 *
312
+	 * @since 4.9.32
313
+	 *
314
+	 * @param string $shortcode  This should be original shortcode as used in the template and passed to the parser.
315
+	 * @param bool $show  true means the opening and closing tags are removed and the content is left showing, false
316
+	 *                    means the opening and closing tags and the contained content are removed.
317
+	 * @return string     The template for the shortcode is returned.
318
+	 */
319
+	protected function _mutate_conditional_block_in_template($shortcode, $show = true)
320
+	{
321
+		//first let's get all the matches in the template for this particular shortcode.
322
+		preg_match_all('~' . $this->_get_conditional_block_regex($shortcode) . '~', $this->_data['template'], $matches);
323
+
324
+		if ($matches && is_array($matches[0]) && !empty($matches[0])) {
325
+			//we need to hide all instances of the matches
326
+			foreach ($matches[0] as $index => $content_to_show_or_hide) {
327
+				$content_to_show_or_hide = preg_quote($content_to_show_or_hide);
328
+				$replacement = $show ? $matches[4][$index] : '';
329
+				$this->_data['template'] = preg_replace(
330
+					'~' . $content_to_show_or_hide . '~',
331
+					$replacement,
332
+					$this->_data['template']
333
+				);
334
+			}
335
+		}
336
+		//return $template
337
+		return $this->_data['template'];
338
+	}
339
+
340
+
341
+	/**
342
+	 * This returns the regex pattern to use for conditional shortcodes parsing.
343
+	 *
344
+	 * Note: regex comes in part from the WP `get_shortcode_regex` expression in \wp-includes\shortcodes.php
345
+	 *
346
+	 * @param $shortcode
347
+	 * @since 4.9.32
348
+	 * @return string
349
+	 */
350
+	private function _get_conditional_block_regex($shortcode)
351
+	{
352
+		//get just the shortcode tag for the match
353
+		preg_match('@\[([^<>&/\[\]\x00-\x20=]++)@', $shortcode, $shortcode_tag_matches);
354
+		if (empty($shortcode_tag_matches[1])) {
355
+			return $this->_data['template'];
356
+		}
357
+
358
+		$shortcode_tag = $shortcode_tag_matches[1];
359
+		//get attributes_part_of_tag
360
+		$attributes_part = preg_quote(str_replace(array($shortcode_tag,'[',']'), '', $shortcode));
361
+		//escape
362
+		$shortcode_tag = preg_quote($shortcode_tag);
363
+
364
+		return
365
+			  '\['                                  //Opening Bracket
366
+			. "($shortcode_tag)$attributes_part"    //1: Shortcode Name
367
+			. '(?![\w-])'                           //Not followed by word character or hyphen
368
+			. '('                                   //2: Unroll the loop: Inside the opening shortcode tag
369
+			.   '[^\]\/]*'                          //Not a closing bracket or forward slash
370
+			.   '(?:'
371
+			.       '\/(?!\])'                      //A forward slash not followed by a closing bracket
372
+			.       '[^\]\/]*'                      //Not a closing bracket or forward slash.
373
+			.   ')*?'
374
+			. ')'
375
+			. '(?:'
376
+			.   '(\/)'                              //3. Self closing tag ...
377
+			.   '\]'                                // ... and closing bracket
378
+			. '|'
379
+			.   '\]'                                //Closing bracket
380
+			.   '(?:'
381
+			.       '('                             //4: Unroll the loop: Optionally, anything between the opening and closing brackets
382
+			.           '[^\[]*+'                   //Not an opening bracket
383
+			.           '(?:'
384
+			.               '\[(?!\/\1\])'          //An opening bracket not followed by the closing shortcode tag.
385
+			.               '[^\[]*+'               //Not an opening bracket
386
+			.           ')*+'
387
+			.       ')'
388
+			.       '\[\/\1\]'                      //Closing shortcode tag
389
+			.   ')?'
390
+			. ')';
391
+	}
392
+
393
+
394
+	/**
395
+	 * This sets the properties related to the messages system
396
+	 *
397
+	 * @since 4.5.0
398
+	 * @return void
399
+	 */
400
+	protected function _set_messages_properties()
401
+	{
402
+		//should be in _extra_data
403
+		if (isset($this->_extra_data['messenger'])) {
404
+			$this->_messenger    = $this->_extra_data['messenger'];
405
+			$this->_message_type = $this->_extra_data['message_type'];
406
+			$this->_context      = $this->_extra_data['message'] instanceof EE_Message ? $this->_extra_data['message']->context() : '';
407
+			$this->_GRP_ID       = $this->_extra_data['message'] instanceof EE_Message ? $this->_extra_data['message']->GRP_ID() : 0;
408
+			$this->_message      = $this->_extra_data['message'] instanceof EE_Message ? $this->_extra_data['message'] : null;
409
+		}
410
+	}
411
+
412
+
413
+	/**
414
+	 * This returns whatever the set message type object is that was set on this shortcode parser.
415
+	 *
416
+	 * @since 4.5.0
417
+	 * @return EE_message_type
418
+	 */
419
+	public function get_set_message_type()
420
+	{
421
+		return $this->_message_type;
422
+	}
423
+
424
+
425
+	/**
426
+	 * This returns whatever the set messenger object is that was set on this shortcode parser
427
+	 *
428
+	 * @since 4.5.0
429
+	 * @return EE_messenger
430
+	 */
431
+	public function get_set_messenger()
432
+	{
433
+		return $this->_messenger;
434
+	}
435
+
436
+
437
+	/**
438
+	 * This returns whatever the set context string is on this shortcode parser.
439
+	 *
440
+	 * @since 4.5.0
441
+	 * @return string
442
+	 */
443
+	public function get_set_context()
444
+	{
445
+		return $this->_context;
446
+	}
447
+
448
+
449
+	/**
450
+	 * This returns whatever the set EE_Message object is on this shortcode.
451
+	 *
452
+	 * @since 4.9.0
453
+	 * @return EE_Message
454
+	 */
455
+	public function get_set_message()
456
+	{
457
+		return $this->_message;
458
+	}
459 459
 
460 460
 
461 461
 } //end EE_Shortcodes
Please login to merge, or discard this patch.
Spacing   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 
3
-if (! defined('EVENT_ESPRESSO_VERSION')) {
3
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
4 4
     exit('NO direct script access allowed');
5 5
 }
6 6
 
@@ -159,7 +159,7 @@  discard block
 block discarded – undo
159 159
 
160 160
     public function get_shortcode_helper()
161 161
     {
162
-        if (! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
162
+        if ( ! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
163 163
             $this->_set_shortcode_helper();
164 164
         }
165 165
         return $this->_shortcode_helper;
@@ -183,16 +183,16 @@  discard block
 block discarded – undo
183 183
 
184 184
         //we need to setup any dynamic shortcodes so that they work with the array_key_exists
185 185
         $sc           = preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
186
-        $sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
186
+        $sc_to_verify = ! empty($matches[0]) ? $matches[0][0].']' : $shortcode;
187 187
 
188 188
         //first we want to make sure this is a valid shortcode
189
-        if (! array_key_exists($sc_to_verify, $this->_shortcodes)) {
189
+        if ( ! array_key_exists($sc_to_verify, $this->_shortcodes)) {
190 190
             return false;
191 191
         } //get out, this parser doesn't handle the incoming shortcode.
192 192
         $this->_data       = $data;
193 193
         $this->_extra_data = $extra_data;
194 194
         $this->_set_messages_properties();
195
-        $parsed = apply_filters('FHEE__' . get_class($this) . '__parser_after', $this->_parser($shortcode), $shortcode,
195
+        $parsed = apply_filters('FHEE__'.get_class($this).'__parser_after', $this->_parser($shortcode), $shortcode,
196 196
             $data, $extra_data, $this);
197 197
 
198 198
         //note the below filter applies to ALL shortcode parsers... be careful!
@@ -209,7 +209,7 @@  discard block
 block discarded – undo
209 209
      */
210 210
     public function get_shortcodes()
211 211
     {
212
-        $this->_shortcodes = apply_filters('FHEE__' . get_class($this) . '__shortcodes', $this->_shortcodes, $this);
212
+        $this->_shortcodes = apply_filters('FHEE__'.get_class($this).'__shortcodes', $this->_shortcodes, $this);
213 213
 
214 214
         //note the below filter applies to ALL shortcode parsers... be careful!
215 215
         $this->_shortcodes = apply_filters('FHEE__EE_Shortcodes__shortcodes', $this->_shortcodes, $this);
@@ -256,19 +256,19 @@  discard block
 block discarded – undo
256 256
     {
257 257
 
258 258
         //first test to make sure we've got an array!
259
-        if (! is_array($this->_data)) {
259
+        if ( ! is_array($this->_data)) {
260 260
             throw new EE_Error(sprintf(__('Expecting an array for the data sent to %s. Instead it was %s',
261 261
                 'event_espresso'), get_class($this), gettype($this->_data)));
262 262
         }
263 263
 
264 264
         //next test to make sure we've got the required template in the index!
265
-        if (! isset($this->_data['template'])) {
265
+        if ( ! isset($this->_data['template'])) {
266 266
             throw new EE_Error(sprintf(__('The incoming data does not have the required template index in its array',
267 267
                 'event_espresso')));
268 268
         }
269 269
 
270 270
         //next test to make sure we've got got a data index in the incoming data array
271
-        if (! isset($this->_data['data'])) {
271
+        if ( ! isset($this->_data['data'])) {
272 272
             throw new EE_Error(__('The incoming data does not have the required data index in its array',
273 273
                 'event_espresso'));
274 274
         }
@@ -294,8 +294,8 @@  discard block
 block discarded – undo
294 294
     {
295 295
         //make sure the required wp helper function is present
296 296
         //require the shortcode file if necessary
297
-        if (! function_exists('shortcode_parse_atts')) {
298
-            require_once(ABSPATH . WPINC . '/shortcodes.php');
297
+        if ( ! function_exists('shortcode_parse_atts')) {
298
+            require_once(ABSPATH.WPINC.'/shortcodes.php');
299 299
         }
300 300
 
301 301
         //let's get any attributes that may be present and set the defaults.
@@ -319,15 +319,15 @@  discard block
 block discarded – undo
319 319
     protected function _mutate_conditional_block_in_template($shortcode, $show = true)
320 320
     {
321 321
         //first let's get all the matches in the template for this particular shortcode.
322
-        preg_match_all('~' . $this->_get_conditional_block_regex($shortcode) . '~', $this->_data['template'], $matches);
322
+        preg_match_all('~'.$this->_get_conditional_block_regex($shortcode).'~', $this->_data['template'], $matches);
323 323
 
324
-        if ($matches && is_array($matches[0]) && !empty($matches[0])) {
324
+        if ($matches && is_array($matches[0]) && ! empty($matches[0])) {
325 325
             //we need to hide all instances of the matches
326 326
             foreach ($matches[0] as $index => $content_to_show_or_hide) {
327 327
                 $content_to_show_or_hide = preg_quote($content_to_show_or_hide);
328 328
                 $replacement = $show ? $matches[4][$index] : '';
329 329
                 $this->_data['template'] = preg_replace(
330
-                    '~' . $content_to_show_or_hide . '~',
330
+                    '~'.$content_to_show_or_hide.'~',
331 331
                     $replacement,
332 332
                     $this->_data['template']
333 333
                 );
@@ -357,7 +357,7 @@  discard block
 block discarded – undo
357 357
 
358 358
         $shortcode_tag = $shortcode_tag_matches[1];
359 359
         //get attributes_part_of_tag
360
-        $attributes_part = preg_quote(str_replace(array($shortcode_tag,'[',']'), '', $shortcode));
360
+        $attributes_part = preg_quote(str_replace(array($shortcode_tag, '[', ']'), '', $shortcode));
361 361
         //escape
362 362
         $shortcode_tag = preg_quote($shortcode_tag);
363 363
 
Please login to merge, or discard this patch.