@@ -18,2227 +18,2227 @@ discard block |
||
| 18 | 18 | class Registrations_Admin_Page extends EE_Admin_Page_CPT |
| 19 | 19 | { |
| 20 | 20 | |
| 21 | - /** |
|
| 22 | - * @var EE_Registration |
|
| 23 | - */ |
|
| 24 | - private $_registration; |
|
| 25 | - |
|
| 26 | - /** |
|
| 27 | - * @var EE_Event |
|
| 28 | - */ |
|
| 29 | - private $_reg_event; |
|
| 30 | - |
|
| 31 | - /** |
|
| 32 | - * @var EE_Session |
|
| 33 | - */ |
|
| 34 | - private $_session; |
|
| 35 | - |
|
| 36 | - private static $_reg_status; |
|
| 37 | - |
|
| 38 | - /** |
|
| 39 | - * Form for displaying the custom questions for this registration. |
|
| 40 | - * This gets used a few times throughout the request so its best to cache it |
|
| 41 | - * |
|
| 42 | - * @var EE_Registration_Custom_Questions_Form |
|
| 43 | - */ |
|
| 44 | - protected $_reg_custom_questions_form; |
|
| 45 | - |
|
| 46 | - /** |
|
| 47 | - * @var EEM_Registration $registration_model |
|
| 48 | - */ |
|
| 49 | - private $registration_model; |
|
| 50 | - |
|
| 51 | - /** |
|
| 52 | - * @var EEM_Attendee $attendee_model |
|
| 53 | - */ |
|
| 54 | - private $attendee_model; |
|
| 55 | - |
|
| 56 | - /** |
|
| 57 | - * @var EEM_Event $event_model |
|
| 58 | - */ |
|
| 59 | - private $event_model; |
|
| 60 | - |
|
| 61 | - /** |
|
| 62 | - * @var EEM_Status $status_model |
|
| 63 | - */ |
|
| 64 | - private $status_model; |
|
| 65 | - |
|
| 66 | - |
|
| 67 | - /** |
|
| 68 | - * @param bool $routing |
|
| 69 | - * @throws EE_Error |
|
| 70 | - * @throws InvalidArgumentException |
|
| 71 | - * @throws InvalidDataTypeException |
|
| 72 | - * @throws InvalidInterfaceException |
|
| 73 | - * @throws ReflectionException |
|
| 74 | - */ |
|
| 75 | - public function __construct($routing = true) |
|
| 76 | - { |
|
| 77 | - parent::__construct($routing); |
|
| 78 | - add_action('wp_loaded', array($this, 'wp_loaded')); |
|
| 79 | - } |
|
| 80 | - |
|
| 81 | - /** |
|
| 82 | - * @return EEM_Registration |
|
| 83 | - * @throws InvalidArgumentException |
|
| 84 | - * @throws InvalidDataTypeException |
|
| 85 | - * @throws InvalidInterfaceException |
|
| 86 | - * @since $VID:$ |
|
| 87 | - */ |
|
| 88 | - protected function getRegistrationModel() |
|
| 89 | - { |
|
| 90 | - if (! $this->registration_model instanceof EEM_Registration) { |
|
| 91 | - $this->registration_model = $this->loader->getShared('EEM_Registration'); |
|
| 92 | - } |
|
| 93 | - return $this->registration_model; |
|
| 94 | - } |
|
| 95 | - |
|
| 96 | - /** |
|
| 97 | - * @return EEM_Attendee |
|
| 98 | - * @throws InvalidArgumentException |
|
| 99 | - * @throws InvalidDataTypeException |
|
| 100 | - * @throws InvalidInterfaceException |
|
| 101 | - * @since $VID:$ |
|
| 102 | - */ |
|
| 103 | - protected function getAttendeeModel() |
|
| 104 | - { |
|
| 105 | - if (! $this->attendee_model instanceof EEM_Attendee) { |
|
| 106 | - $this->attendee_model = $this->loader->getShared('EEM_Attendee'); |
|
| 107 | - } |
|
| 108 | - return $this->attendee_model; |
|
| 109 | - } |
|
| 110 | - |
|
| 111 | - |
|
| 112 | - /** |
|
| 113 | - * @return EEM_Event |
|
| 114 | - * @throws InvalidArgumentException |
|
| 115 | - * @throws InvalidDataTypeException |
|
| 116 | - * @throws InvalidInterfaceException |
|
| 117 | - * @since $VID:$ |
|
| 118 | - */ |
|
| 119 | - protected function getEventModel() |
|
| 120 | - { |
|
| 121 | - if (! $this->event_model instanceof EEM_Event) { |
|
| 122 | - $this->event_model = $this->loader->getShared('EEM_Event'); |
|
| 123 | - } |
|
| 124 | - return $this->event_model; |
|
| 125 | - } |
|
| 126 | - |
|
| 127 | - /** |
|
| 128 | - * @return EEM_Status |
|
| 129 | - * @throws InvalidArgumentException |
|
| 130 | - * @throws InvalidDataTypeException |
|
| 131 | - * @throws InvalidInterfaceException |
|
| 132 | - * @since $VID:$ |
|
| 133 | - */ |
|
| 134 | - protected function getStatusModel() |
|
| 135 | - { |
|
| 136 | - if (! $this->status_model instanceof EEM_Status) { |
|
| 137 | - $this->status_model = $this->loader->getShared('EEM_Status'); |
|
| 138 | - } |
|
| 139 | - return $this->status_model; |
|
| 140 | - } |
|
| 141 | - |
|
| 142 | - |
|
| 143 | - public function wp_loaded() |
|
| 144 | - { |
|
| 145 | - // when adding a new registration... |
|
| 146 | - if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') { |
|
| 147 | - EE_System::do_not_cache(); |
|
| 148 | - if (! isset($this->_req_data['processing_registration']) |
|
| 149 | - || absint($this->_req_data['processing_registration']) !== 1 |
|
| 150 | - ) { |
|
| 151 | - // and it's NOT the attendee information reg step |
|
| 152 | - // force cookie expiration by setting time to last week |
|
| 153 | - setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/'); |
|
| 154 | - // and update the global |
|
| 155 | - $_COOKIE['ee_registration_added'] = 0; |
|
| 156 | - } |
|
| 157 | - } |
|
| 158 | - } |
|
| 159 | - |
|
| 160 | - |
|
| 161 | - protected function _init_page_props() |
|
| 162 | - { |
|
| 163 | - $this->page_slug = REG_PG_SLUG; |
|
| 164 | - $this->_admin_base_url = REG_ADMIN_URL; |
|
| 165 | - $this->_admin_base_path = REG_ADMIN; |
|
| 166 | - $this->page_label = esc_html__('Registrations', 'event_espresso'); |
|
| 167 | - $this->_cpt_routes = array( |
|
| 168 | - 'add_new_attendee' => 'espresso_attendees', |
|
| 169 | - 'edit_attendee' => 'espresso_attendees', |
|
| 170 | - 'insert_attendee' => 'espresso_attendees', |
|
| 171 | - 'update_attendee' => 'espresso_attendees', |
|
| 172 | - ); |
|
| 173 | - $this->_cpt_model_names = array( |
|
| 174 | - 'add_new_attendee' => 'EEM_Attendee', |
|
| 175 | - 'edit_attendee' => 'EEM_Attendee', |
|
| 176 | - ); |
|
| 177 | - $this->_cpt_edit_routes = array( |
|
| 178 | - 'espresso_attendees' => 'edit_attendee', |
|
| 179 | - ); |
|
| 180 | - $this->_pagenow_map = array( |
|
| 181 | - 'add_new_attendee' => 'post-new.php', |
|
| 182 | - 'edit_attendee' => 'post.php', |
|
| 183 | - 'trash' => 'post.php', |
|
| 184 | - ); |
|
| 185 | - add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10); |
|
| 186 | - // add filters so that the comment urls don't take users to a confusing 404 page |
|
| 187 | - add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3); |
|
| 188 | - } |
|
| 189 | - |
|
| 190 | - |
|
| 191 | - public function clear_comment_link($link, $comment, $args) |
|
| 192 | - { |
|
| 193 | - // gotta make sure this only happens on this route |
|
| 194 | - $post_type = get_post_type($comment->comment_post_ID); |
|
| 195 | - if ($post_type === 'espresso_attendees') { |
|
| 196 | - return '#commentsdiv'; |
|
| 197 | - } |
|
| 198 | - return $link; |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - |
|
| 202 | - protected function _ajax_hooks() |
|
| 203 | - { |
|
| 204 | - // todo: all hooks for registrations ajax goes in here |
|
| 205 | - add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status')); |
|
| 206 | - } |
|
| 207 | - |
|
| 208 | - |
|
| 209 | - protected function _define_page_props() |
|
| 210 | - { |
|
| 211 | - $this->_admin_page_title = $this->page_label; |
|
| 212 | - $this->_labels = array( |
|
| 213 | - 'buttons' => array( |
|
| 214 | - 'add-registrant' => esc_html__('Add New Registration', 'event_espresso'), |
|
| 215 | - 'add-attendee' => esc_html__('Add Contact', 'event_espresso'), |
|
| 216 | - 'edit' => esc_html__('Edit Contact', 'event_espresso'), |
|
| 217 | - 'report' => esc_html__('Event Registrations CSV Report', 'event_espresso'), |
|
| 218 | - 'report_all' => esc_html__('All Registrations CSV Report', 'event_espresso'), |
|
| 219 | - 'report_filtered' => esc_html__('Filtered CSV Report', 'event_espresso'), |
|
| 220 | - 'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'), |
|
| 221 | - 'contact_list_export' => esc_html__('Export Data', 'event_espresso'), |
|
| 222 | - ), |
|
| 223 | - 'publishbox' => array( |
|
| 224 | - 'add_new_attendee' => esc_html__('Add Contact Record', 'event_espresso'), |
|
| 225 | - 'edit_attendee' => esc_html__('Update Contact Record', 'event_espresso'), |
|
| 226 | - ), |
|
| 227 | - 'hide_add_button_on_cpt_route' => array( |
|
| 228 | - 'edit_attendee' => true, |
|
| 229 | - ), |
|
| 230 | - ); |
|
| 231 | - } |
|
| 232 | - |
|
| 233 | - |
|
| 234 | - /** |
|
| 235 | - * grab url requests and route them |
|
| 236 | - * |
|
| 237 | - * @access private |
|
| 238 | - * @return void |
|
| 239 | - * @throws EE_Error |
|
| 240 | - */ |
|
| 241 | - public function _set_page_routes() |
|
| 242 | - { |
|
| 243 | - $this->_get_registration_status_array(); |
|
| 244 | - $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID']) |
|
| 245 | - ? $this->_req_data['_REG_ID'] : 0; |
|
| 246 | - $reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID']) |
|
| 247 | - ? $this->_req_data['reg_status_change_form']['REG_ID'] |
|
| 248 | - : $reg_id; |
|
| 249 | - $att_id = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID']) |
|
| 250 | - ? $this->_req_data['ATT_ID'] : 0; |
|
| 251 | - $att_id = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post']) |
|
| 252 | - ? $this->_req_data['post'] |
|
| 253 | - : $att_id; |
|
| 254 | - $this->_page_routes = array( |
|
| 255 | - 'default' => array( |
|
| 256 | - 'func' => '_registrations_overview_list_table', |
|
| 257 | - 'capability' => 'ee_read_registrations', |
|
| 258 | - ), |
|
| 259 | - 'view_registration' => array( |
|
| 260 | - 'func' => '_registration_details', |
|
| 261 | - 'capability' => 'ee_read_registration', |
|
| 262 | - 'obj_id' => $reg_id, |
|
| 263 | - ), |
|
| 264 | - 'edit_registration' => array( |
|
| 265 | - 'func' => '_update_attendee_registration_form', |
|
| 266 | - 'noheader' => true, |
|
| 267 | - 'headers_sent_route' => 'view_registration', |
|
| 268 | - 'capability' => 'ee_edit_registration', |
|
| 269 | - 'obj_id' => $reg_id, |
|
| 270 | - '_REG_ID' => $reg_id, |
|
| 271 | - ), |
|
| 272 | - 'trash_registrations' => array( |
|
| 273 | - 'func' => '_trash_or_restore_registrations', |
|
| 274 | - 'args' => array('trash' => true), |
|
| 275 | - 'noheader' => true, |
|
| 276 | - 'capability' => 'ee_delete_registrations', |
|
| 277 | - ), |
|
| 278 | - 'restore_registrations' => array( |
|
| 279 | - 'func' => '_trash_or_restore_registrations', |
|
| 280 | - 'args' => array('trash' => false), |
|
| 281 | - 'noheader' => true, |
|
| 282 | - 'capability' => 'ee_delete_registrations', |
|
| 283 | - ), |
|
| 284 | - 'delete_registrations' => array( |
|
| 285 | - 'func' => '_delete_registrations', |
|
| 286 | - 'noheader' => true, |
|
| 287 | - 'capability' => 'ee_delete_registrations', |
|
| 288 | - ), |
|
| 289 | - 'new_registration' => array( |
|
| 290 | - 'func' => 'new_registration', |
|
| 291 | - 'capability' => 'ee_edit_registrations', |
|
| 292 | - ), |
|
| 293 | - 'process_reg_step' => array( |
|
| 294 | - 'func' => 'process_reg_step', |
|
| 295 | - 'noheader' => true, |
|
| 296 | - 'capability' => 'ee_edit_registrations', |
|
| 297 | - ), |
|
| 298 | - 'redirect_to_txn' => array( |
|
| 299 | - 'func' => 'redirect_to_txn', |
|
| 300 | - 'noheader' => true, |
|
| 301 | - 'capability' => 'ee_edit_registrations', |
|
| 302 | - ), |
|
| 303 | - 'change_reg_status' => array( |
|
| 304 | - 'func' => '_change_reg_status', |
|
| 305 | - 'noheader' => true, |
|
| 306 | - 'capability' => 'ee_edit_registration', |
|
| 307 | - 'obj_id' => $reg_id, |
|
| 308 | - ), |
|
| 309 | - 'approve_registration' => array( |
|
| 310 | - 'func' => 'approve_registration', |
|
| 311 | - 'noheader' => true, |
|
| 312 | - 'capability' => 'ee_edit_registration', |
|
| 313 | - 'obj_id' => $reg_id, |
|
| 314 | - ), |
|
| 315 | - 'approve_and_notify_registration' => array( |
|
| 316 | - 'func' => 'approve_registration', |
|
| 317 | - 'noheader' => true, |
|
| 318 | - 'args' => array(true), |
|
| 319 | - 'capability' => 'ee_edit_registration', |
|
| 320 | - 'obj_id' => $reg_id, |
|
| 321 | - ), |
|
| 322 | - 'approve_registrations' => array( |
|
| 323 | - 'func' => 'bulk_action_on_registrations', |
|
| 324 | - 'noheader' => true, |
|
| 325 | - 'capability' => 'ee_edit_registrations', |
|
| 326 | - 'args' => array('approve'), |
|
| 327 | - ), |
|
| 328 | - 'approve_and_notify_registrations' => array( |
|
| 329 | - 'func' => 'bulk_action_on_registrations', |
|
| 330 | - 'noheader' => true, |
|
| 331 | - 'capability' => 'ee_edit_registrations', |
|
| 332 | - 'args' => array('approve', true), |
|
| 333 | - ), |
|
| 334 | - 'decline_registration' => array( |
|
| 335 | - 'func' => 'decline_registration', |
|
| 336 | - 'noheader' => true, |
|
| 337 | - 'capability' => 'ee_edit_registration', |
|
| 338 | - 'obj_id' => $reg_id, |
|
| 339 | - ), |
|
| 340 | - 'decline_and_notify_registration' => array( |
|
| 341 | - 'func' => 'decline_registration', |
|
| 342 | - 'noheader' => true, |
|
| 343 | - 'args' => array(true), |
|
| 344 | - 'capability' => 'ee_edit_registration', |
|
| 345 | - 'obj_id' => $reg_id, |
|
| 346 | - ), |
|
| 347 | - 'decline_registrations' => array( |
|
| 348 | - 'func' => 'bulk_action_on_registrations', |
|
| 349 | - 'noheader' => true, |
|
| 350 | - 'capability' => 'ee_edit_registrations', |
|
| 351 | - 'args' => array('decline'), |
|
| 352 | - ), |
|
| 353 | - 'decline_and_notify_registrations' => array( |
|
| 354 | - 'func' => 'bulk_action_on_registrations', |
|
| 355 | - 'noheader' => true, |
|
| 356 | - 'capability' => 'ee_edit_registrations', |
|
| 357 | - 'args' => array('decline', true), |
|
| 358 | - ), |
|
| 359 | - 'pending_registration' => array( |
|
| 360 | - 'func' => 'pending_registration', |
|
| 361 | - 'noheader' => true, |
|
| 362 | - 'capability' => 'ee_edit_registration', |
|
| 363 | - 'obj_id' => $reg_id, |
|
| 364 | - ), |
|
| 365 | - 'pending_and_notify_registration' => array( |
|
| 366 | - 'func' => 'pending_registration', |
|
| 367 | - 'noheader' => true, |
|
| 368 | - 'args' => array(true), |
|
| 369 | - 'capability' => 'ee_edit_registration', |
|
| 370 | - 'obj_id' => $reg_id, |
|
| 371 | - ), |
|
| 372 | - 'pending_registrations' => array( |
|
| 373 | - 'func' => 'bulk_action_on_registrations', |
|
| 374 | - 'noheader' => true, |
|
| 375 | - 'capability' => 'ee_edit_registrations', |
|
| 376 | - 'args' => array('pending'), |
|
| 377 | - ), |
|
| 378 | - 'pending_and_notify_registrations' => array( |
|
| 379 | - 'func' => 'bulk_action_on_registrations', |
|
| 380 | - 'noheader' => true, |
|
| 381 | - 'capability' => 'ee_edit_registrations', |
|
| 382 | - 'args' => array('pending', true), |
|
| 383 | - ), |
|
| 384 | - 'no_approve_registration' => array( |
|
| 385 | - 'func' => 'not_approve_registration', |
|
| 386 | - 'noheader' => true, |
|
| 387 | - 'capability' => 'ee_edit_registration', |
|
| 388 | - 'obj_id' => $reg_id, |
|
| 389 | - ), |
|
| 390 | - 'no_approve_and_notify_registration' => array( |
|
| 391 | - 'func' => 'not_approve_registration', |
|
| 392 | - 'noheader' => true, |
|
| 393 | - 'args' => array(true), |
|
| 394 | - 'capability' => 'ee_edit_registration', |
|
| 395 | - 'obj_id' => $reg_id, |
|
| 396 | - ), |
|
| 397 | - 'no_approve_registrations' => array( |
|
| 398 | - 'func' => 'bulk_action_on_registrations', |
|
| 399 | - 'noheader' => true, |
|
| 400 | - 'capability' => 'ee_edit_registrations', |
|
| 401 | - 'args' => array('not_approve'), |
|
| 402 | - ), |
|
| 403 | - 'no_approve_and_notify_registrations' => array( |
|
| 404 | - 'func' => 'bulk_action_on_registrations', |
|
| 405 | - 'noheader' => true, |
|
| 406 | - 'capability' => 'ee_edit_registrations', |
|
| 407 | - 'args' => array('not_approve', true), |
|
| 408 | - ), |
|
| 409 | - 'cancel_registration' => array( |
|
| 410 | - 'func' => 'cancel_registration', |
|
| 411 | - 'noheader' => true, |
|
| 412 | - 'capability' => 'ee_edit_registration', |
|
| 413 | - 'obj_id' => $reg_id, |
|
| 414 | - ), |
|
| 415 | - 'cancel_and_notify_registration' => array( |
|
| 416 | - 'func' => 'cancel_registration', |
|
| 417 | - 'noheader' => true, |
|
| 418 | - 'args' => array(true), |
|
| 419 | - 'capability' => 'ee_edit_registration', |
|
| 420 | - 'obj_id' => $reg_id, |
|
| 421 | - ), |
|
| 422 | - 'cancel_registrations' => array( |
|
| 423 | - 'func' => 'bulk_action_on_registrations', |
|
| 424 | - 'noheader' => true, |
|
| 425 | - 'capability' => 'ee_edit_registrations', |
|
| 426 | - 'args' => array('cancel'), |
|
| 427 | - ), |
|
| 428 | - 'cancel_and_notify_registrations' => array( |
|
| 429 | - 'func' => 'bulk_action_on_registrations', |
|
| 430 | - 'noheader' => true, |
|
| 431 | - 'capability' => 'ee_edit_registrations', |
|
| 432 | - 'args' => array('cancel', true), |
|
| 433 | - ), |
|
| 434 | - 'wait_list_registration' => array( |
|
| 435 | - 'func' => 'wait_list_registration', |
|
| 436 | - 'noheader' => true, |
|
| 437 | - 'capability' => 'ee_edit_registration', |
|
| 438 | - 'obj_id' => $reg_id, |
|
| 439 | - ), |
|
| 440 | - 'wait_list_and_notify_registration' => array( |
|
| 441 | - 'func' => 'wait_list_registration', |
|
| 442 | - 'noheader' => true, |
|
| 443 | - 'args' => array(true), |
|
| 444 | - 'capability' => 'ee_edit_registration', |
|
| 445 | - 'obj_id' => $reg_id, |
|
| 446 | - ), |
|
| 447 | - 'contact_list' => array( |
|
| 448 | - 'func' => '_attendee_contact_list_table', |
|
| 449 | - 'capability' => 'ee_read_contacts', |
|
| 450 | - ), |
|
| 451 | - 'add_new_attendee' => array( |
|
| 452 | - 'func' => '_create_new_cpt_item', |
|
| 453 | - 'args' => array( |
|
| 454 | - 'new_attendee' => true, |
|
| 455 | - 'capability' => 'ee_edit_contacts', |
|
| 456 | - ), |
|
| 457 | - ), |
|
| 458 | - 'edit_attendee' => array( |
|
| 459 | - 'func' => '_edit_cpt_item', |
|
| 460 | - 'capability' => 'ee_edit_contacts', |
|
| 461 | - 'obj_id' => $att_id, |
|
| 462 | - ), |
|
| 463 | - 'duplicate_attendee' => array( |
|
| 464 | - 'func' => '_duplicate_attendee', |
|
| 465 | - 'noheader' => true, |
|
| 466 | - 'capability' => 'ee_edit_contacts', |
|
| 467 | - 'obj_id' => $att_id, |
|
| 468 | - ), |
|
| 469 | - 'insert_attendee' => array( |
|
| 470 | - 'func' => '_insert_or_update_attendee', |
|
| 471 | - 'args' => array( |
|
| 472 | - 'new_attendee' => true, |
|
| 473 | - ), |
|
| 474 | - 'noheader' => true, |
|
| 475 | - 'capability' => 'ee_edit_contacts', |
|
| 476 | - ), |
|
| 477 | - 'update_attendee' => array( |
|
| 478 | - 'func' => '_insert_or_update_attendee', |
|
| 479 | - 'args' => array( |
|
| 480 | - 'new_attendee' => false, |
|
| 481 | - ), |
|
| 482 | - 'noheader' => true, |
|
| 483 | - 'capability' => 'ee_edit_contacts', |
|
| 484 | - 'obj_id' => $att_id, |
|
| 485 | - ), |
|
| 486 | - 'trash_attendees' => array( |
|
| 487 | - 'func' => '_trash_or_restore_attendees', |
|
| 488 | - 'args' => array( |
|
| 489 | - 'trash' => 'true', |
|
| 490 | - ), |
|
| 491 | - 'noheader' => true, |
|
| 492 | - 'capability' => 'ee_delete_contacts', |
|
| 493 | - ), |
|
| 494 | - 'trash_attendee' => array( |
|
| 495 | - 'func' => '_trash_or_restore_attendees', |
|
| 496 | - 'args' => array( |
|
| 497 | - 'trash' => true, |
|
| 498 | - ), |
|
| 499 | - 'noheader' => true, |
|
| 500 | - 'capability' => 'ee_delete_contacts', |
|
| 501 | - 'obj_id' => $att_id, |
|
| 502 | - ), |
|
| 503 | - 'restore_attendees' => array( |
|
| 504 | - 'func' => '_trash_or_restore_attendees', |
|
| 505 | - 'args' => array( |
|
| 506 | - 'trash' => false, |
|
| 507 | - ), |
|
| 508 | - 'noheader' => true, |
|
| 509 | - 'capability' => 'ee_delete_contacts', |
|
| 510 | - 'obj_id' => $att_id, |
|
| 511 | - ), |
|
| 512 | - 'resend_registration' => array( |
|
| 513 | - 'func' => '_resend_registration', |
|
| 514 | - 'noheader' => true, |
|
| 515 | - 'capability' => 'ee_send_message', |
|
| 516 | - ), |
|
| 517 | - 'registrations_report' => array( |
|
| 518 | - 'func' => '_registrations_report', |
|
| 519 | - 'noheader' => true, |
|
| 520 | - 'capability' => 'ee_read_registrations', |
|
| 521 | - ), |
|
| 522 | - 'contact_list_export' => array( |
|
| 523 | - 'func' => '_contact_list_export', |
|
| 524 | - 'noheader' => true, |
|
| 525 | - 'capability' => 'export', |
|
| 526 | - ), |
|
| 527 | - 'contact_list_report' => array( |
|
| 528 | - 'func' => '_contact_list_report', |
|
| 529 | - 'noheader' => true, |
|
| 530 | - 'capability' => 'ee_read_contacts', |
|
| 531 | - ), |
|
| 532 | - ); |
|
| 533 | - } |
|
| 534 | - |
|
| 535 | - |
|
| 536 | - protected function _set_page_config() |
|
| 537 | - { |
|
| 538 | - $this->_page_config = array( |
|
| 539 | - 'default' => array( |
|
| 540 | - 'nav' => array( |
|
| 541 | - 'label' => esc_html__('Overview', 'event_espresso'), |
|
| 542 | - 'order' => 5, |
|
| 543 | - ), |
|
| 544 | - 'help_tabs' => array( |
|
| 545 | - 'registrations_overview_help_tab' => array( |
|
| 546 | - 'title' => esc_html__('Registrations Overview', 'event_espresso'), |
|
| 547 | - 'filename' => 'registrations_overview', |
|
| 548 | - ), |
|
| 549 | - 'registrations_overview_table_column_headings_help_tab' => array( |
|
| 550 | - 'title' => esc_html__('Registrations Table Column Headings', 'event_espresso'), |
|
| 551 | - 'filename' => 'registrations_overview_table_column_headings', |
|
| 552 | - ), |
|
| 553 | - 'registrations_overview_filters_help_tab' => array( |
|
| 554 | - 'title' => esc_html__('Registration Filters', 'event_espresso'), |
|
| 555 | - 'filename' => 'registrations_overview_filters', |
|
| 556 | - ), |
|
| 557 | - 'registrations_overview_views_help_tab' => array( |
|
| 558 | - 'title' => esc_html__('Registration Views', 'event_espresso'), |
|
| 559 | - 'filename' => 'registrations_overview_views', |
|
| 560 | - ), |
|
| 561 | - 'registrations_regoverview_other_help_tab' => array( |
|
| 562 | - 'title' => esc_html__('Registrations Other', 'event_espresso'), |
|
| 563 | - 'filename' => 'registrations_overview_other', |
|
| 564 | - ), |
|
| 565 | - ), |
|
| 566 | - 'help_tour' => array('Registration_Overview_Help_Tour'), |
|
| 567 | - 'qtips' => array('Registration_List_Table_Tips'), |
|
| 568 | - 'list_table' => 'EE_Registrations_List_Table', |
|
| 569 | - 'require_nonce' => false, |
|
| 570 | - ), |
|
| 571 | - 'view_registration' => array( |
|
| 572 | - 'nav' => array( |
|
| 573 | - 'label' => esc_html__('REG Details', 'event_espresso'), |
|
| 574 | - 'order' => 15, |
|
| 575 | - 'url' => isset($this->_req_data['_REG_ID']) |
|
| 576 | - ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url) |
|
| 577 | - : $this->_admin_base_url, |
|
| 578 | - 'persistent' => false, |
|
| 579 | - ), |
|
| 580 | - 'help_tabs' => array( |
|
| 581 | - 'registrations_details_help_tab' => array( |
|
| 582 | - 'title' => esc_html__('Registration Details', 'event_espresso'), |
|
| 583 | - 'filename' => 'registrations_details', |
|
| 584 | - ), |
|
| 585 | - 'registrations_details_table_help_tab' => array( |
|
| 586 | - 'title' => esc_html__('Registration Details Table', 'event_espresso'), |
|
| 587 | - 'filename' => 'registrations_details_table', |
|
| 588 | - ), |
|
| 589 | - 'registrations_details_form_answers_help_tab' => array( |
|
| 590 | - 'title' => esc_html__('Registration Form Answers', 'event_espresso'), |
|
| 591 | - 'filename' => 'registrations_details_form_answers', |
|
| 592 | - ), |
|
| 593 | - 'registrations_details_registrant_details_help_tab' => array( |
|
| 594 | - 'title' => esc_html__('Contact Details', 'event_espresso'), |
|
| 595 | - 'filename' => 'registrations_details_registrant_details', |
|
| 596 | - ), |
|
| 597 | - ), |
|
| 598 | - 'help_tour' => array('Registration_Details_Help_Tour'), |
|
| 599 | - 'metaboxes' => array_merge( |
|
| 600 | - $this->_default_espresso_metaboxes, |
|
| 601 | - array('_registration_details_metaboxes') |
|
| 602 | - ), |
|
| 603 | - 'require_nonce' => false, |
|
| 604 | - ), |
|
| 605 | - 'new_registration' => array( |
|
| 606 | - 'nav' => array( |
|
| 607 | - 'label' => esc_html__('Add New Registration', 'event_espresso'), |
|
| 608 | - 'url' => '#', |
|
| 609 | - 'order' => 15, |
|
| 610 | - 'persistent' => false, |
|
| 611 | - ), |
|
| 612 | - 'metaboxes' => $this->_default_espresso_metaboxes, |
|
| 613 | - 'labels' => array( |
|
| 614 | - 'publishbox' => esc_html__('Save Registration', 'event_espresso'), |
|
| 615 | - ), |
|
| 616 | - 'require_nonce' => false, |
|
| 617 | - ), |
|
| 618 | - 'add_new_attendee' => array( |
|
| 619 | - 'nav' => array( |
|
| 620 | - 'label' => esc_html__('Add Contact', 'event_espresso'), |
|
| 621 | - 'order' => 15, |
|
| 622 | - 'persistent' => false, |
|
| 623 | - ), |
|
| 624 | - 'metaboxes' => array_merge( |
|
| 625 | - $this->_default_espresso_metaboxes, |
|
| 626 | - array('_publish_post_box', 'attendee_editor_metaboxes') |
|
| 627 | - ), |
|
| 628 | - 'require_nonce' => false, |
|
| 629 | - ), |
|
| 630 | - 'edit_attendee' => array( |
|
| 631 | - 'nav' => array( |
|
| 632 | - 'label' => esc_html__('Edit Contact', 'event_espresso'), |
|
| 633 | - 'order' => 15, |
|
| 634 | - 'persistent' => false, |
|
| 635 | - 'url' => isset($this->_req_data['ATT_ID']) |
|
| 636 | - ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url) |
|
| 637 | - : $this->_admin_base_url, |
|
| 638 | - ), |
|
| 639 | - 'metaboxes' => array('attendee_editor_metaboxes'), |
|
| 640 | - 'require_nonce' => false, |
|
| 641 | - ), |
|
| 642 | - 'contact_list' => array( |
|
| 643 | - 'nav' => array( |
|
| 644 | - 'label' => esc_html__('Contact List', 'event_espresso'), |
|
| 645 | - 'order' => 20, |
|
| 646 | - ), |
|
| 647 | - 'list_table' => 'EE_Attendee_Contact_List_Table', |
|
| 648 | - 'help_tabs' => array( |
|
| 649 | - 'registrations_contact_list_help_tab' => array( |
|
| 650 | - 'title' => esc_html__('Registrations Contact List', 'event_espresso'), |
|
| 651 | - 'filename' => 'registrations_contact_list', |
|
| 652 | - ), |
|
| 653 | - 'registrations_contact-list_table_column_headings_help_tab' => array( |
|
| 654 | - 'title' => esc_html__('Contact List Table Column Headings', 'event_espresso'), |
|
| 655 | - 'filename' => 'registrations_contact_list_table_column_headings', |
|
| 656 | - ), |
|
| 657 | - 'registrations_contact_list_views_help_tab' => array( |
|
| 658 | - 'title' => esc_html__('Contact List Views', 'event_espresso'), |
|
| 659 | - 'filename' => 'registrations_contact_list_views', |
|
| 660 | - ), |
|
| 661 | - 'registrations_contact_list_other_help_tab' => array( |
|
| 662 | - 'title' => esc_html__('Contact List Other', 'event_espresso'), |
|
| 663 | - 'filename' => 'registrations_contact_list_other', |
|
| 664 | - ), |
|
| 665 | - ), |
|
| 666 | - 'help_tour' => array('Contact_List_Help_Tour'), |
|
| 667 | - 'metaboxes' => array(), |
|
| 668 | - 'require_nonce' => false, |
|
| 669 | - ), |
|
| 670 | - // override default cpt routes |
|
| 671 | - 'create_new' => '', |
|
| 672 | - 'edit' => '', |
|
| 673 | - ); |
|
| 674 | - } |
|
| 675 | - |
|
| 676 | - |
|
| 677 | - /** |
|
| 678 | - * The below methods aren't used by this class currently |
|
| 679 | - */ |
|
| 680 | - protected function _add_screen_options() |
|
| 681 | - { |
|
| 682 | - } |
|
| 683 | - |
|
| 684 | - |
|
| 685 | - protected function _add_feature_pointers() |
|
| 686 | - { |
|
| 687 | - } |
|
| 688 | - |
|
| 689 | - |
|
| 690 | - public function admin_init() |
|
| 691 | - { |
|
| 692 | - EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__( |
|
| 693 | - 'click "Update Registration Questions" to save your changes', |
|
| 694 | - 'event_espresso' |
|
| 695 | - ); |
|
| 696 | - } |
|
| 697 | - |
|
| 698 | - |
|
| 699 | - public function admin_notices() |
|
| 700 | - { |
|
| 701 | - } |
|
| 702 | - |
|
| 703 | - |
|
| 704 | - public function admin_footer_scripts() |
|
| 705 | - { |
|
| 706 | - } |
|
| 707 | - |
|
| 708 | - |
|
| 709 | - /** |
|
| 710 | - * get list of registration statuses |
|
| 711 | - * |
|
| 712 | - * @access private |
|
| 713 | - * @return void |
|
| 714 | - * @throws EE_Error |
|
| 715 | - */ |
|
| 716 | - private function _get_registration_status_array() |
|
| 717 | - { |
|
| 718 | - self::$_reg_status = EEM_Registration::reg_status_array(array(), true); |
|
| 719 | - } |
|
| 720 | - |
|
| 721 | - |
|
| 722 | - /** |
|
| 723 | - * @throws InvalidArgumentException |
|
| 724 | - * @throws InvalidDataTypeException |
|
| 725 | - * @throws InvalidInterfaceException |
|
| 726 | - * @since $VID:$ |
|
| 727 | - */ |
|
| 728 | - protected function _add_screen_options_default() |
|
| 729 | - { |
|
| 730 | - $this->_per_page_screen_option(); |
|
| 731 | - } |
|
| 732 | - |
|
| 733 | - |
|
| 734 | - /** |
|
| 735 | - * @throws InvalidArgumentException |
|
| 736 | - * @throws InvalidDataTypeException |
|
| 737 | - * @throws InvalidInterfaceException |
|
| 738 | - * @since $VID:$ |
|
| 739 | - */ |
|
| 740 | - protected function _add_screen_options_contact_list() |
|
| 741 | - { |
|
| 742 | - $page_title = $this->_admin_page_title; |
|
| 743 | - $this->_admin_page_title = esc_html__('Contacts', 'event_espresso'); |
|
| 744 | - $this->_per_page_screen_option(); |
|
| 745 | - $this->_admin_page_title = $page_title; |
|
| 746 | - } |
|
| 747 | - |
|
| 748 | - |
|
| 749 | - public function load_scripts_styles() |
|
| 750 | - { |
|
| 751 | - // style |
|
| 752 | - wp_register_style( |
|
| 753 | - 'espresso_reg', |
|
| 754 | - REG_ASSETS_URL . 'espresso_registrations_admin.css', |
|
| 755 | - array('ee-admin-css'), |
|
| 756 | - EVENT_ESPRESSO_VERSION |
|
| 757 | - ); |
|
| 758 | - wp_enqueue_style('espresso_reg'); |
|
| 759 | - // script |
|
| 760 | - wp_register_script( |
|
| 761 | - 'espresso_reg', |
|
| 762 | - REG_ASSETS_URL . 'espresso_registrations_admin.js', |
|
| 763 | - array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'), |
|
| 764 | - EVENT_ESPRESSO_VERSION, |
|
| 765 | - true |
|
| 766 | - ); |
|
| 767 | - wp_enqueue_script('espresso_reg'); |
|
| 768 | - } |
|
| 769 | - |
|
| 770 | - |
|
| 771 | - /** |
|
| 772 | - * @throws EE_Error |
|
| 773 | - * @throws InvalidArgumentException |
|
| 774 | - * @throws InvalidDataTypeException |
|
| 775 | - * @throws InvalidInterfaceException |
|
| 776 | - * @throws ReflectionException |
|
| 777 | - * @since $VID:$ |
|
| 778 | - */ |
|
| 779 | - public function load_scripts_styles_edit_attendee() |
|
| 780 | - { |
|
| 781 | - // stuff to only show up on our attendee edit details page. |
|
| 782 | - $attendee_details_translations = array( |
|
| 783 | - 'att_publish_text' => sprintf( |
|
| 784 | - /* translators: The date and time */ |
|
| 785 | - wp_strip_all_tags(__('Created on: %s', 'event_espresso')), |
|
| 786 | - '<b>' . $this->_cpt_model_obj->get_datetime('ATT_created') . '</b>' |
|
| 787 | - ), |
|
| 788 | - ); |
|
| 789 | - wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations); |
|
| 790 | - wp_enqueue_script('jquery-validate'); |
|
| 791 | - } |
|
| 792 | - |
|
| 793 | - |
|
| 794 | - /** |
|
| 795 | - * @throws EE_Error |
|
| 796 | - * @throws InvalidArgumentException |
|
| 797 | - * @throws InvalidDataTypeException |
|
| 798 | - * @throws InvalidInterfaceException |
|
| 799 | - * @throws ReflectionException |
|
| 800 | - * @since $VID:$ |
|
| 801 | - */ |
|
| 802 | - public function load_scripts_styles_view_registration() |
|
| 803 | - { |
|
| 804 | - // styles |
|
| 805 | - wp_enqueue_style('espresso-ui-theme'); |
|
| 806 | - // scripts |
|
| 807 | - $this->_get_reg_custom_questions_form($this->_registration->ID()); |
|
| 808 | - $this->_reg_custom_questions_form->wp_enqueue_scripts(true); |
|
| 809 | - } |
|
| 810 | - |
|
| 811 | - |
|
| 812 | - public function load_scripts_styles_contact_list() |
|
| 813 | - { |
|
| 814 | - wp_dequeue_style('espresso_reg'); |
|
| 815 | - wp_register_style( |
|
| 816 | - 'espresso_att', |
|
| 817 | - REG_ASSETS_URL . 'espresso_attendees_admin.css', |
|
| 818 | - array('ee-admin-css'), |
|
| 819 | - EVENT_ESPRESSO_VERSION |
|
| 820 | - ); |
|
| 821 | - wp_enqueue_style('espresso_att'); |
|
| 822 | - } |
|
| 823 | - |
|
| 824 | - |
|
| 825 | - public function load_scripts_styles_new_registration() |
|
| 826 | - { |
|
| 827 | - wp_register_script( |
|
| 828 | - 'ee-spco-for-admin', |
|
| 829 | - REG_ASSETS_URL . 'spco_for_admin.js', |
|
| 830 | - array('underscore', 'jquery'), |
|
| 831 | - EVENT_ESPRESSO_VERSION, |
|
| 832 | - true |
|
| 833 | - ); |
|
| 834 | - wp_enqueue_script('ee-spco-for-admin'); |
|
| 835 | - add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true'); |
|
| 836 | - EE_Form_Section_Proper::wp_enqueue_scripts(); |
|
| 837 | - EED_Ticket_Selector::load_tckt_slctr_assets(); |
|
| 838 | - EE_Datepicker_Input::enqueue_styles_and_scripts(); |
|
| 839 | - } |
|
| 840 | - |
|
| 841 | - |
|
| 842 | - public function AHEE__EE_Admin_Page__route_admin_request_resend_registration() |
|
| 843 | - { |
|
| 844 | - add_filter('FHEE_load_EE_messages', '__return_true'); |
|
| 845 | - } |
|
| 846 | - |
|
| 847 | - |
|
| 848 | - public function AHEE__EE_Admin_Page__route_admin_request_approve_registration() |
|
| 849 | - { |
|
| 850 | - add_filter('FHEE_load_EE_messages', '__return_true'); |
|
| 851 | - } |
|
| 852 | - |
|
| 853 | - |
|
| 854 | - /** |
|
| 855 | - * @throws EE_Error |
|
| 856 | - * @throws InvalidArgumentException |
|
| 857 | - * @throws InvalidDataTypeException |
|
| 858 | - * @throws InvalidInterfaceException |
|
| 859 | - * @throws ReflectionException |
|
| 860 | - * @since $VID:$ |
|
| 861 | - */ |
|
| 862 | - protected function _set_list_table_views_default() |
|
| 863 | - { |
|
| 864 | - // for notification related bulk actions we need to make sure only active messengers have an option. |
|
| 865 | - EED_Messages::set_autoloaders(); |
|
| 866 | - /** @type EE_Message_Resource_Manager $message_resource_manager */ |
|
| 867 | - $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager'); |
|
| 868 | - $active_mts = $message_resource_manager->list_of_active_message_types(); |
|
| 869 | - // key= bulk_action_slug, value= message type. |
|
| 870 | - $match_array = array( |
|
| 871 | - 'approve_registrations' => 'registration', |
|
| 872 | - 'decline_registrations' => 'declined_registration', |
|
| 873 | - 'pending_registrations' => 'pending_approval', |
|
| 874 | - 'no_approve_registrations' => 'not_approved_registration', |
|
| 875 | - 'cancel_registrations' => 'cancelled_registration', |
|
| 876 | - ); |
|
| 877 | - $can_send = EE_Registry::instance()->CAP->current_user_can( |
|
| 878 | - 'ee_send_message', |
|
| 879 | - 'batch_send_messages' |
|
| 880 | - ); |
|
| 881 | - /** setup reg status bulk actions **/ |
|
| 882 | - $def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso'); |
|
| 883 | - if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) { |
|
| 884 | - $def_reg_status_actions['approve_and_notify_registrations'] = esc_html__( |
|
| 885 | - 'Approve and Notify Registrations', |
|
| 886 | - 'event_espresso' |
|
| 887 | - ); |
|
| 888 | - } |
|
| 889 | - $def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso'); |
|
| 890 | - if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) { |
|
| 891 | - $def_reg_status_actions['decline_and_notify_registrations'] = esc_html__( |
|
| 892 | - 'Decline and Notify Registrations', |
|
| 893 | - 'event_espresso' |
|
| 894 | - ); |
|
| 895 | - } |
|
| 896 | - $def_reg_status_actions['pending_registrations'] = esc_html__( |
|
| 897 | - 'Set Registrations to Pending Payment', |
|
| 898 | - 'event_espresso' |
|
| 899 | - ); |
|
| 900 | - if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) { |
|
| 901 | - $def_reg_status_actions['pending_and_notify_registrations'] = esc_html__( |
|
| 902 | - 'Set Registrations to Pending Payment and Notify', |
|
| 903 | - 'event_espresso' |
|
| 904 | - ); |
|
| 905 | - } |
|
| 906 | - $def_reg_status_actions['no_approve_registrations'] = esc_html__( |
|
| 907 | - 'Set Registrations to Not Approved', |
|
| 908 | - 'event_espresso' |
|
| 909 | - ); |
|
| 910 | - if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) { |
|
| 911 | - $def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__( |
|
| 912 | - 'Set Registrations to Not Approved and Notify', |
|
| 913 | - 'event_espresso' |
|
| 914 | - ); |
|
| 915 | - } |
|
| 916 | - $def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso'); |
|
| 917 | - if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) { |
|
| 918 | - $def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__( |
|
| 919 | - 'Cancel Registrations and Notify', |
|
| 920 | - 'event_espresso' |
|
| 921 | - ); |
|
| 922 | - } |
|
| 923 | - $def_reg_status_actions = apply_filters( |
|
| 924 | - 'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array', |
|
| 925 | - $def_reg_status_actions, |
|
| 926 | - $active_mts, |
|
| 927 | - $can_send |
|
| 928 | - ); |
|
| 929 | - |
|
| 930 | - $this->_views = array( |
|
| 931 | - 'all' => array( |
|
| 932 | - 'slug' => 'all', |
|
| 933 | - 'label' => esc_html__('View All Registrations', 'event_espresso'), |
|
| 934 | - 'count' => 0, |
|
| 935 | - 'bulk_action' => array_merge( |
|
| 936 | - $def_reg_status_actions, |
|
| 937 | - array( |
|
| 938 | - 'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'), |
|
| 939 | - ) |
|
| 940 | - ), |
|
| 941 | - ), |
|
| 942 | - 'month' => array( |
|
| 943 | - 'slug' => 'month', |
|
| 944 | - 'label' => esc_html__('This Month', 'event_espresso'), |
|
| 945 | - 'count' => 0, |
|
| 946 | - 'bulk_action' => array_merge( |
|
| 947 | - $def_reg_status_actions, |
|
| 948 | - array( |
|
| 949 | - 'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'), |
|
| 950 | - ) |
|
| 951 | - ), |
|
| 952 | - ), |
|
| 953 | - 'today' => array( |
|
| 954 | - 'slug' => 'today', |
|
| 955 | - 'label' => sprintf( |
|
| 956 | - esc_html__('Today - %s', 'event_espresso'), |
|
| 957 | - date('M d, Y', current_time('timestamp')) |
|
| 958 | - ), |
|
| 959 | - 'count' => 0, |
|
| 960 | - 'bulk_action' => array_merge( |
|
| 961 | - $def_reg_status_actions, |
|
| 962 | - array( |
|
| 963 | - 'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'), |
|
| 964 | - ) |
|
| 965 | - ), |
|
| 966 | - ), |
|
| 967 | - ); |
|
| 968 | - if (EE_Registry::instance()->CAP->current_user_can( |
|
| 969 | - 'ee_delete_registrations', |
|
| 970 | - 'espresso_registrations_delete_registration' |
|
| 971 | - )) { |
|
| 972 | - $this->_views['incomplete'] = array( |
|
| 973 | - 'slug' => 'incomplete', |
|
| 974 | - 'label' => esc_html__('Incomplete', 'event_espresso'), |
|
| 975 | - 'count' => 0, |
|
| 976 | - 'bulk_action' => array( |
|
| 977 | - 'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'), |
|
| 978 | - ), |
|
| 979 | - ); |
|
| 980 | - $this->_views['trash'] = array( |
|
| 981 | - 'slug' => 'trash', |
|
| 982 | - 'label' => esc_html__('Trash', 'event_espresso'), |
|
| 983 | - 'count' => 0, |
|
| 984 | - 'bulk_action' => array( |
|
| 985 | - 'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'), |
|
| 986 | - 'delete_registrations' => esc_html__('Delete Registrations Permanently', 'event_espresso'), |
|
| 987 | - ), |
|
| 988 | - ); |
|
| 989 | - } |
|
| 990 | - } |
|
| 991 | - |
|
| 992 | - |
|
| 993 | - protected function _set_list_table_views_contact_list() |
|
| 994 | - { |
|
| 995 | - $this->_views = array( |
|
| 996 | - 'in_use' => array( |
|
| 997 | - 'slug' => 'in_use', |
|
| 998 | - 'label' => esc_html__('In Use', 'event_espresso'), |
|
| 999 | - 'count' => 0, |
|
| 1000 | - 'bulk_action' => array( |
|
| 1001 | - 'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'), |
|
| 1002 | - ), |
|
| 1003 | - ), |
|
| 1004 | - ); |
|
| 1005 | - if (EE_Registry::instance()->CAP->current_user_can( |
|
| 1006 | - 'ee_delete_contacts', |
|
| 1007 | - 'espresso_registrations_trash_attendees' |
|
| 1008 | - ) |
|
| 1009 | - ) { |
|
| 1010 | - $this->_views['trash'] = array( |
|
| 1011 | - 'slug' => 'trash', |
|
| 1012 | - 'label' => esc_html__('Trash', 'event_espresso'), |
|
| 1013 | - 'count' => 0, |
|
| 1014 | - 'bulk_action' => array( |
|
| 1015 | - 'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'), |
|
| 1016 | - ), |
|
| 1017 | - ); |
|
| 1018 | - } |
|
| 1019 | - } |
|
| 1020 | - |
|
| 1021 | - |
|
| 1022 | - protected function _registration_legend_items() |
|
| 1023 | - { |
|
| 1024 | - $fc_items = array( |
|
| 1025 | - 'star-icon' => array( |
|
| 1026 | - 'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8', |
|
| 1027 | - 'desc' => esc_html__('This is the Primary Registrant', 'event_espresso'), |
|
| 1028 | - ), |
|
| 1029 | - 'view_details' => array( |
|
| 1030 | - 'class' => 'dashicons dashicons-clipboard', |
|
| 1031 | - 'desc' => esc_html__('View Registration Details', 'event_espresso'), |
|
| 1032 | - ), |
|
| 1033 | - 'edit_attendee' => array( |
|
| 1034 | - 'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16', |
|
| 1035 | - 'desc' => esc_html__('Edit Contact Details', 'event_espresso'), |
|
| 1036 | - ), |
|
| 1037 | - 'view_transaction' => array( |
|
| 1038 | - 'class' => 'dashicons dashicons-cart', |
|
| 1039 | - 'desc' => esc_html__('View Transaction Details', 'event_espresso'), |
|
| 1040 | - ), |
|
| 1041 | - 'view_invoice' => array( |
|
| 1042 | - 'class' => 'dashicons dashicons-media-spreadsheet', |
|
| 1043 | - 'desc' => esc_html__('View Transaction Invoice', 'event_espresso'), |
|
| 1044 | - ), |
|
| 1045 | - ); |
|
| 1046 | - if (EE_Registry::instance()->CAP->current_user_can( |
|
| 1047 | - 'ee_send_message', |
|
| 1048 | - 'espresso_registrations_resend_registration' |
|
| 1049 | - )) { |
|
| 1050 | - $fc_items['resend_registration'] = array( |
|
| 1051 | - 'class' => 'dashicons dashicons-email-alt', |
|
| 1052 | - 'desc' => esc_html__('Resend Registration Details', 'event_espresso'), |
|
| 1053 | - ); |
|
| 1054 | - } else { |
|
| 1055 | - $fc_items['blank'] = array('class' => 'blank', 'desc' => ''); |
|
| 1056 | - } |
|
| 1057 | - if (EE_Registry::instance()->CAP->current_user_can( |
|
| 1058 | - 'ee_read_global_messages', |
|
| 1059 | - 'view_filtered_messages' |
|
| 1060 | - )) { |
|
| 1061 | - $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for'); |
|
| 1062 | - if (is_array($related_for_icon) && isset($related_for_icon['css_class'], $related_for_icon['label'])) { |
|
| 1063 | - $fc_items['view_related_messages'] = array( |
|
| 1064 | - 'class' => $related_for_icon['css_class'], |
|
| 1065 | - 'desc' => $related_for_icon['label'], |
|
| 1066 | - ); |
|
| 1067 | - } |
|
| 1068 | - } |
|
| 1069 | - $sc_items = array( |
|
| 1070 | - 'approved_status' => array( |
|
| 1071 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved, |
|
| 1072 | - 'desc' => EEH_Template::pretty_status( |
|
| 1073 | - EEM_Registration::status_id_approved, |
|
| 1074 | - false, |
|
| 1075 | - 'sentence' |
|
| 1076 | - ), |
|
| 1077 | - ), |
|
| 1078 | - 'pending_status' => array( |
|
| 1079 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment, |
|
| 1080 | - 'desc' => EEH_Template::pretty_status( |
|
| 1081 | - EEM_Registration::status_id_pending_payment, |
|
| 1082 | - false, |
|
| 1083 | - 'sentence' |
|
| 1084 | - ), |
|
| 1085 | - ), |
|
| 1086 | - 'wait_list' => array( |
|
| 1087 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list, |
|
| 1088 | - 'desc' => EEH_Template::pretty_status( |
|
| 1089 | - EEM_Registration::status_id_wait_list, |
|
| 1090 | - false, |
|
| 1091 | - 'sentence' |
|
| 1092 | - ), |
|
| 1093 | - ), |
|
| 1094 | - 'incomplete_status' => array( |
|
| 1095 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete, |
|
| 1096 | - 'desc' => EEH_Template::pretty_status( |
|
| 1097 | - EEM_Registration::status_id_incomplete, |
|
| 1098 | - false, |
|
| 1099 | - 'sentence' |
|
| 1100 | - ), |
|
| 1101 | - ), |
|
| 1102 | - 'not_approved' => array( |
|
| 1103 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved, |
|
| 1104 | - 'desc' => EEH_Template::pretty_status( |
|
| 1105 | - EEM_Registration::status_id_not_approved, |
|
| 1106 | - false, |
|
| 1107 | - 'sentence' |
|
| 1108 | - ), |
|
| 1109 | - ), |
|
| 1110 | - 'declined_status' => array( |
|
| 1111 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined, |
|
| 1112 | - 'desc' => EEH_Template::pretty_status( |
|
| 1113 | - EEM_Registration::status_id_declined, |
|
| 1114 | - false, |
|
| 1115 | - 'sentence' |
|
| 1116 | - ), |
|
| 1117 | - ), |
|
| 1118 | - 'cancelled_status' => array( |
|
| 1119 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled, |
|
| 1120 | - 'desc' => EEH_Template::pretty_status( |
|
| 1121 | - EEM_Registration::status_id_cancelled, |
|
| 1122 | - false, |
|
| 1123 | - 'sentence' |
|
| 1124 | - ), |
|
| 1125 | - ), |
|
| 1126 | - ); |
|
| 1127 | - return array_merge($fc_items, $sc_items); |
|
| 1128 | - } |
|
| 1129 | - |
|
| 1130 | - |
|
| 1131 | - |
|
| 1132 | - /*************************************** REGISTRATION OVERVIEW **************************************/ |
|
| 1133 | - |
|
| 1134 | - |
|
| 1135 | - |
|
| 1136 | - /** |
|
| 1137 | - * @throws DomainException |
|
| 1138 | - * @throws EE_Error |
|
| 1139 | - * @throws InvalidArgumentException |
|
| 1140 | - * @throws InvalidDataTypeException |
|
| 1141 | - * @throws InvalidInterfaceException |
|
| 1142 | - * @throws ReflectionException |
|
| 1143 | - */ |
|
| 1144 | - protected function _registrations_overview_list_table() |
|
| 1145 | - { |
|
| 1146 | - $this->appendAddNewRegistrationButtonToPageTitle(); |
|
| 1147 | - $header_text = ''; |
|
| 1148 | - $admin_page_header_decorators = [ |
|
| 1149 | - 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\AttendeeFilterHeader', |
|
| 1150 | - 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\EventFilterHeader', |
|
| 1151 | - 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\DateFilterHeader', |
|
| 1152 | - 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\TicketFilterHeader', |
|
| 1153 | - ]; |
|
| 1154 | - foreach ($admin_page_header_decorators as $admin_page_header_decorator) { |
|
| 1155 | - $filter_header_decorator = $this->loader->getNew($admin_page_header_decorator); |
|
| 1156 | - $header_text = $filter_header_decorator->getHeaderText($header_text); |
|
| 1157 | - } |
|
| 1158 | - $this->_template_args['admin_page_header'] = $header_text; |
|
| 1159 | - $this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items()); |
|
| 1160 | - $this->display_admin_list_table_page_with_no_sidebar(); |
|
| 1161 | - } |
|
| 1162 | - |
|
| 1163 | - |
|
| 1164 | - /** |
|
| 1165 | - * @throws EE_Error |
|
| 1166 | - * @throws InvalidArgumentException |
|
| 1167 | - * @throws InvalidDataTypeException |
|
| 1168 | - * @throws InvalidInterfaceException |
|
| 1169 | - */ |
|
| 1170 | - private function appendAddNewRegistrationButtonToPageTitle() |
|
| 1171 | - { |
|
| 1172 | - $EVT_ID = ! empty($this->_req_data['event_id']) |
|
| 1173 | - ? absint($this->_req_data['event_id']) |
|
| 1174 | - : 0; |
|
| 1175 | - if ($EVT_ID |
|
| 1176 | - && EE_Registry::instance()->CAP->current_user_can( |
|
| 1177 | - 'ee_edit_registrations', |
|
| 1178 | - 'espresso_registrations_new_registration', |
|
| 1179 | - $EVT_ID |
|
| 1180 | - ) |
|
| 1181 | - ) { |
|
| 1182 | - $this->_admin_page_title .= ' ' . $this->get_action_link_or_button( |
|
| 1183 | - 'new_registration', |
|
| 1184 | - 'add-registrant', |
|
| 1185 | - array('event_id' => $EVT_ID), |
|
| 1186 | - 'add-new-h2' |
|
| 1187 | - ); |
|
| 1188 | - } |
|
| 1189 | - } |
|
| 1190 | - |
|
| 1191 | - |
|
| 1192 | - /** |
|
| 1193 | - * This sets the _registration property for the registration details screen |
|
| 1194 | - * |
|
| 1195 | - * @access private |
|
| 1196 | - * @return bool |
|
| 1197 | - * @throws EE_Error |
|
| 1198 | - * @throws InvalidArgumentException |
|
| 1199 | - * @throws InvalidDataTypeException |
|
| 1200 | - * @throws InvalidInterfaceException |
|
| 1201 | - */ |
|
| 1202 | - private function _set_registration_object() |
|
| 1203 | - { |
|
| 1204 | - // get out if we've already set the object |
|
| 1205 | - if ($this->_registration instanceof EE_Registration) { |
|
| 1206 | - return true; |
|
| 1207 | - } |
|
| 1208 | - $REG_ID = (! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false; |
|
| 1209 | - if ($this->_registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID)) { |
|
| 1210 | - return true; |
|
| 1211 | - } |
|
| 1212 | - $error_msg = sprintf( |
|
| 1213 | - esc_html__( |
|
| 1214 | - 'An error occurred and the details for Registration ID #%s could not be retrieved.', |
|
| 1215 | - 'event_espresso' |
|
| 1216 | - ), |
|
| 1217 | - $REG_ID |
|
| 1218 | - ); |
|
| 1219 | - EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__); |
|
| 1220 | - $this->_registration = null; |
|
| 1221 | - return false; |
|
| 1222 | - } |
|
| 1223 | - |
|
| 1224 | - |
|
| 1225 | - /** |
|
| 1226 | - * Used to retrieve registrations for the list table. |
|
| 1227 | - * |
|
| 1228 | - * @param int $per_page |
|
| 1229 | - * @param bool $count |
|
| 1230 | - * @param bool $this_month |
|
| 1231 | - * @param bool $today |
|
| 1232 | - * @return EE_Registration[]|int |
|
| 1233 | - * @throws EE_Error |
|
| 1234 | - * @throws InvalidArgumentException |
|
| 1235 | - * @throws InvalidDataTypeException |
|
| 1236 | - * @throws InvalidInterfaceException |
|
| 1237 | - */ |
|
| 1238 | - public function get_registrations( |
|
| 1239 | - $per_page = 10, |
|
| 1240 | - $count = false, |
|
| 1241 | - $this_month = false, |
|
| 1242 | - $today = false |
|
| 1243 | - ) { |
|
| 1244 | - if ($this_month) { |
|
| 1245 | - $this->_req_data['status'] = 'month'; |
|
| 1246 | - } |
|
| 1247 | - if ($today) { |
|
| 1248 | - $this->_req_data['status'] = 'today'; |
|
| 1249 | - } |
|
| 1250 | - $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count); |
|
| 1251 | - /** |
|
| 1252 | - * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected |
|
| 1253 | - * |
|
| 1254 | - * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093 |
|
| 1255 | - * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md |
|
| 1256 | - * or if you have the development copy of EE you can view this at the path: |
|
| 1257 | - * /docs/G--Model-System/model-query-params.md |
|
| 1258 | - */ |
|
| 1259 | - $query_params['group_by'] = ''; |
|
| 1260 | - |
|
| 1261 | - return $count |
|
| 1262 | - ? $this->getRegistrationModel()->count($query_params) |
|
| 1263 | - /** @type EE_Registration[] */ |
|
| 1264 | - : $this->getRegistrationModel()->get_all($query_params); |
|
| 1265 | - } |
|
| 1266 | - |
|
| 1267 | - |
|
| 1268 | - /** |
|
| 1269 | - * Retrieves the query parameters to be used by the Registration model for getting registrations. |
|
| 1270 | - * Note: this listens to values on the request for some of the query parameters. |
|
| 1271 | - * |
|
| 1272 | - * @param array $request |
|
| 1273 | - * @param int $per_page |
|
| 1274 | - * @param bool $count |
|
| 1275 | - * @return array |
|
| 1276 | - * @throws EE_Error |
|
| 1277 | - * @throws InvalidArgumentException |
|
| 1278 | - * @throws InvalidDataTypeException |
|
| 1279 | - * @throws InvalidInterfaceException |
|
| 1280 | - */ |
|
| 1281 | - protected function _get_registration_query_parameters( |
|
| 1282 | - $request = array(), |
|
| 1283 | - $per_page = 10, |
|
| 1284 | - $count = false |
|
| 1285 | - ) { |
|
| 1286 | - /** @var EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder $list_table_query_builder */ |
|
| 1287 | - $list_table_query_builder = $this->loader->getNew( |
|
| 1288 | - 'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder', |
|
| 1289 | - [ $request ] |
|
| 1290 | - ); |
|
| 1291 | - return $list_table_query_builder->getQueryParams($per_page, $count); |
|
| 1292 | - } |
|
| 1293 | - |
|
| 1294 | - |
|
| 1295 | - public function get_registration_status_array() |
|
| 1296 | - { |
|
| 1297 | - return self::$_reg_status; |
|
| 1298 | - } |
|
| 1299 | - |
|
| 1300 | - |
|
| 1301 | - |
|
| 1302 | - |
|
| 1303 | - /*************************************** REGISTRATION DETAILS ***************************************/ |
|
| 1304 | - /** |
|
| 1305 | - * generates HTML for the View Registration Details Admin page |
|
| 1306 | - * |
|
| 1307 | - * @access protected |
|
| 1308 | - * @return void |
|
| 1309 | - * @throws DomainException |
|
| 1310 | - * @throws EE_Error |
|
| 1311 | - * @throws InvalidArgumentException |
|
| 1312 | - * @throws InvalidDataTypeException |
|
| 1313 | - * @throws InvalidInterfaceException |
|
| 1314 | - * @throws EntityNotFoundException |
|
| 1315 | - * @throws ReflectionException |
|
| 1316 | - */ |
|
| 1317 | - protected function _registration_details() |
|
| 1318 | - { |
|
| 1319 | - $this->_template_args = array(); |
|
| 1320 | - $this->_set_registration_object(); |
|
| 1321 | - if (is_object($this->_registration)) { |
|
| 1322 | - $transaction = $this->_registration->transaction() |
|
| 1323 | - ? $this->_registration->transaction() |
|
| 1324 | - : EE_Transaction::new_instance(); |
|
| 1325 | - $this->_session = $transaction->session_data(); |
|
| 1326 | - $event_id = $this->_registration->event_ID(); |
|
| 1327 | - $this->_template_args['reg_nmbr']['value'] = $this->_registration->ID(); |
|
| 1328 | - $this->_template_args['reg_nmbr']['label'] = esc_html__('Registration Number', 'event_espresso'); |
|
| 1329 | - $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date'); |
|
| 1330 | - $this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso'); |
|
| 1331 | - $this->_template_args['grand_total'] = $transaction->total(); |
|
| 1332 | - $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign; |
|
| 1333 | - // link back to overview |
|
| 1334 | - $this->_template_args['reg_overview_url'] = REG_ADMIN_URL; |
|
| 1335 | - $this->_template_args['registration'] = $this->_registration; |
|
| 1336 | - $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce( |
|
| 1337 | - array( |
|
| 1338 | - 'action' => 'default', |
|
| 1339 | - 'event_id' => $event_id, |
|
| 1340 | - ), |
|
| 1341 | - REG_ADMIN_URL |
|
| 1342 | - ); |
|
| 1343 | - $this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce( |
|
| 1344 | - array( |
|
| 1345 | - 'action' => 'default', |
|
| 1346 | - 'EVT_ID' => $event_id, |
|
| 1347 | - 'page' => 'espresso_transactions', |
|
| 1348 | - ), |
|
| 1349 | - admin_url('admin.php') |
|
| 1350 | - ); |
|
| 1351 | - $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce( |
|
| 1352 | - array( |
|
| 1353 | - 'page' => 'espresso_events', |
|
| 1354 | - 'action' => 'edit', |
|
| 1355 | - 'post' => $event_id, |
|
| 1356 | - ), |
|
| 1357 | - admin_url('admin.php') |
|
| 1358 | - ); |
|
| 1359 | - // next and previous links |
|
| 1360 | - $next_reg = $this->_registration->next( |
|
| 1361 | - null, |
|
| 1362 | - array(), |
|
| 1363 | - 'REG_ID' |
|
| 1364 | - ); |
|
| 1365 | - $this->_template_args['next_registration'] = $next_reg |
|
| 1366 | - ? $this->_next_link( |
|
| 1367 | - EE_Admin_Page::add_query_args_and_nonce( |
|
| 1368 | - array( |
|
| 1369 | - 'action' => 'view_registration', |
|
| 1370 | - '_REG_ID' => $next_reg['REG_ID'], |
|
| 1371 | - ), |
|
| 1372 | - REG_ADMIN_URL |
|
| 1373 | - ), |
|
| 1374 | - 'dashicons dashicons-arrow-right ee-icon-size-22' |
|
| 1375 | - ) |
|
| 1376 | - : ''; |
|
| 1377 | - $previous_reg = $this->_registration->previous( |
|
| 1378 | - null, |
|
| 1379 | - array(), |
|
| 1380 | - 'REG_ID' |
|
| 1381 | - ); |
|
| 1382 | - $this->_template_args['previous_registration'] = $previous_reg |
|
| 1383 | - ? $this->_previous_link( |
|
| 1384 | - EE_Admin_Page::add_query_args_and_nonce( |
|
| 1385 | - array( |
|
| 1386 | - 'action' => 'view_registration', |
|
| 1387 | - '_REG_ID' => $previous_reg['REG_ID'], |
|
| 1388 | - ), |
|
| 1389 | - REG_ADMIN_URL |
|
| 1390 | - ), |
|
| 1391 | - 'dashicons dashicons-arrow-left ee-icon-size-22' |
|
| 1392 | - ) |
|
| 1393 | - : ''; |
|
| 1394 | - // grab header |
|
| 1395 | - $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php'; |
|
| 1396 | - $this->_template_args['REG_ID'] = $this->_registration->ID(); |
|
| 1397 | - $this->_template_args['admin_page_header'] = EEH_Template::display_template( |
|
| 1398 | - $template_path, |
|
| 1399 | - $this->_template_args, |
|
| 1400 | - true |
|
| 1401 | - ); |
|
| 1402 | - } else { |
|
| 1403 | - $this->_template_args['admin_page_header'] = $this->display_espresso_notices(); |
|
| 1404 | - } |
|
| 1405 | - // the details template wrapper |
|
| 1406 | - $this->display_admin_page_with_sidebar(); |
|
| 1407 | - } |
|
| 1408 | - |
|
| 1409 | - |
|
| 1410 | - /** |
|
| 1411 | - * @throws EE_Error |
|
| 1412 | - * @throws InvalidArgumentException |
|
| 1413 | - * @throws InvalidDataTypeException |
|
| 1414 | - * @throws InvalidInterfaceException |
|
| 1415 | - * @throws ReflectionException |
|
| 1416 | - * @since $VID:$ |
|
| 1417 | - */ |
|
| 1418 | - protected function _registration_details_metaboxes() |
|
| 1419 | - { |
|
| 1420 | - do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this); |
|
| 1421 | - $this->_set_registration_object(); |
|
| 1422 | - $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null; |
|
| 1423 | - add_meta_box( |
|
| 1424 | - 'edit-reg-status-mbox', |
|
| 1425 | - esc_html__('Registration Status', 'event_espresso'), |
|
| 1426 | - array($this, 'set_reg_status_buttons_metabox'), |
|
| 1427 | - $this->wp_page_slug, |
|
| 1428 | - 'normal', |
|
| 1429 | - 'high' |
|
| 1430 | - ); |
|
| 1431 | - add_meta_box( |
|
| 1432 | - 'edit-reg-details-mbox', |
|
| 1433 | - esc_html__('Registration Details', 'event_espresso'), |
|
| 1434 | - array($this, '_reg_details_meta_box'), |
|
| 1435 | - $this->wp_page_slug, |
|
| 1436 | - 'normal', |
|
| 1437 | - 'high' |
|
| 1438 | - ); |
|
| 1439 | - if ($attendee instanceof EE_Attendee |
|
| 1440 | - && EE_Registry::instance()->CAP->current_user_can( |
|
| 1441 | - 'ee_read_registration', |
|
| 1442 | - 'edit-reg-questions-mbox', |
|
| 1443 | - $this->_registration->ID() |
|
| 1444 | - ) |
|
| 1445 | - ) { |
|
| 1446 | - add_meta_box( |
|
| 1447 | - 'edit-reg-questions-mbox', |
|
| 1448 | - esc_html__('Registration Form Answers', 'event_espresso'), |
|
| 1449 | - array($this, '_reg_questions_meta_box'), |
|
| 1450 | - $this->wp_page_slug, |
|
| 1451 | - 'normal', |
|
| 1452 | - 'high' |
|
| 1453 | - ); |
|
| 1454 | - } |
|
| 1455 | - add_meta_box( |
|
| 1456 | - 'edit-reg-registrant-mbox', |
|
| 1457 | - esc_html__('Contact Details', 'event_espresso'), |
|
| 1458 | - array($this, '_reg_registrant_side_meta_box'), |
|
| 1459 | - $this->wp_page_slug, |
|
| 1460 | - 'side', |
|
| 1461 | - 'high' |
|
| 1462 | - ); |
|
| 1463 | - if ($this->_registration->group_size() > 1) { |
|
| 1464 | - add_meta_box( |
|
| 1465 | - 'edit-reg-attendees-mbox', |
|
| 1466 | - esc_html__('Other Registrations in this Transaction', 'event_espresso'), |
|
| 1467 | - array($this, '_reg_attendees_meta_box'), |
|
| 1468 | - $this->wp_page_slug, |
|
| 1469 | - 'normal', |
|
| 1470 | - 'high' |
|
| 1471 | - ); |
|
| 1472 | - } |
|
| 1473 | - } |
|
| 1474 | - |
|
| 1475 | - |
|
| 1476 | - /** |
|
| 1477 | - * set_reg_status_buttons_metabox |
|
| 1478 | - * |
|
| 1479 | - * @access protected |
|
| 1480 | - * @return string |
|
| 1481 | - * @throws EE_Error |
|
| 1482 | - * @throws EntityNotFoundException |
|
| 1483 | - * @throws InvalidArgumentException |
|
| 1484 | - * @throws InvalidDataTypeException |
|
| 1485 | - * @throws InvalidInterfaceException |
|
| 1486 | - * @throws ReflectionException |
|
| 1487 | - */ |
|
| 1488 | - public function set_reg_status_buttons_metabox() |
|
| 1489 | - { |
|
| 1490 | - $this->_set_registration_object(); |
|
| 1491 | - $change_reg_status_form = $this->_generate_reg_status_change_form(); |
|
| 1492 | - echo $change_reg_status_form->form_open( |
|
| 1493 | - self::add_query_args_and_nonce( |
|
| 1494 | - array( |
|
| 1495 | - 'action' => 'change_reg_status', |
|
| 1496 | - ), |
|
| 1497 | - REG_ADMIN_URL |
|
| 1498 | - ) |
|
| 1499 | - ); |
|
| 1500 | - echo $change_reg_status_form->get_html(); |
|
| 1501 | - echo $change_reg_status_form->form_close(); |
|
| 1502 | - } |
|
| 1503 | - |
|
| 1504 | - |
|
| 1505 | - /** |
|
| 1506 | - * @return EE_Form_Section_Proper |
|
| 1507 | - * @throws EE_Error |
|
| 1508 | - * @throws InvalidArgumentException |
|
| 1509 | - * @throws InvalidDataTypeException |
|
| 1510 | - * @throws InvalidInterfaceException |
|
| 1511 | - * @throws EntityNotFoundException |
|
| 1512 | - * @throws ReflectionException |
|
| 1513 | - */ |
|
| 1514 | - protected function _generate_reg_status_change_form() |
|
| 1515 | - { |
|
| 1516 | - $reg_status_change_form_array = array( |
|
| 1517 | - 'name' => 'reg_status_change_form', |
|
| 1518 | - 'html_id' => 'reg-status-change-form', |
|
| 1519 | - 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
|
| 1520 | - 'subsections' => array( |
|
| 1521 | - 'return' => new EE_Hidden_Input( |
|
| 1522 | - array( |
|
| 1523 | - 'name' => 'return', |
|
| 1524 | - 'default' => 'view_registration', |
|
| 1525 | - ) |
|
| 1526 | - ), |
|
| 1527 | - 'REG_ID' => new EE_Hidden_Input( |
|
| 1528 | - array( |
|
| 1529 | - 'name' => 'REG_ID', |
|
| 1530 | - 'default' => $this->_registration->ID(), |
|
| 1531 | - ) |
|
| 1532 | - ), |
|
| 1533 | - 'current_status' => new EE_Form_Section_HTML( |
|
| 1534 | - EEH_HTML::table( |
|
| 1535 | - EEH_HTML::tr( |
|
| 1536 | - EEH_HTML::th( |
|
| 1537 | - EEH_HTML::label( |
|
| 1538 | - EEH_HTML::strong( |
|
| 1539 | - esc_html__('Current Registration Status', 'event_espresso') |
|
| 1540 | - ) |
|
| 1541 | - ) |
|
| 1542 | - ) |
|
| 1543 | - . EEH_HTML::td( |
|
| 1544 | - EEH_HTML::strong( |
|
| 1545 | - $this->_registration->pretty_status(), |
|
| 1546 | - '', |
|
| 1547 | - 'status-' . $this->_registration->status_ID(), |
|
| 1548 | - 'line-height: 1em; font-size: 1.5em; font-weight: bold;' |
|
| 1549 | - ) |
|
| 1550 | - ) |
|
| 1551 | - ) |
|
| 1552 | - ) |
|
| 1553 | - ) |
|
| 1554 | - ) |
|
| 1555 | - ); |
|
| 1556 | - if (EE_Registry::instance()->CAP->current_user_can( |
|
| 1557 | - 'ee_edit_registration', |
|
| 1558 | - 'toggle_registration_status', |
|
| 1559 | - $this->_registration->ID() |
|
| 1560 | - )) { |
|
| 1561 | - $reg_status_change_form_array['subsections']['reg_status'] = new EE_Select_Input( |
|
| 1562 | - $this->_get_reg_statuses(), |
|
| 1563 | - array( |
|
| 1564 | - 'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'), |
|
| 1565 | - 'default' => $this->_registration->status_ID(), |
|
| 1566 | - ) |
|
| 1567 | - ); |
|
| 1568 | - $reg_status_change_form_array['subsections']['send_notifications'] = new EE_Yes_No_Input( |
|
| 1569 | - array( |
|
| 1570 | - 'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'), |
|
| 1571 | - 'default' => false, |
|
| 1572 | - 'html_help_text' => esc_html__( |
|
| 1573 | - 'If set to "Yes", then the related messages will be sent to the registrant.', |
|
| 1574 | - 'event_espresso' |
|
| 1575 | - ) |
|
| 1576 | - ) |
|
| 1577 | - ); |
|
| 1578 | - $reg_status_change_form_array['subsections']['submit'] = new EE_Submit_Input( |
|
| 1579 | - array( |
|
| 1580 | - 'html_class' => 'button-primary', |
|
| 1581 | - 'html_label_text' => ' ', |
|
| 1582 | - 'default' => esc_html__('Update Registration Status', 'event_espresso'), |
|
| 1583 | - ) |
|
| 1584 | - ); |
|
| 1585 | - } |
|
| 1586 | - return new EE_Form_Section_Proper($reg_status_change_form_array); |
|
| 1587 | - } |
|
| 1588 | - |
|
| 1589 | - |
|
| 1590 | - /** |
|
| 1591 | - * Returns an array of all the buttons for the various statuses and switch status actions |
|
| 1592 | - * |
|
| 1593 | - * @return array |
|
| 1594 | - * @throws EE_Error |
|
| 1595 | - * @throws InvalidArgumentException |
|
| 1596 | - * @throws InvalidDataTypeException |
|
| 1597 | - * @throws InvalidInterfaceException |
|
| 1598 | - * @throws EntityNotFoundException |
|
| 1599 | - */ |
|
| 1600 | - protected function _get_reg_statuses() |
|
| 1601 | - { |
|
| 1602 | - $reg_status_array = $this->getRegistrationModel()->reg_status_array(); |
|
| 1603 | - unset($reg_status_array[ EEM_Registration::status_id_incomplete ]); |
|
| 1604 | - // get current reg status |
|
| 1605 | - $current_status = $this->_registration->status_ID(); |
|
| 1606 | - // is registration for free event? This will determine whether to display the pending payment option |
|
| 1607 | - if ($current_status !== EEM_Registration::status_id_pending_payment |
|
| 1608 | - && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00) |
|
| 1609 | - ) { |
|
| 1610 | - unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]); |
|
| 1611 | - } |
|
| 1612 | - return $this->getStatusModel()->localized_status($reg_status_array, false, 'sentence'); |
|
| 1613 | - } |
|
| 1614 | - |
|
| 1615 | - |
|
| 1616 | - /** |
|
| 1617 | - * This method is used when using _REG_ID from request which may or may not be an array of reg_ids. |
|
| 1618 | - * |
|
| 1619 | - * @param bool $status REG status given for changing registrations to. |
|
| 1620 | - * @param bool $notify Whether to send messages notifications or not. |
|
| 1621 | - * @return array (array with reg_id(s) updated and whether update was successful. |
|
| 1622 | - * @throws DomainException |
|
| 1623 | - * @throws EE_Error |
|
| 1624 | - * @throws EntityNotFoundException |
|
| 1625 | - * @throws InvalidArgumentException |
|
| 1626 | - * @throws InvalidDataTypeException |
|
| 1627 | - * @throws InvalidInterfaceException |
|
| 1628 | - * @throws ReflectionException |
|
| 1629 | - * @throws RuntimeException |
|
| 1630 | - */ |
|
| 1631 | - protected function _set_registration_status_from_request($status = false, $notify = false) |
|
| 1632 | - { |
|
| 1633 | - if (isset($this->_req_data['reg_status_change_form'])) { |
|
| 1634 | - $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID']) |
|
| 1635 | - ? (array) $this->_req_data['reg_status_change_form']['REG_ID'] |
|
| 1636 | - : array(); |
|
| 1637 | - } else { |
|
| 1638 | - $REG_IDs = isset($this->_req_data['_REG_ID']) |
|
| 1639 | - ? (array) $this->_req_data['_REG_ID'] |
|
| 1640 | - : array(); |
|
| 1641 | - } |
|
| 1642 | - // sanitize $REG_IDs |
|
| 1643 | - $REG_IDs = array_map('absint', $REG_IDs); |
|
| 1644 | - // and remove empty entries |
|
| 1645 | - $REG_IDs = array_filter($REG_IDs); |
|
| 1646 | - |
|
| 1647 | - $result = $this->_set_registration_status($REG_IDs, $status, $notify); |
|
| 1648 | - |
|
| 1649 | - /** |
|
| 1650 | - * Set and filter $_req_data['_REG_ID'] for any potential future messages notifications. |
|
| 1651 | - * Currently this value is used downstream by the _process_resend_registration method. |
|
| 1652 | - * |
|
| 1653 | - * @param int|array $registration_ids The registration ids that have had their status changed successfully. |
|
| 1654 | - * @param bool $status The status registrations were changed to. |
|
| 1655 | - * @param bool $success If the status was changed successfully for all registrations. |
|
| 1656 | - * @param Registrations_Admin_Page $admin_page_object |
|
| 1657 | - */ |
|
| 1658 | - $this->_req_data['_REG_ID'] = apply_filters( |
|
| 1659 | - 'FHEE__Registrations_Admin_Page___set_registration_status_from_request__REG_IDs', |
|
| 1660 | - $result['REG_ID'], |
|
| 1661 | - $status, |
|
| 1662 | - $result['success'], |
|
| 1663 | - $this |
|
| 1664 | - ); |
|
| 1665 | - |
|
| 1666 | - // notify? |
|
| 1667 | - if ($notify |
|
| 1668 | - && $result['success'] |
|
| 1669 | - && ! empty($this->_req_data['_REG_ID']) |
|
| 1670 | - && EE_Registry::instance()->CAP->current_user_can( |
|
| 1671 | - 'ee_send_message', |
|
| 1672 | - 'espresso_registrations_resend_registration' |
|
| 1673 | - ) |
|
| 1674 | - ) { |
|
| 1675 | - $this->_process_resend_registration(); |
|
| 1676 | - } |
|
| 1677 | - return $result; |
|
| 1678 | - } |
|
| 1679 | - |
|
| 1680 | - |
|
| 1681 | - /** |
|
| 1682 | - * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an |
|
| 1683 | - * array). Note, this method does NOT take care of possible notifications. That is required by calling code. |
|
| 1684 | - * |
|
| 1685 | - * @param array $REG_IDs |
|
| 1686 | - * @param string $status |
|
| 1687 | - * @param bool $notify Used to indicate whether notification was requested or not. This determines the context |
|
| 1688 | - * slug sent with setting the registration status. |
|
| 1689 | - * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as |
|
| 1690 | - * @throws EE_Error |
|
| 1691 | - * @throws InvalidArgumentException |
|
| 1692 | - * @throws InvalidDataTypeException |
|
| 1693 | - * @throws InvalidInterfaceException |
|
| 1694 | - * @throws ReflectionException |
|
| 1695 | - * @throws RuntimeException |
|
| 1696 | - * @throws EntityNotFoundException |
|
| 1697 | - * @throws DomainException |
|
| 1698 | - */ |
|
| 1699 | - protected function _set_registration_status($REG_IDs = array(), $status = '', $notify = false) |
|
| 1700 | - { |
|
| 1701 | - $success = false; |
|
| 1702 | - // typecast $REG_IDs |
|
| 1703 | - $REG_IDs = (array) $REG_IDs; |
|
| 1704 | - if (! empty($REG_IDs)) { |
|
| 1705 | - $success = true; |
|
| 1706 | - // set default status if none is passed |
|
| 1707 | - $status = $status ? $status : EEM_Registration::status_id_pending_payment; |
|
| 1708 | - $status_context = $notify |
|
| 1709 | - ? Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY |
|
| 1710 | - : Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN; |
|
| 1711 | - // loop through REG_ID's and change status |
|
| 1712 | - foreach ($REG_IDs as $REG_ID) { |
|
| 1713 | - $registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID); |
|
| 1714 | - if ($registration instanceof EE_Registration) { |
|
| 1715 | - $registration->set_status( |
|
| 1716 | - $status, |
|
| 1717 | - false, |
|
| 1718 | - new Context( |
|
| 1719 | - $status_context, |
|
| 1720 | - esc_html__( |
|
| 1721 | - 'Manually triggered status change on a Registration Admin Page route.', |
|
| 1722 | - 'event_espresso' |
|
| 1723 | - ) |
|
| 1724 | - ) |
|
| 1725 | - ); |
|
| 1726 | - $result = $registration->save(); |
|
| 1727 | - // verifying explicit fails because update *may* just return 0 for 0 rows affected |
|
| 1728 | - $success = $result !== false ? $success : false; |
|
| 1729 | - } |
|
| 1730 | - } |
|
| 1731 | - } |
|
| 1732 | - |
|
| 1733 | - // return $success and processed registrations |
|
| 1734 | - return array('REG_ID' => $REG_IDs, 'success' => $success); |
|
| 1735 | - } |
|
| 1736 | - |
|
| 1737 | - |
|
| 1738 | - /** |
|
| 1739 | - * Common logic for setting up success message and redirecting to appropriate route |
|
| 1740 | - * |
|
| 1741 | - * @param string $STS_ID status id for the registration changed to |
|
| 1742 | - * @param bool $notify indicates whether the _set_registration_status_from_request does notifications or not. |
|
| 1743 | - * @return void |
|
| 1744 | - * @throws DomainException |
|
| 1745 | - * @throws EE_Error |
|
| 1746 | - * @throws EntityNotFoundException |
|
| 1747 | - * @throws InvalidArgumentException |
|
| 1748 | - * @throws InvalidDataTypeException |
|
| 1749 | - * @throws InvalidInterfaceException |
|
| 1750 | - * @throws ReflectionException |
|
| 1751 | - * @throws RuntimeException |
|
| 1752 | - */ |
|
| 1753 | - protected function _reg_status_change_return($STS_ID, $notify = false) |
|
| 1754 | - { |
|
| 1755 | - $result = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify) |
|
| 1756 | - : array('success' => false); |
|
| 1757 | - $success = isset($result['success']) && $result['success']; |
|
| 1758 | - // setup success message |
|
| 1759 | - if ($success) { |
|
| 1760 | - if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) { |
|
| 1761 | - $msg = sprintf( |
|
| 1762 | - esc_html__('Registration status has been set to %s', 'event_espresso'), |
|
| 1763 | - EEH_Template::pretty_status($STS_ID, false, 'lower') |
|
| 1764 | - ); |
|
| 1765 | - } else { |
|
| 1766 | - $msg = sprintf( |
|
| 1767 | - esc_html__('Registrations have been set to %s.', 'event_espresso'), |
|
| 1768 | - EEH_Template::pretty_status($STS_ID, false, 'lower') |
|
| 1769 | - ); |
|
| 1770 | - } |
|
| 1771 | - EE_Error::add_success($msg); |
|
| 1772 | - } else { |
|
| 1773 | - EE_Error::add_error( |
|
| 1774 | - esc_html__( |
|
| 1775 | - 'Something went wrong, and the status was not changed', |
|
| 1776 | - 'event_espresso' |
|
| 1777 | - ), |
|
| 1778 | - __FILE__, |
|
| 1779 | - __LINE__, |
|
| 1780 | - __FUNCTION__ |
|
| 1781 | - ); |
|
| 1782 | - } |
|
| 1783 | - if (isset($this->_req_data['return']) && $this->_req_data['return'] === 'view_registration') { |
|
| 1784 | - $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID'])); |
|
| 1785 | - } else { |
|
| 1786 | - $route = array('action' => 'default'); |
|
| 1787 | - } |
|
| 1788 | - $route = $this->mergeExistingRequestParamsWithRedirectArgs($route); |
|
| 1789 | - $this->_redirect_after_action($success, '', '', $route, true); |
|
| 1790 | - } |
|
| 1791 | - |
|
| 1792 | - |
|
| 1793 | - /** |
|
| 1794 | - * incoming reg status change from reg details page. |
|
| 1795 | - * |
|
| 1796 | - * @return void |
|
| 1797 | - * @throws EE_Error |
|
| 1798 | - * @throws EntityNotFoundException |
|
| 1799 | - * @throws InvalidArgumentException |
|
| 1800 | - * @throws InvalidDataTypeException |
|
| 1801 | - * @throws InvalidInterfaceException |
|
| 1802 | - * @throws ReflectionException |
|
| 1803 | - * @throws RuntimeException |
|
| 1804 | - * @throws DomainException |
|
| 1805 | - */ |
|
| 1806 | - protected function _change_reg_status() |
|
| 1807 | - { |
|
| 1808 | - $this->_req_data['return'] = 'view_registration'; |
|
| 1809 | - // set notify based on whether the send notifications toggle is set or not |
|
| 1810 | - $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']); |
|
| 1811 | - // $notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] ); |
|
| 1812 | - $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status']) |
|
| 1813 | - ? $this->_req_data['reg_status_change_form']['reg_status'] : ''; |
|
| 1814 | - switch ($this->_req_data['reg_status_change_form']['reg_status']) { |
|
| 1815 | - case EEM_Registration::status_id_approved: |
|
| 1816 | - case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'): |
|
| 1817 | - $this->approve_registration($notify); |
|
| 1818 | - break; |
|
| 1819 | - case EEM_Registration::status_id_pending_payment: |
|
| 1820 | - case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'): |
|
| 1821 | - $this->pending_registration($notify); |
|
| 1822 | - break; |
|
| 1823 | - case EEM_Registration::status_id_not_approved: |
|
| 1824 | - case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'): |
|
| 1825 | - $this->not_approve_registration($notify); |
|
| 1826 | - break; |
|
| 1827 | - case EEM_Registration::status_id_declined: |
|
| 1828 | - case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'): |
|
| 1829 | - $this->decline_registration($notify); |
|
| 1830 | - break; |
|
| 1831 | - case EEM_Registration::status_id_cancelled: |
|
| 1832 | - case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'): |
|
| 1833 | - $this->cancel_registration($notify); |
|
| 1834 | - break; |
|
| 1835 | - case EEM_Registration::status_id_wait_list: |
|
| 1836 | - case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'): |
|
| 1837 | - $this->wait_list_registration($notify); |
|
| 1838 | - break; |
|
| 1839 | - case EEM_Registration::status_id_incomplete: |
|
| 1840 | - default: |
|
| 1841 | - $result['success'] = false; |
|
| 1842 | - unset($this->_req_data['return']); |
|
| 1843 | - $this->_reg_status_change_return('', false); |
|
| 1844 | - break; |
|
| 1845 | - } |
|
| 1846 | - } |
|
| 1847 | - |
|
| 1848 | - |
|
| 1849 | - /** |
|
| 1850 | - * Callback for bulk action routes. |
|
| 1851 | - * Note: although we could just register the singular route callbacks for each bulk action route as well, this |
|
| 1852 | - * method was chosen so there is one central place all the registration status bulk actions are going through. |
|
| 1853 | - * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to |
|
| 1854 | - * when an action is happening on just a single registration). |
|
| 1855 | - * |
|
| 1856 | - * @param $action |
|
| 1857 | - * @param bool $notify |
|
| 1858 | - */ |
|
| 1859 | - protected function bulk_action_on_registrations($action, $notify = false) |
|
| 1860 | - { |
|
| 1861 | - do_action( |
|
| 1862 | - 'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution', |
|
| 1863 | - $this, |
|
| 1864 | - $action, |
|
| 1865 | - $notify |
|
| 1866 | - ); |
|
| 1867 | - $method = $action . '_registration'; |
|
| 1868 | - if (method_exists($this, $method)) { |
|
| 1869 | - $this->$method($notify); |
|
| 1870 | - } |
|
| 1871 | - } |
|
| 1872 | - |
|
| 1873 | - |
|
| 1874 | - /** |
|
| 1875 | - * approve_registration |
|
| 1876 | - * |
|
| 1877 | - * @access protected |
|
| 1878 | - * @param bool $notify whether or not to notify the registrant about their approval. |
|
| 1879 | - * @return void |
|
| 1880 | - * @throws EE_Error |
|
| 1881 | - * @throws EntityNotFoundException |
|
| 1882 | - * @throws InvalidArgumentException |
|
| 1883 | - * @throws InvalidDataTypeException |
|
| 1884 | - * @throws InvalidInterfaceException |
|
| 1885 | - * @throws ReflectionException |
|
| 1886 | - * @throws RuntimeException |
|
| 1887 | - * @throws DomainException |
|
| 1888 | - */ |
|
| 1889 | - protected function approve_registration($notify = false) |
|
| 1890 | - { |
|
| 1891 | - $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify); |
|
| 1892 | - } |
|
| 1893 | - |
|
| 1894 | - |
|
| 1895 | - /** |
|
| 1896 | - * decline_registration |
|
| 1897 | - * |
|
| 1898 | - * @access protected |
|
| 1899 | - * @param bool $notify whether or not to notify the registrant about their status change. |
|
| 1900 | - * @return void |
|
| 1901 | - * @throws EE_Error |
|
| 1902 | - * @throws EntityNotFoundException |
|
| 1903 | - * @throws InvalidArgumentException |
|
| 1904 | - * @throws InvalidDataTypeException |
|
| 1905 | - * @throws InvalidInterfaceException |
|
| 1906 | - * @throws ReflectionException |
|
| 1907 | - * @throws RuntimeException |
|
| 1908 | - * @throws DomainException |
|
| 1909 | - */ |
|
| 1910 | - protected function decline_registration($notify = false) |
|
| 1911 | - { |
|
| 1912 | - $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify); |
|
| 1913 | - } |
|
| 1914 | - |
|
| 1915 | - |
|
| 1916 | - /** |
|
| 1917 | - * cancel_registration |
|
| 1918 | - * |
|
| 1919 | - * @access protected |
|
| 1920 | - * @param bool $notify whether or not to notify the registrant about their status change. |
|
| 1921 | - * @return void |
|
| 1922 | - * @throws EE_Error |
|
| 1923 | - * @throws EntityNotFoundException |
|
| 1924 | - * @throws InvalidArgumentException |
|
| 1925 | - * @throws InvalidDataTypeException |
|
| 1926 | - * @throws InvalidInterfaceException |
|
| 1927 | - * @throws ReflectionException |
|
| 1928 | - * @throws RuntimeException |
|
| 1929 | - * @throws DomainException |
|
| 1930 | - */ |
|
| 1931 | - protected function cancel_registration($notify = false) |
|
| 1932 | - { |
|
| 1933 | - $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify); |
|
| 1934 | - } |
|
| 1935 | - |
|
| 1936 | - |
|
| 1937 | - /** |
|
| 1938 | - * not_approve_registration |
|
| 1939 | - * |
|
| 1940 | - * @access protected |
|
| 1941 | - * @param bool $notify whether or not to notify the registrant about their status change. |
|
| 1942 | - * @return void |
|
| 1943 | - * @throws EE_Error |
|
| 1944 | - * @throws EntityNotFoundException |
|
| 1945 | - * @throws InvalidArgumentException |
|
| 1946 | - * @throws InvalidDataTypeException |
|
| 1947 | - * @throws InvalidInterfaceException |
|
| 1948 | - * @throws ReflectionException |
|
| 1949 | - * @throws RuntimeException |
|
| 1950 | - * @throws DomainException |
|
| 1951 | - */ |
|
| 1952 | - protected function not_approve_registration($notify = false) |
|
| 1953 | - { |
|
| 1954 | - $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify); |
|
| 1955 | - } |
|
| 1956 | - |
|
| 1957 | - |
|
| 1958 | - /** |
|
| 1959 | - * decline_registration |
|
| 1960 | - * |
|
| 1961 | - * @access protected |
|
| 1962 | - * @param bool $notify whether or not to notify the registrant about their status change. |
|
| 1963 | - * @return void |
|
| 1964 | - * @throws EE_Error |
|
| 1965 | - * @throws EntityNotFoundException |
|
| 1966 | - * @throws InvalidArgumentException |
|
| 1967 | - * @throws InvalidDataTypeException |
|
| 1968 | - * @throws InvalidInterfaceException |
|
| 1969 | - * @throws ReflectionException |
|
| 1970 | - * @throws RuntimeException |
|
| 1971 | - * @throws DomainException |
|
| 1972 | - */ |
|
| 1973 | - protected function pending_registration($notify = false) |
|
| 1974 | - { |
|
| 1975 | - $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify); |
|
| 1976 | - } |
|
| 1977 | - |
|
| 1978 | - |
|
| 1979 | - /** |
|
| 1980 | - * waitlist_registration |
|
| 1981 | - * |
|
| 1982 | - * @access protected |
|
| 1983 | - * @param bool $notify whether or not to notify the registrant about their status change. |
|
| 1984 | - * @return void |
|
| 1985 | - * @throws EE_Error |
|
| 1986 | - * @throws EntityNotFoundException |
|
| 1987 | - * @throws InvalidArgumentException |
|
| 1988 | - * @throws InvalidDataTypeException |
|
| 1989 | - * @throws InvalidInterfaceException |
|
| 1990 | - * @throws ReflectionException |
|
| 1991 | - * @throws RuntimeException |
|
| 1992 | - * @throws DomainException |
|
| 1993 | - */ |
|
| 1994 | - protected function wait_list_registration($notify = false) |
|
| 1995 | - { |
|
| 1996 | - $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify); |
|
| 1997 | - } |
|
| 1998 | - |
|
| 1999 | - |
|
| 2000 | - /** |
|
| 2001 | - * generates HTML for the Registration main meta box |
|
| 2002 | - * |
|
| 2003 | - * @access public |
|
| 2004 | - * @return void |
|
| 2005 | - * @throws DomainException |
|
| 2006 | - * @throws EE_Error |
|
| 2007 | - * @throws InvalidArgumentException |
|
| 2008 | - * @throws InvalidDataTypeException |
|
| 2009 | - * @throws InvalidInterfaceException |
|
| 2010 | - * @throws ReflectionException |
|
| 2011 | - * @throws EntityNotFoundException |
|
| 2012 | - */ |
|
| 2013 | - public function _reg_details_meta_box() |
|
| 2014 | - { |
|
| 2015 | - EEH_Autoloader::register_line_item_display_autoloaders(); |
|
| 2016 | - EEH_Autoloader::register_line_item_filter_autoloaders(); |
|
| 2017 | - EE_Registry::instance()->load_helper('Line_Item'); |
|
| 2018 | - $transaction = $this->_registration->transaction() ? $this->_registration->transaction() |
|
| 2019 | - : EE_Transaction::new_instance(); |
|
| 2020 | - $this->_session = $transaction->session_data(); |
|
| 2021 | - $filters = new EE_Line_Item_Filter_Collection(); |
|
| 2022 | - $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration)); |
|
| 2023 | - $filters->add(new EE_Non_Zero_Line_Item_Filter()); |
|
| 2024 | - $line_item_filter_processor = new EE_Line_Item_Filter_Processor( |
|
| 2025 | - $filters, |
|
| 2026 | - $transaction->total_line_item() |
|
| 2027 | - ); |
|
| 2028 | - $filtered_line_item_tree = $line_item_filter_processor->process(); |
|
| 2029 | - $line_item_display = new EE_Line_Item_Display( |
|
| 2030 | - 'reg_admin_table', |
|
| 2031 | - 'EE_Admin_Table_Registration_Line_Item_Display_Strategy' |
|
| 2032 | - ); |
|
| 2033 | - $this->_template_args['line_item_table'] = $line_item_display->display_line_item( |
|
| 2034 | - $filtered_line_item_tree, |
|
| 2035 | - array('EE_Registration' => $this->_registration) |
|
| 2036 | - ); |
|
| 2037 | - $attendee = $this->_registration->attendee(); |
|
| 2038 | - if (EE_Registry::instance()->CAP->current_user_can( |
|
| 2039 | - 'ee_read_transaction', |
|
| 2040 | - 'espresso_transactions_view_transaction' |
|
| 2041 | - )) { |
|
| 2042 | - $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link( |
|
| 2043 | - EE_Admin_Page::add_query_args_and_nonce( |
|
| 2044 | - array( |
|
| 2045 | - 'action' => 'view_transaction', |
|
| 2046 | - 'TXN_ID' => $transaction->ID(), |
|
| 2047 | - ), |
|
| 2048 | - TXN_ADMIN_URL |
|
| 2049 | - ), |
|
| 2050 | - esc_html__(' View Transaction', 'event_espresso'), |
|
| 2051 | - 'button secondary-button right', |
|
| 2052 | - 'dashicons dashicons-cart' |
|
| 2053 | - ); |
|
| 2054 | - } else { |
|
| 2055 | - $this->_template_args['view_transaction_button'] = ''; |
|
| 2056 | - } |
|
| 2057 | - if ($attendee instanceof EE_Attendee |
|
| 2058 | - && EE_Registry::instance()->CAP->current_user_can( |
|
| 2059 | - 'ee_send_message', |
|
| 2060 | - 'espresso_registrations_resend_registration' |
|
| 2061 | - ) |
|
| 2062 | - ) { |
|
| 2063 | - $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link( |
|
| 2064 | - EE_Admin_Page::add_query_args_and_nonce( |
|
| 2065 | - array( |
|
| 2066 | - 'action' => 'resend_registration', |
|
| 2067 | - '_REG_ID' => $this->_registration->ID(), |
|
| 2068 | - 'redirect_to' => 'view_registration', |
|
| 2069 | - ), |
|
| 2070 | - REG_ADMIN_URL |
|
| 2071 | - ), |
|
| 2072 | - esc_html__(' Resend Registration', 'event_espresso'), |
|
| 2073 | - 'button secondary-button right', |
|
| 2074 | - 'dashicons dashicons-email-alt' |
|
| 2075 | - ); |
|
| 2076 | - } else { |
|
| 2077 | - $this->_template_args['resend_registration_button'] = ''; |
|
| 2078 | - } |
|
| 2079 | - $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign; |
|
| 2080 | - $payment = $transaction->get_first_related('Payment'); |
|
| 2081 | - $payment = ! $payment instanceof EE_Payment |
|
| 2082 | - ? EE_Payment::new_instance() |
|
| 2083 | - : $payment; |
|
| 2084 | - $payment_method = $payment->get_first_related('Payment_Method'); |
|
| 2085 | - $payment_method = ! $payment_method instanceof EE_Payment_Method |
|
| 2086 | - ? EE_Payment_Method::new_instance() |
|
| 2087 | - : $payment_method; |
|
| 2088 | - $reg_details = array( |
|
| 2089 | - 'payment_method' => $payment_method->name(), |
|
| 2090 | - 'response_msg' => $payment->gateway_response(), |
|
| 2091 | - 'registration_id' => $this->_registration->get('REG_code'), |
|
| 2092 | - 'registration_session' => $this->_registration->session_ID(), |
|
| 2093 | - 'ip_address' => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '', |
|
| 2094 | - 'user_agent' => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '', |
|
| 2095 | - ); |
|
| 2096 | - if (isset($reg_details['registration_id'])) { |
|
| 2097 | - $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id']; |
|
| 2098 | - $this->_template_args['reg_details']['registration_id']['label'] = esc_html__( |
|
| 2099 | - 'Registration ID', |
|
| 2100 | - 'event_espresso' |
|
| 2101 | - ); |
|
| 2102 | - $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text'; |
|
| 2103 | - } |
|
| 2104 | - if (isset($reg_details['payment_method'])) { |
|
| 2105 | - $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method']; |
|
| 2106 | - $this->_template_args['reg_details']['payment_method']['label'] = esc_html__( |
|
| 2107 | - 'Most Recent Payment Method', |
|
| 2108 | - 'event_espresso' |
|
| 2109 | - ); |
|
| 2110 | - $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text'; |
|
| 2111 | - $this->_template_args['reg_details']['response_msg']['value'] = $reg_details['response_msg']; |
|
| 2112 | - $this->_template_args['reg_details']['response_msg']['label'] = esc_html__( |
|
| 2113 | - 'Payment method response', |
|
| 2114 | - 'event_espresso' |
|
| 2115 | - ); |
|
| 2116 | - $this->_template_args['reg_details']['response_msg']['class'] = 'regular-text'; |
|
| 2117 | - } |
|
| 2118 | - $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session']; |
|
| 2119 | - $this->_template_args['reg_details']['registration_session']['label'] = esc_html__( |
|
| 2120 | - 'Registration Session', |
|
| 2121 | - 'event_espresso' |
|
| 2122 | - ); |
|
| 2123 | - $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text'; |
|
| 2124 | - $this->_template_args['reg_details']['ip_address']['value'] = $reg_details['ip_address']; |
|
| 2125 | - $this->_template_args['reg_details']['ip_address']['label'] = esc_html__( |
|
| 2126 | - 'Registration placed from IP', |
|
| 2127 | - 'event_espresso' |
|
| 2128 | - ); |
|
| 2129 | - $this->_template_args['reg_details']['ip_address']['class'] = 'regular-text'; |
|
| 2130 | - $this->_template_args['reg_details']['user_agent']['value'] = $reg_details['user_agent']; |
|
| 2131 | - $this->_template_args['reg_details']['user_agent']['label'] = esc_html__( |
|
| 2132 | - 'Registrant User Agent', |
|
| 2133 | - 'event_espresso' |
|
| 2134 | - ); |
|
| 2135 | - $this->_template_args['reg_details']['user_agent']['class'] = 'large-text'; |
|
| 2136 | - $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce( |
|
| 2137 | - array( |
|
| 2138 | - 'action' => 'default', |
|
| 2139 | - 'event_id' => $this->_registration->event_ID(), |
|
| 2140 | - ), |
|
| 2141 | - REG_ADMIN_URL |
|
| 2142 | - ); |
|
| 2143 | - $this->_template_args['REG_ID'] = $this->_registration->ID(); |
|
| 2144 | - $this->_template_args['event_id'] = $this->_registration->event_ID(); |
|
| 2145 | - $template_path = |
|
| 2146 | - REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php'; |
|
| 2147 | - echo EEH_Template::display_template($template_path, $this->_template_args, true); |
|
| 2148 | - } |
|
| 2149 | - |
|
| 2150 | - |
|
| 2151 | - /** |
|
| 2152 | - * generates HTML for the Registration Questions meta box. |
|
| 2153 | - * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters), |
|
| 2154 | - * otherwise uses new forms system |
|
| 2155 | - * |
|
| 2156 | - * @access public |
|
| 2157 | - * @return void |
|
| 2158 | - * @throws DomainException |
|
| 2159 | - * @throws EE_Error |
|
| 2160 | - * @throws InvalidArgumentException |
|
| 2161 | - * @throws InvalidDataTypeException |
|
| 2162 | - * @throws InvalidInterfaceException |
|
| 2163 | - * @throws ReflectionException |
|
| 2164 | - */ |
|
| 2165 | - public function _reg_questions_meta_box() |
|
| 2166 | - { |
|
| 2167 | - // allow someone to override this method entirely |
|
| 2168 | - if (apply_filters( |
|
| 2169 | - 'FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', |
|
| 2170 | - true, |
|
| 2171 | - $this, |
|
| 2172 | - $this->_registration |
|
| 2173 | - )) { |
|
| 2174 | - $form = $this->_get_reg_custom_questions_form( |
|
| 2175 | - $this->_registration->ID() |
|
| 2176 | - ); |
|
| 2177 | - $this->_template_args['att_questions'] = count($form->subforms()) > 0 |
|
| 2178 | - ? $form->get_html_and_js() |
|
| 2179 | - : ''; |
|
| 2180 | - $this->_template_args['reg_questions_form_action'] = 'edit_registration'; |
|
| 2181 | - $this->_template_args['REG_ID'] = $this->_registration->ID(); |
|
| 2182 | - $template_path = |
|
| 2183 | - REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php'; |
|
| 2184 | - echo EEH_Template::display_template($template_path, $this->_template_args, true); |
|
| 2185 | - } |
|
| 2186 | - } |
|
| 2187 | - |
|
| 2188 | - |
|
| 2189 | - /** |
|
| 2190 | - * form_before_question_group |
|
| 2191 | - * |
|
| 2192 | - * @deprecated as of 4.8.32.rc.000 |
|
| 2193 | - * @access public |
|
| 2194 | - * @param string $output |
|
| 2195 | - * @return string |
|
| 2196 | - */ |
|
| 2197 | - public function form_before_question_group($output) |
|
| 2198 | - { |
|
| 2199 | - EE_Error::doing_it_wrong( |
|
| 2200 | - __CLASS__ . '::' . __FUNCTION__, |
|
| 2201 | - esc_html__( |
|
| 2202 | - 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
|
| 2203 | - 'event_espresso' |
|
| 2204 | - ), |
|
| 2205 | - '4.8.32.rc.000' |
|
| 2206 | - ); |
|
| 2207 | - return ' |
|
| 21 | + /** |
|
| 22 | + * @var EE_Registration |
|
| 23 | + */ |
|
| 24 | + private $_registration; |
|
| 25 | + |
|
| 26 | + /** |
|
| 27 | + * @var EE_Event |
|
| 28 | + */ |
|
| 29 | + private $_reg_event; |
|
| 30 | + |
|
| 31 | + /** |
|
| 32 | + * @var EE_Session |
|
| 33 | + */ |
|
| 34 | + private $_session; |
|
| 35 | + |
|
| 36 | + private static $_reg_status; |
|
| 37 | + |
|
| 38 | + /** |
|
| 39 | + * Form for displaying the custom questions for this registration. |
|
| 40 | + * This gets used a few times throughout the request so its best to cache it |
|
| 41 | + * |
|
| 42 | + * @var EE_Registration_Custom_Questions_Form |
|
| 43 | + */ |
|
| 44 | + protected $_reg_custom_questions_form; |
|
| 45 | + |
|
| 46 | + /** |
|
| 47 | + * @var EEM_Registration $registration_model |
|
| 48 | + */ |
|
| 49 | + private $registration_model; |
|
| 50 | + |
|
| 51 | + /** |
|
| 52 | + * @var EEM_Attendee $attendee_model |
|
| 53 | + */ |
|
| 54 | + private $attendee_model; |
|
| 55 | + |
|
| 56 | + /** |
|
| 57 | + * @var EEM_Event $event_model |
|
| 58 | + */ |
|
| 59 | + private $event_model; |
|
| 60 | + |
|
| 61 | + /** |
|
| 62 | + * @var EEM_Status $status_model |
|
| 63 | + */ |
|
| 64 | + private $status_model; |
|
| 65 | + |
|
| 66 | + |
|
| 67 | + /** |
|
| 68 | + * @param bool $routing |
|
| 69 | + * @throws EE_Error |
|
| 70 | + * @throws InvalidArgumentException |
|
| 71 | + * @throws InvalidDataTypeException |
|
| 72 | + * @throws InvalidInterfaceException |
|
| 73 | + * @throws ReflectionException |
|
| 74 | + */ |
|
| 75 | + public function __construct($routing = true) |
|
| 76 | + { |
|
| 77 | + parent::__construct($routing); |
|
| 78 | + add_action('wp_loaded', array($this, 'wp_loaded')); |
|
| 79 | + } |
|
| 80 | + |
|
| 81 | + /** |
|
| 82 | + * @return EEM_Registration |
|
| 83 | + * @throws InvalidArgumentException |
|
| 84 | + * @throws InvalidDataTypeException |
|
| 85 | + * @throws InvalidInterfaceException |
|
| 86 | + * @since $VID:$ |
|
| 87 | + */ |
|
| 88 | + protected function getRegistrationModel() |
|
| 89 | + { |
|
| 90 | + if (! $this->registration_model instanceof EEM_Registration) { |
|
| 91 | + $this->registration_model = $this->loader->getShared('EEM_Registration'); |
|
| 92 | + } |
|
| 93 | + return $this->registration_model; |
|
| 94 | + } |
|
| 95 | + |
|
| 96 | + /** |
|
| 97 | + * @return EEM_Attendee |
|
| 98 | + * @throws InvalidArgumentException |
|
| 99 | + * @throws InvalidDataTypeException |
|
| 100 | + * @throws InvalidInterfaceException |
|
| 101 | + * @since $VID:$ |
|
| 102 | + */ |
|
| 103 | + protected function getAttendeeModel() |
|
| 104 | + { |
|
| 105 | + if (! $this->attendee_model instanceof EEM_Attendee) { |
|
| 106 | + $this->attendee_model = $this->loader->getShared('EEM_Attendee'); |
|
| 107 | + } |
|
| 108 | + return $this->attendee_model; |
|
| 109 | + } |
|
| 110 | + |
|
| 111 | + |
|
| 112 | + /** |
|
| 113 | + * @return EEM_Event |
|
| 114 | + * @throws InvalidArgumentException |
|
| 115 | + * @throws InvalidDataTypeException |
|
| 116 | + * @throws InvalidInterfaceException |
|
| 117 | + * @since $VID:$ |
|
| 118 | + */ |
|
| 119 | + protected function getEventModel() |
|
| 120 | + { |
|
| 121 | + if (! $this->event_model instanceof EEM_Event) { |
|
| 122 | + $this->event_model = $this->loader->getShared('EEM_Event'); |
|
| 123 | + } |
|
| 124 | + return $this->event_model; |
|
| 125 | + } |
|
| 126 | + |
|
| 127 | + /** |
|
| 128 | + * @return EEM_Status |
|
| 129 | + * @throws InvalidArgumentException |
|
| 130 | + * @throws InvalidDataTypeException |
|
| 131 | + * @throws InvalidInterfaceException |
|
| 132 | + * @since $VID:$ |
|
| 133 | + */ |
|
| 134 | + protected function getStatusModel() |
|
| 135 | + { |
|
| 136 | + if (! $this->status_model instanceof EEM_Status) { |
|
| 137 | + $this->status_model = $this->loader->getShared('EEM_Status'); |
|
| 138 | + } |
|
| 139 | + return $this->status_model; |
|
| 140 | + } |
|
| 141 | + |
|
| 142 | + |
|
| 143 | + public function wp_loaded() |
|
| 144 | + { |
|
| 145 | + // when adding a new registration... |
|
| 146 | + if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') { |
|
| 147 | + EE_System::do_not_cache(); |
|
| 148 | + if (! isset($this->_req_data['processing_registration']) |
|
| 149 | + || absint($this->_req_data['processing_registration']) !== 1 |
|
| 150 | + ) { |
|
| 151 | + // and it's NOT the attendee information reg step |
|
| 152 | + // force cookie expiration by setting time to last week |
|
| 153 | + setcookie('ee_registration_added', 0, time() - WEEK_IN_SECONDS, '/'); |
|
| 154 | + // and update the global |
|
| 155 | + $_COOKIE['ee_registration_added'] = 0; |
|
| 156 | + } |
|
| 157 | + } |
|
| 158 | + } |
|
| 159 | + |
|
| 160 | + |
|
| 161 | + protected function _init_page_props() |
|
| 162 | + { |
|
| 163 | + $this->page_slug = REG_PG_SLUG; |
|
| 164 | + $this->_admin_base_url = REG_ADMIN_URL; |
|
| 165 | + $this->_admin_base_path = REG_ADMIN; |
|
| 166 | + $this->page_label = esc_html__('Registrations', 'event_espresso'); |
|
| 167 | + $this->_cpt_routes = array( |
|
| 168 | + 'add_new_attendee' => 'espresso_attendees', |
|
| 169 | + 'edit_attendee' => 'espresso_attendees', |
|
| 170 | + 'insert_attendee' => 'espresso_attendees', |
|
| 171 | + 'update_attendee' => 'espresso_attendees', |
|
| 172 | + ); |
|
| 173 | + $this->_cpt_model_names = array( |
|
| 174 | + 'add_new_attendee' => 'EEM_Attendee', |
|
| 175 | + 'edit_attendee' => 'EEM_Attendee', |
|
| 176 | + ); |
|
| 177 | + $this->_cpt_edit_routes = array( |
|
| 178 | + 'espresso_attendees' => 'edit_attendee', |
|
| 179 | + ); |
|
| 180 | + $this->_pagenow_map = array( |
|
| 181 | + 'add_new_attendee' => 'post-new.php', |
|
| 182 | + 'edit_attendee' => 'post.php', |
|
| 183 | + 'trash' => 'post.php', |
|
| 184 | + ); |
|
| 185 | + add_action('edit_form_after_title', array($this, 'after_title_form_fields'), 10); |
|
| 186 | + // add filters so that the comment urls don't take users to a confusing 404 page |
|
| 187 | + add_filter('get_comment_link', array($this, 'clear_comment_link'), 10, 3); |
|
| 188 | + } |
|
| 189 | + |
|
| 190 | + |
|
| 191 | + public function clear_comment_link($link, $comment, $args) |
|
| 192 | + { |
|
| 193 | + // gotta make sure this only happens on this route |
|
| 194 | + $post_type = get_post_type($comment->comment_post_ID); |
|
| 195 | + if ($post_type === 'espresso_attendees') { |
|
| 196 | + return '#commentsdiv'; |
|
| 197 | + } |
|
| 198 | + return $link; |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + |
|
| 202 | + protected function _ajax_hooks() |
|
| 203 | + { |
|
| 204 | + // todo: all hooks for registrations ajax goes in here |
|
| 205 | + add_action('wp_ajax_toggle_checkin_status', array($this, 'toggle_checkin_status')); |
|
| 206 | + } |
|
| 207 | + |
|
| 208 | + |
|
| 209 | + protected function _define_page_props() |
|
| 210 | + { |
|
| 211 | + $this->_admin_page_title = $this->page_label; |
|
| 212 | + $this->_labels = array( |
|
| 213 | + 'buttons' => array( |
|
| 214 | + 'add-registrant' => esc_html__('Add New Registration', 'event_espresso'), |
|
| 215 | + 'add-attendee' => esc_html__('Add Contact', 'event_espresso'), |
|
| 216 | + 'edit' => esc_html__('Edit Contact', 'event_espresso'), |
|
| 217 | + 'report' => esc_html__('Event Registrations CSV Report', 'event_espresso'), |
|
| 218 | + 'report_all' => esc_html__('All Registrations CSV Report', 'event_espresso'), |
|
| 219 | + 'report_filtered' => esc_html__('Filtered CSV Report', 'event_espresso'), |
|
| 220 | + 'contact_list_report' => esc_html__('Contact List Report', 'event_espresso'), |
|
| 221 | + 'contact_list_export' => esc_html__('Export Data', 'event_espresso'), |
|
| 222 | + ), |
|
| 223 | + 'publishbox' => array( |
|
| 224 | + 'add_new_attendee' => esc_html__('Add Contact Record', 'event_espresso'), |
|
| 225 | + 'edit_attendee' => esc_html__('Update Contact Record', 'event_espresso'), |
|
| 226 | + ), |
|
| 227 | + 'hide_add_button_on_cpt_route' => array( |
|
| 228 | + 'edit_attendee' => true, |
|
| 229 | + ), |
|
| 230 | + ); |
|
| 231 | + } |
|
| 232 | + |
|
| 233 | + |
|
| 234 | + /** |
|
| 235 | + * grab url requests and route them |
|
| 236 | + * |
|
| 237 | + * @access private |
|
| 238 | + * @return void |
|
| 239 | + * @throws EE_Error |
|
| 240 | + */ |
|
| 241 | + public function _set_page_routes() |
|
| 242 | + { |
|
| 243 | + $this->_get_registration_status_array(); |
|
| 244 | + $reg_id = ! empty($this->_req_data['_REG_ID']) && ! is_array($this->_req_data['_REG_ID']) |
|
| 245 | + ? $this->_req_data['_REG_ID'] : 0; |
|
| 246 | + $reg_id = empty($reg_id) && ! empty($this->_req_data['reg_status_change_form']['REG_ID']) |
|
| 247 | + ? $this->_req_data['reg_status_change_form']['REG_ID'] |
|
| 248 | + : $reg_id; |
|
| 249 | + $att_id = ! empty($this->_req_data['ATT_ID']) && ! is_array($this->_req_data['ATT_ID']) |
|
| 250 | + ? $this->_req_data['ATT_ID'] : 0; |
|
| 251 | + $att_id = ! empty($this->_req_data['post']) && ! is_array($this->_req_data['post']) |
|
| 252 | + ? $this->_req_data['post'] |
|
| 253 | + : $att_id; |
|
| 254 | + $this->_page_routes = array( |
|
| 255 | + 'default' => array( |
|
| 256 | + 'func' => '_registrations_overview_list_table', |
|
| 257 | + 'capability' => 'ee_read_registrations', |
|
| 258 | + ), |
|
| 259 | + 'view_registration' => array( |
|
| 260 | + 'func' => '_registration_details', |
|
| 261 | + 'capability' => 'ee_read_registration', |
|
| 262 | + 'obj_id' => $reg_id, |
|
| 263 | + ), |
|
| 264 | + 'edit_registration' => array( |
|
| 265 | + 'func' => '_update_attendee_registration_form', |
|
| 266 | + 'noheader' => true, |
|
| 267 | + 'headers_sent_route' => 'view_registration', |
|
| 268 | + 'capability' => 'ee_edit_registration', |
|
| 269 | + 'obj_id' => $reg_id, |
|
| 270 | + '_REG_ID' => $reg_id, |
|
| 271 | + ), |
|
| 272 | + 'trash_registrations' => array( |
|
| 273 | + 'func' => '_trash_or_restore_registrations', |
|
| 274 | + 'args' => array('trash' => true), |
|
| 275 | + 'noheader' => true, |
|
| 276 | + 'capability' => 'ee_delete_registrations', |
|
| 277 | + ), |
|
| 278 | + 'restore_registrations' => array( |
|
| 279 | + 'func' => '_trash_or_restore_registrations', |
|
| 280 | + 'args' => array('trash' => false), |
|
| 281 | + 'noheader' => true, |
|
| 282 | + 'capability' => 'ee_delete_registrations', |
|
| 283 | + ), |
|
| 284 | + 'delete_registrations' => array( |
|
| 285 | + 'func' => '_delete_registrations', |
|
| 286 | + 'noheader' => true, |
|
| 287 | + 'capability' => 'ee_delete_registrations', |
|
| 288 | + ), |
|
| 289 | + 'new_registration' => array( |
|
| 290 | + 'func' => 'new_registration', |
|
| 291 | + 'capability' => 'ee_edit_registrations', |
|
| 292 | + ), |
|
| 293 | + 'process_reg_step' => array( |
|
| 294 | + 'func' => 'process_reg_step', |
|
| 295 | + 'noheader' => true, |
|
| 296 | + 'capability' => 'ee_edit_registrations', |
|
| 297 | + ), |
|
| 298 | + 'redirect_to_txn' => array( |
|
| 299 | + 'func' => 'redirect_to_txn', |
|
| 300 | + 'noheader' => true, |
|
| 301 | + 'capability' => 'ee_edit_registrations', |
|
| 302 | + ), |
|
| 303 | + 'change_reg_status' => array( |
|
| 304 | + 'func' => '_change_reg_status', |
|
| 305 | + 'noheader' => true, |
|
| 306 | + 'capability' => 'ee_edit_registration', |
|
| 307 | + 'obj_id' => $reg_id, |
|
| 308 | + ), |
|
| 309 | + 'approve_registration' => array( |
|
| 310 | + 'func' => 'approve_registration', |
|
| 311 | + 'noheader' => true, |
|
| 312 | + 'capability' => 'ee_edit_registration', |
|
| 313 | + 'obj_id' => $reg_id, |
|
| 314 | + ), |
|
| 315 | + 'approve_and_notify_registration' => array( |
|
| 316 | + 'func' => 'approve_registration', |
|
| 317 | + 'noheader' => true, |
|
| 318 | + 'args' => array(true), |
|
| 319 | + 'capability' => 'ee_edit_registration', |
|
| 320 | + 'obj_id' => $reg_id, |
|
| 321 | + ), |
|
| 322 | + 'approve_registrations' => array( |
|
| 323 | + 'func' => 'bulk_action_on_registrations', |
|
| 324 | + 'noheader' => true, |
|
| 325 | + 'capability' => 'ee_edit_registrations', |
|
| 326 | + 'args' => array('approve'), |
|
| 327 | + ), |
|
| 328 | + 'approve_and_notify_registrations' => array( |
|
| 329 | + 'func' => 'bulk_action_on_registrations', |
|
| 330 | + 'noheader' => true, |
|
| 331 | + 'capability' => 'ee_edit_registrations', |
|
| 332 | + 'args' => array('approve', true), |
|
| 333 | + ), |
|
| 334 | + 'decline_registration' => array( |
|
| 335 | + 'func' => 'decline_registration', |
|
| 336 | + 'noheader' => true, |
|
| 337 | + 'capability' => 'ee_edit_registration', |
|
| 338 | + 'obj_id' => $reg_id, |
|
| 339 | + ), |
|
| 340 | + 'decline_and_notify_registration' => array( |
|
| 341 | + 'func' => 'decline_registration', |
|
| 342 | + 'noheader' => true, |
|
| 343 | + 'args' => array(true), |
|
| 344 | + 'capability' => 'ee_edit_registration', |
|
| 345 | + 'obj_id' => $reg_id, |
|
| 346 | + ), |
|
| 347 | + 'decline_registrations' => array( |
|
| 348 | + 'func' => 'bulk_action_on_registrations', |
|
| 349 | + 'noheader' => true, |
|
| 350 | + 'capability' => 'ee_edit_registrations', |
|
| 351 | + 'args' => array('decline'), |
|
| 352 | + ), |
|
| 353 | + 'decline_and_notify_registrations' => array( |
|
| 354 | + 'func' => 'bulk_action_on_registrations', |
|
| 355 | + 'noheader' => true, |
|
| 356 | + 'capability' => 'ee_edit_registrations', |
|
| 357 | + 'args' => array('decline', true), |
|
| 358 | + ), |
|
| 359 | + 'pending_registration' => array( |
|
| 360 | + 'func' => 'pending_registration', |
|
| 361 | + 'noheader' => true, |
|
| 362 | + 'capability' => 'ee_edit_registration', |
|
| 363 | + 'obj_id' => $reg_id, |
|
| 364 | + ), |
|
| 365 | + 'pending_and_notify_registration' => array( |
|
| 366 | + 'func' => 'pending_registration', |
|
| 367 | + 'noheader' => true, |
|
| 368 | + 'args' => array(true), |
|
| 369 | + 'capability' => 'ee_edit_registration', |
|
| 370 | + 'obj_id' => $reg_id, |
|
| 371 | + ), |
|
| 372 | + 'pending_registrations' => array( |
|
| 373 | + 'func' => 'bulk_action_on_registrations', |
|
| 374 | + 'noheader' => true, |
|
| 375 | + 'capability' => 'ee_edit_registrations', |
|
| 376 | + 'args' => array('pending'), |
|
| 377 | + ), |
|
| 378 | + 'pending_and_notify_registrations' => array( |
|
| 379 | + 'func' => 'bulk_action_on_registrations', |
|
| 380 | + 'noheader' => true, |
|
| 381 | + 'capability' => 'ee_edit_registrations', |
|
| 382 | + 'args' => array('pending', true), |
|
| 383 | + ), |
|
| 384 | + 'no_approve_registration' => array( |
|
| 385 | + 'func' => 'not_approve_registration', |
|
| 386 | + 'noheader' => true, |
|
| 387 | + 'capability' => 'ee_edit_registration', |
|
| 388 | + 'obj_id' => $reg_id, |
|
| 389 | + ), |
|
| 390 | + 'no_approve_and_notify_registration' => array( |
|
| 391 | + 'func' => 'not_approve_registration', |
|
| 392 | + 'noheader' => true, |
|
| 393 | + 'args' => array(true), |
|
| 394 | + 'capability' => 'ee_edit_registration', |
|
| 395 | + 'obj_id' => $reg_id, |
|
| 396 | + ), |
|
| 397 | + 'no_approve_registrations' => array( |
|
| 398 | + 'func' => 'bulk_action_on_registrations', |
|
| 399 | + 'noheader' => true, |
|
| 400 | + 'capability' => 'ee_edit_registrations', |
|
| 401 | + 'args' => array('not_approve'), |
|
| 402 | + ), |
|
| 403 | + 'no_approve_and_notify_registrations' => array( |
|
| 404 | + 'func' => 'bulk_action_on_registrations', |
|
| 405 | + 'noheader' => true, |
|
| 406 | + 'capability' => 'ee_edit_registrations', |
|
| 407 | + 'args' => array('not_approve', true), |
|
| 408 | + ), |
|
| 409 | + 'cancel_registration' => array( |
|
| 410 | + 'func' => 'cancel_registration', |
|
| 411 | + 'noheader' => true, |
|
| 412 | + 'capability' => 'ee_edit_registration', |
|
| 413 | + 'obj_id' => $reg_id, |
|
| 414 | + ), |
|
| 415 | + 'cancel_and_notify_registration' => array( |
|
| 416 | + 'func' => 'cancel_registration', |
|
| 417 | + 'noheader' => true, |
|
| 418 | + 'args' => array(true), |
|
| 419 | + 'capability' => 'ee_edit_registration', |
|
| 420 | + 'obj_id' => $reg_id, |
|
| 421 | + ), |
|
| 422 | + 'cancel_registrations' => array( |
|
| 423 | + 'func' => 'bulk_action_on_registrations', |
|
| 424 | + 'noheader' => true, |
|
| 425 | + 'capability' => 'ee_edit_registrations', |
|
| 426 | + 'args' => array('cancel'), |
|
| 427 | + ), |
|
| 428 | + 'cancel_and_notify_registrations' => array( |
|
| 429 | + 'func' => 'bulk_action_on_registrations', |
|
| 430 | + 'noheader' => true, |
|
| 431 | + 'capability' => 'ee_edit_registrations', |
|
| 432 | + 'args' => array('cancel', true), |
|
| 433 | + ), |
|
| 434 | + 'wait_list_registration' => array( |
|
| 435 | + 'func' => 'wait_list_registration', |
|
| 436 | + 'noheader' => true, |
|
| 437 | + 'capability' => 'ee_edit_registration', |
|
| 438 | + 'obj_id' => $reg_id, |
|
| 439 | + ), |
|
| 440 | + 'wait_list_and_notify_registration' => array( |
|
| 441 | + 'func' => 'wait_list_registration', |
|
| 442 | + 'noheader' => true, |
|
| 443 | + 'args' => array(true), |
|
| 444 | + 'capability' => 'ee_edit_registration', |
|
| 445 | + 'obj_id' => $reg_id, |
|
| 446 | + ), |
|
| 447 | + 'contact_list' => array( |
|
| 448 | + 'func' => '_attendee_contact_list_table', |
|
| 449 | + 'capability' => 'ee_read_contacts', |
|
| 450 | + ), |
|
| 451 | + 'add_new_attendee' => array( |
|
| 452 | + 'func' => '_create_new_cpt_item', |
|
| 453 | + 'args' => array( |
|
| 454 | + 'new_attendee' => true, |
|
| 455 | + 'capability' => 'ee_edit_contacts', |
|
| 456 | + ), |
|
| 457 | + ), |
|
| 458 | + 'edit_attendee' => array( |
|
| 459 | + 'func' => '_edit_cpt_item', |
|
| 460 | + 'capability' => 'ee_edit_contacts', |
|
| 461 | + 'obj_id' => $att_id, |
|
| 462 | + ), |
|
| 463 | + 'duplicate_attendee' => array( |
|
| 464 | + 'func' => '_duplicate_attendee', |
|
| 465 | + 'noheader' => true, |
|
| 466 | + 'capability' => 'ee_edit_contacts', |
|
| 467 | + 'obj_id' => $att_id, |
|
| 468 | + ), |
|
| 469 | + 'insert_attendee' => array( |
|
| 470 | + 'func' => '_insert_or_update_attendee', |
|
| 471 | + 'args' => array( |
|
| 472 | + 'new_attendee' => true, |
|
| 473 | + ), |
|
| 474 | + 'noheader' => true, |
|
| 475 | + 'capability' => 'ee_edit_contacts', |
|
| 476 | + ), |
|
| 477 | + 'update_attendee' => array( |
|
| 478 | + 'func' => '_insert_or_update_attendee', |
|
| 479 | + 'args' => array( |
|
| 480 | + 'new_attendee' => false, |
|
| 481 | + ), |
|
| 482 | + 'noheader' => true, |
|
| 483 | + 'capability' => 'ee_edit_contacts', |
|
| 484 | + 'obj_id' => $att_id, |
|
| 485 | + ), |
|
| 486 | + 'trash_attendees' => array( |
|
| 487 | + 'func' => '_trash_or_restore_attendees', |
|
| 488 | + 'args' => array( |
|
| 489 | + 'trash' => 'true', |
|
| 490 | + ), |
|
| 491 | + 'noheader' => true, |
|
| 492 | + 'capability' => 'ee_delete_contacts', |
|
| 493 | + ), |
|
| 494 | + 'trash_attendee' => array( |
|
| 495 | + 'func' => '_trash_or_restore_attendees', |
|
| 496 | + 'args' => array( |
|
| 497 | + 'trash' => true, |
|
| 498 | + ), |
|
| 499 | + 'noheader' => true, |
|
| 500 | + 'capability' => 'ee_delete_contacts', |
|
| 501 | + 'obj_id' => $att_id, |
|
| 502 | + ), |
|
| 503 | + 'restore_attendees' => array( |
|
| 504 | + 'func' => '_trash_or_restore_attendees', |
|
| 505 | + 'args' => array( |
|
| 506 | + 'trash' => false, |
|
| 507 | + ), |
|
| 508 | + 'noheader' => true, |
|
| 509 | + 'capability' => 'ee_delete_contacts', |
|
| 510 | + 'obj_id' => $att_id, |
|
| 511 | + ), |
|
| 512 | + 'resend_registration' => array( |
|
| 513 | + 'func' => '_resend_registration', |
|
| 514 | + 'noheader' => true, |
|
| 515 | + 'capability' => 'ee_send_message', |
|
| 516 | + ), |
|
| 517 | + 'registrations_report' => array( |
|
| 518 | + 'func' => '_registrations_report', |
|
| 519 | + 'noheader' => true, |
|
| 520 | + 'capability' => 'ee_read_registrations', |
|
| 521 | + ), |
|
| 522 | + 'contact_list_export' => array( |
|
| 523 | + 'func' => '_contact_list_export', |
|
| 524 | + 'noheader' => true, |
|
| 525 | + 'capability' => 'export', |
|
| 526 | + ), |
|
| 527 | + 'contact_list_report' => array( |
|
| 528 | + 'func' => '_contact_list_report', |
|
| 529 | + 'noheader' => true, |
|
| 530 | + 'capability' => 'ee_read_contacts', |
|
| 531 | + ), |
|
| 532 | + ); |
|
| 533 | + } |
|
| 534 | + |
|
| 535 | + |
|
| 536 | + protected function _set_page_config() |
|
| 537 | + { |
|
| 538 | + $this->_page_config = array( |
|
| 539 | + 'default' => array( |
|
| 540 | + 'nav' => array( |
|
| 541 | + 'label' => esc_html__('Overview', 'event_espresso'), |
|
| 542 | + 'order' => 5, |
|
| 543 | + ), |
|
| 544 | + 'help_tabs' => array( |
|
| 545 | + 'registrations_overview_help_tab' => array( |
|
| 546 | + 'title' => esc_html__('Registrations Overview', 'event_espresso'), |
|
| 547 | + 'filename' => 'registrations_overview', |
|
| 548 | + ), |
|
| 549 | + 'registrations_overview_table_column_headings_help_tab' => array( |
|
| 550 | + 'title' => esc_html__('Registrations Table Column Headings', 'event_espresso'), |
|
| 551 | + 'filename' => 'registrations_overview_table_column_headings', |
|
| 552 | + ), |
|
| 553 | + 'registrations_overview_filters_help_tab' => array( |
|
| 554 | + 'title' => esc_html__('Registration Filters', 'event_espresso'), |
|
| 555 | + 'filename' => 'registrations_overview_filters', |
|
| 556 | + ), |
|
| 557 | + 'registrations_overview_views_help_tab' => array( |
|
| 558 | + 'title' => esc_html__('Registration Views', 'event_espresso'), |
|
| 559 | + 'filename' => 'registrations_overview_views', |
|
| 560 | + ), |
|
| 561 | + 'registrations_regoverview_other_help_tab' => array( |
|
| 562 | + 'title' => esc_html__('Registrations Other', 'event_espresso'), |
|
| 563 | + 'filename' => 'registrations_overview_other', |
|
| 564 | + ), |
|
| 565 | + ), |
|
| 566 | + 'help_tour' => array('Registration_Overview_Help_Tour'), |
|
| 567 | + 'qtips' => array('Registration_List_Table_Tips'), |
|
| 568 | + 'list_table' => 'EE_Registrations_List_Table', |
|
| 569 | + 'require_nonce' => false, |
|
| 570 | + ), |
|
| 571 | + 'view_registration' => array( |
|
| 572 | + 'nav' => array( |
|
| 573 | + 'label' => esc_html__('REG Details', 'event_espresso'), |
|
| 574 | + 'order' => 15, |
|
| 575 | + 'url' => isset($this->_req_data['_REG_ID']) |
|
| 576 | + ? add_query_arg(array('_REG_ID' => $this->_req_data['_REG_ID']), $this->_current_page_view_url) |
|
| 577 | + : $this->_admin_base_url, |
|
| 578 | + 'persistent' => false, |
|
| 579 | + ), |
|
| 580 | + 'help_tabs' => array( |
|
| 581 | + 'registrations_details_help_tab' => array( |
|
| 582 | + 'title' => esc_html__('Registration Details', 'event_espresso'), |
|
| 583 | + 'filename' => 'registrations_details', |
|
| 584 | + ), |
|
| 585 | + 'registrations_details_table_help_tab' => array( |
|
| 586 | + 'title' => esc_html__('Registration Details Table', 'event_espresso'), |
|
| 587 | + 'filename' => 'registrations_details_table', |
|
| 588 | + ), |
|
| 589 | + 'registrations_details_form_answers_help_tab' => array( |
|
| 590 | + 'title' => esc_html__('Registration Form Answers', 'event_espresso'), |
|
| 591 | + 'filename' => 'registrations_details_form_answers', |
|
| 592 | + ), |
|
| 593 | + 'registrations_details_registrant_details_help_tab' => array( |
|
| 594 | + 'title' => esc_html__('Contact Details', 'event_espresso'), |
|
| 595 | + 'filename' => 'registrations_details_registrant_details', |
|
| 596 | + ), |
|
| 597 | + ), |
|
| 598 | + 'help_tour' => array('Registration_Details_Help_Tour'), |
|
| 599 | + 'metaboxes' => array_merge( |
|
| 600 | + $this->_default_espresso_metaboxes, |
|
| 601 | + array('_registration_details_metaboxes') |
|
| 602 | + ), |
|
| 603 | + 'require_nonce' => false, |
|
| 604 | + ), |
|
| 605 | + 'new_registration' => array( |
|
| 606 | + 'nav' => array( |
|
| 607 | + 'label' => esc_html__('Add New Registration', 'event_espresso'), |
|
| 608 | + 'url' => '#', |
|
| 609 | + 'order' => 15, |
|
| 610 | + 'persistent' => false, |
|
| 611 | + ), |
|
| 612 | + 'metaboxes' => $this->_default_espresso_metaboxes, |
|
| 613 | + 'labels' => array( |
|
| 614 | + 'publishbox' => esc_html__('Save Registration', 'event_espresso'), |
|
| 615 | + ), |
|
| 616 | + 'require_nonce' => false, |
|
| 617 | + ), |
|
| 618 | + 'add_new_attendee' => array( |
|
| 619 | + 'nav' => array( |
|
| 620 | + 'label' => esc_html__('Add Contact', 'event_espresso'), |
|
| 621 | + 'order' => 15, |
|
| 622 | + 'persistent' => false, |
|
| 623 | + ), |
|
| 624 | + 'metaboxes' => array_merge( |
|
| 625 | + $this->_default_espresso_metaboxes, |
|
| 626 | + array('_publish_post_box', 'attendee_editor_metaboxes') |
|
| 627 | + ), |
|
| 628 | + 'require_nonce' => false, |
|
| 629 | + ), |
|
| 630 | + 'edit_attendee' => array( |
|
| 631 | + 'nav' => array( |
|
| 632 | + 'label' => esc_html__('Edit Contact', 'event_espresso'), |
|
| 633 | + 'order' => 15, |
|
| 634 | + 'persistent' => false, |
|
| 635 | + 'url' => isset($this->_req_data['ATT_ID']) |
|
| 636 | + ? add_query_arg(array('ATT_ID' => $this->_req_data['ATT_ID']), $this->_current_page_view_url) |
|
| 637 | + : $this->_admin_base_url, |
|
| 638 | + ), |
|
| 639 | + 'metaboxes' => array('attendee_editor_metaboxes'), |
|
| 640 | + 'require_nonce' => false, |
|
| 641 | + ), |
|
| 642 | + 'contact_list' => array( |
|
| 643 | + 'nav' => array( |
|
| 644 | + 'label' => esc_html__('Contact List', 'event_espresso'), |
|
| 645 | + 'order' => 20, |
|
| 646 | + ), |
|
| 647 | + 'list_table' => 'EE_Attendee_Contact_List_Table', |
|
| 648 | + 'help_tabs' => array( |
|
| 649 | + 'registrations_contact_list_help_tab' => array( |
|
| 650 | + 'title' => esc_html__('Registrations Contact List', 'event_espresso'), |
|
| 651 | + 'filename' => 'registrations_contact_list', |
|
| 652 | + ), |
|
| 653 | + 'registrations_contact-list_table_column_headings_help_tab' => array( |
|
| 654 | + 'title' => esc_html__('Contact List Table Column Headings', 'event_espresso'), |
|
| 655 | + 'filename' => 'registrations_contact_list_table_column_headings', |
|
| 656 | + ), |
|
| 657 | + 'registrations_contact_list_views_help_tab' => array( |
|
| 658 | + 'title' => esc_html__('Contact List Views', 'event_espresso'), |
|
| 659 | + 'filename' => 'registrations_contact_list_views', |
|
| 660 | + ), |
|
| 661 | + 'registrations_contact_list_other_help_tab' => array( |
|
| 662 | + 'title' => esc_html__('Contact List Other', 'event_espresso'), |
|
| 663 | + 'filename' => 'registrations_contact_list_other', |
|
| 664 | + ), |
|
| 665 | + ), |
|
| 666 | + 'help_tour' => array('Contact_List_Help_Tour'), |
|
| 667 | + 'metaboxes' => array(), |
|
| 668 | + 'require_nonce' => false, |
|
| 669 | + ), |
|
| 670 | + // override default cpt routes |
|
| 671 | + 'create_new' => '', |
|
| 672 | + 'edit' => '', |
|
| 673 | + ); |
|
| 674 | + } |
|
| 675 | + |
|
| 676 | + |
|
| 677 | + /** |
|
| 678 | + * The below methods aren't used by this class currently |
|
| 679 | + */ |
|
| 680 | + protected function _add_screen_options() |
|
| 681 | + { |
|
| 682 | + } |
|
| 683 | + |
|
| 684 | + |
|
| 685 | + protected function _add_feature_pointers() |
|
| 686 | + { |
|
| 687 | + } |
|
| 688 | + |
|
| 689 | + |
|
| 690 | + public function admin_init() |
|
| 691 | + { |
|
| 692 | + EE_Registry::$i18n_js_strings['update_att_qstns'] = esc_html__( |
|
| 693 | + 'click "Update Registration Questions" to save your changes', |
|
| 694 | + 'event_espresso' |
|
| 695 | + ); |
|
| 696 | + } |
|
| 697 | + |
|
| 698 | + |
|
| 699 | + public function admin_notices() |
|
| 700 | + { |
|
| 701 | + } |
|
| 702 | + |
|
| 703 | + |
|
| 704 | + public function admin_footer_scripts() |
|
| 705 | + { |
|
| 706 | + } |
|
| 707 | + |
|
| 708 | + |
|
| 709 | + /** |
|
| 710 | + * get list of registration statuses |
|
| 711 | + * |
|
| 712 | + * @access private |
|
| 713 | + * @return void |
|
| 714 | + * @throws EE_Error |
|
| 715 | + */ |
|
| 716 | + private function _get_registration_status_array() |
|
| 717 | + { |
|
| 718 | + self::$_reg_status = EEM_Registration::reg_status_array(array(), true); |
|
| 719 | + } |
|
| 720 | + |
|
| 721 | + |
|
| 722 | + /** |
|
| 723 | + * @throws InvalidArgumentException |
|
| 724 | + * @throws InvalidDataTypeException |
|
| 725 | + * @throws InvalidInterfaceException |
|
| 726 | + * @since $VID:$ |
|
| 727 | + */ |
|
| 728 | + protected function _add_screen_options_default() |
|
| 729 | + { |
|
| 730 | + $this->_per_page_screen_option(); |
|
| 731 | + } |
|
| 732 | + |
|
| 733 | + |
|
| 734 | + /** |
|
| 735 | + * @throws InvalidArgumentException |
|
| 736 | + * @throws InvalidDataTypeException |
|
| 737 | + * @throws InvalidInterfaceException |
|
| 738 | + * @since $VID:$ |
|
| 739 | + */ |
|
| 740 | + protected function _add_screen_options_contact_list() |
|
| 741 | + { |
|
| 742 | + $page_title = $this->_admin_page_title; |
|
| 743 | + $this->_admin_page_title = esc_html__('Contacts', 'event_espresso'); |
|
| 744 | + $this->_per_page_screen_option(); |
|
| 745 | + $this->_admin_page_title = $page_title; |
|
| 746 | + } |
|
| 747 | + |
|
| 748 | + |
|
| 749 | + public function load_scripts_styles() |
|
| 750 | + { |
|
| 751 | + // style |
|
| 752 | + wp_register_style( |
|
| 753 | + 'espresso_reg', |
|
| 754 | + REG_ASSETS_URL . 'espresso_registrations_admin.css', |
|
| 755 | + array('ee-admin-css'), |
|
| 756 | + EVENT_ESPRESSO_VERSION |
|
| 757 | + ); |
|
| 758 | + wp_enqueue_style('espresso_reg'); |
|
| 759 | + // script |
|
| 760 | + wp_register_script( |
|
| 761 | + 'espresso_reg', |
|
| 762 | + REG_ASSETS_URL . 'espresso_registrations_admin.js', |
|
| 763 | + array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'), |
|
| 764 | + EVENT_ESPRESSO_VERSION, |
|
| 765 | + true |
|
| 766 | + ); |
|
| 767 | + wp_enqueue_script('espresso_reg'); |
|
| 768 | + } |
|
| 769 | + |
|
| 770 | + |
|
| 771 | + /** |
|
| 772 | + * @throws EE_Error |
|
| 773 | + * @throws InvalidArgumentException |
|
| 774 | + * @throws InvalidDataTypeException |
|
| 775 | + * @throws InvalidInterfaceException |
|
| 776 | + * @throws ReflectionException |
|
| 777 | + * @since $VID:$ |
|
| 778 | + */ |
|
| 779 | + public function load_scripts_styles_edit_attendee() |
|
| 780 | + { |
|
| 781 | + // stuff to only show up on our attendee edit details page. |
|
| 782 | + $attendee_details_translations = array( |
|
| 783 | + 'att_publish_text' => sprintf( |
|
| 784 | + /* translators: The date and time */ |
|
| 785 | + wp_strip_all_tags(__('Created on: %s', 'event_espresso')), |
|
| 786 | + '<b>' . $this->_cpt_model_obj->get_datetime('ATT_created') . '</b>' |
|
| 787 | + ), |
|
| 788 | + ); |
|
| 789 | + wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations); |
|
| 790 | + wp_enqueue_script('jquery-validate'); |
|
| 791 | + } |
|
| 792 | + |
|
| 793 | + |
|
| 794 | + /** |
|
| 795 | + * @throws EE_Error |
|
| 796 | + * @throws InvalidArgumentException |
|
| 797 | + * @throws InvalidDataTypeException |
|
| 798 | + * @throws InvalidInterfaceException |
|
| 799 | + * @throws ReflectionException |
|
| 800 | + * @since $VID:$ |
|
| 801 | + */ |
|
| 802 | + public function load_scripts_styles_view_registration() |
|
| 803 | + { |
|
| 804 | + // styles |
|
| 805 | + wp_enqueue_style('espresso-ui-theme'); |
|
| 806 | + // scripts |
|
| 807 | + $this->_get_reg_custom_questions_form($this->_registration->ID()); |
|
| 808 | + $this->_reg_custom_questions_form->wp_enqueue_scripts(true); |
|
| 809 | + } |
|
| 810 | + |
|
| 811 | + |
|
| 812 | + public function load_scripts_styles_contact_list() |
|
| 813 | + { |
|
| 814 | + wp_dequeue_style('espresso_reg'); |
|
| 815 | + wp_register_style( |
|
| 816 | + 'espresso_att', |
|
| 817 | + REG_ASSETS_URL . 'espresso_attendees_admin.css', |
|
| 818 | + array('ee-admin-css'), |
|
| 819 | + EVENT_ESPRESSO_VERSION |
|
| 820 | + ); |
|
| 821 | + wp_enqueue_style('espresso_att'); |
|
| 822 | + } |
|
| 823 | + |
|
| 824 | + |
|
| 825 | + public function load_scripts_styles_new_registration() |
|
| 826 | + { |
|
| 827 | + wp_register_script( |
|
| 828 | + 'ee-spco-for-admin', |
|
| 829 | + REG_ASSETS_URL . 'spco_for_admin.js', |
|
| 830 | + array('underscore', 'jquery'), |
|
| 831 | + EVENT_ESPRESSO_VERSION, |
|
| 832 | + true |
|
| 833 | + ); |
|
| 834 | + wp_enqueue_script('ee-spco-for-admin'); |
|
| 835 | + add_filter('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', '__return_true'); |
|
| 836 | + EE_Form_Section_Proper::wp_enqueue_scripts(); |
|
| 837 | + EED_Ticket_Selector::load_tckt_slctr_assets(); |
|
| 838 | + EE_Datepicker_Input::enqueue_styles_and_scripts(); |
|
| 839 | + } |
|
| 840 | + |
|
| 841 | + |
|
| 842 | + public function AHEE__EE_Admin_Page__route_admin_request_resend_registration() |
|
| 843 | + { |
|
| 844 | + add_filter('FHEE_load_EE_messages', '__return_true'); |
|
| 845 | + } |
|
| 846 | + |
|
| 847 | + |
|
| 848 | + public function AHEE__EE_Admin_Page__route_admin_request_approve_registration() |
|
| 849 | + { |
|
| 850 | + add_filter('FHEE_load_EE_messages', '__return_true'); |
|
| 851 | + } |
|
| 852 | + |
|
| 853 | + |
|
| 854 | + /** |
|
| 855 | + * @throws EE_Error |
|
| 856 | + * @throws InvalidArgumentException |
|
| 857 | + * @throws InvalidDataTypeException |
|
| 858 | + * @throws InvalidInterfaceException |
|
| 859 | + * @throws ReflectionException |
|
| 860 | + * @since $VID:$ |
|
| 861 | + */ |
|
| 862 | + protected function _set_list_table_views_default() |
|
| 863 | + { |
|
| 864 | + // for notification related bulk actions we need to make sure only active messengers have an option. |
|
| 865 | + EED_Messages::set_autoloaders(); |
|
| 866 | + /** @type EE_Message_Resource_Manager $message_resource_manager */ |
|
| 867 | + $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager'); |
|
| 868 | + $active_mts = $message_resource_manager->list_of_active_message_types(); |
|
| 869 | + // key= bulk_action_slug, value= message type. |
|
| 870 | + $match_array = array( |
|
| 871 | + 'approve_registrations' => 'registration', |
|
| 872 | + 'decline_registrations' => 'declined_registration', |
|
| 873 | + 'pending_registrations' => 'pending_approval', |
|
| 874 | + 'no_approve_registrations' => 'not_approved_registration', |
|
| 875 | + 'cancel_registrations' => 'cancelled_registration', |
|
| 876 | + ); |
|
| 877 | + $can_send = EE_Registry::instance()->CAP->current_user_can( |
|
| 878 | + 'ee_send_message', |
|
| 879 | + 'batch_send_messages' |
|
| 880 | + ); |
|
| 881 | + /** setup reg status bulk actions **/ |
|
| 882 | + $def_reg_status_actions['approve_registrations'] = esc_html__('Approve Registrations', 'event_espresso'); |
|
| 883 | + if ($can_send && in_array($match_array['approve_registrations'], $active_mts, true)) { |
|
| 884 | + $def_reg_status_actions['approve_and_notify_registrations'] = esc_html__( |
|
| 885 | + 'Approve and Notify Registrations', |
|
| 886 | + 'event_espresso' |
|
| 887 | + ); |
|
| 888 | + } |
|
| 889 | + $def_reg_status_actions['decline_registrations'] = esc_html__('Decline Registrations', 'event_espresso'); |
|
| 890 | + if ($can_send && in_array($match_array['decline_registrations'], $active_mts, true)) { |
|
| 891 | + $def_reg_status_actions['decline_and_notify_registrations'] = esc_html__( |
|
| 892 | + 'Decline and Notify Registrations', |
|
| 893 | + 'event_espresso' |
|
| 894 | + ); |
|
| 895 | + } |
|
| 896 | + $def_reg_status_actions['pending_registrations'] = esc_html__( |
|
| 897 | + 'Set Registrations to Pending Payment', |
|
| 898 | + 'event_espresso' |
|
| 899 | + ); |
|
| 900 | + if ($can_send && in_array($match_array['pending_registrations'], $active_mts, true)) { |
|
| 901 | + $def_reg_status_actions['pending_and_notify_registrations'] = esc_html__( |
|
| 902 | + 'Set Registrations to Pending Payment and Notify', |
|
| 903 | + 'event_espresso' |
|
| 904 | + ); |
|
| 905 | + } |
|
| 906 | + $def_reg_status_actions['no_approve_registrations'] = esc_html__( |
|
| 907 | + 'Set Registrations to Not Approved', |
|
| 908 | + 'event_espresso' |
|
| 909 | + ); |
|
| 910 | + if ($can_send && in_array($match_array['no_approve_registrations'], $active_mts, true)) { |
|
| 911 | + $def_reg_status_actions['no_approve_and_notify_registrations'] = esc_html__( |
|
| 912 | + 'Set Registrations to Not Approved and Notify', |
|
| 913 | + 'event_espresso' |
|
| 914 | + ); |
|
| 915 | + } |
|
| 916 | + $def_reg_status_actions['cancel_registrations'] = esc_html__('Cancel Registrations', 'event_espresso'); |
|
| 917 | + if ($can_send && in_array($match_array['cancel_registrations'], $active_mts, true)) { |
|
| 918 | + $def_reg_status_actions['cancel_and_notify_registrations'] = esc_html__( |
|
| 919 | + 'Cancel Registrations and Notify', |
|
| 920 | + 'event_espresso' |
|
| 921 | + ); |
|
| 922 | + } |
|
| 923 | + $def_reg_status_actions = apply_filters( |
|
| 924 | + 'FHEE__Registrations_Admin_Page___set_list_table_views_default__def_reg_status_actions_array', |
|
| 925 | + $def_reg_status_actions, |
|
| 926 | + $active_mts, |
|
| 927 | + $can_send |
|
| 928 | + ); |
|
| 929 | + |
|
| 930 | + $this->_views = array( |
|
| 931 | + 'all' => array( |
|
| 932 | + 'slug' => 'all', |
|
| 933 | + 'label' => esc_html__('View All Registrations', 'event_espresso'), |
|
| 934 | + 'count' => 0, |
|
| 935 | + 'bulk_action' => array_merge( |
|
| 936 | + $def_reg_status_actions, |
|
| 937 | + array( |
|
| 938 | + 'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'), |
|
| 939 | + ) |
|
| 940 | + ), |
|
| 941 | + ), |
|
| 942 | + 'month' => array( |
|
| 943 | + 'slug' => 'month', |
|
| 944 | + 'label' => esc_html__('This Month', 'event_espresso'), |
|
| 945 | + 'count' => 0, |
|
| 946 | + 'bulk_action' => array_merge( |
|
| 947 | + $def_reg_status_actions, |
|
| 948 | + array( |
|
| 949 | + 'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'), |
|
| 950 | + ) |
|
| 951 | + ), |
|
| 952 | + ), |
|
| 953 | + 'today' => array( |
|
| 954 | + 'slug' => 'today', |
|
| 955 | + 'label' => sprintf( |
|
| 956 | + esc_html__('Today - %s', 'event_espresso'), |
|
| 957 | + date('M d, Y', current_time('timestamp')) |
|
| 958 | + ), |
|
| 959 | + 'count' => 0, |
|
| 960 | + 'bulk_action' => array_merge( |
|
| 961 | + $def_reg_status_actions, |
|
| 962 | + array( |
|
| 963 | + 'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'), |
|
| 964 | + ) |
|
| 965 | + ), |
|
| 966 | + ), |
|
| 967 | + ); |
|
| 968 | + if (EE_Registry::instance()->CAP->current_user_can( |
|
| 969 | + 'ee_delete_registrations', |
|
| 970 | + 'espresso_registrations_delete_registration' |
|
| 971 | + )) { |
|
| 972 | + $this->_views['incomplete'] = array( |
|
| 973 | + 'slug' => 'incomplete', |
|
| 974 | + 'label' => esc_html__('Incomplete', 'event_espresso'), |
|
| 975 | + 'count' => 0, |
|
| 976 | + 'bulk_action' => array( |
|
| 977 | + 'trash_registrations' => esc_html__('Trash Registrations', 'event_espresso'), |
|
| 978 | + ), |
|
| 979 | + ); |
|
| 980 | + $this->_views['trash'] = array( |
|
| 981 | + 'slug' => 'trash', |
|
| 982 | + 'label' => esc_html__('Trash', 'event_espresso'), |
|
| 983 | + 'count' => 0, |
|
| 984 | + 'bulk_action' => array( |
|
| 985 | + 'restore_registrations' => esc_html__('Restore Registrations', 'event_espresso'), |
|
| 986 | + 'delete_registrations' => esc_html__('Delete Registrations Permanently', 'event_espresso'), |
|
| 987 | + ), |
|
| 988 | + ); |
|
| 989 | + } |
|
| 990 | + } |
|
| 991 | + |
|
| 992 | + |
|
| 993 | + protected function _set_list_table_views_contact_list() |
|
| 994 | + { |
|
| 995 | + $this->_views = array( |
|
| 996 | + 'in_use' => array( |
|
| 997 | + 'slug' => 'in_use', |
|
| 998 | + 'label' => esc_html__('In Use', 'event_espresso'), |
|
| 999 | + 'count' => 0, |
|
| 1000 | + 'bulk_action' => array( |
|
| 1001 | + 'trash_attendees' => esc_html__('Move to Trash', 'event_espresso'), |
|
| 1002 | + ), |
|
| 1003 | + ), |
|
| 1004 | + ); |
|
| 1005 | + if (EE_Registry::instance()->CAP->current_user_can( |
|
| 1006 | + 'ee_delete_contacts', |
|
| 1007 | + 'espresso_registrations_trash_attendees' |
|
| 1008 | + ) |
|
| 1009 | + ) { |
|
| 1010 | + $this->_views['trash'] = array( |
|
| 1011 | + 'slug' => 'trash', |
|
| 1012 | + 'label' => esc_html__('Trash', 'event_espresso'), |
|
| 1013 | + 'count' => 0, |
|
| 1014 | + 'bulk_action' => array( |
|
| 1015 | + 'restore_attendees' => esc_html__('Restore from Trash', 'event_espresso'), |
|
| 1016 | + ), |
|
| 1017 | + ); |
|
| 1018 | + } |
|
| 1019 | + } |
|
| 1020 | + |
|
| 1021 | + |
|
| 1022 | + protected function _registration_legend_items() |
|
| 1023 | + { |
|
| 1024 | + $fc_items = array( |
|
| 1025 | + 'star-icon' => array( |
|
| 1026 | + 'class' => 'dashicons dashicons-star-filled lt-blue-icon ee-icon-size-8', |
|
| 1027 | + 'desc' => esc_html__('This is the Primary Registrant', 'event_espresso'), |
|
| 1028 | + ), |
|
| 1029 | + 'view_details' => array( |
|
| 1030 | + 'class' => 'dashicons dashicons-clipboard', |
|
| 1031 | + 'desc' => esc_html__('View Registration Details', 'event_espresso'), |
|
| 1032 | + ), |
|
| 1033 | + 'edit_attendee' => array( |
|
| 1034 | + 'class' => 'ee-icon ee-icon-user-edit ee-icon-size-16', |
|
| 1035 | + 'desc' => esc_html__('Edit Contact Details', 'event_espresso'), |
|
| 1036 | + ), |
|
| 1037 | + 'view_transaction' => array( |
|
| 1038 | + 'class' => 'dashicons dashicons-cart', |
|
| 1039 | + 'desc' => esc_html__('View Transaction Details', 'event_espresso'), |
|
| 1040 | + ), |
|
| 1041 | + 'view_invoice' => array( |
|
| 1042 | + 'class' => 'dashicons dashicons-media-spreadsheet', |
|
| 1043 | + 'desc' => esc_html__('View Transaction Invoice', 'event_espresso'), |
|
| 1044 | + ), |
|
| 1045 | + ); |
|
| 1046 | + if (EE_Registry::instance()->CAP->current_user_can( |
|
| 1047 | + 'ee_send_message', |
|
| 1048 | + 'espresso_registrations_resend_registration' |
|
| 1049 | + )) { |
|
| 1050 | + $fc_items['resend_registration'] = array( |
|
| 1051 | + 'class' => 'dashicons dashicons-email-alt', |
|
| 1052 | + 'desc' => esc_html__('Resend Registration Details', 'event_espresso'), |
|
| 1053 | + ); |
|
| 1054 | + } else { |
|
| 1055 | + $fc_items['blank'] = array('class' => 'blank', 'desc' => ''); |
|
| 1056 | + } |
|
| 1057 | + if (EE_Registry::instance()->CAP->current_user_can( |
|
| 1058 | + 'ee_read_global_messages', |
|
| 1059 | + 'view_filtered_messages' |
|
| 1060 | + )) { |
|
| 1061 | + $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for'); |
|
| 1062 | + if (is_array($related_for_icon) && isset($related_for_icon['css_class'], $related_for_icon['label'])) { |
|
| 1063 | + $fc_items['view_related_messages'] = array( |
|
| 1064 | + 'class' => $related_for_icon['css_class'], |
|
| 1065 | + 'desc' => $related_for_icon['label'], |
|
| 1066 | + ); |
|
| 1067 | + } |
|
| 1068 | + } |
|
| 1069 | + $sc_items = array( |
|
| 1070 | + 'approved_status' => array( |
|
| 1071 | + 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved, |
|
| 1072 | + 'desc' => EEH_Template::pretty_status( |
|
| 1073 | + EEM_Registration::status_id_approved, |
|
| 1074 | + false, |
|
| 1075 | + 'sentence' |
|
| 1076 | + ), |
|
| 1077 | + ), |
|
| 1078 | + 'pending_status' => array( |
|
| 1079 | + 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment, |
|
| 1080 | + 'desc' => EEH_Template::pretty_status( |
|
| 1081 | + EEM_Registration::status_id_pending_payment, |
|
| 1082 | + false, |
|
| 1083 | + 'sentence' |
|
| 1084 | + ), |
|
| 1085 | + ), |
|
| 1086 | + 'wait_list' => array( |
|
| 1087 | + 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list, |
|
| 1088 | + 'desc' => EEH_Template::pretty_status( |
|
| 1089 | + EEM_Registration::status_id_wait_list, |
|
| 1090 | + false, |
|
| 1091 | + 'sentence' |
|
| 1092 | + ), |
|
| 1093 | + ), |
|
| 1094 | + 'incomplete_status' => array( |
|
| 1095 | + 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete, |
|
| 1096 | + 'desc' => EEH_Template::pretty_status( |
|
| 1097 | + EEM_Registration::status_id_incomplete, |
|
| 1098 | + false, |
|
| 1099 | + 'sentence' |
|
| 1100 | + ), |
|
| 1101 | + ), |
|
| 1102 | + 'not_approved' => array( |
|
| 1103 | + 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved, |
|
| 1104 | + 'desc' => EEH_Template::pretty_status( |
|
| 1105 | + EEM_Registration::status_id_not_approved, |
|
| 1106 | + false, |
|
| 1107 | + 'sentence' |
|
| 1108 | + ), |
|
| 1109 | + ), |
|
| 1110 | + 'declined_status' => array( |
|
| 1111 | + 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined, |
|
| 1112 | + 'desc' => EEH_Template::pretty_status( |
|
| 1113 | + EEM_Registration::status_id_declined, |
|
| 1114 | + false, |
|
| 1115 | + 'sentence' |
|
| 1116 | + ), |
|
| 1117 | + ), |
|
| 1118 | + 'cancelled_status' => array( |
|
| 1119 | + 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled, |
|
| 1120 | + 'desc' => EEH_Template::pretty_status( |
|
| 1121 | + EEM_Registration::status_id_cancelled, |
|
| 1122 | + false, |
|
| 1123 | + 'sentence' |
|
| 1124 | + ), |
|
| 1125 | + ), |
|
| 1126 | + ); |
|
| 1127 | + return array_merge($fc_items, $sc_items); |
|
| 1128 | + } |
|
| 1129 | + |
|
| 1130 | + |
|
| 1131 | + |
|
| 1132 | + /*************************************** REGISTRATION OVERVIEW **************************************/ |
|
| 1133 | + |
|
| 1134 | + |
|
| 1135 | + |
|
| 1136 | + /** |
|
| 1137 | + * @throws DomainException |
|
| 1138 | + * @throws EE_Error |
|
| 1139 | + * @throws InvalidArgumentException |
|
| 1140 | + * @throws InvalidDataTypeException |
|
| 1141 | + * @throws InvalidInterfaceException |
|
| 1142 | + * @throws ReflectionException |
|
| 1143 | + */ |
|
| 1144 | + protected function _registrations_overview_list_table() |
|
| 1145 | + { |
|
| 1146 | + $this->appendAddNewRegistrationButtonToPageTitle(); |
|
| 1147 | + $header_text = ''; |
|
| 1148 | + $admin_page_header_decorators = [ |
|
| 1149 | + 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\AttendeeFilterHeader', |
|
| 1150 | + 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\EventFilterHeader', |
|
| 1151 | + 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\DateFilterHeader', |
|
| 1152 | + 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\TicketFilterHeader', |
|
| 1153 | + ]; |
|
| 1154 | + foreach ($admin_page_header_decorators as $admin_page_header_decorator) { |
|
| 1155 | + $filter_header_decorator = $this->loader->getNew($admin_page_header_decorator); |
|
| 1156 | + $header_text = $filter_header_decorator->getHeaderText($header_text); |
|
| 1157 | + } |
|
| 1158 | + $this->_template_args['admin_page_header'] = $header_text; |
|
| 1159 | + $this->_template_args['after_list_table'] = $this->_display_legend($this->_registration_legend_items()); |
|
| 1160 | + $this->display_admin_list_table_page_with_no_sidebar(); |
|
| 1161 | + } |
|
| 1162 | + |
|
| 1163 | + |
|
| 1164 | + /** |
|
| 1165 | + * @throws EE_Error |
|
| 1166 | + * @throws InvalidArgumentException |
|
| 1167 | + * @throws InvalidDataTypeException |
|
| 1168 | + * @throws InvalidInterfaceException |
|
| 1169 | + */ |
|
| 1170 | + private function appendAddNewRegistrationButtonToPageTitle() |
|
| 1171 | + { |
|
| 1172 | + $EVT_ID = ! empty($this->_req_data['event_id']) |
|
| 1173 | + ? absint($this->_req_data['event_id']) |
|
| 1174 | + : 0; |
|
| 1175 | + if ($EVT_ID |
|
| 1176 | + && EE_Registry::instance()->CAP->current_user_can( |
|
| 1177 | + 'ee_edit_registrations', |
|
| 1178 | + 'espresso_registrations_new_registration', |
|
| 1179 | + $EVT_ID |
|
| 1180 | + ) |
|
| 1181 | + ) { |
|
| 1182 | + $this->_admin_page_title .= ' ' . $this->get_action_link_or_button( |
|
| 1183 | + 'new_registration', |
|
| 1184 | + 'add-registrant', |
|
| 1185 | + array('event_id' => $EVT_ID), |
|
| 1186 | + 'add-new-h2' |
|
| 1187 | + ); |
|
| 1188 | + } |
|
| 1189 | + } |
|
| 1190 | + |
|
| 1191 | + |
|
| 1192 | + /** |
|
| 1193 | + * This sets the _registration property for the registration details screen |
|
| 1194 | + * |
|
| 1195 | + * @access private |
|
| 1196 | + * @return bool |
|
| 1197 | + * @throws EE_Error |
|
| 1198 | + * @throws InvalidArgumentException |
|
| 1199 | + * @throws InvalidDataTypeException |
|
| 1200 | + * @throws InvalidInterfaceException |
|
| 1201 | + */ |
|
| 1202 | + private function _set_registration_object() |
|
| 1203 | + { |
|
| 1204 | + // get out if we've already set the object |
|
| 1205 | + if ($this->_registration instanceof EE_Registration) { |
|
| 1206 | + return true; |
|
| 1207 | + } |
|
| 1208 | + $REG_ID = (! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false; |
|
| 1209 | + if ($this->_registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID)) { |
|
| 1210 | + return true; |
|
| 1211 | + } |
|
| 1212 | + $error_msg = sprintf( |
|
| 1213 | + esc_html__( |
|
| 1214 | + 'An error occurred and the details for Registration ID #%s could not be retrieved.', |
|
| 1215 | + 'event_espresso' |
|
| 1216 | + ), |
|
| 1217 | + $REG_ID |
|
| 1218 | + ); |
|
| 1219 | + EE_Error::add_error($error_msg, __FILE__, __FUNCTION__, __LINE__); |
|
| 1220 | + $this->_registration = null; |
|
| 1221 | + return false; |
|
| 1222 | + } |
|
| 1223 | + |
|
| 1224 | + |
|
| 1225 | + /** |
|
| 1226 | + * Used to retrieve registrations for the list table. |
|
| 1227 | + * |
|
| 1228 | + * @param int $per_page |
|
| 1229 | + * @param bool $count |
|
| 1230 | + * @param bool $this_month |
|
| 1231 | + * @param bool $today |
|
| 1232 | + * @return EE_Registration[]|int |
|
| 1233 | + * @throws EE_Error |
|
| 1234 | + * @throws InvalidArgumentException |
|
| 1235 | + * @throws InvalidDataTypeException |
|
| 1236 | + * @throws InvalidInterfaceException |
|
| 1237 | + */ |
|
| 1238 | + public function get_registrations( |
|
| 1239 | + $per_page = 10, |
|
| 1240 | + $count = false, |
|
| 1241 | + $this_month = false, |
|
| 1242 | + $today = false |
|
| 1243 | + ) { |
|
| 1244 | + if ($this_month) { |
|
| 1245 | + $this->_req_data['status'] = 'month'; |
|
| 1246 | + } |
|
| 1247 | + if ($today) { |
|
| 1248 | + $this->_req_data['status'] = 'today'; |
|
| 1249 | + } |
|
| 1250 | + $query_params = $this->_get_registration_query_parameters($this->_req_data, $per_page, $count); |
|
| 1251 | + /** |
|
| 1252 | + * Override the default groupby added by EEM_Base so that sorts with multiple order bys work as expected |
|
| 1253 | + * |
|
| 1254 | + * @link https://events.codebasehq.com/projects/event-espresso/tickets/10093 |
|
| 1255 | + * @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md |
|
| 1256 | + * or if you have the development copy of EE you can view this at the path: |
|
| 1257 | + * /docs/G--Model-System/model-query-params.md |
|
| 1258 | + */ |
|
| 1259 | + $query_params['group_by'] = ''; |
|
| 1260 | + |
|
| 1261 | + return $count |
|
| 1262 | + ? $this->getRegistrationModel()->count($query_params) |
|
| 1263 | + /** @type EE_Registration[] */ |
|
| 1264 | + : $this->getRegistrationModel()->get_all($query_params); |
|
| 1265 | + } |
|
| 1266 | + |
|
| 1267 | + |
|
| 1268 | + /** |
|
| 1269 | + * Retrieves the query parameters to be used by the Registration model for getting registrations. |
|
| 1270 | + * Note: this listens to values on the request for some of the query parameters. |
|
| 1271 | + * |
|
| 1272 | + * @param array $request |
|
| 1273 | + * @param int $per_page |
|
| 1274 | + * @param bool $count |
|
| 1275 | + * @return array |
|
| 1276 | + * @throws EE_Error |
|
| 1277 | + * @throws InvalidArgumentException |
|
| 1278 | + * @throws InvalidDataTypeException |
|
| 1279 | + * @throws InvalidInterfaceException |
|
| 1280 | + */ |
|
| 1281 | + protected function _get_registration_query_parameters( |
|
| 1282 | + $request = array(), |
|
| 1283 | + $per_page = 10, |
|
| 1284 | + $count = false |
|
| 1285 | + ) { |
|
| 1286 | + /** @var EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder $list_table_query_builder */ |
|
| 1287 | + $list_table_query_builder = $this->loader->getNew( |
|
| 1288 | + 'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder', |
|
| 1289 | + [ $request ] |
|
| 1290 | + ); |
|
| 1291 | + return $list_table_query_builder->getQueryParams($per_page, $count); |
|
| 1292 | + } |
|
| 1293 | + |
|
| 1294 | + |
|
| 1295 | + public function get_registration_status_array() |
|
| 1296 | + { |
|
| 1297 | + return self::$_reg_status; |
|
| 1298 | + } |
|
| 1299 | + |
|
| 1300 | + |
|
| 1301 | + |
|
| 1302 | + |
|
| 1303 | + /*************************************** REGISTRATION DETAILS ***************************************/ |
|
| 1304 | + /** |
|
| 1305 | + * generates HTML for the View Registration Details Admin page |
|
| 1306 | + * |
|
| 1307 | + * @access protected |
|
| 1308 | + * @return void |
|
| 1309 | + * @throws DomainException |
|
| 1310 | + * @throws EE_Error |
|
| 1311 | + * @throws InvalidArgumentException |
|
| 1312 | + * @throws InvalidDataTypeException |
|
| 1313 | + * @throws InvalidInterfaceException |
|
| 1314 | + * @throws EntityNotFoundException |
|
| 1315 | + * @throws ReflectionException |
|
| 1316 | + */ |
|
| 1317 | + protected function _registration_details() |
|
| 1318 | + { |
|
| 1319 | + $this->_template_args = array(); |
|
| 1320 | + $this->_set_registration_object(); |
|
| 1321 | + if (is_object($this->_registration)) { |
|
| 1322 | + $transaction = $this->_registration->transaction() |
|
| 1323 | + ? $this->_registration->transaction() |
|
| 1324 | + : EE_Transaction::new_instance(); |
|
| 1325 | + $this->_session = $transaction->session_data(); |
|
| 1326 | + $event_id = $this->_registration->event_ID(); |
|
| 1327 | + $this->_template_args['reg_nmbr']['value'] = $this->_registration->ID(); |
|
| 1328 | + $this->_template_args['reg_nmbr']['label'] = esc_html__('Registration Number', 'event_espresso'); |
|
| 1329 | + $this->_template_args['reg_datetime']['value'] = $this->_registration->get_i18n_datetime('REG_date'); |
|
| 1330 | + $this->_template_args['reg_datetime']['label'] = esc_html__('Date', 'event_espresso'); |
|
| 1331 | + $this->_template_args['grand_total'] = $transaction->total(); |
|
| 1332 | + $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign; |
|
| 1333 | + // link back to overview |
|
| 1334 | + $this->_template_args['reg_overview_url'] = REG_ADMIN_URL; |
|
| 1335 | + $this->_template_args['registration'] = $this->_registration; |
|
| 1336 | + $this->_template_args['filtered_registrations_link'] = EE_Admin_Page::add_query_args_and_nonce( |
|
| 1337 | + array( |
|
| 1338 | + 'action' => 'default', |
|
| 1339 | + 'event_id' => $event_id, |
|
| 1340 | + ), |
|
| 1341 | + REG_ADMIN_URL |
|
| 1342 | + ); |
|
| 1343 | + $this->_template_args['filtered_transactions_link'] = EE_Admin_Page::add_query_args_and_nonce( |
|
| 1344 | + array( |
|
| 1345 | + 'action' => 'default', |
|
| 1346 | + 'EVT_ID' => $event_id, |
|
| 1347 | + 'page' => 'espresso_transactions', |
|
| 1348 | + ), |
|
| 1349 | + admin_url('admin.php') |
|
| 1350 | + ); |
|
| 1351 | + $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce( |
|
| 1352 | + array( |
|
| 1353 | + 'page' => 'espresso_events', |
|
| 1354 | + 'action' => 'edit', |
|
| 1355 | + 'post' => $event_id, |
|
| 1356 | + ), |
|
| 1357 | + admin_url('admin.php') |
|
| 1358 | + ); |
|
| 1359 | + // next and previous links |
|
| 1360 | + $next_reg = $this->_registration->next( |
|
| 1361 | + null, |
|
| 1362 | + array(), |
|
| 1363 | + 'REG_ID' |
|
| 1364 | + ); |
|
| 1365 | + $this->_template_args['next_registration'] = $next_reg |
|
| 1366 | + ? $this->_next_link( |
|
| 1367 | + EE_Admin_Page::add_query_args_and_nonce( |
|
| 1368 | + array( |
|
| 1369 | + 'action' => 'view_registration', |
|
| 1370 | + '_REG_ID' => $next_reg['REG_ID'], |
|
| 1371 | + ), |
|
| 1372 | + REG_ADMIN_URL |
|
| 1373 | + ), |
|
| 1374 | + 'dashicons dashicons-arrow-right ee-icon-size-22' |
|
| 1375 | + ) |
|
| 1376 | + : ''; |
|
| 1377 | + $previous_reg = $this->_registration->previous( |
|
| 1378 | + null, |
|
| 1379 | + array(), |
|
| 1380 | + 'REG_ID' |
|
| 1381 | + ); |
|
| 1382 | + $this->_template_args['previous_registration'] = $previous_reg |
|
| 1383 | + ? $this->_previous_link( |
|
| 1384 | + EE_Admin_Page::add_query_args_and_nonce( |
|
| 1385 | + array( |
|
| 1386 | + 'action' => 'view_registration', |
|
| 1387 | + '_REG_ID' => $previous_reg['REG_ID'], |
|
| 1388 | + ), |
|
| 1389 | + REG_ADMIN_URL |
|
| 1390 | + ), |
|
| 1391 | + 'dashicons dashicons-arrow-left ee-icon-size-22' |
|
| 1392 | + ) |
|
| 1393 | + : ''; |
|
| 1394 | + // grab header |
|
| 1395 | + $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php'; |
|
| 1396 | + $this->_template_args['REG_ID'] = $this->_registration->ID(); |
|
| 1397 | + $this->_template_args['admin_page_header'] = EEH_Template::display_template( |
|
| 1398 | + $template_path, |
|
| 1399 | + $this->_template_args, |
|
| 1400 | + true |
|
| 1401 | + ); |
|
| 1402 | + } else { |
|
| 1403 | + $this->_template_args['admin_page_header'] = $this->display_espresso_notices(); |
|
| 1404 | + } |
|
| 1405 | + // the details template wrapper |
|
| 1406 | + $this->display_admin_page_with_sidebar(); |
|
| 1407 | + } |
|
| 1408 | + |
|
| 1409 | + |
|
| 1410 | + /** |
|
| 1411 | + * @throws EE_Error |
|
| 1412 | + * @throws InvalidArgumentException |
|
| 1413 | + * @throws InvalidDataTypeException |
|
| 1414 | + * @throws InvalidInterfaceException |
|
| 1415 | + * @throws ReflectionException |
|
| 1416 | + * @since $VID:$ |
|
| 1417 | + */ |
|
| 1418 | + protected function _registration_details_metaboxes() |
|
| 1419 | + { |
|
| 1420 | + do_action('AHEE__Registrations_Admin_Page___registration_details_metabox__start', $this); |
|
| 1421 | + $this->_set_registration_object(); |
|
| 1422 | + $attendee = $this->_registration instanceof EE_Registration ? $this->_registration->attendee() : null; |
|
| 1423 | + add_meta_box( |
|
| 1424 | + 'edit-reg-status-mbox', |
|
| 1425 | + esc_html__('Registration Status', 'event_espresso'), |
|
| 1426 | + array($this, 'set_reg_status_buttons_metabox'), |
|
| 1427 | + $this->wp_page_slug, |
|
| 1428 | + 'normal', |
|
| 1429 | + 'high' |
|
| 1430 | + ); |
|
| 1431 | + add_meta_box( |
|
| 1432 | + 'edit-reg-details-mbox', |
|
| 1433 | + esc_html__('Registration Details', 'event_espresso'), |
|
| 1434 | + array($this, '_reg_details_meta_box'), |
|
| 1435 | + $this->wp_page_slug, |
|
| 1436 | + 'normal', |
|
| 1437 | + 'high' |
|
| 1438 | + ); |
|
| 1439 | + if ($attendee instanceof EE_Attendee |
|
| 1440 | + && EE_Registry::instance()->CAP->current_user_can( |
|
| 1441 | + 'ee_read_registration', |
|
| 1442 | + 'edit-reg-questions-mbox', |
|
| 1443 | + $this->_registration->ID() |
|
| 1444 | + ) |
|
| 1445 | + ) { |
|
| 1446 | + add_meta_box( |
|
| 1447 | + 'edit-reg-questions-mbox', |
|
| 1448 | + esc_html__('Registration Form Answers', 'event_espresso'), |
|
| 1449 | + array($this, '_reg_questions_meta_box'), |
|
| 1450 | + $this->wp_page_slug, |
|
| 1451 | + 'normal', |
|
| 1452 | + 'high' |
|
| 1453 | + ); |
|
| 1454 | + } |
|
| 1455 | + add_meta_box( |
|
| 1456 | + 'edit-reg-registrant-mbox', |
|
| 1457 | + esc_html__('Contact Details', 'event_espresso'), |
|
| 1458 | + array($this, '_reg_registrant_side_meta_box'), |
|
| 1459 | + $this->wp_page_slug, |
|
| 1460 | + 'side', |
|
| 1461 | + 'high' |
|
| 1462 | + ); |
|
| 1463 | + if ($this->_registration->group_size() > 1) { |
|
| 1464 | + add_meta_box( |
|
| 1465 | + 'edit-reg-attendees-mbox', |
|
| 1466 | + esc_html__('Other Registrations in this Transaction', 'event_espresso'), |
|
| 1467 | + array($this, '_reg_attendees_meta_box'), |
|
| 1468 | + $this->wp_page_slug, |
|
| 1469 | + 'normal', |
|
| 1470 | + 'high' |
|
| 1471 | + ); |
|
| 1472 | + } |
|
| 1473 | + } |
|
| 1474 | + |
|
| 1475 | + |
|
| 1476 | + /** |
|
| 1477 | + * set_reg_status_buttons_metabox |
|
| 1478 | + * |
|
| 1479 | + * @access protected |
|
| 1480 | + * @return string |
|
| 1481 | + * @throws EE_Error |
|
| 1482 | + * @throws EntityNotFoundException |
|
| 1483 | + * @throws InvalidArgumentException |
|
| 1484 | + * @throws InvalidDataTypeException |
|
| 1485 | + * @throws InvalidInterfaceException |
|
| 1486 | + * @throws ReflectionException |
|
| 1487 | + */ |
|
| 1488 | + public function set_reg_status_buttons_metabox() |
|
| 1489 | + { |
|
| 1490 | + $this->_set_registration_object(); |
|
| 1491 | + $change_reg_status_form = $this->_generate_reg_status_change_form(); |
|
| 1492 | + echo $change_reg_status_form->form_open( |
|
| 1493 | + self::add_query_args_and_nonce( |
|
| 1494 | + array( |
|
| 1495 | + 'action' => 'change_reg_status', |
|
| 1496 | + ), |
|
| 1497 | + REG_ADMIN_URL |
|
| 1498 | + ) |
|
| 1499 | + ); |
|
| 1500 | + echo $change_reg_status_form->get_html(); |
|
| 1501 | + echo $change_reg_status_form->form_close(); |
|
| 1502 | + } |
|
| 1503 | + |
|
| 1504 | + |
|
| 1505 | + /** |
|
| 1506 | + * @return EE_Form_Section_Proper |
|
| 1507 | + * @throws EE_Error |
|
| 1508 | + * @throws InvalidArgumentException |
|
| 1509 | + * @throws InvalidDataTypeException |
|
| 1510 | + * @throws InvalidInterfaceException |
|
| 1511 | + * @throws EntityNotFoundException |
|
| 1512 | + * @throws ReflectionException |
|
| 1513 | + */ |
|
| 1514 | + protected function _generate_reg_status_change_form() |
|
| 1515 | + { |
|
| 1516 | + $reg_status_change_form_array = array( |
|
| 1517 | + 'name' => 'reg_status_change_form', |
|
| 1518 | + 'html_id' => 'reg-status-change-form', |
|
| 1519 | + 'layout_strategy' => new EE_Admin_Two_Column_Layout(), |
|
| 1520 | + 'subsections' => array( |
|
| 1521 | + 'return' => new EE_Hidden_Input( |
|
| 1522 | + array( |
|
| 1523 | + 'name' => 'return', |
|
| 1524 | + 'default' => 'view_registration', |
|
| 1525 | + ) |
|
| 1526 | + ), |
|
| 1527 | + 'REG_ID' => new EE_Hidden_Input( |
|
| 1528 | + array( |
|
| 1529 | + 'name' => 'REG_ID', |
|
| 1530 | + 'default' => $this->_registration->ID(), |
|
| 1531 | + ) |
|
| 1532 | + ), |
|
| 1533 | + 'current_status' => new EE_Form_Section_HTML( |
|
| 1534 | + EEH_HTML::table( |
|
| 1535 | + EEH_HTML::tr( |
|
| 1536 | + EEH_HTML::th( |
|
| 1537 | + EEH_HTML::label( |
|
| 1538 | + EEH_HTML::strong( |
|
| 1539 | + esc_html__('Current Registration Status', 'event_espresso') |
|
| 1540 | + ) |
|
| 1541 | + ) |
|
| 1542 | + ) |
|
| 1543 | + . EEH_HTML::td( |
|
| 1544 | + EEH_HTML::strong( |
|
| 1545 | + $this->_registration->pretty_status(), |
|
| 1546 | + '', |
|
| 1547 | + 'status-' . $this->_registration->status_ID(), |
|
| 1548 | + 'line-height: 1em; font-size: 1.5em; font-weight: bold;' |
|
| 1549 | + ) |
|
| 1550 | + ) |
|
| 1551 | + ) |
|
| 1552 | + ) |
|
| 1553 | + ) |
|
| 1554 | + ) |
|
| 1555 | + ); |
|
| 1556 | + if (EE_Registry::instance()->CAP->current_user_can( |
|
| 1557 | + 'ee_edit_registration', |
|
| 1558 | + 'toggle_registration_status', |
|
| 1559 | + $this->_registration->ID() |
|
| 1560 | + )) { |
|
| 1561 | + $reg_status_change_form_array['subsections']['reg_status'] = new EE_Select_Input( |
|
| 1562 | + $this->_get_reg_statuses(), |
|
| 1563 | + array( |
|
| 1564 | + 'html_label_text' => esc_html__('Change Registration Status to', 'event_espresso'), |
|
| 1565 | + 'default' => $this->_registration->status_ID(), |
|
| 1566 | + ) |
|
| 1567 | + ); |
|
| 1568 | + $reg_status_change_form_array['subsections']['send_notifications'] = new EE_Yes_No_Input( |
|
| 1569 | + array( |
|
| 1570 | + 'html_label_text' => esc_html__('Send Related Messages', 'event_espresso'), |
|
| 1571 | + 'default' => false, |
|
| 1572 | + 'html_help_text' => esc_html__( |
|
| 1573 | + 'If set to "Yes", then the related messages will be sent to the registrant.', |
|
| 1574 | + 'event_espresso' |
|
| 1575 | + ) |
|
| 1576 | + ) |
|
| 1577 | + ); |
|
| 1578 | + $reg_status_change_form_array['subsections']['submit'] = new EE_Submit_Input( |
|
| 1579 | + array( |
|
| 1580 | + 'html_class' => 'button-primary', |
|
| 1581 | + 'html_label_text' => ' ', |
|
| 1582 | + 'default' => esc_html__('Update Registration Status', 'event_espresso'), |
|
| 1583 | + ) |
|
| 1584 | + ); |
|
| 1585 | + } |
|
| 1586 | + return new EE_Form_Section_Proper($reg_status_change_form_array); |
|
| 1587 | + } |
|
| 1588 | + |
|
| 1589 | + |
|
| 1590 | + /** |
|
| 1591 | + * Returns an array of all the buttons for the various statuses and switch status actions |
|
| 1592 | + * |
|
| 1593 | + * @return array |
|
| 1594 | + * @throws EE_Error |
|
| 1595 | + * @throws InvalidArgumentException |
|
| 1596 | + * @throws InvalidDataTypeException |
|
| 1597 | + * @throws InvalidInterfaceException |
|
| 1598 | + * @throws EntityNotFoundException |
|
| 1599 | + */ |
|
| 1600 | + protected function _get_reg_statuses() |
|
| 1601 | + { |
|
| 1602 | + $reg_status_array = $this->getRegistrationModel()->reg_status_array(); |
|
| 1603 | + unset($reg_status_array[ EEM_Registration::status_id_incomplete ]); |
|
| 1604 | + // get current reg status |
|
| 1605 | + $current_status = $this->_registration->status_ID(); |
|
| 1606 | + // is registration for free event? This will determine whether to display the pending payment option |
|
| 1607 | + if ($current_status !== EEM_Registration::status_id_pending_payment |
|
| 1608 | + && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00) |
|
| 1609 | + ) { |
|
| 1610 | + unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]); |
|
| 1611 | + } |
|
| 1612 | + return $this->getStatusModel()->localized_status($reg_status_array, false, 'sentence'); |
|
| 1613 | + } |
|
| 1614 | + |
|
| 1615 | + |
|
| 1616 | + /** |
|
| 1617 | + * This method is used when using _REG_ID from request which may or may not be an array of reg_ids. |
|
| 1618 | + * |
|
| 1619 | + * @param bool $status REG status given for changing registrations to. |
|
| 1620 | + * @param bool $notify Whether to send messages notifications or not. |
|
| 1621 | + * @return array (array with reg_id(s) updated and whether update was successful. |
|
| 1622 | + * @throws DomainException |
|
| 1623 | + * @throws EE_Error |
|
| 1624 | + * @throws EntityNotFoundException |
|
| 1625 | + * @throws InvalidArgumentException |
|
| 1626 | + * @throws InvalidDataTypeException |
|
| 1627 | + * @throws InvalidInterfaceException |
|
| 1628 | + * @throws ReflectionException |
|
| 1629 | + * @throws RuntimeException |
|
| 1630 | + */ |
|
| 1631 | + protected function _set_registration_status_from_request($status = false, $notify = false) |
|
| 1632 | + { |
|
| 1633 | + if (isset($this->_req_data['reg_status_change_form'])) { |
|
| 1634 | + $REG_IDs = isset($this->_req_data['reg_status_change_form']['REG_ID']) |
|
| 1635 | + ? (array) $this->_req_data['reg_status_change_form']['REG_ID'] |
|
| 1636 | + : array(); |
|
| 1637 | + } else { |
|
| 1638 | + $REG_IDs = isset($this->_req_data['_REG_ID']) |
|
| 1639 | + ? (array) $this->_req_data['_REG_ID'] |
|
| 1640 | + : array(); |
|
| 1641 | + } |
|
| 1642 | + // sanitize $REG_IDs |
|
| 1643 | + $REG_IDs = array_map('absint', $REG_IDs); |
|
| 1644 | + // and remove empty entries |
|
| 1645 | + $REG_IDs = array_filter($REG_IDs); |
|
| 1646 | + |
|
| 1647 | + $result = $this->_set_registration_status($REG_IDs, $status, $notify); |
|
| 1648 | + |
|
| 1649 | + /** |
|
| 1650 | + * Set and filter $_req_data['_REG_ID'] for any potential future messages notifications. |
|
| 1651 | + * Currently this value is used downstream by the _process_resend_registration method. |
|
| 1652 | + * |
|
| 1653 | + * @param int|array $registration_ids The registration ids that have had their status changed successfully. |
|
| 1654 | + * @param bool $status The status registrations were changed to. |
|
| 1655 | + * @param bool $success If the status was changed successfully for all registrations. |
|
| 1656 | + * @param Registrations_Admin_Page $admin_page_object |
|
| 1657 | + */ |
|
| 1658 | + $this->_req_data['_REG_ID'] = apply_filters( |
|
| 1659 | + 'FHEE__Registrations_Admin_Page___set_registration_status_from_request__REG_IDs', |
|
| 1660 | + $result['REG_ID'], |
|
| 1661 | + $status, |
|
| 1662 | + $result['success'], |
|
| 1663 | + $this |
|
| 1664 | + ); |
|
| 1665 | + |
|
| 1666 | + // notify? |
|
| 1667 | + if ($notify |
|
| 1668 | + && $result['success'] |
|
| 1669 | + && ! empty($this->_req_data['_REG_ID']) |
|
| 1670 | + && EE_Registry::instance()->CAP->current_user_can( |
|
| 1671 | + 'ee_send_message', |
|
| 1672 | + 'espresso_registrations_resend_registration' |
|
| 1673 | + ) |
|
| 1674 | + ) { |
|
| 1675 | + $this->_process_resend_registration(); |
|
| 1676 | + } |
|
| 1677 | + return $result; |
|
| 1678 | + } |
|
| 1679 | + |
|
| 1680 | + |
|
| 1681 | + /** |
|
| 1682 | + * Set the registration status for the given reg_id (which may or may not be an array, it gets typecast to an |
|
| 1683 | + * array). Note, this method does NOT take care of possible notifications. That is required by calling code. |
|
| 1684 | + * |
|
| 1685 | + * @param array $REG_IDs |
|
| 1686 | + * @param string $status |
|
| 1687 | + * @param bool $notify Used to indicate whether notification was requested or not. This determines the context |
|
| 1688 | + * slug sent with setting the registration status. |
|
| 1689 | + * @return array (an array with 'success' key representing whether status change was successful, and 'REG_ID' as |
|
| 1690 | + * @throws EE_Error |
|
| 1691 | + * @throws InvalidArgumentException |
|
| 1692 | + * @throws InvalidDataTypeException |
|
| 1693 | + * @throws InvalidInterfaceException |
|
| 1694 | + * @throws ReflectionException |
|
| 1695 | + * @throws RuntimeException |
|
| 1696 | + * @throws EntityNotFoundException |
|
| 1697 | + * @throws DomainException |
|
| 1698 | + */ |
|
| 1699 | + protected function _set_registration_status($REG_IDs = array(), $status = '', $notify = false) |
|
| 1700 | + { |
|
| 1701 | + $success = false; |
|
| 1702 | + // typecast $REG_IDs |
|
| 1703 | + $REG_IDs = (array) $REG_IDs; |
|
| 1704 | + if (! empty($REG_IDs)) { |
|
| 1705 | + $success = true; |
|
| 1706 | + // set default status if none is passed |
|
| 1707 | + $status = $status ? $status : EEM_Registration::status_id_pending_payment; |
|
| 1708 | + $status_context = $notify |
|
| 1709 | + ? Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN_NOTIFY |
|
| 1710 | + : Domain::CONTEXT_REGISTRATION_STATUS_CHANGE_REGISTRATION_ADMIN; |
|
| 1711 | + // loop through REG_ID's and change status |
|
| 1712 | + foreach ($REG_IDs as $REG_ID) { |
|
| 1713 | + $registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID); |
|
| 1714 | + if ($registration instanceof EE_Registration) { |
|
| 1715 | + $registration->set_status( |
|
| 1716 | + $status, |
|
| 1717 | + false, |
|
| 1718 | + new Context( |
|
| 1719 | + $status_context, |
|
| 1720 | + esc_html__( |
|
| 1721 | + 'Manually triggered status change on a Registration Admin Page route.', |
|
| 1722 | + 'event_espresso' |
|
| 1723 | + ) |
|
| 1724 | + ) |
|
| 1725 | + ); |
|
| 1726 | + $result = $registration->save(); |
|
| 1727 | + // verifying explicit fails because update *may* just return 0 for 0 rows affected |
|
| 1728 | + $success = $result !== false ? $success : false; |
|
| 1729 | + } |
|
| 1730 | + } |
|
| 1731 | + } |
|
| 1732 | + |
|
| 1733 | + // return $success and processed registrations |
|
| 1734 | + return array('REG_ID' => $REG_IDs, 'success' => $success); |
|
| 1735 | + } |
|
| 1736 | + |
|
| 1737 | + |
|
| 1738 | + /** |
|
| 1739 | + * Common logic for setting up success message and redirecting to appropriate route |
|
| 1740 | + * |
|
| 1741 | + * @param string $STS_ID status id for the registration changed to |
|
| 1742 | + * @param bool $notify indicates whether the _set_registration_status_from_request does notifications or not. |
|
| 1743 | + * @return void |
|
| 1744 | + * @throws DomainException |
|
| 1745 | + * @throws EE_Error |
|
| 1746 | + * @throws EntityNotFoundException |
|
| 1747 | + * @throws InvalidArgumentException |
|
| 1748 | + * @throws InvalidDataTypeException |
|
| 1749 | + * @throws InvalidInterfaceException |
|
| 1750 | + * @throws ReflectionException |
|
| 1751 | + * @throws RuntimeException |
|
| 1752 | + */ |
|
| 1753 | + protected function _reg_status_change_return($STS_ID, $notify = false) |
|
| 1754 | + { |
|
| 1755 | + $result = ! empty($STS_ID) ? $this->_set_registration_status_from_request($STS_ID, $notify) |
|
| 1756 | + : array('success' => false); |
|
| 1757 | + $success = isset($result['success']) && $result['success']; |
|
| 1758 | + // setup success message |
|
| 1759 | + if ($success) { |
|
| 1760 | + if (is_array($result['REG_ID']) && count($result['REG_ID']) === 1) { |
|
| 1761 | + $msg = sprintf( |
|
| 1762 | + esc_html__('Registration status has been set to %s', 'event_espresso'), |
|
| 1763 | + EEH_Template::pretty_status($STS_ID, false, 'lower') |
|
| 1764 | + ); |
|
| 1765 | + } else { |
|
| 1766 | + $msg = sprintf( |
|
| 1767 | + esc_html__('Registrations have been set to %s.', 'event_espresso'), |
|
| 1768 | + EEH_Template::pretty_status($STS_ID, false, 'lower') |
|
| 1769 | + ); |
|
| 1770 | + } |
|
| 1771 | + EE_Error::add_success($msg); |
|
| 1772 | + } else { |
|
| 1773 | + EE_Error::add_error( |
|
| 1774 | + esc_html__( |
|
| 1775 | + 'Something went wrong, and the status was not changed', |
|
| 1776 | + 'event_espresso' |
|
| 1777 | + ), |
|
| 1778 | + __FILE__, |
|
| 1779 | + __LINE__, |
|
| 1780 | + __FUNCTION__ |
|
| 1781 | + ); |
|
| 1782 | + } |
|
| 1783 | + if (isset($this->_req_data['return']) && $this->_req_data['return'] === 'view_registration') { |
|
| 1784 | + $route = array('action' => 'view_registration', '_REG_ID' => reset($result['REG_ID'])); |
|
| 1785 | + } else { |
|
| 1786 | + $route = array('action' => 'default'); |
|
| 1787 | + } |
|
| 1788 | + $route = $this->mergeExistingRequestParamsWithRedirectArgs($route); |
|
| 1789 | + $this->_redirect_after_action($success, '', '', $route, true); |
|
| 1790 | + } |
|
| 1791 | + |
|
| 1792 | + |
|
| 1793 | + /** |
|
| 1794 | + * incoming reg status change from reg details page. |
|
| 1795 | + * |
|
| 1796 | + * @return void |
|
| 1797 | + * @throws EE_Error |
|
| 1798 | + * @throws EntityNotFoundException |
|
| 1799 | + * @throws InvalidArgumentException |
|
| 1800 | + * @throws InvalidDataTypeException |
|
| 1801 | + * @throws InvalidInterfaceException |
|
| 1802 | + * @throws ReflectionException |
|
| 1803 | + * @throws RuntimeException |
|
| 1804 | + * @throws DomainException |
|
| 1805 | + */ |
|
| 1806 | + protected function _change_reg_status() |
|
| 1807 | + { |
|
| 1808 | + $this->_req_data['return'] = 'view_registration'; |
|
| 1809 | + // set notify based on whether the send notifications toggle is set or not |
|
| 1810 | + $notify = ! empty($this->_req_data['reg_status_change_form']['send_notifications']); |
|
| 1811 | + // $notify = ! empty( $this->_req_data['txn_reg_status_change']['send_notifications'] ); |
|
| 1812 | + $this->_req_data['reg_status_change_form']['reg_status'] = isset($this->_req_data['reg_status_change_form']['reg_status']) |
|
| 1813 | + ? $this->_req_data['reg_status_change_form']['reg_status'] : ''; |
|
| 1814 | + switch ($this->_req_data['reg_status_change_form']['reg_status']) { |
|
| 1815 | + case EEM_Registration::status_id_approved: |
|
| 1816 | + case EEH_Template::pretty_status(EEM_Registration::status_id_approved, false, 'sentence'): |
|
| 1817 | + $this->approve_registration($notify); |
|
| 1818 | + break; |
|
| 1819 | + case EEM_Registration::status_id_pending_payment: |
|
| 1820 | + case EEH_Template::pretty_status(EEM_Registration::status_id_pending_payment, false, 'sentence'): |
|
| 1821 | + $this->pending_registration($notify); |
|
| 1822 | + break; |
|
| 1823 | + case EEM_Registration::status_id_not_approved: |
|
| 1824 | + case EEH_Template::pretty_status(EEM_Registration::status_id_not_approved, false, 'sentence'): |
|
| 1825 | + $this->not_approve_registration($notify); |
|
| 1826 | + break; |
|
| 1827 | + case EEM_Registration::status_id_declined: |
|
| 1828 | + case EEH_Template::pretty_status(EEM_Registration::status_id_declined, false, 'sentence'): |
|
| 1829 | + $this->decline_registration($notify); |
|
| 1830 | + break; |
|
| 1831 | + case EEM_Registration::status_id_cancelled: |
|
| 1832 | + case EEH_Template::pretty_status(EEM_Registration::status_id_cancelled, false, 'sentence'): |
|
| 1833 | + $this->cancel_registration($notify); |
|
| 1834 | + break; |
|
| 1835 | + case EEM_Registration::status_id_wait_list: |
|
| 1836 | + case EEH_Template::pretty_status(EEM_Registration::status_id_wait_list, false, 'sentence'): |
|
| 1837 | + $this->wait_list_registration($notify); |
|
| 1838 | + break; |
|
| 1839 | + case EEM_Registration::status_id_incomplete: |
|
| 1840 | + default: |
|
| 1841 | + $result['success'] = false; |
|
| 1842 | + unset($this->_req_data['return']); |
|
| 1843 | + $this->_reg_status_change_return('', false); |
|
| 1844 | + break; |
|
| 1845 | + } |
|
| 1846 | + } |
|
| 1847 | + |
|
| 1848 | + |
|
| 1849 | + /** |
|
| 1850 | + * Callback for bulk action routes. |
|
| 1851 | + * Note: although we could just register the singular route callbacks for each bulk action route as well, this |
|
| 1852 | + * method was chosen so there is one central place all the registration status bulk actions are going through. |
|
| 1853 | + * Potentially, this provides an easier place to locate logic that is specific to these bulk actions (as opposed to |
|
| 1854 | + * when an action is happening on just a single registration). |
|
| 1855 | + * |
|
| 1856 | + * @param $action |
|
| 1857 | + * @param bool $notify |
|
| 1858 | + */ |
|
| 1859 | + protected function bulk_action_on_registrations($action, $notify = false) |
|
| 1860 | + { |
|
| 1861 | + do_action( |
|
| 1862 | + 'AHEE__Registrations_Admin_Page__bulk_action_on_registrations__before_execution', |
|
| 1863 | + $this, |
|
| 1864 | + $action, |
|
| 1865 | + $notify |
|
| 1866 | + ); |
|
| 1867 | + $method = $action . '_registration'; |
|
| 1868 | + if (method_exists($this, $method)) { |
|
| 1869 | + $this->$method($notify); |
|
| 1870 | + } |
|
| 1871 | + } |
|
| 1872 | + |
|
| 1873 | + |
|
| 1874 | + /** |
|
| 1875 | + * approve_registration |
|
| 1876 | + * |
|
| 1877 | + * @access protected |
|
| 1878 | + * @param bool $notify whether or not to notify the registrant about their approval. |
|
| 1879 | + * @return void |
|
| 1880 | + * @throws EE_Error |
|
| 1881 | + * @throws EntityNotFoundException |
|
| 1882 | + * @throws InvalidArgumentException |
|
| 1883 | + * @throws InvalidDataTypeException |
|
| 1884 | + * @throws InvalidInterfaceException |
|
| 1885 | + * @throws ReflectionException |
|
| 1886 | + * @throws RuntimeException |
|
| 1887 | + * @throws DomainException |
|
| 1888 | + */ |
|
| 1889 | + protected function approve_registration($notify = false) |
|
| 1890 | + { |
|
| 1891 | + $this->_reg_status_change_return(EEM_Registration::status_id_approved, $notify); |
|
| 1892 | + } |
|
| 1893 | + |
|
| 1894 | + |
|
| 1895 | + /** |
|
| 1896 | + * decline_registration |
|
| 1897 | + * |
|
| 1898 | + * @access protected |
|
| 1899 | + * @param bool $notify whether or not to notify the registrant about their status change. |
|
| 1900 | + * @return void |
|
| 1901 | + * @throws EE_Error |
|
| 1902 | + * @throws EntityNotFoundException |
|
| 1903 | + * @throws InvalidArgumentException |
|
| 1904 | + * @throws InvalidDataTypeException |
|
| 1905 | + * @throws InvalidInterfaceException |
|
| 1906 | + * @throws ReflectionException |
|
| 1907 | + * @throws RuntimeException |
|
| 1908 | + * @throws DomainException |
|
| 1909 | + */ |
|
| 1910 | + protected function decline_registration($notify = false) |
|
| 1911 | + { |
|
| 1912 | + $this->_reg_status_change_return(EEM_Registration::status_id_declined, $notify); |
|
| 1913 | + } |
|
| 1914 | + |
|
| 1915 | + |
|
| 1916 | + /** |
|
| 1917 | + * cancel_registration |
|
| 1918 | + * |
|
| 1919 | + * @access protected |
|
| 1920 | + * @param bool $notify whether or not to notify the registrant about their status change. |
|
| 1921 | + * @return void |
|
| 1922 | + * @throws EE_Error |
|
| 1923 | + * @throws EntityNotFoundException |
|
| 1924 | + * @throws InvalidArgumentException |
|
| 1925 | + * @throws InvalidDataTypeException |
|
| 1926 | + * @throws InvalidInterfaceException |
|
| 1927 | + * @throws ReflectionException |
|
| 1928 | + * @throws RuntimeException |
|
| 1929 | + * @throws DomainException |
|
| 1930 | + */ |
|
| 1931 | + protected function cancel_registration($notify = false) |
|
| 1932 | + { |
|
| 1933 | + $this->_reg_status_change_return(EEM_Registration::status_id_cancelled, $notify); |
|
| 1934 | + } |
|
| 1935 | + |
|
| 1936 | + |
|
| 1937 | + /** |
|
| 1938 | + * not_approve_registration |
|
| 1939 | + * |
|
| 1940 | + * @access protected |
|
| 1941 | + * @param bool $notify whether or not to notify the registrant about their status change. |
|
| 1942 | + * @return void |
|
| 1943 | + * @throws EE_Error |
|
| 1944 | + * @throws EntityNotFoundException |
|
| 1945 | + * @throws InvalidArgumentException |
|
| 1946 | + * @throws InvalidDataTypeException |
|
| 1947 | + * @throws InvalidInterfaceException |
|
| 1948 | + * @throws ReflectionException |
|
| 1949 | + * @throws RuntimeException |
|
| 1950 | + * @throws DomainException |
|
| 1951 | + */ |
|
| 1952 | + protected function not_approve_registration($notify = false) |
|
| 1953 | + { |
|
| 1954 | + $this->_reg_status_change_return(EEM_Registration::status_id_not_approved, $notify); |
|
| 1955 | + } |
|
| 1956 | + |
|
| 1957 | + |
|
| 1958 | + /** |
|
| 1959 | + * decline_registration |
|
| 1960 | + * |
|
| 1961 | + * @access protected |
|
| 1962 | + * @param bool $notify whether or not to notify the registrant about their status change. |
|
| 1963 | + * @return void |
|
| 1964 | + * @throws EE_Error |
|
| 1965 | + * @throws EntityNotFoundException |
|
| 1966 | + * @throws InvalidArgumentException |
|
| 1967 | + * @throws InvalidDataTypeException |
|
| 1968 | + * @throws InvalidInterfaceException |
|
| 1969 | + * @throws ReflectionException |
|
| 1970 | + * @throws RuntimeException |
|
| 1971 | + * @throws DomainException |
|
| 1972 | + */ |
|
| 1973 | + protected function pending_registration($notify = false) |
|
| 1974 | + { |
|
| 1975 | + $this->_reg_status_change_return(EEM_Registration::status_id_pending_payment, $notify); |
|
| 1976 | + } |
|
| 1977 | + |
|
| 1978 | + |
|
| 1979 | + /** |
|
| 1980 | + * waitlist_registration |
|
| 1981 | + * |
|
| 1982 | + * @access protected |
|
| 1983 | + * @param bool $notify whether or not to notify the registrant about their status change. |
|
| 1984 | + * @return void |
|
| 1985 | + * @throws EE_Error |
|
| 1986 | + * @throws EntityNotFoundException |
|
| 1987 | + * @throws InvalidArgumentException |
|
| 1988 | + * @throws InvalidDataTypeException |
|
| 1989 | + * @throws InvalidInterfaceException |
|
| 1990 | + * @throws ReflectionException |
|
| 1991 | + * @throws RuntimeException |
|
| 1992 | + * @throws DomainException |
|
| 1993 | + */ |
|
| 1994 | + protected function wait_list_registration($notify = false) |
|
| 1995 | + { |
|
| 1996 | + $this->_reg_status_change_return(EEM_Registration::status_id_wait_list, $notify); |
|
| 1997 | + } |
|
| 1998 | + |
|
| 1999 | + |
|
| 2000 | + /** |
|
| 2001 | + * generates HTML for the Registration main meta box |
|
| 2002 | + * |
|
| 2003 | + * @access public |
|
| 2004 | + * @return void |
|
| 2005 | + * @throws DomainException |
|
| 2006 | + * @throws EE_Error |
|
| 2007 | + * @throws InvalidArgumentException |
|
| 2008 | + * @throws InvalidDataTypeException |
|
| 2009 | + * @throws InvalidInterfaceException |
|
| 2010 | + * @throws ReflectionException |
|
| 2011 | + * @throws EntityNotFoundException |
|
| 2012 | + */ |
|
| 2013 | + public function _reg_details_meta_box() |
|
| 2014 | + { |
|
| 2015 | + EEH_Autoloader::register_line_item_display_autoloaders(); |
|
| 2016 | + EEH_Autoloader::register_line_item_filter_autoloaders(); |
|
| 2017 | + EE_Registry::instance()->load_helper('Line_Item'); |
|
| 2018 | + $transaction = $this->_registration->transaction() ? $this->_registration->transaction() |
|
| 2019 | + : EE_Transaction::new_instance(); |
|
| 2020 | + $this->_session = $transaction->session_data(); |
|
| 2021 | + $filters = new EE_Line_Item_Filter_Collection(); |
|
| 2022 | + $filters->add(new EE_Single_Registration_Line_Item_Filter($this->_registration)); |
|
| 2023 | + $filters->add(new EE_Non_Zero_Line_Item_Filter()); |
|
| 2024 | + $line_item_filter_processor = new EE_Line_Item_Filter_Processor( |
|
| 2025 | + $filters, |
|
| 2026 | + $transaction->total_line_item() |
|
| 2027 | + ); |
|
| 2028 | + $filtered_line_item_tree = $line_item_filter_processor->process(); |
|
| 2029 | + $line_item_display = new EE_Line_Item_Display( |
|
| 2030 | + 'reg_admin_table', |
|
| 2031 | + 'EE_Admin_Table_Registration_Line_Item_Display_Strategy' |
|
| 2032 | + ); |
|
| 2033 | + $this->_template_args['line_item_table'] = $line_item_display->display_line_item( |
|
| 2034 | + $filtered_line_item_tree, |
|
| 2035 | + array('EE_Registration' => $this->_registration) |
|
| 2036 | + ); |
|
| 2037 | + $attendee = $this->_registration->attendee(); |
|
| 2038 | + if (EE_Registry::instance()->CAP->current_user_can( |
|
| 2039 | + 'ee_read_transaction', |
|
| 2040 | + 'espresso_transactions_view_transaction' |
|
| 2041 | + )) { |
|
| 2042 | + $this->_template_args['view_transaction_button'] = EEH_Template::get_button_or_link( |
|
| 2043 | + EE_Admin_Page::add_query_args_and_nonce( |
|
| 2044 | + array( |
|
| 2045 | + 'action' => 'view_transaction', |
|
| 2046 | + 'TXN_ID' => $transaction->ID(), |
|
| 2047 | + ), |
|
| 2048 | + TXN_ADMIN_URL |
|
| 2049 | + ), |
|
| 2050 | + esc_html__(' View Transaction', 'event_espresso'), |
|
| 2051 | + 'button secondary-button right', |
|
| 2052 | + 'dashicons dashicons-cart' |
|
| 2053 | + ); |
|
| 2054 | + } else { |
|
| 2055 | + $this->_template_args['view_transaction_button'] = ''; |
|
| 2056 | + } |
|
| 2057 | + if ($attendee instanceof EE_Attendee |
|
| 2058 | + && EE_Registry::instance()->CAP->current_user_can( |
|
| 2059 | + 'ee_send_message', |
|
| 2060 | + 'espresso_registrations_resend_registration' |
|
| 2061 | + ) |
|
| 2062 | + ) { |
|
| 2063 | + $this->_template_args['resend_registration_button'] = EEH_Template::get_button_or_link( |
|
| 2064 | + EE_Admin_Page::add_query_args_and_nonce( |
|
| 2065 | + array( |
|
| 2066 | + 'action' => 'resend_registration', |
|
| 2067 | + '_REG_ID' => $this->_registration->ID(), |
|
| 2068 | + 'redirect_to' => 'view_registration', |
|
| 2069 | + ), |
|
| 2070 | + REG_ADMIN_URL |
|
| 2071 | + ), |
|
| 2072 | + esc_html__(' Resend Registration', 'event_espresso'), |
|
| 2073 | + 'button secondary-button right', |
|
| 2074 | + 'dashicons dashicons-email-alt' |
|
| 2075 | + ); |
|
| 2076 | + } else { |
|
| 2077 | + $this->_template_args['resend_registration_button'] = ''; |
|
| 2078 | + } |
|
| 2079 | + $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign; |
|
| 2080 | + $payment = $transaction->get_first_related('Payment'); |
|
| 2081 | + $payment = ! $payment instanceof EE_Payment |
|
| 2082 | + ? EE_Payment::new_instance() |
|
| 2083 | + : $payment; |
|
| 2084 | + $payment_method = $payment->get_first_related('Payment_Method'); |
|
| 2085 | + $payment_method = ! $payment_method instanceof EE_Payment_Method |
|
| 2086 | + ? EE_Payment_Method::new_instance() |
|
| 2087 | + : $payment_method; |
|
| 2088 | + $reg_details = array( |
|
| 2089 | + 'payment_method' => $payment_method->name(), |
|
| 2090 | + 'response_msg' => $payment->gateway_response(), |
|
| 2091 | + 'registration_id' => $this->_registration->get('REG_code'), |
|
| 2092 | + 'registration_session' => $this->_registration->session_ID(), |
|
| 2093 | + 'ip_address' => isset($this->_session['ip_address']) ? $this->_session['ip_address'] : '', |
|
| 2094 | + 'user_agent' => isset($this->_session['user_agent']) ? $this->_session['user_agent'] : '', |
|
| 2095 | + ); |
|
| 2096 | + if (isset($reg_details['registration_id'])) { |
|
| 2097 | + $this->_template_args['reg_details']['registration_id']['value'] = $reg_details['registration_id']; |
|
| 2098 | + $this->_template_args['reg_details']['registration_id']['label'] = esc_html__( |
|
| 2099 | + 'Registration ID', |
|
| 2100 | + 'event_espresso' |
|
| 2101 | + ); |
|
| 2102 | + $this->_template_args['reg_details']['registration_id']['class'] = 'regular-text'; |
|
| 2103 | + } |
|
| 2104 | + if (isset($reg_details['payment_method'])) { |
|
| 2105 | + $this->_template_args['reg_details']['payment_method']['value'] = $reg_details['payment_method']; |
|
| 2106 | + $this->_template_args['reg_details']['payment_method']['label'] = esc_html__( |
|
| 2107 | + 'Most Recent Payment Method', |
|
| 2108 | + 'event_espresso' |
|
| 2109 | + ); |
|
| 2110 | + $this->_template_args['reg_details']['payment_method']['class'] = 'regular-text'; |
|
| 2111 | + $this->_template_args['reg_details']['response_msg']['value'] = $reg_details['response_msg']; |
|
| 2112 | + $this->_template_args['reg_details']['response_msg']['label'] = esc_html__( |
|
| 2113 | + 'Payment method response', |
|
| 2114 | + 'event_espresso' |
|
| 2115 | + ); |
|
| 2116 | + $this->_template_args['reg_details']['response_msg']['class'] = 'regular-text'; |
|
| 2117 | + } |
|
| 2118 | + $this->_template_args['reg_details']['registration_session']['value'] = $reg_details['registration_session']; |
|
| 2119 | + $this->_template_args['reg_details']['registration_session']['label'] = esc_html__( |
|
| 2120 | + 'Registration Session', |
|
| 2121 | + 'event_espresso' |
|
| 2122 | + ); |
|
| 2123 | + $this->_template_args['reg_details']['registration_session']['class'] = 'regular-text'; |
|
| 2124 | + $this->_template_args['reg_details']['ip_address']['value'] = $reg_details['ip_address']; |
|
| 2125 | + $this->_template_args['reg_details']['ip_address']['label'] = esc_html__( |
|
| 2126 | + 'Registration placed from IP', |
|
| 2127 | + 'event_espresso' |
|
| 2128 | + ); |
|
| 2129 | + $this->_template_args['reg_details']['ip_address']['class'] = 'regular-text'; |
|
| 2130 | + $this->_template_args['reg_details']['user_agent']['value'] = $reg_details['user_agent']; |
|
| 2131 | + $this->_template_args['reg_details']['user_agent']['label'] = esc_html__( |
|
| 2132 | + 'Registrant User Agent', |
|
| 2133 | + 'event_espresso' |
|
| 2134 | + ); |
|
| 2135 | + $this->_template_args['reg_details']['user_agent']['class'] = 'large-text'; |
|
| 2136 | + $this->_template_args['event_link'] = EE_Admin_Page::add_query_args_and_nonce( |
|
| 2137 | + array( |
|
| 2138 | + 'action' => 'default', |
|
| 2139 | + 'event_id' => $this->_registration->event_ID(), |
|
| 2140 | + ), |
|
| 2141 | + REG_ADMIN_URL |
|
| 2142 | + ); |
|
| 2143 | + $this->_template_args['REG_ID'] = $this->_registration->ID(); |
|
| 2144 | + $this->_template_args['event_id'] = $this->_registration->event_ID(); |
|
| 2145 | + $template_path = |
|
| 2146 | + REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php'; |
|
| 2147 | + echo EEH_Template::display_template($template_path, $this->_template_args, true); |
|
| 2148 | + } |
|
| 2149 | + |
|
| 2150 | + |
|
| 2151 | + /** |
|
| 2152 | + * generates HTML for the Registration Questions meta box. |
|
| 2153 | + * If pre-4.8.32.rc.000 hooks are used, uses old methods (with its filters), |
|
| 2154 | + * otherwise uses new forms system |
|
| 2155 | + * |
|
| 2156 | + * @access public |
|
| 2157 | + * @return void |
|
| 2158 | + * @throws DomainException |
|
| 2159 | + * @throws EE_Error |
|
| 2160 | + * @throws InvalidArgumentException |
|
| 2161 | + * @throws InvalidDataTypeException |
|
| 2162 | + * @throws InvalidInterfaceException |
|
| 2163 | + * @throws ReflectionException |
|
| 2164 | + */ |
|
| 2165 | + public function _reg_questions_meta_box() |
|
| 2166 | + { |
|
| 2167 | + // allow someone to override this method entirely |
|
| 2168 | + if (apply_filters( |
|
| 2169 | + 'FHEE__Registrations_Admin_Page___reg_questions_meta_box__do_default', |
|
| 2170 | + true, |
|
| 2171 | + $this, |
|
| 2172 | + $this->_registration |
|
| 2173 | + )) { |
|
| 2174 | + $form = $this->_get_reg_custom_questions_form( |
|
| 2175 | + $this->_registration->ID() |
|
| 2176 | + ); |
|
| 2177 | + $this->_template_args['att_questions'] = count($form->subforms()) > 0 |
|
| 2178 | + ? $form->get_html_and_js() |
|
| 2179 | + : ''; |
|
| 2180 | + $this->_template_args['reg_questions_form_action'] = 'edit_registration'; |
|
| 2181 | + $this->_template_args['REG_ID'] = $this->_registration->ID(); |
|
| 2182 | + $template_path = |
|
| 2183 | + REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php'; |
|
| 2184 | + echo EEH_Template::display_template($template_path, $this->_template_args, true); |
|
| 2185 | + } |
|
| 2186 | + } |
|
| 2187 | + |
|
| 2188 | + |
|
| 2189 | + /** |
|
| 2190 | + * form_before_question_group |
|
| 2191 | + * |
|
| 2192 | + * @deprecated as of 4.8.32.rc.000 |
|
| 2193 | + * @access public |
|
| 2194 | + * @param string $output |
|
| 2195 | + * @return string |
|
| 2196 | + */ |
|
| 2197 | + public function form_before_question_group($output) |
|
| 2198 | + { |
|
| 2199 | + EE_Error::doing_it_wrong( |
|
| 2200 | + __CLASS__ . '::' . __FUNCTION__, |
|
| 2201 | + esc_html__( |
|
| 2202 | + 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
|
| 2203 | + 'event_espresso' |
|
| 2204 | + ), |
|
| 2205 | + '4.8.32.rc.000' |
|
| 2206 | + ); |
|
| 2207 | + return ' |
|
| 2208 | 2208 | <table class="form-table ee-width-100"> |
| 2209 | 2209 | <tbody> |
| 2210 | 2210 | '; |
| 2211 | - } |
|
| 2212 | - |
|
| 2213 | - |
|
| 2214 | - /** |
|
| 2215 | - * form_after_question_group |
|
| 2216 | - * |
|
| 2217 | - * @deprecated as of 4.8.32.rc.000 |
|
| 2218 | - * @access public |
|
| 2219 | - * @param string $output |
|
| 2220 | - * @return string |
|
| 2221 | - */ |
|
| 2222 | - public function form_after_question_group($output) |
|
| 2223 | - { |
|
| 2224 | - EE_Error::doing_it_wrong( |
|
| 2225 | - __CLASS__ . '::' . __FUNCTION__, |
|
| 2226 | - esc_html__( |
|
| 2227 | - 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
|
| 2228 | - 'event_espresso' |
|
| 2229 | - ), |
|
| 2230 | - '4.8.32.rc.000' |
|
| 2231 | - ); |
|
| 2232 | - return ' |
|
| 2211 | + } |
|
| 2212 | + |
|
| 2213 | + |
|
| 2214 | + /** |
|
| 2215 | + * form_after_question_group |
|
| 2216 | + * |
|
| 2217 | + * @deprecated as of 4.8.32.rc.000 |
|
| 2218 | + * @access public |
|
| 2219 | + * @param string $output |
|
| 2220 | + * @return string |
|
| 2221 | + */ |
|
| 2222 | + public function form_after_question_group($output) |
|
| 2223 | + { |
|
| 2224 | + EE_Error::doing_it_wrong( |
|
| 2225 | + __CLASS__ . '::' . __FUNCTION__, |
|
| 2226 | + esc_html__( |
|
| 2227 | + 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
|
| 2228 | + 'event_espresso' |
|
| 2229 | + ), |
|
| 2230 | + '4.8.32.rc.000' |
|
| 2231 | + ); |
|
| 2232 | + return ' |
|
| 2233 | 2233 | <tr class="hide-if-no-js"> |
| 2234 | 2234 | <th> </th> |
| 2235 | 2235 | <td class="reg-admin-edit-attendee-question-td"> |
| 2236 | 2236 | <a class="reg-admin-edit-attendee-question-lnk" href="#" title="' |
| 2237 | - . esc_attr__('click to edit question', 'event_espresso') |
|
| 2238 | - . '"> |
|
| 2237 | + . esc_attr__('click to edit question', 'event_espresso') |
|
| 2238 | + . '"> |
|
| 2239 | 2239 | <span class="reg-admin-edit-question-group-spn lt-grey-txt">' |
| 2240 | - . esc_html__('edit the above question group', 'event_espresso') |
|
| 2241 | - . '</span> |
|
| 2240 | + . esc_html__('edit the above question group', 'event_espresso') |
|
| 2241 | + . '</span> |
|
| 2242 | 2242 | <div class="dashicons dashicons-edit"></div> |
| 2243 | 2243 | </a> |
| 2244 | 2244 | </td> |
@@ -2246,627 +2246,627 @@ discard block |
||
| 2246 | 2246 | </tbody> |
| 2247 | 2247 | </table> |
| 2248 | 2248 | '; |
| 2249 | - } |
|
| 2250 | - |
|
| 2251 | - |
|
| 2252 | - /** |
|
| 2253 | - * form_form_field_label_wrap |
|
| 2254 | - * |
|
| 2255 | - * @deprecated as of 4.8.32.rc.000 |
|
| 2256 | - * @access public |
|
| 2257 | - * @param string $label |
|
| 2258 | - * @return string |
|
| 2259 | - */ |
|
| 2260 | - public function form_form_field_label_wrap($label) |
|
| 2261 | - { |
|
| 2262 | - EE_Error::doing_it_wrong( |
|
| 2263 | - __CLASS__ . '::' . __FUNCTION__, |
|
| 2264 | - esc_html__( |
|
| 2265 | - 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
|
| 2266 | - 'event_espresso' |
|
| 2267 | - ), |
|
| 2268 | - '4.8.32.rc.000' |
|
| 2269 | - ); |
|
| 2270 | - return ' |
|
| 2249 | + } |
|
| 2250 | + |
|
| 2251 | + |
|
| 2252 | + /** |
|
| 2253 | + * form_form_field_label_wrap |
|
| 2254 | + * |
|
| 2255 | + * @deprecated as of 4.8.32.rc.000 |
|
| 2256 | + * @access public |
|
| 2257 | + * @param string $label |
|
| 2258 | + * @return string |
|
| 2259 | + */ |
|
| 2260 | + public function form_form_field_label_wrap($label) |
|
| 2261 | + { |
|
| 2262 | + EE_Error::doing_it_wrong( |
|
| 2263 | + __CLASS__ . '::' . __FUNCTION__, |
|
| 2264 | + esc_html__( |
|
| 2265 | + 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
|
| 2266 | + 'event_espresso' |
|
| 2267 | + ), |
|
| 2268 | + '4.8.32.rc.000' |
|
| 2269 | + ); |
|
| 2270 | + return ' |
|
| 2271 | 2271 | <tr> |
| 2272 | 2272 | <th> |
| 2273 | 2273 | ' . $label . ' |
| 2274 | 2274 | </th>'; |
| 2275 | - } |
|
| 2276 | - |
|
| 2277 | - |
|
| 2278 | - /** |
|
| 2279 | - * form_form_field_input__wrap |
|
| 2280 | - * |
|
| 2281 | - * @deprecated as of 4.8.32.rc.000 |
|
| 2282 | - * @access public |
|
| 2283 | - * @param string $input |
|
| 2284 | - * @return string |
|
| 2285 | - */ |
|
| 2286 | - public function form_form_field_input__wrap($input) |
|
| 2287 | - { |
|
| 2288 | - EE_Error::doing_it_wrong( |
|
| 2289 | - __CLASS__ . '::' . __FUNCTION__, |
|
| 2290 | - esc_html__( |
|
| 2291 | - 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
|
| 2292 | - 'event_espresso' |
|
| 2293 | - ), |
|
| 2294 | - '4.8.32.rc.000' |
|
| 2295 | - ); |
|
| 2296 | - return ' |
|
| 2275 | + } |
|
| 2276 | + |
|
| 2277 | + |
|
| 2278 | + /** |
|
| 2279 | + * form_form_field_input__wrap |
|
| 2280 | + * |
|
| 2281 | + * @deprecated as of 4.8.32.rc.000 |
|
| 2282 | + * @access public |
|
| 2283 | + * @param string $input |
|
| 2284 | + * @return string |
|
| 2285 | + */ |
|
| 2286 | + public function form_form_field_input__wrap($input) |
|
| 2287 | + { |
|
| 2288 | + EE_Error::doing_it_wrong( |
|
| 2289 | + __CLASS__ . '::' . __FUNCTION__, |
|
| 2290 | + esc_html__( |
|
| 2291 | + 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
|
| 2292 | + 'event_espresso' |
|
| 2293 | + ), |
|
| 2294 | + '4.8.32.rc.000' |
|
| 2295 | + ); |
|
| 2296 | + return ' |
|
| 2297 | 2297 | <td class="reg-admin-attendee-questions-input-td disabled-input"> |
| 2298 | 2298 | ' . $input . ' |
| 2299 | 2299 | </td> |
| 2300 | 2300 | </tr>'; |
| 2301 | - } |
|
| 2302 | - |
|
| 2303 | - |
|
| 2304 | - /** |
|
| 2305 | - * Updates the registration's custom questions according to the form info, if the form is submitted. |
|
| 2306 | - * If it's not a post, the "view_registrations" route will be called next on the SAME request |
|
| 2307 | - * to display the page |
|
| 2308 | - * |
|
| 2309 | - * @access protected |
|
| 2310 | - * @return void |
|
| 2311 | - * @throws EE_Error |
|
| 2312 | - * @throws InvalidArgumentException |
|
| 2313 | - * @throws InvalidDataTypeException |
|
| 2314 | - * @throws InvalidInterfaceException |
|
| 2315 | - * @throws ReflectionException |
|
| 2316 | - */ |
|
| 2317 | - protected function _update_attendee_registration_form() |
|
| 2318 | - { |
|
| 2319 | - do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this); |
|
| 2320 | - if ($_SERVER['REQUEST_METHOD'] === 'POST') { |
|
| 2321 | - $REG_ID = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false; |
|
| 2322 | - $success = $this->_save_reg_custom_questions_form($REG_ID); |
|
| 2323 | - if ($success) { |
|
| 2324 | - $what = esc_html__('Registration Form', 'event_espresso'); |
|
| 2325 | - $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID) |
|
| 2326 | - : array('action' => 'default'); |
|
| 2327 | - $this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route); |
|
| 2328 | - } |
|
| 2329 | - } |
|
| 2330 | - } |
|
| 2331 | - |
|
| 2332 | - |
|
| 2333 | - /** |
|
| 2334 | - * Gets the form for saving registrations custom questions (if done |
|
| 2335 | - * previously retrieves the cached form object, which may have validation errors in it) |
|
| 2336 | - * |
|
| 2337 | - * @param int $REG_ID |
|
| 2338 | - * @return EE_Registration_Custom_Questions_Form |
|
| 2339 | - * @throws EE_Error |
|
| 2340 | - * @throws InvalidArgumentException |
|
| 2341 | - * @throws InvalidDataTypeException |
|
| 2342 | - * @throws InvalidInterfaceException |
|
| 2343 | - */ |
|
| 2344 | - protected function _get_reg_custom_questions_form($REG_ID) |
|
| 2345 | - { |
|
| 2346 | - if (! $this->_reg_custom_questions_form) { |
|
| 2347 | - require_once(REG_ADMIN . 'form_sections/EE_Registration_Custom_Questions_Form.form.php'); |
|
| 2348 | - $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form( |
|
| 2349 | - $this->getRegistrationModel()->get_one_by_ID($REG_ID) |
|
| 2350 | - ); |
|
| 2351 | - $this->_reg_custom_questions_form->_construct_finalize(null, null); |
|
| 2352 | - } |
|
| 2353 | - return $this->_reg_custom_questions_form; |
|
| 2354 | - } |
|
| 2355 | - |
|
| 2356 | - |
|
| 2357 | - /** |
|
| 2358 | - * Saves |
|
| 2359 | - * |
|
| 2360 | - * @access private |
|
| 2361 | - * @param bool $REG_ID |
|
| 2362 | - * @return bool |
|
| 2363 | - * @throws EE_Error |
|
| 2364 | - * @throws InvalidArgumentException |
|
| 2365 | - * @throws InvalidDataTypeException |
|
| 2366 | - * @throws InvalidInterfaceException |
|
| 2367 | - * @throws ReflectionException |
|
| 2368 | - */ |
|
| 2369 | - private function _save_reg_custom_questions_form($REG_ID = false) |
|
| 2370 | - { |
|
| 2371 | - if (! $REG_ID) { |
|
| 2372 | - EE_Error::add_error( |
|
| 2373 | - esc_html__( |
|
| 2374 | - 'An error occurred. No registration ID was received.', |
|
| 2375 | - 'event_espresso' |
|
| 2376 | - ), |
|
| 2377 | - __FILE__, |
|
| 2378 | - __FUNCTION__, |
|
| 2379 | - __LINE__ |
|
| 2380 | - ); |
|
| 2381 | - } |
|
| 2382 | - $form = $this->_get_reg_custom_questions_form($REG_ID); |
|
| 2383 | - $form->receive_form_submission($this->_req_data); |
|
| 2384 | - $success = false; |
|
| 2385 | - if ($form->is_valid()) { |
|
| 2386 | - foreach ($form->subforms() as $question_group_id => $question_group_form) { |
|
| 2387 | - foreach ($question_group_form->inputs() as $question_id => $input) { |
|
| 2388 | - $where_conditions = array( |
|
| 2389 | - 'QST_ID' => $question_id, |
|
| 2390 | - 'REG_ID' => $REG_ID, |
|
| 2391 | - ); |
|
| 2392 | - $possibly_new_values = array( |
|
| 2393 | - 'ANS_value' => $input->normalized_value(), |
|
| 2394 | - ); |
|
| 2395 | - $answer = EEM_Answer::instance()->get_one(array($where_conditions)); |
|
| 2396 | - if ($answer instanceof EE_Answer) { |
|
| 2397 | - $success = $answer->save($possibly_new_values); |
|
| 2398 | - } else { |
|
| 2399 | - // insert it then |
|
| 2400 | - $cols_n_vals = array_merge($where_conditions, $possibly_new_values); |
|
| 2401 | - $answer = EE_Answer::new_instance($cols_n_vals); |
|
| 2402 | - $success = $answer->save(); |
|
| 2403 | - } |
|
| 2404 | - } |
|
| 2405 | - } |
|
| 2406 | - } else { |
|
| 2407 | - EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__); |
|
| 2408 | - } |
|
| 2409 | - return $success; |
|
| 2410 | - } |
|
| 2411 | - |
|
| 2412 | - |
|
| 2413 | - /** |
|
| 2414 | - * generates HTML for the Registration main meta box |
|
| 2415 | - * |
|
| 2416 | - * @access public |
|
| 2417 | - * @return void |
|
| 2418 | - * @throws DomainException |
|
| 2419 | - * @throws EE_Error |
|
| 2420 | - * @throws InvalidArgumentException |
|
| 2421 | - * @throws InvalidDataTypeException |
|
| 2422 | - * @throws InvalidInterfaceException |
|
| 2423 | - * @throws ReflectionException |
|
| 2424 | - */ |
|
| 2425 | - public function _reg_attendees_meta_box() |
|
| 2426 | - { |
|
| 2427 | - $REG = $this->getRegistrationModel(); |
|
| 2428 | - // get all other registrations on this transaction, and cache |
|
| 2429 | - // the attendees for them so we don't have to run another query using force_join |
|
| 2430 | - $registrations = $REG->get_all( |
|
| 2431 | - array( |
|
| 2432 | - array( |
|
| 2433 | - 'TXN_ID' => $this->_registration->transaction_ID(), |
|
| 2434 | - 'REG_ID' => array('!=', $this->_registration->ID()), |
|
| 2435 | - ), |
|
| 2436 | - 'force_join' => array('Attendee'), |
|
| 2437 | - 'default_where_conditions' => 'other_models_only', |
|
| 2438 | - ) |
|
| 2439 | - ); |
|
| 2440 | - $this->_template_args['attendees'] = array(); |
|
| 2441 | - $this->_template_args['attendee_notice'] = ''; |
|
| 2442 | - if (empty($registrations) |
|
| 2443 | - || (is_array($registrations) |
|
| 2444 | - && ! EEH_Array::get_one_item_from_array($registrations)) |
|
| 2445 | - ) { |
|
| 2446 | - EE_Error::add_error( |
|
| 2447 | - esc_html__( |
|
| 2448 | - 'There are no records attached to this registration. Something may have gone wrong with the registration', |
|
| 2449 | - 'event_espresso' |
|
| 2450 | - ), |
|
| 2451 | - __FILE__, |
|
| 2452 | - __FUNCTION__, |
|
| 2453 | - __LINE__ |
|
| 2454 | - ); |
|
| 2455 | - $this->_template_args['attendee_notice'] = EE_Error::get_notices(); |
|
| 2456 | - } else { |
|
| 2457 | - $att_nmbr = 1; |
|
| 2458 | - foreach ($registrations as $registration) { |
|
| 2459 | - /* @var $registration EE_Registration */ |
|
| 2460 | - $attendee = $registration->attendee() |
|
| 2461 | - ? $registration->attendee() |
|
| 2462 | - : $this->getAttendeeModel()->create_default_object(); |
|
| 2463 | - $this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID(); |
|
| 2464 | - $this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname(); |
|
| 2465 | - $this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname(); |
|
| 2466 | - $this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email(); |
|
| 2467 | - $this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price(); |
|
| 2468 | - $this->_template_args['attendees'][ $att_nmbr ]['address'] = implode( |
|
| 2469 | - ', ', |
|
| 2470 | - $attendee->full_address_as_array() |
|
| 2471 | - ); |
|
| 2472 | - $this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce( |
|
| 2473 | - array( |
|
| 2474 | - 'action' => 'edit_attendee', |
|
| 2475 | - 'post' => $attendee->ID(), |
|
| 2476 | - ), |
|
| 2477 | - REG_ADMIN_URL |
|
| 2478 | - ); |
|
| 2479 | - $this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event |
|
| 2480 | - ? $registration->event_obj()->name() |
|
| 2481 | - : ''; |
|
| 2482 | - $att_nmbr++; |
|
| 2483 | - } |
|
| 2484 | - $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign; |
|
| 2485 | - } |
|
| 2486 | - $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php'; |
|
| 2487 | - echo EEH_Template::display_template($template_path, $this->_template_args, true); |
|
| 2488 | - } |
|
| 2489 | - |
|
| 2490 | - |
|
| 2491 | - /** |
|
| 2492 | - * generates HTML for the Edit Registration side meta box |
|
| 2493 | - * |
|
| 2494 | - * @access public |
|
| 2495 | - * @return void |
|
| 2496 | - * @throws DomainException |
|
| 2497 | - * @throws EE_Error |
|
| 2498 | - * @throws InvalidArgumentException |
|
| 2499 | - * @throws InvalidDataTypeException |
|
| 2500 | - * @throws InvalidInterfaceException |
|
| 2501 | - * @throws ReflectionException |
|
| 2502 | - */ |
|
| 2503 | - public function _reg_registrant_side_meta_box() |
|
| 2504 | - { |
|
| 2505 | - /*@var $attendee EE_Attendee */ |
|
| 2506 | - $att_check = $this->_registration->attendee(); |
|
| 2507 | - $attendee = $att_check instanceof EE_Attendee |
|
| 2508 | - ? $att_check |
|
| 2509 | - : $this->getAttendeeModel()->create_default_object(); |
|
| 2510 | - // now let's determine if this is not the primary registration. If it isn't then we set the |
|
| 2511 | - // primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the |
|
| 2512 | - // primary registration object (that way we know if we need to show create button or not) |
|
| 2513 | - if (! $this->_registration->is_primary_registrant()) { |
|
| 2514 | - $primary_registration = $this->_registration->get_primary_registration(); |
|
| 2515 | - $primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee() |
|
| 2516 | - : null; |
|
| 2517 | - if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) { |
|
| 2518 | - // in here? This means the displayed registration is not the primary registrant but ALREADY HAS its own |
|
| 2519 | - // custom attendee object so let's not worry about the primary reg. |
|
| 2520 | - $primary_registration = null; |
|
| 2521 | - } |
|
| 2522 | - } else { |
|
| 2523 | - $primary_registration = null; |
|
| 2524 | - } |
|
| 2525 | - $this->_template_args['ATT_ID'] = $attendee->ID(); |
|
| 2526 | - $this->_template_args['fname'] = $attendee->fname(); |
|
| 2527 | - $this->_template_args['lname'] = $attendee->lname(); |
|
| 2528 | - $this->_template_args['email'] = $attendee->email(); |
|
| 2529 | - $this->_template_args['phone'] = $attendee->phone(); |
|
| 2530 | - $this->_template_args['formatted_address'] = EEH_Address::format($attendee); |
|
| 2531 | - // edit link |
|
| 2532 | - $this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce( |
|
| 2533 | - array( |
|
| 2534 | - 'action' => 'edit_attendee', |
|
| 2535 | - 'post' => $attendee->ID(), |
|
| 2536 | - ), |
|
| 2537 | - REG_ADMIN_URL |
|
| 2538 | - ); |
|
| 2539 | - $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso'); |
|
| 2540 | - // create link |
|
| 2541 | - $this->_template_args['create_link'] = $primary_registration instanceof EE_Registration |
|
| 2542 | - ? EE_Admin_Page::add_query_args_and_nonce( |
|
| 2543 | - array( |
|
| 2544 | - 'action' => 'duplicate_attendee', |
|
| 2545 | - '_REG_ID' => $this->_registration->ID(), |
|
| 2546 | - ), |
|
| 2547 | - REG_ADMIN_URL |
|
| 2548 | - ) : ''; |
|
| 2549 | - $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso'); |
|
| 2550 | - $this->_template_args['att_check'] = $att_check; |
|
| 2551 | - $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php'; |
|
| 2552 | - echo EEH_Template::display_template($template_path, $this->_template_args, true); |
|
| 2553 | - } |
|
| 2554 | - |
|
| 2555 | - |
|
| 2556 | - /** |
|
| 2557 | - * trash or restore registrations |
|
| 2558 | - * |
|
| 2559 | - * @param boolean $trash whether to archive or restore |
|
| 2560 | - * @return void |
|
| 2561 | - * @throws EE_Error |
|
| 2562 | - * @throws InvalidArgumentException |
|
| 2563 | - * @throws InvalidDataTypeException |
|
| 2564 | - * @throws InvalidInterfaceException |
|
| 2565 | - * @throws RuntimeException |
|
| 2566 | - * @access protected |
|
| 2567 | - */ |
|
| 2568 | - protected function _trash_or_restore_registrations($trash = true) |
|
| 2569 | - { |
|
| 2570 | - // if empty _REG_ID then get out because there's nothing to do |
|
| 2571 | - if (empty($this->_req_data['_REG_ID'])) { |
|
| 2572 | - EE_Error::add_error( |
|
| 2573 | - sprintf( |
|
| 2574 | - esc_html__( |
|
| 2575 | - 'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.', |
|
| 2576 | - 'event_espresso' |
|
| 2577 | - ), |
|
| 2578 | - $trash ? 'trash' : 'restore' |
|
| 2579 | - ), |
|
| 2580 | - __FILE__, |
|
| 2581 | - __LINE__, |
|
| 2582 | - __FUNCTION__ |
|
| 2583 | - ); |
|
| 2584 | - $this->_redirect_after_action(false, '', '', array(), true); |
|
| 2585 | - } |
|
| 2586 | - $success = 0; |
|
| 2587 | - $overwrite_msgs = false; |
|
| 2588 | - // Checkboxes |
|
| 2589 | - if (! is_array($this->_req_data['_REG_ID'])) { |
|
| 2590 | - $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']); |
|
| 2591 | - } |
|
| 2592 | - $reg_count = count($this->_req_data['_REG_ID']); |
|
| 2593 | - // cycle thru checkboxes |
|
| 2594 | - foreach ($this->_req_data['_REG_ID'] as $REG_ID) { |
|
| 2595 | - /** @var EE_Registration $REG */ |
|
| 2596 | - $REG = $this->getRegistrationModel()->get_one_by_ID($REG_ID); |
|
| 2597 | - $payments = $REG->registration_payments(); |
|
| 2598 | - if (! empty($payments)) { |
|
| 2599 | - $name = $REG->attendee() instanceof EE_Attendee |
|
| 2600 | - ? $REG->attendee()->full_name() |
|
| 2601 | - : esc_html__('Unknown Attendee', 'event_espresso'); |
|
| 2602 | - $overwrite_msgs = true; |
|
| 2603 | - EE_Error::add_error( |
|
| 2604 | - sprintf( |
|
| 2605 | - esc_html__( |
|
| 2606 | - '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.', |
|
| 2607 | - 'event_espresso' |
|
| 2608 | - ), |
|
| 2609 | - $name |
|
| 2610 | - ), |
|
| 2611 | - __FILE__, |
|
| 2612 | - __FUNCTION__, |
|
| 2613 | - __LINE__ |
|
| 2614 | - ); |
|
| 2615 | - // can't trash this registration because it has payments. |
|
| 2616 | - continue; |
|
| 2617 | - } |
|
| 2618 | - $updated = $trash ? $REG->delete() : $REG->restore(); |
|
| 2619 | - if ($updated) { |
|
| 2620 | - $success++; |
|
| 2621 | - } |
|
| 2622 | - } |
|
| 2623 | - $this->_redirect_after_action( |
|
| 2624 | - $success === $reg_count, // were ALL registrations affected? |
|
| 2625 | - $success > 1 |
|
| 2626 | - ? esc_html__('Registrations', 'event_espresso') |
|
| 2627 | - : esc_html__('Registration', 'event_espresso'), |
|
| 2628 | - $trash |
|
| 2629 | - ? esc_html__('moved to the trash', 'event_espresso') |
|
| 2630 | - : esc_html__('restored', 'event_espresso'), |
|
| 2631 | - $this->mergeExistingRequestParamsWithRedirectArgs(array('action' => 'default')), |
|
| 2632 | - $overwrite_msgs |
|
| 2633 | - ); |
|
| 2634 | - } |
|
| 2635 | - |
|
| 2636 | - |
|
| 2637 | - /** |
|
| 2638 | - * This is used to permanently delete registrations. Note, this will handle not only deleting permanently the |
|
| 2639 | - * registration but also. |
|
| 2640 | - * 1. Removing relations to EE_Attendee |
|
| 2641 | - * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are |
|
| 2642 | - * ALSO trashed. |
|
| 2643 | - * 3. Deleting permanently any related Line items but only if the above conditions are met. |
|
| 2644 | - * 4. Removing relationships between all tickets and the related registrations |
|
| 2645 | - * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.) |
|
| 2646 | - * 6. Deleting permanently any related Checkins. |
|
| 2647 | - * |
|
| 2648 | - * @return void |
|
| 2649 | - * @throws EE_Error |
|
| 2650 | - * @throws InvalidArgumentException |
|
| 2651 | - * @throws InvalidDataTypeException |
|
| 2652 | - * @throws InvalidInterfaceException |
|
| 2653 | - * @throws ReflectionException |
|
| 2654 | - */ |
|
| 2655 | - protected function _delete_registrations() |
|
| 2656 | - { |
|
| 2657 | - $REG_MDL = $this->getRegistrationModel(); |
|
| 2658 | - $success = 1; |
|
| 2659 | - // Checkboxes |
|
| 2660 | - if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) { |
|
| 2661 | - // if array has more than one element than success message should be plural |
|
| 2662 | - $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1; |
|
| 2663 | - // cycle thru checkboxes |
|
| 2664 | - foreach ($this->_req_data['_REG_ID'] as $REG_ID) { |
|
| 2665 | - $REG = $REG_MDL->get_one_by_ID($REG_ID); |
|
| 2666 | - if (! $REG instanceof EE_Registration) { |
|
| 2667 | - continue; |
|
| 2668 | - } |
|
| 2669 | - $deleted = $this->_delete_registration($REG); |
|
| 2670 | - if (! $deleted) { |
|
| 2671 | - $success = 0; |
|
| 2672 | - } |
|
| 2673 | - } |
|
| 2674 | - } else { |
|
| 2675 | - // grab single id and delete |
|
| 2676 | - $REG_ID = $this->_req_data['_REG_ID']; |
|
| 2677 | - /** @var EE_Registration $REG */ |
|
| 2678 | - $REG = $REG_MDL->get_one_by_ID($REG_ID); |
|
| 2679 | - $deleted = $this->_delete_registration($REG); |
|
| 2680 | - if (! $deleted) { |
|
| 2681 | - $success = 0; |
|
| 2682 | - } |
|
| 2683 | - } |
|
| 2684 | - $what = $success > 1 |
|
| 2685 | - ? esc_html__('Registrations', 'event_espresso') |
|
| 2686 | - : esc_html__('Registration', 'event_espresso'); |
|
| 2687 | - $action_desc = esc_html__('permanently deleted.', 'event_espresso'); |
|
| 2688 | - $this->_redirect_after_action( |
|
| 2689 | - $success, |
|
| 2690 | - $what, |
|
| 2691 | - $action_desc, |
|
| 2692 | - $this->mergeExistingRequestParamsWithRedirectArgs(['action' => 'default']), |
|
| 2693 | - true |
|
| 2694 | - ); |
|
| 2695 | - } |
|
| 2696 | - |
|
| 2697 | - |
|
| 2698 | - /** |
|
| 2699 | - * handles the permanent deletion of a registration. See comments with _delete_registrations() for details on what |
|
| 2700 | - * models get affected. |
|
| 2701 | - * |
|
| 2702 | - * @param EE_Registration $REG registration to be deleted permanently |
|
| 2703 | - * @return bool true = successful deletion, false = fail. |
|
| 2704 | - * @throws EE_Error |
|
| 2705 | - * @throws InvalidArgumentException |
|
| 2706 | - * @throws InvalidDataTypeException |
|
| 2707 | - * @throws InvalidInterfaceException |
|
| 2708 | - * @throws ReflectionException |
|
| 2709 | - */ |
|
| 2710 | - protected function _delete_registration(EE_Registration $REG) |
|
| 2711 | - { |
|
| 2712 | - // first we start with the transaction... ultimately, we WILL not delete permanently if there are any related |
|
| 2713 | - // registrations on the transaction that are NOT trashed. |
|
| 2714 | - $TXN = $REG->get_first_related('Transaction'); |
|
| 2715 | - $REGS = $TXN->get_many_related('Registration'); |
|
| 2716 | - $all_trashed = true; |
|
| 2717 | - foreach ($REGS as $registration) { |
|
| 2718 | - if (! $registration->get('REG_deleted')) { |
|
| 2719 | - $all_trashed = false; |
|
| 2720 | - } |
|
| 2721 | - } |
|
| 2722 | - if (! $all_trashed) { |
|
| 2723 | - EE_Error::add_error( |
|
| 2724 | - esc_html__( |
|
| 2725 | - '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.', |
|
| 2726 | - 'event_espresso' |
|
| 2727 | - ), |
|
| 2728 | - __FILE__, |
|
| 2729 | - __FUNCTION__, |
|
| 2730 | - __LINE__ |
|
| 2731 | - ); |
|
| 2732 | - return false; |
|
| 2733 | - } |
|
| 2734 | - // k made it here so that means we can delete all the related transactions and their answers (but let's do them |
|
| 2735 | - // separately from THIS one). |
|
| 2736 | - foreach ($REGS as $registration) { |
|
| 2737 | - // delete related answers |
|
| 2738 | - $registration->delete_related_permanently('Answer'); |
|
| 2739 | - // remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact) |
|
| 2740 | - $attendee = $registration->get_first_related('Attendee'); |
|
| 2741 | - if ($attendee instanceof EE_Attendee) { |
|
| 2742 | - $registration->_remove_relation_to($attendee, 'Attendee'); |
|
| 2743 | - } |
|
| 2744 | - // now remove relationships to tickets on this registration. |
|
| 2745 | - $registration->_remove_relations('Ticket'); |
|
| 2746 | - // now delete permanently the checkins related to this registration. |
|
| 2747 | - $registration->delete_related_permanently('Checkin'); |
|
| 2748 | - if ($registration->ID() === $REG->ID()) { |
|
| 2749 | - continue; |
|
| 2750 | - } //we don't want to delete permanently the existing registration just yet. |
|
| 2751 | - // remove relation to transaction for these registrations if NOT the existing registrations |
|
| 2752 | - $registration->_remove_relations('Transaction'); |
|
| 2753 | - // delete permanently any related messages. |
|
| 2754 | - $registration->delete_related_permanently('Message'); |
|
| 2755 | - // now delete this registration permanently |
|
| 2756 | - $registration->delete_permanently(); |
|
| 2757 | - } |
|
| 2758 | - // now all related registrations on the transaction are handled. So let's just handle this registration itself |
|
| 2759 | - // (the transaction and line items should be all that's left). |
|
| 2760 | - // delete the line items related to the transaction for this registration. |
|
| 2761 | - $TXN->delete_related_permanently('Line_Item'); |
|
| 2762 | - // we need to remove all the relationships on the transaction |
|
| 2763 | - $TXN->delete_related_permanently('Payment'); |
|
| 2764 | - $TXN->delete_related_permanently('Extra_Meta'); |
|
| 2765 | - $TXN->delete_related_permanently('Message'); |
|
| 2766 | - // now we can delete this REG permanently (and the transaction of course) |
|
| 2767 | - $REG->delete_related_permanently('Transaction'); |
|
| 2768 | - return $REG->delete_permanently(); |
|
| 2769 | - } |
|
| 2770 | - |
|
| 2771 | - |
|
| 2772 | - /** |
|
| 2773 | - * generates HTML for the Register New Attendee Admin page |
|
| 2774 | - * |
|
| 2775 | - * @access private |
|
| 2776 | - * @throws DomainException |
|
| 2777 | - * @throws EE_Error |
|
| 2778 | - * @throws InvalidArgumentException |
|
| 2779 | - * @throws InvalidDataTypeException |
|
| 2780 | - * @throws InvalidInterfaceException |
|
| 2781 | - * @throws ReflectionException |
|
| 2782 | - */ |
|
| 2783 | - public function new_registration() |
|
| 2784 | - { |
|
| 2785 | - if (! $this->_set_reg_event()) { |
|
| 2786 | - throw new EE_Error( |
|
| 2787 | - esc_html__( |
|
| 2788 | - 'Unable to continue with registering because there is no Event ID in the request', |
|
| 2789 | - 'event_espresso' |
|
| 2790 | - ) |
|
| 2791 | - ); |
|
| 2792 | - } |
|
| 2793 | - EE_Registry::instance()->REQ->set_espresso_page(true); |
|
| 2794 | - // gotta start with a clean slate if we're not coming here via ajax |
|
| 2795 | - if (! defined('DOING_AJAX') |
|
| 2796 | - && (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error'])) |
|
| 2797 | - ) { |
|
| 2798 | - EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
|
| 2799 | - } |
|
| 2800 | - $this->_template_args['event_name'] = ''; |
|
| 2801 | - // event name |
|
| 2802 | - if ($this->_reg_event) { |
|
| 2803 | - $this->_template_args['event_name'] = $this->_reg_event->name(); |
|
| 2804 | - $edit_event_url = self::add_query_args_and_nonce( |
|
| 2805 | - array( |
|
| 2806 | - 'action' => 'edit', |
|
| 2807 | - 'post' => $this->_reg_event->ID(), |
|
| 2808 | - ), |
|
| 2809 | - EVENTS_ADMIN_URL |
|
| 2810 | - ); |
|
| 2811 | - $edit_event_lnk = '<a href="' |
|
| 2812 | - . $edit_event_url |
|
| 2813 | - . '" title="' |
|
| 2814 | - . esc_attr__('Edit ', 'event_espresso') |
|
| 2815 | - . $this->_reg_event->name() |
|
| 2816 | - . '">' |
|
| 2817 | - . esc_html__('Edit Event', 'event_espresso') |
|
| 2818 | - . '</a>'; |
|
| 2819 | - $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">' |
|
| 2820 | - . $edit_event_lnk |
|
| 2821 | - . '</span>'; |
|
| 2822 | - } |
|
| 2823 | - $this->_template_args['step_content'] = $this->_get_registration_step_content(); |
|
| 2824 | - if (defined('DOING_AJAX')) { |
|
| 2825 | - $this->_return_json(); |
|
| 2826 | - } |
|
| 2827 | - // grab header |
|
| 2828 | - $template_path = |
|
| 2829 | - REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php'; |
|
| 2830 | - $this->_template_args['admin_page_content'] = EEH_Template::display_template( |
|
| 2831 | - $template_path, |
|
| 2832 | - $this->_template_args, |
|
| 2833 | - true |
|
| 2834 | - ); |
|
| 2835 | - // $this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE ); |
|
| 2836 | - // the details template wrapper |
|
| 2837 | - $this->display_admin_page_with_sidebar(); |
|
| 2838 | - } |
|
| 2839 | - |
|
| 2840 | - |
|
| 2841 | - /** |
|
| 2842 | - * This returns the content for a registration step |
|
| 2843 | - * |
|
| 2844 | - * @access protected |
|
| 2845 | - * @return string html |
|
| 2846 | - * @throws DomainException |
|
| 2847 | - * @throws EE_Error |
|
| 2848 | - * @throws InvalidArgumentException |
|
| 2849 | - * @throws InvalidDataTypeException |
|
| 2850 | - * @throws InvalidInterfaceException |
|
| 2851 | - */ |
|
| 2852 | - protected function _get_registration_step_content() |
|
| 2853 | - { |
|
| 2854 | - if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) { |
|
| 2855 | - $warning_msg = sprintf( |
|
| 2856 | - esc_html__( |
|
| 2857 | - '%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', |
|
| 2858 | - 'event_espresso' |
|
| 2859 | - ), |
|
| 2860 | - '<br />', |
|
| 2861 | - '<h3 class="important-notice">', |
|
| 2862 | - '</h3>', |
|
| 2863 | - '<div class="float-right">', |
|
| 2864 | - '<span id="redirect_timer" class="important-notice">30</span>', |
|
| 2865 | - '</div>', |
|
| 2866 | - '<b>', |
|
| 2867 | - '</b>' |
|
| 2868 | - ); |
|
| 2869 | - return ' |
|
| 2301 | + } |
|
| 2302 | + |
|
| 2303 | + |
|
| 2304 | + /** |
|
| 2305 | + * Updates the registration's custom questions according to the form info, if the form is submitted. |
|
| 2306 | + * If it's not a post, the "view_registrations" route will be called next on the SAME request |
|
| 2307 | + * to display the page |
|
| 2308 | + * |
|
| 2309 | + * @access protected |
|
| 2310 | + * @return void |
|
| 2311 | + * @throws EE_Error |
|
| 2312 | + * @throws InvalidArgumentException |
|
| 2313 | + * @throws InvalidDataTypeException |
|
| 2314 | + * @throws InvalidInterfaceException |
|
| 2315 | + * @throws ReflectionException |
|
| 2316 | + */ |
|
| 2317 | + protected function _update_attendee_registration_form() |
|
| 2318 | + { |
|
| 2319 | + do_action('AHEE__Registrations_Admin_Page___update_attendee_registration_form__start', $this); |
|
| 2320 | + if ($_SERVER['REQUEST_METHOD'] === 'POST') { |
|
| 2321 | + $REG_ID = isset($this->_req_data['_REG_ID']) ? absint($this->_req_data['_REG_ID']) : false; |
|
| 2322 | + $success = $this->_save_reg_custom_questions_form($REG_ID); |
|
| 2323 | + if ($success) { |
|
| 2324 | + $what = esc_html__('Registration Form', 'event_espresso'); |
|
| 2325 | + $route = $REG_ID ? array('action' => 'view_registration', '_REG_ID' => $REG_ID) |
|
| 2326 | + : array('action' => 'default'); |
|
| 2327 | + $this->_redirect_after_action($success, $what, esc_html__('updated', 'event_espresso'), $route); |
|
| 2328 | + } |
|
| 2329 | + } |
|
| 2330 | + } |
|
| 2331 | + |
|
| 2332 | + |
|
| 2333 | + /** |
|
| 2334 | + * Gets the form for saving registrations custom questions (if done |
|
| 2335 | + * previously retrieves the cached form object, which may have validation errors in it) |
|
| 2336 | + * |
|
| 2337 | + * @param int $REG_ID |
|
| 2338 | + * @return EE_Registration_Custom_Questions_Form |
|
| 2339 | + * @throws EE_Error |
|
| 2340 | + * @throws InvalidArgumentException |
|
| 2341 | + * @throws InvalidDataTypeException |
|
| 2342 | + * @throws InvalidInterfaceException |
|
| 2343 | + */ |
|
| 2344 | + protected function _get_reg_custom_questions_form($REG_ID) |
|
| 2345 | + { |
|
| 2346 | + if (! $this->_reg_custom_questions_form) { |
|
| 2347 | + require_once(REG_ADMIN . 'form_sections/EE_Registration_Custom_Questions_Form.form.php'); |
|
| 2348 | + $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form( |
|
| 2349 | + $this->getRegistrationModel()->get_one_by_ID($REG_ID) |
|
| 2350 | + ); |
|
| 2351 | + $this->_reg_custom_questions_form->_construct_finalize(null, null); |
|
| 2352 | + } |
|
| 2353 | + return $this->_reg_custom_questions_form; |
|
| 2354 | + } |
|
| 2355 | + |
|
| 2356 | + |
|
| 2357 | + /** |
|
| 2358 | + * Saves |
|
| 2359 | + * |
|
| 2360 | + * @access private |
|
| 2361 | + * @param bool $REG_ID |
|
| 2362 | + * @return bool |
|
| 2363 | + * @throws EE_Error |
|
| 2364 | + * @throws InvalidArgumentException |
|
| 2365 | + * @throws InvalidDataTypeException |
|
| 2366 | + * @throws InvalidInterfaceException |
|
| 2367 | + * @throws ReflectionException |
|
| 2368 | + */ |
|
| 2369 | + private function _save_reg_custom_questions_form($REG_ID = false) |
|
| 2370 | + { |
|
| 2371 | + if (! $REG_ID) { |
|
| 2372 | + EE_Error::add_error( |
|
| 2373 | + esc_html__( |
|
| 2374 | + 'An error occurred. No registration ID was received.', |
|
| 2375 | + 'event_espresso' |
|
| 2376 | + ), |
|
| 2377 | + __FILE__, |
|
| 2378 | + __FUNCTION__, |
|
| 2379 | + __LINE__ |
|
| 2380 | + ); |
|
| 2381 | + } |
|
| 2382 | + $form = $this->_get_reg_custom_questions_form($REG_ID); |
|
| 2383 | + $form->receive_form_submission($this->_req_data); |
|
| 2384 | + $success = false; |
|
| 2385 | + if ($form->is_valid()) { |
|
| 2386 | + foreach ($form->subforms() as $question_group_id => $question_group_form) { |
|
| 2387 | + foreach ($question_group_form->inputs() as $question_id => $input) { |
|
| 2388 | + $where_conditions = array( |
|
| 2389 | + 'QST_ID' => $question_id, |
|
| 2390 | + 'REG_ID' => $REG_ID, |
|
| 2391 | + ); |
|
| 2392 | + $possibly_new_values = array( |
|
| 2393 | + 'ANS_value' => $input->normalized_value(), |
|
| 2394 | + ); |
|
| 2395 | + $answer = EEM_Answer::instance()->get_one(array($where_conditions)); |
|
| 2396 | + if ($answer instanceof EE_Answer) { |
|
| 2397 | + $success = $answer->save($possibly_new_values); |
|
| 2398 | + } else { |
|
| 2399 | + // insert it then |
|
| 2400 | + $cols_n_vals = array_merge($where_conditions, $possibly_new_values); |
|
| 2401 | + $answer = EE_Answer::new_instance($cols_n_vals); |
|
| 2402 | + $success = $answer->save(); |
|
| 2403 | + } |
|
| 2404 | + } |
|
| 2405 | + } |
|
| 2406 | + } else { |
|
| 2407 | + EE_Error::add_error($form->get_validation_error_string(), __FILE__, __FUNCTION__, __LINE__); |
|
| 2408 | + } |
|
| 2409 | + return $success; |
|
| 2410 | + } |
|
| 2411 | + |
|
| 2412 | + |
|
| 2413 | + /** |
|
| 2414 | + * generates HTML for the Registration main meta box |
|
| 2415 | + * |
|
| 2416 | + * @access public |
|
| 2417 | + * @return void |
|
| 2418 | + * @throws DomainException |
|
| 2419 | + * @throws EE_Error |
|
| 2420 | + * @throws InvalidArgumentException |
|
| 2421 | + * @throws InvalidDataTypeException |
|
| 2422 | + * @throws InvalidInterfaceException |
|
| 2423 | + * @throws ReflectionException |
|
| 2424 | + */ |
|
| 2425 | + public function _reg_attendees_meta_box() |
|
| 2426 | + { |
|
| 2427 | + $REG = $this->getRegistrationModel(); |
|
| 2428 | + // get all other registrations on this transaction, and cache |
|
| 2429 | + // the attendees for them so we don't have to run another query using force_join |
|
| 2430 | + $registrations = $REG->get_all( |
|
| 2431 | + array( |
|
| 2432 | + array( |
|
| 2433 | + 'TXN_ID' => $this->_registration->transaction_ID(), |
|
| 2434 | + 'REG_ID' => array('!=', $this->_registration->ID()), |
|
| 2435 | + ), |
|
| 2436 | + 'force_join' => array('Attendee'), |
|
| 2437 | + 'default_where_conditions' => 'other_models_only', |
|
| 2438 | + ) |
|
| 2439 | + ); |
|
| 2440 | + $this->_template_args['attendees'] = array(); |
|
| 2441 | + $this->_template_args['attendee_notice'] = ''; |
|
| 2442 | + if (empty($registrations) |
|
| 2443 | + || (is_array($registrations) |
|
| 2444 | + && ! EEH_Array::get_one_item_from_array($registrations)) |
|
| 2445 | + ) { |
|
| 2446 | + EE_Error::add_error( |
|
| 2447 | + esc_html__( |
|
| 2448 | + 'There are no records attached to this registration. Something may have gone wrong with the registration', |
|
| 2449 | + 'event_espresso' |
|
| 2450 | + ), |
|
| 2451 | + __FILE__, |
|
| 2452 | + __FUNCTION__, |
|
| 2453 | + __LINE__ |
|
| 2454 | + ); |
|
| 2455 | + $this->_template_args['attendee_notice'] = EE_Error::get_notices(); |
|
| 2456 | + } else { |
|
| 2457 | + $att_nmbr = 1; |
|
| 2458 | + foreach ($registrations as $registration) { |
|
| 2459 | + /* @var $registration EE_Registration */ |
|
| 2460 | + $attendee = $registration->attendee() |
|
| 2461 | + ? $registration->attendee() |
|
| 2462 | + : $this->getAttendeeModel()->create_default_object(); |
|
| 2463 | + $this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID(); |
|
| 2464 | + $this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname(); |
|
| 2465 | + $this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname(); |
|
| 2466 | + $this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email(); |
|
| 2467 | + $this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price(); |
|
| 2468 | + $this->_template_args['attendees'][ $att_nmbr ]['address'] = implode( |
|
| 2469 | + ', ', |
|
| 2470 | + $attendee->full_address_as_array() |
|
| 2471 | + ); |
|
| 2472 | + $this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce( |
|
| 2473 | + array( |
|
| 2474 | + 'action' => 'edit_attendee', |
|
| 2475 | + 'post' => $attendee->ID(), |
|
| 2476 | + ), |
|
| 2477 | + REG_ADMIN_URL |
|
| 2478 | + ); |
|
| 2479 | + $this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event |
|
| 2480 | + ? $registration->event_obj()->name() |
|
| 2481 | + : ''; |
|
| 2482 | + $att_nmbr++; |
|
| 2483 | + } |
|
| 2484 | + $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign; |
|
| 2485 | + } |
|
| 2486 | + $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php'; |
|
| 2487 | + echo EEH_Template::display_template($template_path, $this->_template_args, true); |
|
| 2488 | + } |
|
| 2489 | + |
|
| 2490 | + |
|
| 2491 | + /** |
|
| 2492 | + * generates HTML for the Edit Registration side meta box |
|
| 2493 | + * |
|
| 2494 | + * @access public |
|
| 2495 | + * @return void |
|
| 2496 | + * @throws DomainException |
|
| 2497 | + * @throws EE_Error |
|
| 2498 | + * @throws InvalidArgumentException |
|
| 2499 | + * @throws InvalidDataTypeException |
|
| 2500 | + * @throws InvalidInterfaceException |
|
| 2501 | + * @throws ReflectionException |
|
| 2502 | + */ |
|
| 2503 | + public function _reg_registrant_side_meta_box() |
|
| 2504 | + { |
|
| 2505 | + /*@var $attendee EE_Attendee */ |
|
| 2506 | + $att_check = $this->_registration->attendee(); |
|
| 2507 | + $attendee = $att_check instanceof EE_Attendee |
|
| 2508 | + ? $att_check |
|
| 2509 | + : $this->getAttendeeModel()->create_default_object(); |
|
| 2510 | + // now let's determine if this is not the primary registration. If it isn't then we set the |
|
| 2511 | + // primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the |
|
| 2512 | + // primary registration object (that way we know if we need to show create button or not) |
|
| 2513 | + if (! $this->_registration->is_primary_registrant()) { |
|
| 2514 | + $primary_registration = $this->_registration->get_primary_registration(); |
|
| 2515 | + $primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee() |
|
| 2516 | + : null; |
|
| 2517 | + if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) { |
|
| 2518 | + // in here? This means the displayed registration is not the primary registrant but ALREADY HAS its own |
|
| 2519 | + // custom attendee object so let's not worry about the primary reg. |
|
| 2520 | + $primary_registration = null; |
|
| 2521 | + } |
|
| 2522 | + } else { |
|
| 2523 | + $primary_registration = null; |
|
| 2524 | + } |
|
| 2525 | + $this->_template_args['ATT_ID'] = $attendee->ID(); |
|
| 2526 | + $this->_template_args['fname'] = $attendee->fname(); |
|
| 2527 | + $this->_template_args['lname'] = $attendee->lname(); |
|
| 2528 | + $this->_template_args['email'] = $attendee->email(); |
|
| 2529 | + $this->_template_args['phone'] = $attendee->phone(); |
|
| 2530 | + $this->_template_args['formatted_address'] = EEH_Address::format($attendee); |
|
| 2531 | + // edit link |
|
| 2532 | + $this->_template_args['att_edit_link'] = EE_Admin_Page::add_query_args_and_nonce( |
|
| 2533 | + array( |
|
| 2534 | + 'action' => 'edit_attendee', |
|
| 2535 | + 'post' => $attendee->ID(), |
|
| 2536 | + ), |
|
| 2537 | + REG_ADMIN_URL |
|
| 2538 | + ); |
|
| 2539 | + $this->_template_args['att_edit_label'] = esc_html__('View/Edit Contact', 'event_espresso'); |
|
| 2540 | + // create link |
|
| 2541 | + $this->_template_args['create_link'] = $primary_registration instanceof EE_Registration |
|
| 2542 | + ? EE_Admin_Page::add_query_args_and_nonce( |
|
| 2543 | + array( |
|
| 2544 | + 'action' => 'duplicate_attendee', |
|
| 2545 | + '_REG_ID' => $this->_registration->ID(), |
|
| 2546 | + ), |
|
| 2547 | + REG_ADMIN_URL |
|
| 2548 | + ) : ''; |
|
| 2549 | + $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso'); |
|
| 2550 | + $this->_template_args['att_check'] = $att_check; |
|
| 2551 | + $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php'; |
|
| 2552 | + echo EEH_Template::display_template($template_path, $this->_template_args, true); |
|
| 2553 | + } |
|
| 2554 | + |
|
| 2555 | + |
|
| 2556 | + /** |
|
| 2557 | + * trash or restore registrations |
|
| 2558 | + * |
|
| 2559 | + * @param boolean $trash whether to archive or restore |
|
| 2560 | + * @return void |
|
| 2561 | + * @throws EE_Error |
|
| 2562 | + * @throws InvalidArgumentException |
|
| 2563 | + * @throws InvalidDataTypeException |
|
| 2564 | + * @throws InvalidInterfaceException |
|
| 2565 | + * @throws RuntimeException |
|
| 2566 | + * @access protected |
|
| 2567 | + */ |
|
| 2568 | + protected function _trash_or_restore_registrations($trash = true) |
|
| 2569 | + { |
|
| 2570 | + // if empty _REG_ID then get out because there's nothing to do |
|
| 2571 | + if (empty($this->_req_data['_REG_ID'])) { |
|
| 2572 | + EE_Error::add_error( |
|
| 2573 | + sprintf( |
|
| 2574 | + esc_html__( |
|
| 2575 | + 'In order to %1$s registrations you must select which ones you wish to %1$s by clicking the checkboxes.', |
|
| 2576 | + 'event_espresso' |
|
| 2577 | + ), |
|
| 2578 | + $trash ? 'trash' : 'restore' |
|
| 2579 | + ), |
|
| 2580 | + __FILE__, |
|
| 2581 | + __LINE__, |
|
| 2582 | + __FUNCTION__ |
|
| 2583 | + ); |
|
| 2584 | + $this->_redirect_after_action(false, '', '', array(), true); |
|
| 2585 | + } |
|
| 2586 | + $success = 0; |
|
| 2587 | + $overwrite_msgs = false; |
|
| 2588 | + // Checkboxes |
|
| 2589 | + if (! is_array($this->_req_data['_REG_ID'])) { |
|
| 2590 | + $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']); |
|
| 2591 | + } |
|
| 2592 | + $reg_count = count($this->_req_data['_REG_ID']); |
|
| 2593 | + // cycle thru checkboxes |
|
| 2594 | + foreach ($this->_req_data['_REG_ID'] as $REG_ID) { |
|
| 2595 | + /** @var EE_Registration $REG */ |
|
| 2596 | + $REG = $this->getRegistrationModel()->get_one_by_ID($REG_ID); |
|
| 2597 | + $payments = $REG->registration_payments(); |
|
| 2598 | + if (! empty($payments)) { |
|
| 2599 | + $name = $REG->attendee() instanceof EE_Attendee |
|
| 2600 | + ? $REG->attendee()->full_name() |
|
| 2601 | + : esc_html__('Unknown Attendee', 'event_espresso'); |
|
| 2602 | + $overwrite_msgs = true; |
|
| 2603 | + EE_Error::add_error( |
|
| 2604 | + sprintf( |
|
| 2605 | + esc_html__( |
|
| 2606 | + '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.', |
|
| 2607 | + 'event_espresso' |
|
| 2608 | + ), |
|
| 2609 | + $name |
|
| 2610 | + ), |
|
| 2611 | + __FILE__, |
|
| 2612 | + __FUNCTION__, |
|
| 2613 | + __LINE__ |
|
| 2614 | + ); |
|
| 2615 | + // can't trash this registration because it has payments. |
|
| 2616 | + continue; |
|
| 2617 | + } |
|
| 2618 | + $updated = $trash ? $REG->delete() : $REG->restore(); |
|
| 2619 | + if ($updated) { |
|
| 2620 | + $success++; |
|
| 2621 | + } |
|
| 2622 | + } |
|
| 2623 | + $this->_redirect_after_action( |
|
| 2624 | + $success === $reg_count, // were ALL registrations affected? |
|
| 2625 | + $success > 1 |
|
| 2626 | + ? esc_html__('Registrations', 'event_espresso') |
|
| 2627 | + : esc_html__('Registration', 'event_espresso'), |
|
| 2628 | + $trash |
|
| 2629 | + ? esc_html__('moved to the trash', 'event_espresso') |
|
| 2630 | + : esc_html__('restored', 'event_espresso'), |
|
| 2631 | + $this->mergeExistingRequestParamsWithRedirectArgs(array('action' => 'default')), |
|
| 2632 | + $overwrite_msgs |
|
| 2633 | + ); |
|
| 2634 | + } |
|
| 2635 | + |
|
| 2636 | + |
|
| 2637 | + /** |
|
| 2638 | + * This is used to permanently delete registrations. Note, this will handle not only deleting permanently the |
|
| 2639 | + * registration but also. |
|
| 2640 | + * 1. Removing relations to EE_Attendee |
|
| 2641 | + * 2. Deleting permanently the related transaction, but ONLY if all related registrations to the transaction are |
|
| 2642 | + * ALSO trashed. |
|
| 2643 | + * 3. Deleting permanently any related Line items but only if the above conditions are met. |
|
| 2644 | + * 4. Removing relationships between all tickets and the related registrations |
|
| 2645 | + * 5. Deleting permanently any related Answers (and the answers for other related registrations that were deleted.) |
|
| 2646 | + * 6. Deleting permanently any related Checkins. |
|
| 2647 | + * |
|
| 2648 | + * @return void |
|
| 2649 | + * @throws EE_Error |
|
| 2650 | + * @throws InvalidArgumentException |
|
| 2651 | + * @throws InvalidDataTypeException |
|
| 2652 | + * @throws InvalidInterfaceException |
|
| 2653 | + * @throws ReflectionException |
|
| 2654 | + */ |
|
| 2655 | + protected function _delete_registrations() |
|
| 2656 | + { |
|
| 2657 | + $REG_MDL = $this->getRegistrationModel(); |
|
| 2658 | + $success = 1; |
|
| 2659 | + // Checkboxes |
|
| 2660 | + if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) { |
|
| 2661 | + // if array has more than one element than success message should be plural |
|
| 2662 | + $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1; |
|
| 2663 | + // cycle thru checkboxes |
|
| 2664 | + foreach ($this->_req_data['_REG_ID'] as $REG_ID) { |
|
| 2665 | + $REG = $REG_MDL->get_one_by_ID($REG_ID); |
|
| 2666 | + if (! $REG instanceof EE_Registration) { |
|
| 2667 | + continue; |
|
| 2668 | + } |
|
| 2669 | + $deleted = $this->_delete_registration($REG); |
|
| 2670 | + if (! $deleted) { |
|
| 2671 | + $success = 0; |
|
| 2672 | + } |
|
| 2673 | + } |
|
| 2674 | + } else { |
|
| 2675 | + // grab single id and delete |
|
| 2676 | + $REG_ID = $this->_req_data['_REG_ID']; |
|
| 2677 | + /** @var EE_Registration $REG */ |
|
| 2678 | + $REG = $REG_MDL->get_one_by_ID($REG_ID); |
|
| 2679 | + $deleted = $this->_delete_registration($REG); |
|
| 2680 | + if (! $deleted) { |
|
| 2681 | + $success = 0; |
|
| 2682 | + } |
|
| 2683 | + } |
|
| 2684 | + $what = $success > 1 |
|
| 2685 | + ? esc_html__('Registrations', 'event_espresso') |
|
| 2686 | + : esc_html__('Registration', 'event_espresso'); |
|
| 2687 | + $action_desc = esc_html__('permanently deleted.', 'event_espresso'); |
|
| 2688 | + $this->_redirect_after_action( |
|
| 2689 | + $success, |
|
| 2690 | + $what, |
|
| 2691 | + $action_desc, |
|
| 2692 | + $this->mergeExistingRequestParamsWithRedirectArgs(['action' => 'default']), |
|
| 2693 | + true |
|
| 2694 | + ); |
|
| 2695 | + } |
|
| 2696 | + |
|
| 2697 | + |
|
| 2698 | + /** |
|
| 2699 | + * handles the permanent deletion of a registration. See comments with _delete_registrations() for details on what |
|
| 2700 | + * models get affected. |
|
| 2701 | + * |
|
| 2702 | + * @param EE_Registration $REG registration to be deleted permanently |
|
| 2703 | + * @return bool true = successful deletion, false = fail. |
|
| 2704 | + * @throws EE_Error |
|
| 2705 | + * @throws InvalidArgumentException |
|
| 2706 | + * @throws InvalidDataTypeException |
|
| 2707 | + * @throws InvalidInterfaceException |
|
| 2708 | + * @throws ReflectionException |
|
| 2709 | + */ |
|
| 2710 | + protected function _delete_registration(EE_Registration $REG) |
|
| 2711 | + { |
|
| 2712 | + // first we start with the transaction... ultimately, we WILL not delete permanently if there are any related |
|
| 2713 | + // registrations on the transaction that are NOT trashed. |
|
| 2714 | + $TXN = $REG->get_first_related('Transaction'); |
|
| 2715 | + $REGS = $TXN->get_many_related('Registration'); |
|
| 2716 | + $all_trashed = true; |
|
| 2717 | + foreach ($REGS as $registration) { |
|
| 2718 | + if (! $registration->get('REG_deleted')) { |
|
| 2719 | + $all_trashed = false; |
|
| 2720 | + } |
|
| 2721 | + } |
|
| 2722 | + if (! $all_trashed) { |
|
| 2723 | + EE_Error::add_error( |
|
| 2724 | + esc_html__( |
|
| 2725 | + '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.', |
|
| 2726 | + 'event_espresso' |
|
| 2727 | + ), |
|
| 2728 | + __FILE__, |
|
| 2729 | + __FUNCTION__, |
|
| 2730 | + __LINE__ |
|
| 2731 | + ); |
|
| 2732 | + return false; |
|
| 2733 | + } |
|
| 2734 | + // k made it here so that means we can delete all the related transactions and their answers (but let's do them |
|
| 2735 | + // separately from THIS one). |
|
| 2736 | + foreach ($REGS as $registration) { |
|
| 2737 | + // delete related answers |
|
| 2738 | + $registration->delete_related_permanently('Answer'); |
|
| 2739 | + // remove relationship to EE_Attendee (but we ALWAYS leave the contact record intact) |
|
| 2740 | + $attendee = $registration->get_first_related('Attendee'); |
|
| 2741 | + if ($attendee instanceof EE_Attendee) { |
|
| 2742 | + $registration->_remove_relation_to($attendee, 'Attendee'); |
|
| 2743 | + } |
|
| 2744 | + // now remove relationships to tickets on this registration. |
|
| 2745 | + $registration->_remove_relations('Ticket'); |
|
| 2746 | + // now delete permanently the checkins related to this registration. |
|
| 2747 | + $registration->delete_related_permanently('Checkin'); |
|
| 2748 | + if ($registration->ID() === $REG->ID()) { |
|
| 2749 | + continue; |
|
| 2750 | + } //we don't want to delete permanently the existing registration just yet. |
|
| 2751 | + // remove relation to transaction for these registrations if NOT the existing registrations |
|
| 2752 | + $registration->_remove_relations('Transaction'); |
|
| 2753 | + // delete permanently any related messages. |
|
| 2754 | + $registration->delete_related_permanently('Message'); |
|
| 2755 | + // now delete this registration permanently |
|
| 2756 | + $registration->delete_permanently(); |
|
| 2757 | + } |
|
| 2758 | + // now all related registrations on the transaction are handled. So let's just handle this registration itself |
|
| 2759 | + // (the transaction and line items should be all that's left). |
|
| 2760 | + // delete the line items related to the transaction for this registration. |
|
| 2761 | + $TXN->delete_related_permanently('Line_Item'); |
|
| 2762 | + // we need to remove all the relationships on the transaction |
|
| 2763 | + $TXN->delete_related_permanently('Payment'); |
|
| 2764 | + $TXN->delete_related_permanently('Extra_Meta'); |
|
| 2765 | + $TXN->delete_related_permanently('Message'); |
|
| 2766 | + // now we can delete this REG permanently (and the transaction of course) |
|
| 2767 | + $REG->delete_related_permanently('Transaction'); |
|
| 2768 | + return $REG->delete_permanently(); |
|
| 2769 | + } |
|
| 2770 | + |
|
| 2771 | + |
|
| 2772 | + /** |
|
| 2773 | + * generates HTML for the Register New Attendee Admin page |
|
| 2774 | + * |
|
| 2775 | + * @access private |
|
| 2776 | + * @throws DomainException |
|
| 2777 | + * @throws EE_Error |
|
| 2778 | + * @throws InvalidArgumentException |
|
| 2779 | + * @throws InvalidDataTypeException |
|
| 2780 | + * @throws InvalidInterfaceException |
|
| 2781 | + * @throws ReflectionException |
|
| 2782 | + */ |
|
| 2783 | + public function new_registration() |
|
| 2784 | + { |
|
| 2785 | + if (! $this->_set_reg_event()) { |
|
| 2786 | + throw new EE_Error( |
|
| 2787 | + esc_html__( |
|
| 2788 | + 'Unable to continue with registering because there is no Event ID in the request', |
|
| 2789 | + 'event_espresso' |
|
| 2790 | + ) |
|
| 2791 | + ); |
|
| 2792 | + } |
|
| 2793 | + EE_Registry::instance()->REQ->set_espresso_page(true); |
|
| 2794 | + // gotta start with a clean slate if we're not coming here via ajax |
|
| 2795 | + if (! defined('DOING_AJAX') |
|
| 2796 | + && (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error'])) |
|
| 2797 | + ) { |
|
| 2798 | + EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
|
| 2799 | + } |
|
| 2800 | + $this->_template_args['event_name'] = ''; |
|
| 2801 | + // event name |
|
| 2802 | + if ($this->_reg_event) { |
|
| 2803 | + $this->_template_args['event_name'] = $this->_reg_event->name(); |
|
| 2804 | + $edit_event_url = self::add_query_args_and_nonce( |
|
| 2805 | + array( |
|
| 2806 | + 'action' => 'edit', |
|
| 2807 | + 'post' => $this->_reg_event->ID(), |
|
| 2808 | + ), |
|
| 2809 | + EVENTS_ADMIN_URL |
|
| 2810 | + ); |
|
| 2811 | + $edit_event_lnk = '<a href="' |
|
| 2812 | + . $edit_event_url |
|
| 2813 | + . '" title="' |
|
| 2814 | + . esc_attr__('Edit ', 'event_espresso') |
|
| 2815 | + . $this->_reg_event->name() |
|
| 2816 | + . '">' |
|
| 2817 | + . esc_html__('Edit Event', 'event_espresso') |
|
| 2818 | + . '</a>'; |
|
| 2819 | + $this->_template_args['event_name'] .= ' <span class="admin-page-header-edit-lnk not-bold">' |
|
| 2820 | + . $edit_event_lnk |
|
| 2821 | + . '</span>'; |
|
| 2822 | + } |
|
| 2823 | + $this->_template_args['step_content'] = $this->_get_registration_step_content(); |
|
| 2824 | + if (defined('DOING_AJAX')) { |
|
| 2825 | + $this->_return_json(); |
|
| 2826 | + } |
|
| 2827 | + // grab header |
|
| 2828 | + $template_path = |
|
| 2829 | + REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php'; |
|
| 2830 | + $this->_template_args['admin_page_content'] = EEH_Template::display_template( |
|
| 2831 | + $template_path, |
|
| 2832 | + $this->_template_args, |
|
| 2833 | + true |
|
| 2834 | + ); |
|
| 2835 | + // $this->_set_publish_post_box_vars( NULL, FALSE, FALSE, NULL, FALSE ); |
|
| 2836 | + // the details template wrapper |
|
| 2837 | + $this->display_admin_page_with_sidebar(); |
|
| 2838 | + } |
|
| 2839 | + |
|
| 2840 | + |
|
| 2841 | + /** |
|
| 2842 | + * This returns the content for a registration step |
|
| 2843 | + * |
|
| 2844 | + * @access protected |
|
| 2845 | + * @return string html |
|
| 2846 | + * @throws DomainException |
|
| 2847 | + * @throws EE_Error |
|
| 2848 | + * @throws InvalidArgumentException |
|
| 2849 | + * @throws InvalidDataTypeException |
|
| 2850 | + * @throws InvalidInterfaceException |
|
| 2851 | + */ |
|
| 2852 | + protected function _get_registration_step_content() |
|
| 2853 | + { |
|
| 2854 | + if (isset($_COOKIE['ee_registration_added']) && $_COOKIE['ee_registration_added']) { |
|
| 2855 | + $warning_msg = sprintf( |
|
| 2856 | + esc_html__( |
|
| 2857 | + '%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', |
|
| 2858 | + 'event_espresso' |
|
| 2859 | + ), |
|
| 2860 | + '<br />', |
|
| 2861 | + '<h3 class="important-notice">', |
|
| 2862 | + '</h3>', |
|
| 2863 | + '<div class="float-right">', |
|
| 2864 | + '<span id="redirect_timer" class="important-notice">30</span>', |
|
| 2865 | + '</div>', |
|
| 2866 | + '<b>', |
|
| 2867 | + '</b>' |
|
| 2868 | + ); |
|
| 2869 | + return ' |
|
| 2870 | 2870 | <div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div> |
| 2871 | 2871 | <script > |
| 2872 | 2872 | // WHOAH !!! it appears that someone is using the back button from the Transaction admin page |
@@ -2879,868 +2879,868 @@ discard block |
||
| 2879 | 2879 | } |
| 2880 | 2880 | }, 800 ); |
| 2881 | 2881 | </script >'; |
| 2882 | - } |
|
| 2883 | - $template_args = array( |
|
| 2884 | - 'title' => '', |
|
| 2885 | - 'content' => '', |
|
| 2886 | - 'step_button_text' => '', |
|
| 2887 | - 'show_notification_toggle' => false, |
|
| 2888 | - ); |
|
| 2889 | - // to indicate we're processing a new registration |
|
| 2890 | - $hidden_fields = array( |
|
| 2891 | - 'processing_registration' => array( |
|
| 2892 | - 'type' => 'hidden', |
|
| 2893 | - 'value' => 0, |
|
| 2894 | - ), |
|
| 2895 | - 'event_id' => array( |
|
| 2896 | - 'type' => 'hidden', |
|
| 2897 | - 'value' => $this->_reg_event->ID(), |
|
| 2898 | - ), |
|
| 2899 | - ); |
|
| 2900 | - // if the cart is empty then we know we're at step one so we'll display ticket selector |
|
| 2901 | - $cart = EE_Registry::instance()->SSN->cart(); |
|
| 2902 | - $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions'; |
|
| 2903 | - switch ($step) { |
|
| 2904 | - case 'ticket': |
|
| 2905 | - $hidden_fields['processing_registration']['value'] = 1; |
|
| 2906 | - $template_args['title'] = esc_html__( |
|
| 2907 | - 'Step One: Select the Ticket for this registration', |
|
| 2908 | - 'event_espresso' |
|
| 2909 | - ); |
|
| 2910 | - $template_args['content'] = |
|
| 2911 | - EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event); |
|
| 2912 | - $template_args['content'] .= '</div>'; |
|
| 2913 | - $template_args['step_button_text'] = esc_html__( |
|
| 2914 | - 'Add Tickets and Continue to Registrant Details', |
|
| 2915 | - 'event_espresso' |
|
| 2916 | - ); |
|
| 2917 | - $template_args['show_notification_toggle'] = false; |
|
| 2918 | - break; |
|
| 2919 | - case 'questions': |
|
| 2920 | - $hidden_fields['processing_registration']['value'] = 2; |
|
| 2921 | - $template_args['title'] = esc_html__( |
|
| 2922 | - 'Step Two: Add Registrant Details for this Registration', |
|
| 2923 | - 'event_espresso' |
|
| 2924 | - ); |
|
| 2925 | - // in theory we should be able to run EED_SPCO at this point because the cart should have been setup |
|
| 2926 | - // properly by the first process_reg_step run. |
|
| 2927 | - $template_args['content'] = |
|
| 2928 | - EED_Single_Page_Checkout::registration_checkout_for_admin(); |
|
| 2929 | - $template_args['step_button_text'] = esc_html__( |
|
| 2930 | - 'Save Registration and Continue to Details', |
|
| 2931 | - 'event_espresso' |
|
| 2932 | - ); |
|
| 2933 | - $template_args['show_notification_toggle'] = true; |
|
| 2934 | - break; |
|
| 2935 | - } |
|
| 2936 | - // we come back to the process_registration_step route. |
|
| 2937 | - $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields); |
|
| 2938 | - return EEH_Template::display_template( |
|
| 2939 | - REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php', |
|
| 2940 | - $template_args, |
|
| 2941 | - true |
|
| 2942 | - ); |
|
| 2943 | - } |
|
| 2944 | - |
|
| 2945 | - |
|
| 2946 | - /** |
|
| 2947 | - * set_reg_event |
|
| 2948 | - * |
|
| 2949 | - * @access private |
|
| 2950 | - * @return bool |
|
| 2951 | - * @throws EE_Error |
|
| 2952 | - * @throws InvalidArgumentException |
|
| 2953 | - * @throws InvalidDataTypeException |
|
| 2954 | - * @throws InvalidInterfaceException |
|
| 2955 | - */ |
|
| 2956 | - private function _set_reg_event() |
|
| 2957 | - { |
|
| 2958 | - if (is_object($this->_reg_event)) { |
|
| 2959 | - return true; |
|
| 2960 | - } |
|
| 2961 | - $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false; |
|
| 2962 | - if (! $EVT_ID) { |
|
| 2963 | - return false; |
|
| 2964 | - } |
|
| 2965 | - $this->_reg_event = $this->getEventModel()->get_one_by_ID($EVT_ID); |
|
| 2966 | - return true; |
|
| 2967 | - } |
|
| 2968 | - |
|
| 2969 | - |
|
| 2970 | - /** |
|
| 2971 | - * process_reg_step |
|
| 2972 | - * |
|
| 2973 | - * @access public |
|
| 2974 | - * @return string |
|
| 2975 | - * @throws DomainException |
|
| 2976 | - * @throws EE_Error |
|
| 2977 | - * @throws InvalidArgumentException |
|
| 2978 | - * @throws InvalidDataTypeException |
|
| 2979 | - * @throws InvalidInterfaceException |
|
| 2980 | - * @throws ReflectionException |
|
| 2981 | - * @throws RuntimeException |
|
| 2982 | - */ |
|
| 2983 | - public function process_reg_step() |
|
| 2984 | - { |
|
| 2985 | - EE_System::do_not_cache(); |
|
| 2986 | - $this->_set_reg_event(); |
|
| 2987 | - EE_Registry::instance()->REQ->set_espresso_page(true); |
|
| 2988 | - EE_Registry::instance()->REQ->set('uts', time()); |
|
| 2989 | - // what step are we on? |
|
| 2990 | - $cart = EE_Registry::instance()->SSN->cart(); |
|
| 2991 | - $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions'; |
|
| 2992 | - // if doing ajax then we need to verify the nonce |
|
| 2993 | - if (defined('DOING_AJAX')) { |
|
| 2994 | - $nonce = isset($this->_req_data[ $this->_req_nonce ]) |
|
| 2995 | - ? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : ''; |
|
| 2996 | - $this->_verify_nonce($nonce, $this->_req_nonce); |
|
| 2997 | - } |
|
| 2998 | - switch ($step) { |
|
| 2999 | - case 'ticket': |
|
| 3000 | - // process ticket selection |
|
| 3001 | - $success = EED_Ticket_Selector::instance()->process_ticket_selections(); |
|
| 3002 | - if ($success) { |
|
| 3003 | - EE_Error::add_success( |
|
| 3004 | - esc_html__( |
|
| 3005 | - 'Tickets Selected. Now complete the registration.', |
|
| 3006 | - 'event_espresso' |
|
| 3007 | - ) |
|
| 3008 | - ); |
|
| 3009 | - } else { |
|
| 3010 | - $query_args['step_error'] = $this->_req_data['step_error'] = true; |
|
| 3011 | - } |
|
| 3012 | - if (defined('DOING_AJAX')) { |
|
| 3013 | - $this->new_registration(); // display next step |
|
| 3014 | - } else { |
|
| 3015 | - $query_args = array( |
|
| 3016 | - 'action' => 'new_registration', |
|
| 3017 | - 'processing_registration' => 1, |
|
| 3018 | - 'event_id' => $this->_reg_event->ID(), |
|
| 3019 | - 'uts' => time(), |
|
| 3020 | - ); |
|
| 3021 | - $this->_redirect_after_action( |
|
| 3022 | - false, |
|
| 3023 | - '', |
|
| 3024 | - '', |
|
| 3025 | - $query_args, |
|
| 3026 | - true |
|
| 3027 | - ); |
|
| 3028 | - } |
|
| 3029 | - break; |
|
| 3030 | - case 'questions': |
|
| 3031 | - if (! isset( |
|
| 3032 | - $this->_req_data['txn_reg_status_change'], |
|
| 3033 | - $this->_req_data['txn_reg_status_change']['send_notifications'] |
|
| 3034 | - ) |
|
| 3035 | - ) { |
|
| 3036 | - add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15); |
|
| 3037 | - } |
|
| 3038 | - // process registration |
|
| 3039 | - $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin(); |
|
| 3040 | - if ($cart instanceof EE_Cart) { |
|
| 3041 | - $grand_total = $cart->get_cart_grand_total(); |
|
| 3042 | - if ($grand_total instanceof EE_Line_Item) { |
|
| 3043 | - $grand_total->save_this_and_descendants_to_txn(); |
|
| 3044 | - } |
|
| 3045 | - } |
|
| 3046 | - if (! $transaction instanceof EE_Transaction) { |
|
| 3047 | - $query_args = array( |
|
| 3048 | - 'action' => 'new_registration', |
|
| 3049 | - 'processing_registration' => 2, |
|
| 3050 | - 'event_id' => $this->_reg_event->ID(), |
|
| 3051 | - 'uts' => time(), |
|
| 3052 | - ); |
|
| 3053 | - if (defined('DOING_AJAX')) { |
|
| 3054 | - // display registration form again because there are errors (maybe validation?) |
|
| 3055 | - $this->new_registration(); |
|
| 3056 | - return; |
|
| 3057 | - } |
|
| 3058 | - $this->_redirect_after_action( |
|
| 3059 | - false, |
|
| 3060 | - '', |
|
| 3061 | - '', |
|
| 3062 | - $query_args, |
|
| 3063 | - true |
|
| 3064 | - ); |
|
| 3065 | - return; |
|
| 3066 | - } |
|
| 3067 | - // maybe update status, and make sure to save transaction if not done already |
|
| 3068 | - if (! $transaction->update_status_based_on_total_paid()) { |
|
| 3069 | - $transaction->save(); |
|
| 3070 | - } |
|
| 3071 | - EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
|
| 3072 | - $this->_req_data = array(); |
|
| 3073 | - $query_args = array( |
|
| 3074 | - 'action' => 'redirect_to_txn', |
|
| 3075 | - 'TXN_ID' => $transaction->ID(), |
|
| 3076 | - 'EVT_ID' => $this->_reg_event->ID(), |
|
| 3077 | - 'event_name' => urlencode($this->_reg_event->name()), |
|
| 3078 | - 'redirect_from' => 'new_registration', |
|
| 3079 | - ); |
|
| 3080 | - $this->_redirect_after_action(false, '', '', $query_args, true); |
|
| 3081 | - break; |
|
| 3082 | - } |
|
| 3083 | - // what are you looking here for? Should be nothing to do at this point. |
|
| 3084 | - } |
|
| 3085 | - |
|
| 3086 | - |
|
| 3087 | - /** |
|
| 3088 | - * redirect_to_txn |
|
| 3089 | - * |
|
| 3090 | - * @access public |
|
| 3091 | - * @return void |
|
| 3092 | - * @throws EE_Error |
|
| 3093 | - * @throws InvalidArgumentException |
|
| 3094 | - * @throws InvalidDataTypeException |
|
| 3095 | - * @throws InvalidInterfaceException |
|
| 3096 | - * @throws ReflectionException |
|
| 3097 | - */ |
|
| 3098 | - public function redirect_to_txn() |
|
| 3099 | - { |
|
| 3100 | - EE_System::do_not_cache(); |
|
| 3101 | - EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
|
| 3102 | - $query_args = array( |
|
| 3103 | - 'action' => 'view_transaction', |
|
| 3104 | - 'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0, |
|
| 3105 | - 'page' => 'espresso_transactions', |
|
| 3106 | - ); |
|
| 3107 | - if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) { |
|
| 3108 | - $query_args['EVT_ID'] = $this->_req_data['EVT_ID']; |
|
| 3109 | - $query_args['event_name'] = urlencode($this->_req_data['event_name']); |
|
| 3110 | - $query_args['redirect_from'] = $this->_req_data['redirect_from']; |
|
| 3111 | - } |
|
| 3112 | - EE_Error::add_success( |
|
| 3113 | - esc_html__( |
|
| 3114 | - 'Registration Created. Please review the transaction and add any payments as necessary', |
|
| 3115 | - 'event_espresso' |
|
| 3116 | - ) |
|
| 3117 | - ); |
|
| 3118 | - $this->_redirect_after_action(false, '', '', $query_args, true); |
|
| 3119 | - } |
|
| 3120 | - |
|
| 3121 | - |
|
| 3122 | - /** |
|
| 3123 | - * generates HTML for the Attendee Contact List |
|
| 3124 | - * |
|
| 3125 | - * @access protected |
|
| 3126 | - * @return void |
|
| 3127 | - * @throws DomainException |
|
| 3128 | - * @throws EE_Error |
|
| 3129 | - */ |
|
| 3130 | - protected function _attendee_contact_list_table() |
|
| 3131 | - { |
|
| 3132 | - do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
| 3133 | - $this->_search_btn_label = esc_html__('Contacts', 'event_espresso'); |
|
| 3134 | - $this->display_admin_list_table_page_with_no_sidebar(); |
|
| 3135 | - } |
|
| 3136 | - |
|
| 3137 | - |
|
| 3138 | - /** |
|
| 3139 | - * get_attendees |
|
| 3140 | - * |
|
| 3141 | - * @param $per_page |
|
| 3142 | - * @param bool $count whether to return count or data. |
|
| 3143 | - * @param bool $trash |
|
| 3144 | - * @return array |
|
| 3145 | - * @throws EE_Error |
|
| 3146 | - * @throws InvalidArgumentException |
|
| 3147 | - * @throws InvalidDataTypeException |
|
| 3148 | - * @throws InvalidInterfaceException |
|
| 3149 | - * @access public |
|
| 3150 | - */ |
|
| 3151 | - public function get_attendees($per_page, $count = false, $trash = false) |
|
| 3152 | - { |
|
| 3153 | - do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
| 3154 | - require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php'); |
|
| 3155 | - $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : ''; |
|
| 3156 | - switch ($this->_req_data['orderby']) { |
|
| 3157 | - case 'ATT_ID': |
|
| 3158 | - $orderby = 'ATT_ID'; |
|
| 3159 | - break; |
|
| 3160 | - case 'ATT_fname': |
|
| 3161 | - $orderby = 'ATT_fname'; |
|
| 3162 | - break; |
|
| 3163 | - case 'ATT_email': |
|
| 3164 | - $orderby = 'ATT_email'; |
|
| 3165 | - break; |
|
| 3166 | - case 'ATT_city': |
|
| 3167 | - $orderby = 'ATT_city'; |
|
| 3168 | - break; |
|
| 3169 | - case 'STA_ID': |
|
| 3170 | - $orderby = 'STA_ID'; |
|
| 3171 | - break; |
|
| 3172 | - case 'CNT_ID': |
|
| 3173 | - $orderby = 'CNT_ID'; |
|
| 3174 | - break; |
|
| 3175 | - case 'Registration_Count': |
|
| 3176 | - $orderby = 'Registration_Count'; |
|
| 3177 | - break; |
|
| 3178 | - default: |
|
| 3179 | - $orderby = 'ATT_lname'; |
|
| 3180 | - } |
|
| 3181 | - $sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) |
|
| 3182 | - ? $this->_req_data['order'] |
|
| 3183 | - : 'ASC'; |
|
| 3184 | - $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged']) |
|
| 3185 | - ? $this->_req_data['paged'] |
|
| 3186 | - : 1; |
|
| 3187 | - $per_page = isset($per_page) && ! empty($per_page) ? $per_page : 10; |
|
| 3188 | - $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage']) |
|
| 3189 | - ? $this->_req_data['perpage'] |
|
| 3190 | - : $per_page; |
|
| 3191 | - $_where = array(); |
|
| 3192 | - if (! empty($this->_req_data['s'])) { |
|
| 3193 | - $sstr = '%' . $this->_req_data['s'] . '%'; |
|
| 3194 | - $_where['OR'] = array( |
|
| 3195 | - 'Registration.Event.EVT_name' => array('LIKE', $sstr), |
|
| 3196 | - 'Registration.Event.EVT_desc' => array('LIKE', $sstr), |
|
| 3197 | - 'Registration.Event.EVT_short_desc' => array('LIKE', $sstr), |
|
| 3198 | - 'ATT_fname' => array('LIKE', $sstr), |
|
| 3199 | - 'ATT_lname' => array('LIKE', $sstr), |
|
| 3200 | - 'ATT_short_bio' => array('LIKE', $sstr), |
|
| 3201 | - 'ATT_email' => array('LIKE', $sstr), |
|
| 3202 | - 'ATT_address' => array('LIKE', $sstr), |
|
| 3203 | - 'ATT_address2' => array('LIKE', $sstr), |
|
| 3204 | - 'ATT_city' => array('LIKE', $sstr), |
|
| 3205 | - 'Country.CNT_name' => array('LIKE', $sstr), |
|
| 3206 | - 'State.STA_name' => array('LIKE', $sstr), |
|
| 3207 | - 'ATT_phone' => array('LIKE', $sstr), |
|
| 3208 | - 'Registration.REG_final_price' => array('LIKE', $sstr), |
|
| 3209 | - 'Registration.REG_code' => array('LIKE', $sstr), |
|
| 3210 | - 'Registration.REG_group_size' => array('LIKE', $sstr), |
|
| 3211 | - ); |
|
| 3212 | - } |
|
| 3213 | - $offset = ($current_page - 1) * $per_page; |
|
| 3214 | - $limit = $count ? null : array($offset, $per_page); |
|
| 3215 | - $query_args = array( |
|
| 3216 | - $_where, |
|
| 3217 | - 'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')), |
|
| 3218 | - 'limit' => $limit, |
|
| 3219 | - ); |
|
| 3220 | - if (! $count) { |
|
| 3221 | - $query_args['order_by'] = array($orderby => $sort); |
|
| 3222 | - } |
|
| 3223 | - if ($trash) { |
|
| 3224 | - $query_args[0]['status'] = array('!=', 'publish'); |
|
| 3225 | - $all_attendees = $count |
|
| 3226 | - ? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true) |
|
| 3227 | - : $this->getAttendeeModel()->get_all($query_args); |
|
| 3228 | - } else { |
|
| 3229 | - $query_args[0]['status'] = array('IN', array('publish')); |
|
| 3230 | - $all_attendees = $count |
|
| 3231 | - ? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true) |
|
| 3232 | - : $this->getAttendeeModel()->get_all($query_args); |
|
| 3233 | - } |
|
| 3234 | - return $all_attendees; |
|
| 3235 | - } |
|
| 3236 | - |
|
| 3237 | - |
|
| 3238 | - /** |
|
| 3239 | - * This is just taking care of resending the registration confirmation |
|
| 3240 | - * |
|
| 3241 | - * @access protected |
|
| 3242 | - * @return void |
|
| 3243 | - * @throws EE_Error |
|
| 3244 | - * @throws InvalidArgumentException |
|
| 3245 | - * @throws InvalidDataTypeException |
|
| 3246 | - * @throws InvalidInterfaceException |
|
| 3247 | - * @throws ReflectionException |
|
| 3248 | - */ |
|
| 3249 | - protected function _resend_registration() |
|
| 3250 | - { |
|
| 3251 | - $this->_process_resend_registration(); |
|
| 3252 | - $query_args = isset($this->_req_data['redirect_to']) |
|
| 3253 | - ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID']) |
|
| 3254 | - : array('action' => 'default'); |
|
| 3255 | - $this->_redirect_after_action(false, '', '', $query_args, true); |
|
| 3256 | - } |
|
| 3257 | - |
|
| 3258 | - /** |
|
| 3259 | - * Creates a registration report, but accepts the name of a method to use for preparing the query parameters |
|
| 3260 | - * to use when selecting registrations |
|
| 3261 | - * |
|
| 3262 | - * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing |
|
| 3263 | - * the query parameters from the request |
|
| 3264 | - * @return void ends the request with a redirect or download |
|
| 3265 | - */ |
|
| 3266 | - public function _registrations_report_base($method_name_for_getting_query_params) |
|
| 3267 | - { |
|
| 3268 | - if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) { |
|
| 3269 | - wp_redirect( |
|
| 3270 | - EE_Admin_Page::add_query_args_and_nonce( |
|
| 3271 | - array( |
|
| 3272 | - 'page' => 'espresso_batch', |
|
| 3273 | - 'batch' => 'file', |
|
| 3274 | - 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null, |
|
| 3275 | - 'filters' => urlencode( |
|
| 3276 | - serialize( |
|
| 3277 | - $this->$method_name_for_getting_query_params( |
|
| 3278 | - EEH_Array::is_set( |
|
| 3279 | - $this->_req_data, |
|
| 3280 | - 'filters', |
|
| 3281 | - array() |
|
| 3282 | - ) |
|
| 3283 | - ) |
|
| 3284 | - ) |
|
| 3285 | - ), |
|
| 3286 | - 'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false), |
|
| 3287 | - 'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'), |
|
| 3288 | - 'return_url' => urlencode($this->_req_data['return_url']), |
|
| 3289 | - ) |
|
| 3290 | - ) |
|
| 3291 | - ); |
|
| 3292 | - } else { |
|
| 3293 | - $new_request_args = array( |
|
| 3294 | - 'export' => 'report', |
|
| 3295 | - 'action' => 'registrations_report_for_event', |
|
| 3296 | - 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null, |
|
| 3297 | - ); |
|
| 3298 | - $this->_req_data = array_merge($this->_req_data, $new_request_args); |
|
| 3299 | - if (is_readable(EE_CLASSES . 'EE_Export.class.php')) { |
|
| 3300 | - require_once(EE_CLASSES . 'EE_Export.class.php'); |
|
| 3301 | - $EE_Export = EE_Export::instance($this->_req_data); |
|
| 3302 | - $EE_Export->export(); |
|
| 3303 | - } |
|
| 3304 | - } |
|
| 3305 | - } |
|
| 3306 | - |
|
| 3307 | - |
|
| 3308 | - /** |
|
| 3309 | - * Creates a registration report using only query parameters in the request |
|
| 3310 | - * |
|
| 3311 | - * @return void |
|
| 3312 | - */ |
|
| 3313 | - public function _registrations_report() |
|
| 3314 | - { |
|
| 3315 | - $this->_registrations_report_base('_get_registration_query_parameters'); |
|
| 3316 | - } |
|
| 3317 | - |
|
| 3318 | - |
|
| 3319 | - public function _contact_list_export() |
|
| 3320 | - { |
|
| 3321 | - if (is_readable(EE_CLASSES . 'EE_Export.class.php')) { |
|
| 3322 | - require_once(EE_CLASSES . 'EE_Export.class.php'); |
|
| 3323 | - $EE_Export = EE_Export::instance($this->_req_data); |
|
| 3324 | - $EE_Export->export_attendees(); |
|
| 3325 | - } |
|
| 3326 | - } |
|
| 3327 | - |
|
| 3328 | - |
|
| 3329 | - public function _contact_list_report() |
|
| 3330 | - { |
|
| 3331 | - if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) { |
|
| 3332 | - wp_redirect( |
|
| 3333 | - EE_Admin_Page::add_query_args_and_nonce( |
|
| 3334 | - array( |
|
| 3335 | - 'page' => 'espresso_batch', |
|
| 3336 | - 'batch' => 'file', |
|
| 3337 | - 'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'), |
|
| 3338 | - 'return_url' => urlencode($this->_req_data['return_url']), |
|
| 3339 | - ) |
|
| 3340 | - ) |
|
| 3341 | - ); |
|
| 3342 | - } else { |
|
| 3343 | - if (is_readable(EE_CLASSES . 'EE_Export.class.php')) { |
|
| 3344 | - require_once(EE_CLASSES . 'EE_Export.class.php'); |
|
| 3345 | - $EE_Export = EE_Export::instance($this->_req_data); |
|
| 3346 | - $EE_Export->report_attendees(); |
|
| 3347 | - } |
|
| 3348 | - } |
|
| 3349 | - } |
|
| 3350 | - |
|
| 3351 | - |
|
| 3352 | - |
|
| 3353 | - |
|
| 3354 | - |
|
| 3355 | - /*************************************** ATTENDEE DETAILS ***************************************/ |
|
| 3356 | - /** |
|
| 3357 | - * This duplicates the attendee object for the given incoming registration id and attendee_id. |
|
| 3358 | - * |
|
| 3359 | - * @return void |
|
| 3360 | - * @throws EE_Error |
|
| 3361 | - * @throws InvalidArgumentException |
|
| 3362 | - * @throws InvalidDataTypeException |
|
| 3363 | - * @throws InvalidInterfaceException |
|
| 3364 | - * @throws ReflectionException |
|
| 3365 | - */ |
|
| 3366 | - protected function _duplicate_attendee() |
|
| 3367 | - { |
|
| 3368 | - $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default'; |
|
| 3369 | - // verify we have necessary info |
|
| 3370 | - if (empty($this->_req_data['_REG_ID'])) { |
|
| 3371 | - EE_Error::add_error( |
|
| 3372 | - esc_html__( |
|
| 3373 | - 'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )', |
|
| 3374 | - 'event_espresso' |
|
| 3375 | - ), |
|
| 3376 | - __FILE__, |
|
| 3377 | - __LINE__, |
|
| 3378 | - __FUNCTION__ |
|
| 3379 | - ); |
|
| 3380 | - $query_args = array('action' => $action); |
|
| 3381 | - $this->_redirect_after_action('', '', '', $query_args, true); |
|
| 3382 | - } |
|
| 3383 | - // okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration. |
|
| 3384 | - $registration = $this->getRegistrationModel()->get_one_by_ID($this->_req_data['_REG_ID']); |
|
| 3385 | - $attendee = $registration->attendee(); |
|
| 3386 | - // remove relation of existing attendee on registration |
|
| 3387 | - $registration->_remove_relation_to($attendee, 'Attendee'); |
|
| 3388 | - // new attendee |
|
| 3389 | - $new_attendee = clone $attendee; |
|
| 3390 | - $new_attendee->set('ATT_ID', 0); |
|
| 3391 | - $new_attendee->save(); |
|
| 3392 | - // add new attendee to reg |
|
| 3393 | - $registration->_add_relation_to($new_attendee, 'Attendee'); |
|
| 3394 | - EE_Error::add_success( |
|
| 3395 | - esc_html__( |
|
| 3396 | - 'New Contact record created. Now make any edits you wish to make for this contact.', |
|
| 3397 | - 'event_espresso' |
|
| 3398 | - ) |
|
| 3399 | - ); |
|
| 3400 | - // redirect to edit page for attendee |
|
| 3401 | - $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee'); |
|
| 3402 | - $this->_redirect_after_action('', '', '', $query_args, true); |
|
| 3403 | - } |
|
| 3404 | - |
|
| 3405 | - |
|
| 3406 | - /** |
|
| 3407 | - * Callback invoked by parent EE_Admin_CPT class hooked in on `save_post` wp hook. |
|
| 3408 | - * |
|
| 3409 | - * @param int $post_id |
|
| 3410 | - * @param WP_POST $post |
|
| 3411 | - * @throws DomainException |
|
| 3412 | - * @throws EE_Error |
|
| 3413 | - * @throws InvalidArgumentException |
|
| 3414 | - * @throws InvalidDataTypeException |
|
| 3415 | - * @throws InvalidInterfaceException |
|
| 3416 | - * @throws LogicException |
|
| 3417 | - * @throws InvalidFormSubmissionException |
|
| 3418 | - * @throws ReflectionException |
|
| 3419 | - */ |
|
| 3420 | - protected function _insert_update_cpt_item($post_id, $post) |
|
| 3421 | - { |
|
| 3422 | - $success = true; |
|
| 3423 | - $attendee = $post instanceof WP_Post && $post->post_type === 'espresso_attendees' |
|
| 3424 | - ? $this->getAttendeeModel()->get_one_by_ID($post_id) |
|
| 3425 | - : null; |
|
| 3426 | - // for attendee updates |
|
| 3427 | - if ($attendee instanceof EE_Attendee) { |
|
| 3428 | - // note we should only be UPDATING attendees at this point. |
|
| 3429 | - $updated_fields = array( |
|
| 3430 | - 'ATT_fname' => $this->_req_data['ATT_fname'], |
|
| 3431 | - 'ATT_lname' => $this->_req_data['ATT_lname'], |
|
| 3432 | - 'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'], |
|
| 3433 | - 'ATT_address' => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '', |
|
| 3434 | - 'ATT_address2' => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '', |
|
| 3435 | - 'ATT_city' => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '', |
|
| 3436 | - 'STA_ID' => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '', |
|
| 3437 | - 'CNT_ISO' => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '', |
|
| 3438 | - 'ATT_zip' => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '', |
|
| 3439 | - ); |
|
| 3440 | - foreach ($updated_fields as $field => $value) { |
|
| 3441 | - $attendee->set($field, $value); |
|
| 3442 | - } |
|
| 3443 | - |
|
| 3444 | - // process contact details metabox form handler (which will also save the attendee) |
|
| 3445 | - $contact_details_form = $this->getAttendeeContactDetailsMetaboxFormHandler($attendee); |
|
| 3446 | - $success = $contact_details_form->process($this->_req_data); |
|
| 3447 | - |
|
| 3448 | - $attendee_update_callbacks = apply_filters( |
|
| 3449 | - 'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update', |
|
| 3450 | - array() |
|
| 3451 | - ); |
|
| 3452 | - foreach ($attendee_update_callbacks as $a_callback) { |
|
| 3453 | - if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) { |
|
| 3454 | - throw new EE_Error( |
|
| 3455 | - sprintf( |
|
| 3456 | - esc_html__( |
|
| 3457 | - '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.', |
|
| 3458 | - 'event_espresso' |
|
| 3459 | - ), |
|
| 3460 | - $a_callback |
|
| 3461 | - ) |
|
| 3462 | - ); |
|
| 3463 | - } |
|
| 3464 | - } |
|
| 3465 | - } |
|
| 3466 | - |
|
| 3467 | - if ($success === false) { |
|
| 3468 | - EE_Error::add_error( |
|
| 3469 | - esc_html__( |
|
| 3470 | - 'Something went wrong with updating the meta table data for the registration.', |
|
| 3471 | - 'event_espresso' |
|
| 3472 | - ), |
|
| 3473 | - __FILE__, |
|
| 3474 | - __FUNCTION__, |
|
| 3475 | - __LINE__ |
|
| 3476 | - ); |
|
| 3477 | - } |
|
| 3478 | - } |
|
| 3479 | - |
|
| 3480 | - |
|
| 3481 | - public function trash_cpt_item($post_id) |
|
| 3482 | - { |
|
| 3483 | - } |
|
| 3484 | - |
|
| 3485 | - |
|
| 3486 | - public function delete_cpt_item($post_id) |
|
| 3487 | - { |
|
| 3488 | - } |
|
| 3489 | - |
|
| 3490 | - |
|
| 3491 | - public function restore_cpt_item($post_id) |
|
| 3492 | - { |
|
| 3493 | - } |
|
| 3494 | - |
|
| 3495 | - |
|
| 3496 | - protected function _restore_cpt_item($post_id, $revision_id) |
|
| 3497 | - { |
|
| 3498 | - } |
|
| 3499 | - |
|
| 3500 | - |
|
| 3501 | - /** |
|
| 3502 | - * @throws EE_Error |
|
| 3503 | - * @since $VID:$ |
|
| 3504 | - */ |
|
| 3505 | - public function attendee_editor_metaboxes() |
|
| 3506 | - { |
|
| 3507 | - $this->verify_cpt_object(); |
|
| 3508 | - remove_meta_box( |
|
| 3509 | - 'postexcerpt', |
|
| 3510 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3511 | - 'normal' |
|
| 3512 | - ); |
|
| 3513 | - remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core'); |
|
| 3514 | - if (post_type_supports('espresso_attendees', 'excerpt')) { |
|
| 3515 | - add_meta_box( |
|
| 3516 | - 'postexcerpt', |
|
| 3517 | - esc_html__('Short Biography', 'event_espresso'), |
|
| 3518 | - 'post_excerpt_meta_box', |
|
| 3519 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3520 | - 'normal' |
|
| 3521 | - ); |
|
| 3522 | - } |
|
| 3523 | - if (post_type_supports('espresso_attendees', 'comments')) { |
|
| 3524 | - add_meta_box( |
|
| 3525 | - 'commentsdiv', |
|
| 3526 | - esc_html__('Notes on the Contact', 'event_espresso'), |
|
| 3527 | - 'post_comment_meta_box', |
|
| 3528 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3529 | - 'normal', |
|
| 3530 | - 'core' |
|
| 3531 | - ); |
|
| 3532 | - } |
|
| 3533 | - add_meta_box( |
|
| 3534 | - 'attendee_contact_info', |
|
| 3535 | - esc_html__('Contact Info', 'event_espresso'), |
|
| 3536 | - array($this, 'attendee_contact_info'), |
|
| 3537 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3538 | - 'side', |
|
| 3539 | - 'core' |
|
| 3540 | - ); |
|
| 3541 | - add_meta_box( |
|
| 3542 | - 'attendee_details_address', |
|
| 3543 | - esc_html__('Address Details', 'event_espresso'), |
|
| 3544 | - array($this, 'attendee_address_details'), |
|
| 3545 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3546 | - 'normal', |
|
| 3547 | - 'core' |
|
| 3548 | - ); |
|
| 3549 | - add_meta_box( |
|
| 3550 | - 'attendee_registrations', |
|
| 3551 | - esc_html__('Registrations for this Contact', 'event_espresso'), |
|
| 3552 | - array($this, 'attendee_registrations_meta_box'), |
|
| 3553 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3554 | - 'normal', |
|
| 3555 | - 'high' |
|
| 3556 | - ); |
|
| 3557 | - } |
|
| 3558 | - |
|
| 3559 | - |
|
| 3560 | - /** |
|
| 3561 | - * Metabox for attendee contact info |
|
| 3562 | - * |
|
| 3563 | - * @param WP_Post $post wp post object |
|
| 3564 | - * @return string attendee contact info ( and form ) |
|
| 3565 | - * @throws EE_Error |
|
| 3566 | - * @throws InvalidArgumentException |
|
| 3567 | - * @throws InvalidDataTypeException |
|
| 3568 | - * @throws InvalidInterfaceException |
|
| 3569 | - * @throws LogicException |
|
| 3570 | - * @throws DomainException |
|
| 3571 | - */ |
|
| 3572 | - public function attendee_contact_info($post) |
|
| 3573 | - { |
|
| 3574 | - // get attendee object ( should already have it ) |
|
| 3575 | - $form = $this->getAttendeeContactDetailsMetaboxFormHandler($this->_cpt_model_obj); |
|
| 3576 | - $form->enqueueStylesAndScripts(); |
|
| 3577 | - echo $form->display(); |
|
| 3578 | - } |
|
| 3579 | - |
|
| 3580 | - |
|
| 3581 | - /** |
|
| 3582 | - * Return form handler for the contact details metabox |
|
| 3583 | - * |
|
| 3584 | - * @param EE_Attendee $attendee |
|
| 3585 | - * @return AttendeeContactDetailsMetaboxFormHandler |
|
| 3586 | - * @throws DomainException |
|
| 3587 | - * @throws InvalidArgumentException |
|
| 3588 | - * @throws InvalidDataTypeException |
|
| 3589 | - * @throws InvalidInterfaceException |
|
| 3590 | - */ |
|
| 3591 | - protected function getAttendeeContactDetailsMetaboxFormHandler(EE_Attendee $attendee) |
|
| 3592 | - { |
|
| 3593 | - return new AttendeeContactDetailsMetaboxFormHandler($attendee, EE_Registry::instance()); |
|
| 3594 | - } |
|
| 3595 | - |
|
| 3596 | - |
|
| 3597 | - /** |
|
| 3598 | - * Metabox for attendee details |
|
| 3599 | - * |
|
| 3600 | - * @param WP_Post $post wp post object |
|
| 3601 | - * @throws DomainException |
|
| 3602 | - */ |
|
| 3603 | - public function attendee_address_details($post) |
|
| 3604 | - { |
|
| 3605 | - // get attendee object (should already have it) |
|
| 3606 | - $this->_template_args['attendee'] = $this->_cpt_model_obj; |
|
| 3607 | - $this->_template_args['state_html'] = EEH_Form_Fields::generate_form_input( |
|
| 3608 | - new EE_Question_Form_Input( |
|
| 3609 | - EE_Question::new_instance( |
|
| 3610 | - array( |
|
| 3611 | - 'QST_ID' => 0, |
|
| 3612 | - 'QST_display_text' => esc_html__('State/Province', 'event_espresso'), |
|
| 3613 | - 'QST_system' => 'admin-state', |
|
| 3614 | - ) |
|
| 3615 | - ), |
|
| 3616 | - EE_Answer::new_instance( |
|
| 3617 | - array( |
|
| 3618 | - 'ANS_ID' => 0, |
|
| 3619 | - 'ANS_value' => $this->_cpt_model_obj->state_ID(), |
|
| 3620 | - ) |
|
| 3621 | - ), |
|
| 3622 | - array( |
|
| 3623 | - 'input_id' => 'STA_ID', |
|
| 3624 | - 'input_name' => 'STA_ID', |
|
| 3625 | - 'input_prefix' => '', |
|
| 3626 | - 'append_qstn_id' => false, |
|
| 3627 | - ) |
|
| 3628 | - ) |
|
| 3629 | - ); |
|
| 3630 | - $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input( |
|
| 3631 | - new EE_Question_Form_Input( |
|
| 3632 | - EE_Question::new_instance( |
|
| 3633 | - array( |
|
| 3634 | - 'QST_ID' => 0, |
|
| 3635 | - 'QST_display_text' => esc_html__('Country', 'event_espresso'), |
|
| 3636 | - 'QST_system' => 'admin-country', |
|
| 3637 | - ) |
|
| 3638 | - ), |
|
| 3639 | - EE_Answer::new_instance( |
|
| 3640 | - array( |
|
| 3641 | - 'ANS_ID' => 0, |
|
| 3642 | - 'ANS_value' => $this->_cpt_model_obj->country_ID(), |
|
| 3643 | - ) |
|
| 3644 | - ), |
|
| 3645 | - array( |
|
| 3646 | - 'input_id' => 'CNT_ISO', |
|
| 3647 | - 'input_name' => 'CNT_ISO', |
|
| 3648 | - 'input_prefix' => '', |
|
| 3649 | - 'append_qstn_id' => false, |
|
| 3650 | - ) |
|
| 3651 | - ) |
|
| 3652 | - ); |
|
| 3653 | - $template = |
|
| 3654 | - REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php'; |
|
| 3655 | - EEH_Template::display_template($template, $this->_template_args); |
|
| 3656 | - } |
|
| 3657 | - |
|
| 3658 | - |
|
| 3659 | - /** |
|
| 3660 | - * _attendee_details |
|
| 3661 | - * |
|
| 3662 | - * @access protected |
|
| 3663 | - * @param $post |
|
| 3664 | - * @return void |
|
| 3665 | - * @throws DomainException |
|
| 3666 | - * @throws EE_Error |
|
| 3667 | - * @throws InvalidArgumentException |
|
| 3668 | - * @throws InvalidDataTypeException |
|
| 3669 | - * @throws InvalidInterfaceException |
|
| 3670 | - * @throws ReflectionException |
|
| 3671 | - */ |
|
| 3672 | - public function attendee_registrations_meta_box($post) |
|
| 3673 | - { |
|
| 3674 | - $this->_template_args['attendee'] = $this->_cpt_model_obj; |
|
| 3675 | - $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration'); |
|
| 3676 | - $template = |
|
| 3677 | - REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php'; |
|
| 3678 | - EEH_Template::display_template($template, $this->_template_args); |
|
| 3679 | - } |
|
| 3680 | - |
|
| 3681 | - |
|
| 3682 | - /** |
|
| 3683 | - * add in the form fields for the attendee edit |
|
| 3684 | - * |
|
| 3685 | - * @param WP_Post $post wp post object |
|
| 3686 | - * @return string html for new form. |
|
| 3687 | - * @throws DomainException |
|
| 3688 | - */ |
|
| 3689 | - public function after_title_form_fields($post) |
|
| 3690 | - { |
|
| 3691 | - if ($post->post_type === 'espresso_attendees') { |
|
| 3692 | - $template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php'; |
|
| 3693 | - $template_args['attendee'] = $this->_cpt_model_obj; |
|
| 3694 | - EEH_Template::display_template($template, $template_args); |
|
| 3695 | - } |
|
| 3696 | - } |
|
| 3697 | - |
|
| 3698 | - |
|
| 3699 | - /** |
|
| 3700 | - * _trash_or_restore_attendee |
|
| 3701 | - * |
|
| 3702 | - * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE) |
|
| 3703 | - * @return void |
|
| 3704 | - * @throws EE_Error |
|
| 3705 | - * @throws InvalidArgumentException |
|
| 3706 | - * @throws InvalidDataTypeException |
|
| 3707 | - * @throws InvalidInterfaceException |
|
| 3708 | - * @throws ReflectionException |
|
| 3709 | - * @access protected |
|
| 3710 | - */ |
|
| 3711 | - protected function _trash_or_restore_attendees($trash = true) |
|
| 3712 | - { |
|
| 3713 | - do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
| 3714 | - $success = 1; |
|
| 3715 | - // Checkboxes |
|
| 3716 | - if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
| 3717 | - // if array has more than one element than success message should be plural |
|
| 3718 | - $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1; |
|
| 3719 | - // cycle thru checkboxes |
|
| 3720 | - foreach ($this->_req_data['checkbox'] as $ATT_ID) { |
|
| 3721 | - $updated = $trash ? $this->getAttendeeModel()->update_by_ID(array('status' => 'trash'), $ATT_ID) |
|
| 3722 | - : $this->getAttendeeModel()->update_by_ID(array('status' => 'publish'), $ATT_ID); |
|
| 3723 | - if (! $updated) { |
|
| 3724 | - $success = 0; |
|
| 3725 | - } |
|
| 3726 | - } |
|
| 3727 | - } else { |
|
| 3728 | - // grab single id and delete |
|
| 3729 | - $ATT_ID = absint($this->_req_data['ATT_ID']); |
|
| 3730 | - // get attendee |
|
| 3731 | - $att = $this->getAttendeeModel()->get_one_by_ID($ATT_ID); |
|
| 3732 | - $updated = $trash ? $att->set_status('trash') : $att->set_status('publish'); |
|
| 3733 | - $updated = $att->save() && $updated; |
|
| 3734 | - if (! $updated) { |
|
| 3735 | - $success = 0; |
|
| 3736 | - } |
|
| 3737 | - } |
|
| 3738 | - $what = $success > 1 |
|
| 3739 | - ? esc_html__('Contacts', 'event_espresso') |
|
| 3740 | - : esc_html__('Contact', 'event_espresso'); |
|
| 3741 | - $action_desc = $trash |
|
| 3742 | - ? esc_html__('moved to the trash', 'event_espresso') |
|
| 3743 | - : esc_html__('restored', 'event_espresso'); |
|
| 3744 | - $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list')); |
|
| 3745 | - } |
|
| 2882 | + } |
|
| 2883 | + $template_args = array( |
|
| 2884 | + 'title' => '', |
|
| 2885 | + 'content' => '', |
|
| 2886 | + 'step_button_text' => '', |
|
| 2887 | + 'show_notification_toggle' => false, |
|
| 2888 | + ); |
|
| 2889 | + // to indicate we're processing a new registration |
|
| 2890 | + $hidden_fields = array( |
|
| 2891 | + 'processing_registration' => array( |
|
| 2892 | + 'type' => 'hidden', |
|
| 2893 | + 'value' => 0, |
|
| 2894 | + ), |
|
| 2895 | + 'event_id' => array( |
|
| 2896 | + 'type' => 'hidden', |
|
| 2897 | + 'value' => $this->_reg_event->ID(), |
|
| 2898 | + ), |
|
| 2899 | + ); |
|
| 2900 | + // if the cart is empty then we know we're at step one so we'll display ticket selector |
|
| 2901 | + $cart = EE_Registry::instance()->SSN->cart(); |
|
| 2902 | + $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions'; |
|
| 2903 | + switch ($step) { |
|
| 2904 | + case 'ticket': |
|
| 2905 | + $hidden_fields['processing_registration']['value'] = 1; |
|
| 2906 | + $template_args['title'] = esc_html__( |
|
| 2907 | + 'Step One: Select the Ticket for this registration', |
|
| 2908 | + 'event_espresso' |
|
| 2909 | + ); |
|
| 2910 | + $template_args['content'] = |
|
| 2911 | + EED_Ticket_Selector::instance()->display_ticket_selector($this->_reg_event); |
|
| 2912 | + $template_args['content'] .= '</div>'; |
|
| 2913 | + $template_args['step_button_text'] = esc_html__( |
|
| 2914 | + 'Add Tickets and Continue to Registrant Details', |
|
| 2915 | + 'event_espresso' |
|
| 2916 | + ); |
|
| 2917 | + $template_args['show_notification_toggle'] = false; |
|
| 2918 | + break; |
|
| 2919 | + case 'questions': |
|
| 2920 | + $hidden_fields['processing_registration']['value'] = 2; |
|
| 2921 | + $template_args['title'] = esc_html__( |
|
| 2922 | + 'Step Two: Add Registrant Details for this Registration', |
|
| 2923 | + 'event_espresso' |
|
| 2924 | + ); |
|
| 2925 | + // in theory we should be able to run EED_SPCO at this point because the cart should have been setup |
|
| 2926 | + // properly by the first process_reg_step run. |
|
| 2927 | + $template_args['content'] = |
|
| 2928 | + EED_Single_Page_Checkout::registration_checkout_for_admin(); |
|
| 2929 | + $template_args['step_button_text'] = esc_html__( |
|
| 2930 | + 'Save Registration and Continue to Details', |
|
| 2931 | + 'event_espresso' |
|
| 2932 | + ); |
|
| 2933 | + $template_args['show_notification_toggle'] = true; |
|
| 2934 | + break; |
|
| 2935 | + } |
|
| 2936 | + // we come back to the process_registration_step route. |
|
| 2937 | + $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields); |
|
| 2938 | + return EEH_Template::display_template( |
|
| 2939 | + REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php', |
|
| 2940 | + $template_args, |
|
| 2941 | + true |
|
| 2942 | + ); |
|
| 2943 | + } |
|
| 2944 | + |
|
| 2945 | + |
|
| 2946 | + /** |
|
| 2947 | + * set_reg_event |
|
| 2948 | + * |
|
| 2949 | + * @access private |
|
| 2950 | + * @return bool |
|
| 2951 | + * @throws EE_Error |
|
| 2952 | + * @throws InvalidArgumentException |
|
| 2953 | + * @throws InvalidDataTypeException |
|
| 2954 | + * @throws InvalidInterfaceException |
|
| 2955 | + */ |
|
| 2956 | + private function _set_reg_event() |
|
| 2957 | + { |
|
| 2958 | + if (is_object($this->_reg_event)) { |
|
| 2959 | + return true; |
|
| 2960 | + } |
|
| 2961 | + $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false; |
|
| 2962 | + if (! $EVT_ID) { |
|
| 2963 | + return false; |
|
| 2964 | + } |
|
| 2965 | + $this->_reg_event = $this->getEventModel()->get_one_by_ID($EVT_ID); |
|
| 2966 | + return true; |
|
| 2967 | + } |
|
| 2968 | + |
|
| 2969 | + |
|
| 2970 | + /** |
|
| 2971 | + * process_reg_step |
|
| 2972 | + * |
|
| 2973 | + * @access public |
|
| 2974 | + * @return string |
|
| 2975 | + * @throws DomainException |
|
| 2976 | + * @throws EE_Error |
|
| 2977 | + * @throws InvalidArgumentException |
|
| 2978 | + * @throws InvalidDataTypeException |
|
| 2979 | + * @throws InvalidInterfaceException |
|
| 2980 | + * @throws ReflectionException |
|
| 2981 | + * @throws RuntimeException |
|
| 2982 | + */ |
|
| 2983 | + public function process_reg_step() |
|
| 2984 | + { |
|
| 2985 | + EE_System::do_not_cache(); |
|
| 2986 | + $this->_set_reg_event(); |
|
| 2987 | + EE_Registry::instance()->REQ->set_espresso_page(true); |
|
| 2988 | + EE_Registry::instance()->REQ->set('uts', time()); |
|
| 2989 | + // what step are we on? |
|
| 2990 | + $cart = EE_Registry::instance()->SSN->cart(); |
|
| 2991 | + $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions'; |
|
| 2992 | + // if doing ajax then we need to verify the nonce |
|
| 2993 | + if (defined('DOING_AJAX')) { |
|
| 2994 | + $nonce = isset($this->_req_data[ $this->_req_nonce ]) |
|
| 2995 | + ? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : ''; |
|
| 2996 | + $this->_verify_nonce($nonce, $this->_req_nonce); |
|
| 2997 | + } |
|
| 2998 | + switch ($step) { |
|
| 2999 | + case 'ticket': |
|
| 3000 | + // process ticket selection |
|
| 3001 | + $success = EED_Ticket_Selector::instance()->process_ticket_selections(); |
|
| 3002 | + if ($success) { |
|
| 3003 | + EE_Error::add_success( |
|
| 3004 | + esc_html__( |
|
| 3005 | + 'Tickets Selected. Now complete the registration.', |
|
| 3006 | + 'event_espresso' |
|
| 3007 | + ) |
|
| 3008 | + ); |
|
| 3009 | + } else { |
|
| 3010 | + $query_args['step_error'] = $this->_req_data['step_error'] = true; |
|
| 3011 | + } |
|
| 3012 | + if (defined('DOING_AJAX')) { |
|
| 3013 | + $this->new_registration(); // display next step |
|
| 3014 | + } else { |
|
| 3015 | + $query_args = array( |
|
| 3016 | + 'action' => 'new_registration', |
|
| 3017 | + 'processing_registration' => 1, |
|
| 3018 | + 'event_id' => $this->_reg_event->ID(), |
|
| 3019 | + 'uts' => time(), |
|
| 3020 | + ); |
|
| 3021 | + $this->_redirect_after_action( |
|
| 3022 | + false, |
|
| 3023 | + '', |
|
| 3024 | + '', |
|
| 3025 | + $query_args, |
|
| 3026 | + true |
|
| 3027 | + ); |
|
| 3028 | + } |
|
| 3029 | + break; |
|
| 3030 | + case 'questions': |
|
| 3031 | + if (! isset( |
|
| 3032 | + $this->_req_data['txn_reg_status_change'], |
|
| 3033 | + $this->_req_data['txn_reg_status_change']['send_notifications'] |
|
| 3034 | + ) |
|
| 3035 | + ) { |
|
| 3036 | + add_filter('FHEE__EED_Messages___maybe_registration__deliver_notifications', '__return_false', 15); |
|
| 3037 | + } |
|
| 3038 | + // process registration |
|
| 3039 | + $transaction = EED_Single_Page_Checkout::instance()->process_registration_from_admin(); |
|
| 3040 | + if ($cart instanceof EE_Cart) { |
|
| 3041 | + $grand_total = $cart->get_cart_grand_total(); |
|
| 3042 | + if ($grand_total instanceof EE_Line_Item) { |
|
| 3043 | + $grand_total->save_this_and_descendants_to_txn(); |
|
| 3044 | + } |
|
| 3045 | + } |
|
| 3046 | + if (! $transaction instanceof EE_Transaction) { |
|
| 3047 | + $query_args = array( |
|
| 3048 | + 'action' => 'new_registration', |
|
| 3049 | + 'processing_registration' => 2, |
|
| 3050 | + 'event_id' => $this->_reg_event->ID(), |
|
| 3051 | + 'uts' => time(), |
|
| 3052 | + ); |
|
| 3053 | + if (defined('DOING_AJAX')) { |
|
| 3054 | + // display registration form again because there are errors (maybe validation?) |
|
| 3055 | + $this->new_registration(); |
|
| 3056 | + return; |
|
| 3057 | + } |
|
| 3058 | + $this->_redirect_after_action( |
|
| 3059 | + false, |
|
| 3060 | + '', |
|
| 3061 | + '', |
|
| 3062 | + $query_args, |
|
| 3063 | + true |
|
| 3064 | + ); |
|
| 3065 | + return; |
|
| 3066 | + } |
|
| 3067 | + // maybe update status, and make sure to save transaction if not done already |
|
| 3068 | + if (! $transaction->update_status_based_on_total_paid()) { |
|
| 3069 | + $transaction->save(); |
|
| 3070 | + } |
|
| 3071 | + EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
|
| 3072 | + $this->_req_data = array(); |
|
| 3073 | + $query_args = array( |
|
| 3074 | + 'action' => 'redirect_to_txn', |
|
| 3075 | + 'TXN_ID' => $transaction->ID(), |
|
| 3076 | + 'EVT_ID' => $this->_reg_event->ID(), |
|
| 3077 | + 'event_name' => urlencode($this->_reg_event->name()), |
|
| 3078 | + 'redirect_from' => 'new_registration', |
|
| 3079 | + ); |
|
| 3080 | + $this->_redirect_after_action(false, '', '', $query_args, true); |
|
| 3081 | + break; |
|
| 3082 | + } |
|
| 3083 | + // what are you looking here for? Should be nothing to do at this point. |
|
| 3084 | + } |
|
| 3085 | + |
|
| 3086 | + |
|
| 3087 | + /** |
|
| 3088 | + * redirect_to_txn |
|
| 3089 | + * |
|
| 3090 | + * @access public |
|
| 3091 | + * @return void |
|
| 3092 | + * @throws EE_Error |
|
| 3093 | + * @throws InvalidArgumentException |
|
| 3094 | + * @throws InvalidDataTypeException |
|
| 3095 | + * @throws InvalidInterfaceException |
|
| 3096 | + * @throws ReflectionException |
|
| 3097 | + */ |
|
| 3098 | + public function redirect_to_txn() |
|
| 3099 | + { |
|
| 3100 | + EE_System::do_not_cache(); |
|
| 3101 | + EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
|
| 3102 | + $query_args = array( |
|
| 3103 | + 'action' => 'view_transaction', |
|
| 3104 | + 'TXN_ID' => isset($this->_req_data['TXN_ID']) ? absint($this->_req_data['TXN_ID']) : 0, |
|
| 3105 | + 'page' => 'espresso_transactions', |
|
| 3106 | + ); |
|
| 3107 | + if (isset($this->_req_data['EVT_ID'], $this->_req_data['redirect_from'])) { |
|
| 3108 | + $query_args['EVT_ID'] = $this->_req_data['EVT_ID']; |
|
| 3109 | + $query_args['event_name'] = urlencode($this->_req_data['event_name']); |
|
| 3110 | + $query_args['redirect_from'] = $this->_req_data['redirect_from']; |
|
| 3111 | + } |
|
| 3112 | + EE_Error::add_success( |
|
| 3113 | + esc_html__( |
|
| 3114 | + 'Registration Created. Please review the transaction and add any payments as necessary', |
|
| 3115 | + 'event_espresso' |
|
| 3116 | + ) |
|
| 3117 | + ); |
|
| 3118 | + $this->_redirect_after_action(false, '', '', $query_args, true); |
|
| 3119 | + } |
|
| 3120 | + |
|
| 3121 | + |
|
| 3122 | + /** |
|
| 3123 | + * generates HTML for the Attendee Contact List |
|
| 3124 | + * |
|
| 3125 | + * @access protected |
|
| 3126 | + * @return void |
|
| 3127 | + * @throws DomainException |
|
| 3128 | + * @throws EE_Error |
|
| 3129 | + */ |
|
| 3130 | + protected function _attendee_contact_list_table() |
|
| 3131 | + { |
|
| 3132 | + do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
| 3133 | + $this->_search_btn_label = esc_html__('Contacts', 'event_espresso'); |
|
| 3134 | + $this->display_admin_list_table_page_with_no_sidebar(); |
|
| 3135 | + } |
|
| 3136 | + |
|
| 3137 | + |
|
| 3138 | + /** |
|
| 3139 | + * get_attendees |
|
| 3140 | + * |
|
| 3141 | + * @param $per_page |
|
| 3142 | + * @param bool $count whether to return count or data. |
|
| 3143 | + * @param bool $trash |
|
| 3144 | + * @return array |
|
| 3145 | + * @throws EE_Error |
|
| 3146 | + * @throws InvalidArgumentException |
|
| 3147 | + * @throws InvalidDataTypeException |
|
| 3148 | + * @throws InvalidInterfaceException |
|
| 3149 | + * @access public |
|
| 3150 | + */ |
|
| 3151 | + public function get_attendees($per_page, $count = false, $trash = false) |
|
| 3152 | + { |
|
| 3153 | + do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
| 3154 | + require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php'); |
|
| 3155 | + $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : ''; |
|
| 3156 | + switch ($this->_req_data['orderby']) { |
|
| 3157 | + case 'ATT_ID': |
|
| 3158 | + $orderby = 'ATT_ID'; |
|
| 3159 | + break; |
|
| 3160 | + case 'ATT_fname': |
|
| 3161 | + $orderby = 'ATT_fname'; |
|
| 3162 | + break; |
|
| 3163 | + case 'ATT_email': |
|
| 3164 | + $orderby = 'ATT_email'; |
|
| 3165 | + break; |
|
| 3166 | + case 'ATT_city': |
|
| 3167 | + $orderby = 'ATT_city'; |
|
| 3168 | + break; |
|
| 3169 | + case 'STA_ID': |
|
| 3170 | + $orderby = 'STA_ID'; |
|
| 3171 | + break; |
|
| 3172 | + case 'CNT_ID': |
|
| 3173 | + $orderby = 'CNT_ID'; |
|
| 3174 | + break; |
|
| 3175 | + case 'Registration_Count': |
|
| 3176 | + $orderby = 'Registration_Count'; |
|
| 3177 | + break; |
|
| 3178 | + default: |
|
| 3179 | + $orderby = 'ATT_lname'; |
|
| 3180 | + } |
|
| 3181 | + $sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) |
|
| 3182 | + ? $this->_req_data['order'] |
|
| 3183 | + : 'ASC'; |
|
| 3184 | + $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged']) |
|
| 3185 | + ? $this->_req_data['paged'] |
|
| 3186 | + : 1; |
|
| 3187 | + $per_page = isset($per_page) && ! empty($per_page) ? $per_page : 10; |
|
| 3188 | + $per_page = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage']) |
|
| 3189 | + ? $this->_req_data['perpage'] |
|
| 3190 | + : $per_page; |
|
| 3191 | + $_where = array(); |
|
| 3192 | + if (! empty($this->_req_data['s'])) { |
|
| 3193 | + $sstr = '%' . $this->_req_data['s'] . '%'; |
|
| 3194 | + $_where['OR'] = array( |
|
| 3195 | + 'Registration.Event.EVT_name' => array('LIKE', $sstr), |
|
| 3196 | + 'Registration.Event.EVT_desc' => array('LIKE', $sstr), |
|
| 3197 | + 'Registration.Event.EVT_short_desc' => array('LIKE', $sstr), |
|
| 3198 | + 'ATT_fname' => array('LIKE', $sstr), |
|
| 3199 | + 'ATT_lname' => array('LIKE', $sstr), |
|
| 3200 | + 'ATT_short_bio' => array('LIKE', $sstr), |
|
| 3201 | + 'ATT_email' => array('LIKE', $sstr), |
|
| 3202 | + 'ATT_address' => array('LIKE', $sstr), |
|
| 3203 | + 'ATT_address2' => array('LIKE', $sstr), |
|
| 3204 | + 'ATT_city' => array('LIKE', $sstr), |
|
| 3205 | + 'Country.CNT_name' => array('LIKE', $sstr), |
|
| 3206 | + 'State.STA_name' => array('LIKE', $sstr), |
|
| 3207 | + 'ATT_phone' => array('LIKE', $sstr), |
|
| 3208 | + 'Registration.REG_final_price' => array('LIKE', $sstr), |
|
| 3209 | + 'Registration.REG_code' => array('LIKE', $sstr), |
|
| 3210 | + 'Registration.REG_group_size' => array('LIKE', $sstr), |
|
| 3211 | + ); |
|
| 3212 | + } |
|
| 3213 | + $offset = ($current_page - 1) * $per_page; |
|
| 3214 | + $limit = $count ? null : array($offset, $per_page); |
|
| 3215 | + $query_args = array( |
|
| 3216 | + $_where, |
|
| 3217 | + 'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')), |
|
| 3218 | + 'limit' => $limit, |
|
| 3219 | + ); |
|
| 3220 | + if (! $count) { |
|
| 3221 | + $query_args['order_by'] = array($orderby => $sort); |
|
| 3222 | + } |
|
| 3223 | + if ($trash) { |
|
| 3224 | + $query_args[0]['status'] = array('!=', 'publish'); |
|
| 3225 | + $all_attendees = $count |
|
| 3226 | + ? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true) |
|
| 3227 | + : $this->getAttendeeModel()->get_all($query_args); |
|
| 3228 | + } else { |
|
| 3229 | + $query_args[0]['status'] = array('IN', array('publish')); |
|
| 3230 | + $all_attendees = $count |
|
| 3231 | + ? $this->getAttendeeModel()->count($query_args, 'ATT_ID', true) |
|
| 3232 | + : $this->getAttendeeModel()->get_all($query_args); |
|
| 3233 | + } |
|
| 3234 | + return $all_attendees; |
|
| 3235 | + } |
|
| 3236 | + |
|
| 3237 | + |
|
| 3238 | + /** |
|
| 3239 | + * This is just taking care of resending the registration confirmation |
|
| 3240 | + * |
|
| 3241 | + * @access protected |
|
| 3242 | + * @return void |
|
| 3243 | + * @throws EE_Error |
|
| 3244 | + * @throws InvalidArgumentException |
|
| 3245 | + * @throws InvalidDataTypeException |
|
| 3246 | + * @throws InvalidInterfaceException |
|
| 3247 | + * @throws ReflectionException |
|
| 3248 | + */ |
|
| 3249 | + protected function _resend_registration() |
|
| 3250 | + { |
|
| 3251 | + $this->_process_resend_registration(); |
|
| 3252 | + $query_args = isset($this->_req_data['redirect_to']) |
|
| 3253 | + ? array('action' => $this->_req_data['redirect_to'], '_REG_ID' => $this->_req_data['_REG_ID']) |
|
| 3254 | + : array('action' => 'default'); |
|
| 3255 | + $this->_redirect_after_action(false, '', '', $query_args, true); |
|
| 3256 | + } |
|
| 3257 | + |
|
| 3258 | + /** |
|
| 3259 | + * Creates a registration report, but accepts the name of a method to use for preparing the query parameters |
|
| 3260 | + * to use when selecting registrations |
|
| 3261 | + * |
|
| 3262 | + * @param string $method_name_for_getting_query_params the name of the method (on this class) to use for preparing |
|
| 3263 | + * the query parameters from the request |
|
| 3264 | + * @return void ends the request with a redirect or download |
|
| 3265 | + */ |
|
| 3266 | + public function _registrations_report_base($method_name_for_getting_query_params) |
|
| 3267 | + { |
|
| 3268 | + if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) { |
|
| 3269 | + wp_redirect( |
|
| 3270 | + EE_Admin_Page::add_query_args_and_nonce( |
|
| 3271 | + array( |
|
| 3272 | + 'page' => 'espresso_batch', |
|
| 3273 | + 'batch' => 'file', |
|
| 3274 | + 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null, |
|
| 3275 | + 'filters' => urlencode( |
|
| 3276 | + serialize( |
|
| 3277 | + $this->$method_name_for_getting_query_params( |
|
| 3278 | + EEH_Array::is_set( |
|
| 3279 | + $this->_req_data, |
|
| 3280 | + 'filters', |
|
| 3281 | + array() |
|
| 3282 | + ) |
|
| 3283 | + ) |
|
| 3284 | + ) |
|
| 3285 | + ), |
|
| 3286 | + 'use_filters' => EEH_Array::is_set($this->_req_data, 'use_filters', false), |
|
| 3287 | + 'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\RegistrationsReport'), |
|
| 3288 | + 'return_url' => urlencode($this->_req_data['return_url']), |
|
| 3289 | + ) |
|
| 3290 | + ) |
|
| 3291 | + ); |
|
| 3292 | + } else { |
|
| 3293 | + $new_request_args = array( |
|
| 3294 | + 'export' => 'report', |
|
| 3295 | + 'action' => 'registrations_report_for_event', |
|
| 3296 | + 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null, |
|
| 3297 | + ); |
|
| 3298 | + $this->_req_data = array_merge($this->_req_data, $new_request_args); |
|
| 3299 | + if (is_readable(EE_CLASSES . 'EE_Export.class.php')) { |
|
| 3300 | + require_once(EE_CLASSES . 'EE_Export.class.php'); |
|
| 3301 | + $EE_Export = EE_Export::instance($this->_req_data); |
|
| 3302 | + $EE_Export->export(); |
|
| 3303 | + } |
|
| 3304 | + } |
|
| 3305 | + } |
|
| 3306 | + |
|
| 3307 | + |
|
| 3308 | + /** |
|
| 3309 | + * Creates a registration report using only query parameters in the request |
|
| 3310 | + * |
|
| 3311 | + * @return void |
|
| 3312 | + */ |
|
| 3313 | + public function _registrations_report() |
|
| 3314 | + { |
|
| 3315 | + $this->_registrations_report_base('_get_registration_query_parameters'); |
|
| 3316 | + } |
|
| 3317 | + |
|
| 3318 | + |
|
| 3319 | + public function _contact_list_export() |
|
| 3320 | + { |
|
| 3321 | + if (is_readable(EE_CLASSES . 'EE_Export.class.php')) { |
|
| 3322 | + require_once(EE_CLASSES . 'EE_Export.class.php'); |
|
| 3323 | + $EE_Export = EE_Export::instance($this->_req_data); |
|
| 3324 | + $EE_Export->export_attendees(); |
|
| 3325 | + } |
|
| 3326 | + } |
|
| 3327 | + |
|
| 3328 | + |
|
| 3329 | + public function _contact_list_report() |
|
| 3330 | + { |
|
| 3331 | + if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) { |
|
| 3332 | + wp_redirect( |
|
| 3333 | + EE_Admin_Page::add_query_args_and_nonce( |
|
| 3334 | + array( |
|
| 3335 | + 'page' => 'espresso_batch', |
|
| 3336 | + 'batch' => 'file', |
|
| 3337 | + 'job_handler' => urlencode('EventEspressoBatchRequest\JobHandlers\AttendeesReport'), |
|
| 3338 | + 'return_url' => urlencode($this->_req_data['return_url']), |
|
| 3339 | + ) |
|
| 3340 | + ) |
|
| 3341 | + ); |
|
| 3342 | + } else { |
|
| 3343 | + if (is_readable(EE_CLASSES . 'EE_Export.class.php')) { |
|
| 3344 | + require_once(EE_CLASSES . 'EE_Export.class.php'); |
|
| 3345 | + $EE_Export = EE_Export::instance($this->_req_data); |
|
| 3346 | + $EE_Export->report_attendees(); |
|
| 3347 | + } |
|
| 3348 | + } |
|
| 3349 | + } |
|
| 3350 | + |
|
| 3351 | + |
|
| 3352 | + |
|
| 3353 | + |
|
| 3354 | + |
|
| 3355 | + /*************************************** ATTENDEE DETAILS ***************************************/ |
|
| 3356 | + /** |
|
| 3357 | + * This duplicates the attendee object for the given incoming registration id and attendee_id. |
|
| 3358 | + * |
|
| 3359 | + * @return void |
|
| 3360 | + * @throws EE_Error |
|
| 3361 | + * @throws InvalidArgumentException |
|
| 3362 | + * @throws InvalidDataTypeException |
|
| 3363 | + * @throws InvalidInterfaceException |
|
| 3364 | + * @throws ReflectionException |
|
| 3365 | + */ |
|
| 3366 | + protected function _duplicate_attendee() |
|
| 3367 | + { |
|
| 3368 | + $action = ! empty($this->_req_data['return']) ? $this->_req_data['return'] : 'default'; |
|
| 3369 | + // verify we have necessary info |
|
| 3370 | + if (empty($this->_req_data['_REG_ID'])) { |
|
| 3371 | + EE_Error::add_error( |
|
| 3372 | + esc_html__( |
|
| 3373 | + 'Unable to create the contact for the registration because the required parameters are not present (_REG_ID )', |
|
| 3374 | + 'event_espresso' |
|
| 3375 | + ), |
|
| 3376 | + __FILE__, |
|
| 3377 | + __LINE__, |
|
| 3378 | + __FUNCTION__ |
|
| 3379 | + ); |
|
| 3380 | + $query_args = array('action' => $action); |
|
| 3381 | + $this->_redirect_after_action('', '', '', $query_args, true); |
|
| 3382 | + } |
|
| 3383 | + // okay necessary deets present... let's dupe the incoming attendee and attach to incoming registration. |
|
| 3384 | + $registration = $this->getRegistrationModel()->get_one_by_ID($this->_req_data['_REG_ID']); |
|
| 3385 | + $attendee = $registration->attendee(); |
|
| 3386 | + // remove relation of existing attendee on registration |
|
| 3387 | + $registration->_remove_relation_to($attendee, 'Attendee'); |
|
| 3388 | + // new attendee |
|
| 3389 | + $new_attendee = clone $attendee; |
|
| 3390 | + $new_attendee->set('ATT_ID', 0); |
|
| 3391 | + $new_attendee->save(); |
|
| 3392 | + // add new attendee to reg |
|
| 3393 | + $registration->_add_relation_to($new_attendee, 'Attendee'); |
|
| 3394 | + EE_Error::add_success( |
|
| 3395 | + esc_html__( |
|
| 3396 | + 'New Contact record created. Now make any edits you wish to make for this contact.', |
|
| 3397 | + 'event_espresso' |
|
| 3398 | + ) |
|
| 3399 | + ); |
|
| 3400 | + // redirect to edit page for attendee |
|
| 3401 | + $query_args = array('post' => $new_attendee->ID(), 'action' => 'edit_attendee'); |
|
| 3402 | + $this->_redirect_after_action('', '', '', $query_args, true); |
|
| 3403 | + } |
|
| 3404 | + |
|
| 3405 | + |
|
| 3406 | + /** |
|
| 3407 | + * Callback invoked by parent EE_Admin_CPT class hooked in on `save_post` wp hook. |
|
| 3408 | + * |
|
| 3409 | + * @param int $post_id |
|
| 3410 | + * @param WP_POST $post |
|
| 3411 | + * @throws DomainException |
|
| 3412 | + * @throws EE_Error |
|
| 3413 | + * @throws InvalidArgumentException |
|
| 3414 | + * @throws InvalidDataTypeException |
|
| 3415 | + * @throws InvalidInterfaceException |
|
| 3416 | + * @throws LogicException |
|
| 3417 | + * @throws InvalidFormSubmissionException |
|
| 3418 | + * @throws ReflectionException |
|
| 3419 | + */ |
|
| 3420 | + protected function _insert_update_cpt_item($post_id, $post) |
|
| 3421 | + { |
|
| 3422 | + $success = true; |
|
| 3423 | + $attendee = $post instanceof WP_Post && $post->post_type === 'espresso_attendees' |
|
| 3424 | + ? $this->getAttendeeModel()->get_one_by_ID($post_id) |
|
| 3425 | + : null; |
|
| 3426 | + // for attendee updates |
|
| 3427 | + if ($attendee instanceof EE_Attendee) { |
|
| 3428 | + // note we should only be UPDATING attendees at this point. |
|
| 3429 | + $updated_fields = array( |
|
| 3430 | + 'ATT_fname' => $this->_req_data['ATT_fname'], |
|
| 3431 | + 'ATT_lname' => $this->_req_data['ATT_lname'], |
|
| 3432 | + 'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'], |
|
| 3433 | + 'ATT_address' => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '', |
|
| 3434 | + 'ATT_address2' => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '', |
|
| 3435 | + 'ATT_city' => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '', |
|
| 3436 | + 'STA_ID' => isset($this->_req_data['STA_ID']) ? $this->_req_data['STA_ID'] : '', |
|
| 3437 | + 'CNT_ISO' => isset($this->_req_data['CNT_ISO']) ? $this->_req_data['CNT_ISO'] : '', |
|
| 3438 | + 'ATT_zip' => isset($this->_req_data['ATT_zip']) ? $this->_req_data['ATT_zip'] : '', |
|
| 3439 | + ); |
|
| 3440 | + foreach ($updated_fields as $field => $value) { |
|
| 3441 | + $attendee->set($field, $value); |
|
| 3442 | + } |
|
| 3443 | + |
|
| 3444 | + // process contact details metabox form handler (which will also save the attendee) |
|
| 3445 | + $contact_details_form = $this->getAttendeeContactDetailsMetaboxFormHandler($attendee); |
|
| 3446 | + $success = $contact_details_form->process($this->_req_data); |
|
| 3447 | + |
|
| 3448 | + $attendee_update_callbacks = apply_filters( |
|
| 3449 | + 'FHEE__Registrations_Admin_Page__insert_update_cpt_item__attendee_update', |
|
| 3450 | + array() |
|
| 3451 | + ); |
|
| 3452 | + foreach ($attendee_update_callbacks as $a_callback) { |
|
| 3453 | + if (false === call_user_func_array($a_callback, array($attendee, $this->_req_data))) { |
|
| 3454 | + throw new EE_Error( |
|
| 3455 | + sprintf( |
|
| 3456 | + esc_html__( |
|
| 3457 | + '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.', |
|
| 3458 | + 'event_espresso' |
|
| 3459 | + ), |
|
| 3460 | + $a_callback |
|
| 3461 | + ) |
|
| 3462 | + ); |
|
| 3463 | + } |
|
| 3464 | + } |
|
| 3465 | + } |
|
| 3466 | + |
|
| 3467 | + if ($success === false) { |
|
| 3468 | + EE_Error::add_error( |
|
| 3469 | + esc_html__( |
|
| 3470 | + 'Something went wrong with updating the meta table data for the registration.', |
|
| 3471 | + 'event_espresso' |
|
| 3472 | + ), |
|
| 3473 | + __FILE__, |
|
| 3474 | + __FUNCTION__, |
|
| 3475 | + __LINE__ |
|
| 3476 | + ); |
|
| 3477 | + } |
|
| 3478 | + } |
|
| 3479 | + |
|
| 3480 | + |
|
| 3481 | + public function trash_cpt_item($post_id) |
|
| 3482 | + { |
|
| 3483 | + } |
|
| 3484 | + |
|
| 3485 | + |
|
| 3486 | + public function delete_cpt_item($post_id) |
|
| 3487 | + { |
|
| 3488 | + } |
|
| 3489 | + |
|
| 3490 | + |
|
| 3491 | + public function restore_cpt_item($post_id) |
|
| 3492 | + { |
|
| 3493 | + } |
|
| 3494 | + |
|
| 3495 | + |
|
| 3496 | + protected function _restore_cpt_item($post_id, $revision_id) |
|
| 3497 | + { |
|
| 3498 | + } |
|
| 3499 | + |
|
| 3500 | + |
|
| 3501 | + /** |
|
| 3502 | + * @throws EE_Error |
|
| 3503 | + * @since $VID:$ |
|
| 3504 | + */ |
|
| 3505 | + public function attendee_editor_metaboxes() |
|
| 3506 | + { |
|
| 3507 | + $this->verify_cpt_object(); |
|
| 3508 | + remove_meta_box( |
|
| 3509 | + 'postexcerpt', |
|
| 3510 | + $this->_cpt_routes[ $this->_req_action ], |
|
| 3511 | + 'normal' |
|
| 3512 | + ); |
|
| 3513 | + remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core'); |
|
| 3514 | + if (post_type_supports('espresso_attendees', 'excerpt')) { |
|
| 3515 | + add_meta_box( |
|
| 3516 | + 'postexcerpt', |
|
| 3517 | + esc_html__('Short Biography', 'event_espresso'), |
|
| 3518 | + 'post_excerpt_meta_box', |
|
| 3519 | + $this->_cpt_routes[ $this->_req_action ], |
|
| 3520 | + 'normal' |
|
| 3521 | + ); |
|
| 3522 | + } |
|
| 3523 | + if (post_type_supports('espresso_attendees', 'comments')) { |
|
| 3524 | + add_meta_box( |
|
| 3525 | + 'commentsdiv', |
|
| 3526 | + esc_html__('Notes on the Contact', 'event_espresso'), |
|
| 3527 | + 'post_comment_meta_box', |
|
| 3528 | + $this->_cpt_routes[ $this->_req_action ], |
|
| 3529 | + 'normal', |
|
| 3530 | + 'core' |
|
| 3531 | + ); |
|
| 3532 | + } |
|
| 3533 | + add_meta_box( |
|
| 3534 | + 'attendee_contact_info', |
|
| 3535 | + esc_html__('Contact Info', 'event_espresso'), |
|
| 3536 | + array($this, 'attendee_contact_info'), |
|
| 3537 | + $this->_cpt_routes[ $this->_req_action ], |
|
| 3538 | + 'side', |
|
| 3539 | + 'core' |
|
| 3540 | + ); |
|
| 3541 | + add_meta_box( |
|
| 3542 | + 'attendee_details_address', |
|
| 3543 | + esc_html__('Address Details', 'event_espresso'), |
|
| 3544 | + array($this, 'attendee_address_details'), |
|
| 3545 | + $this->_cpt_routes[ $this->_req_action ], |
|
| 3546 | + 'normal', |
|
| 3547 | + 'core' |
|
| 3548 | + ); |
|
| 3549 | + add_meta_box( |
|
| 3550 | + 'attendee_registrations', |
|
| 3551 | + esc_html__('Registrations for this Contact', 'event_espresso'), |
|
| 3552 | + array($this, 'attendee_registrations_meta_box'), |
|
| 3553 | + $this->_cpt_routes[ $this->_req_action ], |
|
| 3554 | + 'normal', |
|
| 3555 | + 'high' |
|
| 3556 | + ); |
|
| 3557 | + } |
|
| 3558 | + |
|
| 3559 | + |
|
| 3560 | + /** |
|
| 3561 | + * Metabox for attendee contact info |
|
| 3562 | + * |
|
| 3563 | + * @param WP_Post $post wp post object |
|
| 3564 | + * @return string attendee contact info ( and form ) |
|
| 3565 | + * @throws EE_Error |
|
| 3566 | + * @throws InvalidArgumentException |
|
| 3567 | + * @throws InvalidDataTypeException |
|
| 3568 | + * @throws InvalidInterfaceException |
|
| 3569 | + * @throws LogicException |
|
| 3570 | + * @throws DomainException |
|
| 3571 | + */ |
|
| 3572 | + public function attendee_contact_info($post) |
|
| 3573 | + { |
|
| 3574 | + // get attendee object ( should already have it ) |
|
| 3575 | + $form = $this->getAttendeeContactDetailsMetaboxFormHandler($this->_cpt_model_obj); |
|
| 3576 | + $form->enqueueStylesAndScripts(); |
|
| 3577 | + echo $form->display(); |
|
| 3578 | + } |
|
| 3579 | + |
|
| 3580 | + |
|
| 3581 | + /** |
|
| 3582 | + * Return form handler for the contact details metabox |
|
| 3583 | + * |
|
| 3584 | + * @param EE_Attendee $attendee |
|
| 3585 | + * @return AttendeeContactDetailsMetaboxFormHandler |
|
| 3586 | + * @throws DomainException |
|
| 3587 | + * @throws InvalidArgumentException |
|
| 3588 | + * @throws InvalidDataTypeException |
|
| 3589 | + * @throws InvalidInterfaceException |
|
| 3590 | + */ |
|
| 3591 | + protected function getAttendeeContactDetailsMetaboxFormHandler(EE_Attendee $attendee) |
|
| 3592 | + { |
|
| 3593 | + return new AttendeeContactDetailsMetaboxFormHandler($attendee, EE_Registry::instance()); |
|
| 3594 | + } |
|
| 3595 | + |
|
| 3596 | + |
|
| 3597 | + /** |
|
| 3598 | + * Metabox for attendee details |
|
| 3599 | + * |
|
| 3600 | + * @param WP_Post $post wp post object |
|
| 3601 | + * @throws DomainException |
|
| 3602 | + */ |
|
| 3603 | + public function attendee_address_details($post) |
|
| 3604 | + { |
|
| 3605 | + // get attendee object (should already have it) |
|
| 3606 | + $this->_template_args['attendee'] = $this->_cpt_model_obj; |
|
| 3607 | + $this->_template_args['state_html'] = EEH_Form_Fields::generate_form_input( |
|
| 3608 | + new EE_Question_Form_Input( |
|
| 3609 | + EE_Question::new_instance( |
|
| 3610 | + array( |
|
| 3611 | + 'QST_ID' => 0, |
|
| 3612 | + 'QST_display_text' => esc_html__('State/Province', 'event_espresso'), |
|
| 3613 | + 'QST_system' => 'admin-state', |
|
| 3614 | + ) |
|
| 3615 | + ), |
|
| 3616 | + EE_Answer::new_instance( |
|
| 3617 | + array( |
|
| 3618 | + 'ANS_ID' => 0, |
|
| 3619 | + 'ANS_value' => $this->_cpt_model_obj->state_ID(), |
|
| 3620 | + ) |
|
| 3621 | + ), |
|
| 3622 | + array( |
|
| 3623 | + 'input_id' => 'STA_ID', |
|
| 3624 | + 'input_name' => 'STA_ID', |
|
| 3625 | + 'input_prefix' => '', |
|
| 3626 | + 'append_qstn_id' => false, |
|
| 3627 | + ) |
|
| 3628 | + ) |
|
| 3629 | + ); |
|
| 3630 | + $this->_template_args['country_html'] = EEH_Form_Fields::generate_form_input( |
|
| 3631 | + new EE_Question_Form_Input( |
|
| 3632 | + EE_Question::new_instance( |
|
| 3633 | + array( |
|
| 3634 | + 'QST_ID' => 0, |
|
| 3635 | + 'QST_display_text' => esc_html__('Country', 'event_espresso'), |
|
| 3636 | + 'QST_system' => 'admin-country', |
|
| 3637 | + ) |
|
| 3638 | + ), |
|
| 3639 | + EE_Answer::new_instance( |
|
| 3640 | + array( |
|
| 3641 | + 'ANS_ID' => 0, |
|
| 3642 | + 'ANS_value' => $this->_cpt_model_obj->country_ID(), |
|
| 3643 | + ) |
|
| 3644 | + ), |
|
| 3645 | + array( |
|
| 3646 | + 'input_id' => 'CNT_ISO', |
|
| 3647 | + 'input_name' => 'CNT_ISO', |
|
| 3648 | + 'input_prefix' => '', |
|
| 3649 | + 'append_qstn_id' => false, |
|
| 3650 | + ) |
|
| 3651 | + ) |
|
| 3652 | + ); |
|
| 3653 | + $template = |
|
| 3654 | + REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php'; |
|
| 3655 | + EEH_Template::display_template($template, $this->_template_args); |
|
| 3656 | + } |
|
| 3657 | + |
|
| 3658 | + |
|
| 3659 | + /** |
|
| 3660 | + * _attendee_details |
|
| 3661 | + * |
|
| 3662 | + * @access protected |
|
| 3663 | + * @param $post |
|
| 3664 | + * @return void |
|
| 3665 | + * @throws DomainException |
|
| 3666 | + * @throws EE_Error |
|
| 3667 | + * @throws InvalidArgumentException |
|
| 3668 | + * @throws InvalidDataTypeException |
|
| 3669 | + * @throws InvalidInterfaceException |
|
| 3670 | + * @throws ReflectionException |
|
| 3671 | + */ |
|
| 3672 | + public function attendee_registrations_meta_box($post) |
|
| 3673 | + { |
|
| 3674 | + $this->_template_args['attendee'] = $this->_cpt_model_obj; |
|
| 3675 | + $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration'); |
|
| 3676 | + $template = |
|
| 3677 | + REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php'; |
|
| 3678 | + EEH_Template::display_template($template, $this->_template_args); |
|
| 3679 | + } |
|
| 3680 | + |
|
| 3681 | + |
|
| 3682 | + /** |
|
| 3683 | + * add in the form fields for the attendee edit |
|
| 3684 | + * |
|
| 3685 | + * @param WP_Post $post wp post object |
|
| 3686 | + * @return string html for new form. |
|
| 3687 | + * @throws DomainException |
|
| 3688 | + */ |
|
| 3689 | + public function after_title_form_fields($post) |
|
| 3690 | + { |
|
| 3691 | + if ($post->post_type === 'espresso_attendees') { |
|
| 3692 | + $template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php'; |
|
| 3693 | + $template_args['attendee'] = $this->_cpt_model_obj; |
|
| 3694 | + EEH_Template::display_template($template, $template_args); |
|
| 3695 | + } |
|
| 3696 | + } |
|
| 3697 | + |
|
| 3698 | + |
|
| 3699 | + /** |
|
| 3700 | + * _trash_or_restore_attendee |
|
| 3701 | + * |
|
| 3702 | + * @param boolean $trash - whether to move item to trash (TRUE) or restore it (FALSE) |
|
| 3703 | + * @return void |
|
| 3704 | + * @throws EE_Error |
|
| 3705 | + * @throws InvalidArgumentException |
|
| 3706 | + * @throws InvalidDataTypeException |
|
| 3707 | + * @throws InvalidInterfaceException |
|
| 3708 | + * @throws ReflectionException |
|
| 3709 | + * @access protected |
|
| 3710 | + */ |
|
| 3711 | + protected function _trash_or_restore_attendees($trash = true) |
|
| 3712 | + { |
|
| 3713 | + do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
|
| 3714 | + $success = 1; |
|
| 3715 | + // Checkboxes |
|
| 3716 | + if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
| 3717 | + // if array has more than one element than success message should be plural |
|
| 3718 | + $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1; |
|
| 3719 | + // cycle thru checkboxes |
|
| 3720 | + foreach ($this->_req_data['checkbox'] as $ATT_ID) { |
|
| 3721 | + $updated = $trash ? $this->getAttendeeModel()->update_by_ID(array('status' => 'trash'), $ATT_ID) |
|
| 3722 | + : $this->getAttendeeModel()->update_by_ID(array('status' => 'publish'), $ATT_ID); |
|
| 3723 | + if (! $updated) { |
|
| 3724 | + $success = 0; |
|
| 3725 | + } |
|
| 3726 | + } |
|
| 3727 | + } else { |
|
| 3728 | + // grab single id and delete |
|
| 3729 | + $ATT_ID = absint($this->_req_data['ATT_ID']); |
|
| 3730 | + // get attendee |
|
| 3731 | + $att = $this->getAttendeeModel()->get_one_by_ID($ATT_ID); |
|
| 3732 | + $updated = $trash ? $att->set_status('trash') : $att->set_status('publish'); |
|
| 3733 | + $updated = $att->save() && $updated; |
|
| 3734 | + if (! $updated) { |
|
| 3735 | + $success = 0; |
|
| 3736 | + } |
|
| 3737 | + } |
|
| 3738 | + $what = $success > 1 |
|
| 3739 | + ? esc_html__('Contacts', 'event_espresso') |
|
| 3740 | + : esc_html__('Contact', 'event_espresso'); |
|
| 3741 | + $action_desc = $trash |
|
| 3742 | + ? esc_html__('moved to the trash', 'event_espresso') |
|
| 3743 | + : esc_html__('restored', 'event_espresso'); |
|
| 3744 | + $this->_redirect_after_action($success, $what, $action_desc, array('action' => 'contact_list')); |
|
| 3745 | + } |
|
| 3746 | 3746 | } |
@@ -87,7 +87,7 @@ discard block |
||
| 87 | 87 | */ |
| 88 | 88 | protected function getRegistrationModel() |
| 89 | 89 | { |
| 90 | - if (! $this->registration_model instanceof EEM_Registration) { |
|
| 90 | + if ( ! $this->registration_model instanceof EEM_Registration) { |
|
| 91 | 91 | $this->registration_model = $this->loader->getShared('EEM_Registration'); |
| 92 | 92 | } |
| 93 | 93 | return $this->registration_model; |
@@ -102,7 +102,7 @@ discard block |
||
| 102 | 102 | */ |
| 103 | 103 | protected function getAttendeeModel() |
| 104 | 104 | { |
| 105 | - if (! $this->attendee_model instanceof EEM_Attendee) { |
|
| 105 | + if ( ! $this->attendee_model instanceof EEM_Attendee) { |
|
| 106 | 106 | $this->attendee_model = $this->loader->getShared('EEM_Attendee'); |
| 107 | 107 | } |
| 108 | 108 | return $this->attendee_model; |
@@ -118,7 +118,7 @@ discard block |
||
| 118 | 118 | */ |
| 119 | 119 | protected function getEventModel() |
| 120 | 120 | { |
| 121 | - if (! $this->event_model instanceof EEM_Event) { |
|
| 121 | + if ( ! $this->event_model instanceof EEM_Event) { |
|
| 122 | 122 | $this->event_model = $this->loader->getShared('EEM_Event'); |
| 123 | 123 | } |
| 124 | 124 | return $this->event_model; |
@@ -133,7 +133,7 @@ discard block |
||
| 133 | 133 | */ |
| 134 | 134 | protected function getStatusModel() |
| 135 | 135 | { |
| 136 | - if (! $this->status_model instanceof EEM_Status) { |
|
| 136 | + if ( ! $this->status_model instanceof EEM_Status) { |
|
| 137 | 137 | $this->status_model = $this->loader->getShared('EEM_Status'); |
| 138 | 138 | } |
| 139 | 139 | return $this->status_model; |
@@ -145,7 +145,7 @@ discard block |
||
| 145 | 145 | // when adding a new registration... |
| 146 | 146 | if (isset($this->_req_data['action']) && $this->_req_data['action'] === 'new_registration') { |
| 147 | 147 | EE_System::do_not_cache(); |
| 148 | - if (! isset($this->_req_data['processing_registration']) |
|
| 148 | + if ( ! isset($this->_req_data['processing_registration']) |
|
| 149 | 149 | || absint($this->_req_data['processing_registration']) !== 1 |
| 150 | 150 | ) { |
| 151 | 151 | // and it's NOT the attendee information reg step |
@@ -751,7 +751,7 @@ discard block |
||
| 751 | 751 | // style |
| 752 | 752 | wp_register_style( |
| 753 | 753 | 'espresso_reg', |
| 754 | - REG_ASSETS_URL . 'espresso_registrations_admin.css', |
|
| 754 | + REG_ASSETS_URL.'espresso_registrations_admin.css', |
|
| 755 | 755 | array('ee-admin-css'), |
| 756 | 756 | EVENT_ESPRESSO_VERSION |
| 757 | 757 | ); |
@@ -759,7 +759,7 @@ discard block |
||
| 759 | 759 | // script |
| 760 | 760 | wp_register_script( |
| 761 | 761 | 'espresso_reg', |
| 762 | - REG_ASSETS_URL . 'espresso_registrations_admin.js', |
|
| 762 | + REG_ASSETS_URL.'espresso_registrations_admin.js', |
|
| 763 | 763 | array('jquery-ui-datepicker', 'jquery-ui-draggable', 'ee_admin_js'), |
| 764 | 764 | EVENT_ESPRESSO_VERSION, |
| 765 | 765 | true |
@@ -783,7 +783,7 @@ discard block |
||
| 783 | 783 | 'att_publish_text' => sprintf( |
| 784 | 784 | /* translators: The date and time */ |
| 785 | 785 | wp_strip_all_tags(__('Created on: %s', 'event_espresso')), |
| 786 | - '<b>' . $this->_cpt_model_obj->get_datetime('ATT_created') . '</b>' |
|
| 786 | + '<b>'.$this->_cpt_model_obj->get_datetime('ATT_created').'</b>' |
|
| 787 | 787 | ), |
| 788 | 788 | ); |
| 789 | 789 | wp_localize_script('espresso_reg', 'ATTENDEE_DETAILS', $attendee_details_translations); |
@@ -814,7 +814,7 @@ discard block |
||
| 814 | 814 | wp_dequeue_style('espresso_reg'); |
| 815 | 815 | wp_register_style( |
| 816 | 816 | 'espresso_att', |
| 817 | - REG_ASSETS_URL . 'espresso_attendees_admin.css', |
|
| 817 | + REG_ASSETS_URL.'espresso_attendees_admin.css', |
|
| 818 | 818 | array('ee-admin-css'), |
| 819 | 819 | EVENT_ESPRESSO_VERSION |
| 820 | 820 | ); |
@@ -826,7 +826,7 @@ discard block |
||
| 826 | 826 | { |
| 827 | 827 | wp_register_script( |
| 828 | 828 | 'ee-spco-for-admin', |
| 829 | - REG_ASSETS_URL . 'spco_for_admin.js', |
|
| 829 | + REG_ASSETS_URL.'spco_for_admin.js', |
|
| 830 | 830 | array('underscore', 'jquery'), |
| 831 | 831 | EVENT_ESPRESSO_VERSION, |
| 832 | 832 | true |
@@ -1068,7 +1068,7 @@ discard block |
||
| 1068 | 1068 | } |
| 1069 | 1069 | $sc_items = array( |
| 1070 | 1070 | 'approved_status' => array( |
| 1071 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_approved, |
|
| 1071 | + 'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_approved, |
|
| 1072 | 1072 | 'desc' => EEH_Template::pretty_status( |
| 1073 | 1073 | EEM_Registration::status_id_approved, |
| 1074 | 1074 | false, |
@@ -1076,7 +1076,7 @@ discard block |
||
| 1076 | 1076 | ), |
| 1077 | 1077 | ), |
| 1078 | 1078 | 'pending_status' => array( |
| 1079 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_pending_payment, |
|
| 1079 | + 'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_pending_payment, |
|
| 1080 | 1080 | 'desc' => EEH_Template::pretty_status( |
| 1081 | 1081 | EEM_Registration::status_id_pending_payment, |
| 1082 | 1082 | false, |
@@ -1084,7 +1084,7 @@ discard block |
||
| 1084 | 1084 | ), |
| 1085 | 1085 | ), |
| 1086 | 1086 | 'wait_list' => array( |
| 1087 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_wait_list, |
|
| 1087 | + 'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_wait_list, |
|
| 1088 | 1088 | 'desc' => EEH_Template::pretty_status( |
| 1089 | 1089 | EEM_Registration::status_id_wait_list, |
| 1090 | 1090 | false, |
@@ -1092,7 +1092,7 @@ discard block |
||
| 1092 | 1092 | ), |
| 1093 | 1093 | ), |
| 1094 | 1094 | 'incomplete_status' => array( |
| 1095 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_incomplete, |
|
| 1095 | + 'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_incomplete, |
|
| 1096 | 1096 | 'desc' => EEH_Template::pretty_status( |
| 1097 | 1097 | EEM_Registration::status_id_incomplete, |
| 1098 | 1098 | false, |
@@ -1100,7 +1100,7 @@ discard block |
||
| 1100 | 1100 | ), |
| 1101 | 1101 | ), |
| 1102 | 1102 | 'not_approved' => array( |
| 1103 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_not_approved, |
|
| 1103 | + 'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_not_approved, |
|
| 1104 | 1104 | 'desc' => EEH_Template::pretty_status( |
| 1105 | 1105 | EEM_Registration::status_id_not_approved, |
| 1106 | 1106 | false, |
@@ -1108,7 +1108,7 @@ discard block |
||
| 1108 | 1108 | ), |
| 1109 | 1109 | ), |
| 1110 | 1110 | 'declined_status' => array( |
| 1111 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_declined, |
|
| 1111 | + 'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_declined, |
|
| 1112 | 1112 | 'desc' => EEH_Template::pretty_status( |
| 1113 | 1113 | EEM_Registration::status_id_declined, |
| 1114 | 1114 | false, |
@@ -1116,7 +1116,7 @@ discard block |
||
| 1116 | 1116 | ), |
| 1117 | 1117 | ), |
| 1118 | 1118 | 'cancelled_status' => array( |
| 1119 | - 'class' => 'ee-status-legend ee-status-legend-' . EEM_Registration::status_id_cancelled, |
|
| 1119 | + 'class' => 'ee-status-legend ee-status-legend-'.EEM_Registration::status_id_cancelled, |
|
| 1120 | 1120 | 'desc' => EEH_Template::pretty_status( |
| 1121 | 1121 | EEM_Registration::status_id_cancelled, |
| 1122 | 1122 | false, |
@@ -1179,7 +1179,7 @@ discard block |
||
| 1179 | 1179 | $EVT_ID |
| 1180 | 1180 | ) |
| 1181 | 1181 | ) { |
| 1182 | - $this->_admin_page_title .= ' ' . $this->get_action_link_or_button( |
|
| 1182 | + $this->_admin_page_title .= ' '.$this->get_action_link_or_button( |
|
| 1183 | 1183 | 'new_registration', |
| 1184 | 1184 | 'add-registrant', |
| 1185 | 1185 | array('event_id' => $EVT_ID), |
@@ -1205,7 +1205,7 @@ discard block |
||
| 1205 | 1205 | if ($this->_registration instanceof EE_Registration) { |
| 1206 | 1206 | return true; |
| 1207 | 1207 | } |
| 1208 | - $REG_ID = (! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false; |
|
| 1208 | + $REG_ID = ( ! empty($this->_req_data['_REG_ID'])) ? absint($this->_req_data['_REG_ID']) : false; |
|
| 1209 | 1209 | if ($this->_registration = $this->getRegistrationModel()->get_one_by_ID($REG_ID)) { |
| 1210 | 1210 | return true; |
| 1211 | 1211 | } |
@@ -1286,7 +1286,7 @@ discard block |
||
| 1286 | 1286 | /** @var EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder $list_table_query_builder */ |
| 1287 | 1287 | $list_table_query_builder = $this->loader->getNew( |
| 1288 | 1288 | 'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder', |
| 1289 | - [ $request ] |
|
| 1289 | + [$request] |
|
| 1290 | 1290 | ); |
| 1291 | 1291 | return $list_table_query_builder->getQueryParams($per_page, $count); |
| 1292 | 1292 | } |
@@ -1392,7 +1392,7 @@ discard block |
||
| 1392 | 1392 | ) |
| 1393 | 1393 | : ''; |
| 1394 | 1394 | // grab header |
| 1395 | - $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_header.template.php'; |
|
| 1395 | + $template_path = REG_TEMPLATE_PATH.'reg_admin_details_header.template.php'; |
|
| 1396 | 1396 | $this->_template_args['REG_ID'] = $this->_registration->ID(); |
| 1397 | 1397 | $this->_template_args['admin_page_header'] = EEH_Template::display_template( |
| 1398 | 1398 | $template_path, |
@@ -1544,7 +1544,7 @@ discard block |
||
| 1544 | 1544 | EEH_HTML::strong( |
| 1545 | 1545 | $this->_registration->pretty_status(), |
| 1546 | 1546 | '', |
| 1547 | - 'status-' . $this->_registration->status_ID(), |
|
| 1547 | + 'status-'.$this->_registration->status_ID(), |
|
| 1548 | 1548 | 'line-height: 1em; font-size: 1.5em; font-weight: bold;' |
| 1549 | 1549 | ) |
| 1550 | 1550 | ) |
@@ -1600,14 +1600,14 @@ discard block |
||
| 1600 | 1600 | protected function _get_reg_statuses() |
| 1601 | 1601 | { |
| 1602 | 1602 | $reg_status_array = $this->getRegistrationModel()->reg_status_array(); |
| 1603 | - unset($reg_status_array[ EEM_Registration::status_id_incomplete ]); |
|
| 1603 | + unset($reg_status_array[EEM_Registration::status_id_incomplete]); |
|
| 1604 | 1604 | // get current reg status |
| 1605 | 1605 | $current_status = $this->_registration->status_ID(); |
| 1606 | 1606 | // is registration for free event? This will determine whether to display the pending payment option |
| 1607 | 1607 | if ($current_status !== EEM_Registration::status_id_pending_payment |
| 1608 | 1608 | && EEH_Money::compare_floats($this->_registration->ticket()->price(), 0.00) |
| 1609 | 1609 | ) { |
| 1610 | - unset($reg_status_array[ EEM_Registration::status_id_pending_payment ]); |
|
| 1610 | + unset($reg_status_array[EEM_Registration::status_id_pending_payment]); |
|
| 1611 | 1611 | } |
| 1612 | 1612 | return $this->getStatusModel()->localized_status($reg_status_array, false, 'sentence'); |
| 1613 | 1613 | } |
@@ -1701,7 +1701,7 @@ discard block |
||
| 1701 | 1701 | $success = false; |
| 1702 | 1702 | // typecast $REG_IDs |
| 1703 | 1703 | $REG_IDs = (array) $REG_IDs; |
| 1704 | - if (! empty($REG_IDs)) { |
|
| 1704 | + if ( ! empty($REG_IDs)) { |
|
| 1705 | 1705 | $success = true; |
| 1706 | 1706 | // set default status if none is passed |
| 1707 | 1707 | $status = $status ? $status : EEM_Registration::status_id_pending_payment; |
@@ -1864,7 +1864,7 @@ discard block |
||
| 1864 | 1864 | $action, |
| 1865 | 1865 | $notify |
| 1866 | 1866 | ); |
| 1867 | - $method = $action . '_registration'; |
|
| 1867 | + $method = $action.'_registration'; |
|
| 1868 | 1868 | if (method_exists($this, $method)) { |
| 1869 | 1869 | $this->$method($notify); |
| 1870 | 1870 | } |
@@ -2143,7 +2143,7 @@ discard block |
||
| 2143 | 2143 | $this->_template_args['REG_ID'] = $this->_registration->ID(); |
| 2144 | 2144 | $this->_template_args['event_id'] = $this->_registration->event_ID(); |
| 2145 | 2145 | $template_path = |
| 2146 | - REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_details.template.php'; |
|
| 2146 | + REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_details.template.php'; |
|
| 2147 | 2147 | echo EEH_Template::display_template($template_path, $this->_template_args, true); |
| 2148 | 2148 | } |
| 2149 | 2149 | |
@@ -2180,7 +2180,7 @@ discard block |
||
| 2180 | 2180 | $this->_template_args['reg_questions_form_action'] = 'edit_registration'; |
| 2181 | 2181 | $this->_template_args['REG_ID'] = $this->_registration->ID(); |
| 2182 | 2182 | $template_path = |
| 2183 | - REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_reg_questions.template.php'; |
|
| 2183 | + REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_reg_questions.template.php'; |
|
| 2184 | 2184 | echo EEH_Template::display_template($template_path, $this->_template_args, true); |
| 2185 | 2185 | } |
| 2186 | 2186 | } |
@@ -2197,7 +2197,7 @@ discard block |
||
| 2197 | 2197 | public function form_before_question_group($output) |
| 2198 | 2198 | { |
| 2199 | 2199 | EE_Error::doing_it_wrong( |
| 2200 | - __CLASS__ . '::' . __FUNCTION__, |
|
| 2200 | + __CLASS__.'::'.__FUNCTION__, |
|
| 2201 | 2201 | esc_html__( |
| 2202 | 2202 | 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
| 2203 | 2203 | 'event_espresso' |
@@ -2222,7 +2222,7 @@ discard block |
||
| 2222 | 2222 | public function form_after_question_group($output) |
| 2223 | 2223 | { |
| 2224 | 2224 | EE_Error::doing_it_wrong( |
| 2225 | - __CLASS__ . '::' . __FUNCTION__, |
|
| 2225 | + __CLASS__.'::'.__FUNCTION__, |
|
| 2226 | 2226 | esc_html__( |
| 2227 | 2227 | 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
| 2228 | 2228 | 'event_espresso' |
@@ -2260,7 +2260,7 @@ discard block |
||
| 2260 | 2260 | public function form_form_field_label_wrap($label) |
| 2261 | 2261 | { |
| 2262 | 2262 | EE_Error::doing_it_wrong( |
| 2263 | - __CLASS__ . '::' . __FUNCTION__, |
|
| 2263 | + __CLASS__.'::'.__FUNCTION__, |
|
| 2264 | 2264 | esc_html__( |
| 2265 | 2265 | 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
| 2266 | 2266 | 'event_espresso' |
@@ -2270,7 +2270,7 @@ discard block |
||
| 2270 | 2270 | return ' |
| 2271 | 2271 | <tr> |
| 2272 | 2272 | <th> |
| 2273 | - ' . $label . ' |
|
| 2273 | + ' . $label.' |
|
| 2274 | 2274 | </th>'; |
| 2275 | 2275 | } |
| 2276 | 2276 | |
@@ -2286,7 +2286,7 @@ discard block |
||
| 2286 | 2286 | public function form_form_field_input__wrap($input) |
| 2287 | 2287 | { |
| 2288 | 2288 | EE_Error::doing_it_wrong( |
| 2289 | - __CLASS__ . '::' . __FUNCTION__, |
|
| 2289 | + __CLASS__.'::'.__FUNCTION__, |
|
| 2290 | 2290 | esc_html__( |
| 2291 | 2291 | 'This method would have been protected but was used on a filter callback so needed to be public. Please discontinue usage as it will be removed soon.', |
| 2292 | 2292 | 'event_espresso' |
@@ -2295,7 +2295,7 @@ discard block |
||
| 2295 | 2295 | ); |
| 2296 | 2296 | return ' |
| 2297 | 2297 | <td class="reg-admin-attendee-questions-input-td disabled-input"> |
| 2298 | - ' . $input . ' |
|
| 2298 | + ' . $input.' |
|
| 2299 | 2299 | </td> |
| 2300 | 2300 | </tr>'; |
| 2301 | 2301 | } |
@@ -2343,8 +2343,8 @@ discard block |
||
| 2343 | 2343 | */ |
| 2344 | 2344 | protected function _get_reg_custom_questions_form($REG_ID) |
| 2345 | 2345 | { |
| 2346 | - if (! $this->_reg_custom_questions_form) { |
|
| 2347 | - require_once(REG_ADMIN . 'form_sections/EE_Registration_Custom_Questions_Form.form.php'); |
|
| 2346 | + if ( ! $this->_reg_custom_questions_form) { |
|
| 2347 | + require_once(REG_ADMIN.'form_sections/EE_Registration_Custom_Questions_Form.form.php'); |
|
| 2348 | 2348 | $this->_reg_custom_questions_form = new EE_Registration_Custom_Questions_Form( |
| 2349 | 2349 | $this->getRegistrationModel()->get_one_by_ID($REG_ID) |
| 2350 | 2350 | ); |
@@ -2368,7 +2368,7 @@ discard block |
||
| 2368 | 2368 | */ |
| 2369 | 2369 | private function _save_reg_custom_questions_form($REG_ID = false) |
| 2370 | 2370 | { |
| 2371 | - if (! $REG_ID) { |
|
| 2371 | + if ( ! $REG_ID) { |
|
| 2372 | 2372 | EE_Error::add_error( |
| 2373 | 2373 | esc_html__( |
| 2374 | 2374 | 'An error occurred. No registration ID was received.', |
@@ -2460,30 +2460,30 @@ discard block |
||
| 2460 | 2460 | $attendee = $registration->attendee() |
| 2461 | 2461 | ? $registration->attendee() |
| 2462 | 2462 | : $this->getAttendeeModel()->create_default_object(); |
| 2463 | - $this->_template_args['attendees'][ $att_nmbr ]['STS_ID'] = $registration->status_ID(); |
|
| 2464 | - $this->_template_args['attendees'][ $att_nmbr ]['fname'] = $attendee->fname(); |
|
| 2465 | - $this->_template_args['attendees'][ $att_nmbr ]['lname'] = $attendee->lname(); |
|
| 2466 | - $this->_template_args['attendees'][ $att_nmbr ]['email'] = $attendee->email(); |
|
| 2467 | - $this->_template_args['attendees'][ $att_nmbr ]['final_price'] = $registration->final_price(); |
|
| 2468 | - $this->_template_args['attendees'][ $att_nmbr ]['address'] = implode( |
|
| 2463 | + $this->_template_args['attendees'][$att_nmbr]['STS_ID'] = $registration->status_ID(); |
|
| 2464 | + $this->_template_args['attendees'][$att_nmbr]['fname'] = $attendee->fname(); |
|
| 2465 | + $this->_template_args['attendees'][$att_nmbr]['lname'] = $attendee->lname(); |
|
| 2466 | + $this->_template_args['attendees'][$att_nmbr]['email'] = $attendee->email(); |
|
| 2467 | + $this->_template_args['attendees'][$att_nmbr]['final_price'] = $registration->final_price(); |
|
| 2468 | + $this->_template_args['attendees'][$att_nmbr]['address'] = implode( |
|
| 2469 | 2469 | ', ', |
| 2470 | 2470 | $attendee->full_address_as_array() |
| 2471 | 2471 | ); |
| 2472 | - $this->_template_args['attendees'][ $att_nmbr ]['att_link'] = self::add_query_args_and_nonce( |
|
| 2472 | + $this->_template_args['attendees'][$att_nmbr]['att_link'] = self::add_query_args_and_nonce( |
|
| 2473 | 2473 | array( |
| 2474 | 2474 | 'action' => 'edit_attendee', |
| 2475 | 2475 | 'post' => $attendee->ID(), |
| 2476 | 2476 | ), |
| 2477 | 2477 | REG_ADMIN_URL |
| 2478 | 2478 | ); |
| 2479 | - $this->_template_args['attendees'][ $att_nmbr ]['event_name'] = $registration->event_obj() instanceof EE_Event |
|
| 2479 | + $this->_template_args['attendees'][$att_nmbr]['event_name'] = $registration->event_obj() instanceof EE_Event |
|
| 2480 | 2480 | ? $registration->event_obj()->name() |
| 2481 | 2481 | : ''; |
| 2482 | 2482 | $att_nmbr++; |
| 2483 | 2483 | } |
| 2484 | 2484 | $this->_template_args['currency_sign'] = EE_Registry::instance()->CFG->currency->sign; |
| 2485 | 2485 | } |
| 2486 | - $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_main_meta_box_attendees.template.php'; |
|
| 2486 | + $template_path = REG_TEMPLATE_PATH.'reg_admin_details_main_meta_box_attendees.template.php'; |
|
| 2487 | 2487 | echo EEH_Template::display_template($template_path, $this->_template_args, true); |
| 2488 | 2488 | } |
| 2489 | 2489 | |
@@ -2510,11 +2510,11 @@ discard block |
||
| 2510 | 2510 | // now let's determine if this is not the primary registration. If it isn't then we set the |
| 2511 | 2511 | // primary_registration object for reference BUT ONLY if the Attendee object loaded is not the same as the |
| 2512 | 2512 | // primary registration object (that way we know if we need to show create button or not) |
| 2513 | - if (! $this->_registration->is_primary_registrant()) { |
|
| 2513 | + if ( ! $this->_registration->is_primary_registrant()) { |
|
| 2514 | 2514 | $primary_registration = $this->_registration->get_primary_registration(); |
| 2515 | 2515 | $primary_attendee = $primary_registration instanceof EE_Registration ? $primary_registration->attendee() |
| 2516 | 2516 | : null; |
| 2517 | - if (! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) { |
|
| 2517 | + if ( ! $primary_attendee instanceof EE_Attendee || $attendee->ID() !== $primary_attendee->ID()) { |
|
| 2518 | 2518 | // in here? This means the displayed registration is not the primary registrant but ALREADY HAS its own |
| 2519 | 2519 | // custom attendee object so let's not worry about the primary reg. |
| 2520 | 2520 | $primary_registration = null; |
@@ -2548,7 +2548,7 @@ discard block |
||
| 2548 | 2548 | ) : ''; |
| 2549 | 2549 | $this->_template_args['create_label'] = esc_html__('Create Contact', 'event_espresso'); |
| 2550 | 2550 | $this->_template_args['att_check'] = $att_check; |
| 2551 | - $template_path = REG_TEMPLATE_PATH . 'reg_admin_details_side_meta_box_registrant.template.php'; |
|
| 2551 | + $template_path = REG_TEMPLATE_PATH.'reg_admin_details_side_meta_box_registrant.template.php'; |
|
| 2552 | 2552 | echo EEH_Template::display_template($template_path, $this->_template_args, true); |
| 2553 | 2553 | } |
| 2554 | 2554 | |
@@ -2586,7 +2586,7 @@ discard block |
||
| 2586 | 2586 | $success = 0; |
| 2587 | 2587 | $overwrite_msgs = false; |
| 2588 | 2588 | // Checkboxes |
| 2589 | - if (! is_array($this->_req_data['_REG_ID'])) { |
|
| 2589 | + if ( ! is_array($this->_req_data['_REG_ID'])) { |
|
| 2590 | 2590 | $this->_req_data['_REG_ID'] = array($this->_req_data['_REG_ID']); |
| 2591 | 2591 | } |
| 2592 | 2592 | $reg_count = count($this->_req_data['_REG_ID']); |
@@ -2595,7 +2595,7 @@ discard block |
||
| 2595 | 2595 | /** @var EE_Registration $REG */ |
| 2596 | 2596 | $REG = $this->getRegistrationModel()->get_one_by_ID($REG_ID); |
| 2597 | 2597 | $payments = $REG->registration_payments(); |
| 2598 | - if (! empty($payments)) { |
|
| 2598 | + if ( ! empty($payments)) { |
|
| 2599 | 2599 | $name = $REG->attendee() instanceof EE_Attendee |
| 2600 | 2600 | ? $REG->attendee()->full_name() |
| 2601 | 2601 | : esc_html__('Unknown Attendee', 'event_espresso'); |
@@ -2657,17 +2657,17 @@ discard block |
||
| 2657 | 2657 | $REG_MDL = $this->getRegistrationModel(); |
| 2658 | 2658 | $success = 1; |
| 2659 | 2659 | // Checkboxes |
| 2660 | - if (! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) { |
|
| 2660 | + if ( ! empty($this->_req_data['_REG_ID']) && is_array($this->_req_data['_REG_ID'])) { |
|
| 2661 | 2661 | // if array has more than one element than success message should be plural |
| 2662 | 2662 | $success = count($this->_req_data['_REG_ID']) > 1 ? 2 : 1; |
| 2663 | 2663 | // cycle thru checkboxes |
| 2664 | 2664 | foreach ($this->_req_data['_REG_ID'] as $REG_ID) { |
| 2665 | 2665 | $REG = $REG_MDL->get_one_by_ID($REG_ID); |
| 2666 | - if (! $REG instanceof EE_Registration) { |
|
| 2666 | + if ( ! $REG instanceof EE_Registration) { |
|
| 2667 | 2667 | continue; |
| 2668 | 2668 | } |
| 2669 | 2669 | $deleted = $this->_delete_registration($REG); |
| 2670 | - if (! $deleted) { |
|
| 2670 | + if ( ! $deleted) { |
|
| 2671 | 2671 | $success = 0; |
| 2672 | 2672 | } |
| 2673 | 2673 | } |
@@ -2677,7 +2677,7 @@ discard block |
||
| 2677 | 2677 | /** @var EE_Registration $REG */ |
| 2678 | 2678 | $REG = $REG_MDL->get_one_by_ID($REG_ID); |
| 2679 | 2679 | $deleted = $this->_delete_registration($REG); |
| 2680 | - if (! $deleted) { |
|
| 2680 | + if ( ! $deleted) { |
|
| 2681 | 2681 | $success = 0; |
| 2682 | 2682 | } |
| 2683 | 2683 | } |
@@ -2715,11 +2715,11 @@ discard block |
||
| 2715 | 2715 | $REGS = $TXN->get_many_related('Registration'); |
| 2716 | 2716 | $all_trashed = true; |
| 2717 | 2717 | foreach ($REGS as $registration) { |
| 2718 | - if (! $registration->get('REG_deleted')) { |
|
| 2718 | + if ( ! $registration->get('REG_deleted')) { |
|
| 2719 | 2719 | $all_trashed = false; |
| 2720 | 2720 | } |
| 2721 | 2721 | } |
| 2722 | - if (! $all_trashed) { |
|
| 2722 | + if ( ! $all_trashed) { |
|
| 2723 | 2723 | EE_Error::add_error( |
| 2724 | 2724 | esc_html__( |
| 2725 | 2725 | '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.', |
@@ -2782,7 +2782,7 @@ discard block |
||
| 2782 | 2782 | */ |
| 2783 | 2783 | public function new_registration() |
| 2784 | 2784 | { |
| 2785 | - if (! $this->_set_reg_event()) { |
|
| 2785 | + if ( ! $this->_set_reg_event()) { |
|
| 2786 | 2786 | throw new EE_Error( |
| 2787 | 2787 | esc_html__( |
| 2788 | 2788 | 'Unable to continue with registering because there is no Event ID in the request', |
@@ -2792,8 +2792,8 @@ discard block |
||
| 2792 | 2792 | } |
| 2793 | 2793 | EE_Registry::instance()->REQ->set_espresso_page(true); |
| 2794 | 2794 | // gotta start with a clean slate if we're not coming here via ajax |
| 2795 | - if (! defined('DOING_AJAX') |
|
| 2796 | - && (! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error'])) |
|
| 2795 | + if ( ! defined('DOING_AJAX') |
|
| 2796 | + && ( ! isset($this->_req_data['processing_registration']) || isset($this->_req_data['step_error'])) |
|
| 2797 | 2797 | ) { |
| 2798 | 2798 | EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
| 2799 | 2799 | } |
@@ -2826,7 +2826,7 @@ discard block |
||
| 2826 | 2826 | } |
| 2827 | 2827 | // grab header |
| 2828 | 2828 | $template_path = |
| 2829 | - REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee.template.php'; |
|
| 2829 | + REG_TEMPLATE_PATH.'reg_admin_register_new_attendee.template.php'; |
|
| 2830 | 2830 | $this->_template_args['admin_page_content'] = EEH_Template::display_template( |
| 2831 | 2831 | $template_path, |
| 2832 | 2832 | $this->_template_args, |
@@ -2867,7 +2867,7 @@ discard block |
||
| 2867 | 2867 | '</b>' |
| 2868 | 2868 | ); |
| 2869 | 2869 | return ' |
| 2870 | - <div id="ee-add-reg-back-button-dv"><p>' . $warning_msg . '</p></div> |
|
| 2870 | + <div id="ee-add-reg-back-button-dv"><p>' . $warning_msg.'</p></div> |
|
| 2871 | 2871 | <script > |
| 2872 | 2872 | // WHOAH !!! it appears that someone is using the back button from the Transaction admin page |
| 2873 | 2873 | // after just adding a new registration... we gotta try to put a stop to that !!! |
@@ -2936,7 +2936,7 @@ discard block |
||
| 2936 | 2936 | // we come back to the process_registration_step route. |
| 2937 | 2937 | $this->_set_add_edit_form_tags('process_reg_step', $hidden_fields); |
| 2938 | 2938 | return EEH_Template::display_template( |
| 2939 | - REG_TEMPLATE_PATH . 'reg_admin_register_new_attendee_step_content.template.php', |
|
| 2939 | + REG_TEMPLATE_PATH.'reg_admin_register_new_attendee_step_content.template.php', |
|
| 2940 | 2940 | $template_args, |
| 2941 | 2941 | true |
| 2942 | 2942 | ); |
@@ -2958,8 +2958,8 @@ discard block |
||
| 2958 | 2958 | if (is_object($this->_reg_event)) { |
| 2959 | 2959 | return true; |
| 2960 | 2960 | } |
| 2961 | - $EVT_ID = (! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false; |
|
| 2962 | - if (! $EVT_ID) { |
|
| 2961 | + $EVT_ID = ( ! empty($this->_req_data['event_id'])) ? absint($this->_req_data['event_id']) : false; |
|
| 2962 | + if ( ! $EVT_ID) { |
|
| 2963 | 2963 | return false; |
| 2964 | 2964 | } |
| 2965 | 2965 | $this->_reg_event = $this->getEventModel()->get_one_by_ID($EVT_ID); |
@@ -2991,8 +2991,8 @@ discard block |
||
| 2991 | 2991 | $step = ! $cart instanceof EE_Cart ? 'ticket' : 'questions'; |
| 2992 | 2992 | // if doing ajax then we need to verify the nonce |
| 2993 | 2993 | if (defined('DOING_AJAX')) { |
| 2994 | - $nonce = isset($this->_req_data[ $this->_req_nonce ]) |
|
| 2995 | - ? sanitize_text_field($this->_req_data[ $this->_req_nonce ]) : ''; |
|
| 2994 | + $nonce = isset($this->_req_data[$this->_req_nonce]) |
|
| 2995 | + ? sanitize_text_field($this->_req_data[$this->_req_nonce]) : ''; |
|
| 2996 | 2996 | $this->_verify_nonce($nonce, $this->_req_nonce); |
| 2997 | 2997 | } |
| 2998 | 2998 | switch ($step) { |
@@ -3028,7 +3028,7 @@ discard block |
||
| 3028 | 3028 | } |
| 3029 | 3029 | break; |
| 3030 | 3030 | case 'questions': |
| 3031 | - if (! isset( |
|
| 3031 | + if ( ! isset( |
|
| 3032 | 3032 | $this->_req_data['txn_reg_status_change'], |
| 3033 | 3033 | $this->_req_data['txn_reg_status_change']['send_notifications'] |
| 3034 | 3034 | ) |
@@ -3043,7 +3043,7 @@ discard block |
||
| 3043 | 3043 | $grand_total->save_this_and_descendants_to_txn(); |
| 3044 | 3044 | } |
| 3045 | 3045 | } |
| 3046 | - if (! $transaction instanceof EE_Transaction) { |
|
| 3046 | + if ( ! $transaction instanceof EE_Transaction) { |
|
| 3047 | 3047 | $query_args = array( |
| 3048 | 3048 | 'action' => 'new_registration', |
| 3049 | 3049 | 'processing_registration' => 2, |
@@ -3065,7 +3065,7 @@ discard block |
||
| 3065 | 3065 | return; |
| 3066 | 3066 | } |
| 3067 | 3067 | // maybe update status, and make sure to save transaction if not done already |
| 3068 | - if (! $transaction->update_status_based_on_total_paid()) { |
|
| 3068 | + if ( ! $transaction->update_status_based_on_total_paid()) { |
|
| 3069 | 3069 | $transaction->save(); |
| 3070 | 3070 | } |
| 3071 | 3071 | EE_Registry::instance()->SSN->clear_session(__CLASS__, __FUNCTION__); |
@@ -3151,7 +3151,7 @@ discard block |
||
| 3151 | 3151 | public function get_attendees($per_page, $count = false, $trash = false) |
| 3152 | 3152 | { |
| 3153 | 3153 | do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
| 3154 | - require_once(REG_ADMIN . 'EE_Attendee_Contact_List_Table.class.php'); |
|
| 3154 | + require_once(REG_ADMIN.'EE_Attendee_Contact_List_Table.class.php'); |
|
| 3155 | 3155 | $this->_req_data['orderby'] = ! empty($this->_req_data['orderby']) ? $this->_req_data['orderby'] : ''; |
| 3156 | 3156 | switch ($this->_req_data['orderby']) { |
| 3157 | 3157 | case 'ATT_ID': |
@@ -3189,8 +3189,8 @@ discard block |
||
| 3189 | 3189 | ? $this->_req_data['perpage'] |
| 3190 | 3190 | : $per_page; |
| 3191 | 3191 | $_where = array(); |
| 3192 | - if (! empty($this->_req_data['s'])) { |
|
| 3193 | - $sstr = '%' . $this->_req_data['s'] . '%'; |
|
| 3192 | + if ( ! empty($this->_req_data['s'])) { |
|
| 3193 | + $sstr = '%'.$this->_req_data['s'].'%'; |
|
| 3194 | 3194 | $_where['OR'] = array( |
| 3195 | 3195 | 'Registration.Event.EVT_name' => array('LIKE', $sstr), |
| 3196 | 3196 | 'Registration.Event.EVT_desc' => array('LIKE', $sstr), |
@@ -3217,7 +3217,7 @@ discard block |
||
| 3217 | 3217 | 'extra_selects' => array('Registration_Count' => array('Registration.REG_ID', 'count', '%d')), |
| 3218 | 3218 | 'limit' => $limit, |
| 3219 | 3219 | ); |
| 3220 | - if (! $count) { |
|
| 3220 | + if ( ! $count) { |
|
| 3221 | 3221 | $query_args['order_by'] = array($orderby => $sort); |
| 3222 | 3222 | } |
| 3223 | 3223 | if ($trash) { |
@@ -3265,7 +3265,7 @@ discard block |
||
| 3265 | 3265 | */ |
| 3266 | 3266 | public function _registrations_report_base($method_name_for_getting_query_params) |
| 3267 | 3267 | { |
| 3268 | - if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) { |
|
| 3268 | + if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) { |
|
| 3269 | 3269 | wp_redirect( |
| 3270 | 3270 | EE_Admin_Page::add_query_args_and_nonce( |
| 3271 | 3271 | array( |
@@ -3296,8 +3296,8 @@ discard block |
||
| 3296 | 3296 | 'EVT_ID' => isset($this->_req_data['EVT_ID']) ? $this->_req_data['EVT_ID'] : null, |
| 3297 | 3297 | ); |
| 3298 | 3298 | $this->_req_data = array_merge($this->_req_data, $new_request_args); |
| 3299 | - if (is_readable(EE_CLASSES . 'EE_Export.class.php')) { |
|
| 3300 | - require_once(EE_CLASSES . 'EE_Export.class.php'); |
|
| 3299 | + if (is_readable(EE_CLASSES.'EE_Export.class.php')) { |
|
| 3300 | + require_once(EE_CLASSES.'EE_Export.class.php'); |
|
| 3301 | 3301 | $EE_Export = EE_Export::instance($this->_req_data); |
| 3302 | 3302 | $EE_Export->export(); |
| 3303 | 3303 | } |
@@ -3318,8 +3318,8 @@ discard block |
||
| 3318 | 3318 | |
| 3319 | 3319 | public function _contact_list_export() |
| 3320 | 3320 | { |
| 3321 | - if (is_readable(EE_CLASSES . 'EE_Export.class.php')) { |
|
| 3322 | - require_once(EE_CLASSES . 'EE_Export.class.php'); |
|
| 3321 | + if (is_readable(EE_CLASSES.'EE_Export.class.php')) { |
|
| 3322 | + require_once(EE_CLASSES.'EE_Export.class.php'); |
|
| 3323 | 3323 | $EE_Export = EE_Export::instance($this->_req_data); |
| 3324 | 3324 | $EE_Export->export_attendees(); |
| 3325 | 3325 | } |
@@ -3328,7 +3328,7 @@ discard block |
||
| 3328 | 3328 | |
| 3329 | 3329 | public function _contact_list_report() |
| 3330 | 3330 | { |
| 3331 | - if (! defined('EE_USE_OLD_CSV_REPORT_CLASS')) { |
|
| 3331 | + if ( ! defined('EE_USE_OLD_CSV_REPORT_CLASS')) { |
|
| 3332 | 3332 | wp_redirect( |
| 3333 | 3333 | EE_Admin_Page::add_query_args_and_nonce( |
| 3334 | 3334 | array( |
@@ -3340,8 +3340,8 @@ discard block |
||
| 3340 | 3340 | ) |
| 3341 | 3341 | ); |
| 3342 | 3342 | } else { |
| 3343 | - if (is_readable(EE_CLASSES . 'EE_Export.class.php')) { |
|
| 3344 | - require_once(EE_CLASSES . 'EE_Export.class.php'); |
|
| 3343 | + if (is_readable(EE_CLASSES.'EE_Export.class.php')) { |
|
| 3344 | + require_once(EE_CLASSES.'EE_Export.class.php'); |
|
| 3345 | 3345 | $EE_Export = EE_Export::instance($this->_req_data); |
| 3346 | 3346 | $EE_Export->report_attendees(); |
| 3347 | 3347 | } |
@@ -3429,7 +3429,7 @@ discard block |
||
| 3429 | 3429 | $updated_fields = array( |
| 3430 | 3430 | 'ATT_fname' => $this->_req_data['ATT_fname'], |
| 3431 | 3431 | 'ATT_lname' => $this->_req_data['ATT_lname'], |
| 3432 | - 'ATT_full_name' => $this->_req_data['ATT_fname'] . ' ' . $this->_req_data['ATT_lname'], |
|
| 3432 | + 'ATT_full_name' => $this->_req_data['ATT_fname'].' '.$this->_req_data['ATT_lname'], |
|
| 3433 | 3433 | 'ATT_address' => isset($this->_req_data['ATT_address']) ? $this->_req_data['ATT_address'] : '', |
| 3434 | 3434 | 'ATT_address2' => isset($this->_req_data['ATT_address2']) ? $this->_req_data['ATT_address2'] : '', |
| 3435 | 3435 | 'ATT_city' => isset($this->_req_data['ATT_city']) ? $this->_req_data['ATT_city'] : '', |
@@ -3507,16 +3507,16 @@ discard block |
||
| 3507 | 3507 | $this->verify_cpt_object(); |
| 3508 | 3508 | remove_meta_box( |
| 3509 | 3509 | 'postexcerpt', |
| 3510 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3510 | + $this->_cpt_routes[$this->_req_action], |
|
| 3511 | 3511 | 'normal' |
| 3512 | 3512 | ); |
| 3513 | - remove_meta_box('commentstatusdiv', $this->_cpt_routes[ $this->_req_action ], 'normal', 'core'); |
|
| 3513 | + remove_meta_box('commentstatusdiv', $this->_cpt_routes[$this->_req_action], 'normal', 'core'); |
|
| 3514 | 3514 | if (post_type_supports('espresso_attendees', 'excerpt')) { |
| 3515 | 3515 | add_meta_box( |
| 3516 | 3516 | 'postexcerpt', |
| 3517 | 3517 | esc_html__('Short Biography', 'event_espresso'), |
| 3518 | 3518 | 'post_excerpt_meta_box', |
| 3519 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3519 | + $this->_cpt_routes[$this->_req_action], |
|
| 3520 | 3520 | 'normal' |
| 3521 | 3521 | ); |
| 3522 | 3522 | } |
@@ -3525,7 +3525,7 @@ discard block |
||
| 3525 | 3525 | 'commentsdiv', |
| 3526 | 3526 | esc_html__('Notes on the Contact', 'event_espresso'), |
| 3527 | 3527 | 'post_comment_meta_box', |
| 3528 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3528 | + $this->_cpt_routes[$this->_req_action], |
|
| 3529 | 3529 | 'normal', |
| 3530 | 3530 | 'core' |
| 3531 | 3531 | ); |
@@ -3534,7 +3534,7 @@ discard block |
||
| 3534 | 3534 | 'attendee_contact_info', |
| 3535 | 3535 | esc_html__('Contact Info', 'event_espresso'), |
| 3536 | 3536 | array($this, 'attendee_contact_info'), |
| 3537 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3537 | + $this->_cpt_routes[$this->_req_action], |
|
| 3538 | 3538 | 'side', |
| 3539 | 3539 | 'core' |
| 3540 | 3540 | ); |
@@ -3542,7 +3542,7 @@ discard block |
||
| 3542 | 3542 | 'attendee_details_address', |
| 3543 | 3543 | esc_html__('Address Details', 'event_espresso'), |
| 3544 | 3544 | array($this, 'attendee_address_details'), |
| 3545 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3545 | + $this->_cpt_routes[$this->_req_action], |
|
| 3546 | 3546 | 'normal', |
| 3547 | 3547 | 'core' |
| 3548 | 3548 | ); |
@@ -3550,7 +3550,7 @@ discard block |
||
| 3550 | 3550 | 'attendee_registrations', |
| 3551 | 3551 | esc_html__('Registrations for this Contact', 'event_espresso'), |
| 3552 | 3552 | array($this, 'attendee_registrations_meta_box'), |
| 3553 | - $this->_cpt_routes[ $this->_req_action ], |
|
| 3553 | + $this->_cpt_routes[$this->_req_action], |
|
| 3554 | 3554 | 'normal', |
| 3555 | 3555 | 'high' |
| 3556 | 3556 | ); |
@@ -3651,7 +3651,7 @@ discard block |
||
| 3651 | 3651 | ) |
| 3652 | 3652 | ); |
| 3653 | 3653 | $template = |
| 3654 | - REG_TEMPLATE_PATH . 'attendee_address_details_metabox_content.template.php'; |
|
| 3654 | + REG_TEMPLATE_PATH.'attendee_address_details_metabox_content.template.php'; |
|
| 3655 | 3655 | EEH_Template::display_template($template, $this->_template_args); |
| 3656 | 3656 | } |
| 3657 | 3657 | |
@@ -3674,7 +3674,7 @@ discard block |
||
| 3674 | 3674 | $this->_template_args['attendee'] = $this->_cpt_model_obj; |
| 3675 | 3675 | $this->_template_args['registrations'] = $this->_cpt_model_obj->get_many_related('Registration'); |
| 3676 | 3676 | $template = |
| 3677 | - REG_TEMPLATE_PATH . 'attendee_registrations_main_meta_box.template.php'; |
|
| 3677 | + REG_TEMPLATE_PATH.'attendee_registrations_main_meta_box.template.php'; |
|
| 3678 | 3678 | EEH_Template::display_template($template, $this->_template_args); |
| 3679 | 3679 | } |
| 3680 | 3680 | |
@@ -3689,7 +3689,7 @@ discard block |
||
| 3689 | 3689 | public function after_title_form_fields($post) |
| 3690 | 3690 | { |
| 3691 | 3691 | if ($post->post_type === 'espresso_attendees') { |
| 3692 | - $template = REG_TEMPLATE_PATH . 'attendee_details_after_title_form_fields.template.php'; |
|
| 3692 | + $template = REG_TEMPLATE_PATH.'attendee_details_after_title_form_fields.template.php'; |
|
| 3693 | 3693 | $template_args['attendee'] = $this->_cpt_model_obj; |
| 3694 | 3694 | EEH_Template::display_template($template, $template_args); |
| 3695 | 3695 | } |
@@ -3713,14 +3713,14 @@ discard block |
||
| 3713 | 3713 | do_action('AHEE_log', __FILE__, __FUNCTION__, ''); |
| 3714 | 3714 | $success = 1; |
| 3715 | 3715 | // Checkboxes |
| 3716 | - if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
| 3716 | + if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) { |
|
| 3717 | 3717 | // if array has more than one element than success message should be plural |
| 3718 | 3718 | $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1; |
| 3719 | 3719 | // cycle thru checkboxes |
| 3720 | 3720 | foreach ($this->_req_data['checkbox'] as $ATT_ID) { |
| 3721 | 3721 | $updated = $trash ? $this->getAttendeeModel()->update_by_ID(array('status' => 'trash'), $ATT_ID) |
| 3722 | 3722 | : $this->getAttendeeModel()->update_by_ID(array('status' => 'publish'), $ATT_ID); |
| 3723 | - if (! $updated) { |
|
| 3723 | + if ( ! $updated) { |
|
| 3724 | 3724 | $success = 0; |
| 3725 | 3725 | } |
| 3726 | 3726 | } |
@@ -3731,7 +3731,7 @@ discard block |
||
| 3731 | 3731 | $att = $this->getAttendeeModel()->get_one_by_ID($ATT_ID); |
| 3732 | 3732 | $updated = $trash ? $att->set_status('trash') : $att->set_status('publish'); |
| 3733 | 3733 | $updated = $att->save() && $updated; |
| 3734 | - if (! $updated) { |
|
| 3734 | + if ( ! $updated) { |
|
| 3735 | 3735 | $success = 0; |
| 3736 | 3736 | } |
| 3737 | 3737 | } |
@@ -730,7 +730,7 @@ discard block |
||
| 730 | 730 | * |
| 731 | 731 | * @param $model |
| 732 | 732 | * @param $results_so_far |
| 733 | - * @param $protected |
|
| 733 | + * @param boolean $protected |
|
| 734 | 734 | * @return array results |
| 735 | 735 | * @throws EE_Error |
| 736 | 736 | * @since 4.9.74.p |
@@ -1563,7 +1563,7 @@ discard block |
||
| 1563 | 1563 | * |
| 1564 | 1564 | * @param EEM_Base $model |
| 1565 | 1565 | * @param WP_REST_Request $request |
| 1566 | - * @param null $context |
|
| 1566 | + * @param string $context |
|
| 1567 | 1567 | * @return array |
| 1568 | 1568 | * @throws EE_Error |
| 1569 | 1569 | * @throws InvalidArgumentException |
@@ -52,1627 +52,1627 @@ |
||
| 52 | 52 | { |
| 53 | 53 | |
| 54 | 54 | |
| 55 | - /** |
|
| 56 | - * @var CalculatedModelFields |
|
| 57 | - */ |
|
| 58 | - protected $fields_calculator; |
|
| 59 | - |
|
| 60 | - |
|
| 61 | - /** |
|
| 62 | - * Read constructor. |
|
| 63 | - * @param CalculatedModelFields $fields_calculator |
|
| 64 | - */ |
|
| 65 | - public function __construct(CalculatedModelFields $fields_calculator) |
|
| 66 | - { |
|
| 67 | - parent::__construct(); |
|
| 68 | - $this->fields_calculator = $fields_calculator; |
|
| 69 | - } |
|
| 70 | - |
|
| 71 | - |
|
| 72 | - /** |
|
| 73 | - * Handles requests to get all (or a filtered subset) of entities for a particular model |
|
| 74 | - * |
|
| 75 | - * @param WP_REST_Request $request |
|
| 76 | - * @param string $version |
|
| 77 | - * @param string $model_name |
|
| 78 | - * @return WP_REST_Response|WP_Error |
|
| 79 | - * @throws InvalidArgumentException |
|
| 80 | - * @throws InvalidDataTypeException |
|
| 81 | - * @throws InvalidInterfaceException |
|
| 82 | - */ |
|
| 83 | - public static function handleRequestGetAll(WP_REST_Request $request, $version, $model_name) |
|
| 84 | - { |
|
| 85 | - $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
|
| 86 | - try { |
|
| 87 | - $controller->setRequestedVersion($version); |
|
| 88 | - if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 89 | - return $controller->sendResponse( |
|
| 90 | - new WP_Error( |
|
| 91 | - 'endpoint_parsing_error', |
|
| 92 | - sprintf( |
|
| 93 | - __( |
|
| 94 | - 'There is no model for endpoint %s. Please contact event espresso support', |
|
| 95 | - 'event_espresso' |
|
| 96 | - ), |
|
| 97 | - $model_name |
|
| 98 | - ) |
|
| 99 | - ) |
|
| 100 | - ); |
|
| 101 | - } |
|
| 102 | - return $controller->sendResponse( |
|
| 103 | - $controller->getEntitiesFromModel( |
|
| 104 | - $controller->getModelVersionInfo()->loadModel($model_name), |
|
| 105 | - $request |
|
| 106 | - ) |
|
| 107 | - ); |
|
| 108 | - } catch (Exception $e) { |
|
| 109 | - return $controller->sendResponse($e); |
|
| 110 | - } |
|
| 111 | - } |
|
| 112 | - |
|
| 113 | - |
|
| 114 | - /** |
|
| 115 | - * Prepares and returns schema for any OPTIONS request. |
|
| 116 | - * |
|
| 117 | - * @param string $version The API endpoint version being used. |
|
| 118 | - * @param string $model_name Something like `Event` or `Registration` |
|
| 119 | - * @return array |
|
| 120 | - * @throws InvalidArgumentException |
|
| 121 | - * @throws InvalidDataTypeException |
|
| 122 | - * @throws InvalidInterfaceException |
|
| 123 | - */ |
|
| 124 | - public static function handleSchemaRequest($version, $model_name) |
|
| 125 | - { |
|
| 126 | - $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
|
| 127 | - try { |
|
| 128 | - $controller->setRequestedVersion($version); |
|
| 129 | - if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 130 | - return array(); |
|
| 131 | - } |
|
| 132 | - // get the model for this version |
|
| 133 | - $model = $controller->getModelVersionInfo()->loadModel($model_name); |
|
| 134 | - $model_schema = new JsonModelSchema($model, LoaderFactory::getLoader()->getShared('EventEspresso\core\libraries\rest_api\CalculatedModelFields')); |
|
| 135 | - return $model_schema->getModelSchemaForRelations( |
|
| 136 | - $controller->getModelVersionInfo()->relationSettings($model), |
|
| 137 | - $controller->customizeSchemaForRestResponse( |
|
| 138 | - $model, |
|
| 139 | - $model_schema->getModelSchemaForFields( |
|
| 140 | - $controller->getModelVersionInfo()->fieldsOnModelInThisVersion($model), |
|
| 141 | - $model_schema->getInitialSchemaStructure() |
|
| 142 | - ) |
|
| 143 | - ) |
|
| 144 | - ); |
|
| 145 | - } catch (Exception $e) { |
|
| 146 | - return array(); |
|
| 147 | - } |
|
| 148 | - } |
|
| 149 | - |
|
| 150 | - |
|
| 151 | - /** |
|
| 152 | - * This loops through each field in the given schema for the model and does the following: |
|
| 153 | - * - add any extra fields that are REST API specific and related to existing fields. |
|
| 154 | - * - transform default values into the correct format for a REST API response. |
|
| 155 | - * |
|
| 156 | - * @param EEM_Base $model |
|
| 157 | - * @param array $schema |
|
| 158 | - * @return array The final schema. |
|
| 159 | - * @throws EE_Error |
|
| 160 | - */ |
|
| 161 | - public function customizeSchemaForRestResponse(EEM_Base $model, array $schema) |
|
| 162 | - { |
|
| 163 | - foreach ($this->getModelVersionInfo()->fieldsOnModelInThisVersion($model) as $field_name => $field) { |
|
| 164 | - $schema = $this->translateDefaultsForRestResponse( |
|
| 165 | - $field_name, |
|
| 166 | - $field, |
|
| 167 | - $this->maybeAddExtraFieldsToSchema($field_name, $field, $schema) |
|
| 168 | - ); |
|
| 169 | - } |
|
| 170 | - return $schema; |
|
| 171 | - } |
|
| 172 | - |
|
| 173 | - |
|
| 174 | - /** |
|
| 175 | - * This is used to ensure that the 'default' value set in the schema response is formatted correctly for the REST |
|
| 176 | - * response. |
|
| 177 | - * |
|
| 178 | - * @param $field_name |
|
| 179 | - * @param EE_Model_Field_Base $field |
|
| 180 | - * @param array $schema |
|
| 181 | - * @return array |
|
| 182 | - * @throws RestException if a default value has a PHP object, which should never do (and if we |
|
| 183 | - * @throws EE_Error |
|
| 184 | - * did, let's know about it ASAP, so let the exception bubble up) |
|
| 185 | - */ |
|
| 186 | - protected function translateDefaultsForRestResponse($field_name, EE_Model_Field_Base $field, array $schema) |
|
| 187 | - { |
|
| 188 | - if (isset($schema['properties'][ $field_name ]['default'])) { |
|
| 189 | - if (is_array($schema['properties'][ $field_name ]['default'])) { |
|
| 190 | - foreach ($schema['properties'][ $field_name ]['default'] as $default_key => $default_value) { |
|
| 191 | - if ($default_key === 'raw') { |
|
| 192 | - $schema['properties'][ $field_name ]['default'][ $default_key ] = |
|
| 193 | - ModelDataTranslator::prepareFieldValueForJson( |
|
| 194 | - $field, |
|
| 195 | - $default_value, |
|
| 196 | - $this->getModelVersionInfo()->requestedVersion() |
|
| 197 | - ); |
|
| 198 | - } |
|
| 199 | - } |
|
| 200 | - } else { |
|
| 201 | - $schema['properties'][ $field_name ]['default'] = ModelDataTranslator::prepareFieldValueForJson( |
|
| 202 | - $field, |
|
| 203 | - $schema['properties'][ $field_name ]['default'], |
|
| 204 | - $this->getModelVersionInfo()->requestedVersion() |
|
| 205 | - ); |
|
| 206 | - } |
|
| 207 | - } |
|
| 208 | - return $schema; |
|
| 209 | - } |
|
| 210 | - |
|
| 211 | - |
|
| 212 | - /** |
|
| 213 | - * Adds additional fields to the schema |
|
| 214 | - * The REST API returns a GMT value field for each datetime field in the resource. Thus the description about this |
|
| 215 | - * needs to be added to the schema. |
|
| 216 | - * |
|
| 217 | - * @param $field_name |
|
| 218 | - * @param EE_Model_Field_Base $field |
|
| 219 | - * @param array $schema |
|
| 220 | - * @return array |
|
| 221 | - */ |
|
| 222 | - protected function maybeAddExtraFieldsToSchema($field_name, EE_Model_Field_Base $field, array $schema) |
|
| 223 | - { |
|
| 224 | - if ($field instanceof EE_Datetime_Field) { |
|
| 225 | - $schema['properties'][ $field_name . '_gmt' ] = $field->getSchema(); |
|
| 226 | - // modify the description |
|
| 227 | - $schema['properties'][ $field_name . '_gmt' ]['description'] = sprintf( |
|
| 228 | - esc_html__('%s - the value for this field is in GMT.', 'event_espresso'), |
|
| 229 | - wp_specialchars_decode($field->get_nicename(), ENT_QUOTES) |
|
| 230 | - ); |
|
| 231 | - } |
|
| 232 | - return $schema; |
|
| 233 | - } |
|
| 234 | - |
|
| 235 | - |
|
| 236 | - /** |
|
| 237 | - * Used to figure out the route from the request when a `WP_REST_Request` object is not available |
|
| 238 | - * |
|
| 239 | - * @return string |
|
| 240 | - */ |
|
| 241 | - protected function getRouteFromRequest() |
|
| 242 | - { |
|
| 243 | - if (isset($GLOBALS['wp']) |
|
| 244 | - && $GLOBALS['wp'] instanceof WP |
|
| 245 | - && isset($GLOBALS['wp']->query_vars['rest_route']) |
|
| 246 | - ) { |
|
| 247 | - return $GLOBALS['wp']->query_vars['rest_route']; |
|
| 248 | - } |
|
| 249 | - return isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/'; |
|
| 250 | - } |
|
| 251 | - |
|
| 252 | - |
|
| 253 | - /** |
|
| 254 | - * Gets a single entity related to the model indicated in the path and its id |
|
| 255 | - * |
|
| 256 | - * @param WP_REST_Request $request |
|
| 257 | - * @param string $version |
|
| 258 | - * @param string $model_name |
|
| 259 | - * @return WP_REST_Response|WP_Error |
|
| 260 | - * @throws InvalidDataTypeException |
|
| 261 | - * @throws InvalidInterfaceException |
|
| 262 | - * @throws InvalidArgumentException |
|
| 263 | - */ |
|
| 264 | - public static function handleRequestGetOne(WP_REST_Request $request, $version, $model_name) |
|
| 265 | - { |
|
| 266 | - $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
|
| 267 | - try { |
|
| 268 | - $controller->setRequestedVersion($version); |
|
| 269 | - if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 270 | - return $controller->sendResponse( |
|
| 271 | - new WP_Error( |
|
| 272 | - 'endpoint_parsing_error', |
|
| 273 | - sprintf( |
|
| 274 | - __( |
|
| 275 | - 'There is no model for endpoint %s. Please contact event espresso support', |
|
| 276 | - 'event_espresso' |
|
| 277 | - ), |
|
| 278 | - $model_name |
|
| 279 | - ) |
|
| 280 | - ) |
|
| 281 | - ); |
|
| 282 | - } |
|
| 283 | - return $controller->sendResponse( |
|
| 284 | - $controller->getEntityFromModel( |
|
| 285 | - $controller->getModelVersionInfo()->loadModel($model_name), |
|
| 286 | - $request |
|
| 287 | - ) |
|
| 288 | - ); |
|
| 289 | - } catch (Exception $e) { |
|
| 290 | - return $controller->sendResponse($e); |
|
| 291 | - } |
|
| 292 | - } |
|
| 293 | - |
|
| 294 | - |
|
| 295 | - /** |
|
| 296 | - * Gets all the related entities (or if its a belongs-to relation just the one) |
|
| 297 | - * to the item with the given id |
|
| 298 | - * |
|
| 299 | - * @param WP_REST_Request $request |
|
| 300 | - * @param string $version |
|
| 301 | - * @param string $model_name |
|
| 302 | - * @param string $related_model_name |
|
| 303 | - * @return WP_REST_Response|WP_Error |
|
| 304 | - * @throws InvalidDataTypeException |
|
| 305 | - * @throws InvalidInterfaceException |
|
| 306 | - * @throws InvalidArgumentException |
|
| 307 | - */ |
|
| 308 | - public static function handleRequestGetRelated( |
|
| 309 | - WP_REST_Request $request, |
|
| 310 | - $version, |
|
| 311 | - $model_name, |
|
| 312 | - $related_model_name |
|
| 313 | - ) { |
|
| 314 | - $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
|
| 315 | - try { |
|
| 316 | - $controller->setRequestedVersion($version); |
|
| 317 | - $main_model = $controller->validateModel($model_name); |
|
| 318 | - $controller->validateModel($related_model_name); |
|
| 319 | - return $controller->sendResponse( |
|
| 320 | - $controller->getEntitiesFromRelation( |
|
| 321 | - $request->get_param('id'), |
|
| 322 | - $main_model->related_settings_for($related_model_name), |
|
| 323 | - $request |
|
| 324 | - ) |
|
| 325 | - ); |
|
| 326 | - } catch (Exception $e) { |
|
| 327 | - return $controller->sendResponse($e); |
|
| 328 | - } |
|
| 329 | - } |
|
| 330 | - |
|
| 331 | - |
|
| 332 | - /** |
|
| 333 | - * Gets a collection for the given model and filters |
|
| 334 | - * |
|
| 335 | - * @param EEM_Base $model |
|
| 336 | - * @param WP_REST_Request $request |
|
| 337 | - * @return array |
|
| 338 | - * @throws DomainException |
|
| 339 | - * @throws EE_Error |
|
| 340 | - * @throws InvalidArgumentException |
|
| 341 | - * @throws InvalidDataTypeException |
|
| 342 | - * @throws InvalidInterfaceException |
|
| 343 | - * @throws ModelConfigurationException |
|
| 344 | - * @throws ReflectionException |
|
| 345 | - * @throws RestException |
|
| 346 | - * @throws RestPasswordIncorrectException |
|
| 347 | - * @throws RestPasswordRequiredException |
|
| 348 | - * @throws UnexpectedEntityException |
|
| 349 | - */ |
|
| 350 | - public function getEntitiesFromModel($model, $request) |
|
| 351 | - { |
|
| 352 | - $query_params = $this->createModelQueryParams($model, $request->get_params()); |
|
| 353 | - if (! Capabilities::currentUserHasPartialAccessTo($model, $query_params['caps'])) { |
|
| 354 | - $model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name()); |
|
| 355 | - throw new RestException( |
|
| 356 | - sprintf('rest_%s_cannot_list', $model_name_plural), |
|
| 357 | - sprintf( |
|
| 358 | - __('Sorry, you are not allowed to list %1$s. Missing permissions: %2$s', 'event_espresso'), |
|
| 359 | - $model_name_plural, |
|
| 360 | - Capabilities::getMissingPermissionsString($model, $query_params['caps']) |
|
| 361 | - ), |
|
| 362 | - array('status' => 403) |
|
| 363 | - ); |
|
| 364 | - } |
|
| 365 | - if (! $request->get_header('no_rest_headers')) { |
|
| 366 | - $this->setHeadersFromQueryParams($model, $query_params); |
|
| 367 | - } |
|
| 368 | - /** @type array $results */ |
|
| 369 | - $results = $model->get_all_wpdb_results($query_params); |
|
| 370 | - $nice_results = array(); |
|
| 371 | - foreach ($results as $result) { |
|
| 372 | - $nice_results[] = $this->createEntityFromWpdbResult( |
|
| 373 | - $model, |
|
| 374 | - $result, |
|
| 375 | - $request |
|
| 376 | - ); |
|
| 377 | - } |
|
| 378 | - return $nice_results; |
|
| 379 | - } |
|
| 380 | - |
|
| 381 | - |
|
| 382 | - /** |
|
| 383 | - * Gets the collection for given relation object |
|
| 384 | - * The same as Read::get_entities_from_model(), except if the relation |
|
| 385 | - * is a HABTM relation, in which case it merges any non-foreign-key fields from |
|
| 386 | - * the join-model-object into the results |
|
| 387 | - * |
|
| 388 | - * @param array $primary_model_query_params query params for finding the item from which |
|
| 389 | - * relations will be based |
|
| 390 | - * @param EE_Model_Relation_Base $relation |
|
| 391 | - * @param WP_REST_Request $request |
|
| 392 | - * @return array |
|
| 393 | - * @throws DomainException |
|
| 394 | - * @throws EE_Error |
|
| 395 | - * @throws InvalidArgumentException |
|
| 396 | - * @throws InvalidDataTypeException |
|
| 397 | - * @throws InvalidInterfaceException |
|
| 398 | - * @throws ModelConfigurationException |
|
| 399 | - * @throws ReflectionException |
|
| 400 | - * @throws RestException |
|
| 401 | - * @throws RestPasswordIncorrectException |
|
| 402 | - * @throws RestPasswordRequiredException |
|
| 403 | - * @throws UnexpectedEntityException |
|
| 404 | - */ |
|
| 405 | - protected function getEntitiesFromRelationUsingModelQueryParams($primary_model_query_params, $relation, $request) |
|
| 406 | - { |
|
| 407 | - $context = $this->validateContext($request->get_param('caps')); |
|
| 408 | - $model = $relation->get_this_model(); |
|
| 409 | - $related_model = $relation->get_other_model(); |
|
| 410 | - if (! isset($primary_model_query_params[0])) { |
|
| 411 | - $primary_model_query_params[0] = array(); |
|
| 412 | - } |
|
| 413 | - // check if they can access the 1st model object |
|
| 414 | - $primary_model_query_params = array( |
|
| 415 | - 0 => $primary_model_query_params[0], |
|
| 416 | - 'limit' => 1, |
|
| 417 | - ); |
|
| 418 | - if ($model instanceof EEM_Soft_Delete_Base) { |
|
| 419 | - $primary_model_query_params = $model->alter_query_params_so_deleted_and_undeleted_items_included( |
|
| 420 | - $primary_model_query_params |
|
| 421 | - ); |
|
| 422 | - } |
|
| 423 | - $restricted_query_params = $primary_model_query_params; |
|
| 424 | - $restricted_query_params['caps'] = $context; |
|
| 425 | - $restricted_query_params['limit'] = 1; |
|
| 426 | - $this->setDebugInfo('main model query params', $restricted_query_params); |
|
| 427 | - $this->setDebugInfo('missing caps', Capabilities::getMissingPermissionsString($related_model, $context)); |
|
| 428 | - $primary_model_rows = $model->get_all_wpdb_results($restricted_query_params); |
|
| 429 | - $primary_model_row = null; |
|
| 430 | - if (is_array($primary_model_rows)) { |
|
| 431 | - $primary_model_row = reset($primary_model_rows); |
|
| 432 | - } |
|
| 433 | - if (! ( |
|
| 434 | - $primary_model_row |
|
| 435 | - && Capabilities::currentUserHasPartialAccessTo($related_model, $context) |
|
| 436 | - ) |
|
| 437 | - ) { |
|
| 438 | - if ($relation instanceof EE_Belongs_To_Relation) { |
|
| 439 | - $related_model_name_maybe_plural = strtolower($related_model->get_this_model_name()); |
|
| 440 | - } else { |
|
| 441 | - $related_model_name_maybe_plural = EEH_Inflector::pluralize_and_lower( |
|
| 442 | - $related_model->get_this_model_name() |
|
| 443 | - ); |
|
| 444 | - } |
|
| 445 | - throw new RestException( |
|
| 446 | - sprintf('rest_%s_cannot_list', $related_model_name_maybe_plural), |
|
| 447 | - sprintf( |
|
| 448 | - __( |
|
| 449 | - 'Sorry, you are not allowed to list %1$s related to %2$s. Missing permissions: %3$s', |
|
| 450 | - 'event_espresso' |
|
| 451 | - ), |
|
| 452 | - $related_model_name_maybe_plural, |
|
| 453 | - $relation->get_this_model()->get_this_model_name(), |
|
| 454 | - implode( |
|
| 455 | - ',', |
|
| 456 | - array_keys( |
|
| 457 | - Capabilities::getMissingPermissions($related_model, $context) |
|
| 458 | - ) |
|
| 459 | - ) |
|
| 460 | - ), |
|
| 461 | - array('status' => 403) |
|
| 462 | - ); |
|
| 463 | - } |
|
| 464 | - |
|
| 465 | - $this->checkPassword( |
|
| 466 | - $model, |
|
| 467 | - $primary_model_row, |
|
| 468 | - $restricted_query_params, |
|
| 469 | - $request |
|
| 470 | - ); |
|
| 471 | - $query_params = $this->createModelQueryParams($relation->get_other_model(), $request->get_params()); |
|
| 472 | - foreach ($primary_model_query_params[0] as $where_condition_key => $where_condition_value) { |
|
| 473 | - $query_params[0][ $relation->get_this_model()->get_this_model_name() |
|
| 474 | - . '.' |
|
| 475 | - . $where_condition_key ] = $where_condition_value; |
|
| 476 | - } |
|
| 477 | - $query_params['default_where_conditions'] = 'none'; |
|
| 478 | - $query_params['caps'] = $context; |
|
| 479 | - if (! $request->get_header('no_rest_headers')) { |
|
| 480 | - $this->setHeadersFromQueryParams($relation->get_other_model(), $query_params); |
|
| 481 | - } |
|
| 482 | - /** @type array $results */ |
|
| 483 | - $results = $relation->get_other_model()->get_all_wpdb_results($query_params); |
|
| 484 | - $nice_results = array(); |
|
| 485 | - foreach ($results as $result) { |
|
| 486 | - $nice_result = $this->createEntityFromWpdbResult( |
|
| 487 | - $relation->get_other_model(), |
|
| 488 | - $result, |
|
| 489 | - $request |
|
| 490 | - ); |
|
| 491 | - if ($relation instanceof EE_HABTM_Relation) { |
|
| 492 | - // put the unusual stuff (properties from the HABTM relation) first, and make sure |
|
| 493 | - // if there are conflicts we prefer the properties from the main model |
|
| 494 | - $join_model_result = $this->createEntityFromWpdbResult( |
|
| 495 | - $relation->get_join_model(), |
|
| 496 | - $result, |
|
| 497 | - $request |
|
| 498 | - ); |
|
| 499 | - $joined_result = array_merge($join_model_result, $nice_result); |
|
| 500 | - // but keep the meta stuff from the main model |
|
| 501 | - if (isset($nice_result['meta'])) { |
|
| 502 | - $joined_result['meta'] = $nice_result['meta']; |
|
| 503 | - } |
|
| 504 | - $nice_result = $joined_result; |
|
| 505 | - } |
|
| 506 | - $nice_results[] = $nice_result; |
|
| 507 | - } |
|
| 508 | - if ($relation instanceof EE_Belongs_To_Relation) { |
|
| 509 | - return array_shift($nice_results); |
|
| 510 | - } else { |
|
| 511 | - return $nice_results; |
|
| 512 | - } |
|
| 513 | - } |
|
| 514 | - |
|
| 515 | - |
|
| 516 | - /** |
|
| 517 | - * Gets the collection for given relation object |
|
| 518 | - * The same as Read::get_entities_from_model(), except if the relation |
|
| 519 | - * is a HABTM relation, in which case it merges any non-foreign-key fields from |
|
| 520 | - * the join-model-object into the results |
|
| 521 | - * |
|
| 522 | - * @param string $id the ID of the thing we are fetching related stuff from |
|
| 523 | - * @param EE_Model_Relation_Base $relation |
|
| 524 | - * @param WP_REST_Request $request |
|
| 525 | - * @return array |
|
| 526 | - * @throws DomainException |
|
| 527 | - * @throws EE_Error |
|
| 528 | - * @throws InvalidArgumentException |
|
| 529 | - * @throws InvalidDataTypeException |
|
| 530 | - * @throws InvalidInterfaceException |
|
| 531 | - * @throws ModelConfigurationException |
|
| 532 | - * @throws ReflectionException |
|
| 533 | - * @throws RestException |
|
| 534 | - * @throws RestPasswordIncorrectException |
|
| 535 | - * @throws RestPasswordRequiredException |
|
| 536 | - * @throws UnexpectedEntityException |
|
| 537 | - */ |
|
| 538 | - public function getEntitiesFromRelation($id, $relation, $request) |
|
| 539 | - { |
|
| 540 | - if (! $relation->get_this_model()->has_primary_key_field()) { |
|
| 541 | - throw new EE_Error( |
|
| 542 | - sprintf( |
|
| 543 | - __( |
|
| 544 | - // @codingStandardsIgnoreStart |
|
| 545 | - 'Read::get_entities_from_relation should only be called from a model with a primary key, it was called from %1$s', |
|
| 546 | - // @codingStandardsIgnoreEnd |
|
| 547 | - 'event_espresso' |
|
| 548 | - ), |
|
| 549 | - $relation->get_this_model()->get_this_model_name() |
|
| 550 | - ) |
|
| 551 | - ); |
|
| 552 | - } |
|
| 553 | - // can we edit that main item? |
|
| 554 | - // if not, show nothing but an error |
|
| 555 | - // otherwise, please proceed |
|
| 556 | - return $this->getEntitiesFromRelationUsingModelQueryParams( |
|
| 557 | - array( |
|
| 558 | - array( |
|
| 559 | - $relation->get_this_model()->primary_key_name() => $id, |
|
| 560 | - ), |
|
| 561 | - ), |
|
| 562 | - $relation, |
|
| 563 | - $request |
|
| 564 | - ); |
|
| 565 | - } |
|
| 566 | - |
|
| 567 | - |
|
| 568 | - /** |
|
| 569 | - * Sets the headers that are based on the model and query params, |
|
| 570 | - * like the total records. This should only be called on the original request |
|
| 571 | - * from the client, not on subsequent internal |
|
| 572 | - * |
|
| 573 | - * @param EEM_Base $model |
|
| 574 | - * @param array $query_params |
|
| 575 | - * @return void |
|
| 576 | - * @throws EE_Error |
|
| 577 | - */ |
|
| 578 | - protected function setHeadersFromQueryParams($model, $query_params) |
|
| 579 | - { |
|
| 580 | - $this->setDebugInfo('model query params', $query_params); |
|
| 581 | - $this->setDebugInfo( |
|
| 582 | - 'missing caps', |
|
| 583 | - Capabilities::getMissingPermissionsString($model, $query_params['caps']) |
|
| 584 | - ); |
|
| 585 | - // normally the limit to a 2-part array, where the 2nd item is the limit |
|
| 586 | - if (! isset($query_params['limit'])) { |
|
| 587 | - $query_params['limit'] = EED_Core_Rest_Api::get_default_query_limit(); |
|
| 588 | - } |
|
| 589 | - if (is_array($query_params['limit'])) { |
|
| 590 | - $limit_parts = $query_params['limit']; |
|
| 591 | - } else { |
|
| 592 | - $limit_parts = explode(',', $query_params['limit']); |
|
| 593 | - if (count($limit_parts) === 1) { |
|
| 594 | - $limit_parts = array(0, $limit_parts[0]); |
|
| 595 | - } |
|
| 596 | - } |
|
| 597 | - // remove the group by and having parts of the query, as those will |
|
| 598 | - // make the sql query return an array of values, instead of just a single value |
|
| 599 | - unset($query_params['group_by'], $query_params['having'], $query_params['limit']); |
|
| 600 | - $count = $model->count($query_params, null, true); |
|
| 601 | - $pages = $count / $limit_parts[1]; |
|
| 602 | - $this->setResponseHeader('Total', $count, false); |
|
| 603 | - $this->setResponseHeader('PageSize', $limit_parts[1], false); |
|
| 604 | - $this->setResponseHeader('TotalPages', ceil($pages), false); |
|
| 605 | - } |
|
| 606 | - |
|
| 607 | - |
|
| 608 | - /** |
|
| 609 | - * Changes database results into REST API entities |
|
| 610 | - * |
|
| 611 | - * @param EEM_Base $model |
|
| 612 | - * @param array $db_row like results from $wpdb->get_results() |
|
| 613 | - * @param WP_REST_Request $rest_request |
|
| 614 | - * @param string $deprecated no longer used |
|
| 615 | - * @return array ready for being converted into json for sending to client |
|
| 616 | - * @throws EE_Error |
|
| 617 | - * @throws InvalidArgumentException |
|
| 618 | - * @throws InvalidDataTypeException |
|
| 619 | - * @throws InvalidInterfaceException |
|
| 620 | - * @throws ReflectionException |
|
| 621 | - * @throws RestException |
|
| 622 | - * @throws RestPasswordIncorrectException |
|
| 623 | - * @throws RestPasswordRequiredException |
|
| 624 | - * @throws ModelConfigurationException |
|
| 625 | - * @throws UnexpectedEntityException |
|
| 626 | - * @throws DomainException |
|
| 627 | - */ |
|
| 628 | - public function createEntityFromWpdbResult($model, $db_row, $rest_request, $deprecated = null) |
|
| 629 | - { |
|
| 630 | - if (! $rest_request instanceof WP_REST_Request) { |
|
| 631 | - // ok so this was called in the old style, where the 3rd arg was |
|
| 632 | - // $include, and the 4th arg was $context |
|
| 633 | - // now setup the request just to avoid fatal errors, although we won't be able |
|
| 634 | - // to truly make use of it because it's kinda devoid of info |
|
| 635 | - $rest_request = new WP_REST_Request(); |
|
| 636 | - $rest_request->set_param('include', $rest_request); |
|
| 637 | - $rest_request->set_param('caps', $deprecated); |
|
| 638 | - } |
|
| 639 | - if ($rest_request->get_param('caps') === null) { |
|
| 640 | - $rest_request->set_param('caps', EEM_Base::caps_read); |
|
| 641 | - } |
|
| 642 | - $current_user_full_access_to_entity = $model->currentUserCan( |
|
| 643 | - EEM_Base::caps_read_admin, |
|
| 644 | - $model->deduce_fields_n_values_from_cols_n_values($db_row) |
|
| 645 | - ); |
|
| 646 | - $entity_array = $this->createBareEntityFromWpdbResults($model, $db_row); |
|
| 647 | - $entity_array = $this->addExtraFields($model, $db_row, $entity_array); |
|
| 648 | - $entity_array['_links'] = $this->getEntityLinks($model, $db_row, $entity_array); |
|
| 649 | - // when it's a regular read request for a model with a password and the password wasn't provided |
|
| 650 | - // remove the password protected fields |
|
| 651 | - $has_protected_fields = false; |
|
| 652 | - try { |
|
| 653 | - $this->checkPassword( |
|
| 654 | - $model, |
|
| 655 | - $db_row, |
|
| 656 | - $model->alter_query_params_to_restrict_by_ID( |
|
| 657 | - $model->get_index_primary_key_string( |
|
| 658 | - $model->deduce_fields_n_values_from_cols_n_values($db_row) |
|
| 659 | - ) |
|
| 660 | - ), |
|
| 661 | - $rest_request |
|
| 662 | - ); |
|
| 663 | - } catch (RestPasswordRequiredException $e) { |
|
| 664 | - if ($model->hasPassword()) { |
|
| 665 | - // just remove protected fields |
|
| 666 | - $has_protected_fields = true; |
|
| 667 | - $entity_array = Capabilities::filterOutPasswordProtectedFields( |
|
| 668 | - $entity_array, |
|
| 669 | - $model, |
|
| 670 | - $this->getModelVersionInfo() |
|
| 671 | - ); |
|
| 672 | - } else { |
|
| 673 | - // that's a problem. None of this should be accessible if no password was provided |
|
| 674 | - throw $e; |
|
| 675 | - } |
|
| 676 | - } |
|
| 677 | - |
|
| 678 | - $entity_array['_calculated_fields'] = $this->getEntityCalculations($model, $db_row, $rest_request, $has_protected_fields); |
|
| 679 | - $entity_array = apply_filters( |
|
| 680 | - 'FHEE__Read__create_entity_from_wpdb_results__entity_before_including_requested_models', |
|
| 681 | - $entity_array, |
|
| 682 | - $model, |
|
| 683 | - $rest_request->get_param('caps'), |
|
| 684 | - $rest_request, |
|
| 685 | - $this |
|
| 686 | - ); |
|
| 687 | - // add an empty protected property for now. If it's still around after we remove everything the request didn't |
|
| 688 | - // want, we'll populate it then. k? |
|
| 689 | - $entity_array['_protected'] = array(); |
|
| 690 | - // remove any properties the request didn't want. This way _protected won't bother mentioning them |
|
| 691 | - $entity_array = $this->includeOnlyRequestedProperties($model, $rest_request, $entity_array); |
|
| 692 | - $entity_array = $this->includeRequestedModels($model, $rest_request, $entity_array, $db_row, $has_protected_fields); |
|
| 693 | - // if they still wanted the _protected property, add it. |
|
| 694 | - if (isset($entity_array['_protected'])) { |
|
| 695 | - $entity_array = $this->addProtectedProperty($model, $entity_array, $has_protected_fields); |
|
| 696 | - } |
|
| 697 | - $entity_array = apply_filters( |
|
| 698 | - 'FHEE__Read__create_entity_from_wpdb_results__entity_before_inaccessible_field_removal', |
|
| 699 | - $entity_array, |
|
| 700 | - $model, |
|
| 701 | - $rest_request->get_param('caps'), |
|
| 702 | - $rest_request, |
|
| 703 | - $this |
|
| 704 | - ); |
|
| 705 | - if (! $current_user_full_access_to_entity) { |
|
| 706 | - $result_without_inaccessible_fields = Capabilities::filterOutInaccessibleEntityFields( |
|
| 707 | - $entity_array, |
|
| 708 | - $model, |
|
| 709 | - $rest_request->get_param('caps'), |
|
| 710 | - $this->getModelVersionInfo() |
|
| 711 | - ); |
|
| 712 | - } else { |
|
| 713 | - $result_without_inaccessible_fields = $entity_array; |
|
| 714 | - } |
|
| 715 | - $this->setDebugInfo( |
|
| 716 | - 'inaccessible fields', |
|
| 717 | - array_keys(array_diff_key((array) $entity_array, (array) $result_without_inaccessible_fields)) |
|
| 718 | - ); |
|
| 719 | - return apply_filters( |
|
| 720 | - 'FHEE__Read__create_entity_from_wpdb_results__entity_return', |
|
| 721 | - $result_without_inaccessible_fields, |
|
| 722 | - $model, |
|
| 723 | - $rest_request->get_param('caps') |
|
| 724 | - ); |
|
| 725 | - } |
|
| 726 | - |
|
| 727 | - |
|
| 728 | - /** |
|
| 729 | - * Returns an array describing which fields can be protected, and which actually were removed this request |
|
| 730 | - * |
|
| 731 | - * @param $model |
|
| 732 | - * @param $results_so_far |
|
| 733 | - * @param $protected |
|
| 734 | - * @return array results |
|
| 735 | - * @throws EE_Error |
|
| 736 | - * @since 4.9.74.p |
|
| 737 | - */ |
|
| 738 | - protected function addProtectedProperty(EEM_Base $model, $results_so_far, $protected) |
|
| 739 | - { |
|
| 740 | - if (! $protected || ! $model->hasPassword()) { |
|
| 741 | - return $results_so_far; |
|
| 742 | - } |
|
| 743 | - $password_field = $model->getPasswordField(); |
|
| 744 | - $all_protected = array_merge( |
|
| 745 | - array($password_field->get_name()), |
|
| 746 | - $password_field->protectedFields() |
|
| 747 | - ); |
|
| 748 | - $fields_included = array_keys($results_so_far); |
|
| 749 | - $fields_included = array_intersect( |
|
| 750 | - $all_protected, |
|
| 751 | - $fields_included |
|
| 752 | - ); |
|
| 753 | - foreach ($fields_included as $field_name) { |
|
| 754 | - $results_so_far['_protected'][] = $field_name ; |
|
| 755 | - } |
|
| 756 | - return $results_so_far; |
|
| 757 | - } |
|
| 758 | - |
|
| 759 | - |
|
| 760 | - /** |
|
| 761 | - * Creates a REST entity array (JSON object we're going to return in the response, but |
|
| 762 | - * for now still a PHP array, but soon enough we'll call json_encode on it, don't worry), |
|
| 763 | - * from $wpdb->get_row( $sql, ARRAY_A) |
|
| 764 | - * |
|
| 765 | - * @param EEM_Base $model |
|
| 766 | - * @param array $db_row |
|
| 767 | - * @return array entity mostly ready for converting to JSON and sending in the response |
|
| 768 | - * @throws EE_Error |
|
| 769 | - * @throws InvalidArgumentException |
|
| 770 | - * @throws InvalidDataTypeException |
|
| 771 | - * @throws InvalidInterfaceException |
|
| 772 | - * @throws ReflectionException |
|
| 773 | - * @throws RestException |
|
| 774 | - */ |
|
| 775 | - protected function createBareEntityFromWpdbResults(EEM_Base $model, $db_row) |
|
| 776 | - { |
|
| 777 | - $result = $model->deduce_fields_n_values_from_cols_n_values($db_row); |
|
| 778 | - $result = array_intersect_key( |
|
| 779 | - $result, |
|
| 780 | - $this->getModelVersionInfo()->fieldsOnModelInThisVersion($model) |
|
| 781 | - ); |
|
| 782 | - // if this is a CPT, we need to set the global $post to it, |
|
| 783 | - // otherwise shortcodes etc won't work properly while rendering it |
|
| 784 | - if ($model instanceof \EEM_CPT_Base) { |
|
| 785 | - $do_chevy_shuffle = true; |
|
| 786 | - } else { |
|
| 787 | - $do_chevy_shuffle = false; |
|
| 788 | - } |
|
| 789 | - if ($do_chevy_shuffle) { |
|
| 790 | - global $post; |
|
| 791 | - $old_post = $post; |
|
| 792 | - $post = get_post($result[ $model->primary_key_name() ]); |
|
| 793 | - if (! $post instanceof WP_Post) { |
|
| 794 | - // well that's weird, because $result is what we JUST fetched from the database |
|
| 795 | - throw new RestException( |
|
| 796 | - 'error_fetching_post_from_database_results', |
|
| 797 | - esc_html__( |
|
| 798 | - 'An item was retrieved from the database but it\'s not a WP_Post like it should be.', |
|
| 799 | - 'event_espresso' |
|
| 800 | - ) |
|
| 801 | - ); |
|
| 802 | - } |
|
| 803 | - $model_object_classname = 'EE_' . $model->get_this_model_name(); |
|
| 804 | - $post->{$model_object_classname} = \EE_Registry::instance()->load_class( |
|
| 805 | - $model_object_classname, |
|
| 806 | - $result, |
|
| 807 | - false, |
|
| 808 | - false |
|
| 809 | - ); |
|
| 810 | - } |
|
| 811 | - foreach ($result as $field_name => $field_value) { |
|
| 812 | - $field_obj = $model->field_settings_for($field_name); |
|
| 813 | - if ($this->isSubclassOfOne($field_obj, $this->getModelVersionInfo()->fieldsIgnored())) { |
|
| 814 | - unset($result[ $field_name ]); |
|
| 815 | - } elseif ($this->isSubclassOfOne( |
|
| 816 | - $field_obj, |
|
| 817 | - $this->getModelVersionInfo()->fieldsThatHaveRenderedFormat() |
|
| 818 | - ) |
|
| 819 | - ) { |
|
| 820 | - $result[ $field_name ] = array( |
|
| 821 | - 'raw' => $this->prepareFieldObjValueForJson($field_obj, $field_value), |
|
| 822 | - 'rendered' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'), |
|
| 823 | - ); |
|
| 824 | - } elseif ($this->isSubclassOfOne( |
|
| 825 | - $field_obj, |
|
| 826 | - $this->getModelVersionInfo()->fieldsThatHavePrettyFormat() |
|
| 827 | - ) |
|
| 828 | - ) { |
|
| 829 | - $result[ $field_name ] = array( |
|
| 830 | - 'raw' => $this->prepareFieldObjValueForJson($field_obj, $field_value), |
|
| 831 | - 'pretty' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'), |
|
| 832 | - ); |
|
| 833 | - } elseif ($field_obj instanceof \EE_Datetime_Field) { |
|
| 834 | - $field_value = $field_obj->prepare_for_set_from_db($field_value); |
|
| 835 | - // if the value is null, but we're not supposed to permit null, then set to the field's default |
|
| 836 | - if (is_null($field_value)) { |
|
| 837 | - $field_value = $field_obj->getDefaultDateTimeObj(); |
|
| 838 | - } |
|
| 839 | - if (is_null($field_value)) { |
|
| 840 | - $gmt_date = $local_date = ModelDataTranslator::prepareFieldValuesForJson( |
|
| 841 | - $field_obj, |
|
| 842 | - $field_value, |
|
| 843 | - $this->getModelVersionInfo()->requestedVersion() |
|
| 844 | - ); |
|
| 845 | - } else { |
|
| 846 | - $timezone = $field_value->getTimezone(); |
|
| 847 | - EEH_DTT_Helper::setTimezone($field_value, new DateTimeZone('UTC')); |
|
| 848 | - $gmt_date = ModelDataTranslator::prepareFieldValuesForJson( |
|
| 849 | - $field_obj, |
|
| 850 | - $field_value, |
|
| 851 | - $this->getModelVersionInfo()->requestedVersion() |
|
| 852 | - ); |
|
| 853 | - EEH_DTT_Helper::setTimezone($field_value, $timezone); |
|
| 854 | - $local_date = ModelDataTranslator::prepareFieldValuesForJson( |
|
| 855 | - $field_obj, |
|
| 856 | - $field_value, |
|
| 857 | - $this->getModelVersionInfo()->requestedVersion() |
|
| 858 | - ); |
|
| 859 | - } |
|
| 860 | - $result[ $field_name . '_gmt' ] = $gmt_date; |
|
| 861 | - $result[ $field_name ] = $local_date; |
|
| 862 | - } else { |
|
| 863 | - $result[ $field_name ] = $this->prepareFieldObjValueForJson($field_obj, $field_value); |
|
| 864 | - } |
|
| 865 | - } |
|
| 866 | - if ($do_chevy_shuffle) { |
|
| 867 | - $post = $old_post; |
|
| 868 | - } |
|
| 869 | - return $result; |
|
| 870 | - } |
|
| 871 | - |
|
| 872 | - |
|
| 873 | - /** |
|
| 874 | - * Takes a value all the way from the DB representation, to the model object's representation, to the |
|
| 875 | - * user-facing PHP representation, to the REST API representation. (Assumes you've already taken from the DB |
|
| 876 | - * representation using $field_obj->prepare_for_set_from_db()) |
|
| 877 | - * |
|
| 878 | - * @param EE_Model_Field_Base $field_obj |
|
| 879 | - * @param mixed $value as it's stored on a model object |
|
| 880 | - * @param string $format valid values are 'normal' (default), 'pretty', 'datetime_obj' |
|
| 881 | - * @return mixed |
|
| 882 | - * @throws RestException if $value contains a PHP object |
|
| 883 | - * @throws EE_Error |
|
| 884 | - */ |
|
| 885 | - protected function prepareFieldObjValueForJson(EE_Model_Field_Base $field_obj, $value, $format = 'normal') |
|
| 886 | - { |
|
| 887 | - $value = $field_obj->prepare_for_set_from_db($value); |
|
| 888 | - switch ($format) { |
|
| 889 | - case 'pretty': |
|
| 890 | - $value = $field_obj->prepare_for_pretty_echoing($value); |
|
| 891 | - break; |
|
| 892 | - case 'normal': |
|
| 893 | - default: |
|
| 894 | - $value = $field_obj->prepare_for_get($value); |
|
| 895 | - break; |
|
| 896 | - } |
|
| 897 | - return ModelDataTranslator::prepareFieldValuesForJson( |
|
| 898 | - $field_obj, |
|
| 899 | - $value, |
|
| 900 | - $this->getModelVersionInfo()->requestedVersion() |
|
| 901 | - ); |
|
| 902 | - } |
|
| 903 | - |
|
| 904 | - |
|
| 905 | - /** |
|
| 906 | - * Adds a few extra fields to the entity response |
|
| 907 | - * |
|
| 908 | - * @param EEM_Base $model |
|
| 909 | - * @param array $db_row |
|
| 910 | - * @param array $entity_array |
|
| 911 | - * @return array modified entity |
|
| 912 | - * @throws EE_Error |
|
| 913 | - */ |
|
| 914 | - protected function addExtraFields(EEM_Base $model, $db_row, $entity_array) |
|
| 915 | - { |
|
| 916 | - if ($model instanceof EEM_CPT_Base) { |
|
| 917 | - $entity_array['link'] = get_permalink($db_row[ $model->get_primary_key_field()->get_qualified_column() ]); |
|
| 918 | - } |
|
| 919 | - return $entity_array; |
|
| 920 | - } |
|
| 921 | - |
|
| 922 | - |
|
| 923 | - /** |
|
| 924 | - * Gets links we want to add to the response |
|
| 925 | - * |
|
| 926 | - * @param EEM_Base $model |
|
| 927 | - * @param array $db_row |
|
| 928 | - * @param array $entity_array |
|
| 929 | - * @return array the _links item in the entity |
|
| 930 | - * @throws EE_Error |
|
| 931 | - * @global WP_REST_Server $wp_rest_server |
|
| 932 | - */ |
|
| 933 | - protected function getEntityLinks($model, $db_row, $entity_array) |
|
| 934 | - { |
|
| 935 | - // add basic links |
|
| 936 | - $links = array(); |
|
| 937 | - if ($model->has_primary_key_field()) { |
|
| 938 | - $links['self'] = array( |
|
| 939 | - array( |
|
| 940 | - 'href' => $this->getVersionedLinkTo( |
|
| 941 | - EEH_Inflector::pluralize_and_lower($model->get_this_model_name()) |
|
| 942 | - . '/' |
|
| 943 | - . $entity_array[ $model->primary_key_name() ] |
|
| 944 | - ), |
|
| 945 | - ), |
|
| 946 | - ); |
|
| 947 | - } |
|
| 948 | - $links['collection'] = array( |
|
| 949 | - array( |
|
| 950 | - 'href' => $this->getVersionedLinkTo( |
|
| 951 | - EEH_Inflector::pluralize_and_lower($model->get_this_model_name()) |
|
| 952 | - ), |
|
| 953 | - ), |
|
| 954 | - ); |
|
| 955 | - // add links to related models |
|
| 956 | - if ($model->has_primary_key_field()) { |
|
| 957 | - foreach ($this->getModelVersionInfo()->relationSettings($model) as $relation_name => $relation_obj) { |
|
| 958 | - $related_model_part = Read::getRelatedEntityName($relation_name, $relation_obj); |
|
| 959 | - $links[ EED_Core_Rest_Api::ee_api_link_namespace . $related_model_part ] = array( |
|
| 960 | - array( |
|
| 961 | - 'href' => $this->getVersionedLinkTo( |
|
| 962 | - EEH_Inflector::pluralize_and_lower($model->get_this_model_name()) |
|
| 963 | - . '/' |
|
| 964 | - . $entity_array[ $model->primary_key_name() ] |
|
| 965 | - . '/' |
|
| 966 | - . $related_model_part |
|
| 967 | - ), |
|
| 968 | - 'single' => $relation_obj instanceof EE_Belongs_To_Relation, |
|
| 969 | - ), |
|
| 970 | - ); |
|
| 971 | - } |
|
| 972 | - } |
|
| 973 | - return $links; |
|
| 974 | - } |
|
| 975 | - |
|
| 976 | - |
|
| 977 | - /** |
|
| 978 | - * Adds the included models indicated in the request to the entity provided |
|
| 979 | - * |
|
| 980 | - * @param EEM_Base $model |
|
| 981 | - * @param WP_REST_Request $rest_request |
|
| 982 | - * @param array $entity_array |
|
| 983 | - * @param array $db_row |
|
| 984 | - * @param boolean $included_items_protected if the original item is password protected, don't include any related models. |
|
| 985 | - * @return array the modified entity |
|
| 986 | - * @throws DomainException |
|
| 987 | - * @throws EE_Error |
|
| 988 | - * @throws InvalidArgumentException |
|
| 989 | - * @throws InvalidDataTypeException |
|
| 990 | - * @throws InvalidInterfaceException |
|
| 991 | - * @throws ModelConfigurationException |
|
| 992 | - * @throws ReflectionException |
|
| 993 | - * @throws UnexpectedEntityException |
|
| 994 | - */ |
|
| 995 | - protected function includeRequestedModels( |
|
| 996 | - EEM_Base $model, |
|
| 997 | - WP_REST_Request $rest_request, |
|
| 998 | - $entity_array, |
|
| 999 | - $db_row = array(), |
|
| 1000 | - $included_items_protected = false |
|
| 1001 | - ) { |
|
| 1002 | - // if $db_row not included, hope the entity array has what we need |
|
| 1003 | - if (! $db_row) { |
|
| 1004 | - $db_row = $entity_array; |
|
| 1005 | - } |
|
| 1006 | - $relation_settings = $this->getModelVersionInfo()->relationSettings($model); |
|
| 1007 | - foreach ($relation_settings as $relation_name => $relation_obj) { |
|
| 1008 | - $related_fields_to_include = $this->explodeAndGetItemsPrefixedWith( |
|
| 1009 | - $rest_request->get_param('include'), |
|
| 1010 | - $relation_name |
|
| 1011 | - ); |
|
| 1012 | - $related_fields_to_calculate = $this->explodeAndGetItemsPrefixedWith( |
|
| 1013 | - $rest_request->get_param('calculate'), |
|
| 1014 | - $relation_name |
|
| 1015 | - ); |
|
| 1016 | - // did they specify they wanted to include a related model, or |
|
| 1017 | - // specific fields from a related model? |
|
| 1018 | - // or did they specify to calculate a field from a related model? |
|
| 1019 | - if ($related_fields_to_include || $related_fields_to_calculate) { |
|
| 1020 | - // if so, we should include at least some part of the related model |
|
| 1021 | - $pretend_related_request = new WP_REST_Request(); |
|
| 1022 | - $pretend_related_request->set_query_params( |
|
| 1023 | - array( |
|
| 1024 | - 'caps' => $rest_request->get_param('caps'), |
|
| 1025 | - 'include' => $related_fields_to_include, |
|
| 1026 | - 'calculate' => $related_fields_to_calculate, |
|
| 1027 | - 'password' => $rest_request->get_param('password') |
|
| 1028 | - ) |
|
| 1029 | - ); |
|
| 1030 | - $pretend_related_request->add_header('no_rest_headers', true); |
|
| 1031 | - $primary_model_query_params = $model->alter_query_params_to_restrict_by_ID( |
|
| 1032 | - $model->get_index_primary_key_string( |
|
| 1033 | - $model->deduce_fields_n_values_from_cols_n_values($db_row) |
|
| 1034 | - ) |
|
| 1035 | - ); |
|
| 1036 | - if (! $included_items_protected) { |
|
| 1037 | - try { |
|
| 1038 | - $related_results = $this->getEntitiesFromRelationUsingModelQueryParams( |
|
| 1039 | - $primary_model_query_params, |
|
| 1040 | - $relation_obj, |
|
| 1041 | - $pretend_related_request |
|
| 1042 | - ); |
|
| 1043 | - } catch (RestException $e) { |
|
| 1044 | - $related_results = null; |
|
| 1045 | - } |
|
| 1046 | - } else { |
|
| 1047 | - // they're protected, hide them. |
|
| 1048 | - $related_results = null; |
|
| 1049 | - $entity_array['_protected'][] = Read::getRelatedEntityName($relation_name, $relation_obj); |
|
| 1050 | - } |
|
| 1051 | - if ($related_results instanceof WP_Error || $related_results === null) { |
|
| 1052 | - $related_results = $relation_obj instanceof EE_Belongs_To_Relation ? null : array(); |
|
| 1053 | - } |
|
| 1054 | - $entity_array[ Read::getRelatedEntityName($relation_name, $relation_obj) ] = $related_results; |
|
| 1055 | - } |
|
| 1056 | - } |
|
| 1057 | - return $entity_array; |
|
| 1058 | - } |
|
| 1059 | - |
|
| 1060 | - /** |
|
| 1061 | - * If the user has requested only specific properties (including meta properties like _links or _protected) |
|
| 1062 | - * remove everything else. |
|
| 1063 | - * @since 4.9.74.p |
|
| 1064 | - * @param EEM_Base $model |
|
| 1065 | - * @param WP_REST_Request $rest_request |
|
| 1066 | - * @param $entity_array |
|
| 1067 | - * @return array |
|
| 1068 | - * @throws EE_Error |
|
| 1069 | - */ |
|
| 1070 | - protected function includeOnlyRequestedProperties( |
|
| 1071 | - EEM_Base $model, |
|
| 1072 | - WP_REST_Request $rest_request, |
|
| 1073 | - $entity_array |
|
| 1074 | - ) { |
|
| 1075 | - |
|
| 1076 | - $includes_for_this_model = $this->explodeAndGetItemsPrefixedWith($rest_request->get_param('include'), ''); |
|
| 1077 | - $includes_for_this_model = $this->removeModelNamesFromArray($includes_for_this_model); |
|
| 1078 | - // if they passed in * or didn't specify any includes, return everything |
|
| 1079 | - if (! empty($includes_for_this_model) && ! in_array('*', $includes_for_this_model, true)) { |
|
| 1080 | - if ($model->has_primary_key_field()) { |
|
| 1081 | - // always include the primary key. ya just gotta know that at least |
|
| 1082 | - $includes_for_this_model[] = $model->primary_key_name(); |
|
| 1083 | - } |
|
| 1084 | - if ($this->explodeAndGetItemsPrefixedWith($rest_request->get_param('calculate'), '')) { |
|
| 1085 | - $includes_for_this_model[] = '_calculated_fields'; |
|
| 1086 | - } |
|
| 1087 | - $entity_array = array_intersect_key($entity_array, array_flip($includes_for_this_model)); |
|
| 1088 | - } |
|
| 1089 | - return $entity_array; |
|
| 1090 | - } |
|
| 1091 | - |
|
| 1092 | - |
|
| 1093 | - /** |
|
| 1094 | - * Returns a new array with all the names of models removed. Eg |
|
| 1095 | - * array( 'Event', 'Datetime.*', 'foobar' ) would become array( 'Datetime.*', 'foobar' ) |
|
| 1096 | - * |
|
| 1097 | - * @param array $arr |
|
| 1098 | - * @return array |
|
| 1099 | - */ |
|
| 1100 | - private function removeModelNamesFromArray($arr) |
|
| 1101 | - { |
|
| 1102 | - return array_diff($arr, array_keys(EE_Registry::instance()->non_abstract_db_models)); |
|
| 1103 | - } |
|
| 1104 | - |
|
| 1105 | - |
|
| 1106 | - /** |
|
| 1107 | - * Gets the calculated fields for the response |
|
| 1108 | - * |
|
| 1109 | - * @param EEM_Base $model |
|
| 1110 | - * @param array $wpdb_row |
|
| 1111 | - * @param WP_REST_Request $rest_request |
|
| 1112 | - * @param boolean $row_is_protected whether this row is password protected or not |
|
| 1113 | - * @return stdClass the _calculations item in the entity |
|
| 1114 | - * @throws EE_Error |
|
| 1115 | - * @throws RestException if a default value has a PHP object, which should never do (and if we |
|
| 1116 | - * did, let's know about it ASAP, so let the exception bubble up) |
|
| 1117 | - * @throws UnexpectedEntityException |
|
| 1118 | - */ |
|
| 1119 | - protected function getEntityCalculations($model, $wpdb_row, $rest_request, $row_is_protected = false) |
|
| 1120 | - { |
|
| 1121 | - $calculated_fields = $this->explodeAndGetItemsPrefixedWith( |
|
| 1122 | - $rest_request->get_param('calculate'), |
|
| 1123 | - '' |
|
| 1124 | - ); |
|
| 1125 | - // note: setting calculate=* doesn't do anything |
|
| 1126 | - $calculated_fields_to_return = new stdClass(); |
|
| 1127 | - $protected_fields = array(); |
|
| 1128 | - foreach ($calculated_fields as $field_to_calculate) { |
|
| 1129 | - try { |
|
| 1130 | - // it's password protected, so they shouldn't be able to read this. Remove the value |
|
| 1131 | - $schema = $this->fields_calculator->getJsonSchemaForModel($model); |
|
| 1132 | - if ($row_is_protected |
|
| 1133 | - && isset($schema['properties'][ $field_to_calculate ]['protected']) |
|
| 1134 | - && $schema['properties'][ $field_to_calculate ]['protected']) { |
|
| 1135 | - $calculated_value = null; |
|
| 1136 | - $protected_fields[] = $field_to_calculate; |
|
| 1137 | - if ($schema['properties'][ $field_to_calculate ]['type']) { |
|
| 1138 | - switch ($schema['properties'][ $field_to_calculate ]['type']) { |
|
| 1139 | - case 'boolean': |
|
| 1140 | - $calculated_value = false; |
|
| 1141 | - break; |
|
| 1142 | - case 'integer': |
|
| 1143 | - $calculated_value = 0; |
|
| 1144 | - break; |
|
| 1145 | - case 'string': |
|
| 1146 | - $calculated_value = ''; |
|
| 1147 | - break; |
|
| 1148 | - case 'array': |
|
| 1149 | - $calculated_value = array(); |
|
| 1150 | - break; |
|
| 1151 | - case 'object': |
|
| 1152 | - $calculated_value = new stdClass(); |
|
| 1153 | - break; |
|
| 1154 | - } |
|
| 1155 | - } |
|
| 1156 | - } else { |
|
| 1157 | - $calculated_value = ModelDataTranslator::prepareFieldValueForJson( |
|
| 1158 | - null, |
|
| 1159 | - $this->fields_calculator->retrieveCalculatedFieldValue( |
|
| 1160 | - $model, |
|
| 1161 | - $field_to_calculate, |
|
| 1162 | - $wpdb_row, |
|
| 1163 | - $rest_request, |
|
| 1164 | - $this |
|
| 1165 | - ), |
|
| 1166 | - $this->getModelVersionInfo()->requestedVersion() |
|
| 1167 | - ); |
|
| 1168 | - } |
|
| 1169 | - $calculated_fields_to_return->{$field_to_calculate} = $calculated_value; |
|
| 1170 | - } catch (RestException $e) { |
|
| 1171 | - // if we don't have permission to read it, just leave it out. but let devs know about the problem |
|
| 1172 | - $this->setResponseHeader( |
|
| 1173 | - 'Notices-Field-Calculation-Errors[' |
|
| 1174 | - . $e->getStringCode() |
|
| 1175 | - . '][' |
|
| 1176 | - . $model->get_this_model_name() |
|
| 1177 | - . '][' |
|
| 1178 | - . $field_to_calculate |
|
| 1179 | - . ']', |
|
| 1180 | - $e->getMessage() |
|
| 1181 | - ); |
|
| 1182 | - } |
|
| 1183 | - } |
|
| 1184 | - $calculated_fields_to_return->_protected = $protected_fields; |
|
| 1185 | - return $calculated_fields_to_return; |
|
| 1186 | - } |
|
| 1187 | - |
|
| 1188 | - |
|
| 1189 | - /** |
|
| 1190 | - * Gets the full URL to the resource, taking the requested version into account |
|
| 1191 | - * |
|
| 1192 | - * @param string $link_part_after_version_and_slash eg "events/10/datetimes" |
|
| 1193 | - * @return string url eg "http://mysite.com/wp-json/ee/v4.6/events/10/datetimes" |
|
| 1194 | - * @throws EE_Error |
|
| 1195 | - */ |
|
| 1196 | - public function getVersionedLinkTo($link_part_after_version_and_slash) |
|
| 1197 | - { |
|
| 1198 | - return rest_url( |
|
| 1199 | - EED_Core_Rest_Api::get_versioned_route_to( |
|
| 1200 | - $link_part_after_version_and_slash, |
|
| 1201 | - $this->getModelVersionInfo()->requestedVersion() |
|
| 1202 | - ) |
|
| 1203 | - ); |
|
| 1204 | - } |
|
| 1205 | - |
|
| 1206 | - |
|
| 1207 | - /** |
|
| 1208 | - * Gets the correct lowercase name for the relation in the API according |
|
| 1209 | - * to the relation's type |
|
| 1210 | - * |
|
| 1211 | - * @param string $relation_name |
|
| 1212 | - * @param EE_Model_Relation_Base $relation_obj |
|
| 1213 | - * @return string |
|
| 1214 | - */ |
|
| 1215 | - public static function getRelatedEntityName($relation_name, $relation_obj) |
|
| 1216 | - { |
|
| 1217 | - if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 1218 | - return strtolower($relation_name); |
|
| 1219 | - } |
|
| 1220 | - return EEH_Inflector::pluralize_and_lower($relation_name); |
|
| 1221 | - } |
|
| 1222 | - |
|
| 1223 | - |
|
| 1224 | - /** |
|
| 1225 | - * Gets the one model object with the specified id for the specified model |
|
| 1226 | - * |
|
| 1227 | - * @param EEM_Base $model |
|
| 1228 | - * @param WP_REST_Request $request |
|
| 1229 | - * @return array |
|
| 1230 | - * @throws EE_Error |
|
| 1231 | - * @throws InvalidArgumentException |
|
| 1232 | - * @throws InvalidDataTypeException |
|
| 1233 | - * @throws InvalidInterfaceException |
|
| 1234 | - * @throws ModelConfigurationException |
|
| 1235 | - * @throws ReflectionException |
|
| 1236 | - * @throws RestException |
|
| 1237 | - * @throws RestPasswordIncorrectException |
|
| 1238 | - * @throws RestPasswordRequiredException |
|
| 1239 | - * @throws UnexpectedEntityException |
|
| 1240 | - * @throws DomainException |
|
| 1241 | - */ |
|
| 1242 | - public function getEntityFromModel($model, $request) |
|
| 1243 | - { |
|
| 1244 | - $context = $this->validateContext($request->get_param('caps')); |
|
| 1245 | - return $this->getOneOrReportPermissionError($model, $request, $context); |
|
| 1246 | - } |
|
| 1247 | - |
|
| 1248 | - |
|
| 1249 | - /** |
|
| 1250 | - * If a context is provided which isn't valid, maybe it was added in a future |
|
| 1251 | - * version so just treat it as a default read |
|
| 1252 | - * |
|
| 1253 | - * @param string $context |
|
| 1254 | - * @return string array key of EEM_Base::cap_contexts_to_cap_action_map() |
|
| 1255 | - */ |
|
| 1256 | - public function validateContext($context) |
|
| 1257 | - { |
|
| 1258 | - if (! $context) { |
|
| 1259 | - $context = EEM_Base::caps_read; |
|
| 1260 | - } |
|
| 1261 | - $valid_contexts = EEM_Base::valid_cap_contexts(); |
|
| 1262 | - if (in_array($context, $valid_contexts, true)) { |
|
| 1263 | - return $context; |
|
| 1264 | - } |
|
| 1265 | - return EEM_Base::caps_read; |
|
| 1266 | - } |
|
| 1267 | - |
|
| 1268 | - |
|
| 1269 | - /** |
|
| 1270 | - * Verifies the passed in value is an allowable default where conditions value. |
|
| 1271 | - * |
|
| 1272 | - * @param $default_query_params |
|
| 1273 | - * @return string |
|
| 1274 | - */ |
|
| 1275 | - public function validateDefaultQueryParams($default_query_params) |
|
| 1276 | - { |
|
| 1277 | - $valid_default_where_conditions_for_api_calls = array( |
|
| 1278 | - EEM_Base::default_where_conditions_all, |
|
| 1279 | - EEM_Base::default_where_conditions_minimum_all, |
|
| 1280 | - EEM_Base::default_where_conditions_minimum_others, |
|
| 1281 | - ); |
|
| 1282 | - if (! $default_query_params) { |
|
| 1283 | - $default_query_params = EEM_Base::default_where_conditions_all; |
|
| 1284 | - } |
|
| 1285 | - if (in_array( |
|
| 1286 | - $default_query_params, |
|
| 1287 | - $valid_default_where_conditions_for_api_calls, |
|
| 1288 | - true |
|
| 1289 | - )) { |
|
| 1290 | - return $default_query_params; |
|
| 1291 | - } else { |
|
| 1292 | - return EEM_Base::default_where_conditions_all; |
|
| 1293 | - } |
|
| 1294 | - } |
|
| 1295 | - |
|
| 1296 | - |
|
| 1297 | - /** |
|
| 1298 | - * Translates API filter get parameter into model query params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions. |
|
| 1299 | - * Note: right now the query parameter keys for fields (and related fields) |
|
| 1300 | - * can be left as-is, but it's quite possible this will change someday. |
|
| 1301 | - * Also, this method's contents might be candidate for moving to Model_Data_Translator |
|
| 1302 | - * |
|
| 1303 | - * @param EEM_Base $model |
|
| 1304 | - * @param $query_params |
|
| 1305 | - * @return array model query params (@see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions) |
|
| 1306 | - * or FALSE to indicate that absolutely no results should be returned |
|
| 1307 | - * @throws EE_Error |
|
| 1308 | - * @throws InvalidArgumentException |
|
| 1309 | - * @throws InvalidDataTypeException |
|
| 1310 | - * @throws InvalidInterfaceException |
|
| 1311 | - * @throws RestException |
|
| 1312 | - * @throws DomainException |
|
| 1313 | - */ |
|
| 1314 | - public function createModelQueryParams($model, $query_params) |
|
| 1315 | - { |
|
| 1316 | - $model_query_params = array(); |
|
| 1317 | - if (isset($query_params['where'])) { |
|
| 1318 | - $model_query_params[0] = ModelDataTranslator::prepareConditionsQueryParamsForModels( |
|
| 1319 | - $query_params['where'], |
|
| 1320 | - $model, |
|
| 1321 | - $this->getModelVersionInfo()->requestedVersion() |
|
| 1322 | - ); |
|
| 1323 | - } |
|
| 1324 | - if (isset($query_params['order_by'])) { |
|
| 1325 | - $order_by = $query_params['order_by']; |
|
| 1326 | - } elseif (isset($query_params['orderby'])) { |
|
| 1327 | - $order_by = $query_params['orderby']; |
|
| 1328 | - } else { |
|
| 1329 | - $order_by = null; |
|
| 1330 | - } |
|
| 1331 | - if ($order_by !== null) { |
|
| 1332 | - if (is_array($order_by)) { |
|
| 1333 | - $order_by = ModelDataTranslator::prepareFieldNamesInArrayKeysFromJson($order_by); |
|
| 1334 | - } else { |
|
| 1335 | - // it's a single item |
|
| 1336 | - $order_by = ModelDataTranslator::prepareFieldNameFromJson($order_by); |
|
| 1337 | - } |
|
| 1338 | - $model_query_params['order_by'] = $order_by; |
|
| 1339 | - } |
|
| 1340 | - if (isset($query_params['group_by'])) { |
|
| 1341 | - $group_by = $query_params['group_by']; |
|
| 1342 | - } elseif (isset($query_params['groupby'])) { |
|
| 1343 | - $group_by = $query_params['groupby']; |
|
| 1344 | - } else { |
|
| 1345 | - $group_by = array_keys($model->get_combined_primary_key_fields()); |
|
| 1346 | - } |
|
| 1347 | - // make sure they're all real names |
|
| 1348 | - if (is_array($group_by)) { |
|
| 1349 | - $group_by = ModelDataTranslator::prepareFieldNamesFromJson($group_by); |
|
| 1350 | - } |
|
| 1351 | - if ($group_by !== null) { |
|
| 1352 | - $model_query_params['group_by'] = $group_by; |
|
| 1353 | - } |
|
| 1354 | - if (isset($query_params['having'])) { |
|
| 1355 | - $model_query_params['having'] = ModelDataTranslator::prepareConditionsQueryParamsForModels( |
|
| 1356 | - $query_params['having'], |
|
| 1357 | - $model, |
|
| 1358 | - $this->getModelVersionInfo()->requestedVersion() |
|
| 1359 | - ); |
|
| 1360 | - } |
|
| 1361 | - if (isset($query_params['order'])) { |
|
| 1362 | - $model_query_params['order'] = $query_params['order']; |
|
| 1363 | - } |
|
| 1364 | - if (isset($query_params['mine'])) { |
|
| 1365 | - $model_query_params = $model->alter_query_params_to_only_include_mine($model_query_params); |
|
| 1366 | - } |
|
| 1367 | - if (isset($query_params['limit'])) { |
|
| 1368 | - // limit should be either a string like '23' or '23,43', or an array with two items in it |
|
| 1369 | - if (! is_array($query_params['limit'])) { |
|
| 1370 | - $limit_array = explode(',', (string) $query_params['limit']); |
|
| 1371 | - } else { |
|
| 1372 | - $limit_array = $query_params['limit']; |
|
| 1373 | - } |
|
| 1374 | - $sanitized_limit = array(); |
|
| 1375 | - foreach ($limit_array as $key => $limit_part) { |
|
| 1376 | - if ($this->debug_mode && (! is_numeric($limit_part) || count($sanitized_limit) > 2)) { |
|
| 1377 | - throw new EE_Error( |
|
| 1378 | - sprintf( |
|
| 1379 | - __( |
|
| 1380 | - // @codingStandardsIgnoreStart |
|
| 1381 | - 'An invalid limit filter was provided. It was: %s. If the EE4 JSON REST API weren\'t in debug mode, this message would not appear.', |
|
| 1382 | - // @codingStandardsIgnoreEnd |
|
| 1383 | - 'event_espresso' |
|
| 1384 | - ), |
|
| 1385 | - wp_json_encode($query_params['limit']) |
|
| 1386 | - ) |
|
| 1387 | - ); |
|
| 1388 | - } |
|
| 1389 | - $sanitized_limit[] = (int) $limit_part; |
|
| 1390 | - } |
|
| 1391 | - $model_query_params['limit'] = implode(',', $sanitized_limit); |
|
| 1392 | - } else { |
|
| 1393 | - $model_query_params['limit'] = EED_Core_Rest_Api::get_default_query_limit(); |
|
| 1394 | - } |
|
| 1395 | - if (isset($query_params['caps'])) { |
|
| 1396 | - $model_query_params['caps'] = $this->validateContext($query_params['caps']); |
|
| 1397 | - } else { |
|
| 1398 | - $model_query_params['caps'] = EEM_Base::caps_read; |
|
| 1399 | - } |
|
| 1400 | - if (isset($query_params['default_where_conditions'])) { |
|
| 1401 | - $model_query_params['default_where_conditions'] = $this->validateDefaultQueryParams( |
|
| 1402 | - $query_params['default_where_conditions'] |
|
| 1403 | - ); |
|
| 1404 | - } |
|
| 1405 | - // if this is a model protected by a password on another model, exclude the password protected |
|
| 1406 | - // entities by default. But if they passed in a password, try to show them all. If the password is wrong, |
|
| 1407 | - // though, they'll get an error (see Read::createEntityFromWpdbResult() which calls Read::checkPassword) |
|
| 1408 | - if ($model_query_params['caps'] === EEM_Base::caps_read |
|
| 1409 | - && empty($query_params['password']) |
|
| 1410 | - && ! $model->hasPassword() |
|
| 1411 | - && $model->restrictedByRelatedModelPassword() |
|
| 1412 | - ) { |
|
| 1413 | - $model_query_params['exclude_protected'] = true; |
|
| 1414 | - } |
|
| 1415 | - |
|
| 1416 | - return apply_filters('FHEE__Read__create_model_query_params', $model_query_params, $query_params, $model); |
|
| 1417 | - } |
|
| 1418 | - |
|
| 1419 | - |
|
| 1420 | - /** |
|
| 1421 | - * Changes the REST-style query params for use in the models |
|
| 1422 | - * |
|
| 1423 | - * @deprecated |
|
| 1424 | - * @param EEM_Base $model |
|
| 1425 | - * @param array $query_params sub-array from @see EEM_Base::get_all() |
|
| 1426 | - * @return array |
|
| 1427 | - */ |
|
| 1428 | - public function prepareRestQueryParamsKeyForModels($model, $query_params) |
|
| 1429 | - { |
|
| 1430 | - $model_ready_query_params = array(); |
|
| 1431 | - foreach ($query_params as $key => $value) { |
|
| 1432 | - if (is_array($value)) { |
|
| 1433 | - $model_ready_query_params[ $key ] = $this->prepareRestQueryParamsKeyForModels($model, $value); |
|
| 1434 | - } else { |
|
| 1435 | - $model_ready_query_params[ $key ] = $value; |
|
| 1436 | - } |
|
| 1437 | - } |
|
| 1438 | - return $model_ready_query_params; |
|
| 1439 | - } |
|
| 1440 | - |
|
| 1441 | - |
|
| 1442 | - /** |
|
| 1443 | - * @deprecated instead use ModelDataTranslator::prepareFieldValuesFromJson() |
|
| 1444 | - * @param $model |
|
| 1445 | - * @param $query_params |
|
| 1446 | - * @return array |
|
| 1447 | - */ |
|
| 1448 | - public function prepareRestQueryParamsValuesForModels($model, $query_params) |
|
| 1449 | - { |
|
| 1450 | - $model_ready_query_params = array(); |
|
| 1451 | - foreach ($query_params as $key => $value) { |
|
| 1452 | - if (is_array($value)) { |
|
| 1453 | - $model_ready_query_params[ $key ] = $this->prepareRestQueryParamsValuesForModels($model, $value); |
|
| 1454 | - } else { |
|
| 1455 | - $model_ready_query_params[ $key ] = $value; |
|
| 1456 | - } |
|
| 1457 | - } |
|
| 1458 | - return $model_ready_query_params; |
|
| 1459 | - } |
|
| 1460 | - |
|
| 1461 | - |
|
| 1462 | - /** |
|
| 1463 | - * Explodes the string on commas, and only returns items with $prefix followed by a period. |
|
| 1464 | - * If no prefix is specified, returns items with no period. |
|
| 1465 | - * |
|
| 1466 | - * @param string|array $string_to_explode eg "jibba,jabba, blah, blah, blah" or array('jibba', 'jabba' ) |
|
| 1467 | - * @param string $prefix "Event" or "foobar" |
|
| 1468 | - * @return array $string_to_exploded exploded on COMMAS, and if a prefix was specified |
|
| 1469 | - * we only return strings starting with that and a period; if no prefix was |
|
| 1470 | - * specified we return all items containing NO periods |
|
| 1471 | - */ |
|
| 1472 | - public function explodeAndGetItemsPrefixedWith($string_to_explode, $prefix) |
|
| 1473 | - { |
|
| 1474 | - if (is_string($string_to_explode)) { |
|
| 1475 | - $exploded_contents = explode(',', $string_to_explode); |
|
| 1476 | - } elseif (is_array($string_to_explode)) { |
|
| 1477 | - $exploded_contents = $string_to_explode; |
|
| 1478 | - } else { |
|
| 1479 | - $exploded_contents = array(); |
|
| 1480 | - } |
|
| 1481 | - // if the string was empty, we want an empty array |
|
| 1482 | - $exploded_contents = array_filter($exploded_contents); |
|
| 1483 | - $contents_with_prefix = array(); |
|
| 1484 | - foreach ($exploded_contents as $item) { |
|
| 1485 | - $item = trim($item); |
|
| 1486 | - // if no prefix was provided, so we look for items with no "." in them |
|
| 1487 | - if (! $prefix) { |
|
| 1488 | - // does this item have a period? |
|
| 1489 | - if (strpos($item, '.') === false) { |
|
| 1490 | - // if not, then its what we're looking for |
|
| 1491 | - $contents_with_prefix[] = $item; |
|
| 1492 | - } |
|
| 1493 | - } elseif (strpos($item, $prefix . '.') === 0) { |
|
| 1494 | - // this item has the prefix and a period, grab it |
|
| 1495 | - $contents_with_prefix[] = substr( |
|
| 1496 | - $item, |
|
| 1497 | - strpos($item, $prefix . '.') + strlen($prefix . '.') |
|
| 1498 | - ); |
|
| 1499 | - } elseif ($item === $prefix) { |
|
| 1500 | - // this item is JUST the prefix |
|
| 1501 | - // so let's grab everything after, which is a blank string |
|
| 1502 | - $contents_with_prefix[] = ''; |
|
| 1503 | - } |
|
| 1504 | - } |
|
| 1505 | - return $contents_with_prefix; |
|
| 1506 | - } |
|
| 1507 | - |
|
| 1508 | - |
|
| 1509 | - /** |
|
| 1510 | - * @param string $include_string @see Read:handle_request_get_all |
|
| 1511 | - * @param string $model_name |
|
| 1512 | - * @return array of fields for this model. If $model_name is provided, then |
|
| 1513 | - * the fields for that model, with the model's name removed from each. |
|
| 1514 | - * If $include_string was blank or '*' returns an empty array |
|
| 1515 | - * @throws EE_Error |
|
| 1516 | - * @deprecated since 4.8.36.rc.001 You should instead use Read::explode_and_get_items_prefixed_with. |
|
| 1517 | - * Deprecated because its return values were really quite confusing- sometimes it returned |
|
| 1518 | - * an empty array (when the include string was blank or '*') or sometimes it returned |
|
| 1519 | - * array('*') (when you provided a model and a model of that kind was found). |
|
| 1520 | - * Parses the $include_string so we fetch all the field names relating to THIS model |
|
| 1521 | - * (ie have NO period in them), or for the provided model (ie start with the model |
|
| 1522 | - * name and then a period). |
|
| 1523 | - */ |
|
| 1524 | - public function extractIncludesForThisModel($include_string, $model_name = null) |
|
| 1525 | - { |
|
| 1526 | - if (is_array($include_string)) { |
|
| 1527 | - $include_string = implode(',', $include_string); |
|
| 1528 | - } |
|
| 1529 | - if ($include_string === '*' || $include_string === '') { |
|
| 1530 | - return array(); |
|
| 1531 | - } |
|
| 1532 | - $includes = explode(',', $include_string); |
|
| 1533 | - $extracted_fields_to_include = array(); |
|
| 1534 | - if ($model_name) { |
|
| 1535 | - foreach ($includes as $field_to_include) { |
|
| 1536 | - $field_to_include = trim($field_to_include); |
|
| 1537 | - if (strpos($field_to_include, $model_name . '.') === 0) { |
|
| 1538 | - // found the model name at the exact start |
|
| 1539 | - $field_sans_model_name = str_replace($model_name . '.', '', $field_to_include); |
|
| 1540 | - $extracted_fields_to_include[] = $field_sans_model_name; |
|
| 1541 | - } elseif ($field_to_include === $model_name) { |
|
| 1542 | - $extracted_fields_to_include[] = '*'; |
|
| 1543 | - } |
|
| 1544 | - } |
|
| 1545 | - } else { |
|
| 1546 | - // look for ones with no period |
|
| 1547 | - foreach ($includes as $field_to_include) { |
|
| 1548 | - $field_to_include = trim($field_to_include); |
|
| 1549 | - if (strpos($field_to_include, '.') === false |
|
| 1550 | - && ! $this->getModelVersionInfo()->isModelNameInThisVersion($field_to_include) |
|
| 1551 | - ) { |
|
| 1552 | - $extracted_fields_to_include[] = $field_to_include; |
|
| 1553 | - } |
|
| 1554 | - } |
|
| 1555 | - } |
|
| 1556 | - return $extracted_fields_to_include; |
|
| 1557 | - } |
|
| 1558 | - |
|
| 1559 | - |
|
| 1560 | - /** |
|
| 1561 | - * Gets the single item using the model according to the request in the context given, otherwise |
|
| 1562 | - * returns that it's inaccessible to the current user |
|
| 1563 | - * |
|
| 1564 | - * @param EEM_Base $model |
|
| 1565 | - * @param WP_REST_Request $request |
|
| 1566 | - * @param null $context |
|
| 1567 | - * @return array |
|
| 1568 | - * @throws EE_Error |
|
| 1569 | - * @throws InvalidArgumentException |
|
| 1570 | - * @throws InvalidDataTypeException |
|
| 1571 | - * @throws InvalidInterfaceException |
|
| 1572 | - * @throws ModelConfigurationException |
|
| 1573 | - * @throws ReflectionException |
|
| 1574 | - * @throws RestException |
|
| 1575 | - * @throws RestPasswordIncorrectException |
|
| 1576 | - * @throws RestPasswordRequiredException |
|
| 1577 | - * @throws UnexpectedEntityException |
|
| 1578 | - * @throws DomainException |
|
| 1579 | - */ |
|
| 1580 | - public function getOneOrReportPermissionError(EEM_Base $model, WP_REST_Request $request, $context = null) |
|
| 1581 | - { |
|
| 1582 | - $query_params = array(array($model->primary_key_name() => $request->get_param('id')), 'limit' => 1); |
|
| 1583 | - if ($model instanceof EEM_Soft_Delete_Base) { |
|
| 1584 | - $query_params = $model->alter_query_params_so_deleted_and_undeleted_items_included($query_params); |
|
| 1585 | - } |
|
| 1586 | - $restricted_query_params = $query_params; |
|
| 1587 | - $restricted_query_params['caps'] = $context; |
|
| 1588 | - $this->setDebugInfo('model query params', $restricted_query_params); |
|
| 1589 | - $model_rows = $model->get_all_wpdb_results($restricted_query_params); |
|
| 1590 | - if (! empty($model_rows)) { |
|
| 1591 | - return $this->createEntityFromWpdbResult( |
|
| 1592 | - $model, |
|
| 1593 | - reset($model_rows), |
|
| 1594 | - $request |
|
| 1595 | - ); |
|
| 1596 | - } |
|
| 1597 | - // ok let's test to see if we WOULD have found it, had we not had restrictions from missing capabilities |
|
| 1598 | - $lowercase_model_name = strtolower($model->get_this_model_name()); |
|
| 1599 | - if ($model->exists($query_params)) { |
|
| 1600 | - // you got shafted- it existed but we didn't want to tell you! |
|
| 1601 | - throw new RestException( |
|
| 1602 | - 'rest_user_cannot_' . $context, |
|
| 1603 | - sprintf( |
|
| 1604 | - __('Sorry, you cannot %1$s this %2$s. Missing permissions are: %3$s', 'event_espresso'), |
|
| 1605 | - $context, |
|
| 1606 | - $lowercase_model_name, |
|
| 1607 | - Capabilities::getMissingPermissionsString( |
|
| 1608 | - $model, |
|
| 1609 | - $context |
|
| 1610 | - ) |
|
| 1611 | - ), |
|
| 1612 | - array('status' => 403) |
|
| 1613 | - ); |
|
| 1614 | - } |
|
| 1615 | - // it's not you. It just doesn't exist |
|
| 1616 | - throw new RestException( |
|
| 1617 | - sprintf('rest_%s_invalid_id', $lowercase_model_name), |
|
| 1618 | - sprintf(__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name), |
|
| 1619 | - array('status' => 404) |
|
| 1620 | - ); |
|
| 1621 | - } |
|
| 1622 | - |
|
| 1623 | - /** |
|
| 1624 | - * Checks that if this content requires a password to be read, that it's been provided and is correct. |
|
| 1625 | - * @since 4.9.74.p |
|
| 1626 | - * @param EEM_Base $model |
|
| 1627 | - * @param $model_row |
|
| 1628 | - * @param array $query_params Adds 'default_where_conditions' => 'minimum' to ensure we don't confuse trashed with |
|
| 1629 | - * password protected. |
|
| 1630 | - * @param WP_REST_Request $request |
|
| 1631 | - * @throws EE_Error |
|
| 1632 | - * @throws InvalidArgumentException |
|
| 1633 | - * @throws InvalidDataTypeException |
|
| 1634 | - * @throws InvalidInterfaceException |
|
| 1635 | - * @throws RestPasswordRequiredException |
|
| 1636 | - * @throws RestPasswordIncorrectException |
|
| 1637 | - * @throws ModelConfigurationException |
|
| 1638 | - * @throws ReflectionException |
|
| 1639 | - */ |
|
| 1640 | - protected function checkPassword(EEM_Base $model, $model_row, $query_params, WP_REST_Request $request) |
|
| 1641 | - { |
|
| 1642 | - $query_params['default_where_conditions'] = 'minimum'; |
|
| 1643 | - // stuff is only "protected" for front-end requests. Elsewhere, you either get full permission to access the object |
|
| 1644 | - // or you don't. |
|
| 1645 | - $request_caps = $request->get_param('caps'); |
|
| 1646 | - if (isset($request_caps) && $request_caps !== EEM_Base::caps_read) { |
|
| 1647 | - return; |
|
| 1648 | - } |
|
| 1649 | - // if this entity requires a password, they better give it and it better be right! |
|
| 1650 | - if ($model->hasPassword() |
|
| 1651 | - && $model_row[ $model->getPasswordField()->get_qualified_column() ] !== '') { |
|
| 1652 | - if (empty($request['password'])) { |
|
| 1653 | - throw new RestPasswordRequiredException(); |
|
| 1654 | - } |
|
| 1655 | - if (!hash_equals( |
|
| 1656 | - $model_row[ $model->getPasswordField()->get_qualified_column() ], |
|
| 1657 | - $request['password'] |
|
| 1658 | - )) { |
|
| 1659 | - throw new RestPasswordIncorrectException(); |
|
| 1660 | - } |
|
| 1661 | - } // wait! maybe this content is password protected |
|
| 1662 | - elseif ($model->restrictedByRelatedModelPassword() |
|
| 1663 | - && $request->get_param('caps') === EEM_Base::caps_read) { |
|
| 1664 | - $password_supplied = $request->get_param('password'); |
|
| 1665 | - if (empty($password_supplied)) { |
|
| 1666 | - $query_params['exclude_protected'] = true; |
|
| 1667 | - if (!$model->exists($query_params)) { |
|
| 1668 | - throw new RestPasswordRequiredException(); |
|
| 1669 | - } |
|
| 1670 | - } else { |
|
| 1671 | - $query_params[0][ $model->modelChainAndPassword() ] = $password_supplied; |
|
| 1672 | - if (!$model->exists($query_params)) { |
|
| 1673 | - throw new RestPasswordIncorrectException(); |
|
| 1674 | - } |
|
| 1675 | - } |
|
| 1676 | - } |
|
| 1677 | - } |
|
| 55 | + /** |
|
| 56 | + * @var CalculatedModelFields |
|
| 57 | + */ |
|
| 58 | + protected $fields_calculator; |
|
| 59 | + |
|
| 60 | + |
|
| 61 | + /** |
|
| 62 | + * Read constructor. |
|
| 63 | + * @param CalculatedModelFields $fields_calculator |
|
| 64 | + */ |
|
| 65 | + public function __construct(CalculatedModelFields $fields_calculator) |
|
| 66 | + { |
|
| 67 | + parent::__construct(); |
|
| 68 | + $this->fields_calculator = $fields_calculator; |
|
| 69 | + } |
|
| 70 | + |
|
| 71 | + |
|
| 72 | + /** |
|
| 73 | + * Handles requests to get all (or a filtered subset) of entities for a particular model |
|
| 74 | + * |
|
| 75 | + * @param WP_REST_Request $request |
|
| 76 | + * @param string $version |
|
| 77 | + * @param string $model_name |
|
| 78 | + * @return WP_REST_Response|WP_Error |
|
| 79 | + * @throws InvalidArgumentException |
|
| 80 | + * @throws InvalidDataTypeException |
|
| 81 | + * @throws InvalidInterfaceException |
|
| 82 | + */ |
|
| 83 | + public static function handleRequestGetAll(WP_REST_Request $request, $version, $model_name) |
|
| 84 | + { |
|
| 85 | + $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
|
| 86 | + try { |
|
| 87 | + $controller->setRequestedVersion($version); |
|
| 88 | + if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 89 | + return $controller->sendResponse( |
|
| 90 | + new WP_Error( |
|
| 91 | + 'endpoint_parsing_error', |
|
| 92 | + sprintf( |
|
| 93 | + __( |
|
| 94 | + 'There is no model for endpoint %s. Please contact event espresso support', |
|
| 95 | + 'event_espresso' |
|
| 96 | + ), |
|
| 97 | + $model_name |
|
| 98 | + ) |
|
| 99 | + ) |
|
| 100 | + ); |
|
| 101 | + } |
|
| 102 | + return $controller->sendResponse( |
|
| 103 | + $controller->getEntitiesFromModel( |
|
| 104 | + $controller->getModelVersionInfo()->loadModel($model_name), |
|
| 105 | + $request |
|
| 106 | + ) |
|
| 107 | + ); |
|
| 108 | + } catch (Exception $e) { |
|
| 109 | + return $controller->sendResponse($e); |
|
| 110 | + } |
|
| 111 | + } |
|
| 112 | + |
|
| 113 | + |
|
| 114 | + /** |
|
| 115 | + * Prepares and returns schema for any OPTIONS request. |
|
| 116 | + * |
|
| 117 | + * @param string $version The API endpoint version being used. |
|
| 118 | + * @param string $model_name Something like `Event` or `Registration` |
|
| 119 | + * @return array |
|
| 120 | + * @throws InvalidArgumentException |
|
| 121 | + * @throws InvalidDataTypeException |
|
| 122 | + * @throws InvalidInterfaceException |
|
| 123 | + */ |
|
| 124 | + public static function handleSchemaRequest($version, $model_name) |
|
| 125 | + { |
|
| 126 | + $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
|
| 127 | + try { |
|
| 128 | + $controller->setRequestedVersion($version); |
|
| 129 | + if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 130 | + return array(); |
|
| 131 | + } |
|
| 132 | + // get the model for this version |
|
| 133 | + $model = $controller->getModelVersionInfo()->loadModel($model_name); |
|
| 134 | + $model_schema = new JsonModelSchema($model, LoaderFactory::getLoader()->getShared('EventEspresso\core\libraries\rest_api\CalculatedModelFields')); |
|
| 135 | + return $model_schema->getModelSchemaForRelations( |
|
| 136 | + $controller->getModelVersionInfo()->relationSettings($model), |
|
| 137 | + $controller->customizeSchemaForRestResponse( |
|
| 138 | + $model, |
|
| 139 | + $model_schema->getModelSchemaForFields( |
|
| 140 | + $controller->getModelVersionInfo()->fieldsOnModelInThisVersion($model), |
|
| 141 | + $model_schema->getInitialSchemaStructure() |
|
| 142 | + ) |
|
| 143 | + ) |
|
| 144 | + ); |
|
| 145 | + } catch (Exception $e) { |
|
| 146 | + return array(); |
|
| 147 | + } |
|
| 148 | + } |
|
| 149 | + |
|
| 150 | + |
|
| 151 | + /** |
|
| 152 | + * This loops through each field in the given schema for the model and does the following: |
|
| 153 | + * - add any extra fields that are REST API specific and related to existing fields. |
|
| 154 | + * - transform default values into the correct format for a REST API response. |
|
| 155 | + * |
|
| 156 | + * @param EEM_Base $model |
|
| 157 | + * @param array $schema |
|
| 158 | + * @return array The final schema. |
|
| 159 | + * @throws EE_Error |
|
| 160 | + */ |
|
| 161 | + public function customizeSchemaForRestResponse(EEM_Base $model, array $schema) |
|
| 162 | + { |
|
| 163 | + foreach ($this->getModelVersionInfo()->fieldsOnModelInThisVersion($model) as $field_name => $field) { |
|
| 164 | + $schema = $this->translateDefaultsForRestResponse( |
|
| 165 | + $field_name, |
|
| 166 | + $field, |
|
| 167 | + $this->maybeAddExtraFieldsToSchema($field_name, $field, $schema) |
|
| 168 | + ); |
|
| 169 | + } |
|
| 170 | + return $schema; |
|
| 171 | + } |
|
| 172 | + |
|
| 173 | + |
|
| 174 | + /** |
|
| 175 | + * This is used to ensure that the 'default' value set in the schema response is formatted correctly for the REST |
|
| 176 | + * response. |
|
| 177 | + * |
|
| 178 | + * @param $field_name |
|
| 179 | + * @param EE_Model_Field_Base $field |
|
| 180 | + * @param array $schema |
|
| 181 | + * @return array |
|
| 182 | + * @throws RestException if a default value has a PHP object, which should never do (and if we |
|
| 183 | + * @throws EE_Error |
|
| 184 | + * did, let's know about it ASAP, so let the exception bubble up) |
|
| 185 | + */ |
|
| 186 | + protected function translateDefaultsForRestResponse($field_name, EE_Model_Field_Base $field, array $schema) |
|
| 187 | + { |
|
| 188 | + if (isset($schema['properties'][ $field_name ]['default'])) { |
|
| 189 | + if (is_array($schema['properties'][ $field_name ]['default'])) { |
|
| 190 | + foreach ($schema['properties'][ $field_name ]['default'] as $default_key => $default_value) { |
|
| 191 | + if ($default_key === 'raw') { |
|
| 192 | + $schema['properties'][ $field_name ]['default'][ $default_key ] = |
|
| 193 | + ModelDataTranslator::prepareFieldValueForJson( |
|
| 194 | + $field, |
|
| 195 | + $default_value, |
|
| 196 | + $this->getModelVersionInfo()->requestedVersion() |
|
| 197 | + ); |
|
| 198 | + } |
|
| 199 | + } |
|
| 200 | + } else { |
|
| 201 | + $schema['properties'][ $field_name ]['default'] = ModelDataTranslator::prepareFieldValueForJson( |
|
| 202 | + $field, |
|
| 203 | + $schema['properties'][ $field_name ]['default'], |
|
| 204 | + $this->getModelVersionInfo()->requestedVersion() |
|
| 205 | + ); |
|
| 206 | + } |
|
| 207 | + } |
|
| 208 | + return $schema; |
|
| 209 | + } |
|
| 210 | + |
|
| 211 | + |
|
| 212 | + /** |
|
| 213 | + * Adds additional fields to the schema |
|
| 214 | + * The REST API returns a GMT value field for each datetime field in the resource. Thus the description about this |
|
| 215 | + * needs to be added to the schema. |
|
| 216 | + * |
|
| 217 | + * @param $field_name |
|
| 218 | + * @param EE_Model_Field_Base $field |
|
| 219 | + * @param array $schema |
|
| 220 | + * @return array |
|
| 221 | + */ |
|
| 222 | + protected function maybeAddExtraFieldsToSchema($field_name, EE_Model_Field_Base $field, array $schema) |
|
| 223 | + { |
|
| 224 | + if ($field instanceof EE_Datetime_Field) { |
|
| 225 | + $schema['properties'][ $field_name . '_gmt' ] = $field->getSchema(); |
|
| 226 | + // modify the description |
|
| 227 | + $schema['properties'][ $field_name . '_gmt' ]['description'] = sprintf( |
|
| 228 | + esc_html__('%s - the value for this field is in GMT.', 'event_espresso'), |
|
| 229 | + wp_specialchars_decode($field->get_nicename(), ENT_QUOTES) |
|
| 230 | + ); |
|
| 231 | + } |
|
| 232 | + return $schema; |
|
| 233 | + } |
|
| 234 | + |
|
| 235 | + |
|
| 236 | + /** |
|
| 237 | + * Used to figure out the route from the request when a `WP_REST_Request` object is not available |
|
| 238 | + * |
|
| 239 | + * @return string |
|
| 240 | + */ |
|
| 241 | + protected function getRouteFromRequest() |
|
| 242 | + { |
|
| 243 | + if (isset($GLOBALS['wp']) |
|
| 244 | + && $GLOBALS['wp'] instanceof WP |
|
| 245 | + && isset($GLOBALS['wp']->query_vars['rest_route']) |
|
| 246 | + ) { |
|
| 247 | + return $GLOBALS['wp']->query_vars['rest_route']; |
|
| 248 | + } |
|
| 249 | + return isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/'; |
|
| 250 | + } |
|
| 251 | + |
|
| 252 | + |
|
| 253 | + /** |
|
| 254 | + * Gets a single entity related to the model indicated in the path and its id |
|
| 255 | + * |
|
| 256 | + * @param WP_REST_Request $request |
|
| 257 | + * @param string $version |
|
| 258 | + * @param string $model_name |
|
| 259 | + * @return WP_REST_Response|WP_Error |
|
| 260 | + * @throws InvalidDataTypeException |
|
| 261 | + * @throws InvalidInterfaceException |
|
| 262 | + * @throws InvalidArgumentException |
|
| 263 | + */ |
|
| 264 | + public static function handleRequestGetOne(WP_REST_Request $request, $version, $model_name) |
|
| 265 | + { |
|
| 266 | + $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
|
| 267 | + try { |
|
| 268 | + $controller->setRequestedVersion($version); |
|
| 269 | + if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 270 | + return $controller->sendResponse( |
|
| 271 | + new WP_Error( |
|
| 272 | + 'endpoint_parsing_error', |
|
| 273 | + sprintf( |
|
| 274 | + __( |
|
| 275 | + 'There is no model for endpoint %s. Please contact event espresso support', |
|
| 276 | + 'event_espresso' |
|
| 277 | + ), |
|
| 278 | + $model_name |
|
| 279 | + ) |
|
| 280 | + ) |
|
| 281 | + ); |
|
| 282 | + } |
|
| 283 | + return $controller->sendResponse( |
|
| 284 | + $controller->getEntityFromModel( |
|
| 285 | + $controller->getModelVersionInfo()->loadModel($model_name), |
|
| 286 | + $request |
|
| 287 | + ) |
|
| 288 | + ); |
|
| 289 | + } catch (Exception $e) { |
|
| 290 | + return $controller->sendResponse($e); |
|
| 291 | + } |
|
| 292 | + } |
|
| 293 | + |
|
| 294 | + |
|
| 295 | + /** |
|
| 296 | + * Gets all the related entities (or if its a belongs-to relation just the one) |
|
| 297 | + * to the item with the given id |
|
| 298 | + * |
|
| 299 | + * @param WP_REST_Request $request |
|
| 300 | + * @param string $version |
|
| 301 | + * @param string $model_name |
|
| 302 | + * @param string $related_model_name |
|
| 303 | + * @return WP_REST_Response|WP_Error |
|
| 304 | + * @throws InvalidDataTypeException |
|
| 305 | + * @throws InvalidInterfaceException |
|
| 306 | + * @throws InvalidArgumentException |
|
| 307 | + */ |
|
| 308 | + public static function handleRequestGetRelated( |
|
| 309 | + WP_REST_Request $request, |
|
| 310 | + $version, |
|
| 311 | + $model_name, |
|
| 312 | + $related_model_name |
|
| 313 | + ) { |
|
| 314 | + $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
|
| 315 | + try { |
|
| 316 | + $controller->setRequestedVersion($version); |
|
| 317 | + $main_model = $controller->validateModel($model_name); |
|
| 318 | + $controller->validateModel($related_model_name); |
|
| 319 | + return $controller->sendResponse( |
|
| 320 | + $controller->getEntitiesFromRelation( |
|
| 321 | + $request->get_param('id'), |
|
| 322 | + $main_model->related_settings_for($related_model_name), |
|
| 323 | + $request |
|
| 324 | + ) |
|
| 325 | + ); |
|
| 326 | + } catch (Exception $e) { |
|
| 327 | + return $controller->sendResponse($e); |
|
| 328 | + } |
|
| 329 | + } |
|
| 330 | + |
|
| 331 | + |
|
| 332 | + /** |
|
| 333 | + * Gets a collection for the given model and filters |
|
| 334 | + * |
|
| 335 | + * @param EEM_Base $model |
|
| 336 | + * @param WP_REST_Request $request |
|
| 337 | + * @return array |
|
| 338 | + * @throws DomainException |
|
| 339 | + * @throws EE_Error |
|
| 340 | + * @throws InvalidArgumentException |
|
| 341 | + * @throws InvalidDataTypeException |
|
| 342 | + * @throws InvalidInterfaceException |
|
| 343 | + * @throws ModelConfigurationException |
|
| 344 | + * @throws ReflectionException |
|
| 345 | + * @throws RestException |
|
| 346 | + * @throws RestPasswordIncorrectException |
|
| 347 | + * @throws RestPasswordRequiredException |
|
| 348 | + * @throws UnexpectedEntityException |
|
| 349 | + */ |
|
| 350 | + public function getEntitiesFromModel($model, $request) |
|
| 351 | + { |
|
| 352 | + $query_params = $this->createModelQueryParams($model, $request->get_params()); |
|
| 353 | + if (! Capabilities::currentUserHasPartialAccessTo($model, $query_params['caps'])) { |
|
| 354 | + $model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name()); |
|
| 355 | + throw new RestException( |
|
| 356 | + sprintf('rest_%s_cannot_list', $model_name_plural), |
|
| 357 | + sprintf( |
|
| 358 | + __('Sorry, you are not allowed to list %1$s. Missing permissions: %2$s', 'event_espresso'), |
|
| 359 | + $model_name_plural, |
|
| 360 | + Capabilities::getMissingPermissionsString($model, $query_params['caps']) |
|
| 361 | + ), |
|
| 362 | + array('status' => 403) |
|
| 363 | + ); |
|
| 364 | + } |
|
| 365 | + if (! $request->get_header('no_rest_headers')) { |
|
| 366 | + $this->setHeadersFromQueryParams($model, $query_params); |
|
| 367 | + } |
|
| 368 | + /** @type array $results */ |
|
| 369 | + $results = $model->get_all_wpdb_results($query_params); |
|
| 370 | + $nice_results = array(); |
|
| 371 | + foreach ($results as $result) { |
|
| 372 | + $nice_results[] = $this->createEntityFromWpdbResult( |
|
| 373 | + $model, |
|
| 374 | + $result, |
|
| 375 | + $request |
|
| 376 | + ); |
|
| 377 | + } |
|
| 378 | + return $nice_results; |
|
| 379 | + } |
|
| 380 | + |
|
| 381 | + |
|
| 382 | + /** |
|
| 383 | + * Gets the collection for given relation object |
|
| 384 | + * The same as Read::get_entities_from_model(), except if the relation |
|
| 385 | + * is a HABTM relation, in which case it merges any non-foreign-key fields from |
|
| 386 | + * the join-model-object into the results |
|
| 387 | + * |
|
| 388 | + * @param array $primary_model_query_params query params for finding the item from which |
|
| 389 | + * relations will be based |
|
| 390 | + * @param EE_Model_Relation_Base $relation |
|
| 391 | + * @param WP_REST_Request $request |
|
| 392 | + * @return array |
|
| 393 | + * @throws DomainException |
|
| 394 | + * @throws EE_Error |
|
| 395 | + * @throws InvalidArgumentException |
|
| 396 | + * @throws InvalidDataTypeException |
|
| 397 | + * @throws InvalidInterfaceException |
|
| 398 | + * @throws ModelConfigurationException |
|
| 399 | + * @throws ReflectionException |
|
| 400 | + * @throws RestException |
|
| 401 | + * @throws RestPasswordIncorrectException |
|
| 402 | + * @throws RestPasswordRequiredException |
|
| 403 | + * @throws UnexpectedEntityException |
|
| 404 | + */ |
|
| 405 | + protected function getEntitiesFromRelationUsingModelQueryParams($primary_model_query_params, $relation, $request) |
|
| 406 | + { |
|
| 407 | + $context = $this->validateContext($request->get_param('caps')); |
|
| 408 | + $model = $relation->get_this_model(); |
|
| 409 | + $related_model = $relation->get_other_model(); |
|
| 410 | + if (! isset($primary_model_query_params[0])) { |
|
| 411 | + $primary_model_query_params[0] = array(); |
|
| 412 | + } |
|
| 413 | + // check if they can access the 1st model object |
|
| 414 | + $primary_model_query_params = array( |
|
| 415 | + 0 => $primary_model_query_params[0], |
|
| 416 | + 'limit' => 1, |
|
| 417 | + ); |
|
| 418 | + if ($model instanceof EEM_Soft_Delete_Base) { |
|
| 419 | + $primary_model_query_params = $model->alter_query_params_so_deleted_and_undeleted_items_included( |
|
| 420 | + $primary_model_query_params |
|
| 421 | + ); |
|
| 422 | + } |
|
| 423 | + $restricted_query_params = $primary_model_query_params; |
|
| 424 | + $restricted_query_params['caps'] = $context; |
|
| 425 | + $restricted_query_params['limit'] = 1; |
|
| 426 | + $this->setDebugInfo('main model query params', $restricted_query_params); |
|
| 427 | + $this->setDebugInfo('missing caps', Capabilities::getMissingPermissionsString($related_model, $context)); |
|
| 428 | + $primary_model_rows = $model->get_all_wpdb_results($restricted_query_params); |
|
| 429 | + $primary_model_row = null; |
|
| 430 | + if (is_array($primary_model_rows)) { |
|
| 431 | + $primary_model_row = reset($primary_model_rows); |
|
| 432 | + } |
|
| 433 | + if (! ( |
|
| 434 | + $primary_model_row |
|
| 435 | + && Capabilities::currentUserHasPartialAccessTo($related_model, $context) |
|
| 436 | + ) |
|
| 437 | + ) { |
|
| 438 | + if ($relation instanceof EE_Belongs_To_Relation) { |
|
| 439 | + $related_model_name_maybe_plural = strtolower($related_model->get_this_model_name()); |
|
| 440 | + } else { |
|
| 441 | + $related_model_name_maybe_plural = EEH_Inflector::pluralize_and_lower( |
|
| 442 | + $related_model->get_this_model_name() |
|
| 443 | + ); |
|
| 444 | + } |
|
| 445 | + throw new RestException( |
|
| 446 | + sprintf('rest_%s_cannot_list', $related_model_name_maybe_plural), |
|
| 447 | + sprintf( |
|
| 448 | + __( |
|
| 449 | + 'Sorry, you are not allowed to list %1$s related to %2$s. Missing permissions: %3$s', |
|
| 450 | + 'event_espresso' |
|
| 451 | + ), |
|
| 452 | + $related_model_name_maybe_plural, |
|
| 453 | + $relation->get_this_model()->get_this_model_name(), |
|
| 454 | + implode( |
|
| 455 | + ',', |
|
| 456 | + array_keys( |
|
| 457 | + Capabilities::getMissingPermissions($related_model, $context) |
|
| 458 | + ) |
|
| 459 | + ) |
|
| 460 | + ), |
|
| 461 | + array('status' => 403) |
|
| 462 | + ); |
|
| 463 | + } |
|
| 464 | + |
|
| 465 | + $this->checkPassword( |
|
| 466 | + $model, |
|
| 467 | + $primary_model_row, |
|
| 468 | + $restricted_query_params, |
|
| 469 | + $request |
|
| 470 | + ); |
|
| 471 | + $query_params = $this->createModelQueryParams($relation->get_other_model(), $request->get_params()); |
|
| 472 | + foreach ($primary_model_query_params[0] as $where_condition_key => $where_condition_value) { |
|
| 473 | + $query_params[0][ $relation->get_this_model()->get_this_model_name() |
|
| 474 | + . '.' |
|
| 475 | + . $where_condition_key ] = $where_condition_value; |
|
| 476 | + } |
|
| 477 | + $query_params['default_where_conditions'] = 'none'; |
|
| 478 | + $query_params['caps'] = $context; |
|
| 479 | + if (! $request->get_header('no_rest_headers')) { |
|
| 480 | + $this->setHeadersFromQueryParams($relation->get_other_model(), $query_params); |
|
| 481 | + } |
|
| 482 | + /** @type array $results */ |
|
| 483 | + $results = $relation->get_other_model()->get_all_wpdb_results($query_params); |
|
| 484 | + $nice_results = array(); |
|
| 485 | + foreach ($results as $result) { |
|
| 486 | + $nice_result = $this->createEntityFromWpdbResult( |
|
| 487 | + $relation->get_other_model(), |
|
| 488 | + $result, |
|
| 489 | + $request |
|
| 490 | + ); |
|
| 491 | + if ($relation instanceof EE_HABTM_Relation) { |
|
| 492 | + // put the unusual stuff (properties from the HABTM relation) first, and make sure |
|
| 493 | + // if there are conflicts we prefer the properties from the main model |
|
| 494 | + $join_model_result = $this->createEntityFromWpdbResult( |
|
| 495 | + $relation->get_join_model(), |
|
| 496 | + $result, |
|
| 497 | + $request |
|
| 498 | + ); |
|
| 499 | + $joined_result = array_merge($join_model_result, $nice_result); |
|
| 500 | + // but keep the meta stuff from the main model |
|
| 501 | + if (isset($nice_result['meta'])) { |
|
| 502 | + $joined_result['meta'] = $nice_result['meta']; |
|
| 503 | + } |
|
| 504 | + $nice_result = $joined_result; |
|
| 505 | + } |
|
| 506 | + $nice_results[] = $nice_result; |
|
| 507 | + } |
|
| 508 | + if ($relation instanceof EE_Belongs_To_Relation) { |
|
| 509 | + return array_shift($nice_results); |
|
| 510 | + } else { |
|
| 511 | + return $nice_results; |
|
| 512 | + } |
|
| 513 | + } |
|
| 514 | + |
|
| 515 | + |
|
| 516 | + /** |
|
| 517 | + * Gets the collection for given relation object |
|
| 518 | + * The same as Read::get_entities_from_model(), except if the relation |
|
| 519 | + * is a HABTM relation, in which case it merges any non-foreign-key fields from |
|
| 520 | + * the join-model-object into the results |
|
| 521 | + * |
|
| 522 | + * @param string $id the ID of the thing we are fetching related stuff from |
|
| 523 | + * @param EE_Model_Relation_Base $relation |
|
| 524 | + * @param WP_REST_Request $request |
|
| 525 | + * @return array |
|
| 526 | + * @throws DomainException |
|
| 527 | + * @throws EE_Error |
|
| 528 | + * @throws InvalidArgumentException |
|
| 529 | + * @throws InvalidDataTypeException |
|
| 530 | + * @throws InvalidInterfaceException |
|
| 531 | + * @throws ModelConfigurationException |
|
| 532 | + * @throws ReflectionException |
|
| 533 | + * @throws RestException |
|
| 534 | + * @throws RestPasswordIncorrectException |
|
| 535 | + * @throws RestPasswordRequiredException |
|
| 536 | + * @throws UnexpectedEntityException |
|
| 537 | + */ |
|
| 538 | + public function getEntitiesFromRelation($id, $relation, $request) |
|
| 539 | + { |
|
| 540 | + if (! $relation->get_this_model()->has_primary_key_field()) { |
|
| 541 | + throw new EE_Error( |
|
| 542 | + sprintf( |
|
| 543 | + __( |
|
| 544 | + // @codingStandardsIgnoreStart |
|
| 545 | + 'Read::get_entities_from_relation should only be called from a model with a primary key, it was called from %1$s', |
|
| 546 | + // @codingStandardsIgnoreEnd |
|
| 547 | + 'event_espresso' |
|
| 548 | + ), |
|
| 549 | + $relation->get_this_model()->get_this_model_name() |
|
| 550 | + ) |
|
| 551 | + ); |
|
| 552 | + } |
|
| 553 | + // can we edit that main item? |
|
| 554 | + // if not, show nothing but an error |
|
| 555 | + // otherwise, please proceed |
|
| 556 | + return $this->getEntitiesFromRelationUsingModelQueryParams( |
|
| 557 | + array( |
|
| 558 | + array( |
|
| 559 | + $relation->get_this_model()->primary_key_name() => $id, |
|
| 560 | + ), |
|
| 561 | + ), |
|
| 562 | + $relation, |
|
| 563 | + $request |
|
| 564 | + ); |
|
| 565 | + } |
|
| 566 | + |
|
| 567 | + |
|
| 568 | + /** |
|
| 569 | + * Sets the headers that are based on the model and query params, |
|
| 570 | + * like the total records. This should only be called on the original request |
|
| 571 | + * from the client, not on subsequent internal |
|
| 572 | + * |
|
| 573 | + * @param EEM_Base $model |
|
| 574 | + * @param array $query_params |
|
| 575 | + * @return void |
|
| 576 | + * @throws EE_Error |
|
| 577 | + */ |
|
| 578 | + protected function setHeadersFromQueryParams($model, $query_params) |
|
| 579 | + { |
|
| 580 | + $this->setDebugInfo('model query params', $query_params); |
|
| 581 | + $this->setDebugInfo( |
|
| 582 | + 'missing caps', |
|
| 583 | + Capabilities::getMissingPermissionsString($model, $query_params['caps']) |
|
| 584 | + ); |
|
| 585 | + // normally the limit to a 2-part array, where the 2nd item is the limit |
|
| 586 | + if (! isset($query_params['limit'])) { |
|
| 587 | + $query_params['limit'] = EED_Core_Rest_Api::get_default_query_limit(); |
|
| 588 | + } |
|
| 589 | + if (is_array($query_params['limit'])) { |
|
| 590 | + $limit_parts = $query_params['limit']; |
|
| 591 | + } else { |
|
| 592 | + $limit_parts = explode(',', $query_params['limit']); |
|
| 593 | + if (count($limit_parts) === 1) { |
|
| 594 | + $limit_parts = array(0, $limit_parts[0]); |
|
| 595 | + } |
|
| 596 | + } |
|
| 597 | + // remove the group by and having parts of the query, as those will |
|
| 598 | + // make the sql query return an array of values, instead of just a single value |
|
| 599 | + unset($query_params['group_by'], $query_params['having'], $query_params['limit']); |
|
| 600 | + $count = $model->count($query_params, null, true); |
|
| 601 | + $pages = $count / $limit_parts[1]; |
|
| 602 | + $this->setResponseHeader('Total', $count, false); |
|
| 603 | + $this->setResponseHeader('PageSize', $limit_parts[1], false); |
|
| 604 | + $this->setResponseHeader('TotalPages', ceil($pages), false); |
|
| 605 | + } |
|
| 606 | + |
|
| 607 | + |
|
| 608 | + /** |
|
| 609 | + * Changes database results into REST API entities |
|
| 610 | + * |
|
| 611 | + * @param EEM_Base $model |
|
| 612 | + * @param array $db_row like results from $wpdb->get_results() |
|
| 613 | + * @param WP_REST_Request $rest_request |
|
| 614 | + * @param string $deprecated no longer used |
|
| 615 | + * @return array ready for being converted into json for sending to client |
|
| 616 | + * @throws EE_Error |
|
| 617 | + * @throws InvalidArgumentException |
|
| 618 | + * @throws InvalidDataTypeException |
|
| 619 | + * @throws InvalidInterfaceException |
|
| 620 | + * @throws ReflectionException |
|
| 621 | + * @throws RestException |
|
| 622 | + * @throws RestPasswordIncorrectException |
|
| 623 | + * @throws RestPasswordRequiredException |
|
| 624 | + * @throws ModelConfigurationException |
|
| 625 | + * @throws UnexpectedEntityException |
|
| 626 | + * @throws DomainException |
|
| 627 | + */ |
|
| 628 | + public function createEntityFromWpdbResult($model, $db_row, $rest_request, $deprecated = null) |
|
| 629 | + { |
|
| 630 | + if (! $rest_request instanceof WP_REST_Request) { |
|
| 631 | + // ok so this was called in the old style, where the 3rd arg was |
|
| 632 | + // $include, and the 4th arg was $context |
|
| 633 | + // now setup the request just to avoid fatal errors, although we won't be able |
|
| 634 | + // to truly make use of it because it's kinda devoid of info |
|
| 635 | + $rest_request = new WP_REST_Request(); |
|
| 636 | + $rest_request->set_param('include', $rest_request); |
|
| 637 | + $rest_request->set_param('caps', $deprecated); |
|
| 638 | + } |
|
| 639 | + if ($rest_request->get_param('caps') === null) { |
|
| 640 | + $rest_request->set_param('caps', EEM_Base::caps_read); |
|
| 641 | + } |
|
| 642 | + $current_user_full_access_to_entity = $model->currentUserCan( |
|
| 643 | + EEM_Base::caps_read_admin, |
|
| 644 | + $model->deduce_fields_n_values_from_cols_n_values($db_row) |
|
| 645 | + ); |
|
| 646 | + $entity_array = $this->createBareEntityFromWpdbResults($model, $db_row); |
|
| 647 | + $entity_array = $this->addExtraFields($model, $db_row, $entity_array); |
|
| 648 | + $entity_array['_links'] = $this->getEntityLinks($model, $db_row, $entity_array); |
|
| 649 | + // when it's a regular read request for a model with a password and the password wasn't provided |
|
| 650 | + // remove the password protected fields |
|
| 651 | + $has_protected_fields = false; |
|
| 652 | + try { |
|
| 653 | + $this->checkPassword( |
|
| 654 | + $model, |
|
| 655 | + $db_row, |
|
| 656 | + $model->alter_query_params_to_restrict_by_ID( |
|
| 657 | + $model->get_index_primary_key_string( |
|
| 658 | + $model->deduce_fields_n_values_from_cols_n_values($db_row) |
|
| 659 | + ) |
|
| 660 | + ), |
|
| 661 | + $rest_request |
|
| 662 | + ); |
|
| 663 | + } catch (RestPasswordRequiredException $e) { |
|
| 664 | + if ($model->hasPassword()) { |
|
| 665 | + // just remove protected fields |
|
| 666 | + $has_protected_fields = true; |
|
| 667 | + $entity_array = Capabilities::filterOutPasswordProtectedFields( |
|
| 668 | + $entity_array, |
|
| 669 | + $model, |
|
| 670 | + $this->getModelVersionInfo() |
|
| 671 | + ); |
|
| 672 | + } else { |
|
| 673 | + // that's a problem. None of this should be accessible if no password was provided |
|
| 674 | + throw $e; |
|
| 675 | + } |
|
| 676 | + } |
|
| 677 | + |
|
| 678 | + $entity_array['_calculated_fields'] = $this->getEntityCalculations($model, $db_row, $rest_request, $has_protected_fields); |
|
| 679 | + $entity_array = apply_filters( |
|
| 680 | + 'FHEE__Read__create_entity_from_wpdb_results__entity_before_including_requested_models', |
|
| 681 | + $entity_array, |
|
| 682 | + $model, |
|
| 683 | + $rest_request->get_param('caps'), |
|
| 684 | + $rest_request, |
|
| 685 | + $this |
|
| 686 | + ); |
|
| 687 | + // add an empty protected property for now. If it's still around after we remove everything the request didn't |
|
| 688 | + // want, we'll populate it then. k? |
|
| 689 | + $entity_array['_protected'] = array(); |
|
| 690 | + // remove any properties the request didn't want. This way _protected won't bother mentioning them |
|
| 691 | + $entity_array = $this->includeOnlyRequestedProperties($model, $rest_request, $entity_array); |
|
| 692 | + $entity_array = $this->includeRequestedModels($model, $rest_request, $entity_array, $db_row, $has_protected_fields); |
|
| 693 | + // if they still wanted the _protected property, add it. |
|
| 694 | + if (isset($entity_array['_protected'])) { |
|
| 695 | + $entity_array = $this->addProtectedProperty($model, $entity_array, $has_protected_fields); |
|
| 696 | + } |
|
| 697 | + $entity_array = apply_filters( |
|
| 698 | + 'FHEE__Read__create_entity_from_wpdb_results__entity_before_inaccessible_field_removal', |
|
| 699 | + $entity_array, |
|
| 700 | + $model, |
|
| 701 | + $rest_request->get_param('caps'), |
|
| 702 | + $rest_request, |
|
| 703 | + $this |
|
| 704 | + ); |
|
| 705 | + if (! $current_user_full_access_to_entity) { |
|
| 706 | + $result_without_inaccessible_fields = Capabilities::filterOutInaccessibleEntityFields( |
|
| 707 | + $entity_array, |
|
| 708 | + $model, |
|
| 709 | + $rest_request->get_param('caps'), |
|
| 710 | + $this->getModelVersionInfo() |
|
| 711 | + ); |
|
| 712 | + } else { |
|
| 713 | + $result_without_inaccessible_fields = $entity_array; |
|
| 714 | + } |
|
| 715 | + $this->setDebugInfo( |
|
| 716 | + 'inaccessible fields', |
|
| 717 | + array_keys(array_diff_key((array) $entity_array, (array) $result_without_inaccessible_fields)) |
|
| 718 | + ); |
|
| 719 | + return apply_filters( |
|
| 720 | + 'FHEE__Read__create_entity_from_wpdb_results__entity_return', |
|
| 721 | + $result_without_inaccessible_fields, |
|
| 722 | + $model, |
|
| 723 | + $rest_request->get_param('caps') |
|
| 724 | + ); |
|
| 725 | + } |
|
| 726 | + |
|
| 727 | + |
|
| 728 | + /** |
|
| 729 | + * Returns an array describing which fields can be protected, and which actually were removed this request |
|
| 730 | + * |
|
| 731 | + * @param $model |
|
| 732 | + * @param $results_so_far |
|
| 733 | + * @param $protected |
|
| 734 | + * @return array results |
|
| 735 | + * @throws EE_Error |
|
| 736 | + * @since 4.9.74.p |
|
| 737 | + */ |
|
| 738 | + protected function addProtectedProperty(EEM_Base $model, $results_so_far, $protected) |
|
| 739 | + { |
|
| 740 | + if (! $protected || ! $model->hasPassword()) { |
|
| 741 | + return $results_so_far; |
|
| 742 | + } |
|
| 743 | + $password_field = $model->getPasswordField(); |
|
| 744 | + $all_protected = array_merge( |
|
| 745 | + array($password_field->get_name()), |
|
| 746 | + $password_field->protectedFields() |
|
| 747 | + ); |
|
| 748 | + $fields_included = array_keys($results_so_far); |
|
| 749 | + $fields_included = array_intersect( |
|
| 750 | + $all_protected, |
|
| 751 | + $fields_included |
|
| 752 | + ); |
|
| 753 | + foreach ($fields_included as $field_name) { |
|
| 754 | + $results_so_far['_protected'][] = $field_name ; |
|
| 755 | + } |
|
| 756 | + return $results_so_far; |
|
| 757 | + } |
|
| 758 | + |
|
| 759 | + |
|
| 760 | + /** |
|
| 761 | + * Creates a REST entity array (JSON object we're going to return in the response, but |
|
| 762 | + * for now still a PHP array, but soon enough we'll call json_encode on it, don't worry), |
|
| 763 | + * from $wpdb->get_row( $sql, ARRAY_A) |
|
| 764 | + * |
|
| 765 | + * @param EEM_Base $model |
|
| 766 | + * @param array $db_row |
|
| 767 | + * @return array entity mostly ready for converting to JSON and sending in the response |
|
| 768 | + * @throws EE_Error |
|
| 769 | + * @throws InvalidArgumentException |
|
| 770 | + * @throws InvalidDataTypeException |
|
| 771 | + * @throws InvalidInterfaceException |
|
| 772 | + * @throws ReflectionException |
|
| 773 | + * @throws RestException |
|
| 774 | + */ |
|
| 775 | + protected function createBareEntityFromWpdbResults(EEM_Base $model, $db_row) |
|
| 776 | + { |
|
| 777 | + $result = $model->deduce_fields_n_values_from_cols_n_values($db_row); |
|
| 778 | + $result = array_intersect_key( |
|
| 779 | + $result, |
|
| 780 | + $this->getModelVersionInfo()->fieldsOnModelInThisVersion($model) |
|
| 781 | + ); |
|
| 782 | + // if this is a CPT, we need to set the global $post to it, |
|
| 783 | + // otherwise shortcodes etc won't work properly while rendering it |
|
| 784 | + if ($model instanceof \EEM_CPT_Base) { |
|
| 785 | + $do_chevy_shuffle = true; |
|
| 786 | + } else { |
|
| 787 | + $do_chevy_shuffle = false; |
|
| 788 | + } |
|
| 789 | + if ($do_chevy_shuffle) { |
|
| 790 | + global $post; |
|
| 791 | + $old_post = $post; |
|
| 792 | + $post = get_post($result[ $model->primary_key_name() ]); |
|
| 793 | + if (! $post instanceof WP_Post) { |
|
| 794 | + // well that's weird, because $result is what we JUST fetched from the database |
|
| 795 | + throw new RestException( |
|
| 796 | + 'error_fetching_post_from_database_results', |
|
| 797 | + esc_html__( |
|
| 798 | + 'An item was retrieved from the database but it\'s not a WP_Post like it should be.', |
|
| 799 | + 'event_espresso' |
|
| 800 | + ) |
|
| 801 | + ); |
|
| 802 | + } |
|
| 803 | + $model_object_classname = 'EE_' . $model->get_this_model_name(); |
|
| 804 | + $post->{$model_object_classname} = \EE_Registry::instance()->load_class( |
|
| 805 | + $model_object_classname, |
|
| 806 | + $result, |
|
| 807 | + false, |
|
| 808 | + false |
|
| 809 | + ); |
|
| 810 | + } |
|
| 811 | + foreach ($result as $field_name => $field_value) { |
|
| 812 | + $field_obj = $model->field_settings_for($field_name); |
|
| 813 | + if ($this->isSubclassOfOne($field_obj, $this->getModelVersionInfo()->fieldsIgnored())) { |
|
| 814 | + unset($result[ $field_name ]); |
|
| 815 | + } elseif ($this->isSubclassOfOne( |
|
| 816 | + $field_obj, |
|
| 817 | + $this->getModelVersionInfo()->fieldsThatHaveRenderedFormat() |
|
| 818 | + ) |
|
| 819 | + ) { |
|
| 820 | + $result[ $field_name ] = array( |
|
| 821 | + 'raw' => $this->prepareFieldObjValueForJson($field_obj, $field_value), |
|
| 822 | + 'rendered' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'), |
|
| 823 | + ); |
|
| 824 | + } elseif ($this->isSubclassOfOne( |
|
| 825 | + $field_obj, |
|
| 826 | + $this->getModelVersionInfo()->fieldsThatHavePrettyFormat() |
|
| 827 | + ) |
|
| 828 | + ) { |
|
| 829 | + $result[ $field_name ] = array( |
|
| 830 | + 'raw' => $this->prepareFieldObjValueForJson($field_obj, $field_value), |
|
| 831 | + 'pretty' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'), |
|
| 832 | + ); |
|
| 833 | + } elseif ($field_obj instanceof \EE_Datetime_Field) { |
|
| 834 | + $field_value = $field_obj->prepare_for_set_from_db($field_value); |
|
| 835 | + // if the value is null, but we're not supposed to permit null, then set to the field's default |
|
| 836 | + if (is_null($field_value)) { |
|
| 837 | + $field_value = $field_obj->getDefaultDateTimeObj(); |
|
| 838 | + } |
|
| 839 | + if (is_null($field_value)) { |
|
| 840 | + $gmt_date = $local_date = ModelDataTranslator::prepareFieldValuesForJson( |
|
| 841 | + $field_obj, |
|
| 842 | + $field_value, |
|
| 843 | + $this->getModelVersionInfo()->requestedVersion() |
|
| 844 | + ); |
|
| 845 | + } else { |
|
| 846 | + $timezone = $field_value->getTimezone(); |
|
| 847 | + EEH_DTT_Helper::setTimezone($field_value, new DateTimeZone('UTC')); |
|
| 848 | + $gmt_date = ModelDataTranslator::prepareFieldValuesForJson( |
|
| 849 | + $field_obj, |
|
| 850 | + $field_value, |
|
| 851 | + $this->getModelVersionInfo()->requestedVersion() |
|
| 852 | + ); |
|
| 853 | + EEH_DTT_Helper::setTimezone($field_value, $timezone); |
|
| 854 | + $local_date = ModelDataTranslator::prepareFieldValuesForJson( |
|
| 855 | + $field_obj, |
|
| 856 | + $field_value, |
|
| 857 | + $this->getModelVersionInfo()->requestedVersion() |
|
| 858 | + ); |
|
| 859 | + } |
|
| 860 | + $result[ $field_name . '_gmt' ] = $gmt_date; |
|
| 861 | + $result[ $field_name ] = $local_date; |
|
| 862 | + } else { |
|
| 863 | + $result[ $field_name ] = $this->prepareFieldObjValueForJson($field_obj, $field_value); |
|
| 864 | + } |
|
| 865 | + } |
|
| 866 | + if ($do_chevy_shuffle) { |
|
| 867 | + $post = $old_post; |
|
| 868 | + } |
|
| 869 | + return $result; |
|
| 870 | + } |
|
| 871 | + |
|
| 872 | + |
|
| 873 | + /** |
|
| 874 | + * Takes a value all the way from the DB representation, to the model object's representation, to the |
|
| 875 | + * user-facing PHP representation, to the REST API representation. (Assumes you've already taken from the DB |
|
| 876 | + * representation using $field_obj->prepare_for_set_from_db()) |
|
| 877 | + * |
|
| 878 | + * @param EE_Model_Field_Base $field_obj |
|
| 879 | + * @param mixed $value as it's stored on a model object |
|
| 880 | + * @param string $format valid values are 'normal' (default), 'pretty', 'datetime_obj' |
|
| 881 | + * @return mixed |
|
| 882 | + * @throws RestException if $value contains a PHP object |
|
| 883 | + * @throws EE_Error |
|
| 884 | + */ |
|
| 885 | + protected function prepareFieldObjValueForJson(EE_Model_Field_Base $field_obj, $value, $format = 'normal') |
|
| 886 | + { |
|
| 887 | + $value = $field_obj->prepare_for_set_from_db($value); |
|
| 888 | + switch ($format) { |
|
| 889 | + case 'pretty': |
|
| 890 | + $value = $field_obj->prepare_for_pretty_echoing($value); |
|
| 891 | + break; |
|
| 892 | + case 'normal': |
|
| 893 | + default: |
|
| 894 | + $value = $field_obj->prepare_for_get($value); |
|
| 895 | + break; |
|
| 896 | + } |
|
| 897 | + return ModelDataTranslator::prepareFieldValuesForJson( |
|
| 898 | + $field_obj, |
|
| 899 | + $value, |
|
| 900 | + $this->getModelVersionInfo()->requestedVersion() |
|
| 901 | + ); |
|
| 902 | + } |
|
| 903 | + |
|
| 904 | + |
|
| 905 | + /** |
|
| 906 | + * Adds a few extra fields to the entity response |
|
| 907 | + * |
|
| 908 | + * @param EEM_Base $model |
|
| 909 | + * @param array $db_row |
|
| 910 | + * @param array $entity_array |
|
| 911 | + * @return array modified entity |
|
| 912 | + * @throws EE_Error |
|
| 913 | + */ |
|
| 914 | + protected function addExtraFields(EEM_Base $model, $db_row, $entity_array) |
|
| 915 | + { |
|
| 916 | + if ($model instanceof EEM_CPT_Base) { |
|
| 917 | + $entity_array['link'] = get_permalink($db_row[ $model->get_primary_key_field()->get_qualified_column() ]); |
|
| 918 | + } |
|
| 919 | + return $entity_array; |
|
| 920 | + } |
|
| 921 | + |
|
| 922 | + |
|
| 923 | + /** |
|
| 924 | + * Gets links we want to add to the response |
|
| 925 | + * |
|
| 926 | + * @param EEM_Base $model |
|
| 927 | + * @param array $db_row |
|
| 928 | + * @param array $entity_array |
|
| 929 | + * @return array the _links item in the entity |
|
| 930 | + * @throws EE_Error |
|
| 931 | + * @global WP_REST_Server $wp_rest_server |
|
| 932 | + */ |
|
| 933 | + protected function getEntityLinks($model, $db_row, $entity_array) |
|
| 934 | + { |
|
| 935 | + // add basic links |
|
| 936 | + $links = array(); |
|
| 937 | + if ($model->has_primary_key_field()) { |
|
| 938 | + $links['self'] = array( |
|
| 939 | + array( |
|
| 940 | + 'href' => $this->getVersionedLinkTo( |
|
| 941 | + EEH_Inflector::pluralize_and_lower($model->get_this_model_name()) |
|
| 942 | + . '/' |
|
| 943 | + . $entity_array[ $model->primary_key_name() ] |
|
| 944 | + ), |
|
| 945 | + ), |
|
| 946 | + ); |
|
| 947 | + } |
|
| 948 | + $links['collection'] = array( |
|
| 949 | + array( |
|
| 950 | + 'href' => $this->getVersionedLinkTo( |
|
| 951 | + EEH_Inflector::pluralize_and_lower($model->get_this_model_name()) |
|
| 952 | + ), |
|
| 953 | + ), |
|
| 954 | + ); |
|
| 955 | + // add links to related models |
|
| 956 | + if ($model->has_primary_key_field()) { |
|
| 957 | + foreach ($this->getModelVersionInfo()->relationSettings($model) as $relation_name => $relation_obj) { |
|
| 958 | + $related_model_part = Read::getRelatedEntityName($relation_name, $relation_obj); |
|
| 959 | + $links[ EED_Core_Rest_Api::ee_api_link_namespace . $related_model_part ] = array( |
|
| 960 | + array( |
|
| 961 | + 'href' => $this->getVersionedLinkTo( |
|
| 962 | + EEH_Inflector::pluralize_and_lower($model->get_this_model_name()) |
|
| 963 | + . '/' |
|
| 964 | + . $entity_array[ $model->primary_key_name() ] |
|
| 965 | + . '/' |
|
| 966 | + . $related_model_part |
|
| 967 | + ), |
|
| 968 | + 'single' => $relation_obj instanceof EE_Belongs_To_Relation, |
|
| 969 | + ), |
|
| 970 | + ); |
|
| 971 | + } |
|
| 972 | + } |
|
| 973 | + return $links; |
|
| 974 | + } |
|
| 975 | + |
|
| 976 | + |
|
| 977 | + /** |
|
| 978 | + * Adds the included models indicated in the request to the entity provided |
|
| 979 | + * |
|
| 980 | + * @param EEM_Base $model |
|
| 981 | + * @param WP_REST_Request $rest_request |
|
| 982 | + * @param array $entity_array |
|
| 983 | + * @param array $db_row |
|
| 984 | + * @param boolean $included_items_protected if the original item is password protected, don't include any related models. |
|
| 985 | + * @return array the modified entity |
|
| 986 | + * @throws DomainException |
|
| 987 | + * @throws EE_Error |
|
| 988 | + * @throws InvalidArgumentException |
|
| 989 | + * @throws InvalidDataTypeException |
|
| 990 | + * @throws InvalidInterfaceException |
|
| 991 | + * @throws ModelConfigurationException |
|
| 992 | + * @throws ReflectionException |
|
| 993 | + * @throws UnexpectedEntityException |
|
| 994 | + */ |
|
| 995 | + protected function includeRequestedModels( |
|
| 996 | + EEM_Base $model, |
|
| 997 | + WP_REST_Request $rest_request, |
|
| 998 | + $entity_array, |
|
| 999 | + $db_row = array(), |
|
| 1000 | + $included_items_protected = false |
|
| 1001 | + ) { |
|
| 1002 | + // if $db_row not included, hope the entity array has what we need |
|
| 1003 | + if (! $db_row) { |
|
| 1004 | + $db_row = $entity_array; |
|
| 1005 | + } |
|
| 1006 | + $relation_settings = $this->getModelVersionInfo()->relationSettings($model); |
|
| 1007 | + foreach ($relation_settings as $relation_name => $relation_obj) { |
|
| 1008 | + $related_fields_to_include = $this->explodeAndGetItemsPrefixedWith( |
|
| 1009 | + $rest_request->get_param('include'), |
|
| 1010 | + $relation_name |
|
| 1011 | + ); |
|
| 1012 | + $related_fields_to_calculate = $this->explodeAndGetItemsPrefixedWith( |
|
| 1013 | + $rest_request->get_param('calculate'), |
|
| 1014 | + $relation_name |
|
| 1015 | + ); |
|
| 1016 | + // did they specify they wanted to include a related model, or |
|
| 1017 | + // specific fields from a related model? |
|
| 1018 | + // or did they specify to calculate a field from a related model? |
|
| 1019 | + if ($related_fields_to_include || $related_fields_to_calculate) { |
|
| 1020 | + // if so, we should include at least some part of the related model |
|
| 1021 | + $pretend_related_request = new WP_REST_Request(); |
|
| 1022 | + $pretend_related_request->set_query_params( |
|
| 1023 | + array( |
|
| 1024 | + 'caps' => $rest_request->get_param('caps'), |
|
| 1025 | + 'include' => $related_fields_to_include, |
|
| 1026 | + 'calculate' => $related_fields_to_calculate, |
|
| 1027 | + 'password' => $rest_request->get_param('password') |
|
| 1028 | + ) |
|
| 1029 | + ); |
|
| 1030 | + $pretend_related_request->add_header('no_rest_headers', true); |
|
| 1031 | + $primary_model_query_params = $model->alter_query_params_to_restrict_by_ID( |
|
| 1032 | + $model->get_index_primary_key_string( |
|
| 1033 | + $model->deduce_fields_n_values_from_cols_n_values($db_row) |
|
| 1034 | + ) |
|
| 1035 | + ); |
|
| 1036 | + if (! $included_items_protected) { |
|
| 1037 | + try { |
|
| 1038 | + $related_results = $this->getEntitiesFromRelationUsingModelQueryParams( |
|
| 1039 | + $primary_model_query_params, |
|
| 1040 | + $relation_obj, |
|
| 1041 | + $pretend_related_request |
|
| 1042 | + ); |
|
| 1043 | + } catch (RestException $e) { |
|
| 1044 | + $related_results = null; |
|
| 1045 | + } |
|
| 1046 | + } else { |
|
| 1047 | + // they're protected, hide them. |
|
| 1048 | + $related_results = null; |
|
| 1049 | + $entity_array['_protected'][] = Read::getRelatedEntityName($relation_name, $relation_obj); |
|
| 1050 | + } |
|
| 1051 | + if ($related_results instanceof WP_Error || $related_results === null) { |
|
| 1052 | + $related_results = $relation_obj instanceof EE_Belongs_To_Relation ? null : array(); |
|
| 1053 | + } |
|
| 1054 | + $entity_array[ Read::getRelatedEntityName($relation_name, $relation_obj) ] = $related_results; |
|
| 1055 | + } |
|
| 1056 | + } |
|
| 1057 | + return $entity_array; |
|
| 1058 | + } |
|
| 1059 | + |
|
| 1060 | + /** |
|
| 1061 | + * If the user has requested only specific properties (including meta properties like _links or _protected) |
|
| 1062 | + * remove everything else. |
|
| 1063 | + * @since 4.9.74.p |
|
| 1064 | + * @param EEM_Base $model |
|
| 1065 | + * @param WP_REST_Request $rest_request |
|
| 1066 | + * @param $entity_array |
|
| 1067 | + * @return array |
|
| 1068 | + * @throws EE_Error |
|
| 1069 | + */ |
|
| 1070 | + protected function includeOnlyRequestedProperties( |
|
| 1071 | + EEM_Base $model, |
|
| 1072 | + WP_REST_Request $rest_request, |
|
| 1073 | + $entity_array |
|
| 1074 | + ) { |
|
| 1075 | + |
|
| 1076 | + $includes_for_this_model = $this->explodeAndGetItemsPrefixedWith($rest_request->get_param('include'), ''); |
|
| 1077 | + $includes_for_this_model = $this->removeModelNamesFromArray($includes_for_this_model); |
|
| 1078 | + // if they passed in * or didn't specify any includes, return everything |
|
| 1079 | + if (! empty($includes_for_this_model) && ! in_array('*', $includes_for_this_model, true)) { |
|
| 1080 | + if ($model->has_primary_key_field()) { |
|
| 1081 | + // always include the primary key. ya just gotta know that at least |
|
| 1082 | + $includes_for_this_model[] = $model->primary_key_name(); |
|
| 1083 | + } |
|
| 1084 | + if ($this->explodeAndGetItemsPrefixedWith($rest_request->get_param('calculate'), '')) { |
|
| 1085 | + $includes_for_this_model[] = '_calculated_fields'; |
|
| 1086 | + } |
|
| 1087 | + $entity_array = array_intersect_key($entity_array, array_flip($includes_for_this_model)); |
|
| 1088 | + } |
|
| 1089 | + return $entity_array; |
|
| 1090 | + } |
|
| 1091 | + |
|
| 1092 | + |
|
| 1093 | + /** |
|
| 1094 | + * Returns a new array with all the names of models removed. Eg |
|
| 1095 | + * array( 'Event', 'Datetime.*', 'foobar' ) would become array( 'Datetime.*', 'foobar' ) |
|
| 1096 | + * |
|
| 1097 | + * @param array $arr |
|
| 1098 | + * @return array |
|
| 1099 | + */ |
|
| 1100 | + private function removeModelNamesFromArray($arr) |
|
| 1101 | + { |
|
| 1102 | + return array_diff($arr, array_keys(EE_Registry::instance()->non_abstract_db_models)); |
|
| 1103 | + } |
|
| 1104 | + |
|
| 1105 | + |
|
| 1106 | + /** |
|
| 1107 | + * Gets the calculated fields for the response |
|
| 1108 | + * |
|
| 1109 | + * @param EEM_Base $model |
|
| 1110 | + * @param array $wpdb_row |
|
| 1111 | + * @param WP_REST_Request $rest_request |
|
| 1112 | + * @param boolean $row_is_protected whether this row is password protected or not |
|
| 1113 | + * @return stdClass the _calculations item in the entity |
|
| 1114 | + * @throws EE_Error |
|
| 1115 | + * @throws RestException if a default value has a PHP object, which should never do (and if we |
|
| 1116 | + * did, let's know about it ASAP, so let the exception bubble up) |
|
| 1117 | + * @throws UnexpectedEntityException |
|
| 1118 | + */ |
|
| 1119 | + protected function getEntityCalculations($model, $wpdb_row, $rest_request, $row_is_protected = false) |
|
| 1120 | + { |
|
| 1121 | + $calculated_fields = $this->explodeAndGetItemsPrefixedWith( |
|
| 1122 | + $rest_request->get_param('calculate'), |
|
| 1123 | + '' |
|
| 1124 | + ); |
|
| 1125 | + // note: setting calculate=* doesn't do anything |
|
| 1126 | + $calculated_fields_to_return = new stdClass(); |
|
| 1127 | + $protected_fields = array(); |
|
| 1128 | + foreach ($calculated_fields as $field_to_calculate) { |
|
| 1129 | + try { |
|
| 1130 | + // it's password protected, so they shouldn't be able to read this. Remove the value |
|
| 1131 | + $schema = $this->fields_calculator->getJsonSchemaForModel($model); |
|
| 1132 | + if ($row_is_protected |
|
| 1133 | + && isset($schema['properties'][ $field_to_calculate ]['protected']) |
|
| 1134 | + && $schema['properties'][ $field_to_calculate ]['protected']) { |
|
| 1135 | + $calculated_value = null; |
|
| 1136 | + $protected_fields[] = $field_to_calculate; |
|
| 1137 | + if ($schema['properties'][ $field_to_calculate ]['type']) { |
|
| 1138 | + switch ($schema['properties'][ $field_to_calculate ]['type']) { |
|
| 1139 | + case 'boolean': |
|
| 1140 | + $calculated_value = false; |
|
| 1141 | + break; |
|
| 1142 | + case 'integer': |
|
| 1143 | + $calculated_value = 0; |
|
| 1144 | + break; |
|
| 1145 | + case 'string': |
|
| 1146 | + $calculated_value = ''; |
|
| 1147 | + break; |
|
| 1148 | + case 'array': |
|
| 1149 | + $calculated_value = array(); |
|
| 1150 | + break; |
|
| 1151 | + case 'object': |
|
| 1152 | + $calculated_value = new stdClass(); |
|
| 1153 | + break; |
|
| 1154 | + } |
|
| 1155 | + } |
|
| 1156 | + } else { |
|
| 1157 | + $calculated_value = ModelDataTranslator::prepareFieldValueForJson( |
|
| 1158 | + null, |
|
| 1159 | + $this->fields_calculator->retrieveCalculatedFieldValue( |
|
| 1160 | + $model, |
|
| 1161 | + $field_to_calculate, |
|
| 1162 | + $wpdb_row, |
|
| 1163 | + $rest_request, |
|
| 1164 | + $this |
|
| 1165 | + ), |
|
| 1166 | + $this->getModelVersionInfo()->requestedVersion() |
|
| 1167 | + ); |
|
| 1168 | + } |
|
| 1169 | + $calculated_fields_to_return->{$field_to_calculate} = $calculated_value; |
|
| 1170 | + } catch (RestException $e) { |
|
| 1171 | + // if we don't have permission to read it, just leave it out. but let devs know about the problem |
|
| 1172 | + $this->setResponseHeader( |
|
| 1173 | + 'Notices-Field-Calculation-Errors[' |
|
| 1174 | + . $e->getStringCode() |
|
| 1175 | + . '][' |
|
| 1176 | + . $model->get_this_model_name() |
|
| 1177 | + . '][' |
|
| 1178 | + . $field_to_calculate |
|
| 1179 | + . ']', |
|
| 1180 | + $e->getMessage() |
|
| 1181 | + ); |
|
| 1182 | + } |
|
| 1183 | + } |
|
| 1184 | + $calculated_fields_to_return->_protected = $protected_fields; |
|
| 1185 | + return $calculated_fields_to_return; |
|
| 1186 | + } |
|
| 1187 | + |
|
| 1188 | + |
|
| 1189 | + /** |
|
| 1190 | + * Gets the full URL to the resource, taking the requested version into account |
|
| 1191 | + * |
|
| 1192 | + * @param string $link_part_after_version_and_slash eg "events/10/datetimes" |
|
| 1193 | + * @return string url eg "http://mysite.com/wp-json/ee/v4.6/events/10/datetimes" |
|
| 1194 | + * @throws EE_Error |
|
| 1195 | + */ |
|
| 1196 | + public function getVersionedLinkTo($link_part_after_version_and_slash) |
|
| 1197 | + { |
|
| 1198 | + return rest_url( |
|
| 1199 | + EED_Core_Rest_Api::get_versioned_route_to( |
|
| 1200 | + $link_part_after_version_and_slash, |
|
| 1201 | + $this->getModelVersionInfo()->requestedVersion() |
|
| 1202 | + ) |
|
| 1203 | + ); |
|
| 1204 | + } |
|
| 1205 | + |
|
| 1206 | + |
|
| 1207 | + /** |
|
| 1208 | + * Gets the correct lowercase name for the relation in the API according |
|
| 1209 | + * to the relation's type |
|
| 1210 | + * |
|
| 1211 | + * @param string $relation_name |
|
| 1212 | + * @param EE_Model_Relation_Base $relation_obj |
|
| 1213 | + * @return string |
|
| 1214 | + */ |
|
| 1215 | + public static function getRelatedEntityName($relation_name, $relation_obj) |
|
| 1216 | + { |
|
| 1217 | + if ($relation_obj instanceof EE_Belongs_To_Relation) { |
|
| 1218 | + return strtolower($relation_name); |
|
| 1219 | + } |
|
| 1220 | + return EEH_Inflector::pluralize_and_lower($relation_name); |
|
| 1221 | + } |
|
| 1222 | + |
|
| 1223 | + |
|
| 1224 | + /** |
|
| 1225 | + * Gets the one model object with the specified id for the specified model |
|
| 1226 | + * |
|
| 1227 | + * @param EEM_Base $model |
|
| 1228 | + * @param WP_REST_Request $request |
|
| 1229 | + * @return array |
|
| 1230 | + * @throws EE_Error |
|
| 1231 | + * @throws InvalidArgumentException |
|
| 1232 | + * @throws InvalidDataTypeException |
|
| 1233 | + * @throws InvalidInterfaceException |
|
| 1234 | + * @throws ModelConfigurationException |
|
| 1235 | + * @throws ReflectionException |
|
| 1236 | + * @throws RestException |
|
| 1237 | + * @throws RestPasswordIncorrectException |
|
| 1238 | + * @throws RestPasswordRequiredException |
|
| 1239 | + * @throws UnexpectedEntityException |
|
| 1240 | + * @throws DomainException |
|
| 1241 | + */ |
|
| 1242 | + public function getEntityFromModel($model, $request) |
|
| 1243 | + { |
|
| 1244 | + $context = $this->validateContext($request->get_param('caps')); |
|
| 1245 | + return $this->getOneOrReportPermissionError($model, $request, $context); |
|
| 1246 | + } |
|
| 1247 | + |
|
| 1248 | + |
|
| 1249 | + /** |
|
| 1250 | + * If a context is provided which isn't valid, maybe it was added in a future |
|
| 1251 | + * version so just treat it as a default read |
|
| 1252 | + * |
|
| 1253 | + * @param string $context |
|
| 1254 | + * @return string array key of EEM_Base::cap_contexts_to_cap_action_map() |
|
| 1255 | + */ |
|
| 1256 | + public function validateContext($context) |
|
| 1257 | + { |
|
| 1258 | + if (! $context) { |
|
| 1259 | + $context = EEM_Base::caps_read; |
|
| 1260 | + } |
|
| 1261 | + $valid_contexts = EEM_Base::valid_cap_contexts(); |
|
| 1262 | + if (in_array($context, $valid_contexts, true)) { |
|
| 1263 | + return $context; |
|
| 1264 | + } |
|
| 1265 | + return EEM_Base::caps_read; |
|
| 1266 | + } |
|
| 1267 | + |
|
| 1268 | + |
|
| 1269 | + /** |
|
| 1270 | + * Verifies the passed in value is an allowable default where conditions value. |
|
| 1271 | + * |
|
| 1272 | + * @param $default_query_params |
|
| 1273 | + * @return string |
|
| 1274 | + */ |
|
| 1275 | + public function validateDefaultQueryParams($default_query_params) |
|
| 1276 | + { |
|
| 1277 | + $valid_default_where_conditions_for_api_calls = array( |
|
| 1278 | + EEM_Base::default_where_conditions_all, |
|
| 1279 | + EEM_Base::default_where_conditions_minimum_all, |
|
| 1280 | + EEM_Base::default_where_conditions_minimum_others, |
|
| 1281 | + ); |
|
| 1282 | + if (! $default_query_params) { |
|
| 1283 | + $default_query_params = EEM_Base::default_where_conditions_all; |
|
| 1284 | + } |
|
| 1285 | + if (in_array( |
|
| 1286 | + $default_query_params, |
|
| 1287 | + $valid_default_where_conditions_for_api_calls, |
|
| 1288 | + true |
|
| 1289 | + )) { |
|
| 1290 | + return $default_query_params; |
|
| 1291 | + } else { |
|
| 1292 | + return EEM_Base::default_where_conditions_all; |
|
| 1293 | + } |
|
| 1294 | + } |
|
| 1295 | + |
|
| 1296 | + |
|
| 1297 | + /** |
|
| 1298 | + * Translates API filter get parameter into model query params @see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions. |
|
| 1299 | + * Note: right now the query parameter keys for fields (and related fields) |
|
| 1300 | + * can be left as-is, but it's quite possible this will change someday. |
|
| 1301 | + * Also, this method's contents might be candidate for moving to Model_Data_Translator |
|
| 1302 | + * |
|
| 1303 | + * @param EEM_Base $model |
|
| 1304 | + * @param $query_params |
|
| 1305 | + * @return array model query params (@see https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md#0-where-conditions) |
|
| 1306 | + * or FALSE to indicate that absolutely no results should be returned |
|
| 1307 | + * @throws EE_Error |
|
| 1308 | + * @throws InvalidArgumentException |
|
| 1309 | + * @throws InvalidDataTypeException |
|
| 1310 | + * @throws InvalidInterfaceException |
|
| 1311 | + * @throws RestException |
|
| 1312 | + * @throws DomainException |
|
| 1313 | + */ |
|
| 1314 | + public function createModelQueryParams($model, $query_params) |
|
| 1315 | + { |
|
| 1316 | + $model_query_params = array(); |
|
| 1317 | + if (isset($query_params['where'])) { |
|
| 1318 | + $model_query_params[0] = ModelDataTranslator::prepareConditionsQueryParamsForModels( |
|
| 1319 | + $query_params['where'], |
|
| 1320 | + $model, |
|
| 1321 | + $this->getModelVersionInfo()->requestedVersion() |
|
| 1322 | + ); |
|
| 1323 | + } |
|
| 1324 | + if (isset($query_params['order_by'])) { |
|
| 1325 | + $order_by = $query_params['order_by']; |
|
| 1326 | + } elseif (isset($query_params['orderby'])) { |
|
| 1327 | + $order_by = $query_params['orderby']; |
|
| 1328 | + } else { |
|
| 1329 | + $order_by = null; |
|
| 1330 | + } |
|
| 1331 | + if ($order_by !== null) { |
|
| 1332 | + if (is_array($order_by)) { |
|
| 1333 | + $order_by = ModelDataTranslator::prepareFieldNamesInArrayKeysFromJson($order_by); |
|
| 1334 | + } else { |
|
| 1335 | + // it's a single item |
|
| 1336 | + $order_by = ModelDataTranslator::prepareFieldNameFromJson($order_by); |
|
| 1337 | + } |
|
| 1338 | + $model_query_params['order_by'] = $order_by; |
|
| 1339 | + } |
|
| 1340 | + if (isset($query_params['group_by'])) { |
|
| 1341 | + $group_by = $query_params['group_by']; |
|
| 1342 | + } elseif (isset($query_params['groupby'])) { |
|
| 1343 | + $group_by = $query_params['groupby']; |
|
| 1344 | + } else { |
|
| 1345 | + $group_by = array_keys($model->get_combined_primary_key_fields()); |
|
| 1346 | + } |
|
| 1347 | + // make sure they're all real names |
|
| 1348 | + if (is_array($group_by)) { |
|
| 1349 | + $group_by = ModelDataTranslator::prepareFieldNamesFromJson($group_by); |
|
| 1350 | + } |
|
| 1351 | + if ($group_by !== null) { |
|
| 1352 | + $model_query_params['group_by'] = $group_by; |
|
| 1353 | + } |
|
| 1354 | + if (isset($query_params['having'])) { |
|
| 1355 | + $model_query_params['having'] = ModelDataTranslator::prepareConditionsQueryParamsForModels( |
|
| 1356 | + $query_params['having'], |
|
| 1357 | + $model, |
|
| 1358 | + $this->getModelVersionInfo()->requestedVersion() |
|
| 1359 | + ); |
|
| 1360 | + } |
|
| 1361 | + if (isset($query_params['order'])) { |
|
| 1362 | + $model_query_params['order'] = $query_params['order']; |
|
| 1363 | + } |
|
| 1364 | + if (isset($query_params['mine'])) { |
|
| 1365 | + $model_query_params = $model->alter_query_params_to_only_include_mine($model_query_params); |
|
| 1366 | + } |
|
| 1367 | + if (isset($query_params['limit'])) { |
|
| 1368 | + // limit should be either a string like '23' or '23,43', or an array with two items in it |
|
| 1369 | + if (! is_array($query_params['limit'])) { |
|
| 1370 | + $limit_array = explode(',', (string) $query_params['limit']); |
|
| 1371 | + } else { |
|
| 1372 | + $limit_array = $query_params['limit']; |
|
| 1373 | + } |
|
| 1374 | + $sanitized_limit = array(); |
|
| 1375 | + foreach ($limit_array as $key => $limit_part) { |
|
| 1376 | + if ($this->debug_mode && (! is_numeric($limit_part) || count($sanitized_limit) > 2)) { |
|
| 1377 | + throw new EE_Error( |
|
| 1378 | + sprintf( |
|
| 1379 | + __( |
|
| 1380 | + // @codingStandardsIgnoreStart |
|
| 1381 | + 'An invalid limit filter was provided. It was: %s. If the EE4 JSON REST API weren\'t in debug mode, this message would not appear.', |
|
| 1382 | + // @codingStandardsIgnoreEnd |
|
| 1383 | + 'event_espresso' |
|
| 1384 | + ), |
|
| 1385 | + wp_json_encode($query_params['limit']) |
|
| 1386 | + ) |
|
| 1387 | + ); |
|
| 1388 | + } |
|
| 1389 | + $sanitized_limit[] = (int) $limit_part; |
|
| 1390 | + } |
|
| 1391 | + $model_query_params['limit'] = implode(',', $sanitized_limit); |
|
| 1392 | + } else { |
|
| 1393 | + $model_query_params['limit'] = EED_Core_Rest_Api::get_default_query_limit(); |
|
| 1394 | + } |
|
| 1395 | + if (isset($query_params['caps'])) { |
|
| 1396 | + $model_query_params['caps'] = $this->validateContext($query_params['caps']); |
|
| 1397 | + } else { |
|
| 1398 | + $model_query_params['caps'] = EEM_Base::caps_read; |
|
| 1399 | + } |
|
| 1400 | + if (isset($query_params['default_where_conditions'])) { |
|
| 1401 | + $model_query_params['default_where_conditions'] = $this->validateDefaultQueryParams( |
|
| 1402 | + $query_params['default_where_conditions'] |
|
| 1403 | + ); |
|
| 1404 | + } |
|
| 1405 | + // if this is a model protected by a password on another model, exclude the password protected |
|
| 1406 | + // entities by default. But if they passed in a password, try to show them all. If the password is wrong, |
|
| 1407 | + // though, they'll get an error (see Read::createEntityFromWpdbResult() which calls Read::checkPassword) |
|
| 1408 | + if ($model_query_params['caps'] === EEM_Base::caps_read |
|
| 1409 | + && empty($query_params['password']) |
|
| 1410 | + && ! $model->hasPassword() |
|
| 1411 | + && $model->restrictedByRelatedModelPassword() |
|
| 1412 | + ) { |
|
| 1413 | + $model_query_params['exclude_protected'] = true; |
|
| 1414 | + } |
|
| 1415 | + |
|
| 1416 | + return apply_filters('FHEE__Read__create_model_query_params', $model_query_params, $query_params, $model); |
|
| 1417 | + } |
|
| 1418 | + |
|
| 1419 | + |
|
| 1420 | + /** |
|
| 1421 | + * Changes the REST-style query params for use in the models |
|
| 1422 | + * |
|
| 1423 | + * @deprecated |
|
| 1424 | + * @param EEM_Base $model |
|
| 1425 | + * @param array $query_params sub-array from @see EEM_Base::get_all() |
|
| 1426 | + * @return array |
|
| 1427 | + */ |
|
| 1428 | + public function prepareRestQueryParamsKeyForModels($model, $query_params) |
|
| 1429 | + { |
|
| 1430 | + $model_ready_query_params = array(); |
|
| 1431 | + foreach ($query_params as $key => $value) { |
|
| 1432 | + if (is_array($value)) { |
|
| 1433 | + $model_ready_query_params[ $key ] = $this->prepareRestQueryParamsKeyForModels($model, $value); |
|
| 1434 | + } else { |
|
| 1435 | + $model_ready_query_params[ $key ] = $value; |
|
| 1436 | + } |
|
| 1437 | + } |
|
| 1438 | + return $model_ready_query_params; |
|
| 1439 | + } |
|
| 1440 | + |
|
| 1441 | + |
|
| 1442 | + /** |
|
| 1443 | + * @deprecated instead use ModelDataTranslator::prepareFieldValuesFromJson() |
|
| 1444 | + * @param $model |
|
| 1445 | + * @param $query_params |
|
| 1446 | + * @return array |
|
| 1447 | + */ |
|
| 1448 | + public function prepareRestQueryParamsValuesForModels($model, $query_params) |
|
| 1449 | + { |
|
| 1450 | + $model_ready_query_params = array(); |
|
| 1451 | + foreach ($query_params as $key => $value) { |
|
| 1452 | + if (is_array($value)) { |
|
| 1453 | + $model_ready_query_params[ $key ] = $this->prepareRestQueryParamsValuesForModels($model, $value); |
|
| 1454 | + } else { |
|
| 1455 | + $model_ready_query_params[ $key ] = $value; |
|
| 1456 | + } |
|
| 1457 | + } |
|
| 1458 | + return $model_ready_query_params; |
|
| 1459 | + } |
|
| 1460 | + |
|
| 1461 | + |
|
| 1462 | + /** |
|
| 1463 | + * Explodes the string on commas, and only returns items with $prefix followed by a period. |
|
| 1464 | + * If no prefix is specified, returns items with no period. |
|
| 1465 | + * |
|
| 1466 | + * @param string|array $string_to_explode eg "jibba,jabba, blah, blah, blah" or array('jibba', 'jabba' ) |
|
| 1467 | + * @param string $prefix "Event" or "foobar" |
|
| 1468 | + * @return array $string_to_exploded exploded on COMMAS, and if a prefix was specified |
|
| 1469 | + * we only return strings starting with that and a period; if no prefix was |
|
| 1470 | + * specified we return all items containing NO periods |
|
| 1471 | + */ |
|
| 1472 | + public function explodeAndGetItemsPrefixedWith($string_to_explode, $prefix) |
|
| 1473 | + { |
|
| 1474 | + if (is_string($string_to_explode)) { |
|
| 1475 | + $exploded_contents = explode(',', $string_to_explode); |
|
| 1476 | + } elseif (is_array($string_to_explode)) { |
|
| 1477 | + $exploded_contents = $string_to_explode; |
|
| 1478 | + } else { |
|
| 1479 | + $exploded_contents = array(); |
|
| 1480 | + } |
|
| 1481 | + // if the string was empty, we want an empty array |
|
| 1482 | + $exploded_contents = array_filter($exploded_contents); |
|
| 1483 | + $contents_with_prefix = array(); |
|
| 1484 | + foreach ($exploded_contents as $item) { |
|
| 1485 | + $item = trim($item); |
|
| 1486 | + // if no prefix was provided, so we look for items with no "." in them |
|
| 1487 | + if (! $prefix) { |
|
| 1488 | + // does this item have a period? |
|
| 1489 | + if (strpos($item, '.') === false) { |
|
| 1490 | + // if not, then its what we're looking for |
|
| 1491 | + $contents_with_prefix[] = $item; |
|
| 1492 | + } |
|
| 1493 | + } elseif (strpos($item, $prefix . '.') === 0) { |
|
| 1494 | + // this item has the prefix and a period, grab it |
|
| 1495 | + $contents_with_prefix[] = substr( |
|
| 1496 | + $item, |
|
| 1497 | + strpos($item, $prefix . '.') + strlen($prefix . '.') |
|
| 1498 | + ); |
|
| 1499 | + } elseif ($item === $prefix) { |
|
| 1500 | + // this item is JUST the prefix |
|
| 1501 | + // so let's grab everything after, which is a blank string |
|
| 1502 | + $contents_with_prefix[] = ''; |
|
| 1503 | + } |
|
| 1504 | + } |
|
| 1505 | + return $contents_with_prefix; |
|
| 1506 | + } |
|
| 1507 | + |
|
| 1508 | + |
|
| 1509 | + /** |
|
| 1510 | + * @param string $include_string @see Read:handle_request_get_all |
|
| 1511 | + * @param string $model_name |
|
| 1512 | + * @return array of fields for this model. If $model_name is provided, then |
|
| 1513 | + * the fields for that model, with the model's name removed from each. |
|
| 1514 | + * If $include_string was blank or '*' returns an empty array |
|
| 1515 | + * @throws EE_Error |
|
| 1516 | + * @deprecated since 4.8.36.rc.001 You should instead use Read::explode_and_get_items_prefixed_with. |
|
| 1517 | + * Deprecated because its return values were really quite confusing- sometimes it returned |
|
| 1518 | + * an empty array (when the include string was blank or '*') or sometimes it returned |
|
| 1519 | + * array('*') (when you provided a model and a model of that kind was found). |
|
| 1520 | + * Parses the $include_string so we fetch all the field names relating to THIS model |
|
| 1521 | + * (ie have NO period in them), or for the provided model (ie start with the model |
|
| 1522 | + * name and then a period). |
|
| 1523 | + */ |
|
| 1524 | + public function extractIncludesForThisModel($include_string, $model_name = null) |
|
| 1525 | + { |
|
| 1526 | + if (is_array($include_string)) { |
|
| 1527 | + $include_string = implode(',', $include_string); |
|
| 1528 | + } |
|
| 1529 | + if ($include_string === '*' || $include_string === '') { |
|
| 1530 | + return array(); |
|
| 1531 | + } |
|
| 1532 | + $includes = explode(',', $include_string); |
|
| 1533 | + $extracted_fields_to_include = array(); |
|
| 1534 | + if ($model_name) { |
|
| 1535 | + foreach ($includes as $field_to_include) { |
|
| 1536 | + $field_to_include = trim($field_to_include); |
|
| 1537 | + if (strpos($field_to_include, $model_name . '.') === 0) { |
|
| 1538 | + // found the model name at the exact start |
|
| 1539 | + $field_sans_model_name = str_replace($model_name . '.', '', $field_to_include); |
|
| 1540 | + $extracted_fields_to_include[] = $field_sans_model_name; |
|
| 1541 | + } elseif ($field_to_include === $model_name) { |
|
| 1542 | + $extracted_fields_to_include[] = '*'; |
|
| 1543 | + } |
|
| 1544 | + } |
|
| 1545 | + } else { |
|
| 1546 | + // look for ones with no period |
|
| 1547 | + foreach ($includes as $field_to_include) { |
|
| 1548 | + $field_to_include = trim($field_to_include); |
|
| 1549 | + if (strpos($field_to_include, '.') === false |
|
| 1550 | + && ! $this->getModelVersionInfo()->isModelNameInThisVersion($field_to_include) |
|
| 1551 | + ) { |
|
| 1552 | + $extracted_fields_to_include[] = $field_to_include; |
|
| 1553 | + } |
|
| 1554 | + } |
|
| 1555 | + } |
|
| 1556 | + return $extracted_fields_to_include; |
|
| 1557 | + } |
|
| 1558 | + |
|
| 1559 | + |
|
| 1560 | + /** |
|
| 1561 | + * Gets the single item using the model according to the request in the context given, otherwise |
|
| 1562 | + * returns that it's inaccessible to the current user |
|
| 1563 | + * |
|
| 1564 | + * @param EEM_Base $model |
|
| 1565 | + * @param WP_REST_Request $request |
|
| 1566 | + * @param null $context |
|
| 1567 | + * @return array |
|
| 1568 | + * @throws EE_Error |
|
| 1569 | + * @throws InvalidArgumentException |
|
| 1570 | + * @throws InvalidDataTypeException |
|
| 1571 | + * @throws InvalidInterfaceException |
|
| 1572 | + * @throws ModelConfigurationException |
|
| 1573 | + * @throws ReflectionException |
|
| 1574 | + * @throws RestException |
|
| 1575 | + * @throws RestPasswordIncorrectException |
|
| 1576 | + * @throws RestPasswordRequiredException |
|
| 1577 | + * @throws UnexpectedEntityException |
|
| 1578 | + * @throws DomainException |
|
| 1579 | + */ |
|
| 1580 | + public function getOneOrReportPermissionError(EEM_Base $model, WP_REST_Request $request, $context = null) |
|
| 1581 | + { |
|
| 1582 | + $query_params = array(array($model->primary_key_name() => $request->get_param('id')), 'limit' => 1); |
|
| 1583 | + if ($model instanceof EEM_Soft_Delete_Base) { |
|
| 1584 | + $query_params = $model->alter_query_params_so_deleted_and_undeleted_items_included($query_params); |
|
| 1585 | + } |
|
| 1586 | + $restricted_query_params = $query_params; |
|
| 1587 | + $restricted_query_params['caps'] = $context; |
|
| 1588 | + $this->setDebugInfo('model query params', $restricted_query_params); |
|
| 1589 | + $model_rows = $model->get_all_wpdb_results($restricted_query_params); |
|
| 1590 | + if (! empty($model_rows)) { |
|
| 1591 | + return $this->createEntityFromWpdbResult( |
|
| 1592 | + $model, |
|
| 1593 | + reset($model_rows), |
|
| 1594 | + $request |
|
| 1595 | + ); |
|
| 1596 | + } |
|
| 1597 | + // ok let's test to see if we WOULD have found it, had we not had restrictions from missing capabilities |
|
| 1598 | + $lowercase_model_name = strtolower($model->get_this_model_name()); |
|
| 1599 | + if ($model->exists($query_params)) { |
|
| 1600 | + // you got shafted- it existed but we didn't want to tell you! |
|
| 1601 | + throw new RestException( |
|
| 1602 | + 'rest_user_cannot_' . $context, |
|
| 1603 | + sprintf( |
|
| 1604 | + __('Sorry, you cannot %1$s this %2$s. Missing permissions are: %3$s', 'event_espresso'), |
|
| 1605 | + $context, |
|
| 1606 | + $lowercase_model_name, |
|
| 1607 | + Capabilities::getMissingPermissionsString( |
|
| 1608 | + $model, |
|
| 1609 | + $context |
|
| 1610 | + ) |
|
| 1611 | + ), |
|
| 1612 | + array('status' => 403) |
|
| 1613 | + ); |
|
| 1614 | + } |
|
| 1615 | + // it's not you. It just doesn't exist |
|
| 1616 | + throw new RestException( |
|
| 1617 | + sprintf('rest_%s_invalid_id', $lowercase_model_name), |
|
| 1618 | + sprintf(__('Invalid %s ID.', 'event_espresso'), $lowercase_model_name), |
|
| 1619 | + array('status' => 404) |
|
| 1620 | + ); |
|
| 1621 | + } |
|
| 1622 | + |
|
| 1623 | + /** |
|
| 1624 | + * Checks that if this content requires a password to be read, that it's been provided and is correct. |
|
| 1625 | + * @since 4.9.74.p |
|
| 1626 | + * @param EEM_Base $model |
|
| 1627 | + * @param $model_row |
|
| 1628 | + * @param array $query_params Adds 'default_where_conditions' => 'minimum' to ensure we don't confuse trashed with |
|
| 1629 | + * password protected. |
|
| 1630 | + * @param WP_REST_Request $request |
|
| 1631 | + * @throws EE_Error |
|
| 1632 | + * @throws InvalidArgumentException |
|
| 1633 | + * @throws InvalidDataTypeException |
|
| 1634 | + * @throws InvalidInterfaceException |
|
| 1635 | + * @throws RestPasswordRequiredException |
|
| 1636 | + * @throws RestPasswordIncorrectException |
|
| 1637 | + * @throws ModelConfigurationException |
|
| 1638 | + * @throws ReflectionException |
|
| 1639 | + */ |
|
| 1640 | + protected function checkPassword(EEM_Base $model, $model_row, $query_params, WP_REST_Request $request) |
|
| 1641 | + { |
|
| 1642 | + $query_params['default_where_conditions'] = 'minimum'; |
|
| 1643 | + // stuff is only "protected" for front-end requests. Elsewhere, you either get full permission to access the object |
|
| 1644 | + // or you don't. |
|
| 1645 | + $request_caps = $request->get_param('caps'); |
|
| 1646 | + if (isset($request_caps) && $request_caps !== EEM_Base::caps_read) { |
|
| 1647 | + return; |
|
| 1648 | + } |
|
| 1649 | + // if this entity requires a password, they better give it and it better be right! |
|
| 1650 | + if ($model->hasPassword() |
|
| 1651 | + && $model_row[ $model->getPasswordField()->get_qualified_column() ] !== '') { |
|
| 1652 | + if (empty($request['password'])) { |
|
| 1653 | + throw new RestPasswordRequiredException(); |
|
| 1654 | + } |
|
| 1655 | + if (!hash_equals( |
|
| 1656 | + $model_row[ $model->getPasswordField()->get_qualified_column() ], |
|
| 1657 | + $request['password'] |
|
| 1658 | + )) { |
|
| 1659 | + throw new RestPasswordIncorrectException(); |
|
| 1660 | + } |
|
| 1661 | + } // wait! maybe this content is password protected |
|
| 1662 | + elseif ($model->restrictedByRelatedModelPassword() |
|
| 1663 | + && $request->get_param('caps') === EEM_Base::caps_read) { |
|
| 1664 | + $password_supplied = $request->get_param('password'); |
|
| 1665 | + if (empty($password_supplied)) { |
|
| 1666 | + $query_params['exclude_protected'] = true; |
|
| 1667 | + if (!$model->exists($query_params)) { |
|
| 1668 | + throw new RestPasswordRequiredException(); |
|
| 1669 | + } |
|
| 1670 | + } else { |
|
| 1671 | + $query_params[0][ $model->modelChainAndPassword() ] = $password_supplied; |
|
| 1672 | + if (!$model->exists($query_params)) { |
|
| 1673 | + throw new RestPasswordIncorrectException(); |
|
| 1674 | + } |
|
| 1675 | + } |
|
| 1676 | + } |
|
| 1677 | + } |
|
| 1678 | 1678 | } |
@@ -85,7 +85,7 @@ discard block |
||
| 85 | 85 | $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
| 86 | 86 | try { |
| 87 | 87 | $controller->setRequestedVersion($version); |
| 88 | - if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 88 | + if ( ! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 89 | 89 | return $controller->sendResponse( |
| 90 | 90 | new WP_Error( |
| 91 | 91 | 'endpoint_parsing_error', |
@@ -126,7 +126,7 @@ discard block |
||
| 126 | 126 | $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
| 127 | 127 | try { |
| 128 | 128 | $controller->setRequestedVersion($version); |
| 129 | - if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 129 | + if ( ! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 130 | 130 | return array(); |
| 131 | 131 | } |
| 132 | 132 | // get the model for this version |
@@ -185,11 +185,11 @@ discard block |
||
| 185 | 185 | */ |
| 186 | 186 | protected function translateDefaultsForRestResponse($field_name, EE_Model_Field_Base $field, array $schema) |
| 187 | 187 | { |
| 188 | - if (isset($schema['properties'][ $field_name ]['default'])) { |
|
| 189 | - if (is_array($schema['properties'][ $field_name ]['default'])) { |
|
| 190 | - foreach ($schema['properties'][ $field_name ]['default'] as $default_key => $default_value) { |
|
| 188 | + if (isset($schema['properties'][$field_name]['default'])) { |
|
| 189 | + if (is_array($schema['properties'][$field_name]['default'])) { |
|
| 190 | + foreach ($schema['properties'][$field_name]['default'] as $default_key => $default_value) { |
|
| 191 | 191 | if ($default_key === 'raw') { |
| 192 | - $schema['properties'][ $field_name ]['default'][ $default_key ] = |
|
| 192 | + $schema['properties'][$field_name]['default'][$default_key] = |
|
| 193 | 193 | ModelDataTranslator::prepareFieldValueForJson( |
| 194 | 194 | $field, |
| 195 | 195 | $default_value, |
@@ -198,9 +198,9 @@ discard block |
||
| 198 | 198 | } |
| 199 | 199 | } |
| 200 | 200 | } else { |
| 201 | - $schema['properties'][ $field_name ]['default'] = ModelDataTranslator::prepareFieldValueForJson( |
|
| 201 | + $schema['properties'][$field_name]['default'] = ModelDataTranslator::prepareFieldValueForJson( |
|
| 202 | 202 | $field, |
| 203 | - $schema['properties'][ $field_name ]['default'], |
|
| 203 | + $schema['properties'][$field_name]['default'], |
|
| 204 | 204 | $this->getModelVersionInfo()->requestedVersion() |
| 205 | 205 | ); |
| 206 | 206 | } |
@@ -222,9 +222,9 @@ discard block |
||
| 222 | 222 | protected function maybeAddExtraFieldsToSchema($field_name, EE_Model_Field_Base $field, array $schema) |
| 223 | 223 | { |
| 224 | 224 | if ($field instanceof EE_Datetime_Field) { |
| 225 | - $schema['properties'][ $field_name . '_gmt' ] = $field->getSchema(); |
|
| 225 | + $schema['properties'][$field_name.'_gmt'] = $field->getSchema(); |
|
| 226 | 226 | // modify the description |
| 227 | - $schema['properties'][ $field_name . '_gmt' ]['description'] = sprintf( |
|
| 227 | + $schema['properties'][$field_name.'_gmt']['description'] = sprintf( |
|
| 228 | 228 | esc_html__('%s - the value for this field is in GMT.', 'event_espresso'), |
| 229 | 229 | wp_specialchars_decode($field->get_nicename(), ENT_QUOTES) |
| 230 | 230 | ); |
@@ -266,7 +266,7 @@ discard block |
||
| 266 | 266 | $controller = LoaderFactory::getLoader()->getNew('EventEspresso\core\libraries\rest_api\controllers\model\Read'); |
| 267 | 267 | try { |
| 268 | 268 | $controller->setRequestedVersion($version); |
| 269 | - if (! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 269 | + if ( ! $controller->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 270 | 270 | return $controller->sendResponse( |
| 271 | 271 | new WP_Error( |
| 272 | 272 | 'endpoint_parsing_error', |
@@ -350,7 +350,7 @@ discard block |
||
| 350 | 350 | public function getEntitiesFromModel($model, $request) |
| 351 | 351 | { |
| 352 | 352 | $query_params = $this->createModelQueryParams($model, $request->get_params()); |
| 353 | - if (! Capabilities::currentUserHasPartialAccessTo($model, $query_params['caps'])) { |
|
| 353 | + if ( ! Capabilities::currentUserHasPartialAccessTo($model, $query_params['caps'])) { |
|
| 354 | 354 | $model_name_plural = EEH_Inflector::pluralize_and_lower($model->get_this_model_name()); |
| 355 | 355 | throw new RestException( |
| 356 | 356 | sprintf('rest_%s_cannot_list', $model_name_plural), |
@@ -362,14 +362,14 @@ discard block |
||
| 362 | 362 | array('status' => 403) |
| 363 | 363 | ); |
| 364 | 364 | } |
| 365 | - if (! $request->get_header('no_rest_headers')) { |
|
| 365 | + if ( ! $request->get_header('no_rest_headers')) { |
|
| 366 | 366 | $this->setHeadersFromQueryParams($model, $query_params); |
| 367 | 367 | } |
| 368 | 368 | /** @type array $results */ |
| 369 | 369 | $results = $model->get_all_wpdb_results($query_params); |
| 370 | 370 | $nice_results = array(); |
| 371 | 371 | foreach ($results as $result) { |
| 372 | - $nice_results[] = $this->createEntityFromWpdbResult( |
|
| 372 | + $nice_results[] = $this->createEntityFromWpdbResult( |
|
| 373 | 373 | $model, |
| 374 | 374 | $result, |
| 375 | 375 | $request |
@@ -407,7 +407,7 @@ discard block |
||
| 407 | 407 | $context = $this->validateContext($request->get_param('caps')); |
| 408 | 408 | $model = $relation->get_this_model(); |
| 409 | 409 | $related_model = $relation->get_other_model(); |
| 410 | - if (! isset($primary_model_query_params[0])) { |
|
| 410 | + if ( ! isset($primary_model_query_params[0])) { |
|
| 411 | 411 | $primary_model_query_params[0] = array(); |
| 412 | 412 | } |
| 413 | 413 | // check if they can access the 1st model object |
@@ -430,7 +430,7 @@ discard block |
||
| 430 | 430 | if (is_array($primary_model_rows)) { |
| 431 | 431 | $primary_model_row = reset($primary_model_rows); |
| 432 | 432 | } |
| 433 | - if (! ( |
|
| 433 | + if ( ! ( |
|
| 434 | 434 | $primary_model_row |
| 435 | 435 | && Capabilities::currentUserHasPartialAccessTo($related_model, $context) |
| 436 | 436 | ) |
@@ -470,13 +470,13 @@ discard block |
||
| 470 | 470 | ); |
| 471 | 471 | $query_params = $this->createModelQueryParams($relation->get_other_model(), $request->get_params()); |
| 472 | 472 | foreach ($primary_model_query_params[0] as $where_condition_key => $where_condition_value) { |
| 473 | - $query_params[0][ $relation->get_this_model()->get_this_model_name() |
|
| 473 | + $query_params[0][$relation->get_this_model()->get_this_model_name() |
|
| 474 | 474 | . '.' |
| 475 | - . $where_condition_key ] = $where_condition_value; |
|
| 475 | + . $where_condition_key] = $where_condition_value; |
|
| 476 | 476 | } |
| 477 | 477 | $query_params['default_where_conditions'] = 'none'; |
| 478 | 478 | $query_params['caps'] = $context; |
| 479 | - if (! $request->get_header('no_rest_headers')) { |
|
| 479 | + if ( ! $request->get_header('no_rest_headers')) { |
|
| 480 | 480 | $this->setHeadersFromQueryParams($relation->get_other_model(), $query_params); |
| 481 | 481 | } |
| 482 | 482 | /** @type array $results */ |
@@ -537,7 +537,7 @@ discard block |
||
| 537 | 537 | */ |
| 538 | 538 | public function getEntitiesFromRelation($id, $relation, $request) |
| 539 | 539 | { |
| 540 | - if (! $relation->get_this_model()->has_primary_key_field()) { |
|
| 540 | + if ( ! $relation->get_this_model()->has_primary_key_field()) { |
|
| 541 | 541 | throw new EE_Error( |
| 542 | 542 | sprintf( |
| 543 | 543 | __( |
@@ -583,7 +583,7 @@ discard block |
||
| 583 | 583 | Capabilities::getMissingPermissionsString($model, $query_params['caps']) |
| 584 | 584 | ); |
| 585 | 585 | // normally the limit to a 2-part array, where the 2nd item is the limit |
| 586 | - if (! isset($query_params['limit'])) { |
|
| 586 | + if ( ! isset($query_params['limit'])) { |
|
| 587 | 587 | $query_params['limit'] = EED_Core_Rest_Api::get_default_query_limit(); |
| 588 | 588 | } |
| 589 | 589 | if (is_array($query_params['limit'])) { |
@@ -627,7 +627,7 @@ discard block |
||
| 627 | 627 | */ |
| 628 | 628 | public function createEntityFromWpdbResult($model, $db_row, $rest_request, $deprecated = null) |
| 629 | 629 | { |
| 630 | - if (! $rest_request instanceof WP_REST_Request) { |
|
| 630 | + if ( ! $rest_request instanceof WP_REST_Request) { |
|
| 631 | 631 | // ok so this was called in the old style, where the 3rd arg was |
| 632 | 632 | // $include, and the 4th arg was $context |
| 633 | 633 | // now setup the request just to avoid fatal errors, although we won't be able |
@@ -702,7 +702,7 @@ discard block |
||
| 702 | 702 | $rest_request, |
| 703 | 703 | $this |
| 704 | 704 | ); |
| 705 | - if (! $current_user_full_access_to_entity) { |
|
| 705 | + if ( ! $current_user_full_access_to_entity) { |
|
| 706 | 706 | $result_without_inaccessible_fields = Capabilities::filterOutInaccessibleEntityFields( |
| 707 | 707 | $entity_array, |
| 708 | 708 | $model, |
@@ -737,7 +737,7 @@ discard block |
||
| 737 | 737 | */ |
| 738 | 738 | protected function addProtectedProperty(EEM_Base $model, $results_so_far, $protected) |
| 739 | 739 | { |
| 740 | - if (! $protected || ! $model->hasPassword()) { |
|
| 740 | + if ( ! $protected || ! $model->hasPassword()) { |
|
| 741 | 741 | return $results_so_far; |
| 742 | 742 | } |
| 743 | 743 | $password_field = $model->getPasswordField(); |
@@ -751,7 +751,7 @@ discard block |
||
| 751 | 751 | $fields_included |
| 752 | 752 | ); |
| 753 | 753 | foreach ($fields_included as $field_name) { |
| 754 | - $results_so_far['_protected'][] = $field_name ; |
|
| 754 | + $results_so_far['_protected'][] = $field_name; |
|
| 755 | 755 | } |
| 756 | 756 | return $results_so_far; |
| 757 | 757 | } |
@@ -789,8 +789,8 @@ discard block |
||
| 789 | 789 | if ($do_chevy_shuffle) { |
| 790 | 790 | global $post; |
| 791 | 791 | $old_post = $post; |
| 792 | - $post = get_post($result[ $model->primary_key_name() ]); |
|
| 793 | - if (! $post instanceof WP_Post) { |
|
| 792 | + $post = get_post($result[$model->primary_key_name()]); |
|
| 793 | + if ( ! $post instanceof WP_Post) { |
|
| 794 | 794 | // well that's weird, because $result is what we JUST fetched from the database |
| 795 | 795 | throw new RestException( |
| 796 | 796 | 'error_fetching_post_from_database_results', |
@@ -800,7 +800,7 @@ discard block |
||
| 800 | 800 | ) |
| 801 | 801 | ); |
| 802 | 802 | } |
| 803 | - $model_object_classname = 'EE_' . $model->get_this_model_name(); |
|
| 803 | + $model_object_classname = 'EE_'.$model->get_this_model_name(); |
|
| 804 | 804 | $post->{$model_object_classname} = \EE_Registry::instance()->load_class( |
| 805 | 805 | $model_object_classname, |
| 806 | 806 | $result, |
@@ -811,13 +811,13 @@ discard block |
||
| 811 | 811 | foreach ($result as $field_name => $field_value) { |
| 812 | 812 | $field_obj = $model->field_settings_for($field_name); |
| 813 | 813 | if ($this->isSubclassOfOne($field_obj, $this->getModelVersionInfo()->fieldsIgnored())) { |
| 814 | - unset($result[ $field_name ]); |
|
| 814 | + unset($result[$field_name]); |
|
| 815 | 815 | } elseif ($this->isSubclassOfOne( |
| 816 | 816 | $field_obj, |
| 817 | 817 | $this->getModelVersionInfo()->fieldsThatHaveRenderedFormat() |
| 818 | 818 | ) |
| 819 | 819 | ) { |
| 820 | - $result[ $field_name ] = array( |
|
| 820 | + $result[$field_name] = array( |
|
| 821 | 821 | 'raw' => $this->prepareFieldObjValueForJson($field_obj, $field_value), |
| 822 | 822 | 'rendered' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'), |
| 823 | 823 | ); |
@@ -826,7 +826,7 @@ discard block |
||
| 826 | 826 | $this->getModelVersionInfo()->fieldsThatHavePrettyFormat() |
| 827 | 827 | ) |
| 828 | 828 | ) { |
| 829 | - $result[ $field_name ] = array( |
|
| 829 | + $result[$field_name] = array( |
|
| 830 | 830 | 'raw' => $this->prepareFieldObjValueForJson($field_obj, $field_value), |
| 831 | 831 | 'pretty' => $this->prepareFieldObjValueForJson($field_obj, $field_value, 'pretty'), |
| 832 | 832 | ); |
@@ -857,10 +857,10 @@ discard block |
||
| 857 | 857 | $this->getModelVersionInfo()->requestedVersion() |
| 858 | 858 | ); |
| 859 | 859 | } |
| 860 | - $result[ $field_name . '_gmt' ] = $gmt_date; |
|
| 861 | - $result[ $field_name ] = $local_date; |
|
| 860 | + $result[$field_name.'_gmt'] = $gmt_date; |
|
| 861 | + $result[$field_name] = $local_date; |
|
| 862 | 862 | } else { |
| 863 | - $result[ $field_name ] = $this->prepareFieldObjValueForJson($field_obj, $field_value); |
|
| 863 | + $result[$field_name] = $this->prepareFieldObjValueForJson($field_obj, $field_value); |
|
| 864 | 864 | } |
| 865 | 865 | } |
| 866 | 866 | if ($do_chevy_shuffle) { |
@@ -914,7 +914,7 @@ discard block |
||
| 914 | 914 | protected function addExtraFields(EEM_Base $model, $db_row, $entity_array) |
| 915 | 915 | { |
| 916 | 916 | if ($model instanceof EEM_CPT_Base) { |
| 917 | - $entity_array['link'] = get_permalink($db_row[ $model->get_primary_key_field()->get_qualified_column() ]); |
|
| 917 | + $entity_array['link'] = get_permalink($db_row[$model->get_primary_key_field()->get_qualified_column()]); |
|
| 918 | 918 | } |
| 919 | 919 | return $entity_array; |
| 920 | 920 | } |
@@ -940,7 +940,7 @@ discard block |
||
| 940 | 940 | 'href' => $this->getVersionedLinkTo( |
| 941 | 941 | EEH_Inflector::pluralize_and_lower($model->get_this_model_name()) |
| 942 | 942 | . '/' |
| 943 | - . $entity_array[ $model->primary_key_name() ] |
|
| 943 | + . $entity_array[$model->primary_key_name()] |
|
| 944 | 944 | ), |
| 945 | 945 | ), |
| 946 | 946 | ); |
@@ -956,12 +956,12 @@ discard block |
||
| 956 | 956 | if ($model->has_primary_key_field()) { |
| 957 | 957 | foreach ($this->getModelVersionInfo()->relationSettings($model) as $relation_name => $relation_obj) { |
| 958 | 958 | $related_model_part = Read::getRelatedEntityName($relation_name, $relation_obj); |
| 959 | - $links[ EED_Core_Rest_Api::ee_api_link_namespace . $related_model_part ] = array( |
|
| 959 | + $links[EED_Core_Rest_Api::ee_api_link_namespace.$related_model_part] = array( |
|
| 960 | 960 | array( |
| 961 | 961 | 'href' => $this->getVersionedLinkTo( |
| 962 | 962 | EEH_Inflector::pluralize_and_lower($model->get_this_model_name()) |
| 963 | 963 | . '/' |
| 964 | - . $entity_array[ $model->primary_key_name() ] |
|
| 964 | + . $entity_array[$model->primary_key_name()] |
|
| 965 | 965 | . '/' |
| 966 | 966 | . $related_model_part |
| 967 | 967 | ), |
@@ -1000,7 +1000,7 @@ discard block |
||
| 1000 | 1000 | $included_items_protected = false |
| 1001 | 1001 | ) { |
| 1002 | 1002 | // if $db_row not included, hope the entity array has what we need |
| 1003 | - if (! $db_row) { |
|
| 1003 | + if ( ! $db_row) { |
|
| 1004 | 1004 | $db_row = $entity_array; |
| 1005 | 1005 | } |
| 1006 | 1006 | $relation_settings = $this->getModelVersionInfo()->relationSettings($model); |
@@ -1033,7 +1033,7 @@ discard block |
||
| 1033 | 1033 | $model->deduce_fields_n_values_from_cols_n_values($db_row) |
| 1034 | 1034 | ) |
| 1035 | 1035 | ); |
| 1036 | - if (! $included_items_protected) { |
|
| 1036 | + if ( ! $included_items_protected) { |
|
| 1037 | 1037 | try { |
| 1038 | 1038 | $related_results = $this->getEntitiesFromRelationUsingModelQueryParams( |
| 1039 | 1039 | $primary_model_query_params, |
@@ -1051,7 +1051,7 @@ discard block |
||
| 1051 | 1051 | if ($related_results instanceof WP_Error || $related_results === null) { |
| 1052 | 1052 | $related_results = $relation_obj instanceof EE_Belongs_To_Relation ? null : array(); |
| 1053 | 1053 | } |
| 1054 | - $entity_array[ Read::getRelatedEntityName($relation_name, $relation_obj) ] = $related_results; |
|
| 1054 | + $entity_array[Read::getRelatedEntityName($relation_name, $relation_obj)] = $related_results; |
|
| 1055 | 1055 | } |
| 1056 | 1056 | } |
| 1057 | 1057 | return $entity_array; |
@@ -1076,7 +1076,7 @@ discard block |
||
| 1076 | 1076 | $includes_for_this_model = $this->explodeAndGetItemsPrefixedWith($rest_request->get_param('include'), ''); |
| 1077 | 1077 | $includes_for_this_model = $this->removeModelNamesFromArray($includes_for_this_model); |
| 1078 | 1078 | // if they passed in * or didn't specify any includes, return everything |
| 1079 | - if (! empty($includes_for_this_model) && ! in_array('*', $includes_for_this_model, true)) { |
|
| 1079 | + if ( ! empty($includes_for_this_model) && ! in_array('*', $includes_for_this_model, true)) { |
|
| 1080 | 1080 | if ($model->has_primary_key_field()) { |
| 1081 | 1081 | // always include the primary key. ya just gotta know that at least |
| 1082 | 1082 | $includes_for_this_model[] = $model->primary_key_name(); |
@@ -1130,12 +1130,12 @@ discard block |
||
| 1130 | 1130 | // it's password protected, so they shouldn't be able to read this. Remove the value |
| 1131 | 1131 | $schema = $this->fields_calculator->getJsonSchemaForModel($model); |
| 1132 | 1132 | if ($row_is_protected |
| 1133 | - && isset($schema['properties'][ $field_to_calculate ]['protected']) |
|
| 1134 | - && $schema['properties'][ $field_to_calculate ]['protected']) { |
|
| 1133 | + && isset($schema['properties'][$field_to_calculate]['protected']) |
|
| 1134 | + && $schema['properties'][$field_to_calculate]['protected']) { |
|
| 1135 | 1135 | $calculated_value = null; |
| 1136 | 1136 | $protected_fields[] = $field_to_calculate; |
| 1137 | - if ($schema['properties'][ $field_to_calculate ]['type']) { |
|
| 1138 | - switch ($schema['properties'][ $field_to_calculate ]['type']) { |
|
| 1137 | + if ($schema['properties'][$field_to_calculate]['type']) { |
|
| 1138 | + switch ($schema['properties'][$field_to_calculate]['type']) { |
|
| 1139 | 1139 | case 'boolean': |
| 1140 | 1140 | $calculated_value = false; |
| 1141 | 1141 | break; |
@@ -1255,7 +1255,7 @@ discard block |
||
| 1255 | 1255 | */ |
| 1256 | 1256 | public function validateContext($context) |
| 1257 | 1257 | { |
| 1258 | - if (! $context) { |
|
| 1258 | + if ( ! $context) { |
|
| 1259 | 1259 | $context = EEM_Base::caps_read; |
| 1260 | 1260 | } |
| 1261 | 1261 | $valid_contexts = EEM_Base::valid_cap_contexts(); |
@@ -1279,7 +1279,7 @@ discard block |
||
| 1279 | 1279 | EEM_Base::default_where_conditions_minimum_all, |
| 1280 | 1280 | EEM_Base::default_where_conditions_minimum_others, |
| 1281 | 1281 | ); |
| 1282 | - if (! $default_query_params) { |
|
| 1282 | + if ( ! $default_query_params) { |
|
| 1283 | 1283 | $default_query_params = EEM_Base::default_where_conditions_all; |
| 1284 | 1284 | } |
| 1285 | 1285 | if (in_array( |
@@ -1366,14 +1366,14 @@ discard block |
||
| 1366 | 1366 | } |
| 1367 | 1367 | if (isset($query_params['limit'])) { |
| 1368 | 1368 | // limit should be either a string like '23' or '23,43', or an array with two items in it |
| 1369 | - if (! is_array($query_params['limit'])) { |
|
| 1369 | + if ( ! is_array($query_params['limit'])) { |
|
| 1370 | 1370 | $limit_array = explode(',', (string) $query_params['limit']); |
| 1371 | 1371 | } else { |
| 1372 | 1372 | $limit_array = $query_params['limit']; |
| 1373 | 1373 | } |
| 1374 | 1374 | $sanitized_limit = array(); |
| 1375 | 1375 | foreach ($limit_array as $key => $limit_part) { |
| 1376 | - if ($this->debug_mode && (! is_numeric($limit_part) || count($sanitized_limit) > 2)) { |
|
| 1376 | + if ($this->debug_mode && ( ! is_numeric($limit_part) || count($sanitized_limit) > 2)) { |
|
| 1377 | 1377 | throw new EE_Error( |
| 1378 | 1378 | sprintf( |
| 1379 | 1379 | __( |
@@ -1430,9 +1430,9 @@ discard block |
||
| 1430 | 1430 | $model_ready_query_params = array(); |
| 1431 | 1431 | foreach ($query_params as $key => $value) { |
| 1432 | 1432 | if (is_array($value)) { |
| 1433 | - $model_ready_query_params[ $key ] = $this->prepareRestQueryParamsKeyForModels($model, $value); |
|
| 1433 | + $model_ready_query_params[$key] = $this->prepareRestQueryParamsKeyForModels($model, $value); |
|
| 1434 | 1434 | } else { |
| 1435 | - $model_ready_query_params[ $key ] = $value; |
|
| 1435 | + $model_ready_query_params[$key] = $value; |
|
| 1436 | 1436 | } |
| 1437 | 1437 | } |
| 1438 | 1438 | return $model_ready_query_params; |
@@ -1450,9 +1450,9 @@ discard block |
||
| 1450 | 1450 | $model_ready_query_params = array(); |
| 1451 | 1451 | foreach ($query_params as $key => $value) { |
| 1452 | 1452 | if (is_array($value)) { |
| 1453 | - $model_ready_query_params[ $key ] = $this->prepareRestQueryParamsValuesForModels($model, $value); |
|
| 1453 | + $model_ready_query_params[$key] = $this->prepareRestQueryParamsValuesForModels($model, $value); |
|
| 1454 | 1454 | } else { |
| 1455 | - $model_ready_query_params[ $key ] = $value; |
|
| 1455 | + $model_ready_query_params[$key] = $value; |
|
| 1456 | 1456 | } |
| 1457 | 1457 | } |
| 1458 | 1458 | return $model_ready_query_params; |
@@ -1484,17 +1484,17 @@ discard block |
||
| 1484 | 1484 | foreach ($exploded_contents as $item) { |
| 1485 | 1485 | $item = trim($item); |
| 1486 | 1486 | // if no prefix was provided, so we look for items with no "." in them |
| 1487 | - if (! $prefix) { |
|
| 1487 | + if ( ! $prefix) { |
|
| 1488 | 1488 | // does this item have a period? |
| 1489 | 1489 | if (strpos($item, '.') === false) { |
| 1490 | 1490 | // if not, then its what we're looking for |
| 1491 | 1491 | $contents_with_prefix[] = $item; |
| 1492 | 1492 | } |
| 1493 | - } elseif (strpos($item, $prefix . '.') === 0) { |
|
| 1493 | + } elseif (strpos($item, $prefix.'.') === 0) { |
|
| 1494 | 1494 | // this item has the prefix and a period, grab it |
| 1495 | 1495 | $contents_with_prefix[] = substr( |
| 1496 | 1496 | $item, |
| 1497 | - strpos($item, $prefix . '.') + strlen($prefix . '.') |
|
| 1497 | + strpos($item, $prefix.'.') + strlen($prefix.'.') |
|
| 1498 | 1498 | ); |
| 1499 | 1499 | } elseif ($item === $prefix) { |
| 1500 | 1500 | // this item is JUST the prefix |
@@ -1534,9 +1534,9 @@ discard block |
||
| 1534 | 1534 | if ($model_name) { |
| 1535 | 1535 | foreach ($includes as $field_to_include) { |
| 1536 | 1536 | $field_to_include = trim($field_to_include); |
| 1537 | - if (strpos($field_to_include, $model_name . '.') === 0) { |
|
| 1537 | + if (strpos($field_to_include, $model_name.'.') === 0) { |
|
| 1538 | 1538 | // found the model name at the exact start |
| 1539 | - $field_sans_model_name = str_replace($model_name . '.', '', $field_to_include); |
|
| 1539 | + $field_sans_model_name = str_replace($model_name.'.', '', $field_to_include); |
|
| 1540 | 1540 | $extracted_fields_to_include[] = $field_sans_model_name; |
| 1541 | 1541 | } elseif ($field_to_include === $model_name) { |
| 1542 | 1542 | $extracted_fields_to_include[] = '*'; |
@@ -1587,7 +1587,7 @@ discard block |
||
| 1587 | 1587 | $restricted_query_params['caps'] = $context; |
| 1588 | 1588 | $this->setDebugInfo('model query params', $restricted_query_params); |
| 1589 | 1589 | $model_rows = $model->get_all_wpdb_results($restricted_query_params); |
| 1590 | - if (! empty($model_rows)) { |
|
| 1590 | + if ( ! empty($model_rows)) { |
|
| 1591 | 1591 | return $this->createEntityFromWpdbResult( |
| 1592 | 1592 | $model, |
| 1593 | 1593 | reset($model_rows), |
@@ -1599,7 +1599,7 @@ discard block |
||
| 1599 | 1599 | if ($model->exists($query_params)) { |
| 1600 | 1600 | // you got shafted- it existed but we didn't want to tell you! |
| 1601 | 1601 | throw new RestException( |
| 1602 | - 'rest_user_cannot_' . $context, |
|
| 1602 | + 'rest_user_cannot_'.$context, |
|
| 1603 | 1603 | sprintf( |
| 1604 | 1604 | __('Sorry, you cannot %1$s this %2$s. Missing permissions are: %3$s', 'event_espresso'), |
| 1605 | 1605 | $context, |
@@ -1648,12 +1648,12 @@ discard block |
||
| 1648 | 1648 | } |
| 1649 | 1649 | // if this entity requires a password, they better give it and it better be right! |
| 1650 | 1650 | if ($model->hasPassword() |
| 1651 | - && $model_row[ $model->getPasswordField()->get_qualified_column() ] !== '') { |
|
| 1651 | + && $model_row[$model->getPasswordField()->get_qualified_column()] !== '') { |
|
| 1652 | 1652 | if (empty($request['password'])) { |
| 1653 | 1653 | throw new RestPasswordRequiredException(); |
| 1654 | 1654 | } |
| 1655 | - if (!hash_equals( |
|
| 1656 | - $model_row[ $model->getPasswordField()->get_qualified_column() ], |
|
| 1655 | + if ( ! hash_equals( |
|
| 1656 | + $model_row[$model->getPasswordField()->get_qualified_column()], |
|
| 1657 | 1657 | $request['password'] |
| 1658 | 1658 | )) { |
| 1659 | 1659 | throw new RestPasswordIncorrectException(); |
@@ -1664,12 +1664,12 @@ discard block |
||
| 1664 | 1664 | $password_supplied = $request->get_param('password'); |
| 1665 | 1665 | if (empty($password_supplied)) { |
| 1666 | 1666 | $query_params['exclude_protected'] = true; |
| 1667 | - if (!$model->exists($query_params)) { |
|
| 1667 | + if ( ! $model->exists($query_params)) { |
|
| 1668 | 1668 | throw new RestPasswordRequiredException(); |
| 1669 | 1669 | } |
| 1670 | 1670 | } else { |
| 1671 | - $query_params[0][ $model->modelChainAndPassword() ] = $password_supplied; |
|
| 1672 | - if (!$model->exists($query_params)) { |
|
| 1671 | + $query_params[0][$model->modelChainAndPassword()] = $password_supplied; |
|
| 1672 | + if ( ! $model->exists($query_params)) { |
|
| 1673 | 1673 | throw new RestPasswordIncorrectException(); |
| 1674 | 1674 | } |
| 1675 | 1675 | } |
@@ -19,51 +19,51 @@ |
||
| 19 | 19 | */ |
| 20 | 20 | class EspressoEditorAssetManager extends AssetManager |
| 21 | 21 | { |
| 22 | - const JS_HANDLE_EDITOR = 'eventespresso-editor'; |
|
| 23 | - const CSS_HANDLE_EDITOR = 'eventespresso-editor'; |
|
| 24 | - const JS_HANDLE_EDITOR_HOCS = 'eventespresso-editor-hocs'; |
|
| 25 | - const CSS_HANDLE_EDITOR_HOCS = 'eventespresso-editor-hocs'; |
|
| 22 | + const JS_HANDLE_EDITOR = 'eventespresso-editor'; |
|
| 23 | + const CSS_HANDLE_EDITOR = 'eventespresso-editor'; |
|
| 24 | + const JS_HANDLE_EDITOR_HOCS = 'eventespresso-editor-hocs'; |
|
| 25 | + const CSS_HANDLE_EDITOR_HOCS = 'eventespresso-editor-hocs'; |
|
| 26 | 26 | |
| 27 | 27 | |
| 28 | - /** |
|
| 29 | - * @throws InvalidDataTypeException |
|
| 30 | - * @throws InvalidEntityException |
|
| 31 | - * @throws DuplicateCollectionIdentifierException |
|
| 32 | - * @throws DomainException |
|
| 33 | - */ |
|
| 34 | - public function addAssets() |
|
| 35 | - { |
|
| 36 | - $this->registerJavascript(); |
|
| 37 | - $this->registerStyleSheets(); |
|
| 38 | - } |
|
| 28 | + /** |
|
| 29 | + * @throws InvalidDataTypeException |
|
| 30 | + * @throws InvalidEntityException |
|
| 31 | + * @throws DuplicateCollectionIdentifierException |
|
| 32 | + * @throws DomainException |
|
| 33 | + */ |
|
| 34 | + public function addAssets() |
|
| 35 | + { |
|
| 36 | + $this->registerJavascript(); |
|
| 37 | + $this->registerStyleSheets(); |
|
| 38 | + } |
|
| 39 | 39 | |
| 40 | 40 | |
| 41 | - /** |
|
| 42 | - * Register javascript assets |
|
| 43 | - * |
|
| 44 | - * @throws InvalidDataTypeException |
|
| 45 | - * @throws InvalidEntityException |
|
| 46 | - * @throws DuplicateCollectionIdentifierException |
|
| 47 | - * @throws DomainException |
|
| 48 | - */ |
|
| 49 | - private function registerJavascript() |
|
| 50 | - { |
|
| 51 | - $this->addJs(self::JS_HANDLE_EDITOR)->setRequiresTranslation(); |
|
| 52 | - $this->addJs(self::JS_HANDLE_EDITOR_HOCS)->setRequiresTranslation(); |
|
| 53 | - } |
|
| 41 | + /** |
|
| 42 | + * Register javascript assets |
|
| 43 | + * |
|
| 44 | + * @throws InvalidDataTypeException |
|
| 45 | + * @throws InvalidEntityException |
|
| 46 | + * @throws DuplicateCollectionIdentifierException |
|
| 47 | + * @throws DomainException |
|
| 48 | + */ |
|
| 49 | + private function registerJavascript() |
|
| 50 | + { |
|
| 51 | + $this->addJs(self::JS_HANDLE_EDITOR)->setRequiresTranslation(); |
|
| 52 | + $this->addJs(self::JS_HANDLE_EDITOR_HOCS)->setRequiresTranslation(); |
|
| 53 | + } |
|
| 54 | 54 | |
| 55 | 55 | |
| 56 | - /** |
|
| 57 | - * Register CSS assets. |
|
| 58 | - * |
|
| 59 | - * @throws DuplicateCollectionIdentifierException |
|
| 60 | - * @throws InvalidDataTypeException |
|
| 61 | - * @throws InvalidEntityException |
|
| 62 | - * @throws DomainException |
|
| 63 | - */ |
|
| 64 | - private function registerStyleSheets() |
|
| 65 | - { |
|
| 66 | - $this->addCss(self::CSS_HANDLE_EDITOR); |
|
| 67 | - $this->addCss(self::CSS_HANDLE_EDITOR_HOCS); |
|
| 68 | - } |
|
| 56 | + /** |
|
| 57 | + * Register CSS assets. |
|
| 58 | + * |
|
| 59 | + * @throws DuplicateCollectionIdentifierException |
|
| 60 | + * @throws InvalidDataTypeException |
|
| 61 | + * @throws InvalidEntityException |
|
| 62 | + * @throws DomainException |
|
| 63 | + */ |
|
| 64 | + private function registerStyleSheets() |
|
| 65 | + { |
|
| 66 | + $this->addCss(self::CSS_HANDLE_EDITOR); |
|
| 67 | + $this->addCss(self::CSS_HANDLE_EDITOR_HOCS); |
|
| 68 | + } |
|
| 69 | 69 | } |
@@ -32,469 +32,469 @@ |
||
| 32 | 32 | class CoreAssetManager extends AssetManager |
| 33 | 33 | { |
| 34 | 34 | |
| 35 | - // WordPress core / Third party JS asset handles |
|
| 36 | - const JS_HANDLE_JQUERY = 'jquery'; |
|
| 35 | + // WordPress core / Third party JS asset handles |
|
| 36 | + const JS_HANDLE_JQUERY = 'jquery'; |
|
| 37 | 37 | |
| 38 | - const JS_HANDLE_JQUERY_VALIDATE = 'jquery-validate'; |
|
| 38 | + const JS_HANDLE_JQUERY_VALIDATE = 'jquery-validate'; |
|
| 39 | 39 | |
| 40 | - const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods'; |
|
| 40 | + const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods'; |
|
| 41 | 41 | |
| 42 | - const JS_HANDLE_UNDERSCORE = 'underscore'; |
|
| 42 | + const JS_HANDLE_UNDERSCORE = 'underscore'; |
|
| 43 | 43 | |
| 44 | - const JS_HANDLE_ACCOUNTING_CORE = 'ee-accounting-core'; |
|
| 44 | + const JS_HANDLE_ACCOUNTING_CORE = 'ee-accounting-core'; |
|
| 45 | 45 | |
| 46 | - /** |
|
| 47 | - * @since 4.9.71.p |
|
| 48 | - */ |
|
| 49 | - const JS_HANDLE_REACT = 'react'; |
|
| 46 | + /** |
|
| 47 | + * @since 4.9.71.p |
|
| 48 | + */ |
|
| 49 | + const JS_HANDLE_REACT = 'react'; |
|
| 50 | 50 | |
| 51 | - /** |
|
| 52 | - * @since 4.9.71.p |
|
| 53 | - */ |
|
| 54 | - const JS_HANDLE_REACT_DOM = 'react-dom'; |
|
| 51 | + /** |
|
| 52 | + * @since 4.9.71.p |
|
| 53 | + */ |
|
| 54 | + const JS_HANDLE_REACT_DOM = 'react-dom'; |
|
| 55 | 55 | |
| 56 | - /** |
|
| 57 | - * @since 4.9.71.p |
|
| 58 | - */ |
|
| 59 | - const JS_HANDLE_LODASH = 'lodash'; |
|
| 56 | + /** |
|
| 57 | + * @since 4.9.71.p |
|
| 58 | + */ |
|
| 59 | + const JS_HANDLE_LODASH = 'lodash'; |
|
| 60 | 60 | |
| 61 | - const JS_HANDLE_JS_CORE = 'eejs-core'; |
|
| 61 | + const JS_HANDLE_JS_CORE = 'eejs-core'; |
|
| 62 | 62 | |
| 63 | - const JS_HANDLE_VENDOR = 'eventespresso-vendor'; |
|
| 63 | + const JS_HANDLE_VENDOR = 'eventespresso-vendor'; |
|
| 64 | 64 | |
| 65 | - const JS_HANDLE_UTILS = 'eventespresso-utils'; |
|
| 65 | + const JS_HANDLE_UTILS = 'eventespresso-utils'; |
|
| 66 | 66 | |
| 67 | - const JS_HANDLE_DATA_STORES = 'eventespresso-data-stores'; |
|
| 67 | + const JS_HANDLE_DATA_STORES = 'eventespresso-data-stores'; |
|
| 68 | 68 | |
| 69 | - const JS_HANDLE_HELPERS = 'eventespresso-helpers'; |
|
| 69 | + const JS_HANDLE_HELPERS = 'eventespresso-helpers'; |
|
| 70 | 70 | |
| 71 | - const JS_HANDLE_MODEL = 'eventespresso-model'; |
|
| 72 | - const JS_HANDLE_MODEL_SCHEMA = 'eventespresso-model-schema'; |
|
| 71 | + const JS_HANDLE_MODEL = 'eventespresso-model'; |
|
| 72 | + const JS_HANDLE_MODEL_SCHEMA = 'eventespresso-model-schema'; |
|
| 73 | 73 | |
| 74 | - const JS_HANDLE_VALUE_OBJECTS = 'eventespresso-value-objects'; |
|
| 74 | + const JS_HANDLE_VALUE_OBJECTS = 'eventespresso-value-objects'; |
|
| 75 | 75 | |
| 76 | - const JS_HANDLE_HOCS = 'eventespresso-hocs'; |
|
| 76 | + const JS_HANDLE_HOCS = 'eventespresso-hocs'; |
|
| 77 | 77 | |
| 78 | - const JS_HANDLE_COMPONENTS = 'eventespresso-components'; |
|
| 78 | + const JS_HANDLE_COMPONENTS = 'eventespresso-components'; |
|
| 79 | 79 | |
| 80 | - const JS_HANDLE_HOOKS = 'eventespresso-hooks'; |
|
| 80 | + const JS_HANDLE_HOOKS = 'eventespresso-hooks'; |
|
| 81 | 81 | |
| 82 | - const JS_HANDLE_VALIDATORS = 'eventespresso-validators'; |
|
| 82 | + const JS_HANDLE_VALIDATORS = 'eventespresso-validators'; |
|
| 83 | 83 | |
| 84 | - const JS_HANDLE_CORE = 'espresso_core'; |
|
| 84 | + const JS_HANDLE_CORE = 'espresso_core'; |
|
| 85 | 85 | |
| 86 | - const JS_HANDLE_I18N = 'eei18n'; |
|
| 86 | + const JS_HANDLE_I18N = 'eei18n'; |
|
| 87 | 87 | |
| 88 | - const JS_HANDLE_ACCOUNTING = 'ee-accounting'; |
|
| 88 | + const JS_HANDLE_ACCOUNTING = 'ee-accounting'; |
|
| 89 | 89 | |
| 90 | - const JS_HANDLE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page'; |
|
| 90 | + const JS_HANDLE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page'; |
|
| 91 | 91 | |
| 92 | - // EE CSS assets handles |
|
| 93 | - const CSS_HANDLE_DEFAULT = 'espresso_default'; |
|
| 94 | - |
|
| 95 | - const CSS_HANDLE_CUSTOM = 'espresso_custom_css'; |
|
| 96 | - |
|
| 97 | - const CSS_HANDLE_COMPONENTS = 'eventespresso-components'; |
|
| 98 | - |
|
| 99 | - const CSS_HANDLE_HOCS = 'eventespresso-hocs'; |
|
| 100 | - |
|
| 101 | - const CSS_HANDLE_CORE_CSS_DEFAULT = 'eventespresso-core-css-default'; |
|
| 102 | - |
|
| 103 | - /** |
|
| 104 | - * @var EE_Currency_Config $currency_config |
|
| 105 | - */ |
|
| 106 | - protected $currency_config; |
|
| 107 | - |
|
| 108 | - /** |
|
| 109 | - * @var EE_Template_Config $template_config |
|
| 110 | - */ |
|
| 111 | - protected $template_config; |
|
| 112 | - |
|
| 113 | - |
|
| 114 | - /** |
|
| 115 | - * CoreAssetRegister constructor. |
|
| 116 | - * |
|
| 117 | - * @param AssetCollection $assets |
|
| 118 | - * @param EE_Currency_Config $currency_config |
|
| 119 | - * @param EE_Template_Config $template_config |
|
| 120 | - * @param DomainInterface $domain |
|
| 121 | - * @param Registry $registry |
|
| 122 | - */ |
|
| 123 | - public function __construct( |
|
| 124 | - AssetCollection $assets, |
|
| 125 | - EE_Currency_Config $currency_config, |
|
| 126 | - EE_Template_Config $template_config, |
|
| 127 | - DomainInterface $domain, |
|
| 128 | - Registry $registry |
|
| 129 | - ) { |
|
| 130 | - $this->currency_config = $currency_config; |
|
| 131 | - $this->template_config = $template_config; |
|
| 132 | - parent::__construct($domain, $assets, $registry); |
|
| 133 | - } |
|
| 134 | - |
|
| 135 | - |
|
| 136 | - /** |
|
| 137 | - * @since 4.9.62.p |
|
| 138 | - * @throws DomainException |
|
| 139 | - * @throws DuplicateCollectionIdentifierException |
|
| 140 | - * @throws InvalidArgumentException |
|
| 141 | - * @throws InvalidDataTypeException |
|
| 142 | - * @throws InvalidEntityException |
|
| 143 | - * @throws InvalidInterfaceException |
|
| 144 | - */ |
|
| 145 | - public function addAssets() |
|
| 146 | - { |
|
| 147 | - $this->addJavascriptFiles(); |
|
| 148 | - $this->addStylesheetFiles(); |
|
| 149 | - } |
|
| 150 | - |
|
| 151 | - |
|
| 152 | - /** |
|
| 153 | - * @since 4.9.62.p |
|
| 154 | - * @throws DomainException |
|
| 155 | - * @throws DuplicateCollectionIdentifierException |
|
| 156 | - * @throws InvalidArgumentException |
|
| 157 | - * @throws InvalidDataTypeException |
|
| 158 | - * @throws InvalidEntityException |
|
| 159 | - * @throws InvalidInterfaceException |
|
| 160 | - */ |
|
| 161 | - public function addJavascriptFiles() |
|
| 162 | - { |
|
| 163 | - $this->loadCoreJs(); |
|
| 164 | - $this->loadJqueryValidate(); |
|
| 165 | - $this->loadAccountingJs(); |
|
| 166 | - add_action( |
|
| 167 | - 'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script', |
|
| 168 | - array($this, 'loadQtipJs') |
|
| 169 | - ); |
|
| 170 | - $this->registerAdminAssets(); |
|
| 171 | - } |
|
| 172 | - |
|
| 173 | - |
|
| 174 | - /** |
|
| 175 | - * @throws DuplicateCollectionIdentifierException |
|
| 176 | - * @throws InvalidDataTypeException |
|
| 177 | - * @throws InvalidEntityException |
|
| 178 | - * @throws DomainException |
|
| 179 | - * @since 4.9.62.p |
|
| 180 | - */ |
|
| 181 | - public function addStylesheetFiles() |
|
| 182 | - { |
|
| 183 | - $this->loadCoreCss(); |
|
| 184 | - } |
|
| 185 | - |
|
| 186 | - |
|
| 187 | - /** |
|
| 188 | - * core default javascript |
|
| 189 | - * |
|
| 190 | - * @since 4.9.62.p |
|
| 191 | - * @throws DomainException |
|
| 192 | - * @throws DuplicateCollectionIdentifierException |
|
| 193 | - * @throws InvalidArgumentException |
|
| 194 | - * @throws InvalidDataTypeException |
|
| 195 | - * @throws InvalidEntityException |
|
| 196 | - * @throws InvalidInterfaceException |
|
| 197 | - */ |
|
| 198 | - private function loadCoreJs() |
|
| 199 | - { |
|
| 200 | - // conditionally load third-party libraries that WP core MIGHT have. |
|
| 201 | - $this->registerWpAssets(); |
|
| 202 | - |
|
| 203 | - $this->addJs(self::JS_HANDLE_JS_CORE)->setHasInlineData(); |
|
| 204 | - $this->addJs(self::JS_HANDLE_VENDOR); |
|
| 205 | - $this->addJs(self::JS_HANDLE_UTILS)->setRequiresTranslation(); |
|
| 206 | - $this->addJs(self::JS_HANDLE_VALIDATORS)->setRequiresTranslation(); |
|
| 207 | - $this->addJs(self::JS_HANDLE_HELPERS)->setRequiresTranslation(); |
|
| 208 | - $this->addJs(self::JS_HANDLE_MODEL)->setRequiresTranslation(); |
|
| 209 | - $this->addJs(self::JS_HANDLE_MODEL_SCHEMA)->setRequiresTranslation(); |
|
| 210 | - $this->addJs(self::JS_HANDLE_HOOKS); |
|
| 211 | - $this->addJs(self::JS_HANDLE_VALUE_OBJECTS)->setRequiresTranslation(); |
|
| 212 | - $this->addJs(self::JS_HANDLE_DATA_STORES)->setRequiresTranslation()->setInlineDataCallback( |
|
| 213 | - static function () { |
|
| 214 | - wp_add_inline_script( |
|
| 215 | - CoreAssetManager::JS_HANDLE_DATA_STORES, |
|
| 216 | - is_admin() |
|
| 217 | - ? 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware( eejs.middleWares.apiFetch.CONTEXT_CAPS_EDIT ) )' |
|
| 218 | - : 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware )' |
|
| 219 | - ); |
|
| 220 | - } |
|
| 221 | - ); |
|
| 222 | - $this->addJs(self::JS_HANDLE_HOCS, [self::JS_HANDLE_DATA_STORES])->setRequiresTranslation(); |
|
| 223 | - $this->addJs(self::JS_HANDLE_COMPONENTS, [self::JS_HANDLE_DATA_STORES])->setRequiresTranslation(); |
|
| 224 | - |
|
| 225 | - $this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest')); |
|
| 226 | - $this->registry->addData( |
|
| 227 | - 'paths', |
|
| 228 | - array( |
|
| 229 | - 'base_rest_route' => rest_url(), |
|
| 230 | - 'rest_route' => rest_url('ee/v4.8.36/'), |
|
| 231 | - 'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(), |
|
| 232 | - 'primary_keys' => EED_Core_Rest_Api::getPrimaryKeyNamesIndexedByModelName(), |
|
| 233 | - 'site_url' => site_url('/'), |
|
| 234 | - 'admin_url' => admin_url('/'), |
|
| 235 | - ) |
|
| 236 | - ); |
|
| 237 | - // Event Espresso brand name |
|
| 238 | - $this->registry->addData('brandName', Domain::brandName()); |
|
| 239 | - /** site formatting values **/ |
|
| 240 | - $this->registry->addData( |
|
| 241 | - 'site_formats', |
|
| 242 | - array( |
|
| 243 | - 'date_formats' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats() |
|
| 244 | - ) |
|
| 245 | - ); |
|
| 246 | - /** currency data **/ |
|
| 247 | - $this->registry->addData( |
|
| 248 | - 'currency_config', |
|
| 249 | - $this->getCurrencySettings() |
|
| 250 | - ); |
|
| 251 | - /** site timezone */ |
|
| 252 | - $this->registry->addData( |
|
| 253 | - 'default_timezone', |
|
| 254 | - array( |
|
| 255 | - 'pretty' => EEH_DTT_Helper::get_timezone_string_for_display(), |
|
| 256 | - 'string' => get_option('timezone_string'), |
|
| 257 | - 'offset' => EEH_DTT_Helper::get_site_timezone_gmt_offset(), |
|
| 258 | - ) |
|
| 259 | - ); |
|
| 260 | - /** site locale (user locale if user logged in) */ |
|
| 261 | - $this->registry->addData( |
|
| 262 | - 'locale', |
|
| 263 | - array( |
|
| 264 | - 'user' => get_user_locale(), |
|
| 265 | - 'site' => get_locale() |
|
| 266 | - ) |
|
| 267 | - ); |
|
| 268 | - |
|
| 269 | - $this->addJavascript( |
|
| 270 | - CoreAssetManager::JS_HANDLE_CORE, |
|
| 271 | - EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js', |
|
| 272 | - array(CoreAssetManager::JS_HANDLE_JQUERY) |
|
| 273 | - ) |
|
| 274 | - ->setInlineDataCallback( |
|
| 275 | - static function () { |
|
| 276 | - wp_localize_script( |
|
| 277 | - CoreAssetManager::JS_HANDLE_CORE, |
|
| 278 | - CoreAssetManager::JS_HANDLE_I18N, |
|
| 279 | - EE_Registry::$i18n_js_strings |
|
| 280 | - ); |
|
| 281 | - } |
|
| 282 | - ); |
|
| 283 | - } |
|
| 284 | - |
|
| 285 | - |
|
| 286 | - /** |
|
| 287 | - * Registers vendor files that are bundled with a later version WP but might not be for the current version of |
|
| 288 | - * WordPress in the running environment. |
|
| 289 | - * |
|
| 290 | - * @throws DuplicateCollectionIdentifierException |
|
| 291 | - * @throws InvalidDataTypeException |
|
| 292 | - * @throws InvalidEntityException |
|
| 293 | - * @throws DomainException |
|
| 294 | - * @since 4.9.71.p |
|
| 295 | - */ |
|
| 296 | - private function registerWpAssets() |
|
| 297 | - { |
|
| 298 | - global $wp_version; |
|
| 299 | - if (version_compare($wp_version, '5.0.beta', '>=')) { |
|
| 300 | - return; |
|
| 301 | - } |
|
| 302 | - $this->addVendorJavascript(CoreAssetManager::JS_HANDLE_REACT, [], true, '16.6.0'); |
|
| 303 | - $this->addVendorJavascript( |
|
| 304 | - CoreAssetManager::JS_HANDLE_REACT_DOM, |
|
| 305 | - array(CoreAssetManager::JS_HANDLE_REACT), |
|
| 306 | - true, |
|
| 307 | - '16.6.0' |
|
| 308 | - ); |
|
| 309 | - $this->addVendorJavascript(CoreAssetManager::JS_HANDLE_LODASH, [], true, '4.17.11') |
|
| 310 | - ->setInlineDataCallback( |
|
| 311 | - static function() { |
|
| 312 | - wp_add_inline_script( |
|
| 313 | - CoreAssetManager::JS_HANDLE_LODASH, |
|
| 314 | - 'window.lodash = _.noConflict();' |
|
| 315 | - ); |
|
| 316 | - } |
|
| 317 | - ); |
|
| 318 | - } |
|
| 319 | - |
|
| 320 | - |
|
| 321 | - /** |
|
| 322 | - * Returns configuration data for the accounting-js library. |
|
| 323 | - * @since 4.9.71.p |
|
| 324 | - * @return array |
|
| 325 | - */ |
|
| 326 | - private function getAccountingSettings() { |
|
| 327 | - return array( |
|
| 328 | - 'currency' => array( |
|
| 329 | - 'symbol' => $this->currency_config->sign, |
|
| 330 | - 'format' => array( |
|
| 331 | - 'pos' => $this->currency_config->sign_b4 ? '%s%v' : '%v%s', |
|
| 332 | - 'neg' => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s', |
|
| 333 | - 'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s', |
|
| 334 | - ), |
|
| 335 | - 'decimal' => $this->currency_config->dec_mrk, |
|
| 336 | - 'thousand' => $this->currency_config->thsnds, |
|
| 337 | - 'precision' => $this->currency_config->dec_plc, |
|
| 338 | - ), |
|
| 339 | - 'number' => array( |
|
| 340 | - 'precision' => $this->currency_config->dec_plc, |
|
| 341 | - 'thousand' => $this->currency_config->thsnds, |
|
| 342 | - 'decimal' => $this->currency_config->dec_mrk, |
|
| 343 | - ), |
|
| 344 | - ); |
|
| 345 | - } |
|
| 346 | - |
|
| 347 | - |
|
| 348 | - /** |
|
| 349 | - * Returns configuration data for the js Currency VO. |
|
| 350 | - * @since 4.9.71.p |
|
| 351 | - * @return array |
|
| 352 | - */ |
|
| 353 | - private function getCurrencySettings() |
|
| 354 | - { |
|
| 355 | - return array( |
|
| 356 | - 'code' => $this->currency_config->code, |
|
| 357 | - 'singularLabel' => $this->currency_config->name, |
|
| 358 | - 'pluralLabel' => $this->currency_config->plural, |
|
| 359 | - 'sign' => $this->currency_config->sign, |
|
| 360 | - 'signB4' => $this->currency_config->sign_b4, |
|
| 361 | - 'decimalPlaces' => $this->currency_config->dec_plc, |
|
| 362 | - 'decimalMark' => $this->currency_config->dec_mrk, |
|
| 363 | - 'thousandsSeparator' => $this->currency_config->thsnds, |
|
| 364 | - ); |
|
| 365 | - } |
|
| 366 | - |
|
| 367 | - |
|
| 368 | - /** |
|
| 369 | - * @throws DuplicateCollectionIdentifierException |
|
| 370 | - * @throws InvalidDataTypeException |
|
| 371 | - * @throws InvalidEntityException |
|
| 372 | - * @throws DomainException |
|
| 373 | - * @since 4.9.62.p |
|
| 374 | - */ |
|
| 375 | - private function loadCoreCss() |
|
| 376 | - { |
|
| 377 | - if ($this->template_config->enable_default_style && ! is_admin()) { |
|
| 378 | - $this->addStylesheet( |
|
| 379 | - CoreAssetManager::CSS_HANDLE_DEFAULT, |
|
| 380 | - is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css') |
|
| 381 | - ? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css' |
|
| 382 | - : EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css', |
|
| 383 | - array('dashicons') |
|
| 384 | - ); |
|
| 385 | - //Load custom style sheet if available |
|
| 386 | - if ($this->template_config->custom_style_sheet !== null) { |
|
| 387 | - $this->addStylesheet( |
|
| 388 | - CoreAssetManager::CSS_HANDLE_CUSTOM, |
|
| 389 | - EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet, |
|
| 390 | - array(CoreAssetManager::CSS_HANDLE_DEFAULT) |
|
| 391 | - ); |
|
| 392 | - } |
|
| 393 | - } |
|
| 394 | - $this->addCss(self::CSS_HANDLE_CORE_CSS_DEFAULT, ['dashicons']); |
|
| 395 | - $this->addCss(self::CSS_HANDLE_COMPONENTS, [self::CSS_HANDLE_CORE_CSS_DEFAULT]); |
|
| 396 | - $this->addCss(self::CSS_HANDLE_HOCS); |
|
| 397 | - } |
|
| 398 | - |
|
| 399 | - |
|
| 400 | - /** |
|
| 401 | - * jQuery Validate for form validation |
|
| 402 | - * |
|
| 403 | - * @since 4.9.62.p |
|
| 404 | - * @throws DomainException |
|
| 405 | - * @throws DuplicateCollectionIdentifierException |
|
| 406 | - * @throws InvalidDataTypeException |
|
| 407 | - * @throws InvalidEntityException |
|
| 408 | - */ |
|
| 409 | - private function loadJqueryValidate() |
|
| 410 | - { |
|
| 411 | - $this->addJavascript( |
|
| 412 | - CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE, |
|
| 413 | - EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js', |
|
| 414 | - array(CoreAssetManager::JS_HANDLE_JQUERY), |
|
| 415 | - true, |
|
| 416 | - '1.15.0' |
|
| 417 | - ); |
|
| 418 | - |
|
| 419 | - $this->addJavascript( |
|
| 420 | - CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA, |
|
| 421 | - EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js', |
|
| 422 | - array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE), |
|
| 423 | - true, |
|
| 424 | - '1.15.0' |
|
| 425 | - ); |
|
| 426 | - } |
|
| 427 | - |
|
| 428 | - |
|
| 429 | - /** |
|
| 430 | - * accounting.js for performing client-side calculations |
|
| 431 | - * |
|
| 432 | - * @since 4.9.62.p |
|
| 433 | - * @throws DomainException |
|
| 434 | - * @throws DuplicateCollectionIdentifierException |
|
| 435 | - * @throws InvalidDataTypeException |
|
| 436 | - * @throws InvalidEntityException |
|
| 437 | - */ |
|
| 438 | - private function loadAccountingJs() |
|
| 439 | - { |
|
| 440 | - //accounting.js library |
|
| 441 | - // @link http://josscrowcroft.github.io/accounting.js/ |
|
| 442 | - $this->addJavascript( |
|
| 443 | - CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE, |
|
| 444 | - EE_THIRD_PARTY_URL . 'accounting/accounting.js', |
|
| 445 | - array(CoreAssetManager::JS_HANDLE_UNDERSCORE), |
|
| 446 | - true, |
|
| 447 | - '0.3.2' |
|
| 448 | - ); |
|
| 449 | - |
|
| 450 | - $this->addJavascript( |
|
| 451 | - CoreAssetManager::JS_HANDLE_ACCOUNTING, |
|
| 452 | - EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js', |
|
| 453 | - array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE) |
|
| 454 | - ) |
|
| 455 | - ->setInlineDataCallback( |
|
| 456 | - function () { |
|
| 457 | - wp_localize_script( |
|
| 458 | - CoreAssetManager::JS_HANDLE_ACCOUNTING, |
|
| 459 | - 'EE_ACCOUNTING_CFG', |
|
| 460 | - $this->getAccountingSettings() |
|
| 461 | - ); |
|
| 462 | - } |
|
| 463 | - ); |
|
| 464 | - } |
|
| 465 | - |
|
| 466 | - |
|
| 467 | - /** |
|
| 468 | - * registers assets for cleaning your ears |
|
| 469 | - * |
|
| 470 | - * @param JavascriptAsset $script |
|
| 471 | - */ |
|
| 472 | - public function loadQtipJs(JavascriptAsset $script) |
|
| 473 | - { |
|
| 474 | - // qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook, |
|
| 475 | - // can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' ); |
|
| 476 | - if ( |
|
| 477 | - $script->handle() === CoreAssetManager::JS_HANDLE_WP_PLUGINS_PAGE |
|
| 478 | - && apply_filters('FHEE_load_qtip', false) |
|
| 479 | - ) { |
|
| 480 | - EEH_Qtip_Loader::instance()->register_and_enqueue(); |
|
| 481 | - } |
|
| 482 | - } |
|
| 483 | - |
|
| 484 | - |
|
| 485 | - /** |
|
| 486 | - * assets that are used in the WordPress admin |
|
| 487 | - * |
|
| 488 | - * @throws DuplicateCollectionIdentifierException |
|
| 489 | - * @throws InvalidDataTypeException |
|
| 490 | - * @throws InvalidEntityException |
|
| 491 | - * @throws DomainException |
|
| 492 | - * @since 4.9.62.p |
|
| 493 | - */ |
|
| 494 | - private function registerAdminAssets() |
|
| 495 | - { |
|
| 496 | - $this->addJs(self::JS_HANDLE_WP_PLUGINS_PAGE)->setRequiresTranslation(); |
|
| 497 | - // note usage of the "JS_HANDLE.." constant is intentional here because css uses the same handle. |
|
| 498 | - $this->addCss(self::JS_HANDLE_WP_PLUGINS_PAGE); |
|
| 499 | - } |
|
| 92 | + // EE CSS assets handles |
|
| 93 | + const CSS_HANDLE_DEFAULT = 'espresso_default'; |
|
| 94 | + |
|
| 95 | + const CSS_HANDLE_CUSTOM = 'espresso_custom_css'; |
|
| 96 | + |
|
| 97 | + const CSS_HANDLE_COMPONENTS = 'eventespresso-components'; |
|
| 98 | + |
|
| 99 | + const CSS_HANDLE_HOCS = 'eventespresso-hocs'; |
|
| 100 | + |
|
| 101 | + const CSS_HANDLE_CORE_CSS_DEFAULT = 'eventespresso-core-css-default'; |
|
| 102 | + |
|
| 103 | + /** |
|
| 104 | + * @var EE_Currency_Config $currency_config |
|
| 105 | + */ |
|
| 106 | + protected $currency_config; |
|
| 107 | + |
|
| 108 | + /** |
|
| 109 | + * @var EE_Template_Config $template_config |
|
| 110 | + */ |
|
| 111 | + protected $template_config; |
|
| 112 | + |
|
| 113 | + |
|
| 114 | + /** |
|
| 115 | + * CoreAssetRegister constructor. |
|
| 116 | + * |
|
| 117 | + * @param AssetCollection $assets |
|
| 118 | + * @param EE_Currency_Config $currency_config |
|
| 119 | + * @param EE_Template_Config $template_config |
|
| 120 | + * @param DomainInterface $domain |
|
| 121 | + * @param Registry $registry |
|
| 122 | + */ |
|
| 123 | + public function __construct( |
|
| 124 | + AssetCollection $assets, |
|
| 125 | + EE_Currency_Config $currency_config, |
|
| 126 | + EE_Template_Config $template_config, |
|
| 127 | + DomainInterface $domain, |
|
| 128 | + Registry $registry |
|
| 129 | + ) { |
|
| 130 | + $this->currency_config = $currency_config; |
|
| 131 | + $this->template_config = $template_config; |
|
| 132 | + parent::__construct($domain, $assets, $registry); |
|
| 133 | + } |
|
| 134 | + |
|
| 135 | + |
|
| 136 | + /** |
|
| 137 | + * @since 4.9.62.p |
|
| 138 | + * @throws DomainException |
|
| 139 | + * @throws DuplicateCollectionIdentifierException |
|
| 140 | + * @throws InvalidArgumentException |
|
| 141 | + * @throws InvalidDataTypeException |
|
| 142 | + * @throws InvalidEntityException |
|
| 143 | + * @throws InvalidInterfaceException |
|
| 144 | + */ |
|
| 145 | + public function addAssets() |
|
| 146 | + { |
|
| 147 | + $this->addJavascriptFiles(); |
|
| 148 | + $this->addStylesheetFiles(); |
|
| 149 | + } |
|
| 150 | + |
|
| 151 | + |
|
| 152 | + /** |
|
| 153 | + * @since 4.9.62.p |
|
| 154 | + * @throws DomainException |
|
| 155 | + * @throws DuplicateCollectionIdentifierException |
|
| 156 | + * @throws InvalidArgumentException |
|
| 157 | + * @throws InvalidDataTypeException |
|
| 158 | + * @throws InvalidEntityException |
|
| 159 | + * @throws InvalidInterfaceException |
|
| 160 | + */ |
|
| 161 | + public function addJavascriptFiles() |
|
| 162 | + { |
|
| 163 | + $this->loadCoreJs(); |
|
| 164 | + $this->loadJqueryValidate(); |
|
| 165 | + $this->loadAccountingJs(); |
|
| 166 | + add_action( |
|
| 167 | + 'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script', |
|
| 168 | + array($this, 'loadQtipJs') |
|
| 169 | + ); |
|
| 170 | + $this->registerAdminAssets(); |
|
| 171 | + } |
|
| 172 | + |
|
| 173 | + |
|
| 174 | + /** |
|
| 175 | + * @throws DuplicateCollectionIdentifierException |
|
| 176 | + * @throws InvalidDataTypeException |
|
| 177 | + * @throws InvalidEntityException |
|
| 178 | + * @throws DomainException |
|
| 179 | + * @since 4.9.62.p |
|
| 180 | + */ |
|
| 181 | + public function addStylesheetFiles() |
|
| 182 | + { |
|
| 183 | + $this->loadCoreCss(); |
|
| 184 | + } |
|
| 185 | + |
|
| 186 | + |
|
| 187 | + /** |
|
| 188 | + * core default javascript |
|
| 189 | + * |
|
| 190 | + * @since 4.9.62.p |
|
| 191 | + * @throws DomainException |
|
| 192 | + * @throws DuplicateCollectionIdentifierException |
|
| 193 | + * @throws InvalidArgumentException |
|
| 194 | + * @throws InvalidDataTypeException |
|
| 195 | + * @throws InvalidEntityException |
|
| 196 | + * @throws InvalidInterfaceException |
|
| 197 | + */ |
|
| 198 | + private function loadCoreJs() |
|
| 199 | + { |
|
| 200 | + // conditionally load third-party libraries that WP core MIGHT have. |
|
| 201 | + $this->registerWpAssets(); |
|
| 202 | + |
|
| 203 | + $this->addJs(self::JS_HANDLE_JS_CORE)->setHasInlineData(); |
|
| 204 | + $this->addJs(self::JS_HANDLE_VENDOR); |
|
| 205 | + $this->addJs(self::JS_HANDLE_UTILS)->setRequiresTranslation(); |
|
| 206 | + $this->addJs(self::JS_HANDLE_VALIDATORS)->setRequiresTranslation(); |
|
| 207 | + $this->addJs(self::JS_HANDLE_HELPERS)->setRequiresTranslation(); |
|
| 208 | + $this->addJs(self::JS_HANDLE_MODEL)->setRequiresTranslation(); |
|
| 209 | + $this->addJs(self::JS_HANDLE_MODEL_SCHEMA)->setRequiresTranslation(); |
|
| 210 | + $this->addJs(self::JS_HANDLE_HOOKS); |
|
| 211 | + $this->addJs(self::JS_HANDLE_VALUE_OBJECTS)->setRequiresTranslation(); |
|
| 212 | + $this->addJs(self::JS_HANDLE_DATA_STORES)->setRequiresTranslation()->setInlineDataCallback( |
|
| 213 | + static function () { |
|
| 214 | + wp_add_inline_script( |
|
| 215 | + CoreAssetManager::JS_HANDLE_DATA_STORES, |
|
| 216 | + is_admin() |
|
| 217 | + ? 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware( eejs.middleWares.apiFetch.CONTEXT_CAPS_EDIT ) )' |
|
| 218 | + : 'wp.apiFetch.use( eejs.middleWares.apiFetch.capsMiddleware )' |
|
| 219 | + ); |
|
| 220 | + } |
|
| 221 | + ); |
|
| 222 | + $this->addJs(self::JS_HANDLE_HOCS, [self::JS_HANDLE_DATA_STORES])->setRequiresTranslation(); |
|
| 223 | + $this->addJs(self::JS_HANDLE_COMPONENTS, [self::JS_HANDLE_DATA_STORES])->setRequiresTranslation(); |
|
| 224 | + |
|
| 225 | + $this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest')); |
|
| 226 | + $this->registry->addData( |
|
| 227 | + 'paths', |
|
| 228 | + array( |
|
| 229 | + 'base_rest_route' => rest_url(), |
|
| 230 | + 'rest_route' => rest_url('ee/v4.8.36/'), |
|
| 231 | + 'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(), |
|
| 232 | + 'primary_keys' => EED_Core_Rest_Api::getPrimaryKeyNamesIndexedByModelName(), |
|
| 233 | + 'site_url' => site_url('/'), |
|
| 234 | + 'admin_url' => admin_url('/'), |
|
| 235 | + ) |
|
| 236 | + ); |
|
| 237 | + // Event Espresso brand name |
|
| 238 | + $this->registry->addData('brandName', Domain::brandName()); |
|
| 239 | + /** site formatting values **/ |
|
| 240 | + $this->registry->addData( |
|
| 241 | + 'site_formats', |
|
| 242 | + array( |
|
| 243 | + 'date_formats' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats() |
|
| 244 | + ) |
|
| 245 | + ); |
|
| 246 | + /** currency data **/ |
|
| 247 | + $this->registry->addData( |
|
| 248 | + 'currency_config', |
|
| 249 | + $this->getCurrencySettings() |
|
| 250 | + ); |
|
| 251 | + /** site timezone */ |
|
| 252 | + $this->registry->addData( |
|
| 253 | + 'default_timezone', |
|
| 254 | + array( |
|
| 255 | + 'pretty' => EEH_DTT_Helper::get_timezone_string_for_display(), |
|
| 256 | + 'string' => get_option('timezone_string'), |
|
| 257 | + 'offset' => EEH_DTT_Helper::get_site_timezone_gmt_offset(), |
|
| 258 | + ) |
|
| 259 | + ); |
|
| 260 | + /** site locale (user locale if user logged in) */ |
|
| 261 | + $this->registry->addData( |
|
| 262 | + 'locale', |
|
| 263 | + array( |
|
| 264 | + 'user' => get_user_locale(), |
|
| 265 | + 'site' => get_locale() |
|
| 266 | + ) |
|
| 267 | + ); |
|
| 268 | + |
|
| 269 | + $this->addJavascript( |
|
| 270 | + CoreAssetManager::JS_HANDLE_CORE, |
|
| 271 | + EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js', |
|
| 272 | + array(CoreAssetManager::JS_HANDLE_JQUERY) |
|
| 273 | + ) |
|
| 274 | + ->setInlineDataCallback( |
|
| 275 | + static function () { |
|
| 276 | + wp_localize_script( |
|
| 277 | + CoreAssetManager::JS_HANDLE_CORE, |
|
| 278 | + CoreAssetManager::JS_HANDLE_I18N, |
|
| 279 | + EE_Registry::$i18n_js_strings |
|
| 280 | + ); |
|
| 281 | + } |
|
| 282 | + ); |
|
| 283 | + } |
|
| 284 | + |
|
| 285 | + |
|
| 286 | + /** |
|
| 287 | + * Registers vendor files that are bundled with a later version WP but might not be for the current version of |
|
| 288 | + * WordPress in the running environment. |
|
| 289 | + * |
|
| 290 | + * @throws DuplicateCollectionIdentifierException |
|
| 291 | + * @throws InvalidDataTypeException |
|
| 292 | + * @throws InvalidEntityException |
|
| 293 | + * @throws DomainException |
|
| 294 | + * @since 4.9.71.p |
|
| 295 | + */ |
|
| 296 | + private function registerWpAssets() |
|
| 297 | + { |
|
| 298 | + global $wp_version; |
|
| 299 | + if (version_compare($wp_version, '5.0.beta', '>=')) { |
|
| 300 | + return; |
|
| 301 | + } |
|
| 302 | + $this->addVendorJavascript(CoreAssetManager::JS_HANDLE_REACT, [], true, '16.6.0'); |
|
| 303 | + $this->addVendorJavascript( |
|
| 304 | + CoreAssetManager::JS_HANDLE_REACT_DOM, |
|
| 305 | + array(CoreAssetManager::JS_HANDLE_REACT), |
|
| 306 | + true, |
|
| 307 | + '16.6.0' |
|
| 308 | + ); |
|
| 309 | + $this->addVendorJavascript(CoreAssetManager::JS_HANDLE_LODASH, [], true, '4.17.11') |
|
| 310 | + ->setInlineDataCallback( |
|
| 311 | + static function() { |
|
| 312 | + wp_add_inline_script( |
|
| 313 | + CoreAssetManager::JS_HANDLE_LODASH, |
|
| 314 | + 'window.lodash = _.noConflict();' |
|
| 315 | + ); |
|
| 316 | + } |
|
| 317 | + ); |
|
| 318 | + } |
|
| 319 | + |
|
| 320 | + |
|
| 321 | + /** |
|
| 322 | + * Returns configuration data for the accounting-js library. |
|
| 323 | + * @since 4.9.71.p |
|
| 324 | + * @return array |
|
| 325 | + */ |
|
| 326 | + private function getAccountingSettings() { |
|
| 327 | + return array( |
|
| 328 | + 'currency' => array( |
|
| 329 | + 'symbol' => $this->currency_config->sign, |
|
| 330 | + 'format' => array( |
|
| 331 | + 'pos' => $this->currency_config->sign_b4 ? '%s%v' : '%v%s', |
|
| 332 | + 'neg' => $this->currency_config->sign_b4 ? '- %s%v' : '- %v%s', |
|
| 333 | + 'zero' => $this->currency_config->sign_b4 ? '%s--' : '--%s', |
|
| 334 | + ), |
|
| 335 | + 'decimal' => $this->currency_config->dec_mrk, |
|
| 336 | + 'thousand' => $this->currency_config->thsnds, |
|
| 337 | + 'precision' => $this->currency_config->dec_plc, |
|
| 338 | + ), |
|
| 339 | + 'number' => array( |
|
| 340 | + 'precision' => $this->currency_config->dec_plc, |
|
| 341 | + 'thousand' => $this->currency_config->thsnds, |
|
| 342 | + 'decimal' => $this->currency_config->dec_mrk, |
|
| 343 | + ), |
|
| 344 | + ); |
|
| 345 | + } |
|
| 346 | + |
|
| 347 | + |
|
| 348 | + /** |
|
| 349 | + * Returns configuration data for the js Currency VO. |
|
| 350 | + * @since 4.9.71.p |
|
| 351 | + * @return array |
|
| 352 | + */ |
|
| 353 | + private function getCurrencySettings() |
|
| 354 | + { |
|
| 355 | + return array( |
|
| 356 | + 'code' => $this->currency_config->code, |
|
| 357 | + 'singularLabel' => $this->currency_config->name, |
|
| 358 | + 'pluralLabel' => $this->currency_config->plural, |
|
| 359 | + 'sign' => $this->currency_config->sign, |
|
| 360 | + 'signB4' => $this->currency_config->sign_b4, |
|
| 361 | + 'decimalPlaces' => $this->currency_config->dec_plc, |
|
| 362 | + 'decimalMark' => $this->currency_config->dec_mrk, |
|
| 363 | + 'thousandsSeparator' => $this->currency_config->thsnds, |
|
| 364 | + ); |
|
| 365 | + } |
|
| 366 | + |
|
| 367 | + |
|
| 368 | + /** |
|
| 369 | + * @throws DuplicateCollectionIdentifierException |
|
| 370 | + * @throws InvalidDataTypeException |
|
| 371 | + * @throws InvalidEntityException |
|
| 372 | + * @throws DomainException |
|
| 373 | + * @since 4.9.62.p |
|
| 374 | + */ |
|
| 375 | + private function loadCoreCss() |
|
| 376 | + { |
|
| 377 | + if ($this->template_config->enable_default_style && ! is_admin()) { |
|
| 378 | + $this->addStylesheet( |
|
| 379 | + CoreAssetManager::CSS_HANDLE_DEFAULT, |
|
| 380 | + is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css') |
|
| 381 | + ? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css' |
|
| 382 | + : EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css', |
|
| 383 | + array('dashicons') |
|
| 384 | + ); |
|
| 385 | + //Load custom style sheet if available |
|
| 386 | + if ($this->template_config->custom_style_sheet !== null) { |
|
| 387 | + $this->addStylesheet( |
|
| 388 | + CoreAssetManager::CSS_HANDLE_CUSTOM, |
|
| 389 | + EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet, |
|
| 390 | + array(CoreAssetManager::CSS_HANDLE_DEFAULT) |
|
| 391 | + ); |
|
| 392 | + } |
|
| 393 | + } |
|
| 394 | + $this->addCss(self::CSS_HANDLE_CORE_CSS_DEFAULT, ['dashicons']); |
|
| 395 | + $this->addCss(self::CSS_HANDLE_COMPONENTS, [self::CSS_HANDLE_CORE_CSS_DEFAULT]); |
|
| 396 | + $this->addCss(self::CSS_HANDLE_HOCS); |
|
| 397 | + } |
|
| 398 | + |
|
| 399 | + |
|
| 400 | + /** |
|
| 401 | + * jQuery Validate for form validation |
|
| 402 | + * |
|
| 403 | + * @since 4.9.62.p |
|
| 404 | + * @throws DomainException |
|
| 405 | + * @throws DuplicateCollectionIdentifierException |
|
| 406 | + * @throws InvalidDataTypeException |
|
| 407 | + * @throws InvalidEntityException |
|
| 408 | + */ |
|
| 409 | + private function loadJqueryValidate() |
|
| 410 | + { |
|
| 411 | + $this->addJavascript( |
|
| 412 | + CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE, |
|
| 413 | + EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js', |
|
| 414 | + array(CoreAssetManager::JS_HANDLE_JQUERY), |
|
| 415 | + true, |
|
| 416 | + '1.15.0' |
|
| 417 | + ); |
|
| 418 | + |
|
| 419 | + $this->addJavascript( |
|
| 420 | + CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA, |
|
| 421 | + EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js', |
|
| 422 | + array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE), |
|
| 423 | + true, |
|
| 424 | + '1.15.0' |
|
| 425 | + ); |
|
| 426 | + } |
|
| 427 | + |
|
| 428 | + |
|
| 429 | + /** |
|
| 430 | + * accounting.js for performing client-side calculations |
|
| 431 | + * |
|
| 432 | + * @since 4.9.62.p |
|
| 433 | + * @throws DomainException |
|
| 434 | + * @throws DuplicateCollectionIdentifierException |
|
| 435 | + * @throws InvalidDataTypeException |
|
| 436 | + * @throws InvalidEntityException |
|
| 437 | + */ |
|
| 438 | + private function loadAccountingJs() |
|
| 439 | + { |
|
| 440 | + //accounting.js library |
|
| 441 | + // @link http://josscrowcroft.github.io/accounting.js/ |
|
| 442 | + $this->addJavascript( |
|
| 443 | + CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE, |
|
| 444 | + EE_THIRD_PARTY_URL . 'accounting/accounting.js', |
|
| 445 | + array(CoreAssetManager::JS_HANDLE_UNDERSCORE), |
|
| 446 | + true, |
|
| 447 | + '0.3.2' |
|
| 448 | + ); |
|
| 449 | + |
|
| 450 | + $this->addJavascript( |
|
| 451 | + CoreAssetManager::JS_HANDLE_ACCOUNTING, |
|
| 452 | + EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js', |
|
| 453 | + array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE) |
|
| 454 | + ) |
|
| 455 | + ->setInlineDataCallback( |
|
| 456 | + function () { |
|
| 457 | + wp_localize_script( |
|
| 458 | + CoreAssetManager::JS_HANDLE_ACCOUNTING, |
|
| 459 | + 'EE_ACCOUNTING_CFG', |
|
| 460 | + $this->getAccountingSettings() |
|
| 461 | + ); |
|
| 462 | + } |
|
| 463 | + ); |
|
| 464 | + } |
|
| 465 | + |
|
| 466 | + |
|
| 467 | + /** |
|
| 468 | + * registers assets for cleaning your ears |
|
| 469 | + * |
|
| 470 | + * @param JavascriptAsset $script |
|
| 471 | + */ |
|
| 472 | + public function loadQtipJs(JavascriptAsset $script) |
|
| 473 | + { |
|
| 474 | + // qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook, |
|
| 475 | + // can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' ); |
|
| 476 | + if ( |
|
| 477 | + $script->handle() === CoreAssetManager::JS_HANDLE_WP_PLUGINS_PAGE |
|
| 478 | + && apply_filters('FHEE_load_qtip', false) |
|
| 479 | + ) { |
|
| 480 | + EEH_Qtip_Loader::instance()->register_and_enqueue(); |
|
| 481 | + } |
|
| 482 | + } |
|
| 483 | + |
|
| 484 | + |
|
| 485 | + /** |
|
| 486 | + * assets that are used in the WordPress admin |
|
| 487 | + * |
|
| 488 | + * @throws DuplicateCollectionIdentifierException |
|
| 489 | + * @throws InvalidDataTypeException |
|
| 490 | + * @throws InvalidEntityException |
|
| 491 | + * @throws DomainException |
|
| 492 | + * @since 4.9.62.p |
|
| 493 | + */ |
|
| 494 | + private function registerAdminAssets() |
|
| 495 | + { |
|
| 496 | + $this->addJs(self::JS_HANDLE_WP_PLUGINS_PAGE)->setRequiresTranslation(); |
|
| 497 | + // note usage of the "JS_HANDLE.." constant is intentional here because css uses the same handle. |
|
| 498 | + $this->addCss(self::JS_HANDLE_WP_PLUGINS_PAGE); |
|
| 499 | + } |
|
| 500 | 500 | } |
@@ -35,243 +35,243 @@ |
||
| 35 | 35 | class AdvancedEditorEntityData |
| 36 | 36 | { |
| 37 | 37 | |
| 38 | - /** |
|
| 39 | - * @var RestApiSpoofer |
|
| 40 | - */ |
|
| 41 | - protected $spoofer; |
|
| 38 | + /** |
|
| 39 | + * @var RestApiSpoofer |
|
| 40 | + */ |
|
| 41 | + protected $spoofer; |
|
| 42 | 42 | |
| 43 | - /** |
|
| 44 | - * @var EE_Admin_Config |
|
| 45 | - */ |
|
| 46 | - protected $admin_config; |
|
| 43 | + /** |
|
| 44 | + * @var EE_Admin_Config |
|
| 45 | + */ |
|
| 46 | + protected $admin_config; |
|
| 47 | 47 | |
| 48 | - /** |
|
| 49 | - * @var EEM_Datetime $datetime_model |
|
| 50 | - */ |
|
| 51 | - protected $datetime_model; |
|
| 48 | + /** |
|
| 49 | + * @var EEM_Datetime $datetime_model |
|
| 50 | + */ |
|
| 51 | + protected $datetime_model; |
|
| 52 | 52 | |
| 53 | - /** |
|
| 54 | - * @var EEM_Event $event_model |
|
| 55 | - */ |
|
| 56 | - protected $event_model; |
|
| 53 | + /** |
|
| 54 | + * @var EEM_Event $event_model |
|
| 55 | + */ |
|
| 56 | + protected $event_model; |
|
| 57 | 57 | |
| 58 | - /** |
|
| 59 | - * @var EEM_Price $price_model |
|
| 60 | - */ |
|
| 61 | - protected $price_model; |
|
| 58 | + /** |
|
| 59 | + * @var EEM_Price $price_model |
|
| 60 | + */ |
|
| 61 | + protected $price_model; |
|
| 62 | 62 | |
| 63 | - /** |
|
| 64 | - * @var EEM_Price_Type $price_type_model |
|
| 65 | - */ |
|
| 66 | - protected $price_type_model; |
|
| 63 | + /** |
|
| 64 | + * @var EEM_Price_Type $price_type_model |
|
| 65 | + */ |
|
| 66 | + protected $price_type_model; |
|
| 67 | 67 | |
| 68 | - /** |
|
| 69 | - * @var EEM_Ticket $ticket_model |
|
| 70 | - */ |
|
| 71 | - protected $ticket_model; |
|
| 72 | - /** |
|
| 73 | - * @var EEM_Venue $venue_model |
|
| 74 | - */ |
|
| 75 | - protected $venue_model; |
|
| 68 | + /** |
|
| 69 | + * @var EEM_Ticket $ticket_model |
|
| 70 | + */ |
|
| 71 | + protected $ticket_model; |
|
| 72 | + /** |
|
| 73 | + * @var EEM_Venue $venue_model |
|
| 74 | + */ |
|
| 75 | + protected $venue_model; |
|
| 76 | 76 | |
| 77 | 77 | |
| 78 | - /** |
|
| 79 | - * AdvancedEditorAdminForm constructor. |
|
| 80 | - * |
|
| 81 | - * @param RestApiSpoofer $spoofer |
|
| 82 | - * @param EE_Admin_Config $admin_config |
|
| 83 | - * @param EEM_Datetime $datetime_model |
|
| 84 | - * @param EEM_Event $event_model |
|
| 85 | - * @param EEM_Price $price_model |
|
| 86 | - * @param EEM_Price_Type $price_type_model |
|
| 87 | - * @param EEM_Ticket $ticket_model |
|
| 88 | - * @param EEM_Venue $venue_model |
|
| 89 | - */ |
|
| 90 | - public function __construct( |
|
| 91 | - RestApiSpoofer $spoofer, |
|
| 92 | - EE_Admin_Config $admin_config, |
|
| 93 | - EEM_Datetime $datetime_model, |
|
| 94 | - EEM_Event $event_model, |
|
| 95 | - EEM_Price $price_model, |
|
| 96 | - EEM_Price_Type $price_type_model, |
|
| 97 | - EEM_Ticket $ticket_model, |
|
| 98 | - EEM_Venue $venue_model |
|
| 99 | - ) { |
|
| 100 | - $this->admin_config = $admin_config; |
|
| 101 | - $this->spoofer = $spoofer; |
|
| 102 | - $this->datetime_model = $datetime_model; |
|
| 103 | - $this->event_model = $event_model; |
|
| 104 | - $this->price_model = $price_model; |
|
| 105 | - $this->price_type_model = $price_type_model; |
|
| 106 | - $this->ticket_model = $ticket_model; |
|
| 107 | - $this->venue_model = $venue_model; |
|
| 108 | - add_action('admin_enqueue_scripts', [$this, 'loadScriptsStyles']); |
|
| 109 | - } |
|
| 78 | + /** |
|
| 79 | + * AdvancedEditorAdminForm constructor. |
|
| 80 | + * |
|
| 81 | + * @param RestApiSpoofer $spoofer |
|
| 82 | + * @param EE_Admin_Config $admin_config |
|
| 83 | + * @param EEM_Datetime $datetime_model |
|
| 84 | + * @param EEM_Event $event_model |
|
| 85 | + * @param EEM_Price $price_model |
|
| 86 | + * @param EEM_Price_Type $price_type_model |
|
| 87 | + * @param EEM_Ticket $ticket_model |
|
| 88 | + * @param EEM_Venue $venue_model |
|
| 89 | + */ |
|
| 90 | + public function __construct( |
|
| 91 | + RestApiSpoofer $spoofer, |
|
| 92 | + EE_Admin_Config $admin_config, |
|
| 93 | + EEM_Datetime $datetime_model, |
|
| 94 | + EEM_Event $event_model, |
|
| 95 | + EEM_Price $price_model, |
|
| 96 | + EEM_Price_Type $price_type_model, |
|
| 97 | + EEM_Ticket $ticket_model, |
|
| 98 | + EEM_Venue $venue_model |
|
| 99 | + ) { |
|
| 100 | + $this->admin_config = $admin_config; |
|
| 101 | + $this->spoofer = $spoofer; |
|
| 102 | + $this->datetime_model = $datetime_model; |
|
| 103 | + $this->event_model = $event_model; |
|
| 104 | + $this->price_model = $price_model; |
|
| 105 | + $this->price_type_model = $price_type_model; |
|
| 106 | + $this->ticket_model = $ticket_model; |
|
| 107 | + $this->venue_model = $venue_model; |
|
| 108 | + add_action('admin_enqueue_scripts', [$this, 'loadScriptsStyles']); |
|
| 109 | + } |
|
| 110 | 110 | |
| 111 | 111 | |
| 112 | - /** |
|
| 113 | - * @throws EE_Error |
|
| 114 | - * @throws InvalidArgumentException |
|
| 115 | - * @throws InvalidDataTypeException |
|
| 116 | - * @throws InvalidInterfaceException |
|
| 117 | - * @throws ModelConfigurationException |
|
| 118 | - * @throws ReflectionException |
|
| 119 | - * @throws RestException |
|
| 120 | - * @throws RestPasswordIncorrectException |
|
| 121 | - * @throws RestPasswordRequiredException |
|
| 122 | - * @throws UnexpectedEntityException |
|
| 123 | - * @throws DomainException |
|
| 124 | - * @since $VID:$ |
|
| 125 | - */ |
|
| 126 | - public function loadScriptsStyles() |
|
| 127 | - { |
|
| 128 | - if ($this->admin_config->useAdvancedEditor()) { |
|
| 129 | - global $post; |
|
| 130 | - $eventId = isset($_REQUEST['post']) ? absint($_REQUEST['post']) : 0; |
|
| 131 | - $eventId = $eventId === 0 && $post instanceof WP_Post ? $post->ID : $eventId; |
|
| 132 | - if ($eventId) { |
|
| 133 | - $data = $this->getAllEventData($eventId); |
|
| 134 | - $data = wp_json_encode($data); |
|
| 135 | - add_action( |
|
| 136 | - 'admin_footer', |
|
| 137 | - static function () use ($data) { |
|
| 138 | - wp_add_inline_script( |
|
| 139 | - EspressoEditorAssetManager::JS_HANDLE_EDITOR, |
|
| 140 | - "var eeEditorEventData={$data};", |
|
| 141 | - 'before' |
|
| 142 | - ); |
|
| 143 | - } |
|
| 144 | - ); |
|
| 145 | - } |
|
| 146 | - } |
|
| 147 | - } |
|
| 112 | + /** |
|
| 113 | + * @throws EE_Error |
|
| 114 | + * @throws InvalidArgumentException |
|
| 115 | + * @throws InvalidDataTypeException |
|
| 116 | + * @throws InvalidInterfaceException |
|
| 117 | + * @throws ModelConfigurationException |
|
| 118 | + * @throws ReflectionException |
|
| 119 | + * @throws RestException |
|
| 120 | + * @throws RestPasswordIncorrectException |
|
| 121 | + * @throws RestPasswordRequiredException |
|
| 122 | + * @throws UnexpectedEntityException |
|
| 123 | + * @throws DomainException |
|
| 124 | + * @since $VID:$ |
|
| 125 | + */ |
|
| 126 | + public function loadScriptsStyles() |
|
| 127 | + { |
|
| 128 | + if ($this->admin_config->useAdvancedEditor()) { |
|
| 129 | + global $post; |
|
| 130 | + $eventId = isset($_REQUEST['post']) ? absint($_REQUEST['post']) : 0; |
|
| 131 | + $eventId = $eventId === 0 && $post instanceof WP_Post ? $post->ID : $eventId; |
|
| 132 | + if ($eventId) { |
|
| 133 | + $data = $this->getAllEventData($eventId); |
|
| 134 | + $data = wp_json_encode($data); |
|
| 135 | + add_action( |
|
| 136 | + 'admin_footer', |
|
| 137 | + static function () use ($data) { |
|
| 138 | + wp_add_inline_script( |
|
| 139 | + EspressoEditorAssetManager::JS_HANDLE_EDITOR, |
|
| 140 | + "var eeEditorEventData={$data};", |
|
| 141 | + 'before' |
|
| 142 | + ); |
|
| 143 | + } |
|
| 144 | + ); |
|
| 145 | + } |
|
| 146 | + } |
|
| 147 | + } |
|
| 148 | 148 | |
| 149 | 149 | |
| 150 | - /** |
|
| 151 | - * @param int $eventId |
|
| 152 | - * @return array |
|
| 153 | - * @throws EE_Error |
|
| 154 | - * @throws InvalidDataTypeException |
|
| 155 | - * @throws InvalidInterfaceException |
|
| 156 | - * @throws ModelConfigurationException |
|
| 157 | - * @throws RestPasswordIncorrectException |
|
| 158 | - * @throws RestPasswordRequiredException |
|
| 159 | - * @throws UnexpectedEntityException |
|
| 160 | - * @throws RestException |
|
| 161 | - * @throws InvalidArgumentException |
|
| 162 | - * @throws ReflectionException |
|
| 163 | - * @throws DomainException |
|
| 164 | - * @since $VID:$ |
|
| 165 | - */ |
|
| 166 | - protected function getAllEventData($eventId) |
|
| 167 | - { |
|
| 168 | - // these should ultimately be extracted out into their own classes (one per model) |
|
| 169 | - $event = $this->spoofer->getOneApiResult( |
|
| 170 | - $this->event_model, |
|
| 171 | - [['EVT_ID' => $eventId]] |
|
| 172 | - ); |
|
| 173 | - if (! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) { |
|
| 174 | - return []; |
|
| 175 | - } |
|
| 176 | - $event = [$eventId => $event]; |
|
| 177 | - $relations = [ |
|
| 178 | - 'event' => [ $eventId => [] ], |
|
| 179 | - 'datetime' => [], |
|
| 180 | - 'ticket' => [], |
|
| 181 | - 'price' => [], |
|
| 182 | - ]; |
|
| 183 | - $eventDates = $this->spoofer->getApiResults( |
|
| 184 | - $this->datetime_model, |
|
| 185 | - [[ |
|
| 186 | - 'EVT_ID' => $eventId, |
|
| 187 | - 'DTT_deleted' => ['IN', [true, false]] |
|
| 188 | - ]] |
|
| 189 | - ); |
|
| 190 | - $relations['event'][ $eventId ]['datetime'] = []; |
|
| 150 | + /** |
|
| 151 | + * @param int $eventId |
|
| 152 | + * @return array |
|
| 153 | + * @throws EE_Error |
|
| 154 | + * @throws InvalidDataTypeException |
|
| 155 | + * @throws InvalidInterfaceException |
|
| 156 | + * @throws ModelConfigurationException |
|
| 157 | + * @throws RestPasswordIncorrectException |
|
| 158 | + * @throws RestPasswordRequiredException |
|
| 159 | + * @throws UnexpectedEntityException |
|
| 160 | + * @throws RestException |
|
| 161 | + * @throws InvalidArgumentException |
|
| 162 | + * @throws ReflectionException |
|
| 163 | + * @throws DomainException |
|
| 164 | + * @since $VID:$ |
|
| 165 | + */ |
|
| 166 | + protected function getAllEventData($eventId) |
|
| 167 | + { |
|
| 168 | + // these should ultimately be extracted out into their own classes (one per model) |
|
| 169 | + $event = $this->spoofer->getOneApiResult( |
|
| 170 | + $this->event_model, |
|
| 171 | + [['EVT_ID' => $eventId]] |
|
| 172 | + ); |
|
| 173 | + if (! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) { |
|
| 174 | + return []; |
|
| 175 | + } |
|
| 176 | + $event = [$eventId => $event]; |
|
| 177 | + $relations = [ |
|
| 178 | + 'event' => [ $eventId => [] ], |
|
| 179 | + 'datetime' => [], |
|
| 180 | + 'ticket' => [], |
|
| 181 | + 'price' => [], |
|
| 182 | + ]; |
|
| 183 | + $eventDates = $this->spoofer->getApiResults( |
|
| 184 | + $this->datetime_model, |
|
| 185 | + [[ |
|
| 186 | + 'EVT_ID' => $eventId, |
|
| 187 | + 'DTT_deleted' => ['IN', [true, false]] |
|
| 188 | + ]] |
|
| 189 | + ); |
|
| 190 | + $relations['event'][ $eventId ]['datetime'] = []; |
|
| 191 | 191 | |
| 192 | - $datetimes = []; |
|
| 193 | - $eventDateTickets = []; |
|
| 194 | - if (is_array($eventDates)){ |
|
| 195 | - foreach ($eventDates as $eventDate) { |
|
| 196 | - if (isset($eventDate['DTT_ID']) && $eventDate['DTT_ID']) { |
|
| 197 | - $DTT_ID = $eventDate['DTT_ID']; |
|
| 198 | - $datetimes[ $DTT_ID ] = $eventDate; |
|
| 199 | - $relations['event'][ $eventId ]['datetime'][] = $DTT_ID; |
|
| 200 | - $eventDateTickets[ $DTT_ID ] = $this->spoofer->getApiResults( |
|
| 201 | - $this->ticket_model, |
|
| 202 | - [[ |
|
| 203 | - 'Datetime.DTT_ID' => $DTT_ID, |
|
| 204 | - 'TKT_deleted' => ['IN', [true, false]] |
|
| 205 | - ]] |
|
| 206 | - ); |
|
| 207 | - } |
|
| 208 | - } |
|
| 209 | - } |
|
| 192 | + $datetimes = []; |
|
| 193 | + $eventDateTickets = []; |
|
| 194 | + if (is_array($eventDates)){ |
|
| 195 | + foreach ($eventDates as $eventDate) { |
|
| 196 | + if (isset($eventDate['DTT_ID']) && $eventDate['DTT_ID']) { |
|
| 197 | + $DTT_ID = $eventDate['DTT_ID']; |
|
| 198 | + $datetimes[ $DTT_ID ] = $eventDate; |
|
| 199 | + $relations['event'][ $eventId ]['datetime'][] = $DTT_ID; |
|
| 200 | + $eventDateTickets[ $DTT_ID ] = $this->spoofer->getApiResults( |
|
| 201 | + $this->ticket_model, |
|
| 202 | + [[ |
|
| 203 | + 'Datetime.DTT_ID' => $DTT_ID, |
|
| 204 | + 'TKT_deleted' => ['IN', [true, false]] |
|
| 205 | + ]] |
|
| 206 | + ); |
|
| 207 | + } |
|
| 208 | + } |
|
| 209 | + } |
|
| 210 | 210 | |
| 211 | - $prices = []; |
|
| 212 | - $tickets = []; |
|
| 213 | - if (is_array($eventDateTickets)) { |
|
| 214 | - foreach ($eventDateTickets as $DTT_ID => $dateTickets) { |
|
| 215 | - if (is_array($dateTickets)) { |
|
| 216 | - $relations['datetime'][ $DTT_ID ]['ticket'] = []; |
|
| 217 | - foreach ($dateTickets as $ticket) { |
|
| 218 | - if (isset($ticket['TKT_ID']) && $ticket['TKT_ID']) { |
|
| 219 | - $TKT_ID = $ticket['TKT_ID']; |
|
| 220 | - $tickets[ $TKT_ID ] = $ticket; |
|
| 221 | - $relations['datetime'][ $DTT_ID ]['ticket'][] = $TKT_ID; |
|
| 222 | - $ticketPrices[ $TKT_ID ] = $this->spoofer->getApiResults( |
|
| 223 | - $this->price_model, |
|
| 224 | - [['Ticket.TKT_ID' => $TKT_ID]] |
|
| 225 | - ); |
|
| 226 | - if (is_array($ticketPrices[ $TKT_ID ])) { |
|
| 227 | - $relations['ticket'][ $TKT_ID ]['price'] = []; |
|
| 228 | - foreach ($ticketPrices[ $TKT_ID ] as $ticketPrice) { |
|
| 229 | - $PRC_ID = $ticketPrice['PRC_ID']; |
|
| 230 | - $prices[ $PRC_ID ] = $ticketPrice; |
|
| 231 | - $relations['ticket'][ $TKT_ID ]['price'][] = $PRC_ID; |
|
| 232 | - } |
|
| 233 | - } |
|
| 234 | - } |
|
| 235 | - } |
|
| 236 | - } |
|
| 237 | - } |
|
| 238 | - } |
|
| 239 | - $price_type_results = $this->spoofer->getApiResults( |
|
| 240 | - $this->price_type_model, |
|
| 241 | - [['PRT_deleted' => false]] |
|
| 242 | - ); |
|
| 243 | - $price_types = []; |
|
| 244 | - foreach ($price_type_results as $price_type) { |
|
| 245 | - $price_types[ $price_type['PRT_ID'] ] = $price_type; |
|
| 246 | - } |
|
| 247 | - $venue = $this->spoofer->getOneApiResult( |
|
| 248 | - $this->venue_model, |
|
| 249 | - [['Event.EVT_ID' => $eventId]] |
|
| 250 | - ); |
|
| 251 | - if (is_array($venue) && isset($venue['VNU_ID'])) { |
|
| 252 | - $relations['event'][ $eventId ]['venue'] = [ $venue['VNU_ID'] ]; |
|
| 253 | - $venue = [$venue['VNU_ID'] => $venue]; |
|
| 254 | - } |
|
| 211 | + $prices = []; |
|
| 212 | + $tickets = []; |
|
| 213 | + if (is_array($eventDateTickets)) { |
|
| 214 | + foreach ($eventDateTickets as $DTT_ID => $dateTickets) { |
|
| 215 | + if (is_array($dateTickets)) { |
|
| 216 | + $relations['datetime'][ $DTT_ID ]['ticket'] = []; |
|
| 217 | + foreach ($dateTickets as $ticket) { |
|
| 218 | + if (isset($ticket['TKT_ID']) && $ticket['TKT_ID']) { |
|
| 219 | + $TKT_ID = $ticket['TKT_ID']; |
|
| 220 | + $tickets[ $TKT_ID ] = $ticket; |
|
| 221 | + $relations['datetime'][ $DTT_ID ]['ticket'][] = $TKT_ID; |
|
| 222 | + $ticketPrices[ $TKT_ID ] = $this->spoofer->getApiResults( |
|
| 223 | + $this->price_model, |
|
| 224 | + [['Ticket.TKT_ID' => $TKT_ID]] |
|
| 225 | + ); |
|
| 226 | + if (is_array($ticketPrices[ $TKT_ID ])) { |
|
| 227 | + $relations['ticket'][ $TKT_ID ]['price'] = []; |
|
| 228 | + foreach ($ticketPrices[ $TKT_ID ] as $ticketPrice) { |
|
| 229 | + $PRC_ID = $ticketPrice['PRC_ID']; |
|
| 230 | + $prices[ $PRC_ID ] = $ticketPrice; |
|
| 231 | + $relations['ticket'][ $TKT_ID ]['price'][] = $PRC_ID; |
|
| 232 | + } |
|
| 233 | + } |
|
| 234 | + } |
|
| 235 | + } |
|
| 236 | + } |
|
| 237 | + } |
|
| 238 | + } |
|
| 239 | + $price_type_results = $this->spoofer->getApiResults( |
|
| 240 | + $this->price_type_model, |
|
| 241 | + [['PRT_deleted' => false]] |
|
| 242 | + ); |
|
| 243 | + $price_types = []; |
|
| 244 | + foreach ($price_type_results as $price_type) { |
|
| 245 | + $price_types[ $price_type['PRT_ID'] ] = $price_type; |
|
| 246 | + } |
|
| 247 | + $venue = $this->spoofer->getOneApiResult( |
|
| 248 | + $this->venue_model, |
|
| 249 | + [['Event.EVT_ID' => $eventId]] |
|
| 250 | + ); |
|
| 251 | + if (is_array($venue) && isset($venue['VNU_ID'])) { |
|
| 252 | + $relations['event'][ $eventId ]['venue'] = [ $venue['VNU_ID'] ]; |
|
| 253 | + $venue = [$venue['VNU_ID'] => $venue]; |
|
| 254 | + } |
|
| 255 | 255 | |
| 256 | - $schemas = [ |
|
| 257 | - 'event' => $this->spoofer->getModelSchema('events'), |
|
| 258 | - 'datetime' => $this->spoofer->getModelSchema('datetimes'), |
|
| 259 | - 'ticket' => $this->spoofer->getModelSchema('tickets'), |
|
| 260 | - 'price' => $this->spoofer->getModelSchema('prices'), |
|
| 261 | - 'price_type' => $this->spoofer->getModelSchema('price_types'), |
|
| 262 | - 'venue' => $this->spoofer->getModelSchema('venues'), |
|
| 263 | - ]; |
|
| 256 | + $schemas = [ |
|
| 257 | + 'event' => $this->spoofer->getModelSchema('events'), |
|
| 258 | + 'datetime' => $this->spoofer->getModelSchema('datetimes'), |
|
| 259 | + 'ticket' => $this->spoofer->getModelSchema('tickets'), |
|
| 260 | + 'price' => $this->spoofer->getModelSchema('prices'), |
|
| 261 | + 'price_type' => $this->spoofer->getModelSchema('price_types'), |
|
| 262 | + 'venue' => $this->spoofer->getModelSchema('venues'), |
|
| 263 | + ]; |
|
| 264 | 264 | |
| 265 | - return [ |
|
| 266 | - 'eventId' => $eventId, |
|
| 267 | - 'event' => $event, |
|
| 268 | - 'datetime' => $datetimes, |
|
| 269 | - 'ticket' => $tickets, |
|
| 270 | - 'price' => $prices, |
|
| 271 | - 'price_type' => $price_types, |
|
| 272 | - 'venue' => $venue, |
|
| 273 | - 'schemas' => $schemas, |
|
| 274 | - 'relations' => $relations, |
|
| 275 | - ]; |
|
| 276 | - } |
|
| 265 | + return [ |
|
| 266 | + 'eventId' => $eventId, |
|
| 267 | + 'event' => $event, |
|
| 268 | + 'datetime' => $datetimes, |
|
| 269 | + 'ticket' => $tickets, |
|
| 270 | + 'price' => $prices, |
|
| 271 | + 'price_type' => $price_types, |
|
| 272 | + 'venue' => $venue, |
|
| 273 | + 'schemas' => $schemas, |
|
| 274 | + 'relations' => $relations, |
|
| 275 | + ]; |
|
| 276 | + } |
|
| 277 | 277 | } |
@@ -134,7 +134,7 @@ discard block |
||
| 134 | 134 | $data = wp_json_encode($data); |
| 135 | 135 | add_action( |
| 136 | 136 | 'admin_footer', |
| 137 | - static function () use ($data) { |
|
| 137 | + static function() use ($data) { |
|
| 138 | 138 | wp_add_inline_script( |
| 139 | 139 | EspressoEditorAssetManager::JS_HANDLE_EDITOR, |
| 140 | 140 | "var eeEditorEventData={$data};", |
@@ -170,12 +170,12 @@ discard block |
||
| 170 | 170 | $this->event_model, |
| 171 | 171 | [['EVT_ID' => $eventId]] |
| 172 | 172 | ); |
| 173 | - if (! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) { |
|
| 173 | + if ( ! (is_array($event) && isset($event['EVT_ID']) && $event['EVT_ID'] === $eventId)) { |
|
| 174 | 174 | return []; |
| 175 | 175 | } |
| 176 | 176 | $event = [$eventId => $event]; |
| 177 | 177 | $relations = [ |
| 178 | - 'event' => [ $eventId => [] ], |
|
| 178 | + 'event' => [$eventId => []], |
|
| 179 | 179 | 'datetime' => [], |
| 180 | 180 | 'ticket' => [], |
| 181 | 181 | 'price' => [], |
@@ -187,17 +187,17 @@ discard block |
||
| 187 | 187 | 'DTT_deleted' => ['IN', [true, false]] |
| 188 | 188 | ]] |
| 189 | 189 | ); |
| 190 | - $relations['event'][ $eventId ]['datetime'] = []; |
|
| 190 | + $relations['event'][$eventId]['datetime'] = []; |
|
| 191 | 191 | |
| 192 | 192 | $datetimes = []; |
| 193 | 193 | $eventDateTickets = []; |
| 194 | - if (is_array($eventDates)){ |
|
| 194 | + if (is_array($eventDates)) { |
|
| 195 | 195 | foreach ($eventDates as $eventDate) { |
| 196 | 196 | if (isset($eventDate['DTT_ID']) && $eventDate['DTT_ID']) { |
| 197 | 197 | $DTT_ID = $eventDate['DTT_ID']; |
| 198 | - $datetimes[ $DTT_ID ] = $eventDate; |
|
| 199 | - $relations['event'][ $eventId ]['datetime'][] = $DTT_ID; |
|
| 200 | - $eventDateTickets[ $DTT_ID ] = $this->spoofer->getApiResults( |
|
| 198 | + $datetimes[$DTT_ID] = $eventDate; |
|
| 199 | + $relations['event'][$eventId]['datetime'][] = $DTT_ID; |
|
| 200 | + $eventDateTickets[$DTT_ID] = $this->spoofer->getApiResults( |
|
| 201 | 201 | $this->ticket_model, |
| 202 | 202 | [[ |
| 203 | 203 | 'Datetime.DTT_ID' => $DTT_ID, |
@@ -213,22 +213,22 @@ discard block |
||
| 213 | 213 | if (is_array($eventDateTickets)) { |
| 214 | 214 | foreach ($eventDateTickets as $DTT_ID => $dateTickets) { |
| 215 | 215 | if (is_array($dateTickets)) { |
| 216 | - $relations['datetime'][ $DTT_ID ]['ticket'] = []; |
|
| 216 | + $relations['datetime'][$DTT_ID]['ticket'] = []; |
|
| 217 | 217 | foreach ($dateTickets as $ticket) { |
| 218 | 218 | if (isset($ticket['TKT_ID']) && $ticket['TKT_ID']) { |
| 219 | 219 | $TKT_ID = $ticket['TKT_ID']; |
| 220 | - $tickets[ $TKT_ID ] = $ticket; |
|
| 221 | - $relations['datetime'][ $DTT_ID ]['ticket'][] = $TKT_ID; |
|
| 222 | - $ticketPrices[ $TKT_ID ] = $this->spoofer->getApiResults( |
|
| 220 | + $tickets[$TKT_ID] = $ticket; |
|
| 221 | + $relations['datetime'][$DTT_ID]['ticket'][] = $TKT_ID; |
|
| 222 | + $ticketPrices[$TKT_ID] = $this->spoofer->getApiResults( |
|
| 223 | 223 | $this->price_model, |
| 224 | 224 | [['Ticket.TKT_ID' => $TKT_ID]] |
| 225 | 225 | ); |
| 226 | - if (is_array($ticketPrices[ $TKT_ID ])) { |
|
| 227 | - $relations['ticket'][ $TKT_ID ]['price'] = []; |
|
| 228 | - foreach ($ticketPrices[ $TKT_ID ] as $ticketPrice) { |
|
| 226 | + if (is_array($ticketPrices[$TKT_ID])) { |
|
| 227 | + $relations['ticket'][$TKT_ID]['price'] = []; |
|
| 228 | + foreach ($ticketPrices[$TKT_ID] as $ticketPrice) { |
|
| 229 | 229 | $PRC_ID = $ticketPrice['PRC_ID']; |
| 230 | - $prices[ $PRC_ID ] = $ticketPrice; |
|
| 231 | - $relations['ticket'][ $TKT_ID ]['price'][] = $PRC_ID; |
|
| 230 | + $prices[$PRC_ID] = $ticketPrice; |
|
| 231 | + $relations['ticket'][$TKT_ID]['price'][] = $PRC_ID; |
|
| 232 | 232 | } |
| 233 | 233 | } |
| 234 | 234 | } |
@@ -242,14 +242,14 @@ discard block |
||
| 242 | 242 | ); |
| 243 | 243 | $price_types = []; |
| 244 | 244 | foreach ($price_type_results as $price_type) { |
| 245 | - $price_types[ $price_type['PRT_ID'] ] = $price_type; |
|
| 245 | + $price_types[$price_type['PRT_ID']] = $price_type; |
|
| 246 | 246 | } |
| 247 | 247 | $venue = $this->spoofer->getOneApiResult( |
| 248 | 248 | $this->venue_model, |
| 249 | 249 | [['Event.EVT_ID' => $eventId]] |
| 250 | 250 | ); |
| 251 | 251 | if (is_array($venue) && isset($venue['VNU_ID'])) { |
| 252 | - $relations['event'][ $eventId ]['venue'] = [ $venue['VNU_ID'] ]; |
|
| 252 | + $relations['event'][$eventId]['venue'] = [$venue['VNU_ID']]; |
|
| 253 | 253 | $venue = [$venue['VNU_ID'] => $venue]; |
| 254 | 254 | } |
| 255 | 255 | |
@@ -143,7 +143,7 @@ |
||
| 143 | 143 | */ |
| 144 | 144 | public function getApiResults(EEM_Base $model, array $query_params, $include = '') |
| 145 | 145 | { |
| 146 | - if (! array_key_exists('caps', $query_params)) { |
|
| 146 | + if ( ! array_key_exists('caps', $query_params)) { |
|
| 147 | 147 | $query_params['caps'] = EEM_Base::caps_read_admin; |
| 148 | 148 | } |
| 149 | 149 | /** @type array $results */ |
@@ -49,134 +49,134 @@ |
||
| 49 | 49 | class RestApiSpoofer |
| 50 | 50 | { |
| 51 | 51 | |
| 52 | - /** |
|
| 53 | - * @var WP_REST_Server $wp_rest_server |
|
| 54 | - */ |
|
| 55 | - protected $wp_rest_server; |
|
| 52 | + /** |
|
| 53 | + * @var WP_REST_Server $wp_rest_server |
|
| 54 | + */ |
|
| 55 | + protected $wp_rest_server; |
|
| 56 | 56 | |
| 57 | - /** |
|
| 58 | - * @var Read |
|
| 59 | - */ |
|
| 60 | - protected $rest_controller; |
|
| 57 | + /** |
|
| 58 | + * @var Read |
|
| 59 | + */ |
|
| 60 | + protected $rest_controller; |
|
| 61 | 61 | |
| 62 | - /** |
|
| 63 | - * @var EED_Core_Rest_Api $rest_module |
|
| 64 | - */ |
|
| 65 | - protected $rest_module; |
|
| 62 | + /** |
|
| 63 | + * @var EED_Core_Rest_Api $rest_module |
|
| 64 | + */ |
|
| 65 | + protected $rest_module; |
|
| 66 | 66 | |
| 67 | 67 | |
| 68 | - /** |
|
| 69 | - * RestApiSpoofer constructor. |
|
| 70 | - * |
|
| 71 | - * @param WP_REST_Server $wp_rest_server |
|
| 72 | - * @param EED_Core_Rest_Api $rest_module |
|
| 73 | - * @param Read $rest_api |
|
| 74 | - * @param string $api_version |
|
| 75 | - */ |
|
| 76 | - public function __construct( |
|
| 77 | - WP_REST_Server $wp_rest_server, |
|
| 78 | - EED_Core_Rest_Api $rest_module, |
|
| 79 | - Read $rest_api, |
|
| 80 | - $api_version = '4.8.36' |
|
| 81 | - ) { |
|
| 82 | - $this->wp_rest_server = $wp_rest_server; |
|
| 83 | - $this->rest_module = $rest_module; |
|
| 84 | - $this->rest_controller = $rest_api; |
|
| 85 | - $this->rest_controller->setRequestedVersion($api_version); |
|
| 86 | - $this->setUpRestServer(); |
|
| 87 | - } |
|
| 68 | + /** |
|
| 69 | + * RestApiSpoofer constructor. |
|
| 70 | + * |
|
| 71 | + * @param WP_REST_Server $wp_rest_server |
|
| 72 | + * @param EED_Core_Rest_Api $rest_module |
|
| 73 | + * @param Read $rest_api |
|
| 74 | + * @param string $api_version |
|
| 75 | + */ |
|
| 76 | + public function __construct( |
|
| 77 | + WP_REST_Server $wp_rest_server, |
|
| 78 | + EED_Core_Rest_Api $rest_module, |
|
| 79 | + Read $rest_api, |
|
| 80 | + $api_version = '4.8.36' |
|
| 81 | + ) { |
|
| 82 | + $this->wp_rest_server = $wp_rest_server; |
|
| 83 | + $this->rest_module = $rest_module; |
|
| 84 | + $this->rest_controller = $rest_api; |
|
| 85 | + $this->rest_controller->setRequestedVersion($api_version); |
|
| 86 | + $this->setUpRestServer(); |
|
| 87 | + } |
|
| 88 | 88 | |
| 89 | 89 | |
| 90 | - private function setUpRestServer() |
|
| 91 | - { |
|
| 92 | - /* @var WP_REST_Server $wp_rest_server */ |
|
| 93 | - global $wp_rest_server; |
|
| 94 | - $wp_rest_server = $this->wp_rest_server; |
|
| 95 | - EED_Core_Rest_Api::set_hooks_both(); |
|
| 96 | - do_action('rest_api_init', $this->wp_rest_server); |
|
| 97 | - } |
|
| 90 | + private function setUpRestServer() |
|
| 91 | + { |
|
| 92 | + /* @var WP_REST_Server $wp_rest_server */ |
|
| 93 | + global $wp_rest_server; |
|
| 94 | + $wp_rest_server = $this->wp_rest_server; |
|
| 95 | + EED_Core_Rest_Api::set_hooks_both(); |
|
| 96 | + do_action('rest_api_init', $this->wp_rest_server); |
|
| 97 | + } |
|
| 98 | 98 | |
| 99 | - /** |
|
| 100 | - * @param EEM_Base $model |
|
| 101 | - * @param array $query_params |
|
| 102 | - * @param string $include |
|
| 103 | - * @return array |
|
| 104 | - * @throws EE_Error |
|
| 105 | - * @throws InvalidArgumentException |
|
| 106 | - * @throws InvalidDataTypeException |
|
| 107 | - * @throws InvalidInterfaceException |
|
| 108 | - * @throws ModelConfigurationException |
|
| 109 | - * @throws ReflectionException |
|
| 110 | - * @throws RestException |
|
| 111 | - * @throws RestPasswordIncorrectException |
|
| 112 | - * @throws RestPasswordRequiredException |
|
| 113 | - * @throws UnexpectedEntityException |
|
| 114 | - * @throws DomainException |
|
| 115 | - * @since $VID:$ |
|
| 116 | - */ |
|
| 117 | - public function getOneApiResult(EEM_Base $model, array $query_params, $include = '') |
|
| 118 | - { |
|
| 119 | - if ( ! array_key_exists('limit', $query_params)) { |
|
| 120 | - $query_params['limit'] = 1; |
|
| 121 | - } |
|
| 122 | - $result = $this->getApiResults($model, $query_params, $include); |
|
| 123 | - return is_array($result) && isset($result[0]) ? $result[0] : []; |
|
| 124 | - } |
|
| 99 | + /** |
|
| 100 | + * @param EEM_Base $model |
|
| 101 | + * @param array $query_params |
|
| 102 | + * @param string $include |
|
| 103 | + * @return array |
|
| 104 | + * @throws EE_Error |
|
| 105 | + * @throws InvalidArgumentException |
|
| 106 | + * @throws InvalidDataTypeException |
|
| 107 | + * @throws InvalidInterfaceException |
|
| 108 | + * @throws ModelConfigurationException |
|
| 109 | + * @throws ReflectionException |
|
| 110 | + * @throws RestException |
|
| 111 | + * @throws RestPasswordIncorrectException |
|
| 112 | + * @throws RestPasswordRequiredException |
|
| 113 | + * @throws UnexpectedEntityException |
|
| 114 | + * @throws DomainException |
|
| 115 | + * @since $VID:$ |
|
| 116 | + */ |
|
| 117 | + public function getOneApiResult(EEM_Base $model, array $query_params, $include = '') |
|
| 118 | + { |
|
| 119 | + if ( ! array_key_exists('limit', $query_params)) { |
|
| 120 | + $query_params['limit'] = 1; |
|
| 121 | + } |
|
| 122 | + $result = $this->getApiResults($model, $query_params, $include); |
|
| 123 | + return is_array($result) && isset($result[0]) ? $result[0] : []; |
|
| 124 | + } |
|
| 125 | 125 | |
| 126 | - /** |
|
| 127 | - * @param EEM_Base $model |
|
| 128 | - * @param array $query_params |
|
| 129 | - * @param string $include |
|
| 130 | - * @return array |
|
| 131 | - * @throws EE_Error |
|
| 132 | - * @throws InvalidArgumentException |
|
| 133 | - * @throws InvalidDataTypeException |
|
| 134 | - * @throws InvalidInterfaceException |
|
| 135 | - * @throws ModelConfigurationException |
|
| 136 | - * @throws ReflectionException |
|
| 137 | - * @throws RestException |
|
| 138 | - * @throws RestPasswordIncorrectException |
|
| 139 | - * @throws RestPasswordRequiredException |
|
| 140 | - * @throws UnexpectedEntityException |
|
| 141 | - * @throws DomainException |
|
| 142 | - * @since $VID:$ |
|
| 143 | - */ |
|
| 144 | - public function getApiResults(EEM_Base $model, array $query_params, $include = '') |
|
| 145 | - { |
|
| 146 | - if (! array_key_exists('caps', $query_params)) { |
|
| 147 | - $query_params['caps'] = EEM_Base::caps_read_admin; |
|
| 148 | - } |
|
| 149 | - /** @type array $results */ |
|
| 150 | - $results = $model->get_all_wpdb_results($query_params); |
|
| 151 | - $rest_request = new WP_REST_Request(); |
|
| 152 | - $rest_request->set_param('include', $include); |
|
| 153 | - $rest_request->set_param('caps', 'edit'); |
|
| 154 | - $nice_results = array(); |
|
| 155 | - foreach ($results as $result) { |
|
| 156 | - $nice_results[] = $this->rest_controller->createEntityFromWpdbResult( |
|
| 157 | - $model, |
|
| 158 | - $result, |
|
| 159 | - $rest_request |
|
| 160 | - ); |
|
| 161 | - } |
|
| 162 | - return $nice_results; |
|
| 163 | - } |
|
| 126 | + /** |
|
| 127 | + * @param EEM_Base $model |
|
| 128 | + * @param array $query_params |
|
| 129 | + * @param string $include |
|
| 130 | + * @return array |
|
| 131 | + * @throws EE_Error |
|
| 132 | + * @throws InvalidArgumentException |
|
| 133 | + * @throws InvalidDataTypeException |
|
| 134 | + * @throws InvalidInterfaceException |
|
| 135 | + * @throws ModelConfigurationException |
|
| 136 | + * @throws ReflectionException |
|
| 137 | + * @throws RestException |
|
| 138 | + * @throws RestPasswordIncorrectException |
|
| 139 | + * @throws RestPasswordRequiredException |
|
| 140 | + * @throws UnexpectedEntityException |
|
| 141 | + * @throws DomainException |
|
| 142 | + * @since $VID:$ |
|
| 143 | + */ |
|
| 144 | + public function getApiResults(EEM_Base $model, array $query_params, $include = '') |
|
| 145 | + { |
|
| 146 | + if (! array_key_exists('caps', $query_params)) { |
|
| 147 | + $query_params['caps'] = EEM_Base::caps_read_admin; |
|
| 148 | + } |
|
| 149 | + /** @type array $results */ |
|
| 150 | + $results = $model->get_all_wpdb_results($query_params); |
|
| 151 | + $rest_request = new WP_REST_Request(); |
|
| 152 | + $rest_request->set_param('include', $include); |
|
| 153 | + $rest_request->set_param('caps', 'edit'); |
|
| 154 | + $nice_results = array(); |
|
| 155 | + foreach ($results as $result) { |
|
| 156 | + $nice_results[] = $this->rest_controller->createEntityFromWpdbResult( |
|
| 157 | + $model, |
|
| 158 | + $result, |
|
| 159 | + $rest_request |
|
| 160 | + ); |
|
| 161 | + } |
|
| 162 | + return $nice_results; |
|
| 163 | + } |
|
| 164 | 164 | |
| 165 | 165 | |
| 166 | - /** |
|
| 167 | - * @param string $endpoint |
|
| 168 | - * @return array |
|
| 169 | - * @throws EE_Error |
|
| 170 | - * @since $VID:$ |
|
| 171 | - */ |
|
| 172 | - public function getModelSchema($endpoint) |
|
| 173 | - { |
|
| 174 | - $response = $this->wp_rest_server->dispatch( |
|
| 175 | - new WP_REST_Request( |
|
| 176 | - 'OPTIONS', |
|
| 177 | - "/ee/v4.8.36/{$endpoint}" |
|
| 178 | - ) |
|
| 179 | - ); |
|
| 180 | - return $response->get_data(); |
|
| 181 | - } |
|
| 166 | + /** |
|
| 167 | + * @param string $endpoint |
|
| 168 | + * @return array |
|
| 169 | + * @throws EE_Error |
|
| 170 | + * @since $VID:$ |
|
| 171 | + */ |
|
| 172 | + public function getModelSchema($endpoint) |
|
| 173 | + { |
|
| 174 | + $response = $this->wp_rest_server->dispatch( |
|
| 175 | + new WP_REST_Request( |
|
| 176 | + 'OPTIONS', |
|
| 177 | + "/ee/v4.8.36/{$endpoint}" |
|
| 178 | + ) |
|
| 179 | + ); |
|
| 180 | + return $response->get_data(); |
|
| 181 | + } |
|
| 182 | 182 | } |
@@ -18,95 +18,95 @@ |
||
| 18 | 18 | class Base extends Controller_Base |
| 19 | 19 | { |
| 20 | 20 | |
| 21 | - /** |
|
| 22 | - * Holds reference to the model version info, which knows the requested version |
|
| 23 | - * |
|
| 24 | - * @var ModelVersionInfo |
|
| 25 | - */ |
|
| 26 | - protected $model_version_info; |
|
| 21 | + /** |
|
| 22 | + * Holds reference to the model version info, which knows the requested version |
|
| 23 | + * |
|
| 24 | + * @var ModelVersionInfo |
|
| 25 | + */ |
|
| 26 | + protected $model_version_info; |
|
| 27 | 27 | |
| 28 | 28 | |
| 29 | 29 | |
| 30 | - /** |
|
| 31 | - * Sets the version the user requested |
|
| 32 | - * |
|
| 33 | - * @param string $version eg '4.8' |
|
| 34 | - */ |
|
| 35 | - public function setRequestedVersion($version) |
|
| 36 | - { |
|
| 37 | - parent::setRequestedVersion($version); |
|
| 38 | - $this->model_version_info = new ModelVersionInfo($version); |
|
| 39 | - } |
|
| 30 | + /** |
|
| 31 | + * Sets the version the user requested |
|
| 32 | + * |
|
| 33 | + * @param string $version eg '4.8' |
|
| 34 | + */ |
|
| 35 | + public function setRequestedVersion($version) |
|
| 36 | + { |
|
| 37 | + parent::setRequestedVersion($version); |
|
| 38 | + $this->model_version_info = new ModelVersionInfo($version); |
|
| 39 | + } |
|
| 40 | 40 | |
| 41 | 41 | |
| 42 | 42 | |
| 43 | - /** |
|
| 44 | - * Gets the object that should be used for getting any info from the models, |
|
| 45 | - * because it's takes the requested and current core version into account |
|
| 46 | - * |
|
| 47 | - * @return ModelVersionInfo |
|
| 48 | - * @throws EE_Error |
|
| 49 | - */ |
|
| 50 | - public function getModelVersionInfo() |
|
| 51 | - { |
|
| 52 | - if (! $this->model_version_info) { |
|
| 53 | - throw new EE_Error( |
|
| 54 | - sprintf( |
|
| 55 | - __( |
|
| 56 | - 'Cannot use model version info before setting the requested version in the controller', |
|
| 57 | - 'event_espresso' |
|
| 58 | - ) |
|
| 59 | - ) |
|
| 60 | - ); |
|
| 61 | - } |
|
| 62 | - return $this->model_version_info; |
|
| 63 | - } |
|
| 43 | + /** |
|
| 44 | + * Gets the object that should be used for getting any info from the models, |
|
| 45 | + * because it's takes the requested and current core version into account |
|
| 46 | + * |
|
| 47 | + * @return ModelVersionInfo |
|
| 48 | + * @throws EE_Error |
|
| 49 | + */ |
|
| 50 | + public function getModelVersionInfo() |
|
| 51 | + { |
|
| 52 | + if (! $this->model_version_info) { |
|
| 53 | + throw new EE_Error( |
|
| 54 | + sprintf( |
|
| 55 | + __( |
|
| 56 | + 'Cannot use model version info before setting the requested version in the controller', |
|
| 57 | + 'event_espresso' |
|
| 58 | + ) |
|
| 59 | + ) |
|
| 60 | + ); |
|
| 61 | + } |
|
| 62 | + return $this->model_version_info; |
|
| 63 | + } |
|
| 64 | 64 | |
| 65 | 65 | |
| 66 | 66 | |
| 67 | - /** |
|
| 68 | - * Determines if $object is of one of the classes of $classes. Similar to |
|
| 69 | - * in_array(), except this checks if $object is a subclass of the classnames provided |
|
| 70 | - * in $classnames |
|
| 71 | - * |
|
| 72 | - * @param object $object |
|
| 73 | - * @param array $classnames |
|
| 74 | - * @return boolean |
|
| 75 | - */ |
|
| 76 | - public function isSubclassOfOne($object, $classnames) |
|
| 77 | - { |
|
| 78 | - foreach ($classnames as $classname) { |
|
| 79 | - if (is_a($object, $classname)) { |
|
| 80 | - return true; |
|
| 81 | - } |
|
| 82 | - } |
|
| 83 | - return false; |
|
| 84 | - } |
|
| 67 | + /** |
|
| 68 | + * Determines if $object is of one of the classes of $classes. Similar to |
|
| 69 | + * in_array(), except this checks if $object is a subclass of the classnames provided |
|
| 70 | + * in $classnames |
|
| 71 | + * |
|
| 72 | + * @param object $object |
|
| 73 | + * @param array $classnames |
|
| 74 | + * @return boolean |
|
| 75 | + */ |
|
| 76 | + public function isSubclassOfOne($object, $classnames) |
|
| 77 | + { |
|
| 78 | + foreach ($classnames as $classname) { |
|
| 79 | + if (is_a($object, $classname)) { |
|
| 80 | + return true; |
|
| 81 | + } |
|
| 82 | + } |
|
| 83 | + return false; |
|
| 84 | + } |
|
| 85 | 85 | |
| 86 | - /** |
|
| 87 | - * Verifies the model name provided was valid. If so, returns the model (as an object). Otherwise, throws an |
|
| 88 | - * exception. Must be called after `setRequestedVersion()`. |
|
| 89 | - * @since 4.9.76.p |
|
| 90 | - * @param $model_name |
|
| 91 | - * @return EEM_Base |
|
| 92 | - * @throws EE_Error |
|
| 93 | - * @throws RestException |
|
| 94 | - */ |
|
| 95 | - protected function validateModel($model_name) |
|
| 96 | - { |
|
| 97 | - if (! $this->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 98 | - throw new RestException( |
|
| 99 | - 'endpoint_parsing_error', |
|
| 100 | - sprintf( |
|
| 101 | - __( |
|
| 102 | - 'There is no model for endpoint %s. Please contact event espresso support', |
|
| 103 | - 'event_espresso' |
|
| 104 | - ), |
|
| 105 | - $model_name |
|
| 106 | - ) |
|
| 107 | - ); |
|
| 108 | - } |
|
| 109 | - return $this->getModelVersionInfo()->loadModel($model_name); |
|
| 110 | - } |
|
| 86 | + /** |
|
| 87 | + * Verifies the model name provided was valid. If so, returns the model (as an object). Otherwise, throws an |
|
| 88 | + * exception. Must be called after `setRequestedVersion()`. |
|
| 89 | + * @since 4.9.76.p |
|
| 90 | + * @param $model_name |
|
| 91 | + * @return EEM_Base |
|
| 92 | + * @throws EE_Error |
|
| 93 | + * @throws RestException |
|
| 94 | + */ |
|
| 95 | + protected function validateModel($model_name) |
|
| 96 | + { |
|
| 97 | + if (! $this->getModelVersionInfo()->isModelNameInThisVersion($model_name)) { |
|
| 98 | + throw new RestException( |
|
| 99 | + 'endpoint_parsing_error', |
|
| 100 | + sprintf( |
|
| 101 | + __( |
|
| 102 | + 'There is no model for endpoint %s. Please contact event espresso support', |
|
| 103 | + 'event_espresso' |
|
| 104 | + ), |
|
| 105 | + $model_name |
|
| 106 | + ) |
|
| 107 | + ); |
|
| 108 | + } |
|
| 109 | + return $this->getModelVersionInfo()->loadModel($model_name); |
|
| 110 | + } |
|
| 111 | 111 | } |
| 112 | 112 | // End of file Base.php |
@@ -25,255 +25,255 @@ |
||
| 25 | 25 | class JsonModelSchema |
| 26 | 26 | { |
| 27 | 27 | |
| 28 | - /** |
|
| 29 | - * @var EEM_Base |
|
| 30 | - */ |
|
| 31 | - protected $model; |
|
| 28 | + /** |
|
| 29 | + * @var EEM_Base |
|
| 30 | + */ |
|
| 31 | + protected $model; |
|
| 32 | 32 | |
| 33 | - /** |
|
| 34 | - * @var CalculatedModelFields |
|
| 35 | - */ |
|
| 36 | - protected $fields_calculator; |
|
| 33 | + /** |
|
| 34 | + * @var CalculatedModelFields |
|
| 35 | + */ |
|
| 36 | + protected $fields_calculator; |
|
| 37 | 37 | |
| 38 | 38 | |
| 39 | - /** |
|
| 40 | - * JsonModelSchema constructor. |
|
| 41 | - * |
|
| 42 | - * @param EEM_Base $model |
|
| 43 | - * @param CalculatedModelFields $fields_calculator |
|
| 44 | - */ |
|
| 45 | - public function __construct(EEM_Base $model, CalculatedModelFields $fields_calculator) |
|
| 46 | - { |
|
| 47 | - $this->model = $model; |
|
| 48 | - $this->fields_calculator = $fields_calculator; |
|
| 49 | - } |
|
| 39 | + /** |
|
| 40 | + * JsonModelSchema constructor. |
|
| 41 | + * |
|
| 42 | + * @param EEM_Base $model |
|
| 43 | + * @param CalculatedModelFields $fields_calculator |
|
| 44 | + */ |
|
| 45 | + public function __construct(EEM_Base $model, CalculatedModelFields $fields_calculator) |
|
| 46 | + { |
|
| 47 | + $this->model = $model; |
|
| 48 | + $this->fields_calculator = $fields_calculator; |
|
| 49 | + } |
|
| 50 | 50 | |
| 51 | 51 | |
| 52 | - /** |
|
| 53 | - * Return the schema for a given model from a given model. |
|
| 54 | - * |
|
| 55 | - * @return array |
|
| 56 | - */ |
|
| 57 | - public function getModelSchema() |
|
| 58 | - { |
|
| 59 | - return $this->getModelSchemaForRelations( |
|
| 60 | - $this->model->relation_settings(), |
|
| 61 | - $this->getModelSchemaForFields( |
|
| 62 | - $this->model->field_settings(), |
|
| 63 | - $this->getInitialSchemaStructure() |
|
| 64 | - ) |
|
| 65 | - ); |
|
| 66 | - } |
|
| 52 | + /** |
|
| 53 | + * Return the schema for a given model from a given model. |
|
| 54 | + * |
|
| 55 | + * @return array |
|
| 56 | + */ |
|
| 57 | + public function getModelSchema() |
|
| 58 | + { |
|
| 59 | + return $this->getModelSchemaForRelations( |
|
| 60 | + $this->model->relation_settings(), |
|
| 61 | + $this->getModelSchemaForFields( |
|
| 62 | + $this->model->field_settings(), |
|
| 63 | + $this->getInitialSchemaStructure() |
|
| 64 | + ) |
|
| 65 | + ); |
|
| 66 | + } |
|
| 67 | 67 | |
| 68 | 68 | |
| 69 | - /** |
|
| 70 | - * Get the schema for a given set of model fields. |
|
| 71 | - * |
|
| 72 | - * @param EE_Model_Field_Base[] $model_fields |
|
| 73 | - * @param array $schema |
|
| 74 | - * @return array |
|
| 75 | - */ |
|
| 76 | - public function getModelSchemaForFields(array $model_fields, array $schema) |
|
| 77 | - { |
|
| 78 | - foreach ($model_fields as $field => $model_field) { |
|
| 79 | - if (! $model_field instanceof EE_Model_Field_Base) { |
|
| 80 | - continue; |
|
| 81 | - } |
|
| 82 | - $schema['properties'][ $field ] = $model_field->getSchema(); |
|
| 69 | + /** |
|
| 70 | + * Get the schema for a given set of model fields. |
|
| 71 | + * |
|
| 72 | + * @param EE_Model_Field_Base[] $model_fields |
|
| 73 | + * @param array $schema |
|
| 74 | + * @return array |
|
| 75 | + */ |
|
| 76 | + public function getModelSchemaForFields(array $model_fields, array $schema) |
|
| 77 | + { |
|
| 78 | + foreach ($model_fields as $field => $model_field) { |
|
| 79 | + if (! $model_field instanceof EE_Model_Field_Base) { |
|
| 80 | + continue; |
|
| 81 | + } |
|
| 82 | + $schema['properties'][ $field ] = $model_field->getSchema(); |
|
| 83 | 83 | |
| 84 | - // if this is a primary key field add the primary key item |
|
| 85 | - if ($model_field instanceof EE_Primary_Key_Field_Base) { |
|
| 86 | - $schema['properties'][ $field ]['primary_key'] = true; |
|
| 87 | - if ($model_field instanceof EE_Primary_Key_Int_Field) { |
|
| 88 | - $schema['properties'][ $field ]['readonly'] = true; |
|
| 89 | - } |
|
| 90 | - } |
|
| 84 | + // if this is a primary key field add the primary key item |
|
| 85 | + if ($model_field instanceof EE_Primary_Key_Field_Base) { |
|
| 86 | + $schema['properties'][ $field ]['primary_key'] = true; |
|
| 87 | + if ($model_field instanceof EE_Primary_Key_Int_Field) { |
|
| 88 | + $schema['properties'][ $field ]['readonly'] = true; |
|
| 89 | + } |
|
| 90 | + } |
|
| 91 | 91 | |
| 92 | - // if this is a foreign key field add the foreign key item |
|
| 93 | - if ($model_field instanceof EE_Foreign_Key_Field_Base) { |
|
| 94 | - $schema['properties'][ $field ]['foreign_key'] = array( |
|
| 95 | - 'description' => esc_html__( |
|
| 96 | - 'This is a foreign key the points to the given models.', |
|
| 97 | - 'event_espresso' |
|
| 98 | - ), |
|
| 99 | - 'type' => 'array', |
|
| 100 | - 'enum' => $model_field->get_model_class_names_pointed_to(), |
|
| 101 | - ); |
|
| 102 | - } |
|
| 103 | - } |
|
| 104 | - return $schema; |
|
| 105 | - } |
|
| 92 | + // if this is a foreign key field add the foreign key item |
|
| 93 | + if ($model_field instanceof EE_Foreign_Key_Field_Base) { |
|
| 94 | + $schema['properties'][ $field ]['foreign_key'] = array( |
|
| 95 | + 'description' => esc_html__( |
|
| 96 | + 'This is a foreign key the points to the given models.', |
|
| 97 | + 'event_espresso' |
|
| 98 | + ), |
|
| 99 | + 'type' => 'array', |
|
| 100 | + 'enum' => $model_field->get_model_class_names_pointed_to(), |
|
| 101 | + ); |
|
| 102 | + } |
|
| 103 | + } |
|
| 104 | + return $schema; |
|
| 105 | + } |
|
| 106 | 106 | |
| 107 | 107 | |
| 108 | - /** |
|
| 109 | - * Get the schema for a given set of model relations |
|
| 110 | - * |
|
| 111 | - * @param EE_Model_Relation_Base[] $relations_on_model |
|
| 112 | - * @param array $schema |
|
| 113 | - * @return array |
|
| 114 | - */ |
|
| 115 | - public function getModelSchemaForRelations(array $relations_on_model, array $schema) |
|
| 116 | - { |
|
| 117 | - foreach ($relations_on_model as $model_name => $relation) { |
|
| 118 | - if (! $relation instanceof EE_Model_Relation_Base) { |
|
| 119 | - continue; |
|
| 120 | - } |
|
| 121 | - $model_name_for_schema = $relation instanceof EE_Belongs_To_Relation |
|
| 122 | - ? strtolower($model_name) |
|
| 123 | - : EEH_Inflector::pluralize_and_lower($model_name); |
|
| 124 | - $schema['properties'][ $model_name_for_schema ] = $relation->getSchema(); |
|
| 125 | - $schema['properties'][ $model_name_for_schema ]['relation_model'] = $model_name; |
|
| 108 | + /** |
|
| 109 | + * Get the schema for a given set of model relations |
|
| 110 | + * |
|
| 111 | + * @param EE_Model_Relation_Base[] $relations_on_model |
|
| 112 | + * @param array $schema |
|
| 113 | + * @return array |
|
| 114 | + */ |
|
| 115 | + public function getModelSchemaForRelations(array $relations_on_model, array $schema) |
|
| 116 | + { |
|
| 117 | + foreach ($relations_on_model as $model_name => $relation) { |
|
| 118 | + if (! $relation instanceof EE_Model_Relation_Base) { |
|
| 119 | + continue; |
|
| 120 | + } |
|
| 121 | + $model_name_for_schema = $relation instanceof EE_Belongs_To_Relation |
|
| 122 | + ? strtolower($model_name) |
|
| 123 | + : EEH_Inflector::pluralize_and_lower($model_name); |
|
| 124 | + $schema['properties'][ $model_name_for_schema ] = $relation->getSchema(); |
|
| 125 | + $schema['properties'][ $model_name_for_schema ]['relation_model'] = $model_name; |
|
| 126 | 126 | |
| 127 | - // links schema |
|
| 128 | - $links_key = 'https://api.eventespresso.com/' . strtolower($model_name); |
|
| 129 | - $schema['properties']['_links']['properties'][ $links_key ] = array( |
|
| 130 | - 'description' => esc_html__( |
|
| 131 | - 'Array of objects describing the link(s) for this relation resource.', |
|
| 132 | - 'event_espresso' |
|
| 133 | - ), |
|
| 134 | - 'type' => 'array', |
|
| 135 | - 'readonly' => true, |
|
| 136 | - 'items' => array( |
|
| 137 | - 'type' => 'object', |
|
| 138 | - 'properties' => array( |
|
| 139 | - 'href' => array( |
|
| 140 | - 'type' => 'string', |
|
| 141 | - 'description' => sprintf( |
|
| 142 | - // translators: placeholder is the model name for the relation. |
|
| 143 | - esc_html__( |
|
| 144 | - 'The link to the resource for the %s relation(s) to this entity', |
|
| 145 | - 'event_espresso' |
|
| 146 | - ), |
|
| 147 | - $model_name |
|
| 148 | - ), |
|
| 149 | - ), |
|
| 150 | - 'single' => array( |
|
| 151 | - 'type' => 'boolean', |
|
| 152 | - 'description' => sprintf( |
|
| 153 | - // translators: placeholder is the model name for the relation. |
|
| 154 | - esc_html__( |
|
| 155 | - 'Whether or not there is only a single %s relation to this entity', |
|
| 156 | - 'event_espresso' |
|
| 157 | - ), |
|
| 158 | - $model_name |
|
| 159 | - ), |
|
| 160 | - ), |
|
| 161 | - ), |
|
| 162 | - 'additionalProperties' => false |
|
| 163 | - ), |
|
| 164 | - ); |
|
| 165 | - } |
|
| 166 | - return $schema; |
|
| 167 | - } |
|
| 127 | + // links schema |
|
| 128 | + $links_key = 'https://api.eventespresso.com/' . strtolower($model_name); |
|
| 129 | + $schema['properties']['_links']['properties'][ $links_key ] = array( |
|
| 130 | + 'description' => esc_html__( |
|
| 131 | + 'Array of objects describing the link(s) for this relation resource.', |
|
| 132 | + 'event_espresso' |
|
| 133 | + ), |
|
| 134 | + 'type' => 'array', |
|
| 135 | + 'readonly' => true, |
|
| 136 | + 'items' => array( |
|
| 137 | + 'type' => 'object', |
|
| 138 | + 'properties' => array( |
|
| 139 | + 'href' => array( |
|
| 140 | + 'type' => 'string', |
|
| 141 | + 'description' => sprintf( |
|
| 142 | + // translators: placeholder is the model name for the relation. |
|
| 143 | + esc_html__( |
|
| 144 | + 'The link to the resource for the %s relation(s) to this entity', |
|
| 145 | + 'event_espresso' |
|
| 146 | + ), |
|
| 147 | + $model_name |
|
| 148 | + ), |
|
| 149 | + ), |
|
| 150 | + 'single' => array( |
|
| 151 | + 'type' => 'boolean', |
|
| 152 | + 'description' => sprintf( |
|
| 153 | + // translators: placeholder is the model name for the relation. |
|
| 154 | + esc_html__( |
|
| 155 | + 'Whether or not there is only a single %s relation to this entity', |
|
| 156 | + 'event_espresso' |
|
| 157 | + ), |
|
| 158 | + $model_name |
|
| 159 | + ), |
|
| 160 | + ), |
|
| 161 | + ), |
|
| 162 | + 'additionalProperties' => false |
|
| 163 | + ), |
|
| 164 | + ); |
|
| 165 | + } |
|
| 166 | + return $schema; |
|
| 167 | + } |
|
| 168 | 168 | |
| 169 | 169 | |
| 170 | - /** |
|
| 171 | - * Outputs the schema header for a model. |
|
| 172 | - * |
|
| 173 | - * @return array |
|
| 174 | - */ |
|
| 175 | - public function getInitialSchemaStructure() |
|
| 176 | - { |
|
| 177 | - return array( |
|
| 178 | - '$schema' => 'http://json-schema.org/draft-04/schema#', |
|
| 179 | - 'title' => $this->model->get_this_model_name(), |
|
| 180 | - 'type' => 'object', |
|
| 181 | - 'properties' => array( |
|
| 182 | - 'link' => array( |
|
| 183 | - 'description' => esc_html__( |
|
| 184 | - 'Link to event on WordPress site hosting events.', |
|
| 185 | - 'event_espresso' |
|
| 186 | - ), |
|
| 187 | - 'type' => 'string', |
|
| 188 | - 'readonly' => true, |
|
| 189 | - ), |
|
| 190 | - '_links' => array( |
|
| 191 | - 'description' => esc_html__( |
|
| 192 | - 'Various links for resources related to the entity.', |
|
| 193 | - 'event_espresso' |
|
| 194 | - ), |
|
| 195 | - 'type' => 'object', |
|
| 196 | - 'readonly' => true, |
|
| 197 | - 'properties' => array( |
|
| 198 | - 'self' => array( |
|
| 199 | - 'description' => esc_html__( |
|
| 200 | - 'Link to this entities resource.', |
|
| 201 | - 'event_espresso' |
|
| 202 | - ), |
|
| 203 | - 'type' => 'array', |
|
| 204 | - 'items' => array( |
|
| 205 | - 'type' => 'object', |
|
| 206 | - 'properties' => array( |
|
| 207 | - 'href' => array( |
|
| 208 | - 'type' => 'string', |
|
| 209 | - ), |
|
| 210 | - ), |
|
| 211 | - 'additionalProperties' => false |
|
| 212 | - ), |
|
| 213 | - 'readonly' => true |
|
| 214 | - ), |
|
| 215 | - 'collection' => array( |
|
| 216 | - 'description' => esc_html__( |
|
| 217 | - 'Link to this entities collection resource.', |
|
| 218 | - 'event_espresso' |
|
| 219 | - ), |
|
| 220 | - 'type' => 'array', |
|
| 221 | - 'items' => array( |
|
| 222 | - 'type' => 'object', |
|
| 223 | - 'properties' => array( |
|
| 224 | - 'href' => array( |
|
| 225 | - 'type' => 'string' |
|
| 226 | - ), |
|
| 227 | - ), |
|
| 228 | - 'additionalProperties' => false |
|
| 229 | - ), |
|
| 230 | - 'readonly' => true |
|
| 231 | - ), |
|
| 232 | - ), |
|
| 233 | - 'additionalProperties' => false, |
|
| 234 | - ), |
|
| 235 | - '_calculated_fields' => array_merge( |
|
| 236 | - $this->fields_calculator->getJsonSchemaForModel($this->model), |
|
| 237 | - array( |
|
| 238 | - '_protected' => $this->getProtectedFieldsSchema() |
|
| 239 | - ) |
|
| 240 | - ), |
|
| 241 | - '_protected' => $this->getProtectedFieldsSchema() |
|
| 242 | - ), |
|
| 243 | - 'additionalProperties' => false, |
|
| 244 | - ); |
|
| 245 | - } |
|
| 170 | + /** |
|
| 171 | + * Outputs the schema header for a model. |
|
| 172 | + * |
|
| 173 | + * @return array |
|
| 174 | + */ |
|
| 175 | + public function getInitialSchemaStructure() |
|
| 176 | + { |
|
| 177 | + return array( |
|
| 178 | + '$schema' => 'http://json-schema.org/draft-04/schema#', |
|
| 179 | + 'title' => $this->model->get_this_model_name(), |
|
| 180 | + 'type' => 'object', |
|
| 181 | + 'properties' => array( |
|
| 182 | + 'link' => array( |
|
| 183 | + 'description' => esc_html__( |
|
| 184 | + 'Link to event on WordPress site hosting events.', |
|
| 185 | + 'event_espresso' |
|
| 186 | + ), |
|
| 187 | + 'type' => 'string', |
|
| 188 | + 'readonly' => true, |
|
| 189 | + ), |
|
| 190 | + '_links' => array( |
|
| 191 | + 'description' => esc_html__( |
|
| 192 | + 'Various links for resources related to the entity.', |
|
| 193 | + 'event_espresso' |
|
| 194 | + ), |
|
| 195 | + 'type' => 'object', |
|
| 196 | + 'readonly' => true, |
|
| 197 | + 'properties' => array( |
|
| 198 | + 'self' => array( |
|
| 199 | + 'description' => esc_html__( |
|
| 200 | + 'Link to this entities resource.', |
|
| 201 | + 'event_espresso' |
|
| 202 | + ), |
|
| 203 | + 'type' => 'array', |
|
| 204 | + 'items' => array( |
|
| 205 | + 'type' => 'object', |
|
| 206 | + 'properties' => array( |
|
| 207 | + 'href' => array( |
|
| 208 | + 'type' => 'string', |
|
| 209 | + ), |
|
| 210 | + ), |
|
| 211 | + 'additionalProperties' => false |
|
| 212 | + ), |
|
| 213 | + 'readonly' => true |
|
| 214 | + ), |
|
| 215 | + 'collection' => array( |
|
| 216 | + 'description' => esc_html__( |
|
| 217 | + 'Link to this entities collection resource.', |
|
| 218 | + 'event_espresso' |
|
| 219 | + ), |
|
| 220 | + 'type' => 'array', |
|
| 221 | + 'items' => array( |
|
| 222 | + 'type' => 'object', |
|
| 223 | + 'properties' => array( |
|
| 224 | + 'href' => array( |
|
| 225 | + 'type' => 'string' |
|
| 226 | + ), |
|
| 227 | + ), |
|
| 228 | + 'additionalProperties' => false |
|
| 229 | + ), |
|
| 230 | + 'readonly' => true |
|
| 231 | + ), |
|
| 232 | + ), |
|
| 233 | + 'additionalProperties' => false, |
|
| 234 | + ), |
|
| 235 | + '_calculated_fields' => array_merge( |
|
| 236 | + $this->fields_calculator->getJsonSchemaForModel($this->model), |
|
| 237 | + array( |
|
| 238 | + '_protected' => $this->getProtectedFieldsSchema() |
|
| 239 | + ) |
|
| 240 | + ), |
|
| 241 | + '_protected' => $this->getProtectedFieldsSchema() |
|
| 242 | + ), |
|
| 243 | + 'additionalProperties' => false, |
|
| 244 | + ); |
|
| 245 | + } |
|
| 246 | 246 | |
| 247 | - /** |
|
| 248 | - * Returns an array of JSON schema to describe the _protected property on responses |
|
| 249 | - * @since 4.9.74.p |
|
| 250 | - * @return array |
|
| 251 | - */ |
|
| 252 | - protected function getProtectedFieldsSchema() |
|
| 253 | - { |
|
| 254 | - return array( |
|
| 255 | - 'description' => esc_html__('Array of property names whose values were replaced with their default (because they are related to a password-protected entity.)', 'event_espresso'), |
|
| 256 | - 'type' => 'array', |
|
| 257 | - 'items' => array( |
|
| 258 | - 'description' => esc_html__('Each name corresponds to a property that is protected by password for this entity and has its default value returned in the response.', 'event_espresso'), |
|
| 259 | - 'type' => 'string', |
|
| 260 | - 'readonly' => true, |
|
| 261 | - ), |
|
| 262 | - 'readonly' => true |
|
| 263 | - ); |
|
| 264 | - } |
|
| 247 | + /** |
|
| 248 | + * Returns an array of JSON schema to describe the _protected property on responses |
|
| 249 | + * @since 4.9.74.p |
|
| 250 | + * @return array |
|
| 251 | + */ |
|
| 252 | + protected function getProtectedFieldsSchema() |
|
| 253 | + { |
|
| 254 | + return array( |
|
| 255 | + 'description' => esc_html__('Array of property names whose values were replaced with their default (because they are related to a password-protected entity.)', 'event_espresso'), |
|
| 256 | + 'type' => 'array', |
|
| 257 | + 'items' => array( |
|
| 258 | + 'description' => esc_html__('Each name corresponds to a property that is protected by password for this entity and has its default value returned in the response.', 'event_espresso'), |
|
| 259 | + 'type' => 'string', |
|
| 260 | + 'readonly' => true, |
|
| 261 | + ), |
|
| 262 | + 'readonly' => true |
|
| 263 | + ); |
|
| 264 | + } |
|
| 265 | 265 | |
| 266 | 266 | |
| 267 | - /** |
|
| 268 | - * Allows one to just use the object as a string to get the json. |
|
| 269 | - * eg. |
|
| 270 | - * $json_schema = new JsonModelSchema(EEM_Event::instance(), new CalculatedModelFields); |
|
| 271 | - * echo $json_schema; //outputs the schema as a json formatted string. |
|
| 272 | - * |
|
| 273 | - * @return string |
|
| 274 | - */ |
|
| 275 | - public function __toString() |
|
| 276 | - { $schema = wp_json_encode($this->getModelSchema()); |
|
| 277 | - return is_string($schema) ? $schema : ''; |
|
| 278 | - } |
|
| 267 | + /** |
|
| 268 | + * Allows one to just use the object as a string to get the json. |
|
| 269 | + * eg. |
|
| 270 | + * $json_schema = new JsonModelSchema(EEM_Event::instance(), new CalculatedModelFields); |
|
| 271 | + * echo $json_schema; //outputs the schema as a json formatted string. |
|
| 272 | + * |
|
| 273 | + * @return string |
|
| 274 | + */ |
|
| 275 | + public function __toString() |
|
| 276 | + { $schema = wp_json_encode($this->getModelSchema()); |
|
| 277 | + return is_string($schema) ? $schema : ''; |
|
| 278 | + } |
|
| 279 | 279 | } |
@@ -20,1150 +20,1150 @@ |
||
| 20 | 20 | class EE_Dependency_Map |
| 21 | 21 | { |
| 22 | 22 | |
| 23 | - /** |
|
| 24 | - * This means that the requested class dependency is not present in the dependency map |
|
| 25 | - */ |
|
| 26 | - const not_registered = 0; |
|
| 27 | - |
|
| 28 | - /** |
|
| 29 | - * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class. |
|
| 30 | - */ |
|
| 31 | - const load_new_object = 1; |
|
| 32 | - |
|
| 33 | - /** |
|
| 34 | - * This instructs class loaders to return a previously instantiated and cached object for the requested class. |
|
| 35 | - * IF a previously instantiated object does not exist, a new one will be created and added to the cache. |
|
| 36 | - */ |
|
| 37 | - const load_from_cache = 2; |
|
| 38 | - |
|
| 39 | - /** |
|
| 40 | - * When registering a dependency, |
|
| 41 | - * this indicates to keep any existing dependencies that already exist, |
|
| 42 | - * and simply discard any new dependencies declared in the incoming data |
|
| 43 | - */ |
|
| 44 | - const KEEP_EXISTING_DEPENDENCIES = 0; |
|
| 45 | - |
|
| 46 | - /** |
|
| 47 | - * When registering a dependency, |
|
| 48 | - * this indicates to overwrite any existing dependencies that already exist using the incoming data |
|
| 49 | - */ |
|
| 50 | - const OVERWRITE_DEPENDENCIES = 1; |
|
| 51 | - |
|
| 52 | - |
|
| 53 | - /** |
|
| 54 | - * @type EE_Dependency_Map $_instance |
|
| 55 | - */ |
|
| 56 | - protected static $_instance; |
|
| 57 | - |
|
| 58 | - /** |
|
| 59 | - * @var ClassInterfaceCache $class_cache |
|
| 60 | - */ |
|
| 61 | - private $class_cache; |
|
| 62 | - |
|
| 63 | - /** |
|
| 64 | - * @type RequestInterface $request |
|
| 65 | - */ |
|
| 66 | - protected $request; |
|
| 67 | - |
|
| 68 | - /** |
|
| 69 | - * @type LegacyRequestInterface $legacy_request |
|
| 70 | - */ |
|
| 71 | - protected $legacy_request; |
|
| 72 | - |
|
| 73 | - /** |
|
| 74 | - * @type ResponseInterface $response |
|
| 75 | - */ |
|
| 76 | - protected $response; |
|
| 77 | - |
|
| 78 | - /** |
|
| 79 | - * @type LoaderInterface $loader |
|
| 80 | - */ |
|
| 81 | - protected $loader; |
|
| 82 | - |
|
| 83 | - /** |
|
| 84 | - * @type array $_dependency_map |
|
| 85 | - */ |
|
| 86 | - protected $_dependency_map = array(); |
|
| 87 | - |
|
| 88 | - /** |
|
| 89 | - * @type array $_class_loaders |
|
| 90 | - */ |
|
| 91 | - protected $_class_loaders = array(); |
|
| 92 | - |
|
| 93 | - |
|
| 94 | - /** |
|
| 95 | - * EE_Dependency_Map constructor. |
|
| 96 | - * |
|
| 97 | - * @param ClassInterfaceCache $class_cache |
|
| 98 | - */ |
|
| 99 | - protected function __construct(ClassInterfaceCache $class_cache) |
|
| 100 | - { |
|
| 101 | - $this->class_cache = $class_cache; |
|
| 102 | - do_action('EE_Dependency_Map____construct', $this); |
|
| 103 | - } |
|
| 104 | - |
|
| 105 | - |
|
| 106 | - /** |
|
| 107 | - * @return void |
|
| 108 | - */ |
|
| 109 | - public function initialize() |
|
| 110 | - { |
|
| 111 | - $this->_register_core_dependencies(); |
|
| 112 | - $this->_register_core_class_loaders(); |
|
| 113 | - $this->_register_core_aliases(); |
|
| 114 | - } |
|
| 115 | - |
|
| 116 | - |
|
| 117 | - /** |
|
| 118 | - * @singleton method used to instantiate class object |
|
| 119 | - * @param ClassInterfaceCache|null $class_cache |
|
| 120 | - * @return EE_Dependency_Map |
|
| 121 | - */ |
|
| 122 | - public static function instance(ClassInterfaceCache $class_cache = null) |
|
| 123 | - { |
|
| 124 | - // check if class object is instantiated, and instantiated properly |
|
| 125 | - if (! self::$_instance instanceof EE_Dependency_Map |
|
| 126 | - && $class_cache instanceof ClassInterfaceCache |
|
| 127 | - ) { |
|
| 128 | - self::$_instance = new EE_Dependency_Map($class_cache); |
|
| 129 | - } |
|
| 130 | - return self::$_instance; |
|
| 131 | - } |
|
| 132 | - |
|
| 133 | - |
|
| 134 | - /** |
|
| 135 | - * @param RequestInterface $request |
|
| 136 | - */ |
|
| 137 | - public function setRequest(RequestInterface $request) |
|
| 138 | - { |
|
| 139 | - $this->request = $request; |
|
| 140 | - } |
|
| 141 | - |
|
| 142 | - |
|
| 143 | - /** |
|
| 144 | - * @param LegacyRequestInterface $legacy_request |
|
| 145 | - */ |
|
| 146 | - public function setLegacyRequest(LegacyRequestInterface $legacy_request) |
|
| 147 | - { |
|
| 148 | - $this->legacy_request = $legacy_request; |
|
| 149 | - } |
|
| 150 | - |
|
| 151 | - |
|
| 152 | - /** |
|
| 153 | - * @param ResponseInterface $response |
|
| 154 | - */ |
|
| 155 | - public function setResponse(ResponseInterface $response) |
|
| 156 | - { |
|
| 157 | - $this->response = $response; |
|
| 158 | - } |
|
| 159 | - |
|
| 160 | - |
|
| 161 | - /** |
|
| 162 | - * @param LoaderInterface $loader |
|
| 163 | - */ |
|
| 164 | - public function setLoader(LoaderInterface $loader) |
|
| 165 | - { |
|
| 166 | - $this->loader = $loader; |
|
| 167 | - } |
|
| 168 | - |
|
| 169 | - |
|
| 170 | - /** |
|
| 171 | - * @param string $class |
|
| 172 | - * @param array $dependencies |
|
| 173 | - * @param int $overwrite |
|
| 174 | - * @return bool |
|
| 175 | - */ |
|
| 176 | - public static function register_dependencies( |
|
| 177 | - $class, |
|
| 178 | - array $dependencies, |
|
| 179 | - $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES |
|
| 180 | - ) { |
|
| 181 | - return self::$_instance->registerDependencies($class, $dependencies, $overwrite); |
|
| 182 | - } |
|
| 183 | - |
|
| 184 | - |
|
| 185 | - /** |
|
| 186 | - * Assigns an array of class names and corresponding load sources (new or cached) |
|
| 187 | - * to the class specified by the first parameter. |
|
| 188 | - * IMPORTANT !!! |
|
| 189 | - * The order of elements in the incoming $dependencies array MUST match |
|
| 190 | - * the order of the constructor parameters for the class in question. |
|
| 191 | - * This is especially important when overriding any existing dependencies that are registered. |
|
| 192 | - * the third parameter controls whether any duplicate dependencies are overwritten or not. |
|
| 193 | - * |
|
| 194 | - * @param string $class |
|
| 195 | - * @param array $dependencies |
|
| 196 | - * @param int $overwrite |
|
| 197 | - * @return bool |
|
| 198 | - */ |
|
| 199 | - public function registerDependencies( |
|
| 200 | - $class, |
|
| 201 | - array $dependencies, |
|
| 202 | - $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES |
|
| 203 | - ) { |
|
| 204 | - $class = trim($class, '\\'); |
|
| 205 | - $registered = false; |
|
| 206 | - if (empty(self::$_instance->_dependency_map[ $class ])) { |
|
| 207 | - self::$_instance->_dependency_map[ $class ] = array(); |
|
| 208 | - } |
|
| 209 | - // we need to make sure that any aliases used when registering a dependency |
|
| 210 | - // get resolved to the correct class name |
|
| 211 | - foreach ($dependencies as $dependency => $load_source) { |
|
| 212 | - $alias = self::$_instance->getFqnForAlias($dependency); |
|
| 213 | - if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES |
|
| 214 | - || ! isset(self::$_instance->_dependency_map[ $class ][ $alias ]) |
|
| 215 | - ) { |
|
| 216 | - unset($dependencies[ $dependency ]); |
|
| 217 | - $dependencies[ $alias ] = $load_source; |
|
| 218 | - $registered = true; |
|
| 219 | - } |
|
| 220 | - } |
|
| 221 | - // now add our two lists of dependencies together. |
|
| 222 | - // using Union (+=) favours the arrays in precedence from left to right, |
|
| 223 | - // so $dependencies is NOT overwritten because it is listed first |
|
| 224 | - // ie: with A = B + C, entries in B take precedence over duplicate entries in C |
|
| 225 | - // Union is way faster than array_merge() but should be used with caution... |
|
| 226 | - // especially with numerically indexed arrays |
|
| 227 | - $dependencies += self::$_instance->_dependency_map[ $class ]; |
|
| 228 | - // now we need to ensure that the resulting dependencies |
|
| 229 | - // array only has the entries that are required for the class |
|
| 230 | - // so first count how many dependencies were originally registered for the class |
|
| 231 | - $dependency_count = count(self::$_instance->_dependency_map[ $class ]); |
|
| 232 | - // if that count is non-zero (meaning dependencies were already registered) |
|
| 233 | - self::$_instance->_dependency_map[ $class ] = $dependency_count |
|
| 234 | - // then truncate the final array to match that count |
|
| 235 | - ? array_slice($dependencies, 0, $dependency_count) |
|
| 236 | - // otherwise just take the incoming array because nothing previously existed |
|
| 237 | - : $dependencies; |
|
| 238 | - return $registered; |
|
| 239 | - } |
|
| 240 | - |
|
| 241 | - |
|
| 242 | - /** |
|
| 243 | - * @param string $class_name |
|
| 244 | - * @param string $loader |
|
| 245 | - * @return bool |
|
| 246 | - * @throws DomainException |
|
| 247 | - */ |
|
| 248 | - public static function register_class_loader($class_name, $loader = 'load_core') |
|
| 249 | - { |
|
| 250 | - if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) { |
|
| 251 | - throw new DomainException( |
|
| 252 | - esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso') |
|
| 253 | - ); |
|
| 254 | - } |
|
| 255 | - // check that loader is callable or method starts with "load_" and exists in EE_Registry |
|
| 256 | - if (! is_callable($loader) |
|
| 257 | - && ( |
|
| 258 | - strpos($loader, 'load_') !== 0 |
|
| 259 | - || ! method_exists('EE_Registry', $loader) |
|
| 260 | - ) |
|
| 261 | - ) { |
|
| 262 | - throw new DomainException( |
|
| 263 | - sprintf( |
|
| 264 | - esc_html__( |
|
| 265 | - '"%1$s" is not a valid loader method on EE_Registry.', |
|
| 266 | - 'event_espresso' |
|
| 267 | - ), |
|
| 268 | - $loader |
|
| 269 | - ) |
|
| 270 | - ); |
|
| 271 | - } |
|
| 272 | - $class_name = self::$_instance->getFqnForAlias($class_name); |
|
| 273 | - if (! isset(self::$_instance->_class_loaders[ $class_name ])) { |
|
| 274 | - self::$_instance->_class_loaders[ $class_name ] = $loader; |
|
| 275 | - return true; |
|
| 276 | - } |
|
| 277 | - return false; |
|
| 278 | - } |
|
| 279 | - |
|
| 280 | - |
|
| 281 | - /** |
|
| 282 | - * @return array |
|
| 283 | - */ |
|
| 284 | - public function dependency_map() |
|
| 285 | - { |
|
| 286 | - return $this->_dependency_map; |
|
| 287 | - } |
|
| 288 | - |
|
| 289 | - |
|
| 290 | - /** |
|
| 291 | - * returns TRUE if dependency map contains a listing for the provided class name |
|
| 292 | - * |
|
| 293 | - * @param string $class_name |
|
| 294 | - * @return boolean |
|
| 295 | - */ |
|
| 296 | - public function has($class_name = '') |
|
| 297 | - { |
|
| 298 | - // all legacy models have the same dependencies |
|
| 299 | - if (strpos($class_name, 'EEM_') === 0) { |
|
| 300 | - $class_name = 'LEGACY_MODELS'; |
|
| 301 | - } |
|
| 302 | - return isset($this->_dependency_map[ $class_name ]) ? true : false; |
|
| 303 | - } |
|
| 304 | - |
|
| 305 | - |
|
| 306 | - /** |
|
| 307 | - * returns TRUE if dependency map contains a listing for the provided class name AND dependency |
|
| 308 | - * |
|
| 309 | - * @param string $class_name |
|
| 310 | - * @param string $dependency |
|
| 311 | - * @return bool |
|
| 312 | - */ |
|
| 313 | - public function has_dependency_for_class($class_name = '', $dependency = '') |
|
| 314 | - { |
|
| 315 | - // all legacy models have the same dependencies |
|
| 316 | - if (strpos($class_name, 'EEM_') === 0) { |
|
| 317 | - $class_name = 'LEGACY_MODELS'; |
|
| 318 | - } |
|
| 319 | - $dependency = $this->getFqnForAlias($dependency, $class_name); |
|
| 320 | - return isset($this->_dependency_map[ $class_name ][ $dependency ]) |
|
| 321 | - ? true |
|
| 322 | - : false; |
|
| 323 | - } |
|
| 324 | - |
|
| 325 | - |
|
| 326 | - /** |
|
| 327 | - * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned |
|
| 328 | - * |
|
| 329 | - * @param string $class_name |
|
| 330 | - * @param string $dependency |
|
| 331 | - * @return int |
|
| 332 | - */ |
|
| 333 | - public function loading_strategy_for_class_dependency($class_name = '', $dependency = '') |
|
| 334 | - { |
|
| 335 | - // all legacy models have the same dependencies |
|
| 336 | - if (strpos($class_name, 'EEM_') === 0) { |
|
| 337 | - $class_name = 'LEGACY_MODELS'; |
|
| 338 | - } |
|
| 339 | - $dependency = $this->getFqnForAlias($dependency); |
|
| 340 | - return $this->has_dependency_for_class($class_name, $dependency) |
|
| 341 | - ? $this->_dependency_map[ $class_name ][ $dependency ] |
|
| 342 | - : EE_Dependency_Map::not_registered; |
|
| 343 | - } |
|
| 344 | - |
|
| 345 | - |
|
| 346 | - /** |
|
| 347 | - * @param string $class_name |
|
| 348 | - * @return string | Closure |
|
| 349 | - */ |
|
| 350 | - public function class_loader($class_name) |
|
| 351 | - { |
|
| 352 | - // all legacy models use load_model() |
|
| 353 | - if (strpos($class_name, 'EEM_') === 0) { |
|
| 354 | - return 'load_model'; |
|
| 355 | - } |
|
| 356 | - // EE_CPT_*_Strategy classes like EE_CPT_Event_Strategy, EE_CPT_Venue_Strategy, etc |
|
| 357 | - // perform strpos() first to avoid loading regex every time we load a class |
|
| 358 | - if (strpos($class_name, 'EE_CPT_') === 0 |
|
| 359 | - && preg_match('/^EE_CPT_([a-zA-Z]+)_Strategy$/', $class_name) |
|
| 360 | - ) { |
|
| 361 | - return 'load_core'; |
|
| 362 | - } |
|
| 363 | - $class_name = $this->getFqnForAlias($class_name); |
|
| 364 | - return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : ''; |
|
| 365 | - } |
|
| 366 | - |
|
| 367 | - |
|
| 368 | - /** |
|
| 369 | - * @return array |
|
| 370 | - */ |
|
| 371 | - public function class_loaders() |
|
| 372 | - { |
|
| 373 | - return $this->_class_loaders; |
|
| 374 | - } |
|
| 375 | - |
|
| 376 | - |
|
| 377 | - /** |
|
| 378 | - * adds an alias for a classname |
|
| 379 | - * |
|
| 380 | - * @param string $fqcn the class name that should be used (concrete class to replace interface) |
|
| 381 | - * @param string $alias the class name that would be type hinted for (abstract parent or interface) |
|
| 382 | - * @param string $for_class the class that has the dependency (is type hinting for the interface) |
|
| 383 | - */ |
|
| 384 | - public function add_alias($fqcn, $alias, $for_class = '') |
|
| 385 | - { |
|
| 386 | - $this->class_cache->addAlias($fqcn, $alias, $for_class); |
|
| 387 | - } |
|
| 388 | - |
|
| 389 | - |
|
| 390 | - /** |
|
| 391 | - * Returns TRUE if the provided fully qualified name IS an alias |
|
| 392 | - * WHY? |
|
| 393 | - * Because if a class is type hinting for a concretion, |
|
| 394 | - * then why would we need to find another class to supply it? |
|
| 395 | - * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`, |
|
| 396 | - * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`. |
|
| 397 | - * Don't go looking for some substitute. |
|
| 398 | - * Whereas if a class is type hinting for an interface... |
|
| 399 | - * then we need to find an actual class to use. |
|
| 400 | - * So the interface IS the alias for some other FQN, |
|
| 401 | - * and we need to find out if `Fully/Qualified/Namespace/SomeInterface` |
|
| 402 | - * represents some other class. |
|
| 403 | - * |
|
| 404 | - * @param string $fqn |
|
| 405 | - * @param string $for_class |
|
| 406 | - * @return bool |
|
| 407 | - */ |
|
| 408 | - public function isAlias($fqn = '', $for_class = '') |
|
| 409 | - { |
|
| 410 | - return $this->class_cache->isAlias($fqn, $for_class); |
|
| 411 | - } |
|
| 412 | - |
|
| 413 | - |
|
| 414 | - /** |
|
| 415 | - * Returns a FQN for provided alias if one exists, otherwise returns the original $alias |
|
| 416 | - * functions recursively, so that multiple aliases can be used to drill down to a FQN |
|
| 417 | - * for example: |
|
| 418 | - * if the following two entries were added to the _aliases array: |
|
| 419 | - * array( |
|
| 420 | - * 'interface_alias' => 'some\namespace\interface' |
|
| 421 | - * 'some\namespace\interface' => 'some\namespace\classname' |
|
| 422 | - * ) |
|
| 423 | - * then one could use EE_Registry::instance()->create( 'interface_alias' ) |
|
| 424 | - * to load an instance of 'some\namespace\classname' |
|
| 425 | - * |
|
| 426 | - * @param string $alias |
|
| 427 | - * @param string $for_class |
|
| 428 | - * @return string |
|
| 429 | - */ |
|
| 430 | - public function getFqnForAlias($alias = '', $for_class = '') |
|
| 431 | - { |
|
| 432 | - return (string) $this->class_cache->getFqnForAlias($alias, $for_class); |
|
| 433 | - } |
|
| 434 | - |
|
| 435 | - |
|
| 436 | - /** |
|
| 437 | - * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache, |
|
| 438 | - * if one exists, or whether a new object should be generated every time the requested class is loaded. |
|
| 439 | - * This is done by using the following class constants: |
|
| 440 | - * EE_Dependency_Map::load_from_cache - loads previously instantiated object |
|
| 441 | - * EE_Dependency_Map::load_new_object - generates a new object every time |
|
| 442 | - */ |
|
| 443 | - protected function _register_core_dependencies() |
|
| 444 | - { |
|
| 445 | - $this->_dependency_map = array( |
|
| 446 | - 'EE_Request_Handler' => array( |
|
| 447 | - 'EE_Request' => EE_Dependency_Map::load_from_cache, |
|
| 448 | - ), |
|
| 449 | - 'EE_System' => array( |
|
| 450 | - 'EE_Registry' => EE_Dependency_Map::load_from_cache, |
|
| 451 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 452 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 453 | - 'EE_Maintenance_Mode' => EE_Dependency_Map::load_from_cache, |
|
| 454 | - ), |
|
| 455 | - 'EE_Session' => array( |
|
| 456 | - 'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache, |
|
| 457 | - 'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache, |
|
| 458 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 459 | - 'EventEspresso\core\services\session\SessionStartHandler' => EE_Dependency_Map::load_from_cache, |
|
| 460 | - 'EE_Encryption' => EE_Dependency_Map::load_from_cache, |
|
| 461 | - ), |
|
| 462 | - 'EE_Cart' => array( |
|
| 463 | - 'EE_Session' => EE_Dependency_Map::load_from_cache, |
|
| 464 | - ), |
|
| 465 | - 'EE_Front_Controller' => array( |
|
| 466 | - 'EE_Registry' => EE_Dependency_Map::load_from_cache, |
|
| 467 | - 'EE_Request_Handler' => EE_Dependency_Map::load_from_cache, |
|
| 468 | - 'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache, |
|
| 469 | - ), |
|
| 470 | - 'EE_Messenger_Collection_Loader' => array( |
|
| 471 | - 'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object, |
|
| 472 | - ), |
|
| 473 | - 'EE_Message_Type_Collection_Loader' => array( |
|
| 474 | - 'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object, |
|
| 475 | - ), |
|
| 476 | - 'EE_Message_Resource_Manager' => array( |
|
| 477 | - 'EE_Messenger_Collection_Loader' => EE_Dependency_Map::load_new_object, |
|
| 478 | - 'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object, |
|
| 479 | - 'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache, |
|
| 480 | - ), |
|
| 481 | - 'EE_Message_Factory' => array( |
|
| 482 | - 'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache, |
|
| 483 | - ), |
|
| 484 | - 'EE_messages' => array( |
|
| 485 | - 'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache, |
|
| 486 | - ), |
|
| 487 | - 'EE_Messages_Generator' => array( |
|
| 488 | - 'EE_Messages_Queue' => EE_Dependency_Map::load_new_object, |
|
| 489 | - 'EE_Messages_Data_Handler_Collection' => EE_Dependency_Map::load_new_object, |
|
| 490 | - 'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object, |
|
| 491 | - 'EEH_Parse_Shortcodes' => EE_Dependency_Map::load_from_cache, |
|
| 492 | - ), |
|
| 493 | - 'EE_Messages_Processor' => array( |
|
| 494 | - 'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache, |
|
| 495 | - ), |
|
| 496 | - 'EE_Messages_Queue' => array( |
|
| 497 | - 'EE_Message_Repository' => EE_Dependency_Map::load_new_object, |
|
| 498 | - ), |
|
| 499 | - 'EE_Messages_Template_Defaults' => array( |
|
| 500 | - 'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache, |
|
| 501 | - 'EEM_Message_Template' => EE_Dependency_Map::load_from_cache, |
|
| 502 | - ), |
|
| 503 | - 'EE_Message_To_Generate_From_Request' => array( |
|
| 504 | - 'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache, |
|
| 505 | - 'EE_Request_Handler' => EE_Dependency_Map::load_from_cache, |
|
| 506 | - ), |
|
| 507 | - 'EventEspresso\core\services\commands\CommandBus' => array( |
|
| 508 | - 'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache, |
|
| 509 | - ), |
|
| 510 | - 'EventEspresso\services\commands\CommandHandler' => array( |
|
| 511 | - 'EE_Registry' => EE_Dependency_Map::load_from_cache, |
|
| 512 | - 'CommandBusInterface' => EE_Dependency_Map::load_from_cache, |
|
| 513 | - ), |
|
| 514 | - 'EventEspresso\core\services\commands\CommandHandlerManager' => array( |
|
| 515 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 516 | - ), |
|
| 517 | - 'EventEspresso\core\services\commands\CompositeCommandHandler' => array( |
|
| 518 | - 'EventEspresso\core\services\commands\CommandBus' => EE_Dependency_Map::load_from_cache, |
|
| 519 | - 'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache, |
|
| 520 | - ), |
|
| 521 | - 'EventEspresso\core\services\commands\CommandFactory' => array( |
|
| 522 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 523 | - ), |
|
| 524 | - 'EventEspresso\core\services\commands\middleware\CapChecker' => array( |
|
| 525 | - 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache, |
|
| 526 | - ), |
|
| 527 | - 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => array( |
|
| 528 | - 'EE_Capabilities' => EE_Dependency_Map::load_from_cache, |
|
| 529 | - ), |
|
| 530 | - 'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker' => array( |
|
| 531 | - 'EE_Capabilities' => EE_Dependency_Map::load_from_cache, |
|
| 532 | - ), |
|
| 533 | - 'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler' => array( |
|
| 534 | - 'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache, |
|
| 535 | - ), |
|
| 536 | - 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler' => array( |
|
| 537 | - 'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache, |
|
| 538 | - ), |
|
| 539 | - 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler' => array( |
|
| 540 | - 'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache, |
|
| 541 | - ), |
|
| 542 | - 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler' => array( |
|
| 543 | - 'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache, |
|
| 544 | - ), |
|
| 545 | - 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array( |
|
| 546 | - 'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache, |
|
| 547 | - ), |
|
| 548 | - 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler' => array( |
|
| 549 | - 'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache, |
|
| 550 | - ), |
|
| 551 | - 'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler' => array( |
|
| 552 | - 'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache, |
|
| 553 | - ), |
|
| 554 | - 'EventEspresso\core\domain\services\registration\CancelRegistrationService' => array( |
|
| 555 | - 'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache, |
|
| 556 | - ), |
|
| 557 | - 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler' => array( |
|
| 558 | - 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 559 | - ), |
|
| 560 | - 'EventEspresso\core\services\database\TableManager' => array( |
|
| 561 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 562 | - ), |
|
| 563 | - 'EE_Data_Migration_Class_Base' => array( |
|
| 564 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 565 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 566 | - ), |
|
| 567 | - 'EE_DMS_Core_4_1_0' => array( |
|
| 568 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 569 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 570 | - ), |
|
| 571 | - 'EE_DMS_Core_4_2_0' => array( |
|
| 572 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 573 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 574 | - ), |
|
| 575 | - 'EE_DMS_Core_4_3_0' => array( |
|
| 576 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 577 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 578 | - ), |
|
| 579 | - 'EE_DMS_Core_4_4_0' => array( |
|
| 580 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 581 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 582 | - ), |
|
| 583 | - 'EE_DMS_Core_4_5_0' => array( |
|
| 584 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 585 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 586 | - ), |
|
| 587 | - 'EE_DMS_Core_4_6_0' => array( |
|
| 588 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 589 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 590 | - ), |
|
| 591 | - 'EE_DMS_Core_4_7_0' => array( |
|
| 592 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 593 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 594 | - ), |
|
| 595 | - 'EE_DMS_Core_4_8_0' => array( |
|
| 596 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 597 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 598 | - ), |
|
| 599 | - 'EE_DMS_Core_4_9_0' => array( |
|
| 600 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 601 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 602 | - ), |
|
| 603 | - 'EE_DMS_Core_4_10_0' => array( |
|
| 604 | - 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 605 | - 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 606 | - 'EE_DMS_Core_4_9_0' => EE_Dependency_Map::load_from_cache, |
|
| 607 | - ), |
|
| 608 | - 'EventEspresso\core\services\assets\I18nRegistry' => array( |
|
| 609 | - array(), |
|
| 610 | - 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 611 | - ), |
|
| 612 | - 'EventEspresso\core\services\assets\Registry' => array( |
|
| 613 | - 'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache, |
|
| 614 | - 'EventEspresso\core\services\assets\I18nRegistry' => EE_Dependency_Map::load_from_cache, |
|
| 615 | - ), |
|
| 616 | - 'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled' => array( |
|
| 617 | - 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 618 | - ), |
|
| 619 | - 'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout' => array( |
|
| 620 | - 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 621 | - ), |
|
| 622 | - 'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees' => array( |
|
| 623 | - 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 624 | - ), |
|
| 625 | - 'EventEspresso\core\domain\entities\shortcodes\EspressoEvents' => array( |
|
| 626 | - 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 627 | - ), |
|
| 628 | - 'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou' => array( |
|
| 629 | - 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 630 | - ), |
|
| 631 | - 'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector' => array( |
|
| 632 | - 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 633 | - ), |
|
| 634 | - 'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage' => array( |
|
| 635 | - 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 636 | - ), |
|
| 637 | - 'EventEspresso\core\services\cache\BasicCacheManager' => array( |
|
| 638 | - 'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache, |
|
| 639 | - ), |
|
| 640 | - 'EventEspresso\core\services\cache\PostRelatedCacheManager' => array( |
|
| 641 | - 'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache, |
|
| 642 | - ), |
|
| 643 | - 'EventEspresso\core\domain\services\validation\email\EmailValidationService' => array( |
|
| 644 | - 'EE_Registration_Config' => EE_Dependency_Map::load_from_cache, |
|
| 645 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 646 | - ), |
|
| 647 | - 'EventEspresso\core\domain\values\EmailAddress' => array( |
|
| 648 | - null, |
|
| 649 | - 'EventEspresso\core\domain\services\validation\email\EmailValidationService' => EE_Dependency_Map::load_from_cache, |
|
| 650 | - ), |
|
| 651 | - 'EventEspresso\core\services\orm\ModelFieldFactory' => array( |
|
| 652 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 653 | - ), |
|
| 654 | - 'LEGACY_MODELS' => array( |
|
| 655 | - null, |
|
| 656 | - 'EventEspresso\core\services\database\ModelFieldFactory' => EE_Dependency_Map::load_from_cache, |
|
| 657 | - ), |
|
| 658 | - 'EE_Module_Request_Router' => array( |
|
| 659 | - 'EE_Request' => EE_Dependency_Map::load_from_cache, |
|
| 660 | - ), |
|
| 661 | - 'EE_Registration_Processor' => array( |
|
| 662 | - 'EE_Request' => EE_Dependency_Map::load_from_cache, |
|
| 663 | - ), |
|
| 664 | - 'EventEspresso\core\services\notifications\PersistentAdminNoticeManager' => array( |
|
| 665 | - null, |
|
| 666 | - 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache, |
|
| 667 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 668 | - ), |
|
| 669 | - 'EventEspresso\core\services\licensing\LicenseService' => array( |
|
| 670 | - 'EventEspresso\core\domain\services\pue\Stats' => EE_Dependency_Map::load_from_cache, |
|
| 671 | - 'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache, |
|
| 672 | - ), |
|
| 673 | - 'EE_Admin_Transactions_List_Table' => array( |
|
| 674 | - null, |
|
| 675 | - 'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache, |
|
| 676 | - ), |
|
| 677 | - 'EventEspresso\core\domain\services\pue\Stats' => array( |
|
| 678 | - 'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache, |
|
| 679 | - 'EE_Maintenance_Mode' => EE_Dependency_Map::load_from_cache, |
|
| 680 | - 'EventEspresso\core\domain\services\pue\StatsGatherer' => EE_Dependency_Map::load_from_cache, |
|
| 681 | - ), |
|
| 682 | - 'EventEspresso\core\domain\services\pue\Config' => array( |
|
| 683 | - 'EE_Network_Config' => EE_Dependency_Map::load_from_cache, |
|
| 684 | - 'EE_Config' => EE_Dependency_Map::load_from_cache, |
|
| 685 | - ), |
|
| 686 | - 'EventEspresso\core\domain\services\pue\StatsGatherer' => array( |
|
| 687 | - 'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache, |
|
| 688 | - 'EEM_Event' => EE_Dependency_Map::load_from_cache, |
|
| 689 | - 'EEM_Datetime' => EE_Dependency_Map::load_from_cache, |
|
| 690 | - 'EEM_Ticket' => EE_Dependency_Map::load_from_cache, |
|
| 691 | - 'EEM_Registration' => EE_Dependency_Map::load_from_cache, |
|
| 692 | - 'EEM_Transaction' => EE_Dependency_Map::load_from_cache, |
|
| 693 | - 'EE_Config' => EE_Dependency_Map::load_from_cache, |
|
| 694 | - ), |
|
| 695 | - 'EventEspresso\core\domain\services\admin\ExitModal' => array( |
|
| 696 | - 'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache, |
|
| 697 | - ), |
|
| 698 | - 'EventEspresso\core\domain\services\admin\PluginUpsells' => array( |
|
| 699 | - 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 700 | - ), |
|
| 701 | - 'EventEspresso\caffeinated\modules\recaptcha_invisible\InvisibleRecaptcha' => array( |
|
| 702 | - 'EE_Registration_Config' => EE_Dependency_Map::load_from_cache, |
|
| 703 | - 'EE_Session' => EE_Dependency_Map::load_from_cache, |
|
| 704 | - ), |
|
| 705 | - 'EventEspresso\caffeinated\modules\recaptcha_invisible\RecaptchaAdminSettings' => array( |
|
| 706 | - 'EE_Registration_Config' => EE_Dependency_Map::load_from_cache, |
|
| 707 | - ), |
|
| 708 | - 'EventEspresso\modules\ticket_selector\ProcessTicketSelector' => array( |
|
| 709 | - 'EE_Core_Config' => EE_Dependency_Map::load_from_cache, |
|
| 710 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 711 | - 'EE_Session' => EE_Dependency_Map::load_from_cache, |
|
| 712 | - 'EEM_Ticket' => EE_Dependency_Map::load_from_cache, |
|
| 713 | - 'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => EE_Dependency_Map::load_from_cache, |
|
| 714 | - ), |
|
| 715 | - 'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => array( |
|
| 716 | - 'EEM_Datetime' => EE_Dependency_Map::load_from_cache, |
|
| 717 | - ), |
|
| 718 | - 'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => array( |
|
| 719 | - 'EE_Core_Config' => EE_Dependency_Map::load_from_cache, |
|
| 720 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 721 | - ), |
|
| 722 | - 'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes' => array( |
|
| 723 | - 'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache, |
|
| 724 | - ), |
|
| 725 | - 'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies' => array( |
|
| 726 | - 'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache, |
|
| 727 | - ), |
|
| 728 | - 'EE_CPT_Strategy' => array( |
|
| 729 | - 'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache, |
|
| 730 | - 'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache, |
|
| 731 | - ), |
|
| 732 | - 'EventEspresso\core\services\loaders\ObjectIdentifier' => array( |
|
| 733 | - 'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache, |
|
| 734 | - ), |
|
| 735 | - 'EventEspresso\core\domain\services\assets\CoreAssetManager' => array( |
|
| 736 | - 'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache, |
|
| 737 | - 'EE_Currency_Config' => EE_Dependency_Map::load_from_cache, |
|
| 738 | - 'EE_Template_Config' => EE_Dependency_Map::load_from_cache, |
|
| 739 | - 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 740 | - 'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache, |
|
| 741 | - ), |
|
| 742 | - 'EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy' => array( |
|
| 743 | - 'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache, |
|
| 744 | - 'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache |
|
| 745 | - ), |
|
| 746 | - 'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendee' => array( |
|
| 747 | - 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 748 | - ), |
|
| 749 | - 'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendeeBillingData' => array( |
|
| 750 | - 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 751 | - 'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache |
|
| 752 | - ), |
|
| 753 | - 'EventEspresso\core\domain\services\admin\privacy\export\ExportCheckins' => array( |
|
| 754 | - 'EEM_Checkin' => EE_Dependency_Map::load_from_cache, |
|
| 755 | - ), |
|
| 756 | - 'EventEspresso\core\domain\services\admin\privacy\export\ExportRegistration' => array( |
|
| 757 | - 'EEM_Registration' => EE_Dependency_Map::load_from_cache, |
|
| 758 | - ), |
|
| 759 | - 'EventEspresso\core\domain\services\admin\privacy\export\ExportTransaction' => array( |
|
| 760 | - 'EEM_Transaction' => EE_Dependency_Map::load_from_cache, |
|
| 761 | - ), |
|
| 762 | - 'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAttendeeData' => array( |
|
| 763 | - 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 764 | - ), |
|
| 765 | - 'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAnswers' => array( |
|
| 766 | - 'EEM_Answer' => EE_Dependency_Map::load_from_cache, |
|
| 767 | - 'EEM_Question' => EE_Dependency_Map::load_from_cache, |
|
| 768 | - ), |
|
| 769 | - 'EventEspresso\core\CPTs\CptQueryModifier' => array( |
|
| 770 | - null, |
|
| 771 | - null, |
|
| 772 | - null, |
|
| 773 | - 'EE_Request_Handler' => EE_Dependency_Map::load_from_cache, |
|
| 774 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 775 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 776 | - ), |
|
| 777 | - 'EventEspresso\core\domain\services\admin\privacy\forms\PrivacySettingsFormHandler' => array( |
|
| 778 | - 'EE_Registry' => EE_Dependency_Map::load_from_cache, |
|
| 779 | - 'EE_Config' => EE_Dependency_Map::load_from_cache |
|
| 780 | - ), |
|
| 781 | - 'EventEspresso\core\services\editor\BlockRegistrationManager' => array( |
|
| 782 | - 'EventEspresso\core\services\assets\BlockAssetManagerCollection' => EE_Dependency_Map::load_from_cache, |
|
| 783 | - 'EventEspresso\core\domain\entities\editor\BlockCollection' => EE_Dependency_Map::load_from_cache, |
|
| 784 | - 'EventEspresso\core\services\route_match\RouteMatchSpecificationManager' => EE_Dependency_Map::load_from_cache, |
|
| 785 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 786 | - ), |
|
| 787 | - 'EventEspresso\core\domain\entities\editor\CoreBlocksAssetManager' => array( |
|
| 788 | - 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 789 | - 'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache, |
|
| 790 | - 'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache, |
|
| 791 | - ), |
|
| 792 | - 'EventEspresso\core\domain\services\blocks\EventAttendeesBlockRenderer' => array( |
|
| 793 | - 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 794 | - 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 795 | - ), |
|
| 796 | - 'EventEspresso\core\domain\entities\editor\blocks\EventAttendees' => array( |
|
| 797 | - 'EventEspresso\core\domain\entities\editor\CoreBlocksAssetManager' => self::load_from_cache, |
|
| 798 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 799 | - 'EventEspresso\core\domain\services\blocks\EventAttendeesBlockRenderer' => self::load_from_cache, |
|
| 800 | - ), |
|
| 801 | - 'EventEspresso\core\services\route_match\RouteMatchSpecificationDependencyResolver' => array( |
|
| 802 | - 'EventEspresso\core\services\container\Mirror' => EE_Dependency_Map::load_from_cache, |
|
| 803 | - 'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache, |
|
| 804 | - 'EE_Dependency_Map' => EE_Dependency_Map::load_from_cache, |
|
| 805 | - ), |
|
| 806 | - 'EventEspresso\core\services\route_match\RouteMatchSpecificationFactory' => array( |
|
| 807 | - 'EventEspresso\core\services\route_match\RouteMatchSpecificationDependencyResolver' => EE_Dependency_Map::load_from_cache, |
|
| 808 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 809 | - ), |
|
| 810 | - 'EventEspresso\core\services\route_match\RouteMatchSpecificationManager' => array( |
|
| 811 | - 'EventEspresso\core\services\route_match\RouteMatchSpecificationCollection' => EE_Dependency_Map::load_from_cache, |
|
| 812 | - 'EventEspresso\core\services\route_match\RouteMatchSpecificationFactory' => EE_Dependency_Map::load_from_cache, |
|
| 813 | - ), |
|
| 814 | - 'EventEspresso\core\libraries\rest_api\CalculatedModelFields' => array( |
|
| 815 | - 'EventEspresso\core\libraries\rest_api\calculations\CalculatedModelFieldsFactory' => EE_Dependency_Map::load_from_cache |
|
| 816 | - ), |
|
| 817 | - 'EventEspresso\core\libraries\rest_api\calculations\CalculatedModelFieldsFactory' => array( |
|
| 818 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 819 | - ), |
|
| 820 | - 'EventEspresso\core\libraries\rest_api\controllers\model\Read' => array( |
|
| 821 | - 'EventEspresso\core\libraries\rest_api\CalculatedModelFields' => EE_Dependency_Map::load_from_cache |
|
| 822 | - ), |
|
| 823 | - 'EventEspresso\core\libraries\rest_api\calculations\Datetime' => array( |
|
| 824 | - 'EEM_Datetime' => EE_Dependency_Map::load_from_cache, |
|
| 825 | - 'EEM_Registration' => EE_Dependency_Map::load_from_cache |
|
| 826 | - ), |
|
| 827 | - 'EventEspresso\core\libraries\rest_api\calculations\Event' => array( |
|
| 828 | - 'EEM_Event' => EE_Dependency_Map::load_from_cache, |
|
| 829 | - 'EEM_Registration' => EE_Dependency_Map::load_from_cache |
|
| 830 | - ), |
|
| 831 | - 'EventEspresso\core\libraries\rest_api\calculations\Registration' => array( |
|
| 832 | - 'EEM_Registration' => EE_Dependency_Map::load_from_cache |
|
| 833 | - ), |
|
| 834 | - 'EventEspresso\core\services\session\SessionStartHandler' => array( |
|
| 835 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 836 | - ), |
|
| 837 | - 'EE_URL_Validation_Strategy' => array( |
|
| 838 | - null, |
|
| 839 | - null, |
|
| 840 | - 'EventEspresso\core\services\validators\URLValidator' => EE_Dependency_Map::load_from_cache |
|
| 841 | - ), |
|
| 842 | - 'EventEspresso\admin_pages\general_settings\OrganizationSettings' => array( |
|
| 843 | - 'EE_Registry' => EE_Dependency_Map::load_from_cache, |
|
| 844 | - 'EE_Organization_Config' => EE_Dependency_Map::load_from_cache, |
|
| 845 | - 'EE_Core_Config' => EE_Dependency_Map::load_from_cache, |
|
| 846 | - 'EE_Network_Core_Config' => EE_Dependency_Map::load_from_cache, |
|
| 847 | - 'EventEspresso\core\services\address\CountrySubRegionDao' => EE_Dependency_Map::load_from_cache, |
|
| 848 | - ), |
|
| 849 | - 'EventEspresso\core\services\address\CountrySubRegionDao' => array( |
|
| 850 | - 'EEM_State' => EE_Dependency_Map::load_from_cache, |
|
| 851 | - 'EventEspresso\core\services\validators\JsonValidator' => EE_Dependency_Map::load_from_cache |
|
| 852 | - ), |
|
| 853 | - 'EventEspresso\core\domain\services\admin\ajax\WordpressHeartbeat' => array( |
|
| 854 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 855 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 856 | - ), |
|
| 857 | - 'EventEspresso\core\domain\services\admin\ajax\EventEditorHeartbeat' => array( |
|
| 858 | - 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 859 | - 'EE_Environment_Config' => EE_Dependency_Map::load_from_cache, |
|
| 860 | - ), |
|
| 861 | - 'EventEspresso\core\services\request\files\FilesDataHandler' => array( |
|
| 862 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 863 | - ), |
|
| 864 | - 'EventEspressoBatchRequest\BatchRequestProcessor' => [ |
|
| 865 | - 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 866 | - ], |
|
| 867 | - 'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder' => [ |
|
| 868 | - null, |
|
| 869 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 870 | - 'EEM_Registration' => EE_Dependency_Map::load_from_cache, |
|
| 871 | - ], |
|
| 872 | - 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\AttendeeFilterHeader' => [ |
|
| 873 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 874 | - 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 875 | - ], |
|
| 876 | - 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\DateFilterHeader' => [ |
|
| 877 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 878 | - 'EEM_Datetime' => EE_Dependency_Map::load_from_cache, |
|
| 879 | - ], |
|
| 880 | - 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\EventFilterHeader' => [ |
|
| 881 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 882 | - 'EEM_Event' => EE_Dependency_Map::load_from_cache, |
|
| 883 | - ], |
|
| 884 | - 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\TicketFilterHeader' => [ |
|
| 885 | - 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 886 | - 'EEM_Ticket' => EE_Dependency_Map::load_from_cache, |
|
| 887 | - ], |
|
| 888 | - 'EventEspresso\core\domain\services\converters\RestApiSpoofer' => [ |
|
| 889 | - 'WP_REST_Server' => EE_Dependency_Map::load_from_cache, |
|
| 890 | - 'EED_Core_Rest_Api' => EE_Dependency_Map::load_from_cache, |
|
| 891 | - 'EventEspresso\core\libraries\rest_api\controllers\model\Read' => EE_Dependency_Map::load_from_cache, |
|
| 892 | - null |
|
| 893 | - ], |
|
| 894 | - 'EventEspresso\core\domain\services\admin\events\default_settings\AdvancedEditorAdminFormSection' => [ |
|
| 895 | - 'EE_Admin_Config' => EE_Dependency_Map::load_from_cache |
|
| 896 | - ], |
|
| 897 | - 'EventEspresso\core\domain\services\admin\events\editor\AdvancedEditorEntityData' => [ |
|
| 898 | - 'EventEspresso\core\domain\services\converters\RestApiSpoofer' => EE_Dependency_Map::load_from_cache, |
|
| 899 | - 'EE_Admin_Config' => EE_Dependency_Map::load_from_cache, |
|
| 900 | - 'EEM_Datetime' => EE_Dependency_Map::load_from_cache, |
|
| 901 | - 'EEM_Event' => EE_Dependency_Map::load_from_cache, |
|
| 902 | - 'EEM_Price' => EE_Dependency_Map::load_from_cache, |
|
| 903 | - 'EEM_Price_Type' => EE_Dependency_Map::load_from_cache, |
|
| 904 | - 'EEM_Ticket' => EE_Dependency_Map::load_from_cache, |
|
| 905 | - 'EEM_Venue' => EE_Dependency_Map::load_from_cache, |
|
| 906 | - ], |
|
| 907 | - ); |
|
| 908 | - } |
|
| 909 | - |
|
| 910 | - |
|
| 911 | - /** |
|
| 912 | - * Registers how core classes are loaded. |
|
| 913 | - * This can either be done by simply providing the name of one of the EE_Registry loader methods such as: |
|
| 914 | - * 'EE_Request_Handler' => 'load_core' |
|
| 915 | - * 'EE_Messages_Queue' => 'load_lib' |
|
| 916 | - * 'EEH_Debug_Tools' => 'load_helper' |
|
| 917 | - * or, if greater control is required, by providing a custom closure. For example: |
|
| 918 | - * 'Some_Class' => function () { |
|
| 919 | - * return new Some_Class(); |
|
| 920 | - * }, |
|
| 921 | - * This is required for instantiating dependencies |
|
| 922 | - * where an interface has been type hinted in a class constructor. For example: |
|
| 923 | - * 'Required_Interface' => function () { |
|
| 924 | - * return new A_Class_That_Implements_Required_Interface(); |
|
| 925 | - * }, |
|
| 926 | - */ |
|
| 927 | - protected function _register_core_class_loaders() |
|
| 928 | - { |
|
| 929 | - $this->_class_loaders = array( |
|
| 930 | - // load_core |
|
| 931 | - 'EE_Dependency_Map' => function () { |
|
| 932 | - return $this; |
|
| 933 | - }, |
|
| 934 | - 'EE_Capabilities' => 'load_core', |
|
| 935 | - 'EE_Encryption' => 'load_core', |
|
| 936 | - 'EE_Front_Controller' => 'load_core', |
|
| 937 | - 'EE_Module_Request_Router' => 'load_core', |
|
| 938 | - 'EE_Registry' => 'load_core', |
|
| 939 | - 'EE_Request' => function () { |
|
| 940 | - return $this->legacy_request; |
|
| 941 | - }, |
|
| 942 | - 'EventEspresso\core\services\request\Request' => function () { |
|
| 943 | - return $this->request; |
|
| 944 | - }, |
|
| 945 | - 'EventEspresso\core\services\request\Response' => function () { |
|
| 946 | - return $this->response; |
|
| 947 | - }, |
|
| 948 | - 'EE_Base' => 'load_core', |
|
| 949 | - 'EE_Request_Handler' => 'load_core', |
|
| 950 | - 'EE_Session' => 'load_core', |
|
| 951 | - 'EE_Cron_Tasks' => 'load_core', |
|
| 952 | - 'EE_System' => 'load_core', |
|
| 953 | - 'EE_Maintenance_Mode' => 'load_core', |
|
| 954 | - 'EE_Register_CPTs' => 'load_core', |
|
| 955 | - 'EE_Admin' => 'load_core', |
|
| 956 | - 'EE_CPT_Strategy' => 'load_core', |
|
| 957 | - // load_class |
|
| 958 | - 'EE_Registration_Processor' => 'load_class', |
|
| 959 | - // load_lib |
|
| 960 | - 'EE_Message_Resource_Manager' => 'load_lib', |
|
| 961 | - 'EE_Message_Type_Collection' => 'load_lib', |
|
| 962 | - 'EE_Message_Type_Collection_Loader' => 'load_lib', |
|
| 963 | - 'EE_Messenger_Collection' => 'load_lib', |
|
| 964 | - 'EE_Messenger_Collection_Loader' => 'load_lib', |
|
| 965 | - 'EE_Messages_Processor' => 'load_lib', |
|
| 966 | - 'EE_Message_Repository' => 'load_lib', |
|
| 967 | - 'EE_Messages_Queue' => 'load_lib', |
|
| 968 | - 'EE_Messages_Data_Handler_Collection' => 'load_lib', |
|
| 969 | - 'EE_Message_Template_Group_Collection' => 'load_lib', |
|
| 970 | - 'EE_Payment_Method_Manager' => 'load_lib', |
|
| 971 | - 'EE_DMS_Core_4_1_0' => 'load_dms', |
|
| 972 | - 'EE_DMS_Core_4_2_0' => 'load_dms', |
|
| 973 | - 'EE_DMS_Core_4_3_0' => 'load_dms', |
|
| 974 | - 'EE_DMS_Core_4_5_0' => 'load_dms', |
|
| 975 | - 'EE_DMS_Core_4_6_0' => 'load_dms', |
|
| 976 | - 'EE_DMS_Core_4_7_0' => 'load_dms', |
|
| 977 | - 'EE_DMS_Core_4_8_0' => 'load_dms', |
|
| 978 | - 'EE_DMS_Core_4_9_0' => 'load_dms', |
|
| 979 | - 'EE_DMS_Core_4_10_0' => 'load_dms', |
|
| 980 | - 'EE_Messages_Generator' => function () { |
|
| 981 | - return EE_Registry::instance()->load_lib( |
|
| 982 | - 'Messages_Generator', |
|
| 983 | - array(), |
|
| 984 | - false, |
|
| 985 | - false |
|
| 986 | - ); |
|
| 987 | - }, |
|
| 988 | - 'EE_Messages_Template_Defaults' => function ($arguments = array()) { |
|
| 989 | - return EE_Registry::instance()->load_lib( |
|
| 990 | - 'Messages_Template_Defaults', |
|
| 991 | - $arguments, |
|
| 992 | - false, |
|
| 993 | - false |
|
| 994 | - ); |
|
| 995 | - }, |
|
| 996 | - // load_helper |
|
| 997 | - 'EEH_Parse_Shortcodes' => function () { |
|
| 998 | - if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) { |
|
| 999 | - return new EEH_Parse_Shortcodes(); |
|
| 1000 | - } |
|
| 1001 | - return null; |
|
| 1002 | - }, |
|
| 1003 | - 'EE_Template_Config' => function () { |
|
| 1004 | - return EE_Config::instance()->template_settings; |
|
| 1005 | - }, |
|
| 1006 | - 'EE_Currency_Config' => function () { |
|
| 1007 | - return EE_Config::instance()->currency; |
|
| 1008 | - }, |
|
| 1009 | - 'EE_Registration_Config' => function () { |
|
| 1010 | - return EE_Config::instance()->registration; |
|
| 1011 | - }, |
|
| 1012 | - 'EE_Core_Config' => function () { |
|
| 1013 | - return EE_Config::instance()->core; |
|
| 1014 | - }, |
|
| 1015 | - 'EventEspresso\core\services\loaders\Loader' => function () { |
|
| 1016 | - return LoaderFactory::getLoader(); |
|
| 1017 | - }, |
|
| 1018 | - 'EE_Network_Config' => function () { |
|
| 1019 | - return EE_Network_Config::instance(); |
|
| 1020 | - }, |
|
| 1021 | - 'EE_Config' => function () { |
|
| 1022 | - return EE_Config::instance(); |
|
| 1023 | - }, |
|
| 1024 | - 'EventEspresso\core\domain\Domain' => function () { |
|
| 1025 | - return DomainFactory::getEventEspressoCoreDomain(); |
|
| 1026 | - }, |
|
| 1027 | - 'EE_Admin_Config' => function () { |
|
| 1028 | - return EE_Config::instance()->admin; |
|
| 1029 | - }, |
|
| 1030 | - 'EE_Organization_Config' => function () { |
|
| 1031 | - return EE_Config::instance()->organization; |
|
| 1032 | - }, |
|
| 1033 | - 'EE_Network_Core_Config' => function () { |
|
| 1034 | - return EE_Network_Config::instance()->core; |
|
| 1035 | - }, |
|
| 1036 | - 'EE_Environment_Config' => function () { |
|
| 1037 | - return EE_Config::instance()->environment; |
|
| 1038 | - }, |
|
| 1039 | - 'EED_Core_Rest_Api' => static function () { |
|
| 1040 | - return EED_Core_Rest_Api::instance(); |
|
| 1041 | - }, |
|
| 1042 | - ); |
|
| 1043 | - } |
|
| 1044 | - |
|
| 1045 | - |
|
| 1046 | - /** |
|
| 1047 | - * can be used for supplying alternate names for classes, |
|
| 1048 | - * or for connecting interface names to instantiable classes |
|
| 1049 | - */ |
|
| 1050 | - protected function _register_core_aliases() |
|
| 1051 | - { |
|
| 1052 | - $aliases = array( |
|
| 1053 | - 'CommandBusInterface' => 'EventEspresso\core\services\commands\CommandBusInterface', |
|
| 1054 | - 'EventEspresso\core\services\commands\CommandBusInterface' => 'EventEspresso\core\services\commands\CommandBus', |
|
| 1055 | - 'CommandHandlerManagerInterface' => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface', |
|
| 1056 | - 'EventEspresso\core\services\commands\CommandHandlerManagerInterface' => 'EventEspresso\core\services\commands\CommandHandlerManager', |
|
| 1057 | - 'CapChecker' => 'EventEspresso\core\services\commands\middleware\CapChecker', |
|
| 1058 | - 'AddActionHook' => 'EventEspresso\core\services\commands\middleware\AddActionHook', |
|
| 1059 | - 'CapabilitiesChecker' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker', |
|
| 1060 | - 'CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface', |
|
| 1061 | - 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker', |
|
| 1062 | - 'CreateRegistrationService' => 'EventEspresso\core\domain\services\registration\CreateRegistrationService', |
|
| 1063 | - 'CreateRegistrationCommandHandler' => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand', |
|
| 1064 | - 'CopyRegistrationDetailsCommandHandler' => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand', |
|
| 1065 | - 'CopyRegistrationPaymentsCommandHandler' => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand', |
|
| 1066 | - 'CancelRegistrationAndTicketLineItemCommandHandler' => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler', |
|
| 1067 | - 'UpdateRegistrationAndTransactionAfterChangeCommandHandler' => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler', |
|
| 1068 | - 'CreateTicketLineItemCommandHandler' => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand', |
|
| 1069 | - 'CreateTransactionCommandHandler' => 'EventEspresso\core\services\commands\transaction\CreateTransactionCommandHandler', |
|
| 1070 | - 'CreateAttendeeCommandHandler' => 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler', |
|
| 1071 | - 'TableManager' => 'EventEspresso\core\services\database\TableManager', |
|
| 1072 | - 'TableAnalysis' => 'EventEspresso\core\services\database\TableAnalysis', |
|
| 1073 | - 'EspressoShortcode' => 'EventEspresso\core\services\shortcodes\EspressoShortcode', |
|
| 1074 | - 'ShortcodeInterface' => 'EventEspresso\core\services\shortcodes\ShortcodeInterface', |
|
| 1075 | - 'EventEspresso\core\services\shortcodes\ShortcodeInterface' => 'EventEspresso\core\services\shortcodes\EspressoShortcode', |
|
| 1076 | - 'EventEspresso\core\services\cache\CacheStorageInterface' => 'EventEspresso\core\services\cache\TransientCacheStorage', |
|
| 1077 | - 'LoaderInterface' => 'EventEspresso\core\services\loaders\LoaderInterface', |
|
| 1078 | - 'EventEspresso\core\services\loaders\LoaderInterface' => 'EventEspresso\core\services\loaders\Loader', |
|
| 1079 | - 'CommandFactoryInterface' => 'EventEspresso\core\services\commands\CommandFactoryInterface', |
|
| 1080 | - 'EventEspresso\core\services\commands\CommandFactoryInterface' => 'EventEspresso\core\services\commands\CommandFactory', |
|
| 1081 | - 'EmailValidatorInterface' => 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface', |
|
| 1082 | - 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface' => 'EventEspresso\core\domain\services\validation\email\EmailValidationService', |
|
| 1083 | - 'NoticeConverterInterface' => 'EventEspresso\core\services\notices\NoticeConverterInterface', |
|
| 1084 | - 'EventEspresso\core\services\notices\NoticeConverterInterface' => 'EventEspresso\core\services\notices\ConvertNoticesToEeErrors', |
|
| 1085 | - 'NoticesContainerInterface' => 'EventEspresso\core\services\notices\NoticesContainerInterface', |
|
| 1086 | - 'EventEspresso\core\services\notices\NoticesContainerInterface' => 'EventEspresso\core\services\notices\NoticesContainer', |
|
| 1087 | - 'EventEspresso\core\services\request\RequestInterface' => 'EventEspresso\core\services\request\Request', |
|
| 1088 | - 'EventEspresso\core\services\request\ResponseInterface' => 'EventEspresso\core\services\request\Response', |
|
| 1089 | - 'EventEspresso\core\domain\DomainInterface' => 'EventEspresso\core\domain\Domain', |
|
| 1090 | - 'Registration_Processor' => 'EE_Registration_Processor', |
|
| 1091 | - ); |
|
| 1092 | - foreach ($aliases as $alias => $fqn) { |
|
| 1093 | - if (is_array($fqn)) { |
|
| 1094 | - foreach ($fqn as $class => $for_class) { |
|
| 1095 | - $this->class_cache->addAlias($class, $alias, $for_class); |
|
| 1096 | - } |
|
| 1097 | - continue; |
|
| 1098 | - } |
|
| 1099 | - $this->class_cache->addAlias($fqn, $alias); |
|
| 1100 | - } |
|
| 1101 | - if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) { |
|
| 1102 | - $this->class_cache->addAlias( |
|
| 1103 | - 'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices', |
|
| 1104 | - 'EventEspresso\core\services\notices\NoticeConverterInterface' |
|
| 1105 | - ); |
|
| 1106 | - } |
|
| 1107 | - } |
|
| 1108 | - |
|
| 1109 | - |
|
| 1110 | - /** |
|
| 1111 | - * This is used to reset the internal map and class_loaders to their original default state at the beginning of the |
|
| 1112 | - * request Primarily used by unit tests. |
|
| 1113 | - */ |
|
| 1114 | - public function reset() |
|
| 1115 | - { |
|
| 1116 | - $this->_register_core_class_loaders(); |
|
| 1117 | - $this->_register_core_dependencies(); |
|
| 1118 | - } |
|
| 1119 | - |
|
| 1120 | - |
|
| 1121 | - /** |
|
| 1122 | - * PLZ NOTE: a better name for this method would be is_alias() |
|
| 1123 | - * because it returns TRUE if the provided fully qualified name IS an alias |
|
| 1124 | - * WHY? |
|
| 1125 | - * Because if a class is type hinting for a concretion, |
|
| 1126 | - * then why would we need to find another class to supply it? |
|
| 1127 | - * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`, |
|
| 1128 | - * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`. |
|
| 1129 | - * Don't go looking for some substitute. |
|
| 1130 | - * Whereas if a class is type hinting for an interface... |
|
| 1131 | - * then we need to find an actual class to use. |
|
| 1132 | - * So the interface IS the alias for some other FQN, |
|
| 1133 | - * and we need to find out if `Fully/Qualified/Namespace/SomeInterface` |
|
| 1134 | - * represents some other class. |
|
| 1135 | - * |
|
| 1136 | - * @deprecated 4.9.62.p |
|
| 1137 | - * @param string $fqn |
|
| 1138 | - * @param string $for_class |
|
| 1139 | - * @return bool |
|
| 1140 | - */ |
|
| 1141 | - public function has_alias($fqn = '', $for_class = '') |
|
| 1142 | - { |
|
| 1143 | - return $this->isAlias($fqn, $for_class); |
|
| 1144 | - } |
|
| 1145 | - |
|
| 1146 | - |
|
| 1147 | - /** |
|
| 1148 | - * PLZ NOTE: a better name for this method would be get_fqn_for_alias() |
|
| 1149 | - * because it returns a FQN for provided alias if one exists, otherwise returns the original $alias |
|
| 1150 | - * functions recursively, so that multiple aliases can be used to drill down to a FQN |
|
| 1151 | - * for example: |
|
| 1152 | - * if the following two entries were added to the _aliases array: |
|
| 1153 | - * array( |
|
| 1154 | - * 'interface_alias' => 'some\namespace\interface' |
|
| 1155 | - * 'some\namespace\interface' => 'some\namespace\classname' |
|
| 1156 | - * ) |
|
| 1157 | - * then one could use EE_Registry::instance()->create( 'interface_alias' ) |
|
| 1158 | - * to load an instance of 'some\namespace\classname' |
|
| 1159 | - * |
|
| 1160 | - * @deprecated 4.9.62.p |
|
| 1161 | - * @param string $alias |
|
| 1162 | - * @param string $for_class |
|
| 1163 | - * @return string |
|
| 1164 | - */ |
|
| 1165 | - public function get_alias($alias = '', $for_class = '') |
|
| 1166 | - { |
|
| 1167 | - return $this->getFqnForAlias($alias, $for_class); |
|
| 1168 | - } |
|
| 23 | + /** |
|
| 24 | + * This means that the requested class dependency is not present in the dependency map |
|
| 25 | + */ |
|
| 26 | + const not_registered = 0; |
|
| 27 | + |
|
| 28 | + /** |
|
| 29 | + * This instructs class loaders to ALWAYS return a newly instantiated object for the requested class. |
|
| 30 | + */ |
|
| 31 | + const load_new_object = 1; |
|
| 32 | + |
|
| 33 | + /** |
|
| 34 | + * This instructs class loaders to return a previously instantiated and cached object for the requested class. |
|
| 35 | + * IF a previously instantiated object does not exist, a new one will be created and added to the cache. |
|
| 36 | + */ |
|
| 37 | + const load_from_cache = 2; |
|
| 38 | + |
|
| 39 | + /** |
|
| 40 | + * When registering a dependency, |
|
| 41 | + * this indicates to keep any existing dependencies that already exist, |
|
| 42 | + * and simply discard any new dependencies declared in the incoming data |
|
| 43 | + */ |
|
| 44 | + const KEEP_EXISTING_DEPENDENCIES = 0; |
|
| 45 | + |
|
| 46 | + /** |
|
| 47 | + * When registering a dependency, |
|
| 48 | + * this indicates to overwrite any existing dependencies that already exist using the incoming data |
|
| 49 | + */ |
|
| 50 | + const OVERWRITE_DEPENDENCIES = 1; |
|
| 51 | + |
|
| 52 | + |
|
| 53 | + /** |
|
| 54 | + * @type EE_Dependency_Map $_instance |
|
| 55 | + */ |
|
| 56 | + protected static $_instance; |
|
| 57 | + |
|
| 58 | + /** |
|
| 59 | + * @var ClassInterfaceCache $class_cache |
|
| 60 | + */ |
|
| 61 | + private $class_cache; |
|
| 62 | + |
|
| 63 | + /** |
|
| 64 | + * @type RequestInterface $request |
|
| 65 | + */ |
|
| 66 | + protected $request; |
|
| 67 | + |
|
| 68 | + /** |
|
| 69 | + * @type LegacyRequestInterface $legacy_request |
|
| 70 | + */ |
|
| 71 | + protected $legacy_request; |
|
| 72 | + |
|
| 73 | + /** |
|
| 74 | + * @type ResponseInterface $response |
|
| 75 | + */ |
|
| 76 | + protected $response; |
|
| 77 | + |
|
| 78 | + /** |
|
| 79 | + * @type LoaderInterface $loader |
|
| 80 | + */ |
|
| 81 | + protected $loader; |
|
| 82 | + |
|
| 83 | + /** |
|
| 84 | + * @type array $_dependency_map |
|
| 85 | + */ |
|
| 86 | + protected $_dependency_map = array(); |
|
| 87 | + |
|
| 88 | + /** |
|
| 89 | + * @type array $_class_loaders |
|
| 90 | + */ |
|
| 91 | + protected $_class_loaders = array(); |
|
| 92 | + |
|
| 93 | + |
|
| 94 | + /** |
|
| 95 | + * EE_Dependency_Map constructor. |
|
| 96 | + * |
|
| 97 | + * @param ClassInterfaceCache $class_cache |
|
| 98 | + */ |
|
| 99 | + protected function __construct(ClassInterfaceCache $class_cache) |
|
| 100 | + { |
|
| 101 | + $this->class_cache = $class_cache; |
|
| 102 | + do_action('EE_Dependency_Map____construct', $this); |
|
| 103 | + } |
|
| 104 | + |
|
| 105 | + |
|
| 106 | + /** |
|
| 107 | + * @return void |
|
| 108 | + */ |
|
| 109 | + public function initialize() |
|
| 110 | + { |
|
| 111 | + $this->_register_core_dependencies(); |
|
| 112 | + $this->_register_core_class_loaders(); |
|
| 113 | + $this->_register_core_aliases(); |
|
| 114 | + } |
|
| 115 | + |
|
| 116 | + |
|
| 117 | + /** |
|
| 118 | + * @singleton method used to instantiate class object |
|
| 119 | + * @param ClassInterfaceCache|null $class_cache |
|
| 120 | + * @return EE_Dependency_Map |
|
| 121 | + */ |
|
| 122 | + public static function instance(ClassInterfaceCache $class_cache = null) |
|
| 123 | + { |
|
| 124 | + // check if class object is instantiated, and instantiated properly |
|
| 125 | + if (! self::$_instance instanceof EE_Dependency_Map |
|
| 126 | + && $class_cache instanceof ClassInterfaceCache |
|
| 127 | + ) { |
|
| 128 | + self::$_instance = new EE_Dependency_Map($class_cache); |
|
| 129 | + } |
|
| 130 | + return self::$_instance; |
|
| 131 | + } |
|
| 132 | + |
|
| 133 | + |
|
| 134 | + /** |
|
| 135 | + * @param RequestInterface $request |
|
| 136 | + */ |
|
| 137 | + public function setRequest(RequestInterface $request) |
|
| 138 | + { |
|
| 139 | + $this->request = $request; |
|
| 140 | + } |
|
| 141 | + |
|
| 142 | + |
|
| 143 | + /** |
|
| 144 | + * @param LegacyRequestInterface $legacy_request |
|
| 145 | + */ |
|
| 146 | + public function setLegacyRequest(LegacyRequestInterface $legacy_request) |
|
| 147 | + { |
|
| 148 | + $this->legacy_request = $legacy_request; |
|
| 149 | + } |
|
| 150 | + |
|
| 151 | + |
|
| 152 | + /** |
|
| 153 | + * @param ResponseInterface $response |
|
| 154 | + */ |
|
| 155 | + public function setResponse(ResponseInterface $response) |
|
| 156 | + { |
|
| 157 | + $this->response = $response; |
|
| 158 | + } |
|
| 159 | + |
|
| 160 | + |
|
| 161 | + /** |
|
| 162 | + * @param LoaderInterface $loader |
|
| 163 | + */ |
|
| 164 | + public function setLoader(LoaderInterface $loader) |
|
| 165 | + { |
|
| 166 | + $this->loader = $loader; |
|
| 167 | + } |
|
| 168 | + |
|
| 169 | + |
|
| 170 | + /** |
|
| 171 | + * @param string $class |
|
| 172 | + * @param array $dependencies |
|
| 173 | + * @param int $overwrite |
|
| 174 | + * @return bool |
|
| 175 | + */ |
|
| 176 | + public static function register_dependencies( |
|
| 177 | + $class, |
|
| 178 | + array $dependencies, |
|
| 179 | + $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES |
|
| 180 | + ) { |
|
| 181 | + return self::$_instance->registerDependencies($class, $dependencies, $overwrite); |
|
| 182 | + } |
|
| 183 | + |
|
| 184 | + |
|
| 185 | + /** |
|
| 186 | + * Assigns an array of class names and corresponding load sources (new or cached) |
|
| 187 | + * to the class specified by the first parameter. |
|
| 188 | + * IMPORTANT !!! |
|
| 189 | + * The order of elements in the incoming $dependencies array MUST match |
|
| 190 | + * the order of the constructor parameters for the class in question. |
|
| 191 | + * This is especially important when overriding any existing dependencies that are registered. |
|
| 192 | + * the third parameter controls whether any duplicate dependencies are overwritten or not. |
|
| 193 | + * |
|
| 194 | + * @param string $class |
|
| 195 | + * @param array $dependencies |
|
| 196 | + * @param int $overwrite |
|
| 197 | + * @return bool |
|
| 198 | + */ |
|
| 199 | + public function registerDependencies( |
|
| 200 | + $class, |
|
| 201 | + array $dependencies, |
|
| 202 | + $overwrite = EE_Dependency_Map::KEEP_EXISTING_DEPENDENCIES |
|
| 203 | + ) { |
|
| 204 | + $class = trim($class, '\\'); |
|
| 205 | + $registered = false; |
|
| 206 | + if (empty(self::$_instance->_dependency_map[ $class ])) { |
|
| 207 | + self::$_instance->_dependency_map[ $class ] = array(); |
|
| 208 | + } |
|
| 209 | + // we need to make sure that any aliases used when registering a dependency |
|
| 210 | + // get resolved to the correct class name |
|
| 211 | + foreach ($dependencies as $dependency => $load_source) { |
|
| 212 | + $alias = self::$_instance->getFqnForAlias($dependency); |
|
| 213 | + if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES |
|
| 214 | + || ! isset(self::$_instance->_dependency_map[ $class ][ $alias ]) |
|
| 215 | + ) { |
|
| 216 | + unset($dependencies[ $dependency ]); |
|
| 217 | + $dependencies[ $alias ] = $load_source; |
|
| 218 | + $registered = true; |
|
| 219 | + } |
|
| 220 | + } |
|
| 221 | + // now add our two lists of dependencies together. |
|
| 222 | + // using Union (+=) favours the arrays in precedence from left to right, |
|
| 223 | + // so $dependencies is NOT overwritten because it is listed first |
|
| 224 | + // ie: with A = B + C, entries in B take precedence over duplicate entries in C |
|
| 225 | + // Union is way faster than array_merge() but should be used with caution... |
|
| 226 | + // especially with numerically indexed arrays |
|
| 227 | + $dependencies += self::$_instance->_dependency_map[ $class ]; |
|
| 228 | + // now we need to ensure that the resulting dependencies |
|
| 229 | + // array only has the entries that are required for the class |
|
| 230 | + // so first count how many dependencies were originally registered for the class |
|
| 231 | + $dependency_count = count(self::$_instance->_dependency_map[ $class ]); |
|
| 232 | + // if that count is non-zero (meaning dependencies were already registered) |
|
| 233 | + self::$_instance->_dependency_map[ $class ] = $dependency_count |
|
| 234 | + // then truncate the final array to match that count |
|
| 235 | + ? array_slice($dependencies, 0, $dependency_count) |
|
| 236 | + // otherwise just take the incoming array because nothing previously existed |
|
| 237 | + : $dependencies; |
|
| 238 | + return $registered; |
|
| 239 | + } |
|
| 240 | + |
|
| 241 | + |
|
| 242 | + /** |
|
| 243 | + * @param string $class_name |
|
| 244 | + * @param string $loader |
|
| 245 | + * @return bool |
|
| 246 | + * @throws DomainException |
|
| 247 | + */ |
|
| 248 | + public static function register_class_loader($class_name, $loader = 'load_core') |
|
| 249 | + { |
|
| 250 | + if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) { |
|
| 251 | + throw new DomainException( |
|
| 252 | + esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso') |
|
| 253 | + ); |
|
| 254 | + } |
|
| 255 | + // check that loader is callable or method starts with "load_" and exists in EE_Registry |
|
| 256 | + if (! is_callable($loader) |
|
| 257 | + && ( |
|
| 258 | + strpos($loader, 'load_') !== 0 |
|
| 259 | + || ! method_exists('EE_Registry', $loader) |
|
| 260 | + ) |
|
| 261 | + ) { |
|
| 262 | + throw new DomainException( |
|
| 263 | + sprintf( |
|
| 264 | + esc_html__( |
|
| 265 | + '"%1$s" is not a valid loader method on EE_Registry.', |
|
| 266 | + 'event_espresso' |
|
| 267 | + ), |
|
| 268 | + $loader |
|
| 269 | + ) |
|
| 270 | + ); |
|
| 271 | + } |
|
| 272 | + $class_name = self::$_instance->getFqnForAlias($class_name); |
|
| 273 | + if (! isset(self::$_instance->_class_loaders[ $class_name ])) { |
|
| 274 | + self::$_instance->_class_loaders[ $class_name ] = $loader; |
|
| 275 | + return true; |
|
| 276 | + } |
|
| 277 | + return false; |
|
| 278 | + } |
|
| 279 | + |
|
| 280 | + |
|
| 281 | + /** |
|
| 282 | + * @return array |
|
| 283 | + */ |
|
| 284 | + public function dependency_map() |
|
| 285 | + { |
|
| 286 | + return $this->_dependency_map; |
|
| 287 | + } |
|
| 288 | + |
|
| 289 | + |
|
| 290 | + /** |
|
| 291 | + * returns TRUE if dependency map contains a listing for the provided class name |
|
| 292 | + * |
|
| 293 | + * @param string $class_name |
|
| 294 | + * @return boolean |
|
| 295 | + */ |
|
| 296 | + public function has($class_name = '') |
|
| 297 | + { |
|
| 298 | + // all legacy models have the same dependencies |
|
| 299 | + if (strpos($class_name, 'EEM_') === 0) { |
|
| 300 | + $class_name = 'LEGACY_MODELS'; |
|
| 301 | + } |
|
| 302 | + return isset($this->_dependency_map[ $class_name ]) ? true : false; |
|
| 303 | + } |
|
| 304 | + |
|
| 305 | + |
|
| 306 | + /** |
|
| 307 | + * returns TRUE if dependency map contains a listing for the provided class name AND dependency |
|
| 308 | + * |
|
| 309 | + * @param string $class_name |
|
| 310 | + * @param string $dependency |
|
| 311 | + * @return bool |
|
| 312 | + */ |
|
| 313 | + public function has_dependency_for_class($class_name = '', $dependency = '') |
|
| 314 | + { |
|
| 315 | + // all legacy models have the same dependencies |
|
| 316 | + if (strpos($class_name, 'EEM_') === 0) { |
|
| 317 | + $class_name = 'LEGACY_MODELS'; |
|
| 318 | + } |
|
| 319 | + $dependency = $this->getFqnForAlias($dependency, $class_name); |
|
| 320 | + return isset($this->_dependency_map[ $class_name ][ $dependency ]) |
|
| 321 | + ? true |
|
| 322 | + : false; |
|
| 323 | + } |
|
| 324 | + |
|
| 325 | + |
|
| 326 | + /** |
|
| 327 | + * returns loading strategy for whether a previously cached dependency should be loaded or a new instance returned |
|
| 328 | + * |
|
| 329 | + * @param string $class_name |
|
| 330 | + * @param string $dependency |
|
| 331 | + * @return int |
|
| 332 | + */ |
|
| 333 | + public function loading_strategy_for_class_dependency($class_name = '', $dependency = '') |
|
| 334 | + { |
|
| 335 | + // all legacy models have the same dependencies |
|
| 336 | + if (strpos($class_name, 'EEM_') === 0) { |
|
| 337 | + $class_name = 'LEGACY_MODELS'; |
|
| 338 | + } |
|
| 339 | + $dependency = $this->getFqnForAlias($dependency); |
|
| 340 | + return $this->has_dependency_for_class($class_name, $dependency) |
|
| 341 | + ? $this->_dependency_map[ $class_name ][ $dependency ] |
|
| 342 | + : EE_Dependency_Map::not_registered; |
|
| 343 | + } |
|
| 344 | + |
|
| 345 | + |
|
| 346 | + /** |
|
| 347 | + * @param string $class_name |
|
| 348 | + * @return string | Closure |
|
| 349 | + */ |
|
| 350 | + public function class_loader($class_name) |
|
| 351 | + { |
|
| 352 | + // all legacy models use load_model() |
|
| 353 | + if (strpos($class_name, 'EEM_') === 0) { |
|
| 354 | + return 'load_model'; |
|
| 355 | + } |
|
| 356 | + // EE_CPT_*_Strategy classes like EE_CPT_Event_Strategy, EE_CPT_Venue_Strategy, etc |
|
| 357 | + // perform strpos() first to avoid loading regex every time we load a class |
|
| 358 | + if (strpos($class_name, 'EE_CPT_') === 0 |
|
| 359 | + && preg_match('/^EE_CPT_([a-zA-Z]+)_Strategy$/', $class_name) |
|
| 360 | + ) { |
|
| 361 | + return 'load_core'; |
|
| 362 | + } |
|
| 363 | + $class_name = $this->getFqnForAlias($class_name); |
|
| 364 | + return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : ''; |
|
| 365 | + } |
|
| 366 | + |
|
| 367 | + |
|
| 368 | + /** |
|
| 369 | + * @return array |
|
| 370 | + */ |
|
| 371 | + public function class_loaders() |
|
| 372 | + { |
|
| 373 | + return $this->_class_loaders; |
|
| 374 | + } |
|
| 375 | + |
|
| 376 | + |
|
| 377 | + /** |
|
| 378 | + * adds an alias for a classname |
|
| 379 | + * |
|
| 380 | + * @param string $fqcn the class name that should be used (concrete class to replace interface) |
|
| 381 | + * @param string $alias the class name that would be type hinted for (abstract parent or interface) |
|
| 382 | + * @param string $for_class the class that has the dependency (is type hinting for the interface) |
|
| 383 | + */ |
|
| 384 | + public function add_alias($fqcn, $alias, $for_class = '') |
|
| 385 | + { |
|
| 386 | + $this->class_cache->addAlias($fqcn, $alias, $for_class); |
|
| 387 | + } |
|
| 388 | + |
|
| 389 | + |
|
| 390 | + /** |
|
| 391 | + * Returns TRUE if the provided fully qualified name IS an alias |
|
| 392 | + * WHY? |
|
| 393 | + * Because if a class is type hinting for a concretion, |
|
| 394 | + * then why would we need to find another class to supply it? |
|
| 395 | + * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`, |
|
| 396 | + * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`. |
|
| 397 | + * Don't go looking for some substitute. |
|
| 398 | + * Whereas if a class is type hinting for an interface... |
|
| 399 | + * then we need to find an actual class to use. |
|
| 400 | + * So the interface IS the alias for some other FQN, |
|
| 401 | + * and we need to find out if `Fully/Qualified/Namespace/SomeInterface` |
|
| 402 | + * represents some other class. |
|
| 403 | + * |
|
| 404 | + * @param string $fqn |
|
| 405 | + * @param string $for_class |
|
| 406 | + * @return bool |
|
| 407 | + */ |
|
| 408 | + public function isAlias($fqn = '', $for_class = '') |
|
| 409 | + { |
|
| 410 | + return $this->class_cache->isAlias($fqn, $for_class); |
|
| 411 | + } |
|
| 412 | + |
|
| 413 | + |
|
| 414 | + /** |
|
| 415 | + * Returns a FQN for provided alias if one exists, otherwise returns the original $alias |
|
| 416 | + * functions recursively, so that multiple aliases can be used to drill down to a FQN |
|
| 417 | + * for example: |
|
| 418 | + * if the following two entries were added to the _aliases array: |
|
| 419 | + * array( |
|
| 420 | + * 'interface_alias' => 'some\namespace\interface' |
|
| 421 | + * 'some\namespace\interface' => 'some\namespace\classname' |
|
| 422 | + * ) |
|
| 423 | + * then one could use EE_Registry::instance()->create( 'interface_alias' ) |
|
| 424 | + * to load an instance of 'some\namespace\classname' |
|
| 425 | + * |
|
| 426 | + * @param string $alias |
|
| 427 | + * @param string $for_class |
|
| 428 | + * @return string |
|
| 429 | + */ |
|
| 430 | + public function getFqnForAlias($alias = '', $for_class = '') |
|
| 431 | + { |
|
| 432 | + return (string) $this->class_cache->getFqnForAlias($alias, $for_class); |
|
| 433 | + } |
|
| 434 | + |
|
| 435 | + |
|
| 436 | + /** |
|
| 437 | + * Registers the core dependencies and whether a previously instantiated object should be loaded from the cache, |
|
| 438 | + * if one exists, or whether a new object should be generated every time the requested class is loaded. |
|
| 439 | + * This is done by using the following class constants: |
|
| 440 | + * EE_Dependency_Map::load_from_cache - loads previously instantiated object |
|
| 441 | + * EE_Dependency_Map::load_new_object - generates a new object every time |
|
| 442 | + */ |
|
| 443 | + protected function _register_core_dependencies() |
|
| 444 | + { |
|
| 445 | + $this->_dependency_map = array( |
|
| 446 | + 'EE_Request_Handler' => array( |
|
| 447 | + 'EE_Request' => EE_Dependency_Map::load_from_cache, |
|
| 448 | + ), |
|
| 449 | + 'EE_System' => array( |
|
| 450 | + 'EE_Registry' => EE_Dependency_Map::load_from_cache, |
|
| 451 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 452 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 453 | + 'EE_Maintenance_Mode' => EE_Dependency_Map::load_from_cache, |
|
| 454 | + ), |
|
| 455 | + 'EE_Session' => array( |
|
| 456 | + 'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache, |
|
| 457 | + 'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache, |
|
| 458 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 459 | + 'EventEspresso\core\services\session\SessionStartHandler' => EE_Dependency_Map::load_from_cache, |
|
| 460 | + 'EE_Encryption' => EE_Dependency_Map::load_from_cache, |
|
| 461 | + ), |
|
| 462 | + 'EE_Cart' => array( |
|
| 463 | + 'EE_Session' => EE_Dependency_Map::load_from_cache, |
|
| 464 | + ), |
|
| 465 | + 'EE_Front_Controller' => array( |
|
| 466 | + 'EE_Registry' => EE_Dependency_Map::load_from_cache, |
|
| 467 | + 'EE_Request_Handler' => EE_Dependency_Map::load_from_cache, |
|
| 468 | + 'EE_Module_Request_Router' => EE_Dependency_Map::load_from_cache, |
|
| 469 | + ), |
|
| 470 | + 'EE_Messenger_Collection_Loader' => array( |
|
| 471 | + 'EE_Messenger_Collection' => EE_Dependency_Map::load_new_object, |
|
| 472 | + ), |
|
| 473 | + 'EE_Message_Type_Collection_Loader' => array( |
|
| 474 | + 'EE_Message_Type_Collection' => EE_Dependency_Map::load_new_object, |
|
| 475 | + ), |
|
| 476 | + 'EE_Message_Resource_Manager' => array( |
|
| 477 | + 'EE_Messenger_Collection_Loader' => EE_Dependency_Map::load_new_object, |
|
| 478 | + 'EE_Message_Type_Collection_Loader' => EE_Dependency_Map::load_new_object, |
|
| 479 | + 'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache, |
|
| 480 | + ), |
|
| 481 | + 'EE_Message_Factory' => array( |
|
| 482 | + 'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache, |
|
| 483 | + ), |
|
| 484 | + 'EE_messages' => array( |
|
| 485 | + 'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache, |
|
| 486 | + ), |
|
| 487 | + 'EE_Messages_Generator' => array( |
|
| 488 | + 'EE_Messages_Queue' => EE_Dependency_Map::load_new_object, |
|
| 489 | + 'EE_Messages_Data_Handler_Collection' => EE_Dependency_Map::load_new_object, |
|
| 490 | + 'EE_Message_Template_Group_Collection' => EE_Dependency_Map::load_new_object, |
|
| 491 | + 'EEH_Parse_Shortcodes' => EE_Dependency_Map::load_from_cache, |
|
| 492 | + ), |
|
| 493 | + 'EE_Messages_Processor' => array( |
|
| 494 | + 'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache, |
|
| 495 | + ), |
|
| 496 | + 'EE_Messages_Queue' => array( |
|
| 497 | + 'EE_Message_Repository' => EE_Dependency_Map::load_new_object, |
|
| 498 | + ), |
|
| 499 | + 'EE_Messages_Template_Defaults' => array( |
|
| 500 | + 'EEM_Message_Template_Group' => EE_Dependency_Map::load_from_cache, |
|
| 501 | + 'EEM_Message_Template' => EE_Dependency_Map::load_from_cache, |
|
| 502 | + ), |
|
| 503 | + 'EE_Message_To_Generate_From_Request' => array( |
|
| 504 | + 'EE_Message_Resource_Manager' => EE_Dependency_Map::load_from_cache, |
|
| 505 | + 'EE_Request_Handler' => EE_Dependency_Map::load_from_cache, |
|
| 506 | + ), |
|
| 507 | + 'EventEspresso\core\services\commands\CommandBus' => array( |
|
| 508 | + 'EventEspresso\core\services\commands\CommandHandlerManager' => EE_Dependency_Map::load_from_cache, |
|
| 509 | + ), |
|
| 510 | + 'EventEspresso\services\commands\CommandHandler' => array( |
|
| 511 | + 'EE_Registry' => EE_Dependency_Map::load_from_cache, |
|
| 512 | + 'CommandBusInterface' => EE_Dependency_Map::load_from_cache, |
|
| 513 | + ), |
|
| 514 | + 'EventEspresso\core\services\commands\CommandHandlerManager' => array( |
|
| 515 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 516 | + ), |
|
| 517 | + 'EventEspresso\core\services\commands\CompositeCommandHandler' => array( |
|
| 518 | + 'EventEspresso\core\services\commands\CommandBus' => EE_Dependency_Map::load_from_cache, |
|
| 519 | + 'EventEspresso\core\services\commands\CommandFactory' => EE_Dependency_Map::load_from_cache, |
|
| 520 | + ), |
|
| 521 | + 'EventEspresso\core\services\commands\CommandFactory' => array( |
|
| 522 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 523 | + ), |
|
| 524 | + 'EventEspresso\core\services\commands\middleware\CapChecker' => array( |
|
| 525 | + 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache, |
|
| 526 | + ), |
|
| 527 | + 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => array( |
|
| 528 | + 'EE_Capabilities' => EE_Dependency_Map::load_from_cache, |
|
| 529 | + ), |
|
| 530 | + 'EventEspresso\core\domain\services\capabilities\RegistrationsCapChecker' => array( |
|
| 531 | + 'EE_Capabilities' => EE_Dependency_Map::load_from_cache, |
|
| 532 | + ), |
|
| 533 | + 'EventEspresso\core\services\commands\registration\CreateRegistrationCommandHandler' => array( |
|
| 534 | + 'EventEspresso\core\domain\services\registration\CreateRegistrationService' => EE_Dependency_Map::load_from_cache, |
|
| 535 | + ), |
|
| 536 | + 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommandHandler' => array( |
|
| 537 | + 'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache, |
|
| 538 | + ), |
|
| 539 | + 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommandHandler' => array( |
|
| 540 | + 'EventEspresso\core\domain\services\registration\CopyRegistrationService' => EE_Dependency_Map::load_from_cache, |
|
| 541 | + ), |
|
| 542 | + 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler' => array( |
|
| 543 | + 'EventEspresso\core\domain\services\registration\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache, |
|
| 544 | + ), |
|
| 545 | + 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler' => array( |
|
| 546 | + 'EventEspresso\core\domain\services\registration\UpdateRegistrationService' => EE_Dependency_Map::load_from_cache, |
|
| 547 | + ), |
|
| 548 | + 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommandHandler' => array( |
|
| 549 | + 'EventEspresso\core\domain\services\ticket\CreateTicketLineItemService' => EE_Dependency_Map::load_from_cache, |
|
| 550 | + ), |
|
| 551 | + 'EventEspresso\core\services\commands\ticket\CancelTicketLineItemCommandHandler' => array( |
|
| 552 | + 'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache, |
|
| 553 | + ), |
|
| 554 | + 'EventEspresso\core\domain\services\registration\CancelRegistrationService' => array( |
|
| 555 | + 'EventEspresso\core\domain\services\ticket\CancelTicketLineItemService' => EE_Dependency_Map::load_from_cache, |
|
| 556 | + ), |
|
| 557 | + 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler' => array( |
|
| 558 | + 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 559 | + ), |
|
| 560 | + 'EventEspresso\core\services\database\TableManager' => array( |
|
| 561 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 562 | + ), |
|
| 563 | + 'EE_Data_Migration_Class_Base' => array( |
|
| 564 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 565 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 566 | + ), |
|
| 567 | + 'EE_DMS_Core_4_1_0' => array( |
|
| 568 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 569 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 570 | + ), |
|
| 571 | + 'EE_DMS_Core_4_2_0' => array( |
|
| 572 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 573 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 574 | + ), |
|
| 575 | + 'EE_DMS_Core_4_3_0' => array( |
|
| 576 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 577 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 578 | + ), |
|
| 579 | + 'EE_DMS_Core_4_4_0' => array( |
|
| 580 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 581 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 582 | + ), |
|
| 583 | + 'EE_DMS_Core_4_5_0' => array( |
|
| 584 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 585 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 586 | + ), |
|
| 587 | + 'EE_DMS_Core_4_6_0' => array( |
|
| 588 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 589 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 590 | + ), |
|
| 591 | + 'EE_DMS_Core_4_7_0' => array( |
|
| 592 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 593 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 594 | + ), |
|
| 595 | + 'EE_DMS_Core_4_8_0' => array( |
|
| 596 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 597 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 598 | + ), |
|
| 599 | + 'EE_DMS_Core_4_9_0' => array( |
|
| 600 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 601 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 602 | + ), |
|
| 603 | + 'EE_DMS_Core_4_10_0' => array( |
|
| 604 | + 'EventEspresso\core\services\database\TableAnalysis' => EE_Dependency_Map::load_from_cache, |
|
| 605 | + 'EventEspresso\core\services\database\TableManager' => EE_Dependency_Map::load_from_cache, |
|
| 606 | + 'EE_DMS_Core_4_9_0' => EE_Dependency_Map::load_from_cache, |
|
| 607 | + ), |
|
| 608 | + 'EventEspresso\core\services\assets\I18nRegistry' => array( |
|
| 609 | + array(), |
|
| 610 | + 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 611 | + ), |
|
| 612 | + 'EventEspresso\core\services\assets\Registry' => array( |
|
| 613 | + 'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache, |
|
| 614 | + 'EventEspresso\core\services\assets\I18nRegistry' => EE_Dependency_Map::load_from_cache, |
|
| 615 | + ), |
|
| 616 | + 'EventEspresso\core\domain\entities\shortcodes\EspressoCancelled' => array( |
|
| 617 | + 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 618 | + ), |
|
| 619 | + 'EventEspresso\core\domain\entities\shortcodes\EspressoCheckout' => array( |
|
| 620 | + 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 621 | + ), |
|
| 622 | + 'EventEspresso\core\domain\entities\shortcodes\EspressoEventAttendees' => array( |
|
| 623 | + 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 624 | + ), |
|
| 625 | + 'EventEspresso\core\domain\entities\shortcodes\EspressoEvents' => array( |
|
| 626 | + 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 627 | + ), |
|
| 628 | + 'EventEspresso\core\domain\entities\shortcodes\EspressoThankYou' => array( |
|
| 629 | + 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 630 | + ), |
|
| 631 | + 'EventEspresso\core\domain\entities\shortcodes\EspressoTicketSelector' => array( |
|
| 632 | + 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 633 | + ), |
|
| 634 | + 'EventEspresso\core\domain\entities\shortcodes\EspressoTxnPage' => array( |
|
| 635 | + 'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache, |
|
| 636 | + ), |
|
| 637 | + 'EventEspresso\core\services\cache\BasicCacheManager' => array( |
|
| 638 | + 'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache, |
|
| 639 | + ), |
|
| 640 | + 'EventEspresso\core\services\cache\PostRelatedCacheManager' => array( |
|
| 641 | + 'EventEspresso\core\services\cache\TransientCacheStorage' => EE_Dependency_Map::load_from_cache, |
|
| 642 | + ), |
|
| 643 | + 'EventEspresso\core\domain\services\validation\email\EmailValidationService' => array( |
|
| 644 | + 'EE_Registration_Config' => EE_Dependency_Map::load_from_cache, |
|
| 645 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 646 | + ), |
|
| 647 | + 'EventEspresso\core\domain\values\EmailAddress' => array( |
|
| 648 | + null, |
|
| 649 | + 'EventEspresso\core\domain\services\validation\email\EmailValidationService' => EE_Dependency_Map::load_from_cache, |
|
| 650 | + ), |
|
| 651 | + 'EventEspresso\core\services\orm\ModelFieldFactory' => array( |
|
| 652 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 653 | + ), |
|
| 654 | + 'LEGACY_MODELS' => array( |
|
| 655 | + null, |
|
| 656 | + 'EventEspresso\core\services\database\ModelFieldFactory' => EE_Dependency_Map::load_from_cache, |
|
| 657 | + ), |
|
| 658 | + 'EE_Module_Request_Router' => array( |
|
| 659 | + 'EE_Request' => EE_Dependency_Map::load_from_cache, |
|
| 660 | + ), |
|
| 661 | + 'EE_Registration_Processor' => array( |
|
| 662 | + 'EE_Request' => EE_Dependency_Map::load_from_cache, |
|
| 663 | + ), |
|
| 664 | + 'EventEspresso\core\services\notifications\PersistentAdminNoticeManager' => array( |
|
| 665 | + null, |
|
| 666 | + 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker' => EE_Dependency_Map::load_from_cache, |
|
| 667 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 668 | + ), |
|
| 669 | + 'EventEspresso\core\services\licensing\LicenseService' => array( |
|
| 670 | + 'EventEspresso\core\domain\services\pue\Stats' => EE_Dependency_Map::load_from_cache, |
|
| 671 | + 'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache, |
|
| 672 | + ), |
|
| 673 | + 'EE_Admin_Transactions_List_Table' => array( |
|
| 674 | + null, |
|
| 675 | + 'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache, |
|
| 676 | + ), |
|
| 677 | + 'EventEspresso\core\domain\services\pue\Stats' => array( |
|
| 678 | + 'EventEspresso\core\domain\services\pue\Config' => EE_Dependency_Map::load_from_cache, |
|
| 679 | + 'EE_Maintenance_Mode' => EE_Dependency_Map::load_from_cache, |
|
| 680 | + 'EventEspresso\core\domain\services\pue\StatsGatherer' => EE_Dependency_Map::load_from_cache, |
|
| 681 | + ), |
|
| 682 | + 'EventEspresso\core\domain\services\pue\Config' => array( |
|
| 683 | + 'EE_Network_Config' => EE_Dependency_Map::load_from_cache, |
|
| 684 | + 'EE_Config' => EE_Dependency_Map::load_from_cache, |
|
| 685 | + ), |
|
| 686 | + 'EventEspresso\core\domain\services\pue\StatsGatherer' => array( |
|
| 687 | + 'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache, |
|
| 688 | + 'EEM_Event' => EE_Dependency_Map::load_from_cache, |
|
| 689 | + 'EEM_Datetime' => EE_Dependency_Map::load_from_cache, |
|
| 690 | + 'EEM_Ticket' => EE_Dependency_Map::load_from_cache, |
|
| 691 | + 'EEM_Registration' => EE_Dependency_Map::load_from_cache, |
|
| 692 | + 'EEM_Transaction' => EE_Dependency_Map::load_from_cache, |
|
| 693 | + 'EE_Config' => EE_Dependency_Map::load_from_cache, |
|
| 694 | + ), |
|
| 695 | + 'EventEspresso\core\domain\services\admin\ExitModal' => array( |
|
| 696 | + 'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache, |
|
| 697 | + ), |
|
| 698 | + 'EventEspresso\core\domain\services\admin\PluginUpsells' => array( |
|
| 699 | + 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 700 | + ), |
|
| 701 | + 'EventEspresso\caffeinated\modules\recaptcha_invisible\InvisibleRecaptcha' => array( |
|
| 702 | + 'EE_Registration_Config' => EE_Dependency_Map::load_from_cache, |
|
| 703 | + 'EE_Session' => EE_Dependency_Map::load_from_cache, |
|
| 704 | + ), |
|
| 705 | + 'EventEspresso\caffeinated\modules\recaptcha_invisible\RecaptchaAdminSettings' => array( |
|
| 706 | + 'EE_Registration_Config' => EE_Dependency_Map::load_from_cache, |
|
| 707 | + ), |
|
| 708 | + 'EventEspresso\modules\ticket_selector\ProcessTicketSelector' => array( |
|
| 709 | + 'EE_Core_Config' => EE_Dependency_Map::load_from_cache, |
|
| 710 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 711 | + 'EE_Session' => EE_Dependency_Map::load_from_cache, |
|
| 712 | + 'EEM_Ticket' => EE_Dependency_Map::load_from_cache, |
|
| 713 | + 'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => EE_Dependency_Map::load_from_cache, |
|
| 714 | + ), |
|
| 715 | + 'EventEspresso\modules\ticket_selector\TicketDatetimeAvailabilityTracker' => array( |
|
| 716 | + 'EEM_Datetime' => EE_Dependency_Map::load_from_cache, |
|
| 717 | + ), |
|
| 718 | + 'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => array( |
|
| 719 | + 'EE_Core_Config' => EE_Dependency_Map::load_from_cache, |
|
| 720 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 721 | + ), |
|
| 722 | + 'EventEspresso\core\domain\services\custom_post_types\RegisterCustomPostTypes' => array( |
|
| 723 | + 'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache, |
|
| 724 | + ), |
|
| 725 | + 'EventEspresso\core\domain\services\custom_post_types\RegisterCustomTaxonomies' => array( |
|
| 726 | + 'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache, |
|
| 727 | + ), |
|
| 728 | + 'EE_CPT_Strategy' => array( |
|
| 729 | + 'EventEspresso\core\domain\entities\custom_post_types\CustomPostTypeDefinitions' => EE_Dependency_Map::load_from_cache, |
|
| 730 | + 'EventEspresso\core\domain\entities\custom_post_types\CustomTaxonomyDefinitions' => EE_Dependency_Map::load_from_cache, |
|
| 731 | + ), |
|
| 732 | + 'EventEspresso\core\services\loaders\ObjectIdentifier' => array( |
|
| 733 | + 'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache, |
|
| 734 | + ), |
|
| 735 | + 'EventEspresso\core\domain\services\assets\CoreAssetManager' => array( |
|
| 736 | + 'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache, |
|
| 737 | + 'EE_Currency_Config' => EE_Dependency_Map::load_from_cache, |
|
| 738 | + 'EE_Template_Config' => EE_Dependency_Map::load_from_cache, |
|
| 739 | + 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 740 | + 'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache, |
|
| 741 | + ), |
|
| 742 | + 'EventEspresso\core\domain\services\admin\privacy\policy\PrivacyPolicy' => array( |
|
| 743 | + 'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache, |
|
| 744 | + 'EventEspresso\core\domain\values\session\SessionLifespan' => EE_Dependency_Map::load_from_cache |
|
| 745 | + ), |
|
| 746 | + 'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendee' => array( |
|
| 747 | + 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 748 | + ), |
|
| 749 | + 'EventEspresso\core\domain\services\admin\privacy\export\ExportAttendeeBillingData' => array( |
|
| 750 | + 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 751 | + 'EEM_Payment_Method' => EE_Dependency_Map::load_from_cache |
|
| 752 | + ), |
|
| 753 | + 'EventEspresso\core\domain\services\admin\privacy\export\ExportCheckins' => array( |
|
| 754 | + 'EEM_Checkin' => EE_Dependency_Map::load_from_cache, |
|
| 755 | + ), |
|
| 756 | + 'EventEspresso\core\domain\services\admin\privacy\export\ExportRegistration' => array( |
|
| 757 | + 'EEM_Registration' => EE_Dependency_Map::load_from_cache, |
|
| 758 | + ), |
|
| 759 | + 'EventEspresso\core\domain\services\admin\privacy\export\ExportTransaction' => array( |
|
| 760 | + 'EEM_Transaction' => EE_Dependency_Map::load_from_cache, |
|
| 761 | + ), |
|
| 762 | + 'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAttendeeData' => array( |
|
| 763 | + 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 764 | + ), |
|
| 765 | + 'EventEspresso\core\domain\services\admin\privacy\erasure\EraseAnswers' => array( |
|
| 766 | + 'EEM_Answer' => EE_Dependency_Map::load_from_cache, |
|
| 767 | + 'EEM_Question' => EE_Dependency_Map::load_from_cache, |
|
| 768 | + ), |
|
| 769 | + 'EventEspresso\core\CPTs\CptQueryModifier' => array( |
|
| 770 | + null, |
|
| 771 | + null, |
|
| 772 | + null, |
|
| 773 | + 'EE_Request_Handler' => EE_Dependency_Map::load_from_cache, |
|
| 774 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 775 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 776 | + ), |
|
| 777 | + 'EventEspresso\core\domain\services\admin\privacy\forms\PrivacySettingsFormHandler' => array( |
|
| 778 | + 'EE_Registry' => EE_Dependency_Map::load_from_cache, |
|
| 779 | + 'EE_Config' => EE_Dependency_Map::load_from_cache |
|
| 780 | + ), |
|
| 781 | + 'EventEspresso\core\services\editor\BlockRegistrationManager' => array( |
|
| 782 | + 'EventEspresso\core\services\assets\BlockAssetManagerCollection' => EE_Dependency_Map::load_from_cache, |
|
| 783 | + 'EventEspresso\core\domain\entities\editor\BlockCollection' => EE_Dependency_Map::load_from_cache, |
|
| 784 | + 'EventEspresso\core\services\route_match\RouteMatchSpecificationManager' => EE_Dependency_Map::load_from_cache, |
|
| 785 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 786 | + ), |
|
| 787 | + 'EventEspresso\core\domain\entities\editor\CoreBlocksAssetManager' => array( |
|
| 788 | + 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 789 | + 'EventEspresso\core\services\assets\AssetCollection' => EE_Dependency_Map::load_from_cache, |
|
| 790 | + 'EventEspresso\core\services\assets\Registry' => EE_Dependency_Map::load_from_cache, |
|
| 791 | + ), |
|
| 792 | + 'EventEspresso\core\domain\services\blocks\EventAttendeesBlockRenderer' => array( |
|
| 793 | + 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 794 | + 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 795 | + ), |
|
| 796 | + 'EventEspresso\core\domain\entities\editor\blocks\EventAttendees' => array( |
|
| 797 | + 'EventEspresso\core\domain\entities\editor\CoreBlocksAssetManager' => self::load_from_cache, |
|
| 798 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 799 | + 'EventEspresso\core\domain\services\blocks\EventAttendeesBlockRenderer' => self::load_from_cache, |
|
| 800 | + ), |
|
| 801 | + 'EventEspresso\core\services\route_match\RouteMatchSpecificationDependencyResolver' => array( |
|
| 802 | + 'EventEspresso\core\services\container\Mirror' => EE_Dependency_Map::load_from_cache, |
|
| 803 | + 'EventEspresso\core\services\loaders\ClassInterfaceCache' => EE_Dependency_Map::load_from_cache, |
|
| 804 | + 'EE_Dependency_Map' => EE_Dependency_Map::load_from_cache, |
|
| 805 | + ), |
|
| 806 | + 'EventEspresso\core\services\route_match\RouteMatchSpecificationFactory' => array( |
|
| 807 | + 'EventEspresso\core\services\route_match\RouteMatchSpecificationDependencyResolver' => EE_Dependency_Map::load_from_cache, |
|
| 808 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 809 | + ), |
|
| 810 | + 'EventEspresso\core\services\route_match\RouteMatchSpecificationManager' => array( |
|
| 811 | + 'EventEspresso\core\services\route_match\RouteMatchSpecificationCollection' => EE_Dependency_Map::load_from_cache, |
|
| 812 | + 'EventEspresso\core\services\route_match\RouteMatchSpecificationFactory' => EE_Dependency_Map::load_from_cache, |
|
| 813 | + ), |
|
| 814 | + 'EventEspresso\core\libraries\rest_api\CalculatedModelFields' => array( |
|
| 815 | + 'EventEspresso\core\libraries\rest_api\calculations\CalculatedModelFieldsFactory' => EE_Dependency_Map::load_from_cache |
|
| 816 | + ), |
|
| 817 | + 'EventEspresso\core\libraries\rest_api\calculations\CalculatedModelFieldsFactory' => array( |
|
| 818 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 819 | + ), |
|
| 820 | + 'EventEspresso\core\libraries\rest_api\controllers\model\Read' => array( |
|
| 821 | + 'EventEspresso\core\libraries\rest_api\CalculatedModelFields' => EE_Dependency_Map::load_from_cache |
|
| 822 | + ), |
|
| 823 | + 'EventEspresso\core\libraries\rest_api\calculations\Datetime' => array( |
|
| 824 | + 'EEM_Datetime' => EE_Dependency_Map::load_from_cache, |
|
| 825 | + 'EEM_Registration' => EE_Dependency_Map::load_from_cache |
|
| 826 | + ), |
|
| 827 | + 'EventEspresso\core\libraries\rest_api\calculations\Event' => array( |
|
| 828 | + 'EEM_Event' => EE_Dependency_Map::load_from_cache, |
|
| 829 | + 'EEM_Registration' => EE_Dependency_Map::load_from_cache |
|
| 830 | + ), |
|
| 831 | + 'EventEspresso\core\libraries\rest_api\calculations\Registration' => array( |
|
| 832 | + 'EEM_Registration' => EE_Dependency_Map::load_from_cache |
|
| 833 | + ), |
|
| 834 | + 'EventEspresso\core\services\session\SessionStartHandler' => array( |
|
| 835 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 836 | + ), |
|
| 837 | + 'EE_URL_Validation_Strategy' => array( |
|
| 838 | + null, |
|
| 839 | + null, |
|
| 840 | + 'EventEspresso\core\services\validators\URLValidator' => EE_Dependency_Map::load_from_cache |
|
| 841 | + ), |
|
| 842 | + 'EventEspresso\admin_pages\general_settings\OrganizationSettings' => array( |
|
| 843 | + 'EE_Registry' => EE_Dependency_Map::load_from_cache, |
|
| 844 | + 'EE_Organization_Config' => EE_Dependency_Map::load_from_cache, |
|
| 845 | + 'EE_Core_Config' => EE_Dependency_Map::load_from_cache, |
|
| 846 | + 'EE_Network_Core_Config' => EE_Dependency_Map::load_from_cache, |
|
| 847 | + 'EventEspresso\core\services\address\CountrySubRegionDao' => EE_Dependency_Map::load_from_cache, |
|
| 848 | + ), |
|
| 849 | + 'EventEspresso\core\services\address\CountrySubRegionDao' => array( |
|
| 850 | + 'EEM_State' => EE_Dependency_Map::load_from_cache, |
|
| 851 | + 'EventEspresso\core\services\validators\JsonValidator' => EE_Dependency_Map::load_from_cache |
|
| 852 | + ), |
|
| 853 | + 'EventEspresso\core\domain\services\admin\ajax\WordpressHeartbeat' => array( |
|
| 854 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 855 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 856 | + ), |
|
| 857 | + 'EventEspresso\core\domain\services\admin\ajax\EventEditorHeartbeat' => array( |
|
| 858 | + 'EventEspresso\core\domain\Domain' => EE_Dependency_Map::load_from_cache, |
|
| 859 | + 'EE_Environment_Config' => EE_Dependency_Map::load_from_cache, |
|
| 860 | + ), |
|
| 861 | + 'EventEspresso\core\services\request\files\FilesDataHandler' => array( |
|
| 862 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 863 | + ), |
|
| 864 | + 'EventEspressoBatchRequest\BatchRequestProcessor' => [ |
|
| 865 | + 'EventEspresso\core\services\loaders\Loader' => EE_Dependency_Map::load_from_cache, |
|
| 866 | + ], |
|
| 867 | + 'EventEspresso\core\domain\services\admin\registrations\list_table\QueryBuilder' => [ |
|
| 868 | + null, |
|
| 869 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 870 | + 'EEM_Registration' => EE_Dependency_Map::load_from_cache, |
|
| 871 | + ], |
|
| 872 | + 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\AttendeeFilterHeader' => [ |
|
| 873 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 874 | + 'EEM_Attendee' => EE_Dependency_Map::load_from_cache, |
|
| 875 | + ], |
|
| 876 | + 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\DateFilterHeader' => [ |
|
| 877 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 878 | + 'EEM_Datetime' => EE_Dependency_Map::load_from_cache, |
|
| 879 | + ], |
|
| 880 | + 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\EventFilterHeader' => [ |
|
| 881 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 882 | + 'EEM_Event' => EE_Dependency_Map::load_from_cache, |
|
| 883 | + ], |
|
| 884 | + 'EventEspresso\core\domain\services\admin\registrations\list_table\page_header\TicketFilterHeader' => [ |
|
| 885 | + 'EventEspresso\core\services\request\Request' => EE_Dependency_Map::load_from_cache, |
|
| 886 | + 'EEM_Ticket' => EE_Dependency_Map::load_from_cache, |
|
| 887 | + ], |
|
| 888 | + 'EventEspresso\core\domain\services\converters\RestApiSpoofer' => [ |
|
| 889 | + 'WP_REST_Server' => EE_Dependency_Map::load_from_cache, |
|
| 890 | + 'EED_Core_Rest_Api' => EE_Dependency_Map::load_from_cache, |
|
| 891 | + 'EventEspresso\core\libraries\rest_api\controllers\model\Read' => EE_Dependency_Map::load_from_cache, |
|
| 892 | + null |
|
| 893 | + ], |
|
| 894 | + 'EventEspresso\core\domain\services\admin\events\default_settings\AdvancedEditorAdminFormSection' => [ |
|
| 895 | + 'EE_Admin_Config' => EE_Dependency_Map::load_from_cache |
|
| 896 | + ], |
|
| 897 | + 'EventEspresso\core\domain\services\admin\events\editor\AdvancedEditorEntityData' => [ |
|
| 898 | + 'EventEspresso\core\domain\services\converters\RestApiSpoofer' => EE_Dependency_Map::load_from_cache, |
|
| 899 | + 'EE_Admin_Config' => EE_Dependency_Map::load_from_cache, |
|
| 900 | + 'EEM_Datetime' => EE_Dependency_Map::load_from_cache, |
|
| 901 | + 'EEM_Event' => EE_Dependency_Map::load_from_cache, |
|
| 902 | + 'EEM_Price' => EE_Dependency_Map::load_from_cache, |
|
| 903 | + 'EEM_Price_Type' => EE_Dependency_Map::load_from_cache, |
|
| 904 | + 'EEM_Ticket' => EE_Dependency_Map::load_from_cache, |
|
| 905 | + 'EEM_Venue' => EE_Dependency_Map::load_from_cache, |
|
| 906 | + ], |
|
| 907 | + ); |
|
| 908 | + } |
|
| 909 | + |
|
| 910 | + |
|
| 911 | + /** |
|
| 912 | + * Registers how core classes are loaded. |
|
| 913 | + * This can either be done by simply providing the name of one of the EE_Registry loader methods such as: |
|
| 914 | + * 'EE_Request_Handler' => 'load_core' |
|
| 915 | + * 'EE_Messages_Queue' => 'load_lib' |
|
| 916 | + * 'EEH_Debug_Tools' => 'load_helper' |
|
| 917 | + * or, if greater control is required, by providing a custom closure. For example: |
|
| 918 | + * 'Some_Class' => function () { |
|
| 919 | + * return new Some_Class(); |
|
| 920 | + * }, |
|
| 921 | + * This is required for instantiating dependencies |
|
| 922 | + * where an interface has been type hinted in a class constructor. For example: |
|
| 923 | + * 'Required_Interface' => function () { |
|
| 924 | + * return new A_Class_That_Implements_Required_Interface(); |
|
| 925 | + * }, |
|
| 926 | + */ |
|
| 927 | + protected function _register_core_class_loaders() |
|
| 928 | + { |
|
| 929 | + $this->_class_loaders = array( |
|
| 930 | + // load_core |
|
| 931 | + 'EE_Dependency_Map' => function () { |
|
| 932 | + return $this; |
|
| 933 | + }, |
|
| 934 | + 'EE_Capabilities' => 'load_core', |
|
| 935 | + 'EE_Encryption' => 'load_core', |
|
| 936 | + 'EE_Front_Controller' => 'load_core', |
|
| 937 | + 'EE_Module_Request_Router' => 'load_core', |
|
| 938 | + 'EE_Registry' => 'load_core', |
|
| 939 | + 'EE_Request' => function () { |
|
| 940 | + return $this->legacy_request; |
|
| 941 | + }, |
|
| 942 | + 'EventEspresso\core\services\request\Request' => function () { |
|
| 943 | + return $this->request; |
|
| 944 | + }, |
|
| 945 | + 'EventEspresso\core\services\request\Response' => function () { |
|
| 946 | + return $this->response; |
|
| 947 | + }, |
|
| 948 | + 'EE_Base' => 'load_core', |
|
| 949 | + 'EE_Request_Handler' => 'load_core', |
|
| 950 | + 'EE_Session' => 'load_core', |
|
| 951 | + 'EE_Cron_Tasks' => 'load_core', |
|
| 952 | + 'EE_System' => 'load_core', |
|
| 953 | + 'EE_Maintenance_Mode' => 'load_core', |
|
| 954 | + 'EE_Register_CPTs' => 'load_core', |
|
| 955 | + 'EE_Admin' => 'load_core', |
|
| 956 | + 'EE_CPT_Strategy' => 'load_core', |
|
| 957 | + // load_class |
|
| 958 | + 'EE_Registration_Processor' => 'load_class', |
|
| 959 | + // load_lib |
|
| 960 | + 'EE_Message_Resource_Manager' => 'load_lib', |
|
| 961 | + 'EE_Message_Type_Collection' => 'load_lib', |
|
| 962 | + 'EE_Message_Type_Collection_Loader' => 'load_lib', |
|
| 963 | + 'EE_Messenger_Collection' => 'load_lib', |
|
| 964 | + 'EE_Messenger_Collection_Loader' => 'load_lib', |
|
| 965 | + 'EE_Messages_Processor' => 'load_lib', |
|
| 966 | + 'EE_Message_Repository' => 'load_lib', |
|
| 967 | + 'EE_Messages_Queue' => 'load_lib', |
|
| 968 | + 'EE_Messages_Data_Handler_Collection' => 'load_lib', |
|
| 969 | + 'EE_Message_Template_Group_Collection' => 'load_lib', |
|
| 970 | + 'EE_Payment_Method_Manager' => 'load_lib', |
|
| 971 | + 'EE_DMS_Core_4_1_0' => 'load_dms', |
|
| 972 | + 'EE_DMS_Core_4_2_0' => 'load_dms', |
|
| 973 | + 'EE_DMS_Core_4_3_0' => 'load_dms', |
|
| 974 | + 'EE_DMS_Core_4_5_0' => 'load_dms', |
|
| 975 | + 'EE_DMS_Core_4_6_0' => 'load_dms', |
|
| 976 | + 'EE_DMS_Core_4_7_0' => 'load_dms', |
|
| 977 | + 'EE_DMS_Core_4_8_0' => 'load_dms', |
|
| 978 | + 'EE_DMS_Core_4_9_0' => 'load_dms', |
|
| 979 | + 'EE_DMS_Core_4_10_0' => 'load_dms', |
|
| 980 | + 'EE_Messages_Generator' => function () { |
|
| 981 | + return EE_Registry::instance()->load_lib( |
|
| 982 | + 'Messages_Generator', |
|
| 983 | + array(), |
|
| 984 | + false, |
|
| 985 | + false |
|
| 986 | + ); |
|
| 987 | + }, |
|
| 988 | + 'EE_Messages_Template_Defaults' => function ($arguments = array()) { |
|
| 989 | + return EE_Registry::instance()->load_lib( |
|
| 990 | + 'Messages_Template_Defaults', |
|
| 991 | + $arguments, |
|
| 992 | + false, |
|
| 993 | + false |
|
| 994 | + ); |
|
| 995 | + }, |
|
| 996 | + // load_helper |
|
| 997 | + 'EEH_Parse_Shortcodes' => function () { |
|
| 998 | + if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) { |
|
| 999 | + return new EEH_Parse_Shortcodes(); |
|
| 1000 | + } |
|
| 1001 | + return null; |
|
| 1002 | + }, |
|
| 1003 | + 'EE_Template_Config' => function () { |
|
| 1004 | + return EE_Config::instance()->template_settings; |
|
| 1005 | + }, |
|
| 1006 | + 'EE_Currency_Config' => function () { |
|
| 1007 | + return EE_Config::instance()->currency; |
|
| 1008 | + }, |
|
| 1009 | + 'EE_Registration_Config' => function () { |
|
| 1010 | + return EE_Config::instance()->registration; |
|
| 1011 | + }, |
|
| 1012 | + 'EE_Core_Config' => function () { |
|
| 1013 | + return EE_Config::instance()->core; |
|
| 1014 | + }, |
|
| 1015 | + 'EventEspresso\core\services\loaders\Loader' => function () { |
|
| 1016 | + return LoaderFactory::getLoader(); |
|
| 1017 | + }, |
|
| 1018 | + 'EE_Network_Config' => function () { |
|
| 1019 | + return EE_Network_Config::instance(); |
|
| 1020 | + }, |
|
| 1021 | + 'EE_Config' => function () { |
|
| 1022 | + return EE_Config::instance(); |
|
| 1023 | + }, |
|
| 1024 | + 'EventEspresso\core\domain\Domain' => function () { |
|
| 1025 | + return DomainFactory::getEventEspressoCoreDomain(); |
|
| 1026 | + }, |
|
| 1027 | + 'EE_Admin_Config' => function () { |
|
| 1028 | + return EE_Config::instance()->admin; |
|
| 1029 | + }, |
|
| 1030 | + 'EE_Organization_Config' => function () { |
|
| 1031 | + return EE_Config::instance()->organization; |
|
| 1032 | + }, |
|
| 1033 | + 'EE_Network_Core_Config' => function () { |
|
| 1034 | + return EE_Network_Config::instance()->core; |
|
| 1035 | + }, |
|
| 1036 | + 'EE_Environment_Config' => function () { |
|
| 1037 | + return EE_Config::instance()->environment; |
|
| 1038 | + }, |
|
| 1039 | + 'EED_Core_Rest_Api' => static function () { |
|
| 1040 | + return EED_Core_Rest_Api::instance(); |
|
| 1041 | + }, |
|
| 1042 | + ); |
|
| 1043 | + } |
|
| 1044 | + |
|
| 1045 | + |
|
| 1046 | + /** |
|
| 1047 | + * can be used for supplying alternate names for classes, |
|
| 1048 | + * or for connecting interface names to instantiable classes |
|
| 1049 | + */ |
|
| 1050 | + protected function _register_core_aliases() |
|
| 1051 | + { |
|
| 1052 | + $aliases = array( |
|
| 1053 | + 'CommandBusInterface' => 'EventEspresso\core\services\commands\CommandBusInterface', |
|
| 1054 | + 'EventEspresso\core\services\commands\CommandBusInterface' => 'EventEspresso\core\services\commands\CommandBus', |
|
| 1055 | + 'CommandHandlerManagerInterface' => 'EventEspresso\core\services\commands\CommandHandlerManagerInterface', |
|
| 1056 | + 'EventEspresso\core\services\commands\CommandHandlerManagerInterface' => 'EventEspresso\core\services\commands\CommandHandlerManager', |
|
| 1057 | + 'CapChecker' => 'EventEspresso\core\services\commands\middleware\CapChecker', |
|
| 1058 | + 'AddActionHook' => 'EventEspresso\core\services\commands\middleware\AddActionHook', |
|
| 1059 | + 'CapabilitiesChecker' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker', |
|
| 1060 | + 'CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface', |
|
| 1061 | + 'EventEspresso\core\domain\services\capabilities\CapabilitiesCheckerInterface' => 'EventEspresso\core\domain\services\capabilities\CapabilitiesChecker', |
|
| 1062 | + 'CreateRegistrationService' => 'EventEspresso\core\domain\services\registration\CreateRegistrationService', |
|
| 1063 | + 'CreateRegistrationCommandHandler' => 'EventEspresso\core\services\commands\registration\CreateRegistrationCommand', |
|
| 1064 | + 'CopyRegistrationDetailsCommandHandler' => 'EventEspresso\core\services\commands\registration\CopyRegistrationDetailsCommand', |
|
| 1065 | + 'CopyRegistrationPaymentsCommandHandler' => 'EventEspresso\core\services\commands\registration\CopyRegistrationPaymentsCommand', |
|
| 1066 | + 'CancelRegistrationAndTicketLineItemCommandHandler' => 'EventEspresso\core\services\commands\registration\CancelRegistrationAndTicketLineItemCommandHandler', |
|
| 1067 | + 'UpdateRegistrationAndTransactionAfterChangeCommandHandler' => 'EventEspresso\core\services\commands\registration\UpdateRegistrationAndTransactionAfterChangeCommandHandler', |
|
| 1068 | + 'CreateTicketLineItemCommandHandler' => 'EventEspresso\core\services\commands\ticket\CreateTicketLineItemCommand', |
|
| 1069 | + 'CreateTransactionCommandHandler' => 'EventEspresso\core\services\commands\transaction\CreateTransactionCommandHandler', |
|
| 1070 | + 'CreateAttendeeCommandHandler' => 'EventEspresso\core\services\commands\attendee\CreateAttendeeCommandHandler', |
|
| 1071 | + 'TableManager' => 'EventEspresso\core\services\database\TableManager', |
|
| 1072 | + 'TableAnalysis' => 'EventEspresso\core\services\database\TableAnalysis', |
|
| 1073 | + 'EspressoShortcode' => 'EventEspresso\core\services\shortcodes\EspressoShortcode', |
|
| 1074 | + 'ShortcodeInterface' => 'EventEspresso\core\services\shortcodes\ShortcodeInterface', |
|
| 1075 | + 'EventEspresso\core\services\shortcodes\ShortcodeInterface' => 'EventEspresso\core\services\shortcodes\EspressoShortcode', |
|
| 1076 | + 'EventEspresso\core\services\cache\CacheStorageInterface' => 'EventEspresso\core\services\cache\TransientCacheStorage', |
|
| 1077 | + 'LoaderInterface' => 'EventEspresso\core\services\loaders\LoaderInterface', |
|
| 1078 | + 'EventEspresso\core\services\loaders\LoaderInterface' => 'EventEspresso\core\services\loaders\Loader', |
|
| 1079 | + 'CommandFactoryInterface' => 'EventEspresso\core\services\commands\CommandFactoryInterface', |
|
| 1080 | + 'EventEspresso\core\services\commands\CommandFactoryInterface' => 'EventEspresso\core\services\commands\CommandFactory', |
|
| 1081 | + 'EmailValidatorInterface' => 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface', |
|
| 1082 | + 'EventEspresso\core\domain\services\validation\email\EmailValidatorInterface' => 'EventEspresso\core\domain\services\validation\email\EmailValidationService', |
|
| 1083 | + 'NoticeConverterInterface' => 'EventEspresso\core\services\notices\NoticeConverterInterface', |
|
| 1084 | + 'EventEspresso\core\services\notices\NoticeConverterInterface' => 'EventEspresso\core\services\notices\ConvertNoticesToEeErrors', |
|
| 1085 | + 'NoticesContainerInterface' => 'EventEspresso\core\services\notices\NoticesContainerInterface', |
|
| 1086 | + 'EventEspresso\core\services\notices\NoticesContainerInterface' => 'EventEspresso\core\services\notices\NoticesContainer', |
|
| 1087 | + 'EventEspresso\core\services\request\RequestInterface' => 'EventEspresso\core\services\request\Request', |
|
| 1088 | + 'EventEspresso\core\services\request\ResponseInterface' => 'EventEspresso\core\services\request\Response', |
|
| 1089 | + 'EventEspresso\core\domain\DomainInterface' => 'EventEspresso\core\domain\Domain', |
|
| 1090 | + 'Registration_Processor' => 'EE_Registration_Processor', |
|
| 1091 | + ); |
|
| 1092 | + foreach ($aliases as $alias => $fqn) { |
|
| 1093 | + if (is_array($fqn)) { |
|
| 1094 | + foreach ($fqn as $class => $for_class) { |
|
| 1095 | + $this->class_cache->addAlias($class, $alias, $for_class); |
|
| 1096 | + } |
|
| 1097 | + continue; |
|
| 1098 | + } |
|
| 1099 | + $this->class_cache->addAlias($fqn, $alias); |
|
| 1100 | + } |
|
| 1101 | + if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) { |
|
| 1102 | + $this->class_cache->addAlias( |
|
| 1103 | + 'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices', |
|
| 1104 | + 'EventEspresso\core\services\notices\NoticeConverterInterface' |
|
| 1105 | + ); |
|
| 1106 | + } |
|
| 1107 | + } |
|
| 1108 | + |
|
| 1109 | + |
|
| 1110 | + /** |
|
| 1111 | + * This is used to reset the internal map and class_loaders to their original default state at the beginning of the |
|
| 1112 | + * request Primarily used by unit tests. |
|
| 1113 | + */ |
|
| 1114 | + public function reset() |
|
| 1115 | + { |
|
| 1116 | + $this->_register_core_class_loaders(); |
|
| 1117 | + $this->_register_core_dependencies(); |
|
| 1118 | + } |
|
| 1119 | + |
|
| 1120 | + |
|
| 1121 | + /** |
|
| 1122 | + * PLZ NOTE: a better name for this method would be is_alias() |
|
| 1123 | + * because it returns TRUE if the provided fully qualified name IS an alias |
|
| 1124 | + * WHY? |
|
| 1125 | + * Because if a class is type hinting for a concretion, |
|
| 1126 | + * then why would we need to find another class to supply it? |
|
| 1127 | + * ie: if a class asks for `Fully/Qualified/Namespace/SpecificClassName`, |
|
| 1128 | + * then give it an instance of `Fully/Qualified/Namespace/SpecificClassName`. |
|
| 1129 | + * Don't go looking for some substitute. |
|
| 1130 | + * Whereas if a class is type hinting for an interface... |
|
| 1131 | + * then we need to find an actual class to use. |
|
| 1132 | + * So the interface IS the alias for some other FQN, |
|
| 1133 | + * and we need to find out if `Fully/Qualified/Namespace/SomeInterface` |
|
| 1134 | + * represents some other class. |
|
| 1135 | + * |
|
| 1136 | + * @deprecated 4.9.62.p |
|
| 1137 | + * @param string $fqn |
|
| 1138 | + * @param string $for_class |
|
| 1139 | + * @return bool |
|
| 1140 | + */ |
|
| 1141 | + public function has_alias($fqn = '', $for_class = '') |
|
| 1142 | + { |
|
| 1143 | + return $this->isAlias($fqn, $for_class); |
|
| 1144 | + } |
|
| 1145 | + |
|
| 1146 | + |
|
| 1147 | + /** |
|
| 1148 | + * PLZ NOTE: a better name for this method would be get_fqn_for_alias() |
|
| 1149 | + * because it returns a FQN for provided alias if one exists, otherwise returns the original $alias |
|
| 1150 | + * functions recursively, so that multiple aliases can be used to drill down to a FQN |
|
| 1151 | + * for example: |
|
| 1152 | + * if the following two entries were added to the _aliases array: |
|
| 1153 | + * array( |
|
| 1154 | + * 'interface_alias' => 'some\namespace\interface' |
|
| 1155 | + * 'some\namespace\interface' => 'some\namespace\classname' |
|
| 1156 | + * ) |
|
| 1157 | + * then one could use EE_Registry::instance()->create( 'interface_alias' ) |
|
| 1158 | + * to load an instance of 'some\namespace\classname' |
|
| 1159 | + * |
|
| 1160 | + * @deprecated 4.9.62.p |
|
| 1161 | + * @param string $alias |
|
| 1162 | + * @param string $for_class |
|
| 1163 | + * @return string |
|
| 1164 | + */ |
|
| 1165 | + public function get_alias($alias = '', $for_class = '') |
|
| 1166 | + { |
|
| 1167 | + return $this->getFqnForAlias($alias, $for_class); |
|
| 1168 | + } |
|
| 1169 | 1169 | } |
@@ -122,7 +122,7 @@ discard block |
||
| 122 | 122 | public static function instance(ClassInterfaceCache $class_cache = null) |
| 123 | 123 | { |
| 124 | 124 | // check if class object is instantiated, and instantiated properly |
| 125 | - if (! self::$_instance instanceof EE_Dependency_Map |
|
| 125 | + if ( ! self::$_instance instanceof EE_Dependency_Map |
|
| 126 | 126 | && $class_cache instanceof ClassInterfaceCache |
| 127 | 127 | ) { |
| 128 | 128 | self::$_instance = new EE_Dependency_Map($class_cache); |
@@ -203,18 +203,18 @@ discard block |
||
| 203 | 203 | ) { |
| 204 | 204 | $class = trim($class, '\\'); |
| 205 | 205 | $registered = false; |
| 206 | - if (empty(self::$_instance->_dependency_map[ $class ])) { |
|
| 207 | - self::$_instance->_dependency_map[ $class ] = array(); |
|
| 206 | + if (empty(self::$_instance->_dependency_map[$class])) { |
|
| 207 | + self::$_instance->_dependency_map[$class] = array(); |
|
| 208 | 208 | } |
| 209 | 209 | // we need to make sure that any aliases used when registering a dependency |
| 210 | 210 | // get resolved to the correct class name |
| 211 | 211 | foreach ($dependencies as $dependency => $load_source) { |
| 212 | 212 | $alias = self::$_instance->getFqnForAlias($dependency); |
| 213 | 213 | if ($overwrite === EE_Dependency_Map::OVERWRITE_DEPENDENCIES |
| 214 | - || ! isset(self::$_instance->_dependency_map[ $class ][ $alias ]) |
|
| 214 | + || ! isset(self::$_instance->_dependency_map[$class][$alias]) |
|
| 215 | 215 | ) { |
| 216 | - unset($dependencies[ $dependency ]); |
|
| 217 | - $dependencies[ $alias ] = $load_source; |
|
| 216 | + unset($dependencies[$dependency]); |
|
| 217 | + $dependencies[$alias] = $load_source; |
|
| 218 | 218 | $registered = true; |
| 219 | 219 | } |
| 220 | 220 | } |
@@ -224,13 +224,13 @@ discard block |
||
| 224 | 224 | // ie: with A = B + C, entries in B take precedence over duplicate entries in C |
| 225 | 225 | // Union is way faster than array_merge() but should be used with caution... |
| 226 | 226 | // especially with numerically indexed arrays |
| 227 | - $dependencies += self::$_instance->_dependency_map[ $class ]; |
|
| 227 | + $dependencies += self::$_instance->_dependency_map[$class]; |
|
| 228 | 228 | // now we need to ensure that the resulting dependencies |
| 229 | 229 | // array only has the entries that are required for the class |
| 230 | 230 | // so first count how many dependencies were originally registered for the class |
| 231 | - $dependency_count = count(self::$_instance->_dependency_map[ $class ]); |
|
| 231 | + $dependency_count = count(self::$_instance->_dependency_map[$class]); |
|
| 232 | 232 | // if that count is non-zero (meaning dependencies were already registered) |
| 233 | - self::$_instance->_dependency_map[ $class ] = $dependency_count |
|
| 233 | + self::$_instance->_dependency_map[$class] = $dependency_count |
|
| 234 | 234 | // then truncate the final array to match that count |
| 235 | 235 | ? array_slice($dependencies, 0, $dependency_count) |
| 236 | 236 | // otherwise just take the incoming array because nothing previously existed |
@@ -247,13 +247,13 @@ discard block |
||
| 247 | 247 | */ |
| 248 | 248 | public static function register_class_loader($class_name, $loader = 'load_core') |
| 249 | 249 | { |
| 250 | - if (! $loader instanceof Closure && strpos($class_name, '\\') !== false) { |
|
| 250 | + if ( ! $loader instanceof Closure && strpos($class_name, '\\') !== false) { |
|
| 251 | 251 | throw new DomainException( |
| 252 | 252 | esc_html__('Don\'t use class loaders for FQCNs.', 'event_espresso') |
| 253 | 253 | ); |
| 254 | 254 | } |
| 255 | 255 | // check that loader is callable or method starts with "load_" and exists in EE_Registry |
| 256 | - if (! is_callable($loader) |
|
| 256 | + if ( ! is_callable($loader) |
|
| 257 | 257 | && ( |
| 258 | 258 | strpos($loader, 'load_') !== 0 |
| 259 | 259 | || ! method_exists('EE_Registry', $loader) |
@@ -270,8 +270,8 @@ discard block |
||
| 270 | 270 | ); |
| 271 | 271 | } |
| 272 | 272 | $class_name = self::$_instance->getFqnForAlias($class_name); |
| 273 | - if (! isset(self::$_instance->_class_loaders[ $class_name ])) { |
|
| 274 | - self::$_instance->_class_loaders[ $class_name ] = $loader; |
|
| 273 | + if ( ! isset(self::$_instance->_class_loaders[$class_name])) { |
|
| 274 | + self::$_instance->_class_loaders[$class_name] = $loader; |
|
| 275 | 275 | return true; |
| 276 | 276 | } |
| 277 | 277 | return false; |
@@ -299,7 +299,7 @@ discard block |
||
| 299 | 299 | if (strpos($class_name, 'EEM_') === 0) { |
| 300 | 300 | $class_name = 'LEGACY_MODELS'; |
| 301 | 301 | } |
| 302 | - return isset($this->_dependency_map[ $class_name ]) ? true : false; |
|
| 302 | + return isset($this->_dependency_map[$class_name]) ? true : false; |
|
| 303 | 303 | } |
| 304 | 304 | |
| 305 | 305 | |
@@ -317,7 +317,7 @@ discard block |
||
| 317 | 317 | $class_name = 'LEGACY_MODELS'; |
| 318 | 318 | } |
| 319 | 319 | $dependency = $this->getFqnForAlias($dependency, $class_name); |
| 320 | - return isset($this->_dependency_map[ $class_name ][ $dependency ]) |
|
| 320 | + return isset($this->_dependency_map[$class_name][$dependency]) |
|
| 321 | 321 | ? true |
| 322 | 322 | : false; |
| 323 | 323 | } |
@@ -338,7 +338,7 @@ discard block |
||
| 338 | 338 | } |
| 339 | 339 | $dependency = $this->getFqnForAlias($dependency); |
| 340 | 340 | return $this->has_dependency_for_class($class_name, $dependency) |
| 341 | - ? $this->_dependency_map[ $class_name ][ $dependency ] |
|
| 341 | + ? $this->_dependency_map[$class_name][$dependency] |
|
| 342 | 342 | : EE_Dependency_Map::not_registered; |
| 343 | 343 | } |
| 344 | 344 | |
@@ -361,7 +361,7 @@ discard block |
||
| 361 | 361 | return 'load_core'; |
| 362 | 362 | } |
| 363 | 363 | $class_name = $this->getFqnForAlias($class_name); |
| 364 | - return isset($this->_class_loaders[ $class_name ]) ? $this->_class_loaders[ $class_name ] : ''; |
|
| 364 | + return isset($this->_class_loaders[$class_name]) ? $this->_class_loaders[$class_name] : ''; |
|
| 365 | 365 | } |
| 366 | 366 | |
| 367 | 367 | |
@@ -928,7 +928,7 @@ discard block |
||
| 928 | 928 | { |
| 929 | 929 | $this->_class_loaders = array( |
| 930 | 930 | // load_core |
| 931 | - 'EE_Dependency_Map' => function () { |
|
| 931 | + 'EE_Dependency_Map' => function() { |
|
| 932 | 932 | return $this; |
| 933 | 933 | }, |
| 934 | 934 | 'EE_Capabilities' => 'load_core', |
@@ -936,13 +936,13 @@ discard block |
||
| 936 | 936 | 'EE_Front_Controller' => 'load_core', |
| 937 | 937 | 'EE_Module_Request_Router' => 'load_core', |
| 938 | 938 | 'EE_Registry' => 'load_core', |
| 939 | - 'EE_Request' => function () { |
|
| 939 | + 'EE_Request' => function() { |
|
| 940 | 940 | return $this->legacy_request; |
| 941 | 941 | }, |
| 942 | - 'EventEspresso\core\services\request\Request' => function () { |
|
| 942 | + 'EventEspresso\core\services\request\Request' => function() { |
|
| 943 | 943 | return $this->request; |
| 944 | 944 | }, |
| 945 | - 'EventEspresso\core\services\request\Response' => function () { |
|
| 945 | + 'EventEspresso\core\services\request\Response' => function() { |
|
| 946 | 946 | return $this->response; |
| 947 | 947 | }, |
| 948 | 948 | 'EE_Base' => 'load_core', |
@@ -977,7 +977,7 @@ discard block |
||
| 977 | 977 | 'EE_DMS_Core_4_8_0' => 'load_dms', |
| 978 | 978 | 'EE_DMS_Core_4_9_0' => 'load_dms', |
| 979 | 979 | 'EE_DMS_Core_4_10_0' => 'load_dms', |
| 980 | - 'EE_Messages_Generator' => function () { |
|
| 980 | + 'EE_Messages_Generator' => function() { |
|
| 981 | 981 | return EE_Registry::instance()->load_lib( |
| 982 | 982 | 'Messages_Generator', |
| 983 | 983 | array(), |
@@ -985,7 +985,7 @@ discard block |
||
| 985 | 985 | false |
| 986 | 986 | ); |
| 987 | 987 | }, |
| 988 | - 'EE_Messages_Template_Defaults' => function ($arguments = array()) { |
|
| 988 | + 'EE_Messages_Template_Defaults' => function($arguments = array()) { |
|
| 989 | 989 | return EE_Registry::instance()->load_lib( |
| 990 | 990 | 'Messages_Template_Defaults', |
| 991 | 991 | $arguments, |
@@ -994,49 +994,49 @@ discard block |
||
| 994 | 994 | ); |
| 995 | 995 | }, |
| 996 | 996 | // load_helper |
| 997 | - 'EEH_Parse_Shortcodes' => function () { |
|
| 997 | + 'EEH_Parse_Shortcodes' => function() { |
|
| 998 | 998 | if (EE_Registry::instance()->load_helper('Parse_Shortcodes')) { |
| 999 | 999 | return new EEH_Parse_Shortcodes(); |
| 1000 | 1000 | } |
| 1001 | 1001 | return null; |
| 1002 | 1002 | }, |
| 1003 | - 'EE_Template_Config' => function () { |
|
| 1003 | + 'EE_Template_Config' => function() { |
|
| 1004 | 1004 | return EE_Config::instance()->template_settings; |
| 1005 | 1005 | }, |
| 1006 | - 'EE_Currency_Config' => function () { |
|
| 1006 | + 'EE_Currency_Config' => function() { |
|
| 1007 | 1007 | return EE_Config::instance()->currency; |
| 1008 | 1008 | }, |
| 1009 | - 'EE_Registration_Config' => function () { |
|
| 1009 | + 'EE_Registration_Config' => function() { |
|
| 1010 | 1010 | return EE_Config::instance()->registration; |
| 1011 | 1011 | }, |
| 1012 | - 'EE_Core_Config' => function () { |
|
| 1012 | + 'EE_Core_Config' => function() { |
|
| 1013 | 1013 | return EE_Config::instance()->core; |
| 1014 | 1014 | }, |
| 1015 | - 'EventEspresso\core\services\loaders\Loader' => function () { |
|
| 1015 | + 'EventEspresso\core\services\loaders\Loader' => function() { |
|
| 1016 | 1016 | return LoaderFactory::getLoader(); |
| 1017 | 1017 | }, |
| 1018 | - 'EE_Network_Config' => function () { |
|
| 1018 | + 'EE_Network_Config' => function() { |
|
| 1019 | 1019 | return EE_Network_Config::instance(); |
| 1020 | 1020 | }, |
| 1021 | - 'EE_Config' => function () { |
|
| 1021 | + 'EE_Config' => function() { |
|
| 1022 | 1022 | return EE_Config::instance(); |
| 1023 | 1023 | }, |
| 1024 | - 'EventEspresso\core\domain\Domain' => function () { |
|
| 1024 | + 'EventEspresso\core\domain\Domain' => function() { |
|
| 1025 | 1025 | return DomainFactory::getEventEspressoCoreDomain(); |
| 1026 | 1026 | }, |
| 1027 | - 'EE_Admin_Config' => function () { |
|
| 1027 | + 'EE_Admin_Config' => function() { |
|
| 1028 | 1028 | return EE_Config::instance()->admin; |
| 1029 | 1029 | }, |
| 1030 | - 'EE_Organization_Config' => function () { |
|
| 1030 | + 'EE_Organization_Config' => function() { |
|
| 1031 | 1031 | return EE_Config::instance()->organization; |
| 1032 | 1032 | }, |
| 1033 | - 'EE_Network_Core_Config' => function () { |
|
| 1033 | + 'EE_Network_Core_Config' => function() { |
|
| 1034 | 1034 | return EE_Network_Config::instance()->core; |
| 1035 | 1035 | }, |
| 1036 | - 'EE_Environment_Config' => function () { |
|
| 1036 | + 'EE_Environment_Config' => function() { |
|
| 1037 | 1037 | return EE_Config::instance()->environment; |
| 1038 | 1038 | }, |
| 1039 | - 'EED_Core_Rest_Api' => static function () { |
|
| 1039 | + 'EED_Core_Rest_Api' => static function() { |
|
| 1040 | 1040 | return EED_Core_Rest_Api::instance(); |
| 1041 | 1041 | }, |
| 1042 | 1042 | ); |
@@ -1098,7 +1098,7 @@ discard block |
||
| 1098 | 1098 | } |
| 1099 | 1099 | $this->class_cache->addAlias($fqn, $alias); |
| 1100 | 1100 | } |
| 1101 | - if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) { |
|
| 1101 | + if ( ! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) { |
|
| 1102 | 1102 | $this->class_cache->addAlias( |
| 1103 | 1103 | 'EventEspresso\core\services\notices\ConvertNoticesToAdminNotices', |
| 1104 | 1104 | 'EventEspresso\core\services\notices\NoticeConverterInterface' |