Completed
Branch BUG-10626-dst-unit-test (cc62a6)
by
unknown
37:15 queued 23:58
created
acceptance_tests/Page/CountrySettingsAdmin.php 1 patch
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -14,51 +14,51 @@
 block discarded – undo
14 14
 {
15 15
 
16 16
 
17
-    const COUNTRY_SETTINGS_SAVE_BUTTON = '#country_settings_save_2';
17
+	const COUNTRY_SETTINGS_SAVE_BUTTON = '#country_settings_save_2';
18 18
 
19 19
 
20 20
 
21
-    /**
22
-     * Return the url for the country settings admin page.
23
-     * @param string $additional_params
24
-     * @return string
25
-     */
26
-    public static function url($additional_params = '')
27
-    {
28
-        return self::adminUrl('espresso_general_settings', 'country_settings', $additional_params);
29
-    }
21
+	/**
22
+	 * Return the url for the country settings admin page.
23
+	 * @param string $additional_params
24
+	 * @return string
25
+	 */
26
+	public static function url($additional_params = '')
27
+	{
28
+		return self::adminUrl('espresso_general_settings', 'country_settings', $additional_params);
29
+	}
30 30
 
31 31
 
32
-    /**
33
-     * Return the decimal places (precision) radio field locator for selection.
34
-     * @param int    $decimal_place_value
35
-     * @param string $country_code
36
-     * @return string
37
-     */
38
-    public static function currencyDecimalPlacesRadioField($decimal_place_value = 2, $country_code = 'US')
39
-    {
40
-        return "//input[@id='CNT_cur_dec_plc-$country_code-$decimal_place_value']";
41
-    }
32
+	/**
33
+	 * Return the decimal places (precision) radio field locator for selection.
34
+	 * @param int    $decimal_place_value
35
+	 * @param string $country_code
36
+	 * @return string
37
+	 */
38
+	public static function currencyDecimalPlacesRadioField($decimal_place_value = 2, $country_code = 'US')
39
+	{
40
+		return "//input[@id='CNT_cur_dec_plc-$country_code-$decimal_place_value']";
41
+	}
42 42
 
43 43
 
44
-    /**
45
-     * Return the currency decimal mark field locator for selection.
46
-     * @param string $decimal_mark
47
-     * @return string
48
-     */
49
-    public static function currencyDecimalMarkRadioField($decimal_mark = '.')
50
-    {
51
-        return "//input[@class='CNT_cur_dec_mrk' and @value='$decimal_mark']";
52
-    }
44
+	/**
45
+	 * Return the currency decimal mark field locator for selection.
46
+	 * @param string $decimal_mark
47
+	 * @return string
48
+	 */
49
+	public static function currencyDecimalMarkRadioField($decimal_mark = '.')
50
+	{
51
+		return "//input[@class='CNT_cur_dec_mrk' and @value='$decimal_mark']";
52
+	}
53 53
 
54 54
 
55
-    /**
56
-     * Return the currency thousands separator field locator for selection.
57
-     * @param string $thousands_separator
58
-     * @return string
59
-     */
60
-    public static function currencyThousandsSeparatorField($thousands_separator = ',')
61
-    {
62
-        return "//input[@class='CNT_cur_thsnds' and @value='$thousands_separator']";
63
-    }
55
+	/**
56
+	 * Return the currency thousands separator field locator for selection.
57
+	 * @param string $thousands_separator
58
+	 * @return string
59
+	 */
60
+	public static function currencyThousandsSeparatorField($thousands_separator = ',')
61
+	{
62
+		return "//input[@class='CNT_cur_thsnds' and @value='$thousands_separator']";
63
+	}
64 64
 }
65 65
\ No newline at end of file
Please login to merge, or discard this patch.
caffeinated/admin/extend/events/Extend_Events_Admin_Page.core.php 3 patches
Doc Comments   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -339,7 +339,7 @@  discard block
 block discarded – undo
339 339
      * Returns template for the additional datetime.
340 340
      * @param $template
341 341
      * @param $template_args
342
-     * @return mixed
342
+     * @return string
343 343
      * @throws DomainException
344 344
      */
345 345
     public function add_additional_datetime_button($template, $template_args)
@@ -356,7 +356,7 @@  discard block
 block discarded – undo
356 356
      * Returns the template for cloning a datetime.
357 357
      * @param $template
358 358
      * @param $template_args
359
-     * @return mixed
359
+     * @return string
360 360
      * @throws DomainException
361 361
      */
362 362
     public function add_datetime_clone_button($template, $template_args)
@@ -373,7 +373,7 @@  discard block
 block discarded – undo
373 373
      * Returns the template for datetime timezones.
374 374
      * @param $template
375 375
      * @param $template_args
376
-     * @return mixed
376
+     * @return string
377 377
      * @throws DomainException
378 378
      */
379 379
     public function datetime_timezones_template($template, $template_args)
Please login to merge, or discard this patch.
Spacing   +53 added lines, -53 removed lines patch added patch discarded remove patch
@@ -22,10 +22,10 @@  discard block
 block discarded – undo
22 22
     public function __construct($routing = true)
23 23
     {
24 24
         parent::__construct($routing);
25
-        if (! defined('EVENTS_CAF_TEMPLATE_PATH')) {
26
-            define('EVENTS_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'events/templates/');
27
-            define('EVENTS_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'events/assets/');
28
-            define('EVENTS_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'events/assets/');
25
+        if ( ! defined('EVENTS_CAF_TEMPLATE_PATH')) {
26
+            define('EVENTS_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND.'events/templates/');
27
+            define('EVENTS_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND.'events/assets/');
28
+            define('EVENTS_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL.'events/assets/');
29 29
         }
30 30
     }
31 31
 
@@ -35,7 +35,7 @@  discard block
 block discarded – undo
35 35
      */
36 36
     protected function _extend_page_config()
37 37
     {
38
-        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'events';
38
+        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND.'events';
39 39
         //is there a evt_id in the request?
40 40
         $evt_id = ! empty($this->_req_data['EVT_ID']) && ! is_array($this->_req_data['EVT_ID'])
41 41
             ? $this->_req_data['EVT_ID']
@@ -168,7 +168,7 @@  discard block
 block discarded – undo
168 168
             'help_tour'     => array('Templates_Help_Tour'),
169 169
             'require_nonce' => false,
170 170
         );
171
-        $this->_page_config                   = array_merge($this->_page_config, $new_page_config);
171
+        $this->_page_config = array_merge($this->_page_config, $new_page_config);
172 172
         //add filters and actions
173 173
         //modifying _views
174 174
         add_filter(
@@ -241,7 +241,7 @@  discard block
 block discarded – undo
241 241
          * check whether count of tickets is approaching the potential
242 242
          * limits for the server.
243 243
          */
244
-        if (! empty($data['input_count'])) {
244
+        if ( ! empty($data['input_count'])) {
245 245
             $response['max_input_vars_check'] = EE_Registry::instance()->CFG->environment->max_input_vars_limit_check(
246 246
                 $data['input_count']
247 247
             );
@@ -270,12 +270,12 @@  discard block
 block discarded – undo
270 270
     {
271 271
         $return = parent::extra_permalink_field_buttons($return, $id, $new_title, $new_slug);
272 272
         //make sure this is only when editing
273
-        if (! empty($id)) {
274
-            $href   = EE_Admin_Page::add_query_args_and_nonce(
273
+        if ( ! empty($id)) {
274
+            $href = EE_Admin_Page::add_query_args_and_nonce(
275 275
                 array('action' => 'duplicate_event', 'EVT_ID' => $id),
276 276
                 $this->_admin_base_url
277 277
             );
278
-            $title  = esc_attr__('Duplicate Event', 'event_espresso');
278
+            $title = esc_attr__('Duplicate Event', 'event_espresso');
279 279
             $return .= '<a href="'
280 280
                        . $href
281 281
                        . '" title="'
@@ -322,7 +322,7 @@  discard block
 block discarded – undo
322 322
     {
323 323
         wp_register_script(
324 324
             'ee-event-editor-heartbeat',
325
-            EVENTS_CAF_ASSETS_URL . 'event-editor-heartbeat.js',
325
+            EVENTS_CAF_ASSETS_URL.'event-editor-heartbeat.js',
326 326
             array('ee_admin_js', 'heartbeat'),
327 327
             EVENT_ESPRESSO_VERSION,
328 328
             true
@@ -345,7 +345,7 @@  discard block
 block discarded – undo
345 345
     public function add_additional_datetime_button($template, $template_args)
346 346
     {
347 347
         return EEH_Template::display_template(
348
-            EVENTS_CAF_TEMPLATE_PATH . 'event_datetime_add_additional_time.template.php',
348
+            EVENTS_CAF_TEMPLATE_PATH.'event_datetime_add_additional_time.template.php',
349 349
             $template_args,
350 350
             true
351 351
         );
@@ -362,7 +362,7 @@  discard block
 block discarded – undo
362 362
     public function add_datetime_clone_button($template, $template_args)
363 363
     {
364 364
         return EEH_Template::display_template(
365
-            EVENTS_CAF_TEMPLATE_PATH . 'event_datetime_metabox_clone_button.template.php',
365
+            EVENTS_CAF_TEMPLATE_PATH.'event_datetime_metabox_clone_button.template.php',
366 366
             $template_args,
367 367
             true
368 368
         );
@@ -379,7 +379,7 @@  discard block
 block discarded – undo
379 379
     public function datetime_timezones_template($template, $template_args)
380 380
     {
381 381
         return EEH_Template::display_template(
382
-            EVENTS_CAF_TEMPLATE_PATH . 'event_datetime_timezones.template.php',
382
+            EVENTS_CAF_TEMPLATE_PATH.'event_datetime_timezones.template.php',
383 383
             $template_args,
384 384
             true
385 385
         );
@@ -392,7 +392,7 @@  discard block
 block discarded – undo
392 392
     protected function _set_list_table_views_default()
393 393
     {
394 394
         parent::_set_list_table_views_default();
395
-        $new_views    = array(
395
+        $new_views = array(
396 396
             'today' => array(
397 397
                 'slug'        => 'today',
398 398
                 'label'       => esc_html__('Today', 'event_espresso'),
@@ -497,7 +497,7 @@  discard block
 block discarded – undo
497 497
     {
498 498
         // first make sure the ID for the event is in the request.
499 499
         //  If it isn't then we need to bail and redirect back to overview list table (cause how did we get here?)
500
-        if (! isset($this->_req_data['EVT_ID'])) {
500
+        if ( ! isset($this->_req_data['EVT_ID'])) {
501 501
             EE_Error::add_error(
502 502
                 esc_html__(
503 503
                     'In order to duplicate an event an Event ID is required.  None was given.',
@@ -512,7 +512,7 @@  discard block
 block discarded – undo
512 512
         }
513 513
         //k we've got EVT_ID so let's use that to get the event we'll duplicate
514 514
         $orig_event = EEM_Event::instance()->get_one_by_ID($this->_req_data['EVT_ID']);
515
-        if (! $orig_event instanceof EE_Event) {
515
+        if ( ! $orig_event instanceof EE_Event) {
516 516
             throw new EE_Error(
517 517
                 sprintf(
518 518
                     esc_html__('An EE_Event object could not be retrieved for the given ID (%s)', 'event_espresso'),
@@ -528,7 +528,7 @@  discard block
 block discarded – undo
528 528
         $orig_ven = $orig_event->get_many_related('Venue');
529 529
         //reset the ID and modify other details to make it clear this is a dupe
530 530
         $new_event->set('EVT_ID', 0);
531
-        $new_name = $new_event->name() . ' ' . esc_html__('**DUPLICATE**', 'event_espresso');
531
+        $new_name = $new_event->name().' '.esc_html__('**DUPLICATE**', 'event_espresso');
532 532
         $new_event->set('EVT_name', $new_name);
533 533
         $new_event->set(
534 534
             'EVT_slug',
@@ -557,7 +557,7 @@  discard block
 block discarded – undo
557 557
             'Question_Group',
558 558
             array(array('Event_Question_Group.EQG_primary' => 1))
559 559
         );
560
-        if (! empty($orig_primary_qgs)) {
560
+        if ( ! empty($orig_primary_qgs)) {
561 561
             foreach ($orig_primary_qgs as $id => $obj) {
562 562
                 if ($obj instanceof EE_Question_Group) {
563 563
                     $new_event->_add_relation_to($obj, 'Question_Group', array('EQG_primary' => 1));
@@ -569,7 +569,7 @@  discard block
 block discarded – undo
569 569
             'Question_Group',
570 570
             array(array('Event_Question_Group.EQG_primary' => 0))
571 571
         );
572
-        if (! empty($orig_additional_qgs)) {
572
+        if ( ! empty($orig_additional_qgs)) {
573 573
             foreach ($orig_additional_qgs as $id => $obj) {
574 574
                 if ($obj instanceof EE_Question_Group) {
575 575
                     $new_event->_add_relation_to($obj, 'Question_Group', array('EQG_primary' => 0));
@@ -581,7 +581,7 @@  discard block
 block discarded – undo
581 581
         //k now that we have the new event saved we can loop through the datetimes and start adding relations.
582 582
         $cloned_tickets = array();
583 583
         foreach ($orig_datetimes as $orig_dtt) {
584
-            if (! $orig_dtt instanceof EE_Datetime) {
584
+            if ( ! $orig_dtt instanceof EE_Datetime) {
585 585
                 continue;
586 586
             }
587 587
             $new_dtt   = clone $orig_dtt;
@@ -594,9 +594,9 @@  discard block
 block discarded – undo
594 594
             $new_event->_add_relation_to($new_dtt, 'Datetime');
595 595
             $new_event->save();
596 596
             //now let's get the ticket relations setup.
597
-            foreach ((array)$orig_tkts as $orig_tkt) {
597
+            foreach ((array) $orig_tkts as $orig_tkt) {
598 598
                 //it's possible a datetime will have no tickets so let's verify we HAVE a ticket first.
599
-                if (! $orig_tkt instanceof EE_Ticket) {
599
+                if ( ! $orig_tkt instanceof EE_Ticket) {
600 600
                     continue;
601 601
                 }
602 602
                 //is this ticket archived?  If it is then let's skip
@@ -692,8 +692,8 @@  discard block
 block discarded – undo
692 692
             array('action' => 'sample_export_file'),
693 693
             $this->_admin_base_url
694 694
         );
695
-        $content                                    = EEH_Template::display_template(
696
-            EVENTS_CAF_TEMPLATE_PATH . 'import_page.template.php',
695
+        $content = EEH_Template::display_template(
696
+            EVENTS_CAF_TEMPLATE_PATH.'import_page.template.php',
697 697
             $this->_template_args,
698 698
             true
699 699
         );
@@ -710,7 +710,7 @@  discard block
 block discarded – undo
710 710
      */
711 711
     protected function _import_events()
712 712
     {
713
-        require_once(EE_CLASSES . 'EE_Import.class.php');
713
+        require_once(EE_CLASSES.'EE_Import.class.php');
714 714
         $success = EE_Import::instance()->import();
715 715
         $this->_redirect_after_action($success, 'Import File', 'ran', array('action' => 'import_page'), true);
716 716
     }
@@ -738,9 +738,9 @@  discard block
 block discarded – undo
738 738
             'action' => 'all_event_data',
739 739
             'EVT_ID' => $event_ids,
740 740
         );
741
-        $this->_req_data  = array_merge($this->_req_data, $new_request_args);
742
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
743
-            require_once(EE_CLASSES . 'EE_Export.class.php');
741
+        $this->_req_data = array_merge($this->_req_data, $new_request_args);
742
+        if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
743
+            require_once(EE_CLASSES.'EE_Export.class.php');
744 744
             $EE_Export = EE_Export::instance($this->_req_data);
745 745
             $EE_Export->export();
746 746
         }
@@ -760,9 +760,9 @@  discard block
 block discarded – undo
760 760
             'action'       => 'categories',
761 761
             'category_ids' => $this->_req_data['EVT_CAT_ID'],
762 762
         );
763
-        $this->_req_data  = array_merge($this->_req_data, $new_request_args);
764
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
765
-            require_once(EE_CLASSES . 'EE_Export.class.php');
763
+        $this->_req_data = array_merge($this->_req_data, $new_request_args);
764
+        if (is_readable(EE_CLASSES.'EE_Export.class.php')) {
765
+            require_once(EE_CLASSES.'EE_Export.class.php');
766 766
             $EE_Export = EE_Export::instance($this->_req_data);
767 767
             $EE_Export->export();
768 768
         }
@@ -799,7 +799,7 @@  discard block
 block discarded – undo
799 799
         $this->_set_add_edit_form_tags('update_template_settings');
800 800
         $this->_set_publish_post_box_vars(null, false, false, null, false);
801 801
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
802
-            EVENTS_CAF_TEMPLATE_PATH . 'template_settings.template.php',
802
+            EVENTS_CAF_TEMPLATE_PATH.'template_settings.template.php',
803 803
             $this->_template_args,
804 804
             true
805 805
         );
@@ -871,11 +871,11 @@  discard block
 block discarded – undo
871 871
      */
872 872
     public function registration_options_meta_box()
873 873
     {
874
-        $yes_no_values                                    = array(
874
+        $yes_no_values = array(
875 875
             array('id' => true, 'text' => esc_html__('Yes', 'event_espresso')),
876 876
             array('id' => false, 'text' => esc_html__('No', 'event_espresso')),
877 877
         );
878
-        $default_reg_status_values                        = EEM_Registration::reg_status_array(
878
+        $default_reg_status_values = EEM_Registration::reg_status_array(
879 879
             array(
880 880
                 EEM_Registration::status_id_cancelled,
881 881
                 EEM_Registration::status_id_declined,
@@ -892,12 +892,12 @@  discard block
 block discarded – undo
892 892
             $default_reg_status_values,
893 893
             $this->_cpt_model_obj->default_registration_status()
894 894
         );
895
-        $template_args['display_description']             = EEH_Form_Fields::select_input(
895
+        $template_args['display_description'] = EEH_Form_Fields::select_input(
896 896
             'display_desc',
897 897
             $yes_no_values,
898 898
             $this->_cpt_model_obj->display_description()
899 899
         );
900
-        $template_args['display_ticket_selector']         = EEH_Form_Fields::select_input(
900
+        $template_args['display_ticket_selector'] = EEH_Form_Fields::select_input(
901 901
             'display_ticket_selector',
902 902
             $yes_no_values,
903 903
             $this->_cpt_model_obj->display_ticket_selector(),
@@ -918,7 +918,7 @@  discard block
 block discarded – undo
918 918
             $default_reg_status_values
919 919
         );
920 920
         EEH_Template::display_template(
921
-            EVENTS_CAF_TEMPLATE_PATH . 'event_registration_options.template.php',
921
+            EVENTS_CAF_TEMPLATE_PATH.'event_registration_options.template.php',
922 922
             $template_args
923 923
         );
924 924
     }
@@ -1022,13 +1022,13 @@  discard block
 block discarded – undo
1022 1022
     {
1023 1023
         $start = EEM_Datetime::instance()->convert_datetime_for_query(
1024 1024
             'DTT_EVT_start',
1025
-            date('Y-m-d') . ' 00:00:00',
1025
+            date('Y-m-d').' 00:00:00',
1026 1026
             'Y-m-d H:i:s',
1027 1027
             'UTC'
1028 1028
         );
1029
-        $end   = EEM_Datetime::instance()->convert_datetime_for_query(
1029
+        $end = EEM_Datetime::instance()->convert_datetime_for_query(
1030 1030
             'DTT_EVT_start',
1031
-            date('Y-m-d') . ' 23:59:59',
1031
+            date('Y-m-d').' 23:59:59',
1032 1032
             'Y-m-d H:i:s',
1033 1033
             'UTC'
1034 1034
         );
@@ -1055,13 +1055,13 @@  discard block
 block discarded – undo
1055 1055
         $days_this_month = date('t');
1056 1056
         $start           = EEM_Datetime::instance()->convert_datetime_for_query(
1057 1057
             'DTT_EVT_start',
1058
-            $this_year_r . '-' . $this_month_r . '-01 00:00:00',
1058
+            $this_year_r.'-'.$this_month_r.'-01 00:00:00',
1059 1059
             'Y-m-d H:i:s',
1060 1060
             'UTC'
1061 1061
         );
1062
-        $end             = EEM_Datetime::instance()->convert_datetime_for_query(
1062
+        $end = EEM_Datetime::instance()->convert_datetime_for_query(
1063 1063
             'DTT_EVT_start',
1064
-            $this_year_r . '-' . $this_month_r . '-' . $days_this_month . ' 23:59:59',
1064
+            $this_year_r.'-'.$this_month_r.'-'.$days_this_month.' 23:59:59',
1065 1065
             'Y-m-d H:i:s',
1066 1066
             'UTC'
1067 1067
         );
@@ -1128,7 +1128,7 @@  discard block
 block discarded – undo
1128 1128
         $offset       = ($current_page - 1) * $per_page;
1129 1129
         $limit        = array($offset, $per_page);
1130 1130
         if (isset($this->_req_data['s'])) {
1131
-            $sstr         = '%' . $this->_req_data['s'] . '%';
1131
+            $sstr         = '%'.$this->_req_data['s'].'%';
1132 1132
             $_where['OR'] = array(
1133 1133
                 'TKT_name'        => array('LIKE', $sstr),
1134 1134
                 'TKT_description' => array('LIKE', $sstr),
@@ -1157,17 +1157,17 @@  discard block
 block discarded – undo
1157 1157
         $success = 1;
1158 1158
         $TKT     = EEM_Ticket::instance();
1159 1159
         //checkboxes?
1160
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1160
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1161 1161
             //if array has more than one element then success message should be plural
1162 1162
             $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1163 1163
             //cycle thru the boxes
1164 1164
             while (list($TKT_ID, $value) = each($this->_req_data['checkbox'])) {
1165 1165
                 if ($trash) {
1166
-                    if (! $TKT->delete_by_ID($TKT_ID)) {
1166
+                    if ( ! $TKT->delete_by_ID($TKT_ID)) {
1167 1167
                         $success = 0;
1168 1168
                     }
1169 1169
                 } else {
1170
-                    if (! $TKT->restore_by_ID($TKT_ID)) {
1170
+                    if ( ! $TKT->restore_by_ID($TKT_ID)) {
1171 1171
                         $success = 0;
1172 1172
                     }
1173 1173
                 }
@@ -1176,11 +1176,11 @@  discard block
 block discarded – undo
1176 1176
             //grab single id and trash
1177 1177
             $TKT_ID = absint($this->_req_data['TKT_ID']);
1178 1178
             if ($trash) {
1179
-                if (! $TKT->delete_by_ID($TKT_ID)) {
1179
+                if ( ! $TKT->delete_by_ID($TKT_ID)) {
1180 1180
                     $success = 0;
1181 1181
                 }
1182 1182
             } else {
1183
-                if (! $TKT->restore_by_ID($TKT_ID)) {
1183
+                if ( ! $TKT->restore_by_ID($TKT_ID)) {
1184 1184
                     $success = 0;
1185 1185
                 }
1186 1186
             }
@@ -1201,20 +1201,20 @@  discard block
 block discarded – undo
1201 1201
     {
1202 1202
         $success = 1;
1203 1203
         //checkboxes?
1204
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1204
+        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1205 1205
             //if array has more than one element then success message should be plural
1206 1206
             $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1207 1207
             //cycle thru the boxes
1208 1208
             while (list($TKT_ID, $value) = each($this->_req_data['checkbox'])) {
1209 1209
                 //delete
1210
-                if (! $this->_delete_the_ticket($TKT_ID)) {
1210
+                if ( ! $this->_delete_the_ticket($TKT_ID)) {
1211 1211
                     $success = 0;
1212 1212
                 }
1213 1213
             }
1214 1214
         } else {
1215 1215
             //grab single id and trash
1216 1216
             $TKT_ID = absint($this->_req_data['TKT_ID']);
1217
-            if (! $this->_delete_the_ticket($TKT_ID)) {
1217
+            if ( ! $this->_delete_the_ticket($TKT_ID)) {
1218 1218
                 $success = 0;
1219 1219
             }
1220 1220
         }
Please login to merge, or discard this patch.
Indentation   +1260 added lines, -1260 removed lines patch added patch discarded remove patch
@@ -14,1264 +14,1264 @@
 block discarded – undo
14 14
 {
15 15
 
16 16
 
17
-    /**
18
-     * Extend_Events_Admin_Page constructor.
19
-     *
20
-     * @param bool $routing
21
-     */
22
-    public function __construct($routing = true)
23
-    {
24
-        parent::__construct($routing);
25
-        if (! defined('EVENTS_CAF_TEMPLATE_PATH')) {
26
-            define('EVENTS_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'events/templates/');
27
-            define('EVENTS_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'events/assets/');
28
-            define('EVENTS_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'events/assets/');
29
-        }
30
-    }
31
-
32
-
33
-    /**
34
-     * Sets routes.
35
-     */
36
-    protected function _extend_page_config()
37
-    {
38
-        $this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'events';
39
-        //is there a evt_id in the request?
40
-        $evt_id = ! empty($this->_req_data['EVT_ID']) && ! is_array($this->_req_data['EVT_ID'])
41
-            ? $this->_req_data['EVT_ID']
42
-            : 0;
43
-        $evt_id = ! empty($this->_req_data['post']) ? $this->_req_data['post'] : $evt_id;
44
-        //tkt_id?
45
-        $tkt_id             = ! empty($this->_req_data['TKT_ID']) && ! is_array($this->_req_data['TKT_ID'])
46
-            ? $this->_req_data['TKT_ID']
47
-            : 0;
48
-        $new_page_routes    = array(
49
-            'duplicate_event'          => array(
50
-                'func'       => '_duplicate_event',
51
-                'capability' => 'ee_edit_event',
52
-                'obj_id'     => $evt_id,
53
-                'noheader'   => true,
54
-            ),
55
-            'ticket_list_table'        => array(
56
-                'func'       => '_tickets_overview_list_table',
57
-                'capability' => 'ee_read_default_tickets',
58
-            ),
59
-            'trash_ticket'             => array(
60
-                'func'       => '_trash_or_restore_ticket',
61
-                'capability' => 'ee_delete_default_ticket',
62
-                'obj_id'     => $tkt_id,
63
-                'noheader'   => true,
64
-                'args'       => array('trash' => true),
65
-            ),
66
-            'trash_tickets'            => array(
67
-                'func'       => '_trash_or_restore_ticket',
68
-                'capability' => 'ee_delete_default_tickets',
69
-                'noheader'   => true,
70
-                'args'       => array('trash' => true),
71
-            ),
72
-            'restore_ticket'           => array(
73
-                'func'       => '_trash_or_restore_ticket',
74
-                'capability' => 'ee_delete_default_ticket',
75
-                'obj_id'     => $tkt_id,
76
-                'noheader'   => true,
77
-            ),
78
-            'restore_tickets'          => array(
79
-                'func'       => '_trash_or_restore_ticket',
80
-                'capability' => 'ee_delete_default_tickets',
81
-                'noheader'   => true,
82
-            ),
83
-            'delete_ticket'            => array(
84
-                'func'       => '_delete_ticket',
85
-                'capability' => 'ee_delete_default_ticket',
86
-                'obj_id'     => $tkt_id,
87
-                'noheader'   => true,
88
-            ),
89
-            'delete_tickets'           => array(
90
-                'func'       => '_delete_ticket',
91
-                'capability' => 'ee_delete_default_tickets',
92
-                'noheader'   => true,
93
-            ),
94
-            'import_page'              => array(
95
-                'func'       => '_import_page',
96
-                'capability' => 'import',
97
-            ),
98
-            'import'                   => array(
99
-                'func'       => '_import_events',
100
-                'capability' => 'import',
101
-                'noheader'   => true,
102
-            ),
103
-            'import_events'            => array(
104
-                'func'       => '_import_events',
105
-                'capability' => 'import',
106
-                'noheader'   => true,
107
-            ),
108
-            'export_events'            => array(
109
-                'func'       => '_events_export',
110
-                'capability' => 'export',
111
-                'noheader'   => true,
112
-            ),
113
-            'export_categories'        => array(
114
-                'func'       => '_categories_export',
115
-                'capability' => 'export',
116
-                'noheader'   => true,
117
-            ),
118
-            'sample_export_file'       => array(
119
-                'func'       => '_sample_export_file',
120
-                'capability' => 'export',
121
-                'noheader'   => true,
122
-            ),
123
-            'update_template_settings' => array(
124
-                'func'       => '_update_template_settings',
125
-                'capability' => 'manage_options',
126
-                'noheader'   => true,
127
-            ),
128
-        );
129
-        $this->_page_routes = array_merge($this->_page_routes, $new_page_routes);
130
-        //partial route/config override
131
-        $this->_page_config['import_events']['metaboxes'] = $this->_default_espresso_metaboxes;
132
-        $this->_page_config['create_new']['metaboxes'][]  = '_premium_event_editor_meta_boxes';
133
-        $this->_page_config['create_new']['qtips'][]      = 'EE_Event_Editor_Tips';
134
-        $this->_page_config['edit']['qtips'][]            = 'EE_Event_Editor_Tips';
135
-        $this->_page_config['edit']['metaboxes'][]        = '_premium_event_editor_meta_boxes';
136
-        $this->_page_config['default']['list_table']      = 'Extend_Events_Admin_List_Table';
137
-        //add tickets tab but only if there are more than one default ticket!
138
-        $tkt_count = EEM_Ticket::instance()->count_deleted_and_undeleted(
139
-            array(array('TKT_is_default' => 1)),
140
-            'TKT_ID',
141
-            true
142
-        );
143
-        if ($tkt_count > 1) {
144
-            $new_page_config = array(
145
-                'ticket_list_table' => array(
146
-                    'nav'           => array(
147
-                        'label' => esc_html__('Default Tickets', 'event_espresso'),
148
-                        'order' => 60,
149
-                    ),
150
-                    'list_table'    => 'Tickets_List_Table',
151
-                    'require_nonce' => false,
152
-                ),
153
-            );
154
-        }
155
-        //template settings
156
-        $new_page_config['template_settings'] = array(
157
-            'nav'           => array(
158
-                'label' => esc_html__('Templates', 'event_espresso'),
159
-                'order' => 30,
160
-            ),
161
-            'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
162
-            'help_tabs'     => array(
163
-                'general_settings_templates_help_tab' => array(
164
-                    'title'    => esc_html__('Templates', 'event_espresso'),
165
-                    'filename' => 'general_settings_templates',
166
-                ),
167
-            ),
168
-            'help_tour'     => array('Templates_Help_Tour'),
169
-            'require_nonce' => false,
170
-        );
171
-        $this->_page_config                   = array_merge($this->_page_config, $new_page_config);
172
-        //add filters and actions
173
-        //modifying _views
174
-        add_filter(
175
-            'FHEE_event_datetime_metabox_add_additional_date_time_template',
176
-            array($this, 'add_additional_datetime_button'),
177
-            10,
178
-            2
179
-        );
180
-        add_filter(
181
-            'FHEE_event_datetime_metabox_clone_button_template',
182
-            array($this, 'add_datetime_clone_button'),
183
-            10,
184
-            2
185
-        );
186
-        add_filter(
187
-            'FHEE_event_datetime_metabox_timezones_template',
188
-            array($this, 'datetime_timezones_template'),
189
-            10,
190
-            2
191
-        );
192
-        //filters for event list table
193
-        add_filter('FHEE__Extend_Events_Admin_List_Table__filters', array($this, 'list_table_filters'), 10, 2);
194
-        add_filter(
195
-            'FHEE__Events_Admin_List_Table__column_actions__action_links',
196
-            array($this, 'extra_list_table_actions'),
197
-            10,
198
-            2
199
-        );
200
-        //legend item
201
-        add_filter('FHEE__Events_Admin_Page___event_legend_items__items', array($this, 'additional_legend_items'));
202
-        add_action('admin_init', array($this, 'admin_init'));
203
-        //heartbeat stuff
204
-        add_filter('heartbeat_received', array($this, 'heartbeat_response'), 10, 2);
205
-    }
206
-
207
-
208
-    /**
209
-     * admin_init
210
-     */
211
-    public function admin_init()
212
-    {
213
-        EE_Registry::$i18n_js_strings = array_merge(
214
-            EE_Registry::$i18n_js_strings,
215
-            array(
216
-                'image_confirm'          => esc_html__(
217
-                    'Do you really want to delete this image? Please remember to update your event to complete the removal.',
218
-                    'event_espresso'
219
-                ),
220
-                'event_starts_on'        => esc_html__('Event Starts on', 'event_espresso'),
221
-                'event_ends_on'          => esc_html__('Event Ends on', 'event_espresso'),
222
-                'event_datetime_actions' => esc_html__('Actions', 'event_espresso'),
223
-                'event_clone_dt_msg'     => esc_html__('Clone this Event Date and Time', 'event_espresso'),
224
-                'remove_event_dt_msg'    => esc_html__('Remove this Event Time', 'event_espresso'),
225
-            )
226
-        );
227
-    }
228
-
229
-
230
-    /**
231
-     * This will be used to listen for any heartbeat data packages coming via the WordPress heartbeat API and handle
232
-     * accordingly.
233
-     *
234
-     * @param array $response The existing heartbeat response array.
235
-     * @param array $data     The incoming data package.
236
-     * @return array  possibly appended response.
237
-     */
238
-    public function heartbeat_response($response, $data)
239
-    {
240
-        /**
241
-         * check whether count of tickets is approaching the potential
242
-         * limits for the server.
243
-         */
244
-        if (! empty($data['input_count'])) {
245
-            $response['max_input_vars_check'] = EE_Registry::instance()->CFG->environment->max_input_vars_limit_check(
246
-                $data['input_count']
247
-            );
248
-        }
249
-        return $response;
250
-    }
251
-
252
-
253
-    /**
254
-     * Add per page screen options to the default ticket list table view.
255
-     */
256
-    protected function _add_screen_options_ticket_list_table()
257
-    {
258
-        $this->_per_page_screen_option();
259
-    }
260
-
261
-
262
-    /**
263
-     * @param string $return
264
-     * @param int    $id
265
-     * @param string $new_title
266
-     * @param string $new_slug
267
-     * @return string
268
-     */
269
-    public function extra_permalink_field_buttons($return, $id, $new_title, $new_slug)
270
-    {
271
-        $return = parent::extra_permalink_field_buttons($return, $id, $new_title, $new_slug);
272
-        //make sure this is only when editing
273
-        if (! empty($id)) {
274
-            $href   = EE_Admin_Page::add_query_args_and_nonce(
275
-                array('action' => 'duplicate_event', 'EVT_ID' => $id),
276
-                $this->_admin_base_url
277
-            );
278
-            $title  = esc_attr__('Duplicate Event', 'event_espresso');
279
-            $return .= '<a href="'
280
-                       . $href
281
-                       . '" title="'
282
-                       . $title
283
-                       . '" id="ee-duplicate-event-button" class="button button-small"  value="duplicate_event">'
284
-                       . $title
285
-                       . '</button>';
286
-        }
287
-        return $return;
288
-    }
289
-
290
-
291
-    /**
292
-     * Set the list table views for the default ticket list table view.
293
-     */
294
-    public function _set_list_table_views_ticket_list_table()
295
-    {
296
-        $this->_views = array(
297
-            'all'     => array(
298
-                'slug'        => 'all',
299
-                'label'       => esc_html__('All', 'event_espresso'),
300
-                'count'       => 0,
301
-                'bulk_action' => array(
302
-                    'trash_tickets' => esc_html__('Move to Trash', 'event_espresso'),
303
-                ),
304
-            ),
305
-            'trashed' => array(
306
-                'slug'        => 'trashed',
307
-                'label'       => esc_html__('Trash', 'event_espresso'),
308
-                'count'       => 0,
309
-                'bulk_action' => array(
310
-                    'restore_tickets' => esc_html__('Restore from Trash', 'event_espresso'),
311
-                    'delete_tickets'  => esc_html__('Delete Permanently', 'event_espresso'),
312
-                ),
313
-            ),
314
-        );
315
-    }
316
-
317
-
318
-    /**
319
-     * Enqueue scripts and styles for the event editor.
320
-     */
321
-    public function load_scripts_styles_edit()
322
-    {
323
-        wp_register_script(
324
-            'ee-event-editor-heartbeat',
325
-            EVENTS_CAF_ASSETS_URL . 'event-editor-heartbeat.js',
326
-            array('ee_admin_js', 'heartbeat'),
327
-            EVENT_ESPRESSO_VERSION,
328
-            true
329
-        );
330
-        wp_enqueue_script('ee-accounting');
331
-        //styles
332
-        wp_enqueue_style('espresso-ui-theme');
333
-        wp_enqueue_script('event_editor_js');
334
-        wp_enqueue_script('ee-event-editor-heartbeat');
335
-    }
336
-
337
-
338
-    /**
339
-     * Returns template for the additional datetime.
340
-     * @param $template
341
-     * @param $template_args
342
-     * @return mixed
343
-     * @throws DomainException
344
-     */
345
-    public function add_additional_datetime_button($template, $template_args)
346
-    {
347
-        return EEH_Template::display_template(
348
-            EVENTS_CAF_TEMPLATE_PATH . 'event_datetime_add_additional_time.template.php',
349
-            $template_args,
350
-            true
351
-        );
352
-    }
353
-
354
-
355
-    /**
356
-     * Returns the template for cloning a datetime.
357
-     * @param $template
358
-     * @param $template_args
359
-     * @return mixed
360
-     * @throws DomainException
361
-     */
362
-    public function add_datetime_clone_button($template, $template_args)
363
-    {
364
-        return EEH_Template::display_template(
365
-            EVENTS_CAF_TEMPLATE_PATH . 'event_datetime_metabox_clone_button.template.php',
366
-            $template_args,
367
-            true
368
-        );
369
-    }
370
-
371
-
372
-    /**
373
-     * Returns the template for datetime timezones.
374
-     * @param $template
375
-     * @param $template_args
376
-     * @return mixed
377
-     * @throws DomainException
378
-     */
379
-    public function datetime_timezones_template($template, $template_args)
380
-    {
381
-        return EEH_Template::display_template(
382
-            EVENTS_CAF_TEMPLATE_PATH . 'event_datetime_timezones.template.php',
383
-            $template_args,
384
-            true
385
-        );
386
-    }
387
-
388
-
389
-    /**
390
-     * Sets the views for the default list table view.
391
-     */
392
-    protected function _set_list_table_views_default()
393
-    {
394
-        parent::_set_list_table_views_default();
395
-        $new_views    = array(
396
-            'today' => array(
397
-                'slug'        => 'today',
398
-                'label'       => esc_html__('Today', 'event_espresso'),
399
-                'count'       => $this->total_events_today(),
400
-                'bulk_action' => array(
401
-                    'trash_events' => esc_html__('Move to Trash', 'event_espresso'),
402
-                ),
403
-            ),
404
-            'month' => array(
405
-                'slug'        => 'month',
406
-                'label'       => esc_html__('This Month', 'event_espresso'),
407
-                'count'       => $this->total_events_this_month(),
408
-                'bulk_action' => array(
409
-                    'trash_events' => esc_html__('Move to Trash', 'event_espresso'),
410
-                ),
411
-            ),
412
-        );
413
-        $this->_views = array_merge($this->_views, $new_views);
414
-    }
415
-
416
-
417
-    /**
418
-     * Returns the extra action links for the default list table view.
419
-     * @param array     $action_links
420
-     * @param \EE_Event $event
421
-     * @return array
422
-     * @throws EE_Error
423
-     */
424
-    public function extra_list_table_actions(array $action_links, \EE_Event $event)
425
-    {
426
-        if (EE_Registry::instance()->CAP->current_user_can(
427
-            'ee_read_registrations',
428
-            'espresso_registrations_reports',
429
-            $event->ID()
430
-        )
431
-        ) {
432
-            $reports_query_args = array(
433
-                'action' => 'reports',
434
-                'EVT_ID' => $event->ID(),
435
-            );
436
-            $reports_link       = EE_Admin_Page::add_query_args_and_nonce($reports_query_args, REG_ADMIN_URL);
437
-            $action_links[]     = '<a href="'
438
-                                  . $reports_link
439
-                                  . '" title="'
440
-                                  . esc_attr__('View Report', 'event_espresso')
441
-                                  . '"><div class="dashicons dashicons-chart-bar"></div></a>'
442
-                                  . "\n\t";
443
-        }
444
-        if (EE_Registry::instance()->CAP->current_user_can('ee_read_global_messages', 'view_filtered_messages')) {
445
-            EE_Registry::instance()->load_helper('MSG_Template');
446
-            $action_links[] = EEH_MSG_Template::get_message_action_link(
447
-                'see_notifications_for',
448
-                null,
449
-                array('EVT_ID' => $event->ID())
450
-            );
451
-        }
452
-        return $action_links;
453
-    }
454
-
455
-
456
-    /**
457
-     * @param $items
458
-     * @return mixed
459
-     */
460
-    public function additional_legend_items($items)
461
-    {
462
-        if (EE_Registry::instance()->CAP->current_user_can(
463
-            'ee_read_registrations',
464
-            'espresso_registrations_reports'
465
-        )
466
-        ) {
467
-            $items['reports'] = array(
468
-                'class' => 'dashicons dashicons-chart-bar',
469
-                'desc'  => esc_html__('Event Reports', 'event_espresso'),
470
-            );
471
-        }
472
-        if (EE_Registry::instance()->CAP->current_user_can('ee_read_global_messages', 'view_filtered_messages')) {
473
-            $related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
474
-            if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
475
-                $items['view_related_messages'] = array(
476
-                    'class' => $related_for_icon['css_class'],
477
-                    'desc'  => $related_for_icon['label'],
478
-                );
479
-            }
480
-        }
481
-        return $items;
482
-    }
483
-
484
-
485
-    /**
486
-     * This is the callback method for the duplicate event route
487
-     * Method looks for 'EVT_ID' in the request and retrieves that event and its details and duplicates them
488
-     * into a new event.  We add a hook so that any plugins that add extra event details can hook into this
489
-     * action.  Note that the dupe will have **DUPLICATE** as its title and slug.
490
-     * After duplication the redirect is to the new event edit page.
491
-     *
492
-     * @return void
493
-     * @access protected
494
-     * @throws EE_Error If EE_Event is not available with given ID
495
-     */
496
-    protected function _duplicate_event()
497
-    {
498
-        // first make sure the ID for the event is in the request.
499
-        //  If it isn't then we need to bail and redirect back to overview list table (cause how did we get here?)
500
-        if (! isset($this->_req_data['EVT_ID'])) {
501
-            EE_Error::add_error(
502
-                esc_html__(
503
-                    'In order to duplicate an event an Event ID is required.  None was given.',
504
-                    'event_espresso'
505
-                ),
506
-                __FILE__,
507
-                __FUNCTION__,
508
-                __LINE__
509
-            );
510
-            $this->_redirect_after_action(false, '', '', array(), true);
511
-            return;
512
-        }
513
-        //k we've got EVT_ID so let's use that to get the event we'll duplicate
514
-        $orig_event = EEM_Event::instance()->get_one_by_ID($this->_req_data['EVT_ID']);
515
-        if (! $orig_event instanceof EE_Event) {
516
-            throw new EE_Error(
517
-                sprintf(
518
-                    esc_html__('An EE_Event object could not be retrieved for the given ID (%s)', 'event_espresso'),
519
-                    $this->_req_data['EVT_ID']
520
-                )
521
-            );
522
-        }
523
-        //k now let's clone the $orig_event before getting relations
524
-        $new_event = clone $orig_event;
525
-        //original datetimes
526
-        $orig_datetimes = $orig_event->get_many_related('Datetime');
527
-        //other original relations
528
-        $orig_ven = $orig_event->get_many_related('Venue');
529
-        //reset the ID and modify other details to make it clear this is a dupe
530
-        $new_event->set('EVT_ID', 0);
531
-        $new_name = $new_event->name() . ' ' . esc_html__('**DUPLICATE**', 'event_espresso');
532
-        $new_event->set('EVT_name', $new_name);
533
-        $new_event->set(
534
-            'EVT_slug',
535
-            wp_unique_post_slug(
536
-                sanitize_title($orig_event->name()),
537
-                0,
538
-                'publish',
539
-                'espresso_events',
540
-                0
541
-            )
542
-        );
543
-        $new_event->set('status', 'draft');
544
-        //duplicate discussion settings
545
-        $new_event->set('comment_status', $orig_event->get('comment_status'));
546
-        $new_event->set('ping_status', $orig_event->get('ping_status'));
547
-        //save the new event
548
-        $new_event->save();
549
-        //venues
550
-        foreach ($orig_ven as $ven) {
551
-            $new_event->_add_relation_to($ven, 'Venue');
552
-        }
553
-        $new_event->save();
554
-        //now we need to get the question group relations and handle that
555
-        //first primary question groups
556
-        $orig_primary_qgs = $orig_event->get_many_related(
557
-            'Question_Group',
558
-            array(array('Event_Question_Group.EQG_primary' => 1))
559
-        );
560
-        if (! empty($orig_primary_qgs)) {
561
-            foreach ($orig_primary_qgs as $id => $obj) {
562
-                if ($obj instanceof EE_Question_Group) {
563
-                    $new_event->_add_relation_to($obj, 'Question_Group', array('EQG_primary' => 1));
564
-                }
565
-            }
566
-        }
567
-        //next additional attendee question groups
568
-        $orig_additional_qgs = $orig_event->get_many_related(
569
-            'Question_Group',
570
-            array(array('Event_Question_Group.EQG_primary' => 0))
571
-        );
572
-        if (! empty($orig_additional_qgs)) {
573
-            foreach ($orig_additional_qgs as $id => $obj) {
574
-                if ($obj instanceof EE_Question_Group) {
575
-                    $new_event->_add_relation_to($obj, 'Question_Group', array('EQG_primary' => 0));
576
-                }
577
-            }
578
-        }
579
-
580
-        $new_event->save();
581
-
582
-        //k now that we have the new event saved we can loop through the datetimes and start adding relations.
583
-        $cloned_tickets = array();
584
-        foreach ($orig_datetimes as $orig_dtt) {
585
-            if (! $orig_dtt instanceof EE_Datetime) {
586
-                continue;
587
-            }
588
-            $new_dtt   = clone $orig_dtt;
589
-            $orig_tkts = $orig_dtt->tickets();
590
-            //save new dtt then add to event
591
-            $new_dtt->set('DTT_ID', 0);
592
-            $new_dtt->set('DTT_sold', 0);
593
-            $new_dtt->set_reserved(0);
594
-            $new_dtt->save();
595
-            $new_event->_add_relation_to($new_dtt, 'Datetime');
596
-            $new_event->save();
597
-            //now let's get the ticket relations setup.
598
-            foreach ((array)$orig_tkts as $orig_tkt) {
599
-                //it's possible a datetime will have no tickets so let's verify we HAVE a ticket first.
600
-                if (! $orig_tkt instanceof EE_Ticket) {
601
-                    continue;
602
-                }
603
-                //is this ticket archived?  If it is then let's skip
604
-                if ($orig_tkt->get('TKT_deleted')) {
605
-                    continue;
606
-                }
607
-                // does this original ticket already exist in the clone_tickets cache?
608
-                //  If so we'll just use the new ticket from it.
609
-                if (isset($cloned_tickets[$orig_tkt->ID()])) {
610
-                    $new_tkt = $cloned_tickets[$orig_tkt->ID()];
611
-                } else {
612
-                    $new_tkt = clone $orig_tkt;
613
-                    //get relations on the $orig_tkt that we need to setup.
614
-                    $orig_prices = $orig_tkt->prices();
615
-                    $new_tkt->set('TKT_ID', 0);
616
-                    $new_tkt->set('TKT_sold', 0);
617
-                    $new_tkt->set('TKT_reserved', 0);
618
-                    $new_tkt->save(); //make sure new ticket has ID.
619
-                    //price relations on new ticket need to be setup.
620
-                    foreach ($orig_prices as $orig_price) {
621
-                        $new_price = clone $orig_price;
622
-                        $new_price->set('PRC_ID', 0);
623
-                        $new_price->save();
624
-                        $new_tkt->_add_relation_to($new_price, 'Price');
625
-                        $new_tkt->save();
626
-                    }
627
-
628
-                    do_action(
629
-                        'AHEE__Extend_Events_Admin_Page___duplicate_event__duplicate_ticket__after',
630
-                        $orig_tkt,
631
-                        $new_tkt,
632
-                        $orig_prices,
633
-                        $orig_event,
634
-                        $orig_dtt,
635
-                        $new_dtt
636
-                    );
637
-                }
638
-                // k now we can add the new ticket as a relation to the new datetime
639
-                // and make sure its added to our cached $cloned_tickets array
640
-                // for use with later datetimes that have the same ticket.
641
-                $new_dtt->_add_relation_to($new_tkt, 'Ticket');
642
-                $new_dtt->save();
643
-                $cloned_tickets[$orig_tkt->ID()] = $new_tkt;
644
-            }
645
-        }
646
-        //clone taxonomy information
647
-        $taxonomies_to_clone_with = apply_filters(
648
-            'FHEE__Extend_Events_Admin_Page___duplicate_event__taxonomies_to_clone',
649
-            array('espresso_event_categories', 'espresso_event_type', 'post_tag')
650
-        );
651
-        //get terms for original event (notice)
652
-        $orig_terms = wp_get_object_terms($orig_event->ID(), $taxonomies_to_clone_with);
653
-        //loop through terms and add them to new event.
654
-        foreach ($orig_terms as $term) {
655
-            wp_set_object_terms($new_event->ID(), $term->term_id, $term->taxonomy, true);
656
-        }
657
-
658
-        //duplicate other core WP_Post items for this event.
659
-        //post thumbnail (feature image).
660
-        $feature_image_id = get_post_thumbnail_id($orig_event->ID());
661
-        if ($feature_image_id) {
662
-            update_post_meta($new_event->ID(), '_thumbnail_id', $feature_image_id);
663
-        }
664
-
665
-        //duplicate page_template setting
666
-        $page_template = get_post_meta($orig_event->ID(), '_wp_page_template', true);
667
-        if ($page_template) {
668
-            update_post_meta($new_event->ID(), '_wp_page_template', $page_template);
669
-        }
670
-
671
-        do_action('AHEE__Extend_Events_Admin_Page___duplicate_event__after', $new_event, $orig_event);
672
-        //now let's redirect to the edit page for this duplicated event if we have a new event id.
673
-        if ($new_event->ID()) {
674
-            $redirect_args = array(
675
-                'post'   => $new_event->ID(),
676
-                'action' => 'edit',
677
-            );
678
-            EE_Error::add_success(
679
-                esc_html__(
680
-                    'Event successfully duplicated.  Please review the details below and make any necessary edits',
681
-                    'event_espresso'
682
-                )
683
-            );
684
-        } else {
685
-            $redirect_args = array(
686
-                'action' => 'default',
687
-            );
688
-            EE_Error::add_error(
689
-                esc_html__('Not able to duplicate event.  Something went wrong.', 'event_espresso'),
690
-                __FILE__,
691
-                __FUNCTION__,
692
-                __LINE__
693
-            );
694
-        }
695
-        $this->_redirect_after_action(false, '', '', $redirect_args, true);
696
-    }
697
-
698
-
699
-    /**
700
-     * Generates output for the import page.
701
-     * @throws DomainException
702
-     */
703
-    protected function _import_page()
704
-    {
705
-        $title                                      = esc_html__('Import', 'event_espresso');
706
-        $intro                                      = esc_html__(
707
-            'If you have a previously exported Event Espresso 4 information in a Comma Separated Value (CSV) file format, you can upload the file here: ',
708
-            'event_espresso'
709
-        );
710
-        $form_url                                   = EVENTS_ADMIN_URL;
711
-        $action                                     = 'import_events';
712
-        $type                                       = 'csv';
713
-        $this->_template_args['form']               = EE_Import::instance()->upload_form(
714
-            $title, $intro, $form_url, $action, $type
715
-        );
716
-        $this->_template_args['sample_file_link']   = EE_Admin_Page::add_query_args_and_nonce(
717
-            array('action' => 'sample_export_file'),
718
-            $this->_admin_base_url
719
-        );
720
-        $content                                    = EEH_Template::display_template(
721
-            EVENTS_CAF_TEMPLATE_PATH . 'import_page.template.php',
722
-            $this->_template_args,
723
-            true
724
-        );
725
-        $this->_template_args['admin_page_content'] = $content;
726
-        $this->display_admin_page_with_sidebar();
727
-    }
728
-
729
-
730
-    /**
731
-     * _import_events
732
-     * This handles displaying the screen and running imports for importing events.
733
-     *
734
-     * @return void
735
-     */
736
-    protected function _import_events()
737
-    {
738
-        require_once(EE_CLASSES . 'EE_Import.class.php');
739
-        $success = EE_Import::instance()->import();
740
-        $this->_redirect_after_action($success, 'Import File', 'ran', array('action' => 'import_page'), true);
741
-    }
742
-
743
-
744
-    /**
745
-     * _events_export
746
-     * Will export all (or just the given event) to a Excel compatible file.
747
-     *
748
-     * @access protected
749
-     * @return void
750
-     */
751
-    protected function _events_export()
752
-    {
753
-        if (isset($this->_req_data['EVT_ID'])) {
754
-            $event_ids = $this->_req_data['EVT_ID'];
755
-        } elseif (isset($this->_req_data['EVT_IDs'])) {
756
-            $event_ids = $this->_req_data['EVT_IDs'];
757
-        } else {
758
-            $event_ids = null;
759
-        }
760
-        //todo: I don't like doing this but it'll do until we modify EE_Export Class.
761
-        $new_request_args = array(
762
-            'export' => 'report',
763
-            'action' => 'all_event_data',
764
-            'EVT_ID' => $event_ids,
765
-        );
766
-        $this->_req_data  = array_merge($this->_req_data, $new_request_args);
767
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
768
-            require_once(EE_CLASSES . 'EE_Export.class.php');
769
-            $EE_Export = EE_Export::instance($this->_req_data);
770
-            $EE_Export->export();
771
-        }
772
-    }
773
-
774
-
775
-    /**
776
-     * handle category exports()
777
-     *
778
-     * @return void
779
-     */
780
-    protected function _categories_export()
781
-    {
782
-        //todo: I don't like doing this but it'll do until we modify EE_Export Class.
783
-        $new_request_args = array(
784
-            'export'       => 'report',
785
-            'action'       => 'categories',
786
-            'category_ids' => $this->_req_data['EVT_CAT_ID'],
787
-        );
788
-        $this->_req_data  = array_merge($this->_req_data, $new_request_args);
789
-        if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
790
-            require_once(EE_CLASSES . 'EE_Export.class.php');
791
-            $EE_Export = EE_Export::instance($this->_req_data);
792
-            $EE_Export->export();
793
-        }
794
-    }
795
-
796
-
797
-    /**
798
-     * Creates a sample CSV file for importing
799
-     */
800
-    protected function _sample_export_file()
801
-    {
802
-        //		require_once(EE_CLASSES . 'EE_Export.class.php');
803
-        EE_Export::instance()->export_sample();
804
-    }
805
-
806
-
807
-    /*************        Template Settings        *************/
808
-    /**
809
-     * Generates template settings page output
810
-     * @throws DomainException
811
-     * @throws EE_Error
812
-     */
813
-    protected function _template_settings()
814
-    {
815
-        $this->_template_args['values'] = $this->_yes_no_values;
816
-        /**
817
-         * Note leaving this filter in for backward compatibility this was moved in 4.6.x
818
-         * from General_Settings_Admin_Page to here.
819
-         */
820
-        $this->_template_args = apply_filters(
821
-            'FHEE__General_Settings_Admin_Page__template_settings__template_args',
822
-            $this->_template_args
823
-        );
824
-        $this->_set_add_edit_form_tags('update_template_settings');
825
-        $this->_set_publish_post_box_vars(null, false, false, null, false);
826
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
827
-            EVENTS_CAF_TEMPLATE_PATH . 'template_settings.template.php',
828
-            $this->_template_args,
829
-            true
830
-        );
831
-        $this->display_admin_page_with_sidebar();
832
-    }
833
-
834
-
835
-    /**
836
-     * Handler for updating template settings.
837
-     */
838
-    protected function _update_template_settings()
839
-    {
840
-        /**
841
-         * Note leaving this filter in for backward compatibility this was moved in 4.6.x
842
-         * from General_Settings_Admin_Page to here.
843
-         */
844
-        EE_Registry::instance()->CFG->template_settings = apply_filters(
845
-            'FHEE__General_Settings_Admin_Page__update_template_settings__data',
846
-            EE_Registry::instance()->CFG->template_settings,
847
-            $this->_req_data
848
-        );
849
-        //update custom post type slugs and detect if we need to flush rewrite rules
850
-        $old_slug                                          = EE_Registry::instance()->CFG->core->event_cpt_slug;
851
-        EE_Registry::instance()->CFG->core->event_cpt_slug = empty($this->_req_data['event_cpt_slug'])
852
-            ? EE_Registry::instance()->CFG->core->event_cpt_slug
853
-            : sanitize_title_with_dashes($this->_req_data['event_cpt_slug']);
854
-        $what                                              = 'Template Settings';
855
-        $success                                           = $this->_update_espresso_configuration(
856
-            $what,
857
-            EE_Registry::instance()->CFG->template_settings,
858
-            __FILE__,
859
-            __FUNCTION__,
860
-            __LINE__
861
-        );
862
-        if (EE_Registry::instance()->CFG->core->event_cpt_slug != $old_slug) {
863
-            update_option('ee_flush_rewrite_rules', true);
864
-        }
865
-        $this->_redirect_after_action($success, $what, 'updated', array('action' => 'template_settings'));
866
-    }
867
-
868
-
869
-    /**
870
-     * _premium_event_editor_meta_boxes
871
-     * add all metaboxes related to the event_editor
872
-     *
873
-     * @access protected
874
-     * @return void
875
-     * @throws EE_Error
876
-     */
877
-    protected function _premium_event_editor_meta_boxes()
878
-    {
879
-        $this->verify_cpt_object();
880
-        add_meta_box(
881
-            'espresso_event_editor_event_options',
882
-            esc_html__('Event Registration Options', 'event_espresso'),
883
-            array($this, 'registration_options_meta_box'),
884
-            $this->page_slug,
885
-            'side',
886
-            'core'
887
-        );
888
-    }
889
-
890
-
891
-    /**
892
-     * override caf metabox
893
-     *
894
-     * @return void
895
-     * @throws DomainException
896
-     */
897
-    public function registration_options_meta_box()
898
-    {
899
-        $yes_no_values                                    = array(
900
-            array('id' => true, 'text' => esc_html__('Yes', 'event_espresso')),
901
-            array('id' => false, 'text' => esc_html__('No', 'event_espresso')),
902
-        );
903
-        $default_reg_status_values                        = EEM_Registration::reg_status_array(
904
-            array(
905
-                EEM_Registration::status_id_cancelled,
906
-                EEM_Registration::status_id_declined,
907
-                EEM_Registration::status_id_incomplete,
908
-                EEM_Registration::status_id_wait_list,
909
-            ),
910
-            true
911
-        );
912
-        $template_args['active_status']                   = $this->_cpt_model_obj->pretty_active_status(false);
913
-        $template_args['_event']                          = $this->_cpt_model_obj;
914
-        $template_args['additional_limit']                = $this->_cpt_model_obj->additional_limit();
915
-        $template_args['default_registration_status']     = EEH_Form_Fields::select_input(
916
-            'default_reg_status',
917
-            $default_reg_status_values,
918
-            $this->_cpt_model_obj->default_registration_status()
919
-        );
920
-        $template_args['display_description']             = EEH_Form_Fields::select_input(
921
-            'display_desc',
922
-            $yes_no_values,
923
-            $this->_cpt_model_obj->display_description()
924
-        );
925
-        $template_args['display_ticket_selector']         = EEH_Form_Fields::select_input(
926
-            'display_ticket_selector',
927
-            $yes_no_values,
928
-            $this->_cpt_model_obj->display_ticket_selector(),
929
-            '',
930
-            '',
931
-            false
932
-        );
933
-        $template_args['EVT_default_registration_status'] = EEH_Form_Fields::select_input(
934
-            'EVT_default_registration_status',
935
-            $default_reg_status_values,
936
-            $this->_cpt_model_obj->default_registration_status()
937
-        );
938
-        $template_args['additional_registration_options'] = apply_filters(
939
-            'FHEE__Events_Admin_Page__registration_options_meta_box__additional_registration_options',
940
-            '',
941
-            $template_args,
942
-            $yes_no_values,
943
-            $default_reg_status_values
944
-        );
945
-        EEH_Template::display_template(
946
-            EVENTS_CAF_TEMPLATE_PATH . 'event_registration_options.template.php',
947
-            $template_args
948
-        );
949
-    }
950
-
951
-
952
-
953
-    /**
954
-     * wp_list_table_mods for caf
955
-     * ============================
956
-     */
957
-    /**
958
-     * hook into list table filters and provide filters for caffeinated list table
959
-     *
960
-     * @param  array $old_filters    any existing filters present
961
-     * @param  array $list_table_obj the list table object
962
-     * @return array                  new filters
963
-     */
964
-    public function list_table_filters($old_filters, $list_table_obj)
965
-    {
966
-        $filters = array();
967
-        //first month/year filters
968
-        $filters[] = $this->espresso_event_months_dropdown();
969
-        $status    = isset($this->_req_data['status']) ? $this->_req_data['status'] : null;
970
-        //active status dropdown
971
-        if ($status !== 'draft') {
972
-            $filters[] = $this->active_status_dropdown(
973
-                isset($this->_req_data['active_status']) ? $this->_req_data['active_status'] : ''
974
-            );
975
-        }
976
-        //category filter
977
-        $filters[] = $this->category_dropdown();
978
-        return array_merge($old_filters, $filters);
979
-    }
980
-
981
-
982
-    /**
983
-     * espresso_event_months_dropdown
984
-     *
985
-     * @access public
986
-     * @return string                dropdown listing month/year selections for events.
987
-     */
988
-    public function espresso_event_months_dropdown()
989
-    {
990
-        // what we need to do is get all PRIMARY datetimes for all events to filter on.
991
-        // Note we need to include any other filters that are set!
992
-        $status = isset($this->_req_data['status']) ? $this->_req_data['status'] : null;
993
-        //categories?
994
-        $category = isset($this->_req_data['EVT_CAT']) && $this->_req_data['EVT_CAT'] > 0
995
-            ? $this->_req_data['EVT_CAT']
996
-            : null;
997
-        //active status?
998
-        $active_status = isset($this->_req_data['active_status']) ? $this->_req_data['active_status'] : null;
999
-        $cur_date      = isset($this->_req_data['month_range']) ? $this->_req_data['month_range'] : '';
1000
-        return EEH_Form_Fields::generate_event_months_dropdown($cur_date, $status, $category, $active_status);
1001
-    }
1002
-
1003
-
1004
-    /**
1005
-     * returns a list of "active" statuses on the event
1006
-     *
1007
-     * @param  string $current_value whatever the current active status is
1008
-     * @return string
1009
-     */
1010
-    public function active_status_dropdown($current_value = '')
1011
-    {
1012
-        $select_name = 'active_status';
1013
-        $values      = array(
1014
-            'none'     => esc_html__('Show Active/Inactive', 'event_espresso'),
1015
-            'active'   => esc_html__('Active', 'event_espresso'),
1016
-            'upcoming' => esc_html__('Upcoming', 'event_espresso'),
1017
-            'expired'  => esc_html__('Expired', 'event_espresso'),
1018
-            'inactive' => esc_html__('Inactive', 'event_espresso'),
1019
-        );
1020
-        $id          = 'id="espresso-active-status-dropdown-filter"';
1021
-        $class       = 'wide';
1022
-        return EEH_Form_Fields::select_input($select_name, $values, $current_value, $id, $class);
1023
-    }
1024
-
1025
-
1026
-    /**
1027
-     * output a dropdown of the categories for the category filter on the event admin list table
1028
-     *
1029
-     * @access  public
1030
-     * @return string html
1031
-     */
1032
-    public function category_dropdown()
1033
-    {
1034
-        $cur_cat = isset($this->_req_data['EVT_CAT']) ? $this->_req_data['EVT_CAT'] : -1;
1035
-        return EEH_Form_Fields::generate_event_category_dropdown($cur_cat);
1036
-    }
1037
-
1038
-
1039
-    /**
1040
-     * get total number of events today
1041
-     *
1042
-     * @access public
1043
-     * @return int
1044
-     * @throws EE_Error
1045
-     */
1046
-    public function total_events_today()
1047
-    {
1048
-        $start = EEM_Datetime::instance()->convert_datetime_for_query(
1049
-            'DTT_EVT_start',
1050
-            date('Y-m-d') . ' 00:00:00',
1051
-            'Y-m-d H:i:s',
1052
-            'UTC'
1053
-        );
1054
-        $end   = EEM_Datetime::instance()->convert_datetime_for_query(
1055
-            'DTT_EVT_start',
1056
-            date('Y-m-d') . ' 23:59:59',
1057
-            'Y-m-d H:i:s',
1058
-            'UTC'
1059
-        );
1060
-        $where = array(
1061
-            'Datetime.DTT_EVT_start' => array('BETWEEN', array($start, $end)),
1062
-        );
1063
-        $count = EEM_Event::instance()->count(array($where, 'caps' => 'read_admin'), 'EVT_ID', true);
1064
-        return $count;
1065
-    }
1066
-
1067
-
1068
-    /**
1069
-     * get total number of events this month
1070
-     *
1071
-     * @access public
1072
-     * @return int
1073
-     * @throws EE_Error
1074
-     */
1075
-    public function total_events_this_month()
1076
-    {
1077
-        //Dates
1078
-        $this_year_r     = date('Y');
1079
-        $this_month_r    = date('m');
1080
-        $days_this_month = date('t');
1081
-        $start           = EEM_Datetime::instance()->convert_datetime_for_query(
1082
-            'DTT_EVT_start',
1083
-            $this_year_r . '-' . $this_month_r . '-01 00:00:00',
1084
-            'Y-m-d H:i:s',
1085
-            'UTC'
1086
-        );
1087
-        $end             = EEM_Datetime::instance()->convert_datetime_for_query(
1088
-            'DTT_EVT_start',
1089
-            $this_year_r . '-' . $this_month_r . '-' . $days_this_month . ' 23:59:59',
1090
-            'Y-m-d H:i:s',
1091
-            'UTC'
1092
-        );
1093
-        $where           = array(
1094
-            'Datetime.DTT_EVT_start' => array('BETWEEN', array($start, $end)),
1095
-        );
1096
-        $count           = EEM_Event::instance()->count(array($where, 'caps' => 'read_admin'), 'EVT_ID', true);
1097
-        return $count;
1098
-    }
1099
-
1100
-
1101
-    /** DEFAULT TICKETS STUFF **/
1102
-
1103
-    /**
1104
-     * Output default tickets list table view.
1105
-     */
1106
-    public function _tickets_overview_list_table()
1107
-    {
1108
-        $this->_search_btn_label = esc_html__('Tickets', 'event_espresso');
1109
-        $this->display_admin_list_table_page_with_no_sidebar();
1110
-    }
1111
-
1112
-
1113
-    /**
1114
-     * @param int  $per_page
1115
-     * @param bool $count
1116
-     * @param bool $trashed
1117
-     * @return \EE_Soft_Delete_Base_Class[]|int
1118
-     */
1119
-    public function get_default_tickets($per_page = 10, $count = false, $trashed = false)
1120
-    {
1121
-        $orderby = empty($this->_req_data['orderby']) ? 'TKT_name' : $this->_req_data['orderby'];
1122
-        $order   = empty($this->_req_data['order']) ? 'ASC' : $this->_req_data['order'];
1123
-        switch ($orderby) {
1124
-            case 'TKT_name':
1125
-                $orderby = array('TKT_name' => $order);
1126
-                break;
1127
-            case 'TKT_price':
1128
-                $orderby = array('TKT_price' => $order);
1129
-                break;
1130
-            case 'TKT_uses':
1131
-                $orderby = array('TKT_uses' => $order);
1132
-                break;
1133
-            case 'TKT_min':
1134
-                $orderby = array('TKT_min' => $order);
1135
-                break;
1136
-            case 'TKT_max':
1137
-                $orderby = array('TKT_max' => $order);
1138
-                break;
1139
-            case 'TKT_qty':
1140
-                $orderby = array('TKT_qty' => $order);
1141
-                break;
1142
-        }
1143
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
1144
-            ? $this->_req_data['paged']
1145
-            : 1;
1146
-        $per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
1147
-            ? $this->_req_data['perpage']
1148
-            : $per_page;
1149
-        $_where       = array(
1150
-            'TKT_is_default' => 1,
1151
-            'TKT_deleted'    => $trashed,
1152
-        );
1153
-        $offset       = ($current_page - 1) * $per_page;
1154
-        $limit        = array($offset, $per_page);
1155
-        if (isset($this->_req_data['s'])) {
1156
-            $sstr         = '%' . $this->_req_data['s'] . '%';
1157
-            $_where['OR'] = array(
1158
-                'TKT_name'        => array('LIKE', $sstr),
1159
-                'TKT_description' => array('LIKE', $sstr),
1160
-            );
1161
-        }
1162
-        $query_params = array(
1163
-            $_where,
1164
-            'order_by' => $orderby,
1165
-            'limit'    => $limit,
1166
-            'group_by' => 'TKT_ID',
1167
-        );
1168
-        if ($count) {
1169
-            return EEM_Ticket::instance()->count_deleted_and_undeleted(array($_where));
1170
-        } else {
1171
-            return EEM_Ticket::instance()->get_all_deleted_and_undeleted($query_params);
1172
-        }
1173
-    }
1174
-
1175
-
1176
-    /**
1177
-     * @param bool $trash
1178
-     * @throws EE_Error
1179
-     */
1180
-    protected function _trash_or_restore_ticket($trash = false)
1181
-    {
1182
-        $success = 1;
1183
-        $TKT     = EEM_Ticket::instance();
1184
-        //checkboxes?
1185
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1186
-            //if array has more than one element then success message should be plural
1187
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1188
-            //cycle thru the boxes
1189
-            while (list($TKT_ID, $value) = each($this->_req_data['checkbox'])) {
1190
-                if ($trash) {
1191
-                    if (! $TKT->delete_by_ID($TKT_ID)) {
1192
-                        $success = 0;
1193
-                    }
1194
-                } else {
1195
-                    if (! $TKT->restore_by_ID($TKT_ID)) {
1196
-                        $success = 0;
1197
-                    }
1198
-                }
1199
-            }
1200
-        } else {
1201
-            //grab single id and trash
1202
-            $TKT_ID = absint($this->_req_data['TKT_ID']);
1203
-            if ($trash) {
1204
-                if (! $TKT->delete_by_ID($TKT_ID)) {
1205
-                    $success = 0;
1206
-                }
1207
-            } else {
1208
-                if (! $TKT->restore_by_ID($TKT_ID)) {
1209
-                    $success = 0;
1210
-                }
1211
-            }
1212
-        }
1213
-        $action_desc = $trash ? 'moved to the trash' : 'restored';
1214
-        $query_args  = array(
1215
-            'action' => 'ticket_list_table',
1216
-            'status' => $trash ? '' : 'trashed',
1217
-        );
1218
-        $this->_redirect_after_action($success, 'Tickets', $action_desc, $query_args);
1219
-    }
1220
-
1221
-
1222
-    /**
1223
-     * Handles trashing default ticket.
1224
-     */
1225
-    protected function _delete_ticket()
1226
-    {
1227
-        $success = 1;
1228
-        //checkboxes?
1229
-        if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1230
-            //if array has more than one element then success message should be plural
1231
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1232
-            //cycle thru the boxes
1233
-            while (list($TKT_ID, $value) = each($this->_req_data['checkbox'])) {
1234
-                //delete
1235
-                if (! $this->_delete_the_ticket($TKT_ID)) {
1236
-                    $success = 0;
1237
-                }
1238
-            }
1239
-        } else {
1240
-            //grab single id and trash
1241
-            $TKT_ID = absint($this->_req_data['TKT_ID']);
1242
-            if (! $this->_delete_the_ticket($TKT_ID)) {
1243
-                $success = 0;
1244
-            }
1245
-        }
1246
-        $action_desc = 'deleted';
1247
-        $query_args  = array(
1248
-            'action' => 'ticket_list_table',
1249
-            'status' => 'trashed',
1250
-        );
1251
-        //fail safe.  If the default ticket count === 1 then we need to redirect to event overview.
1252
-        if (EEM_Ticket::instance()->count_deleted_and_undeleted(
1253
-            array(array('TKT_is_default' => 1)),
1254
-            'TKT_ID',
1255
-            true
1256
-        )
1257
-        ) {
1258
-            $query_args = array();
1259
-        }
1260
-        $this->_redirect_after_action($success, 'Tickets', $action_desc, $query_args);
1261
-    }
1262
-
1263
-
1264
-    /**
1265
-     * @param int $TKT_ID
1266
-     * @return bool|int
1267
-     * @throws EE_Error
1268
-     */
1269
-    protected function _delete_the_ticket($TKT_ID)
1270
-    {
1271
-        $tkt = EEM_Ticket::instance()->get_one_by_ID($TKT_ID);
1272
-        $tkt->_remove_relations('Datetime');
1273
-        //delete all related prices first
1274
-        $tkt->delete_related_permanently('Price');
1275
-        return $tkt->delete_permanently();
1276
-    }
17
+	/**
18
+	 * Extend_Events_Admin_Page constructor.
19
+	 *
20
+	 * @param bool $routing
21
+	 */
22
+	public function __construct($routing = true)
23
+	{
24
+		parent::__construct($routing);
25
+		if (! defined('EVENTS_CAF_TEMPLATE_PATH')) {
26
+			define('EVENTS_CAF_TEMPLATE_PATH', EE_CORE_CAF_ADMIN_EXTEND . 'events/templates/');
27
+			define('EVENTS_CAF_ASSETS', EE_CORE_CAF_ADMIN_EXTEND . 'events/assets/');
28
+			define('EVENTS_CAF_ASSETS_URL', EE_CORE_CAF_ADMIN_EXTEND_URL . 'events/assets/');
29
+		}
30
+	}
31
+
32
+
33
+	/**
34
+	 * Sets routes.
35
+	 */
36
+	protected function _extend_page_config()
37
+	{
38
+		$this->_admin_base_path = EE_CORE_CAF_ADMIN_EXTEND . 'events';
39
+		//is there a evt_id in the request?
40
+		$evt_id = ! empty($this->_req_data['EVT_ID']) && ! is_array($this->_req_data['EVT_ID'])
41
+			? $this->_req_data['EVT_ID']
42
+			: 0;
43
+		$evt_id = ! empty($this->_req_data['post']) ? $this->_req_data['post'] : $evt_id;
44
+		//tkt_id?
45
+		$tkt_id             = ! empty($this->_req_data['TKT_ID']) && ! is_array($this->_req_data['TKT_ID'])
46
+			? $this->_req_data['TKT_ID']
47
+			: 0;
48
+		$new_page_routes    = array(
49
+			'duplicate_event'          => array(
50
+				'func'       => '_duplicate_event',
51
+				'capability' => 'ee_edit_event',
52
+				'obj_id'     => $evt_id,
53
+				'noheader'   => true,
54
+			),
55
+			'ticket_list_table'        => array(
56
+				'func'       => '_tickets_overview_list_table',
57
+				'capability' => 'ee_read_default_tickets',
58
+			),
59
+			'trash_ticket'             => array(
60
+				'func'       => '_trash_or_restore_ticket',
61
+				'capability' => 'ee_delete_default_ticket',
62
+				'obj_id'     => $tkt_id,
63
+				'noheader'   => true,
64
+				'args'       => array('trash' => true),
65
+			),
66
+			'trash_tickets'            => array(
67
+				'func'       => '_trash_or_restore_ticket',
68
+				'capability' => 'ee_delete_default_tickets',
69
+				'noheader'   => true,
70
+				'args'       => array('trash' => true),
71
+			),
72
+			'restore_ticket'           => array(
73
+				'func'       => '_trash_or_restore_ticket',
74
+				'capability' => 'ee_delete_default_ticket',
75
+				'obj_id'     => $tkt_id,
76
+				'noheader'   => true,
77
+			),
78
+			'restore_tickets'          => array(
79
+				'func'       => '_trash_or_restore_ticket',
80
+				'capability' => 'ee_delete_default_tickets',
81
+				'noheader'   => true,
82
+			),
83
+			'delete_ticket'            => array(
84
+				'func'       => '_delete_ticket',
85
+				'capability' => 'ee_delete_default_ticket',
86
+				'obj_id'     => $tkt_id,
87
+				'noheader'   => true,
88
+			),
89
+			'delete_tickets'           => array(
90
+				'func'       => '_delete_ticket',
91
+				'capability' => 'ee_delete_default_tickets',
92
+				'noheader'   => true,
93
+			),
94
+			'import_page'              => array(
95
+				'func'       => '_import_page',
96
+				'capability' => 'import',
97
+			),
98
+			'import'                   => array(
99
+				'func'       => '_import_events',
100
+				'capability' => 'import',
101
+				'noheader'   => true,
102
+			),
103
+			'import_events'            => array(
104
+				'func'       => '_import_events',
105
+				'capability' => 'import',
106
+				'noheader'   => true,
107
+			),
108
+			'export_events'            => array(
109
+				'func'       => '_events_export',
110
+				'capability' => 'export',
111
+				'noheader'   => true,
112
+			),
113
+			'export_categories'        => array(
114
+				'func'       => '_categories_export',
115
+				'capability' => 'export',
116
+				'noheader'   => true,
117
+			),
118
+			'sample_export_file'       => array(
119
+				'func'       => '_sample_export_file',
120
+				'capability' => 'export',
121
+				'noheader'   => true,
122
+			),
123
+			'update_template_settings' => array(
124
+				'func'       => '_update_template_settings',
125
+				'capability' => 'manage_options',
126
+				'noheader'   => true,
127
+			),
128
+		);
129
+		$this->_page_routes = array_merge($this->_page_routes, $new_page_routes);
130
+		//partial route/config override
131
+		$this->_page_config['import_events']['metaboxes'] = $this->_default_espresso_metaboxes;
132
+		$this->_page_config['create_new']['metaboxes'][]  = '_premium_event_editor_meta_boxes';
133
+		$this->_page_config['create_new']['qtips'][]      = 'EE_Event_Editor_Tips';
134
+		$this->_page_config['edit']['qtips'][]            = 'EE_Event_Editor_Tips';
135
+		$this->_page_config['edit']['metaboxes'][]        = '_premium_event_editor_meta_boxes';
136
+		$this->_page_config['default']['list_table']      = 'Extend_Events_Admin_List_Table';
137
+		//add tickets tab but only if there are more than one default ticket!
138
+		$tkt_count = EEM_Ticket::instance()->count_deleted_and_undeleted(
139
+			array(array('TKT_is_default' => 1)),
140
+			'TKT_ID',
141
+			true
142
+		);
143
+		if ($tkt_count > 1) {
144
+			$new_page_config = array(
145
+				'ticket_list_table' => array(
146
+					'nav'           => array(
147
+						'label' => esc_html__('Default Tickets', 'event_espresso'),
148
+						'order' => 60,
149
+					),
150
+					'list_table'    => 'Tickets_List_Table',
151
+					'require_nonce' => false,
152
+				),
153
+			);
154
+		}
155
+		//template settings
156
+		$new_page_config['template_settings'] = array(
157
+			'nav'           => array(
158
+				'label' => esc_html__('Templates', 'event_espresso'),
159
+				'order' => 30,
160
+			),
161
+			'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
162
+			'help_tabs'     => array(
163
+				'general_settings_templates_help_tab' => array(
164
+					'title'    => esc_html__('Templates', 'event_espresso'),
165
+					'filename' => 'general_settings_templates',
166
+				),
167
+			),
168
+			'help_tour'     => array('Templates_Help_Tour'),
169
+			'require_nonce' => false,
170
+		);
171
+		$this->_page_config                   = array_merge($this->_page_config, $new_page_config);
172
+		//add filters and actions
173
+		//modifying _views
174
+		add_filter(
175
+			'FHEE_event_datetime_metabox_add_additional_date_time_template',
176
+			array($this, 'add_additional_datetime_button'),
177
+			10,
178
+			2
179
+		);
180
+		add_filter(
181
+			'FHEE_event_datetime_metabox_clone_button_template',
182
+			array($this, 'add_datetime_clone_button'),
183
+			10,
184
+			2
185
+		);
186
+		add_filter(
187
+			'FHEE_event_datetime_metabox_timezones_template',
188
+			array($this, 'datetime_timezones_template'),
189
+			10,
190
+			2
191
+		);
192
+		//filters for event list table
193
+		add_filter('FHEE__Extend_Events_Admin_List_Table__filters', array($this, 'list_table_filters'), 10, 2);
194
+		add_filter(
195
+			'FHEE__Events_Admin_List_Table__column_actions__action_links',
196
+			array($this, 'extra_list_table_actions'),
197
+			10,
198
+			2
199
+		);
200
+		//legend item
201
+		add_filter('FHEE__Events_Admin_Page___event_legend_items__items', array($this, 'additional_legend_items'));
202
+		add_action('admin_init', array($this, 'admin_init'));
203
+		//heartbeat stuff
204
+		add_filter('heartbeat_received', array($this, 'heartbeat_response'), 10, 2);
205
+	}
206
+
207
+
208
+	/**
209
+	 * admin_init
210
+	 */
211
+	public function admin_init()
212
+	{
213
+		EE_Registry::$i18n_js_strings = array_merge(
214
+			EE_Registry::$i18n_js_strings,
215
+			array(
216
+				'image_confirm'          => esc_html__(
217
+					'Do you really want to delete this image? Please remember to update your event to complete the removal.',
218
+					'event_espresso'
219
+				),
220
+				'event_starts_on'        => esc_html__('Event Starts on', 'event_espresso'),
221
+				'event_ends_on'          => esc_html__('Event Ends on', 'event_espresso'),
222
+				'event_datetime_actions' => esc_html__('Actions', 'event_espresso'),
223
+				'event_clone_dt_msg'     => esc_html__('Clone this Event Date and Time', 'event_espresso'),
224
+				'remove_event_dt_msg'    => esc_html__('Remove this Event Time', 'event_espresso'),
225
+			)
226
+		);
227
+	}
228
+
229
+
230
+	/**
231
+	 * This will be used to listen for any heartbeat data packages coming via the WordPress heartbeat API and handle
232
+	 * accordingly.
233
+	 *
234
+	 * @param array $response The existing heartbeat response array.
235
+	 * @param array $data     The incoming data package.
236
+	 * @return array  possibly appended response.
237
+	 */
238
+	public function heartbeat_response($response, $data)
239
+	{
240
+		/**
241
+		 * check whether count of tickets is approaching the potential
242
+		 * limits for the server.
243
+		 */
244
+		if (! empty($data['input_count'])) {
245
+			$response['max_input_vars_check'] = EE_Registry::instance()->CFG->environment->max_input_vars_limit_check(
246
+				$data['input_count']
247
+			);
248
+		}
249
+		return $response;
250
+	}
251
+
252
+
253
+	/**
254
+	 * Add per page screen options to the default ticket list table view.
255
+	 */
256
+	protected function _add_screen_options_ticket_list_table()
257
+	{
258
+		$this->_per_page_screen_option();
259
+	}
260
+
261
+
262
+	/**
263
+	 * @param string $return
264
+	 * @param int    $id
265
+	 * @param string $new_title
266
+	 * @param string $new_slug
267
+	 * @return string
268
+	 */
269
+	public function extra_permalink_field_buttons($return, $id, $new_title, $new_slug)
270
+	{
271
+		$return = parent::extra_permalink_field_buttons($return, $id, $new_title, $new_slug);
272
+		//make sure this is only when editing
273
+		if (! empty($id)) {
274
+			$href   = EE_Admin_Page::add_query_args_and_nonce(
275
+				array('action' => 'duplicate_event', 'EVT_ID' => $id),
276
+				$this->_admin_base_url
277
+			);
278
+			$title  = esc_attr__('Duplicate Event', 'event_espresso');
279
+			$return .= '<a href="'
280
+					   . $href
281
+					   . '" title="'
282
+					   . $title
283
+					   . '" id="ee-duplicate-event-button" class="button button-small"  value="duplicate_event">'
284
+					   . $title
285
+					   . '</button>';
286
+		}
287
+		return $return;
288
+	}
289
+
290
+
291
+	/**
292
+	 * Set the list table views for the default ticket list table view.
293
+	 */
294
+	public function _set_list_table_views_ticket_list_table()
295
+	{
296
+		$this->_views = array(
297
+			'all'     => array(
298
+				'slug'        => 'all',
299
+				'label'       => esc_html__('All', 'event_espresso'),
300
+				'count'       => 0,
301
+				'bulk_action' => array(
302
+					'trash_tickets' => esc_html__('Move to Trash', 'event_espresso'),
303
+				),
304
+			),
305
+			'trashed' => array(
306
+				'slug'        => 'trashed',
307
+				'label'       => esc_html__('Trash', 'event_espresso'),
308
+				'count'       => 0,
309
+				'bulk_action' => array(
310
+					'restore_tickets' => esc_html__('Restore from Trash', 'event_espresso'),
311
+					'delete_tickets'  => esc_html__('Delete Permanently', 'event_espresso'),
312
+				),
313
+			),
314
+		);
315
+	}
316
+
317
+
318
+	/**
319
+	 * Enqueue scripts and styles for the event editor.
320
+	 */
321
+	public function load_scripts_styles_edit()
322
+	{
323
+		wp_register_script(
324
+			'ee-event-editor-heartbeat',
325
+			EVENTS_CAF_ASSETS_URL . 'event-editor-heartbeat.js',
326
+			array('ee_admin_js', 'heartbeat'),
327
+			EVENT_ESPRESSO_VERSION,
328
+			true
329
+		);
330
+		wp_enqueue_script('ee-accounting');
331
+		//styles
332
+		wp_enqueue_style('espresso-ui-theme');
333
+		wp_enqueue_script('event_editor_js');
334
+		wp_enqueue_script('ee-event-editor-heartbeat');
335
+	}
336
+
337
+
338
+	/**
339
+	 * Returns template for the additional datetime.
340
+	 * @param $template
341
+	 * @param $template_args
342
+	 * @return mixed
343
+	 * @throws DomainException
344
+	 */
345
+	public function add_additional_datetime_button($template, $template_args)
346
+	{
347
+		return EEH_Template::display_template(
348
+			EVENTS_CAF_TEMPLATE_PATH . 'event_datetime_add_additional_time.template.php',
349
+			$template_args,
350
+			true
351
+		);
352
+	}
353
+
354
+
355
+	/**
356
+	 * Returns the template for cloning a datetime.
357
+	 * @param $template
358
+	 * @param $template_args
359
+	 * @return mixed
360
+	 * @throws DomainException
361
+	 */
362
+	public function add_datetime_clone_button($template, $template_args)
363
+	{
364
+		return EEH_Template::display_template(
365
+			EVENTS_CAF_TEMPLATE_PATH . 'event_datetime_metabox_clone_button.template.php',
366
+			$template_args,
367
+			true
368
+		);
369
+	}
370
+
371
+
372
+	/**
373
+	 * Returns the template for datetime timezones.
374
+	 * @param $template
375
+	 * @param $template_args
376
+	 * @return mixed
377
+	 * @throws DomainException
378
+	 */
379
+	public function datetime_timezones_template($template, $template_args)
380
+	{
381
+		return EEH_Template::display_template(
382
+			EVENTS_CAF_TEMPLATE_PATH . 'event_datetime_timezones.template.php',
383
+			$template_args,
384
+			true
385
+		);
386
+	}
387
+
388
+
389
+	/**
390
+	 * Sets the views for the default list table view.
391
+	 */
392
+	protected function _set_list_table_views_default()
393
+	{
394
+		parent::_set_list_table_views_default();
395
+		$new_views    = array(
396
+			'today' => array(
397
+				'slug'        => 'today',
398
+				'label'       => esc_html__('Today', 'event_espresso'),
399
+				'count'       => $this->total_events_today(),
400
+				'bulk_action' => array(
401
+					'trash_events' => esc_html__('Move to Trash', 'event_espresso'),
402
+				),
403
+			),
404
+			'month' => array(
405
+				'slug'        => 'month',
406
+				'label'       => esc_html__('This Month', 'event_espresso'),
407
+				'count'       => $this->total_events_this_month(),
408
+				'bulk_action' => array(
409
+					'trash_events' => esc_html__('Move to Trash', 'event_espresso'),
410
+				),
411
+			),
412
+		);
413
+		$this->_views = array_merge($this->_views, $new_views);
414
+	}
415
+
416
+
417
+	/**
418
+	 * Returns the extra action links for the default list table view.
419
+	 * @param array     $action_links
420
+	 * @param \EE_Event $event
421
+	 * @return array
422
+	 * @throws EE_Error
423
+	 */
424
+	public function extra_list_table_actions(array $action_links, \EE_Event $event)
425
+	{
426
+		if (EE_Registry::instance()->CAP->current_user_can(
427
+			'ee_read_registrations',
428
+			'espresso_registrations_reports',
429
+			$event->ID()
430
+		)
431
+		) {
432
+			$reports_query_args = array(
433
+				'action' => 'reports',
434
+				'EVT_ID' => $event->ID(),
435
+			);
436
+			$reports_link       = EE_Admin_Page::add_query_args_and_nonce($reports_query_args, REG_ADMIN_URL);
437
+			$action_links[]     = '<a href="'
438
+								  . $reports_link
439
+								  . '" title="'
440
+								  . esc_attr__('View Report', 'event_espresso')
441
+								  . '"><div class="dashicons dashicons-chart-bar"></div></a>'
442
+								  . "\n\t";
443
+		}
444
+		if (EE_Registry::instance()->CAP->current_user_can('ee_read_global_messages', 'view_filtered_messages')) {
445
+			EE_Registry::instance()->load_helper('MSG_Template');
446
+			$action_links[] = EEH_MSG_Template::get_message_action_link(
447
+				'see_notifications_for',
448
+				null,
449
+				array('EVT_ID' => $event->ID())
450
+			);
451
+		}
452
+		return $action_links;
453
+	}
454
+
455
+
456
+	/**
457
+	 * @param $items
458
+	 * @return mixed
459
+	 */
460
+	public function additional_legend_items($items)
461
+	{
462
+		if (EE_Registry::instance()->CAP->current_user_can(
463
+			'ee_read_registrations',
464
+			'espresso_registrations_reports'
465
+		)
466
+		) {
467
+			$items['reports'] = array(
468
+				'class' => 'dashicons dashicons-chart-bar',
469
+				'desc'  => esc_html__('Event Reports', 'event_espresso'),
470
+			);
471
+		}
472
+		if (EE_Registry::instance()->CAP->current_user_can('ee_read_global_messages', 'view_filtered_messages')) {
473
+			$related_for_icon = EEH_MSG_Template::get_message_action_icon('see_notifications_for');
474
+			if (isset($related_for_icon['css_class']) && isset($related_for_icon['label'])) {
475
+				$items['view_related_messages'] = array(
476
+					'class' => $related_for_icon['css_class'],
477
+					'desc'  => $related_for_icon['label'],
478
+				);
479
+			}
480
+		}
481
+		return $items;
482
+	}
483
+
484
+
485
+	/**
486
+	 * This is the callback method for the duplicate event route
487
+	 * Method looks for 'EVT_ID' in the request and retrieves that event and its details and duplicates them
488
+	 * into a new event.  We add a hook so that any plugins that add extra event details can hook into this
489
+	 * action.  Note that the dupe will have **DUPLICATE** as its title and slug.
490
+	 * After duplication the redirect is to the new event edit page.
491
+	 *
492
+	 * @return void
493
+	 * @access protected
494
+	 * @throws EE_Error If EE_Event is not available with given ID
495
+	 */
496
+	protected function _duplicate_event()
497
+	{
498
+		// first make sure the ID for the event is in the request.
499
+		//  If it isn't then we need to bail and redirect back to overview list table (cause how did we get here?)
500
+		if (! isset($this->_req_data['EVT_ID'])) {
501
+			EE_Error::add_error(
502
+				esc_html__(
503
+					'In order to duplicate an event an Event ID is required.  None was given.',
504
+					'event_espresso'
505
+				),
506
+				__FILE__,
507
+				__FUNCTION__,
508
+				__LINE__
509
+			);
510
+			$this->_redirect_after_action(false, '', '', array(), true);
511
+			return;
512
+		}
513
+		//k we've got EVT_ID so let's use that to get the event we'll duplicate
514
+		$orig_event = EEM_Event::instance()->get_one_by_ID($this->_req_data['EVT_ID']);
515
+		if (! $orig_event instanceof EE_Event) {
516
+			throw new EE_Error(
517
+				sprintf(
518
+					esc_html__('An EE_Event object could not be retrieved for the given ID (%s)', 'event_espresso'),
519
+					$this->_req_data['EVT_ID']
520
+				)
521
+			);
522
+		}
523
+		//k now let's clone the $orig_event before getting relations
524
+		$new_event = clone $orig_event;
525
+		//original datetimes
526
+		$orig_datetimes = $orig_event->get_many_related('Datetime');
527
+		//other original relations
528
+		$orig_ven = $orig_event->get_many_related('Venue');
529
+		//reset the ID and modify other details to make it clear this is a dupe
530
+		$new_event->set('EVT_ID', 0);
531
+		$new_name = $new_event->name() . ' ' . esc_html__('**DUPLICATE**', 'event_espresso');
532
+		$new_event->set('EVT_name', $new_name);
533
+		$new_event->set(
534
+			'EVT_slug',
535
+			wp_unique_post_slug(
536
+				sanitize_title($orig_event->name()),
537
+				0,
538
+				'publish',
539
+				'espresso_events',
540
+				0
541
+			)
542
+		);
543
+		$new_event->set('status', 'draft');
544
+		//duplicate discussion settings
545
+		$new_event->set('comment_status', $orig_event->get('comment_status'));
546
+		$new_event->set('ping_status', $orig_event->get('ping_status'));
547
+		//save the new event
548
+		$new_event->save();
549
+		//venues
550
+		foreach ($orig_ven as $ven) {
551
+			$new_event->_add_relation_to($ven, 'Venue');
552
+		}
553
+		$new_event->save();
554
+		//now we need to get the question group relations and handle that
555
+		//first primary question groups
556
+		$orig_primary_qgs = $orig_event->get_many_related(
557
+			'Question_Group',
558
+			array(array('Event_Question_Group.EQG_primary' => 1))
559
+		);
560
+		if (! empty($orig_primary_qgs)) {
561
+			foreach ($orig_primary_qgs as $id => $obj) {
562
+				if ($obj instanceof EE_Question_Group) {
563
+					$new_event->_add_relation_to($obj, 'Question_Group', array('EQG_primary' => 1));
564
+				}
565
+			}
566
+		}
567
+		//next additional attendee question groups
568
+		$orig_additional_qgs = $orig_event->get_many_related(
569
+			'Question_Group',
570
+			array(array('Event_Question_Group.EQG_primary' => 0))
571
+		);
572
+		if (! empty($orig_additional_qgs)) {
573
+			foreach ($orig_additional_qgs as $id => $obj) {
574
+				if ($obj instanceof EE_Question_Group) {
575
+					$new_event->_add_relation_to($obj, 'Question_Group', array('EQG_primary' => 0));
576
+				}
577
+			}
578
+		}
579
+
580
+		$new_event->save();
581
+
582
+		//k now that we have the new event saved we can loop through the datetimes and start adding relations.
583
+		$cloned_tickets = array();
584
+		foreach ($orig_datetimes as $orig_dtt) {
585
+			if (! $orig_dtt instanceof EE_Datetime) {
586
+				continue;
587
+			}
588
+			$new_dtt   = clone $orig_dtt;
589
+			$orig_tkts = $orig_dtt->tickets();
590
+			//save new dtt then add to event
591
+			$new_dtt->set('DTT_ID', 0);
592
+			$new_dtt->set('DTT_sold', 0);
593
+			$new_dtt->set_reserved(0);
594
+			$new_dtt->save();
595
+			$new_event->_add_relation_to($new_dtt, 'Datetime');
596
+			$new_event->save();
597
+			//now let's get the ticket relations setup.
598
+			foreach ((array)$orig_tkts as $orig_tkt) {
599
+				//it's possible a datetime will have no tickets so let's verify we HAVE a ticket first.
600
+				if (! $orig_tkt instanceof EE_Ticket) {
601
+					continue;
602
+				}
603
+				//is this ticket archived?  If it is then let's skip
604
+				if ($orig_tkt->get('TKT_deleted')) {
605
+					continue;
606
+				}
607
+				// does this original ticket already exist in the clone_tickets cache?
608
+				//  If so we'll just use the new ticket from it.
609
+				if (isset($cloned_tickets[$orig_tkt->ID()])) {
610
+					$new_tkt = $cloned_tickets[$orig_tkt->ID()];
611
+				} else {
612
+					$new_tkt = clone $orig_tkt;
613
+					//get relations on the $orig_tkt that we need to setup.
614
+					$orig_prices = $orig_tkt->prices();
615
+					$new_tkt->set('TKT_ID', 0);
616
+					$new_tkt->set('TKT_sold', 0);
617
+					$new_tkt->set('TKT_reserved', 0);
618
+					$new_tkt->save(); //make sure new ticket has ID.
619
+					//price relations on new ticket need to be setup.
620
+					foreach ($orig_prices as $orig_price) {
621
+						$new_price = clone $orig_price;
622
+						$new_price->set('PRC_ID', 0);
623
+						$new_price->save();
624
+						$new_tkt->_add_relation_to($new_price, 'Price');
625
+						$new_tkt->save();
626
+					}
627
+
628
+					do_action(
629
+						'AHEE__Extend_Events_Admin_Page___duplicate_event__duplicate_ticket__after',
630
+						$orig_tkt,
631
+						$new_tkt,
632
+						$orig_prices,
633
+						$orig_event,
634
+						$orig_dtt,
635
+						$new_dtt
636
+					);
637
+				}
638
+				// k now we can add the new ticket as a relation to the new datetime
639
+				// and make sure its added to our cached $cloned_tickets array
640
+				// for use with later datetimes that have the same ticket.
641
+				$new_dtt->_add_relation_to($new_tkt, 'Ticket');
642
+				$new_dtt->save();
643
+				$cloned_tickets[$orig_tkt->ID()] = $new_tkt;
644
+			}
645
+		}
646
+		//clone taxonomy information
647
+		$taxonomies_to_clone_with = apply_filters(
648
+			'FHEE__Extend_Events_Admin_Page___duplicate_event__taxonomies_to_clone',
649
+			array('espresso_event_categories', 'espresso_event_type', 'post_tag')
650
+		);
651
+		//get terms for original event (notice)
652
+		$orig_terms = wp_get_object_terms($orig_event->ID(), $taxonomies_to_clone_with);
653
+		//loop through terms and add them to new event.
654
+		foreach ($orig_terms as $term) {
655
+			wp_set_object_terms($new_event->ID(), $term->term_id, $term->taxonomy, true);
656
+		}
657
+
658
+		//duplicate other core WP_Post items for this event.
659
+		//post thumbnail (feature image).
660
+		$feature_image_id = get_post_thumbnail_id($orig_event->ID());
661
+		if ($feature_image_id) {
662
+			update_post_meta($new_event->ID(), '_thumbnail_id', $feature_image_id);
663
+		}
664
+
665
+		//duplicate page_template setting
666
+		$page_template = get_post_meta($orig_event->ID(), '_wp_page_template', true);
667
+		if ($page_template) {
668
+			update_post_meta($new_event->ID(), '_wp_page_template', $page_template);
669
+		}
670
+
671
+		do_action('AHEE__Extend_Events_Admin_Page___duplicate_event__after', $new_event, $orig_event);
672
+		//now let's redirect to the edit page for this duplicated event if we have a new event id.
673
+		if ($new_event->ID()) {
674
+			$redirect_args = array(
675
+				'post'   => $new_event->ID(),
676
+				'action' => 'edit',
677
+			);
678
+			EE_Error::add_success(
679
+				esc_html__(
680
+					'Event successfully duplicated.  Please review the details below and make any necessary edits',
681
+					'event_espresso'
682
+				)
683
+			);
684
+		} else {
685
+			$redirect_args = array(
686
+				'action' => 'default',
687
+			);
688
+			EE_Error::add_error(
689
+				esc_html__('Not able to duplicate event.  Something went wrong.', 'event_espresso'),
690
+				__FILE__,
691
+				__FUNCTION__,
692
+				__LINE__
693
+			);
694
+		}
695
+		$this->_redirect_after_action(false, '', '', $redirect_args, true);
696
+	}
697
+
698
+
699
+	/**
700
+	 * Generates output for the import page.
701
+	 * @throws DomainException
702
+	 */
703
+	protected function _import_page()
704
+	{
705
+		$title                                      = esc_html__('Import', 'event_espresso');
706
+		$intro                                      = esc_html__(
707
+			'If you have a previously exported Event Espresso 4 information in a Comma Separated Value (CSV) file format, you can upload the file here: ',
708
+			'event_espresso'
709
+		);
710
+		$form_url                                   = EVENTS_ADMIN_URL;
711
+		$action                                     = 'import_events';
712
+		$type                                       = 'csv';
713
+		$this->_template_args['form']               = EE_Import::instance()->upload_form(
714
+			$title, $intro, $form_url, $action, $type
715
+		);
716
+		$this->_template_args['sample_file_link']   = EE_Admin_Page::add_query_args_and_nonce(
717
+			array('action' => 'sample_export_file'),
718
+			$this->_admin_base_url
719
+		);
720
+		$content                                    = EEH_Template::display_template(
721
+			EVENTS_CAF_TEMPLATE_PATH . 'import_page.template.php',
722
+			$this->_template_args,
723
+			true
724
+		);
725
+		$this->_template_args['admin_page_content'] = $content;
726
+		$this->display_admin_page_with_sidebar();
727
+	}
728
+
729
+
730
+	/**
731
+	 * _import_events
732
+	 * This handles displaying the screen and running imports for importing events.
733
+	 *
734
+	 * @return void
735
+	 */
736
+	protected function _import_events()
737
+	{
738
+		require_once(EE_CLASSES . 'EE_Import.class.php');
739
+		$success = EE_Import::instance()->import();
740
+		$this->_redirect_after_action($success, 'Import File', 'ran', array('action' => 'import_page'), true);
741
+	}
742
+
743
+
744
+	/**
745
+	 * _events_export
746
+	 * Will export all (or just the given event) to a Excel compatible file.
747
+	 *
748
+	 * @access protected
749
+	 * @return void
750
+	 */
751
+	protected function _events_export()
752
+	{
753
+		if (isset($this->_req_data['EVT_ID'])) {
754
+			$event_ids = $this->_req_data['EVT_ID'];
755
+		} elseif (isset($this->_req_data['EVT_IDs'])) {
756
+			$event_ids = $this->_req_data['EVT_IDs'];
757
+		} else {
758
+			$event_ids = null;
759
+		}
760
+		//todo: I don't like doing this but it'll do until we modify EE_Export Class.
761
+		$new_request_args = array(
762
+			'export' => 'report',
763
+			'action' => 'all_event_data',
764
+			'EVT_ID' => $event_ids,
765
+		);
766
+		$this->_req_data  = array_merge($this->_req_data, $new_request_args);
767
+		if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
768
+			require_once(EE_CLASSES . 'EE_Export.class.php');
769
+			$EE_Export = EE_Export::instance($this->_req_data);
770
+			$EE_Export->export();
771
+		}
772
+	}
773
+
774
+
775
+	/**
776
+	 * handle category exports()
777
+	 *
778
+	 * @return void
779
+	 */
780
+	protected function _categories_export()
781
+	{
782
+		//todo: I don't like doing this but it'll do until we modify EE_Export Class.
783
+		$new_request_args = array(
784
+			'export'       => 'report',
785
+			'action'       => 'categories',
786
+			'category_ids' => $this->_req_data['EVT_CAT_ID'],
787
+		);
788
+		$this->_req_data  = array_merge($this->_req_data, $new_request_args);
789
+		if (is_readable(EE_CLASSES . 'EE_Export.class.php')) {
790
+			require_once(EE_CLASSES . 'EE_Export.class.php');
791
+			$EE_Export = EE_Export::instance($this->_req_data);
792
+			$EE_Export->export();
793
+		}
794
+	}
795
+
796
+
797
+	/**
798
+	 * Creates a sample CSV file for importing
799
+	 */
800
+	protected function _sample_export_file()
801
+	{
802
+		//		require_once(EE_CLASSES . 'EE_Export.class.php');
803
+		EE_Export::instance()->export_sample();
804
+	}
805
+
806
+
807
+	/*************        Template Settings        *************/
808
+	/**
809
+	 * Generates template settings page output
810
+	 * @throws DomainException
811
+	 * @throws EE_Error
812
+	 */
813
+	protected function _template_settings()
814
+	{
815
+		$this->_template_args['values'] = $this->_yes_no_values;
816
+		/**
817
+		 * Note leaving this filter in for backward compatibility this was moved in 4.6.x
818
+		 * from General_Settings_Admin_Page to here.
819
+		 */
820
+		$this->_template_args = apply_filters(
821
+			'FHEE__General_Settings_Admin_Page__template_settings__template_args',
822
+			$this->_template_args
823
+		);
824
+		$this->_set_add_edit_form_tags('update_template_settings');
825
+		$this->_set_publish_post_box_vars(null, false, false, null, false);
826
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
827
+			EVENTS_CAF_TEMPLATE_PATH . 'template_settings.template.php',
828
+			$this->_template_args,
829
+			true
830
+		);
831
+		$this->display_admin_page_with_sidebar();
832
+	}
833
+
834
+
835
+	/**
836
+	 * Handler for updating template settings.
837
+	 */
838
+	protected function _update_template_settings()
839
+	{
840
+		/**
841
+		 * Note leaving this filter in for backward compatibility this was moved in 4.6.x
842
+		 * from General_Settings_Admin_Page to here.
843
+		 */
844
+		EE_Registry::instance()->CFG->template_settings = apply_filters(
845
+			'FHEE__General_Settings_Admin_Page__update_template_settings__data',
846
+			EE_Registry::instance()->CFG->template_settings,
847
+			$this->_req_data
848
+		);
849
+		//update custom post type slugs and detect if we need to flush rewrite rules
850
+		$old_slug                                          = EE_Registry::instance()->CFG->core->event_cpt_slug;
851
+		EE_Registry::instance()->CFG->core->event_cpt_slug = empty($this->_req_data['event_cpt_slug'])
852
+			? EE_Registry::instance()->CFG->core->event_cpt_slug
853
+			: sanitize_title_with_dashes($this->_req_data['event_cpt_slug']);
854
+		$what                                              = 'Template Settings';
855
+		$success                                           = $this->_update_espresso_configuration(
856
+			$what,
857
+			EE_Registry::instance()->CFG->template_settings,
858
+			__FILE__,
859
+			__FUNCTION__,
860
+			__LINE__
861
+		);
862
+		if (EE_Registry::instance()->CFG->core->event_cpt_slug != $old_slug) {
863
+			update_option('ee_flush_rewrite_rules', true);
864
+		}
865
+		$this->_redirect_after_action($success, $what, 'updated', array('action' => 'template_settings'));
866
+	}
867
+
868
+
869
+	/**
870
+	 * _premium_event_editor_meta_boxes
871
+	 * add all metaboxes related to the event_editor
872
+	 *
873
+	 * @access protected
874
+	 * @return void
875
+	 * @throws EE_Error
876
+	 */
877
+	protected function _premium_event_editor_meta_boxes()
878
+	{
879
+		$this->verify_cpt_object();
880
+		add_meta_box(
881
+			'espresso_event_editor_event_options',
882
+			esc_html__('Event Registration Options', 'event_espresso'),
883
+			array($this, 'registration_options_meta_box'),
884
+			$this->page_slug,
885
+			'side',
886
+			'core'
887
+		);
888
+	}
889
+
890
+
891
+	/**
892
+	 * override caf metabox
893
+	 *
894
+	 * @return void
895
+	 * @throws DomainException
896
+	 */
897
+	public function registration_options_meta_box()
898
+	{
899
+		$yes_no_values                                    = array(
900
+			array('id' => true, 'text' => esc_html__('Yes', 'event_espresso')),
901
+			array('id' => false, 'text' => esc_html__('No', 'event_espresso')),
902
+		);
903
+		$default_reg_status_values                        = EEM_Registration::reg_status_array(
904
+			array(
905
+				EEM_Registration::status_id_cancelled,
906
+				EEM_Registration::status_id_declined,
907
+				EEM_Registration::status_id_incomplete,
908
+				EEM_Registration::status_id_wait_list,
909
+			),
910
+			true
911
+		);
912
+		$template_args['active_status']                   = $this->_cpt_model_obj->pretty_active_status(false);
913
+		$template_args['_event']                          = $this->_cpt_model_obj;
914
+		$template_args['additional_limit']                = $this->_cpt_model_obj->additional_limit();
915
+		$template_args['default_registration_status']     = EEH_Form_Fields::select_input(
916
+			'default_reg_status',
917
+			$default_reg_status_values,
918
+			$this->_cpt_model_obj->default_registration_status()
919
+		);
920
+		$template_args['display_description']             = EEH_Form_Fields::select_input(
921
+			'display_desc',
922
+			$yes_no_values,
923
+			$this->_cpt_model_obj->display_description()
924
+		);
925
+		$template_args['display_ticket_selector']         = EEH_Form_Fields::select_input(
926
+			'display_ticket_selector',
927
+			$yes_no_values,
928
+			$this->_cpt_model_obj->display_ticket_selector(),
929
+			'',
930
+			'',
931
+			false
932
+		);
933
+		$template_args['EVT_default_registration_status'] = EEH_Form_Fields::select_input(
934
+			'EVT_default_registration_status',
935
+			$default_reg_status_values,
936
+			$this->_cpt_model_obj->default_registration_status()
937
+		);
938
+		$template_args['additional_registration_options'] = apply_filters(
939
+			'FHEE__Events_Admin_Page__registration_options_meta_box__additional_registration_options',
940
+			'',
941
+			$template_args,
942
+			$yes_no_values,
943
+			$default_reg_status_values
944
+		);
945
+		EEH_Template::display_template(
946
+			EVENTS_CAF_TEMPLATE_PATH . 'event_registration_options.template.php',
947
+			$template_args
948
+		);
949
+	}
950
+
951
+
952
+
953
+	/**
954
+	 * wp_list_table_mods for caf
955
+	 * ============================
956
+	 */
957
+	/**
958
+	 * hook into list table filters and provide filters for caffeinated list table
959
+	 *
960
+	 * @param  array $old_filters    any existing filters present
961
+	 * @param  array $list_table_obj the list table object
962
+	 * @return array                  new filters
963
+	 */
964
+	public function list_table_filters($old_filters, $list_table_obj)
965
+	{
966
+		$filters = array();
967
+		//first month/year filters
968
+		$filters[] = $this->espresso_event_months_dropdown();
969
+		$status    = isset($this->_req_data['status']) ? $this->_req_data['status'] : null;
970
+		//active status dropdown
971
+		if ($status !== 'draft') {
972
+			$filters[] = $this->active_status_dropdown(
973
+				isset($this->_req_data['active_status']) ? $this->_req_data['active_status'] : ''
974
+			);
975
+		}
976
+		//category filter
977
+		$filters[] = $this->category_dropdown();
978
+		return array_merge($old_filters, $filters);
979
+	}
980
+
981
+
982
+	/**
983
+	 * espresso_event_months_dropdown
984
+	 *
985
+	 * @access public
986
+	 * @return string                dropdown listing month/year selections for events.
987
+	 */
988
+	public function espresso_event_months_dropdown()
989
+	{
990
+		// what we need to do is get all PRIMARY datetimes for all events to filter on.
991
+		// Note we need to include any other filters that are set!
992
+		$status = isset($this->_req_data['status']) ? $this->_req_data['status'] : null;
993
+		//categories?
994
+		$category = isset($this->_req_data['EVT_CAT']) && $this->_req_data['EVT_CAT'] > 0
995
+			? $this->_req_data['EVT_CAT']
996
+			: null;
997
+		//active status?
998
+		$active_status = isset($this->_req_data['active_status']) ? $this->_req_data['active_status'] : null;
999
+		$cur_date      = isset($this->_req_data['month_range']) ? $this->_req_data['month_range'] : '';
1000
+		return EEH_Form_Fields::generate_event_months_dropdown($cur_date, $status, $category, $active_status);
1001
+	}
1002
+
1003
+
1004
+	/**
1005
+	 * returns a list of "active" statuses on the event
1006
+	 *
1007
+	 * @param  string $current_value whatever the current active status is
1008
+	 * @return string
1009
+	 */
1010
+	public function active_status_dropdown($current_value = '')
1011
+	{
1012
+		$select_name = 'active_status';
1013
+		$values      = array(
1014
+			'none'     => esc_html__('Show Active/Inactive', 'event_espresso'),
1015
+			'active'   => esc_html__('Active', 'event_espresso'),
1016
+			'upcoming' => esc_html__('Upcoming', 'event_espresso'),
1017
+			'expired'  => esc_html__('Expired', 'event_espresso'),
1018
+			'inactive' => esc_html__('Inactive', 'event_espresso'),
1019
+		);
1020
+		$id          = 'id="espresso-active-status-dropdown-filter"';
1021
+		$class       = 'wide';
1022
+		return EEH_Form_Fields::select_input($select_name, $values, $current_value, $id, $class);
1023
+	}
1024
+
1025
+
1026
+	/**
1027
+	 * output a dropdown of the categories for the category filter on the event admin list table
1028
+	 *
1029
+	 * @access  public
1030
+	 * @return string html
1031
+	 */
1032
+	public function category_dropdown()
1033
+	{
1034
+		$cur_cat = isset($this->_req_data['EVT_CAT']) ? $this->_req_data['EVT_CAT'] : -1;
1035
+		return EEH_Form_Fields::generate_event_category_dropdown($cur_cat);
1036
+	}
1037
+
1038
+
1039
+	/**
1040
+	 * get total number of events today
1041
+	 *
1042
+	 * @access public
1043
+	 * @return int
1044
+	 * @throws EE_Error
1045
+	 */
1046
+	public function total_events_today()
1047
+	{
1048
+		$start = EEM_Datetime::instance()->convert_datetime_for_query(
1049
+			'DTT_EVT_start',
1050
+			date('Y-m-d') . ' 00:00:00',
1051
+			'Y-m-d H:i:s',
1052
+			'UTC'
1053
+		);
1054
+		$end   = EEM_Datetime::instance()->convert_datetime_for_query(
1055
+			'DTT_EVT_start',
1056
+			date('Y-m-d') . ' 23:59:59',
1057
+			'Y-m-d H:i:s',
1058
+			'UTC'
1059
+		);
1060
+		$where = array(
1061
+			'Datetime.DTT_EVT_start' => array('BETWEEN', array($start, $end)),
1062
+		);
1063
+		$count = EEM_Event::instance()->count(array($where, 'caps' => 'read_admin'), 'EVT_ID', true);
1064
+		return $count;
1065
+	}
1066
+
1067
+
1068
+	/**
1069
+	 * get total number of events this month
1070
+	 *
1071
+	 * @access public
1072
+	 * @return int
1073
+	 * @throws EE_Error
1074
+	 */
1075
+	public function total_events_this_month()
1076
+	{
1077
+		//Dates
1078
+		$this_year_r     = date('Y');
1079
+		$this_month_r    = date('m');
1080
+		$days_this_month = date('t');
1081
+		$start           = EEM_Datetime::instance()->convert_datetime_for_query(
1082
+			'DTT_EVT_start',
1083
+			$this_year_r . '-' . $this_month_r . '-01 00:00:00',
1084
+			'Y-m-d H:i:s',
1085
+			'UTC'
1086
+		);
1087
+		$end             = EEM_Datetime::instance()->convert_datetime_for_query(
1088
+			'DTT_EVT_start',
1089
+			$this_year_r . '-' . $this_month_r . '-' . $days_this_month . ' 23:59:59',
1090
+			'Y-m-d H:i:s',
1091
+			'UTC'
1092
+		);
1093
+		$where           = array(
1094
+			'Datetime.DTT_EVT_start' => array('BETWEEN', array($start, $end)),
1095
+		);
1096
+		$count           = EEM_Event::instance()->count(array($where, 'caps' => 'read_admin'), 'EVT_ID', true);
1097
+		return $count;
1098
+	}
1099
+
1100
+
1101
+	/** DEFAULT TICKETS STUFF **/
1102
+
1103
+	/**
1104
+	 * Output default tickets list table view.
1105
+	 */
1106
+	public function _tickets_overview_list_table()
1107
+	{
1108
+		$this->_search_btn_label = esc_html__('Tickets', 'event_espresso');
1109
+		$this->display_admin_list_table_page_with_no_sidebar();
1110
+	}
1111
+
1112
+
1113
+	/**
1114
+	 * @param int  $per_page
1115
+	 * @param bool $count
1116
+	 * @param bool $trashed
1117
+	 * @return \EE_Soft_Delete_Base_Class[]|int
1118
+	 */
1119
+	public function get_default_tickets($per_page = 10, $count = false, $trashed = false)
1120
+	{
1121
+		$orderby = empty($this->_req_data['orderby']) ? 'TKT_name' : $this->_req_data['orderby'];
1122
+		$order   = empty($this->_req_data['order']) ? 'ASC' : $this->_req_data['order'];
1123
+		switch ($orderby) {
1124
+			case 'TKT_name':
1125
+				$orderby = array('TKT_name' => $order);
1126
+				break;
1127
+			case 'TKT_price':
1128
+				$orderby = array('TKT_price' => $order);
1129
+				break;
1130
+			case 'TKT_uses':
1131
+				$orderby = array('TKT_uses' => $order);
1132
+				break;
1133
+			case 'TKT_min':
1134
+				$orderby = array('TKT_min' => $order);
1135
+				break;
1136
+			case 'TKT_max':
1137
+				$orderby = array('TKT_max' => $order);
1138
+				break;
1139
+			case 'TKT_qty':
1140
+				$orderby = array('TKT_qty' => $order);
1141
+				break;
1142
+		}
1143
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged'])
1144
+			? $this->_req_data['paged']
1145
+			: 1;
1146
+		$per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage'])
1147
+			? $this->_req_data['perpage']
1148
+			: $per_page;
1149
+		$_where       = array(
1150
+			'TKT_is_default' => 1,
1151
+			'TKT_deleted'    => $trashed,
1152
+		);
1153
+		$offset       = ($current_page - 1) * $per_page;
1154
+		$limit        = array($offset, $per_page);
1155
+		if (isset($this->_req_data['s'])) {
1156
+			$sstr         = '%' . $this->_req_data['s'] . '%';
1157
+			$_where['OR'] = array(
1158
+				'TKT_name'        => array('LIKE', $sstr),
1159
+				'TKT_description' => array('LIKE', $sstr),
1160
+			);
1161
+		}
1162
+		$query_params = array(
1163
+			$_where,
1164
+			'order_by' => $orderby,
1165
+			'limit'    => $limit,
1166
+			'group_by' => 'TKT_ID',
1167
+		);
1168
+		if ($count) {
1169
+			return EEM_Ticket::instance()->count_deleted_and_undeleted(array($_where));
1170
+		} else {
1171
+			return EEM_Ticket::instance()->get_all_deleted_and_undeleted($query_params);
1172
+		}
1173
+	}
1174
+
1175
+
1176
+	/**
1177
+	 * @param bool $trash
1178
+	 * @throws EE_Error
1179
+	 */
1180
+	protected function _trash_or_restore_ticket($trash = false)
1181
+	{
1182
+		$success = 1;
1183
+		$TKT     = EEM_Ticket::instance();
1184
+		//checkboxes?
1185
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1186
+			//if array has more than one element then success message should be plural
1187
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1188
+			//cycle thru the boxes
1189
+			while (list($TKT_ID, $value) = each($this->_req_data['checkbox'])) {
1190
+				if ($trash) {
1191
+					if (! $TKT->delete_by_ID($TKT_ID)) {
1192
+						$success = 0;
1193
+					}
1194
+				} else {
1195
+					if (! $TKT->restore_by_ID($TKT_ID)) {
1196
+						$success = 0;
1197
+					}
1198
+				}
1199
+			}
1200
+		} else {
1201
+			//grab single id and trash
1202
+			$TKT_ID = absint($this->_req_data['TKT_ID']);
1203
+			if ($trash) {
1204
+				if (! $TKT->delete_by_ID($TKT_ID)) {
1205
+					$success = 0;
1206
+				}
1207
+			} else {
1208
+				if (! $TKT->restore_by_ID($TKT_ID)) {
1209
+					$success = 0;
1210
+				}
1211
+			}
1212
+		}
1213
+		$action_desc = $trash ? 'moved to the trash' : 'restored';
1214
+		$query_args  = array(
1215
+			'action' => 'ticket_list_table',
1216
+			'status' => $trash ? '' : 'trashed',
1217
+		);
1218
+		$this->_redirect_after_action($success, 'Tickets', $action_desc, $query_args);
1219
+	}
1220
+
1221
+
1222
+	/**
1223
+	 * Handles trashing default ticket.
1224
+	 */
1225
+	protected function _delete_ticket()
1226
+	{
1227
+		$success = 1;
1228
+		//checkboxes?
1229
+		if (! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
1230
+			//if array has more than one element then success message should be plural
1231
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
1232
+			//cycle thru the boxes
1233
+			while (list($TKT_ID, $value) = each($this->_req_data['checkbox'])) {
1234
+				//delete
1235
+				if (! $this->_delete_the_ticket($TKT_ID)) {
1236
+					$success = 0;
1237
+				}
1238
+			}
1239
+		} else {
1240
+			//grab single id and trash
1241
+			$TKT_ID = absint($this->_req_data['TKT_ID']);
1242
+			if (! $this->_delete_the_ticket($TKT_ID)) {
1243
+				$success = 0;
1244
+			}
1245
+		}
1246
+		$action_desc = 'deleted';
1247
+		$query_args  = array(
1248
+			'action' => 'ticket_list_table',
1249
+			'status' => 'trashed',
1250
+		);
1251
+		//fail safe.  If the default ticket count === 1 then we need to redirect to event overview.
1252
+		if (EEM_Ticket::instance()->count_deleted_and_undeleted(
1253
+			array(array('TKT_is_default' => 1)),
1254
+			'TKT_ID',
1255
+			true
1256
+		)
1257
+		) {
1258
+			$query_args = array();
1259
+		}
1260
+		$this->_redirect_after_action($success, 'Tickets', $action_desc, $query_args);
1261
+	}
1262
+
1263
+
1264
+	/**
1265
+	 * @param int $TKT_ID
1266
+	 * @return bool|int
1267
+	 * @throws EE_Error
1268
+	 */
1269
+	protected function _delete_the_ticket($TKT_ID)
1270
+	{
1271
+		$tkt = EEM_Ticket::instance()->get_one_by_ID($TKT_ID);
1272
+		$tkt->_remove_relations('Datetime');
1273
+		//delete all related prices first
1274
+		$tkt->delete_related_permanently('Price');
1275
+		return $tkt->delete_permanently();
1276
+	}
1277 1277
 }
Please login to merge, or discard this patch.
admin_pages/general_settings/General_Settings_Admin_Page.core.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -748,7 +748,7 @@  discard block
 block discarded – undo
748 748
      *
749 749
      * @access    public
750 750
      * @param    string $CNT_ISO
751
-     * @return mixed string | array
751
+     * @return string|null string | array
752 752
      * @throws DomainException
753 753
      */
754 754
     public function display_country_settings($CNT_ISO = '')
@@ -1064,7 +1064,7 @@  discard block
 block discarded – undo
1064 1064
      *        delete_state
1065 1065
      *
1066 1066
      * @access    public
1067
-     * @return        boolean
1067
+     * @return        false|null
1068 1068
      */
1069 1069
     public function delete_state()
1070 1070
     {
Please login to merge, or discard this patch.
Indentation   +1371 added lines, -1371 removed lines patch added patch discarded remove patch
@@ -17,1386 +17,1386 @@
 block discarded – undo
17 17
 {
18 18
 
19 19
 
20
-    /**
21
-     * _question_group
22
-     * holds the specific question group object for the question group details screen
23
-     *
24
-     * @var object
25
-     */
26
-    protected $_question_group;
27
-
28
-
29
-    /**
30
-     * Initialize basic properties.
31
-     */
32
-    protected function _init_page_props()
33
-    {
34
-        $this->page_slug        = GEN_SET_PG_SLUG;
35
-        $this->page_label       = GEN_SET_LABEL;
36
-        $this->_admin_base_url  = GEN_SET_ADMIN_URL;
37
-        $this->_admin_base_path = GEN_SET_ADMIN;
38
-    }
39
-
40
-
41
-    /**
42
-     * Set ajax hooks
43
-     */
44
-    protected function _ajax_hooks()
45
-    {
46
-        add_action('wp_ajax_espresso_display_country_settings', array($this, 'display_country_settings'));
47
-        add_action('wp_ajax_espresso_display_country_states', array($this, 'display_country_states'));
48
-        add_action('wp_ajax_espresso_delete_state', array($this, 'delete_state'), 10, 3);
49
-        add_action('wp_ajax_espresso_add_new_state', array($this, 'add_new_state'));
50
-    }
51
-
52
-
53
-    /**
54
-     * More page properties initialization.
55
-     */
56
-    protected function _define_page_props()
57
-    {
58
-        $this->_admin_page_title = GEN_SET_LABEL;
59
-        $this->_labels           = array(
60
-            'publishbox' => __('Update Settings', 'event_espresso'),
61
-        );
62
-    }
63
-
64
-
65
-    /**
66
-     * Set page routes property.
67
-     */
68
-    protected function _set_page_routes()
69
-    {
70
-        $this->_page_routes = array(
71
-
72
-            'critical_pages'                => array(
73
-                'func'       => '_espresso_page_settings',
74
-                'capability' => 'manage_options',
75
-            ),
76
-            'update_espresso_page_settings' => array(
77
-                'func'       => '_update_espresso_page_settings',
78
-                'capability' => 'manage_options',
79
-                'noheader'   => true,
80
-            ),
81
-            'default'                       => array(
82
-                'func'       => '_your_organization_settings',
83
-                'capability' => 'manage_options',
84
-            ),
85
-
86
-            'update_your_organization_settings' => array(
87
-                'func'       => '_update_your_organization_settings',
88
-                'capability' => 'manage_options',
89
-                'noheader'   => true,
90
-            ),
91
-
92
-            'admin_option_settings' => array(
93
-                'func'       => '_admin_option_settings',
94
-                'capability' => 'manage_options',
95
-            ),
96
-
97
-            'update_admin_option_settings' => array(
98
-                'func'       => '_update_admin_option_settings',
99
-                'capability' => 'manage_options',
100
-                'noheader'   => true,
101
-            ),
102
-
103
-            'country_settings' => array(
104
-                'func'       => '_country_settings',
105
-                'capability' => 'manage_options',
106
-            ),
107
-
108
-            'update_country_settings' => array(
109
-                'func'       => '_update_country_settings',
110
-                'capability' => 'manage_options',
111
-                'noheader'   => true,
112
-            ),
113
-
114
-            'display_country_settings' => array(
115
-                'func'       => 'display_country_settings',
116
-                'capability' => 'manage_options',
117
-                'noheader'   => true,
118
-            ),
119
-
120
-            'add_new_state' => array(
121
-                'func'       => 'add_new_state',
122
-                'capability' => 'manage_options',
123
-                'noheader'   => true,
124
-            ),
125
-
126
-            'delete_state' => array(
127
-                'func'       => 'delete_state',
128
-                'capability' => 'manage_options',
129
-                'noheader'   => true,
130
-            ),
131
-        );
132
-    }
133
-
134
-
135
-    /**
136
-     * Set page configuration property
137
-     */
138
-    protected function _set_page_config()
139
-    {
140
-        $this->_page_config = array(
141
-            'critical_pages'        => array(
142
-                'nav'           => array(
143
-                    'label' => __('Critical Pages', 'event_espresso'),
144
-                    'order' => 50,
145
-                ),
146
-                'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
147
-                'help_tabs'     => array(
148
-                    'general_settings_critical_pages_help_tab' => array(
149
-                        'title'    => __('Critical Pages', 'event_espresso'),
150
-                        'filename' => 'general_settings_critical_pages',
151
-                    ),
152
-                ),
153
-                'help_tour'     => array('Critical_Pages_Help_Tour'),
154
-                'require_nonce' => false,
155
-            ),
156
-            'default'               => array(
157
-                'nav'           => array(
158
-                    'label' => __('Your Organization', 'event_espresso'),
159
-                    'order' => 20,
160
-                ),
161
-                'help_tabs'     => array(
162
-                    'general_settings_your_organization_help_tab' => array(
163
-                        'title'    => __('Your Organization', 'event_espresso'),
164
-                        'filename' => 'general_settings_your_organization',
165
-                    ),
166
-                ),
167
-                'help_tour'     => array('Your_Organization_Help_Tour'),
168
-                'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
169
-                'require_nonce' => false,
170
-            ),
171
-            'admin_option_settings' => array(
172
-                'nav'           => array(
173
-                    'label' => __('Admin Options', 'event_espresso'),
174
-                    'order' => 60,
175
-                ),
176
-                'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
177
-                'help_tabs'     => array(
178
-                    'general_settings_admin_options_help_tab' => array(
179
-                        'title'    => __('Admin Options', 'event_espresso'),
180
-                        'filename' => 'general_settings_admin_options',
181
-                    ),
182
-                ),
183
-                'help_tour'     => array('Admin_Options_Help_Tour'),
184
-                'require_nonce' => false,
185
-            ),
186
-            'country_settings'      => array(
187
-                'nav'           => array(
188
-                    'label' => __('Countries', 'event_espresso'),
189
-                    'order' => 70,
190
-                ),
191
-                'help_tabs'     => array(
192
-                    'general_settings_countries_help_tab' => array(
193
-                        'title'    => __('Countries', 'event_espresso'),
194
-                        'filename' => 'general_settings_countries',
195
-                    ),
196
-                ),
197
-                'help_tour'     => array('Countries_Help_Tour'),
198
-                'require_nonce' => false,
199
-            ),
200
-        );
201
-    }
202
-
203
-
204
-
205
-    protected function _add_screen_options()
206
-    {
207
-    }
208
-
209
-    protected function _add_feature_pointers()
210
-    {
211
-    }
212
-
213
-
214
-    /**
215
-     * Enqueue global scripts and styles for all routes in the General Settings Admin Pages.
216
-     */
217
-    public function load_scripts_styles()
218
-    {
219
-        //styles
220
-        wp_enqueue_style('espresso-ui-theme');
221
-        //scripts
222
-        wp_enqueue_script('ee_admin_js');
223
-    }
224
-
225
-
226
-    /**
227
-     * Execute logic running on `admin_init`
228
-     */
229
-    public function admin_init()
230
-    {
231
-        EE_Registry::$i18n_js_strings['invalid_server_response'] = __(
232
-            'An error occurred! Your request may have been processed, but a valid response from the server was not received. Please refresh the page and try again.',
233
-            'event_espresso'
234
-        );
235
-        EE_Registry::$i18n_js_strings['error_occurred']          = __(
236
-            'An error occurred! Please refresh the page and try again.',
237
-            'event_espresso'
238
-        );
239
-        EE_Registry::$i18n_js_strings['confirm_delete_state']    = __(
240
-            'Are you sure you want to delete this State / Province?',
241
-            'event_espresso'
242
-        );
243
-        $protocol                                                = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
244
-        EE_Registry::$i18n_js_strings['ajax_url']                = admin_url(
245
-            'admin-ajax.php?page=espresso_general_settings',
246
-            $protocol
247
-        );
248
-    }
249
-
250
-    public function admin_notices()
251
-    {
252
-    }
253
-
254
-    public function admin_footer_scripts()
255
-    {
256
-    }
257
-
258
-
259
-    /**
260
-     * Enqueue scripts and styles for the default route.
261
-     */
262
-    public function load_scripts_styles_default()
263
-    {
264
-        //styles
265
-        wp_enqueue_style('thickbox');
266
-        //scripts
267
-        wp_enqueue_script('media-upload');
268
-        wp_enqueue_script('thickbox');
269
-        wp_register_script(
270
-            'organization_settings',
271
-            GEN_SET_ASSETS_URL . 'your_organization_settings.js',
272
-            array('jquery', 'media-upload', 'thickbox'),
273
-            EVENT_ESPRESSO_VERSION,
274
-            true
275
-        );
276
-        wp_register_style('organization-css', GEN_SET_ASSETS_URL . 'organization.css', array(), EVENT_ESPRESSO_VERSION);
277
-        wp_enqueue_script('organization_settings');
278
-        wp_enqueue_style('organization-css');
279
-        $confirm_image_delete = array(
280
-            'text' => __(
281
-                'Do you really want to delete this image? Please remember to save your settings to complete the removal.',
282
-                'event_espresso'
283
-            ),
284
-        );
285
-        wp_localize_script('organization_settings', 'confirm_image_delete', $confirm_image_delete);
286
-    }
287
-
288
-
289
-    /**
290
-     * Enqueue scripts and styles for the country settings route.
291
-     */
292
-    public function load_scripts_styles_country_settings()
293
-    {
294
-        //scripts
295
-        wp_register_script(
296
-            'gen_settings_countries',
297
-            GEN_SET_ASSETS_URL . 'gen_settings_countries.js',
298
-            array('ee_admin_js'),
299
-            EVENT_ESPRESSO_VERSION,
300
-            true
301
-        );
302
-        wp_register_style('organization-css', GEN_SET_ASSETS_URL . 'organization.css', array(), EVENT_ESPRESSO_VERSION);
303
-        wp_enqueue_script('gen_settings_countries');
304
-        wp_enqueue_style('organization-css');
305
-    }
306
-
307
-
308
-    /*************        Espresso Pages        *************/
309
-    /**
310
-     * _espresso_page_settings
311
-     *
312
-     * @throws \EE_Error
313
-     */
314
-    protected function _espresso_page_settings()
315
-    {
316
-        // Check to make sure all of the main pages are setup properly,
317
-        // if not create the default pages and display an admin notice
318
-        EEH_Activation::verify_default_pages_exist();
319
-        $this->_transient_garbage_collection();
320
-        $this->_template_args['values']             = $this->_yes_no_values;
321
-        $this->_template_args['reg_page_id']        = isset(EE_Registry::instance()->CFG->core->reg_page_id)
322
-            ? EE_Registry::instance()->CFG->core->reg_page_id
323
-            : null;
324
-        $this->_template_args['reg_page_obj']       = isset(EE_Registry::instance()->CFG->core->reg_page_id)
325
-            ? get_page(EE_Registry::instance()->CFG->core->reg_page_id)
326
-            : false;
327
-        $this->_template_args['txn_page_id']        = isset(EE_Registry::instance()->CFG->core->txn_page_id)
328
-            ? EE_Registry::instance()->CFG->core->txn_page_id
329
-            : null;
330
-        $this->_template_args['txn_page_obj']       = isset(EE_Registry::instance()->CFG->core->txn_page_id)
331
-            ? get_page(EE_Registry::instance()->CFG->core->txn_page_id)
332
-            : false;
333
-        $this->_template_args['thank_you_page_id']  = isset(EE_Registry::instance()->CFG->core->thank_you_page_id)
334
-            ? EE_Registry::instance()->CFG->core->thank_you_page_id
335
-            : null;
336
-        $this->_template_args['thank_you_page_obj'] = isset(EE_Registry::instance()->CFG->core->thank_you_page_id)
337
-            ? get_page(EE_Registry::instance()->CFG->core->thank_you_page_id)
338
-            : false;
339
-        $this->_template_args['cancel_page_id']     = isset(EE_Registry::instance()->CFG->core->cancel_page_id)
340
-            ? EE_Registry::instance()->CFG->core->cancel_page_id
341
-            : null;
342
-        $this->_template_args['cancel_page_obj']    = isset(EE_Registry::instance()->CFG->core->cancel_page_id)
343
-            ? get_page(EE_Registry::instance()->CFG->core->cancel_page_id)
344
-            : false;
345
-        $this->_set_add_edit_form_tags('update_espresso_page_settings');
346
-        $this->_set_publish_post_box_vars(null, false, false, null, false);
347
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
348
-            GEN_SET_TEMPLATE_PATH . 'espresso_page_settings.template.php',
349
-            $this->_template_args,
350
-            true
351
-        );
352
-        $this->display_admin_page_with_sidebar();
353
-    }
354
-
355
-
356
-    /**
357
-     * Handler for updating espresso page settings.
358
-     */
359
-    protected function _update_espresso_page_settings()
360
-    {
361
-        // capture incoming request data && set page IDs
362
-        EE_Registry::instance()->CFG->core->reg_page_id       = isset($this->_req_data['reg_page_id'])
363
-            ? absint($this->_req_data['reg_page_id'])
364
-            : EE_Registry::instance()->CFG->core->reg_page_id;
365
-        EE_Registry::instance()->CFG->core->txn_page_id       = isset($this->_req_data['txn_page_id'])
366
-            ? absint($this->_req_data['txn_page_id'])
367
-            : EE_Registry::instance()->CFG->core->txn_page_id;
368
-        EE_Registry::instance()->CFG->core->thank_you_page_id = isset($this->_req_data['thank_you_page_id'])
369
-            ? absint($this->_req_data['thank_you_page_id'])
370
-            : EE_Registry::instance()->CFG->core->thank_you_page_id;
371
-        EE_Registry::instance()->CFG->core->cancel_page_id    = isset($this->_req_data['cancel_page_id'])
372
-            ? absint($this->_req_data['cancel_page_id'])
373
-            : EE_Registry::instance()->CFG->core->cancel_page_id;
374
-
375
-        EE_Registry::instance()->CFG->core = apply_filters(
376
-            'FHEE__General_Settings_Admin_Page___update_espresso_page_settings__CFG_core',
377
-            EE_Registry::instance()->CFG->core,
378
-            $this->_req_data
379
-        );
380
-        $what                              = __('Critical Pages & Shortcodes', 'event_espresso');
381
-        $this->_redirect_after_action(
382
-            $this->_update_espresso_configuration(
383
-                $what,
384
-                EE_Registry::instance()->CFG->core,
385
-                __FILE__,
386
-                __FUNCTION__,
387
-                __LINE__
388
-            ),
389
-            $what,
390
-            '',
391
-            array(
392
-                'action' => 'critical_pages',
393
-            ),
394
-            true
395
-        );
396
-    }
397
-
398
-
399
-    /*************        Your Organization        *************/
400
-
401
-
402
-    /**
403
-     * Output for the Your Organization settings route.
404
-     * @throws DomainException
405
-     * @throws EE_Error
406
-     */
407
-    protected function _your_organization_settings()
408
-    {
409
-
410
-        $this->_template_args['site_license_key']       = isset(
411
-            EE_Registry::instance()->NET_CFG->core->site_license_key
412
-        )
413
-            ? EE_Registry::instance()->NET_CFG->core->get_pretty('site_license_key')
414
-            : '';
415
-        $this->_template_args['organization_name']      = isset(EE_Registry::instance()->CFG->organization->name)
416
-            ? EE_Registry::instance()->CFG->organization->get_pretty('name')
417
-            : '';
418
-        $this->_template_args['organization_address_1'] = isset(EE_Registry::instance()->CFG->organization->address_1)
419
-            ? EE_Registry::instance()->CFG->organization->get_pretty('address_1')
420
-            : '';
421
-        $this->_template_args['organization_address_2'] = isset(EE_Registry::instance()->CFG->organization->address_2)
422
-            ? EE_Registry::instance()->CFG->organization->get_pretty('address_2')
423
-            : '';
424
-        $this->_template_args['organization_city']      = isset(EE_Registry::instance()->CFG->organization->city)
425
-            ? EE_Registry::instance()->CFG->organization->get_pretty('city')
426
-            : '';
427
-        $this->_template_args['organization_zip']       = isset(EE_Registry::instance()->CFG->organization->zip)
428
-            ? EE_Registry::instance()->CFG->organization->get_pretty('zip')
429
-            : '';
430
-        $this->_template_args['organization_email']     = isset(EE_Registry::instance()->CFG->organization->email)
431
-            ? EE_Registry::instance()->CFG->organization->get_pretty('email')
432
-            : '';
433
-        $this->_template_args['organization_phone']     = isset(EE_Registry::instance()->CFG->organization->phone)
434
-            ? EE_Registry::instance()->CFG->organization->get_pretty('phone')
435
-            : '';
436
-        $this->_template_args['organization_vat']       = isset(EE_Registry::instance()->CFG->organization->vat)
437
-            ? EE_Registry::instance()->CFG->organization->get_pretty('vat')
438
-            : '';
439
-        $this->_template_args['currency_sign']          = isset(EE_Registry::instance()->CFG->currency->sign)
440
-            ? EE_Registry::instance()->CFG->currency->get_pretty('sign')
441
-            : '$';
442
-        $this->_template_args['organization_logo_url']  = isset(EE_Registry::instance()->CFG->organization->logo_url)
443
-            ? EE_Registry::instance()->CFG->organization->get_pretty('logo_url')
444
-            : false;
445
-        $this->_template_args['organization_facebook']  = isset(EE_Registry::instance()->CFG->organization->facebook)
446
-            ? EE_Registry::instance()->CFG->organization->get_pretty('facebook')
447
-            : '';
448
-        $this->_template_args['organization_twitter']   = isset(EE_Registry::instance()->CFG->organization->twitter)
449
-            ? EE_Registry::instance()->CFG->organization->get_pretty('twitter')
450
-            : '';
451
-        $this->_template_args['organization_linkedin']  = isset(EE_Registry::instance()->CFG->organization->linkedin)
452
-            ? EE_Registry::instance()->CFG->organization->get_pretty('linkedin')
453
-            : '';
454
-        $this->_template_args['organization_pinterest'] = isset(EE_Registry::instance()->CFG->organization->pinterest)
455
-            ? EE_Registry::instance()->CFG->organization->get_pretty('pinterest')
456
-            : '';
457
-        $this->_template_args['organization_google']    = isset(EE_Registry::instance()->CFG->organization->google)
458
-            ? EE_Registry::instance()->CFG->organization->get_pretty('google')
459
-            : '';
460
-        $this->_template_args['organization_instagram'] = isset(EE_Registry::instance()->CFG->organization->instagram)
461
-            ? EE_Registry::instance()->CFG->organization->get_pretty('instagram')
462
-            : '';
463
-        //UXIP settings
464
-        $this->_template_args['ee_ueip_optin'] = isset(EE_Registry::instance()->CFG->core->ee_ueip_optin)
465
-            ? EE_Registry::instance()->CFG->core->get_pretty('ee_ueip_optin')
466
-            : true;
467
-
468
-        $STA_ID                         = isset(EE_Registry::instance()->CFG->organization->STA_ID)
469
-            ? EE_Registry::instance()->CFG->organization->STA_ID
470
-            : 4;
471
-        $this->_template_args['states'] = new EE_Question_Form_Input(
472
-            EE_Question::new_instance(array(
473
-                'QST_ID'           => 0,
474
-                'QST_display_text' => __('State/Province', 'event_espresso'),
475
-                'QST_system'       => 'admin-state',
476
-            )),
477
-            EE_Answer::new_instance(array(
478
-                'ANS_ID'    => 0,
479
-                'ANS_value' => $STA_ID,
480
-            )),
481
-            array(
482
-                'input_id'       => 'organization_state',
483
-                'input_name'     => 'organization_state',
484
-                'input_prefix'   => '',
485
-                'append_qstn_id' => false,
486
-            )
487
-        );
488
-
489
-        $CNT_ISO                           = isset(EE_Registry::instance()->CFG->organization->CNT_ISO)
490
-            ? EE_Registry::instance()->CFG->organization->CNT_ISO
491
-            : 'US';
492
-        $this->_template_args['countries'] = new EE_Question_Form_Input(
493
-            EE_Question::new_instance(array(
494
-                'QST_ID'           => 0,
495
-                'QST_display_text' => __('Country', 'event_espresso'),
496
-                'QST_system'       => 'admin-country',
497
-            )),
498
-            EE_Answer::new_instance(array(
499
-                'ANS_ID'    => 0,
500
-                'ANS_value' => $CNT_ISO,
501
-            )),
502
-            array(
503
-                'input_id'       => 'organization_country',
504
-                'input_name'     => 'organization_country',
505
-                'input_prefix'   => '',
506
-                'append_qstn_id' => false,
507
-            )
508
-        );
509
-
510
-        add_filter('FHEE__EEH_Form_Fields__label_html', array($this, 'country_form_field_label_wrap'), 10, 2);
511
-        add_filter('FHEE__EEH_Form_Fields__input_html', array($this, 'country_form_field_input__wrap'), 10, 2);
512
-
513
-        //PUE verification stuff
514
-        $ver_option_key                                    = 'puvererr_' . basename(EE_PLUGIN_BASENAME);
515
-        $verify_fail                                       = get_option($ver_option_key);
516
-        $this->_template_args['site_license_key_verified'] = $verify_fail
517
-                                                             || ! empty($verify_fail)
518
-                                                             || (empty($this->_template_args['site_license_key'])
519
-                                                                 && empty($verify_fail)
520
-                                                             )
521
-            ? '<span class="dashicons dashicons-admin-network ee-icon-color-ee-red ee-icon-size-20"></span>'
522
-            : '<span class="dashicons dashicons-admin-network ee-icon-color-ee-green ee-icon-size-20"></span>';
523
-
524
-        $this->_set_add_edit_form_tags('update_your_organization_settings');
525
-        $this->_set_publish_post_box_vars(null, false, false, null, false);
526
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
527
-            GEN_SET_TEMPLATE_PATH . 'your_organization_settings.template.php',
528
-            $this->_template_args,
529
-            true
530
-        );
531
-
532
-        $this->display_admin_page_with_sidebar();
533
-    }
534
-
535
-
536
-    /**
537
-     * Handler for updating organziation settings.
538
-     */
539
-    protected function _update_your_organization_settings()
540
-    {
541
-        if (is_main_site()) {
542
-            EE_Registry::instance()->NET_CFG->core->site_license_key = isset($this->_req_data['site_license_key'])
543
-                ? sanitize_text_field($this->_req_data['site_license_key'])
544
-                : EE_Registry::instance()->NET_CFG->core->site_license_key;
545
-        }
546
-        EE_Registry::instance()->CFG->organization->name      = isset($this->_req_data['organization_name'])
547
-            ? sanitize_text_field($this->_req_data['organization_name'])
548
-            : EE_Registry::instance()->CFG->organization->name;
549
-        EE_Registry::instance()->CFG->organization->address_1 = isset($this->_req_data['organization_address_1'])
550
-            ? sanitize_text_field($this->_req_data['organization_address_1'])
551
-            : EE_Registry::instance()->CFG->organization->address_1;
552
-        EE_Registry::instance()->CFG->organization->address_2 = isset($this->_req_data['organization_address_2'])
553
-            ? sanitize_text_field($this->_req_data['organization_address_2'])
554
-            : EE_Registry::instance()->CFG->organization->address_2;
555
-        EE_Registry::instance()->CFG->organization->city      = isset($this->_req_data['organization_city'])
556
-            ? sanitize_text_field($this->_req_data['organization_city'])
557
-            : EE_Registry::instance()->CFG->organization->city;
558
-        EE_Registry::instance()->CFG->organization->STA_ID    = isset($this->_req_data['organization_state'])
559
-            ? absint($this->_req_data['organization_state'])
560
-            : EE_Registry::instance()->CFG->organization->STA_ID;
561
-        EE_Registry::instance()->CFG->organization->CNT_ISO   = isset($this->_req_data['organization_country'])
562
-            ? sanitize_text_field($this->_req_data['organization_country'])
563
-            : EE_Registry::instance()->CFG->organization->CNT_ISO;
564
-        EE_Registry::instance()->CFG->organization->zip       = isset($this->_req_data['organization_zip'])
565
-            ? sanitize_text_field($this->_req_data['organization_zip'])
566
-            : EE_Registry::instance()->CFG->organization->zip;
567
-        EE_Registry::instance()->CFG->organization->email     = isset($this->_req_data['organization_email'])
568
-            ? sanitize_email($this->_req_data['organization_email'])
569
-            : EE_Registry::instance()->CFG->organization->email;
570
-        EE_Registry::instance()->CFG->organization->vat       = isset($this->_req_data['organization_vat'])
571
-            ? sanitize_text_field($this->_req_data['organization_vat'])
572
-            : EE_Registry::instance()->CFG->organization->vat;
573
-        EE_Registry::instance()->CFG->organization->phone     = isset($this->_req_data['organization_phone'])
574
-            ? sanitize_text_field($this->_req_data['organization_phone'])
575
-            : EE_Registry::instance()->CFG->organization->phone;
576
-        EE_Registry::instance()->CFG->organization->logo_url  = isset($this->_req_data['organization_logo_url'])
577
-            ? esc_url_raw($this->_req_data['organization_logo_url'])
578
-            : EE_Registry::instance()->CFG->organization->logo_url;
579
-        EE_Registry::instance()->CFG->organization->facebook  = isset($this->_req_data['organization_facebook'])
580
-            ? esc_url_raw($this->_req_data['organization_facebook'])
581
-            : EE_Registry::instance()->CFG->organization->facebook;
582
-        EE_Registry::instance()->CFG->organization->twitter   = isset($this->_req_data['organization_twitter'])
583
-            ? esc_url_raw($this->_req_data['organization_twitter'])
584
-            : EE_Registry::instance()->CFG->organization->twitter;
585
-        EE_Registry::instance()->CFG->organization->linkedin  = isset($this->_req_data['organization_linkedin'])
586
-            ? esc_url_raw($this->_req_data['organization_linkedin'])
587
-            : EE_Registry::instance()->CFG->organization->linkedin;
588
-        EE_Registry::instance()->CFG->organization->pinterest = isset($this->_req_data['organization_pinterest'])
589
-            ? esc_url_raw($this->_req_data['organization_pinterest'])
590
-            : EE_Registry::instance()->CFG->organization->pinterest;
591
-        EE_Registry::instance()->CFG->organization->google    = isset($this->_req_data['organization_google'])
592
-            ? esc_url_raw($this->_req_data['organization_google'])
593
-            : EE_Registry::instance()->CFG->organization->google;
594
-        EE_Registry::instance()->CFG->organization->instagram = isset($this->_req_data['organization_instagram'])
595
-            ? esc_url_raw($this->_req_data['organization_instagram'])
596
-            : EE_Registry::instance()->CFG->organization->instagram;
597
-        EE_Registry::instance()->CFG->core->ee_ueip_optin     = isset($this->_req_data['ueip_optin'])
598
-                                                                && ! empty($this->_req_data['ueip_optin'])
599
-            ? $this->_req_data['ueip_optin']
600
-            : EE_Registry::instance()->CFG->core->ee_ueip_optin;
601
-
602
-        EE_Registry::instance()->CFG->currency = new EE_Currency_Config(
603
-            EE_Registry::instance()->CFG->organization->CNT_ISO
604
-        );
605
-
606
-        EE_Registry::instance()->CFG = apply_filters(
607
-            'FHEE__General_Settings_Admin_Page___update_your_organization_settings__CFG',
608
-            EE_Registry::instance()->CFG
609
-        );
610
-
611
-        $what    = 'Your Organization Settings';
612
-        $success = $this->_update_espresso_configuration(
613
-            $what,
614
-            EE_Registry::instance()->CFG,
615
-            __FILE__,
616
-            __FUNCTION__,
617
-            __LINE__
618
-        );
619
-
620
-        $this->_redirect_after_action($success, $what, 'updated', array('action' => 'default'));
621
-    }
622
-
623
-
624
-
625
-    /*************        Admin Options        *************/
626
-
627
-
628
-    /**
629
-     * _admin_option_settings
630
-     *
631
-     * @throws \EE_Error
632
-     * @throws \LogicException
633
-     */
634
-    protected function _admin_option_settings()
635
-    {
636
-        $this->_template_args['admin_page_content'] = '';
637
-        try {
638
-            $admin_options_settings_form = new AdminOptionsSettings(EE_Registry::instance());
639
-            // still need this for the old school form in Extend_General_Settings_Admin_Page
640
-            $this->_template_args['values'] = $this->_yes_no_values;
641
-            // also need to account for the do_action that was in the old template
642
-            $admin_options_settings_form->setTemplateArgs($this->_template_args);
643
-            $this->_template_args['admin_page_content'] = $admin_options_settings_form->display();
644
-        } catch (Exception $e) {
645
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
646
-        }
647
-        $this->_set_add_edit_form_tags('update_admin_option_settings');
648
-        $this->_set_publish_post_box_vars(null, false, false, null, false);
649
-        $this->display_admin_page_with_sidebar();
650
-    }
651
-
652
-
653
-    /**
654
-     * _update_admin_option_settings
655
-     *
656
-     * @throws \EE_Error
657
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
658
-     * @throws \EventEspresso\core\exceptions\InvalidFormSubmissionException
659
-     * @throws \InvalidArgumentException
660
-     * @throws \LogicException
661
-     */
662
-    protected function _update_admin_option_settings()
663
-    {
664
-        try {
665
-            $admin_options_settings_form = new AdminOptionsSettings(EE_Registry::instance());
666
-            $admin_options_settings_form->process($this->_req_data[$admin_options_settings_form->slug()]);
667
-            EE_Registry::instance()->CFG->admin = apply_filters(
668
-                'FHEE__General_Settings_Admin_Page___update_admin_option_settings__CFG_admin',
669
-                EE_Registry::instance()->CFG->admin
670
-            );
671
-        } catch (Exception $e) {
672
-            EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
673
-        }
674
-        $this->_redirect_after_action(
675
-            apply_filters(
676
-                'FHEE__General_Settings_Admin_Page___update_admin_option_settings__success',
677
-                $this->_update_espresso_configuration(
678
-                    'Admin Options',
679
-                    EE_Registry::instance()->CFG->admin,
680
-                    __FILE__, __FUNCTION__, __LINE__
681
-                )
682
-            ),
683
-            'Admin Options',
684
-            'updated',
685
-            array('action' => 'admin_option_settings')
686
-        );
687
-
688
-    }
689
-
690
-
691
-    /*************        Countries        *************/
692
-
693
-
694
-    /**
695
-     * Output Country Settings view.
696
-     * @throws DomainException
697
-     * @throws EE_Error
698
-     */
699
-    protected function _country_settings()
700
-    {
701
-        $CNT_ISO = isset(EE_Registry::instance()->CFG->organization->CNT_ISO)
702
-            ? EE_Registry::instance()->CFG->organization->CNT_ISO
703
-            : 'US';
704
-        $CNT_ISO = isset($this->_req_data['country'])
705
-            ? strtoupper(sanitize_text_field($this->_req_data['country']))
706
-            : $CNT_ISO;
707
-
708
-        //load field generator helper
709
-
710
-        $this->_template_args['values'] = $this->_yes_no_values;
711
-
712
-        $this->_template_args['countries'] = new EE_Question_Form_Input(
713
-            EE_Question::new_instance(array(
714
-                'QST_ID'           => 0,
715
-                'QST_display_text' => __('Select Country', 'event_espresso'),
716
-                'QST_system'       => 'admin-country',
717
-            )),
718
-            EE_Answer::new_instance(array(
719
-                'ANS_ID'    => 0,
720
-                'ANS_value' => $CNT_ISO,
721
-            )),
722
-            array(
723
-                'input_id'       => 'country',
724
-                'input_name'     => 'country',
725
-                'input_prefix'   => '',
726
-                'append_qstn_id' => false,
727
-            )
728
-        );
729
-
730
-        add_filter('FHEE__EEH_Form_Fields__label_html', array($this, 'country_form_field_label_wrap'), 10, 2);
731
-        add_filter('FHEE__EEH_Form_Fields__input_html', array($this, 'country_form_field_input__wrap'), 10, 2);
732
-        $this->_template_args['country_details_settings'] = $this->display_country_settings();
733
-        $this->_template_args['country_states_settings']  = $this->display_country_states();
734
-
735
-        $this->_set_add_edit_form_tags('update_country_settings');
736
-        $this->_set_publish_post_box_vars(null, false, false, null, false);
737
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
738
-            GEN_SET_TEMPLATE_PATH . 'countries_settings.template.php',
739
-            $this->_template_args,
740
-            true
741
-        );
742
-        $this->display_admin_page_with_no_sidebar();
743
-    }
744
-
745
-
746
-    /**
747
-     *        display_country_settings
748
-     *
749
-     * @access    public
750
-     * @param    string $CNT_ISO
751
-     * @return mixed string | array
752
-     * @throws DomainException
753
-     */
754
-    public function display_country_settings($CNT_ISO = '')
755
-    {
756
-
757
-        $CNT_ISO = isset($this->_req_data['country'])
758
-            ? strtoupper(sanitize_text_field($this->_req_data['country']))
759
-            : $CNT_ISO;
760
-        if (! $CNT_ISO) {
761
-            return '';
762
-        }
763
-
764
-        // for ajax
765
-        remove_all_filters('FHEE__EEH_Form_Fields__label_html');
766
-        remove_all_filters('FHEE__EEH_Form_Fields__input_html');
767
-        add_filter('FHEE__EEH_Form_Fields__label_html', array($this, 'country_form_field_label_wrap'), 10, 2);
768
-        add_filter('FHEE__EEH_Form_Fields__input_html', array($this, 'country_form_field_input__wrap'), 10, 2);
769
-        $country = EEM_Country::instance()->get_one_by_ID($CNT_ISO);
770
-
771
-        $country_input_types            = array(
772
-            'CNT_active'      => array(
773
-                'type'             => 'RADIO_BTN',
774
-                'input_name'       => 'cntry[' . $CNT_ISO . ']',
775
-                'class'            => '',
776
-                'options'          => $this->_yes_no_values,
777
-                'use_desc_4_label' => true,
778
-            ),
779
-            'CNT_ISO'         => array(
780
-                'type'       => 'TEXT',
781
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
782
-                'class'      => 'small-text',
783
-            ),
784
-            'CNT_ISO3'        => array(
785
-                'type'       => 'TEXT',
786
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
787
-                'class'      => 'small-text',
788
-            ),
789
-            'RGN_ID'          => array(
790
-                'type'       => 'TEXT',
791
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
792
-                'class'      => 'small-text',
793
-            ),
794
-            'CNT_name'        => array(
795
-                'type'       => 'TEXT',
796
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
797
-                'class'      => 'regular-text',
798
-            ),
799
-            'CNT_cur_code'    => array(
800
-                'type'       => 'TEXT',
801
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
802
-                'class'      => 'small-text',
803
-            ),
804
-            'CNT_cur_single'  => array(
805
-                'type'       => 'TEXT',
806
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
807
-                'class'      => 'medium-text',
808
-            ),
809
-            'CNT_cur_plural'  => array(
810
-                'type'       => 'TEXT',
811
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
812
-                'class'      => 'medium-text',
813
-            ),
814
-            'CNT_cur_sign'    => array(
815
-                'type'         => 'TEXT',
816
-                'input_name'   => 'cntry[' . $CNT_ISO . ']',
817
-                'class'        => 'small-text',
818
-                'htmlentities' => false,
819
-            ),
820
-            'CNT_cur_sign_b4' => array(
821
-                'type'             => 'RADIO_BTN',
822
-                'input_name'       => 'cntry[' . $CNT_ISO . ']',
823
-                'class'            => '',
824
-                'options'          => $this->_yes_no_values,
825
-                'use_desc_4_label' => true,
826
-            ),
827
-            'CNT_cur_dec_plc' => array(
828
-                'type'       => 'RADIO_BTN',
829
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
830
-                'class'      => '',
831
-                'options'    => array(
832
-                    array('id' => 0, 'text' => ''),
833
-                    array('id' => 1, 'text' => ''),
834
-                    array('id' => 2, 'text' => ''),
835
-                    array('id' => 3, 'text' => ''),
836
-                ),
837
-            ),
838
-            'CNT_cur_dec_mrk' => array(
839
-                'type'             => 'RADIO_BTN',
840
-                'input_name'       => 'cntry[' . $CNT_ISO . ']',
841
-                'class'            => '',
842
-                'options'          => array(
843
-                    array(
844
-                        'id'   => ',',
845
-                        'text' => __(', (comma)', 'event_espresso'),
846
-                    ),
847
-                    array('id' => '.', 'text' => __('. (decimal)', 'event_espresso')),
848
-                ),
849
-                'use_desc_4_label' => true,
850
-            ),
851
-            'CNT_cur_thsnds'  => array(
852
-                'type'             => 'RADIO_BTN',
853
-                'input_name'       => 'cntry[' . $CNT_ISO . ']',
854
-                'class'            => '',
855
-                'options'          => array(
856
-                    array(
857
-                        'id'   => ',',
858
-                        'text' => __(', (comma)', 'event_espresso'),
859
-                    ),
860
-                    array('id' => '.', 'text' => __('. (decimal)', 'event_espresso')),
861
-                ),
862
-                'use_desc_4_label' => true,
863
-            ),
864
-            'CNT_tel_code'    => array(
865
-                'type'       => 'TEXT',
866
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
867
-                'class'      => 'small-text',
868
-            ),
869
-            'CNT_is_EU'       => array(
870
-                'type'             => 'RADIO_BTN',
871
-                'input_name'       => 'cntry[' . $CNT_ISO . ']',
872
-                'class'            => '',
873
-                'options'          => $this->_yes_no_values,
874
-                'use_desc_4_label' => true,
875
-            ),
876
-        );
877
-        $this->_template_args['inputs'] = EE_Question_Form_Input::generate_question_form_inputs_for_object(
878
-            $country,
879
-            $country_input_types
880
-        );
881
-        $country_details_settings       = EEH_Template::display_template(
882
-            GEN_SET_TEMPLATE_PATH . 'country_details_settings.template.php',
883
-            $this->_template_args,
884
-            true
885
-        );
886
-
887
-        if (defined('DOING_AJAX')) {
888
-            $notices = EE_Error::get_notices(false, false, false);
889
-            echo wp_json_encode(array(
890
-                'return_data' => $country_details_settings,
891
-                'success'     => $notices['success'],
892
-                'errors'      => $notices['errors'],
893
-            ));
894
-            die();
895
-        } else {
896
-            return $country_details_settings;
897
-        }
898
-    }
899
-
900
-
901
-    /**
902
-     *        display_country_states
903
-     *
904
-     * @access    public
905
-     * @param    string $CNT_ISO
906
-     * @return string
907
-     * @throws DomainException
908
-     */
909
-    public function display_country_states($CNT_ISO = '')
910
-    {
911
-
912
-        $CNT_ISO = isset($this->_req_data['country']) ? sanitize_text_field($this->_req_data['country']) : $CNT_ISO;
913
-
914
-        if (! $CNT_ISO) {
915
-            return '';
916
-        }
917
-        // for ajax
918
-        remove_all_filters('FHEE__EEH_Form_Fields__label_html');
919
-        remove_all_filters('FHEE__EEH_Form_Fields__input_html');
920
-        add_filter('FHEE__EEH_Form_Fields__label_html', array($this, 'state_form_field_label_wrap'), 10, 2);
921
-        add_filter('FHEE__EEH_Form_Fields__input_html', array($this, 'state_form_field_input__wrap'), 10, 2);
922
-        $states = EEM_State::instance()->get_all_states_for_these_countries(array($CNT_ISO => $CNT_ISO));
923
-
924
-        if ($states) {
925
-            foreach ($states as $STA_ID => $state) {
926
-                if ($state instanceof EE_State) {
927
-                    //STA_abbrev 	STA_name 	STA_active
928
-                    $state_input_types                                           = array(
929
-                        'STA_abbrev' => array(
930
-                            'type'       => 'TEXT',
931
-                            'input_name' => 'states[' . $STA_ID . ']',
932
-                            'class'      => 'mid-text',
933
-                        ),
934
-                        'STA_name'   => array(
935
-                            'type'       => 'TEXT',
936
-                            'input_name' => 'states[' . $STA_ID . ']',
937
-                            'class'      => 'regular-text',
938
-                        ),
939
-                        'STA_active' => array(
940
-                            'type'             => 'RADIO_BTN',
941
-                            'input_name'       => 'states[' . $STA_ID . ']',
942
-                            'options'          => $this->_yes_no_values,
943
-                            'use_desc_4_label' => true,
944
-                        ),
945
-                    );
946
-                    $this->_template_args['states'][$STA_ID]['inputs'] =
947
-                        EE_Question_Form_Input::generate_question_form_inputs_for_object(
948
-                            $state,
949
-                            $state_input_types
950
-                        );
951
-                    $query_args                                                  = array(
952
-                        'action'     => 'delete_state',
953
-                        'STA_ID'     => $STA_ID,
954
-                        'CNT_ISO'    => $CNT_ISO,
955
-                        'STA_abbrev' => $state->abbrev(),
956
-                    );
957
-                    $this->_template_args['states'][$STA_ID]['delete_state_url'] =
958
-                        EE_Admin_Page::add_query_args_and_nonce(
959
-                            $query_args,
960
-                            GEN_SET_ADMIN_URL
961
-                        );
962
-                }
963
-            }
964
-        } else {
965
-            $this->_template_args['states'] = false;
966
-        }
967
-
968
-        $this->_template_args['add_new_state_url'] = EE_Admin_Page::add_query_args_and_nonce(
969
-            array('action' => 'add_new_state'),
970
-            GEN_SET_ADMIN_URL
971
-        );
972
-
973
-        $state_details_settings = EEH_Template::display_template(
974
-            GEN_SET_TEMPLATE_PATH . 'state_details_settings.template.php',
975
-            $this->_template_args,
976
-            true
977
-        );
978
-
979
-        if (defined('DOING_AJAX')) {
980
-            $notices = EE_Error::get_notices(false, false, false);
981
-            echo wp_json_encode(array(
982
-                'return_data' => $state_details_settings,
983
-                'success'     => $notices['success'],
984
-                'errors'      => $notices['errors'],
985
-            ));
986
-            die();
987
-        } else {
988
-            return $state_details_settings;
989
-        }
990
-    }
991
-
992
-
993
-    /**
994
-     *        add_new_state
995
-     *
996
-     * @access    public
997
-     * @return void
998
-     * @throws EE_Error
999
-     */
1000
-    public function add_new_state()
1001
-    {
1002
-
1003
-        $success = true;
1004
-
1005
-        $CNT_ISO = isset($this->_req_data['CNT_ISO'])
1006
-            ? strtoupper(sanitize_text_field($this->_req_data['CNT_ISO']))
1007
-            : false;
1008
-        if (! $CNT_ISO) {
1009
-            EE_Error::add_error(
1010
-                __('No Country ISO code or an invalid Country ISO code was received.', 'event_espresso'),
1011
-                __FILE__,
1012
-                __FUNCTION__,
1013
-                __LINE__
1014
-            );
1015
-            $success = false;
1016
-        }
1017
-        $STA_abbrev = isset($this->_req_data['STA_abbrev'])
1018
-            ? sanitize_text_field($this->_req_data['STA_abbrev'])
1019
-            : false;
1020
-        if (! $STA_abbrev) {
1021
-            EE_Error::add_error(
1022
-                __('No State ISO code or an invalid State ISO code was received.', 'event_espresso'),
1023
-                __FILE__,
1024
-                __FUNCTION__,
1025
-                __LINE__
1026
-            );
1027
-            $success = false;
1028
-        }
1029
-        $STA_name = isset($this->_req_data['STA_name'])
1030
-            ? sanitize_text_field($this->_req_data['STA_name'])
1031
-            : false;
1032
-        if (! $STA_name) {
1033
-            EE_Error::add_error(
1034
-                __('No State name or an invalid State name was received.', 'event_espresso'),
1035
-                __FILE__,
1036
-                __FUNCTION__,
1037
-                __LINE__
1038
-            );
1039
-            $success = false;
1040
-        }
1041
-
1042
-        if ($success) {
1043
-            $cols_n_values = array(
1044
-                'CNT_ISO'    => $CNT_ISO,
1045
-                'STA_abbrev' => $STA_abbrev,
1046
-                'STA_name'   => $STA_name,
1047
-                'STA_active' => true,
1048
-            );
1049
-            $success       = EEM_State::instance()->insert($cols_n_values);
1050
-            EE_Error::add_success(__('The State was added successfully.', 'event_espresso'));
1051
-        }
1052
-
1053
-        if (defined('DOING_AJAX')) {
1054
-            $notices = EE_Error::get_notices(false, false, false);
1055
-            echo wp_json_encode(array_merge($notices, array('return_data' => $CNT_ISO)));
1056
-            die();
1057
-        } else {
1058
-            $this->_redirect_after_action($success, 'State', 'added', array('action' => 'country_settings'));
1059
-        }
1060
-    }
1061
-
1062
-
1063
-    /**
1064
-     *        delete_state
1065
-     *
1066
-     * @access    public
1067
-     * @return        boolean
1068
-     */
1069
-    public function delete_state()
1070
-    {
1071
-        $CNT_ISO    = isset($this->_req_data['CNT_ISO'])
1072
-            ? strtoupper(sanitize_text_field($this->_req_data['CNT_ISO']))
1073
-            : false;
1074
-        $STA_ID     = isset($this->_req_data['STA_ID'])
1075
-            ? sanitize_text_field($this->_req_data['STA_ID'])
1076
-            : false;
1077
-        $STA_abbrev = isset($this->_req_data['STA_abbrev'])
1078
-            ? sanitize_text_field($this->_req_data['STA_abbrev'])
1079
-            : false;
1080
-        if (! $STA_ID) {
1081
-            EE_Error::add_error(
1082
-                __('No State ID or an invalid State ID was received.', 'event_espresso'),
1083
-                __FILE__,
1084
-                __FUNCTION__,
1085
-                __LINE__
1086
-            );
1087
-            return false;
1088
-        }
1089
-
1090
-        $success = EEM_State::instance()->delete_by_ID($STA_ID);
1091
-        if ($success !== false) {
1092
-            do_action(
1093
-                'AHEE__General_Settings_Admin_Page__delete_state__state_deleted',
1094
-                $CNT_ISO,
1095
-                $STA_ID,
1096
-                array('STA_abbrev' => $STA_abbrev)
1097
-            );
1098
-            EE_Error::add_success(__('The State was deleted successfully.', 'event_espresso'));
1099
-        }
1100
-        if (defined('DOING_AJAX')) {
1101
-            $notices                = EE_Error::get_notices(false, false);
1102
-            $notices['return_data'] = true;
1103
-            echo wp_json_encode($notices);
1104
-            die();
1105
-        } else {
1106
-            $this->_redirect_after_action(
1107
-                $success,
1108
-                'State',
1109
-                'deleted',
1110
-                array('action' => 'country_settings')
1111
-            );
1112
-        }
1113
-    }
1114
-
1115
-
1116
-    /**
1117
-     *        _update_country_settings
1118
-     *
1119
-     * @access    protected
1120
-     * @return void
1121
-     * @throws EE_Error
1122
-     */
1123
-    protected function _update_country_settings()
1124
-    {
1125
-        // grab the country ISO code
1126
-        $CNT_ISO = isset($this->_req_data['country'])
1127
-            ? strtoupper(sanitize_text_field($this->_req_data['country']))
1128
-            : false;
1129
-        if (! $CNT_ISO) {
1130
-            EE_Error::add_error(
1131
-                __('No Country ISO code or an invalid Country ISO code was received.', 'event_espresso'),
1132
-                __FILE__,
1133
-                __FUNCTION__,
1134
-                __LINE__
1135
-            );
1136
-
1137
-            return;
1138
-        }
1139
-        $cols_n_values                    = array();
1140
-        $cols_n_values['CNT_ISO3']        = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_ISO3'])
1141
-            ? strtoupper(sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_ISO3']))
1142
-            : false;
1143
-        $cols_n_values['RGN_ID']          = isset($this->_req_data['cntry'][$CNT_ISO]['RGN_ID'])
1144
-            ? absint($this->_req_data['cntry'][$CNT_ISO]['RGN_ID'])
1145
-            : null;
1146
-        $cols_n_values['CNT_name']        = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_name'])
1147
-            ? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_name'])
1148
-            : null;
1149
-        $cols_n_values['CNT_cur_code']    = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_code'])
1150
-            ? strtoupper(sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_code']))
1151
-            : 'USD';
1152
-        $cols_n_values['CNT_cur_single']  = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_single'])
1153
-            ? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_single'])
1154
-            : 'dollar';
1155
-        $cols_n_values['CNT_cur_plural']  = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_plural'])
1156
-            ? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_plural'])
1157
-            : 'dollars';
1158
-        $cols_n_values['CNT_cur_sign']    = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_sign'])
1159
-            ? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_sign'])
1160
-            : '$';
1161
-        $cols_n_values['CNT_cur_sign_b4'] = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_sign_b4'])
1162
-            ? absint($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_sign_b4'])
1163
-            : true;
1164
-        $cols_n_values['CNT_cur_dec_plc'] = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_dec_plc'])
1165
-            ? absint($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_dec_plc'])
1166
-            : 2;
1167
-        $cols_n_values['CNT_cur_dec_mrk'] = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_dec_mrk'])
1168
-            ? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_dec_mrk'])
1169
-            : '.';
1170
-        $cols_n_values['CNT_cur_thsnds']  = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_thsnds'])
1171
-            ? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_thsnds'])
1172
-            : ',';
1173
-        $cols_n_values['CNT_tel_code']    = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_tel_code'])
1174
-            ? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_tel_code'])
1175
-            : null;
1176
-        $cols_n_values['CNT_is_EU']       = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_is_EU'])
1177
-            ? absint($this->_req_data['cntry'][$CNT_ISO]['CNT_is_EU'])
1178
-            : false;
1179
-        $cols_n_values['CNT_active']      = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_active'])
1180
-            ? absint($this->_req_data['cntry'][$CNT_ISO]['CNT_active'])
1181
-            : false;
1182
-        // allow filtering of country data
1183
-        $cols_n_values = apply_filters(
1184
-            'FHEE__General_Settings_Admin_Page___update_country_settings__cols_n_values',
1185
-            $cols_n_values
1186
-        );
1187
-
1188
-        // where values
1189
-        $where_cols_n_values = array(array('CNT_ISO' => $CNT_ISO));
1190
-        // run the update
1191
-        $success = EEM_Country::instance()->update($cols_n_values, $where_cols_n_values);
1192
-
1193
-        if (isset($this->_req_data['states']) && is_array($this->_req_data['states']) && $success !== false) {
1194
-            // allow filtering of states data
1195
-            $states = apply_filters(
1196
-                'FHEE__General_Settings_Admin_Page___update_country_settings__states',
1197
-                $this->_req_data['states']
1198
-            );
1199
-
1200
-            // loop thru state data ( looks like : states[75][STA_name] )
1201
-            foreach ($states as $STA_ID => $state) {
1202
-                $cols_n_values = array(
1203
-                    'CNT_ISO'    => $CNT_ISO,
1204
-                    'STA_abbrev' => sanitize_text_field($state['STA_abbrev']),
1205
-                    'STA_name'   => sanitize_text_field($state['STA_name']),
1206
-                    'STA_active' => (bool)absint($state['STA_active']),
1207
-                );
1208
-                // where values
1209
-                $where_cols_n_values = array(array('STA_ID' => $STA_ID));
1210
-                // run the update
1211
-                $success = EEM_State::instance()->update($cols_n_values, $where_cols_n_values);
1212
-                if ($success !== false) {
1213
-                    do_action(
1214
-                        'AHEE__General_Settings_Admin_Page__update_country_settings__state_saved',
1215
-                        $CNT_ISO,
1216
-                        $STA_ID,
1217
-                        $cols_n_values
1218
-                    );
1219
-                }
1220
-            }
1221
-        }
1222
-        // check if country being edited matches org option country, and if so, then  update EE_Config with new settings
1223
-        if (isset(EE_Registry::instance()->CFG->organization->CNT_ISO)
1224
-            && $CNT_ISO == EE_Registry::instance()->CFG->organization->CNT_ISO
1225
-        ) {
1226
-            EE_Registry::instance()->CFG->currency = new EE_Currency_Config($CNT_ISO);
1227
-            EE_Registry::instance()->CFG->update_espresso_config();
1228
-        }
1229
-
1230
-        if ($success !== false) {
1231
-            EE_Error::add_success(
1232
-                esc_html__('Country Settings updated successfully.', 'event_espresso')
1233
-            );
1234
-        }
1235
-        $this->_redirect_after_action(
1236
-            $success,
1237
-            '',
1238
-            '',
1239
-            array('action' => 'country_settings', 'country' => $CNT_ISO),
1240
-            true
1241
-        );
1242
-    }
1243
-
1244
-
1245
-    /**
1246
-     *        form_form_field_label_wrap
1247
-     *
1248
-     * @access        public
1249
-     * @param        string $label
1250
-     * @return        string
1251
-     */
1252
-    public function country_form_field_label_wrap($label, $required_text)
1253
-    {
1254
-        return '
20
+	/**
21
+	 * _question_group
22
+	 * holds the specific question group object for the question group details screen
23
+	 *
24
+	 * @var object
25
+	 */
26
+	protected $_question_group;
27
+
28
+
29
+	/**
30
+	 * Initialize basic properties.
31
+	 */
32
+	protected function _init_page_props()
33
+	{
34
+		$this->page_slug        = GEN_SET_PG_SLUG;
35
+		$this->page_label       = GEN_SET_LABEL;
36
+		$this->_admin_base_url  = GEN_SET_ADMIN_URL;
37
+		$this->_admin_base_path = GEN_SET_ADMIN;
38
+	}
39
+
40
+
41
+	/**
42
+	 * Set ajax hooks
43
+	 */
44
+	protected function _ajax_hooks()
45
+	{
46
+		add_action('wp_ajax_espresso_display_country_settings', array($this, 'display_country_settings'));
47
+		add_action('wp_ajax_espresso_display_country_states', array($this, 'display_country_states'));
48
+		add_action('wp_ajax_espresso_delete_state', array($this, 'delete_state'), 10, 3);
49
+		add_action('wp_ajax_espresso_add_new_state', array($this, 'add_new_state'));
50
+	}
51
+
52
+
53
+	/**
54
+	 * More page properties initialization.
55
+	 */
56
+	protected function _define_page_props()
57
+	{
58
+		$this->_admin_page_title = GEN_SET_LABEL;
59
+		$this->_labels           = array(
60
+			'publishbox' => __('Update Settings', 'event_espresso'),
61
+		);
62
+	}
63
+
64
+
65
+	/**
66
+	 * Set page routes property.
67
+	 */
68
+	protected function _set_page_routes()
69
+	{
70
+		$this->_page_routes = array(
71
+
72
+			'critical_pages'                => array(
73
+				'func'       => '_espresso_page_settings',
74
+				'capability' => 'manage_options',
75
+			),
76
+			'update_espresso_page_settings' => array(
77
+				'func'       => '_update_espresso_page_settings',
78
+				'capability' => 'manage_options',
79
+				'noheader'   => true,
80
+			),
81
+			'default'                       => array(
82
+				'func'       => '_your_organization_settings',
83
+				'capability' => 'manage_options',
84
+			),
85
+
86
+			'update_your_organization_settings' => array(
87
+				'func'       => '_update_your_organization_settings',
88
+				'capability' => 'manage_options',
89
+				'noheader'   => true,
90
+			),
91
+
92
+			'admin_option_settings' => array(
93
+				'func'       => '_admin_option_settings',
94
+				'capability' => 'manage_options',
95
+			),
96
+
97
+			'update_admin_option_settings' => array(
98
+				'func'       => '_update_admin_option_settings',
99
+				'capability' => 'manage_options',
100
+				'noheader'   => true,
101
+			),
102
+
103
+			'country_settings' => array(
104
+				'func'       => '_country_settings',
105
+				'capability' => 'manage_options',
106
+			),
107
+
108
+			'update_country_settings' => array(
109
+				'func'       => '_update_country_settings',
110
+				'capability' => 'manage_options',
111
+				'noheader'   => true,
112
+			),
113
+
114
+			'display_country_settings' => array(
115
+				'func'       => 'display_country_settings',
116
+				'capability' => 'manage_options',
117
+				'noheader'   => true,
118
+			),
119
+
120
+			'add_new_state' => array(
121
+				'func'       => 'add_new_state',
122
+				'capability' => 'manage_options',
123
+				'noheader'   => true,
124
+			),
125
+
126
+			'delete_state' => array(
127
+				'func'       => 'delete_state',
128
+				'capability' => 'manage_options',
129
+				'noheader'   => true,
130
+			),
131
+		);
132
+	}
133
+
134
+
135
+	/**
136
+	 * Set page configuration property
137
+	 */
138
+	protected function _set_page_config()
139
+	{
140
+		$this->_page_config = array(
141
+			'critical_pages'        => array(
142
+				'nav'           => array(
143
+					'label' => __('Critical Pages', 'event_espresso'),
144
+					'order' => 50,
145
+				),
146
+				'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
147
+				'help_tabs'     => array(
148
+					'general_settings_critical_pages_help_tab' => array(
149
+						'title'    => __('Critical Pages', 'event_espresso'),
150
+						'filename' => 'general_settings_critical_pages',
151
+					),
152
+				),
153
+				'help_tour'     => array('Critical_Pages_Help_Tour'),
154
+				'require_nonce' => false,
155
+			),
156
+			'default'               => array(
157
+				'nav'           => array(
158
+					'label' => __('Your Organization', 'event_espresso'),
159
+					'order' => 20,
160
+				),
161
+				'help_tabs'     => array(
162
+					'general_settings_your_organization_help_tab' => array(
163
+						'title'    => __('Your Organization', 'event_espresso'),
164
+						'filename' => 'general_settings_your_organization',
165
+					),
166
+				),
167
+				'help_tour'     => array('Your_Organization_Help_Tour'),
168
+				'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
169
+				'require_nonce' => false,
170
+			),
171
+			'admin_option_settings' => array(
172
+				'nav'           => array(
173
+					'label' => __('Admin Options', 'event_espresso'),
174
+					'order' => 60,
175
+				),
176
+				'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
177
+				'help_tabs'     => array(
178
+					'general_settings_admin_options_help_tab' => array(
179
+						'title'    => __('Admin Options', 'event_espresso'),
180
+						'filename' => 'general_settings_admin_options',
181
+					),
182
+				),
183
+				'help_tour'     => array('Admin_Options_Help_Tour'),
184
+				'require_nonce' => false,
185
+			),
186
+			'country_settings'      => array(
187
+				'nav'           => array(
188
+					'label' => __('Countries', 'event_espresso'),
189
+					'order' => 70,
190
+				),
191
+				'help_tabs'     => array(
192
+					'general_settings_countries_help_tab' => array(
193
+						'title'    => __('Countries', 'event_espresso'),
194
+						'filename' => 'general_settings_countries',
195
+					),
196
+				),
197
+				'help_tour'     => array('Countries_Help_Tour'),
198
+				'require_nonce' => false,
199
+			),
200
+		);
201
+	}
202
+
203
+
204
+
205
+	protected function _add_screen_options()
206
+	{
207
+	}
208
+
209
+	protected function _add_feature_pointers()
210
+	{
211
+	}
212
+
213
+
214
+	/**
215
+	 * Enqueue global scripts and styles for all routes in the General Settings Admin Pages.
216
+	 */
217
+	public function load_scripts_styles()
218
+	{
219
+		//styles
220
+		wp_enqueue_style('espresso-ui-theme');
221
+		//scripts
222
+		wp_enqueue_script('ee_admin_js');
223
+	}
224
+
225
+
226
+	/**
227
+	 * Execute logic running on `admin_init`
228
+	 */
229
+	public function admin_init()
230
+	{
231
+		EE_Registry::$i18n_js_strings['invalid_server_response'] = __(
232
+			'An error occurred! Your request may have been processed, but a valid response from the server was not received. Please refresh the page and try again.',
233
+			'event_espresso'
234
+		);
235
+		EE_Registry::$i18n_js_strings['error_occurred']          = __(
236
+			'An error occurred! Please refresh the page and try again.',
237
+			'event_espresso'
238
+		);
239
+		EE_Registry::$i18n_js_strings['confirm_delete_state']    = __(
240
+			'Are you sure you want to delete this State / Province?',
241
+			'event_espresso'
242
+		);
243
+		$protocol                                                = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
244
+		EE_Registry::$i18n_js_strings['ajax_url']                = admin_url(
245
+			'admin-ajax.php?page=espresso_general_settings',
246
+			$protocol
247
+		);
248
+	}
249
+
250
+	public function admin_notices()
251
+	{
252
+	}
253
+
254
+	public function admin_footer_scripts()
255
+	{
256
+	}
257
+
258
+
259
+	/**
260
+	 * Enqueue scripts and styles for the default route.
261
+	 */
262
+	public function load_scripts_styles_default()
263
+	{
264
+		//styles
265
+		wp_enqueue_style('thickbox');
266
+		//scripts
267
+		wp_enqueue_script('media-upload');
268
+		wp_enqueue_script('thickbox');
269
+		wp_register_script(
270
+			'organization_settings',
271
+			GEN_SET_ASSETS_URL . 'your_organization_settings.js',
272
+			array('jquery', 'media-upload', 'thickbox'),
273
+			EVENT_ESPRESSO_VERSION,
274
+			true
275
+		);
276
+		wp_register_style('organization-css', GEN_SET_ASSETS_URL . 'organization.css', array(), EVENT_ESPRESSO_VERSION);
277
+		wp_enqueue_script('organization_settings');
278
+		wp_enqueue_style('organization-css');
279
+		$confirm_image_delete = array(
280
+			'text' => __(
281
+				'Do you really want to delete this image? Please remember to save your settings to complete the removal.',
282
+				'event_espresso'
283
+			),
284
+		);
285
+		wp_localize_script('organization_settings', 'confirm_image_delete', $confirm_image_delete);
286
+	}
287
+
288
+
289
+	/**
290
+	 * Enqueue scripts and styles for the country settings route.
291
+	 */
292
+	public function load_scripts_styles_country_settings()
293
+	{
294
+		//scripts
295
+		wp_register_script(
296
+			'gen_settings_countries',
297
+			GEN_SET_ASSETS_URL . 'gen_settings_countries.js',
298
+			array('ee_admin_js'),
299
+			EVENT_ESPRESSO_VERSION,
300
+			true
301
+		);
302
+		wp_register_style('organization-css', GEN_SET_ASSETS_URL . 'organization.css', array(), EVENT_ESPRESSO_VERSION);
303
+		wp_enqueue_script('gen_settings_countries');
304
+		wp_enqueue_style('organization-css');
305
+	}
306
+
307
+
308
+	/*************        Espresso Pages        *************/
309
+	/**
310
+	 * _espresso_page_settings
311
+	 *
312
+	 * @throws \EE_Error
313
+	 */
314
+	protected function _espresso_page_settings()
315
+	{
316
+		// Check to make sure all of the main pages are setup properly,
317
+		// if not create the default pages and display an admin notice
318
+		EEH_Activation::verify_default_pages_exist();
319
+		$this->_transient_garbage_collection();
320
+		$this->_template_args['values']             = $this->_yes_no_values;
321
+		$this->_template_args['reg_page_id']        = isset(EE_Registry::instance()->CFG->core->reg_page_id)
322
+			? EE_Registry::instance()->CFG->core->reg_page_id
323
+			: null;
324
+		$this->_template_args['reg_page_obj']       = isset(EE_Registry::instance()->CFG->core->reg_page_id)
325
+			? get_page(EE_Registry::instance()->CFG->core->reg_page_id)
326
+			: false;
327
+		$this->_template_args['txn_page_id']        = isset(EE_Registry::instance()->CFG->core->txn_page_id)
328
+			? EE_Registry::instance()->CFG->core->txn_page_id
329
+			: null;
330
+		$this->_template_args['txn_page_obj']       = isset(EE_Registry::instance()->CFG->core->txn_page_id)
331
+			? get_page(EE_Registry::instance()->CFG->core->txn_page_id)
332
+			: false;
333
+		$this->_template_args['thank_you_page_id']  = isset(EE_Registry::instance()->CFG->core->thank_you_page_id)
334
+			? EE_Registry::instance()->CFG->core->thank_you_page_id
335
+			: null;
336
+		$this->_template_args['thank_you_page_obj'] = isset(EE_Registry::instance()->CFG->core->thank_you_page_id)
337
+			? get_page(EE_Registry::instance()->CFG->core->thank_you_page_id)
338
+			: false;
339
+		$this->_template_args['cancel_page_id']     = isset(EE_Registry::instance()->CFG->core->cancel_page_id)
340
+			? EE_Registry::instance()->CFG->core->cancel_page_id
341
+			: null;
342
+		$this->_template_args['cancel_page_obj']    = isset(EE_Registry::instance()->CFG->core->cancel_page_id)
343
+			? get_page(EE_Registry::instance()->CFG->core->cancel_page_id)
344
+			: false;
345
+		$this->_set_add_edit_form_tags('update_espresso_page_settings');
346
+		$this->_set_publish_post_box_vars(null, false, false, null, false);
347
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
348
+			GEN_SET_TEMPLATE_PATH . 'espresso_page_settings.template.php',
349
+			$this->_template_args,
350
+			true
351
+		);
352
+		$this->display_admin_page_with_sidebar();
353
+	}
354
+
355
+
356
+	/**
357
+	 * Handler for updating espresso page settings.
358
+	 */
359
+	protected function _update_espresso_page_settings()
360
+	{
361
+		// capture incoming request data && set page IDs
362
+		EE_Registry::instance()->CFG->core->reg_page_id       = isset($this->_req_data['reg_page_id'])
363
+			? absint($this->_req_data['reg_page_id'])
364
+			: EE_Registry::instance()->CFG->core->reg_page_id;
365
+		EE_Registry::instance()->CFG->core->txn_page_id       = isset($this->_req_data['txn_page_id'])
366
+			? absint($this->_req_data['txn_page_id'])
367
+			: EE_Registry::instance()->CFG->core->txn_page_id;
368
+		EE_Registry::instance()->CFG->core->thank_you_page_id = isset($this->_req_data['thank_you_page_id'])
369
+			? absint($this->_req_data['thank_you_page_id'])
370
+			: EE_Registry::instance()->CFG->core->thank_you_page_id;
371
+		EE_Registry::instance()->CFG->core->cancel_page_id    = isset($this->_req_data['cancel_page_id'])
372
+			? absint($this->_req_data['cancel_page_id'])
373
+			: EE_Registry::instance()->CFG->core->cancel_page_id;
374
+
375
+		EE_Registry::instance()->CFG->core = apply_filters(
376
+			'FHEE__General_Settings_Admin_Page___update_espresso_page_settings__CFG_core',
377
+			EE_Registry::instance()->CFG->core,
378
+			$this->_req_data
379
+		);
380
+		$what                              = __('Critical Pages & Shortcodes', 'event_espresso');
381
+		$this->_redirect_after_action(
382
+			$this->_update_espresso_configuration(
383
+				$what,
384
+				EE_Registry::instance()->CFG->core,
385
+				__FILE__,
386
+				__FUNCTION__,
387
+				__LINE__
388
+			),
389
+			$what,
390
+			'',
391
+			array(
392
+				'action' => 'critical_pages',
393
+			),
394
+			true
395
+		);
396
+	}
397
+
398
+
399
+	/*************        Your Organization        *************/
400
+
401
+
402
+	/**
403
+	 * Output for the Your Organization settings route.
404
+	 * @throws DomainException
405
+	 * @throws EE_Error
406
+	 */
407
+	protected function _your_organization_settings()
408
+	{
409
+
410
+		$this->_template_args['site_license_key']       = isset(
411
+			EE_Registry::instance()->NET_CFG->core->site_license_key
412
+		)
413
+			? EE_Registry::instance()->NET_CFG->core->get_pretty('site_license_key')
414
+			: '';
415
+		$this->_template_args['organization_name']      = isset(EE_Registry::instance()->CFG->organization->name)
416
+			? EE_Registry::instance()->CFG->organization->get_pretty('name')
417
+			: '';
418
+		$this->_template_args['organization_address_1'] = isset(EE_Registry::instance()->CFG->organization->address_1)
419
+			? EE_Registry::instance()->CFG->organization->get_pretty('address_1')
420
+			: '';
421
+		$this->_template_args['organization_address_2'] = isset(EE_Registry::instance()->CFG->organization->address_2)
422
+			? EE_Registry::instance()->CFG->organization->get_pretty('address_2')
423
+			: '';
424
+		$this->_template_args['organization_city']      = isset(EE_Registry::instance()->CFG->organization->city)
425
+			? EE_Registry::instance()->CFG->organization->get_pretty('city')
426
+			: '';
427
+		$this->_template_args['organization_zip']       = isset(EE_Registry::instance()->CFG->organization->zip)
428
+			? EE_Registry::instance()->CFG->organization->get_pretty('zip')
429
+			: '';
430
+		$this->_template_args['organization_email']     = isset(EE_Registry::instance()->CFG->organization->email)
431
+			? EE_Registry::instance()->CFG->organization->get_pretty('email')
432
+			: '';
433
+		$this->_template_args['organization_phone']     = isset(EE_Registry::instance()->CFG->organization->phone)
434
+			? EE_Registry::instance()->CFG->organization->get_pretty('phone')
435
+			: '';
436
+		$this->_template_args['organization_vat']       = isset(EE_Registry::instance()->CFG->organization->vat)
437
+			? EE_Registry::instance()->CFG->organization->get_pretty('vat')
438
+			: '';
439
+		$this->_template_args['currency_sign']          = isset(EE_Registry::instance()->CFG->currency->sign)
440
+			? EE_Registry::instance()->CFG->currency->get_pretty('sign')
441
+			: '$';
442
+		$this->_template_args['organization_logo_url']  = isset(EE_Registry::instance()->CFG->organization->logo_url)
443
+			? EE_Registry::instance()->CFG->organization->get_pretty('logo_url')
444
+			: false;
445
+		$this->_template_args['organization_facebook']  = isset(EE_Registry::instance()->CFG->organization->facebook)
446
+			? EE_Registry::instance()->CFG->organization->get_pretty('facebook')
447
+			: '';
448
+		$this->_template_args['organization_twitter']   = isset(EE_Registry::instance()->CFG->organization->twitter)
449
+			? EE_Registry::instance()->CFG->organization->get_pretty('twitter')
450
+			: '';
451
+		$this->_template_args['organization_linkedin']  = isset(EE_Registry::instance()->CFG->organization->linkedin)
452
+			? EE_Registry::instance()->CFG->organization->get_pretty('linkedin')
453
+			: '';
454
+		$this->_template_args['organization_pinterest'] = isset(EE_Registry::instance()->CFG->organization->pinterest)
455
+			? EE_Registry::instance()->CFG->organization->get_pretty('pinterest')
456
+			: '';
457
+		$this->_template_args['organization_google']    = isset(EE_Registry::instance()->CFG->organization->google)
458
+			? EE_Registry::instance()->CFG->organization->get_pretty('google')
459
+			: '';
460
+		$this->_template_args['organization_instagram'] = isset(EE_Registry::instance()->CFG->organization->instagram)
461
+			? EE_Registry::instance()->CFG->organization->get_pretty('instagram')
462
+			: '';
463
+		//UXIP settings
464
+		$this->_template_args['ee_ueip_optin'] = isset(EE_Registry::instance()->CFG->core->ee_ueip_optin)
465
+			? EE_Registry::instance()->CFG->core->get_pretty('ee_ueip_optin')
466
+			: true;
467
+
468
+		$STA_ID                         = isset(EE_Registry::instance()->CFG->organization->STA_ID)
469
+			? EE_Registry::instance()->CFG->organization->STA_ID
470
+			: 4;
471
+		$this->_template_args['states'] = new EE_Question_Form_Input(
472
+			EE_Question::new_instance(array(
473
+				'QST_ID'           => 0,
474
+				'QST_display_text' => __('State/Province', 'event_espresso'),
475
+				'QST_system'       => 'admin-state',
476
+			)),
477
+			EE_Answer::new_instance(array(
478
+				'ANS_ID'    => 0,
479
+				'ANS_value' => $STA_ID,
480
+			)),
481
+			array(
482
+				'input_id'       => 'organization_state',
483
+				'input_name'     => 'organization_state',
484
+				'input_prefix'   => '',
485
+				'append_qstn_id' => false,
486
+			)
487
+		);
488
+
489
+		$CNT_ISO                           = isset(EE_Registry::instance()->CFG->organization->CNT_ISO)
490
+			? EE_Registry::instance()->CFG->organization->CNT_ISO
491
+			: 'US';
492
+		$this->_template_args['countries'] = new EE_Question_Form_Input(
493
+			EE_Question::new_instance(array(
494
+				'QST_ID'           => 0,
495
+				'QST_display_text' => __('Country', 'event_espresso'),
496
+				'QST_system'       => 'admin-country',
497
+			)),
498
+			EE_Answer::new_instance(array(
499
+				'ANS_ID'    => 0,
500
+				'ANS_value' => $CNT_ISO,
501
+			)),
502
+			array(
503
+				'input_id'       => 'organization_country',
504
+				'input_name'     => 'organization_country',
505
+				'input_prefix'   => '',
506
+				'append_qstn_id' => false,
507
+			)
508
+		);
509
+
510
+		add_filter('FHEE__EEH_Form_Fields__label_html', array($this, 'country_form_field_label_wrap'), 10, 2);
511
+		add_filter('FHEE__EEH_Form_Fields__input_html', array($this, 'country_form_field_input__wrap'), 10, 2);
512
+
513
+		//PUE verification stuff
514
+		$ver_option_key                                    = 'puvererr_' . basename(EE_PLUGIN_BASENAME);
515
+		$verify_fail                                       = get_option($ver_option_key);
516
+		$this->_template_args['site_license_key_verified'] = $verify_fail
517
+															 || ! empty($verify_fail)
518
+															 || (empty($this->_template_args['site_license_key'])
519
+																 && empty($verify_fail)
520
+															 )
521
+			? '<span class="dashicons dashicons-admin-network ee-icon-color-ee-red ee-icon-size-20"></span>'
522
+			: '<span class="dashicons dashicons-admin-network ee-icon-color-ee-green ee-icon-size-20"></span>';
523
+
524
+		$this->_set_add_edit_form_tags('update_your_organization_settings');
525
+		$this->_set_publish_post_box_vars(null, false, false, null, false);
526
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
527
+			GEN_SET_TEMPLATE_PATH . 'your_organization_settings.template.php',
528
+			$this->_template_args,
529
+			true
530
+		);
531
+
532
+		$this->display_admin_page_with_sidebar();
533
+	}
534
+
535
+
536
+	/**
537
+	 * Handler for updating organziation settings.
538
+	 */
539
+	protected function _update_your_organization_settings()
540
+	{
541
+		if (is_main_site()) {
542
+			EE_Registry::instance()->NET_CFG->core->site_license_key = isset($this->_req_data['site_license_key'])
543
+				? sanitize_text_field($this->_req_data['site_license_key'])
544
+				: EE_Registry::instance()->NET_CFG->core->site_license_key;
545
+		}
546
+		EE_Registry::instance()->CFG->organization->name      = isset($this->_req_data['organization_name'])
547
+			? sanitize_text_field($this->_req_data['organization_name'])
548
+			: EE_Registry::instance()->CFG->organization->name;
549
+		EE_Registry::instance()->CFG->organization->address_1 = isset($this->_req_data['organization_address_1'])
550
+			? sanitize_text_field($this->_req_data['organization_address_1'])
551
+			: EE_Registry::instance()->CFG->organization->address_1;
552
+		EE_Registry::instance()->CFG->organization->address_2 = isset($this->_req_data['organization_address_2'])
553
+			? sanitize_text_field($this->_req_data['organization_address_2'])
554
+			: EE_Registry::instance()->CFG->organization->address_2;
555
+		EE_Registry::instance()->CFG->organization->city      = isset($this->_req_data['organization_city'])
556
+			? sanitize_text_field($this->_req_data['organization_city'])
557
+			: EE_Registry::instance()->CFG->organization->city;
558
+		EE_Registry::instance()->CFG->organization->STA_ID    = isset($this->_req_data['organization_state'])
559
+			? absint($this->_req_data['organization_state'])
560
+			: EE_Registry::instance()->CFG->organization->STA_ID;
561
+		EE_Registry::instance()->CFG->organization->CNT_ISO   = isset($this->_req_data['organization_country'])
562
+			? sanitize_text_field($this->_req_data['organization_country'])
563
+			: EE_Registry::instance()->CFG->organization->CNT_ISO;
564
+		EE_Registry::instance()->CFG->organization->zip       = isset($this->_req_data['organization_zip'])
565
+			? sanitize_text_field($this->_req_data['organization_zip'])
566
+			: EE_Registry::instance()->CFG->organization->zip;
567
+		EE_Registry::instance()->CFG->organization->email     = isset($this->_req_data['organization_email'])
568
+			? sanitize_email($this->_req_data['organization_email'])
569
+			: EE_Registry::instance()->CFG->organization->email;
570
+		EE_Registry::instance()->CFG->organization->vat       = isset($this->_req_data['organization_vat'])
571
+			? sanitize_text_field($this->_req_data['organization_vat'])
572
+			: EE_Registry::instance()->CFG->organization->vat;
573
+		EE_Registry::instance()->CFG->organization->phone     = isset($this->_req_data['organization_phone'])
574
+			? sanitize_text_field($this->_req_data['organization_phone'])
575
+			: EE_Registry::instance()->CFG->organization->phone;
576
+		EE_Registry::instance()->CFG->organization->logo_url  = isset($this->_req_data['organization_logo_url'])
577
+			? esc_url_raw($this->_req_data['organization_logo_url'])
578
+			: EE_Registry::instance()->CFG->organization->logo_url;
579
+		EE_Registry::instance()->CFG->organization->facebook  = isset($this->_req_data['organization_facebook'])
580
+			? esc_url_raw($this->_req_data['organization_facebook'])
581
+			: EE_Registry::instance()->CFG->organization->facebook;
582
+		EE_Registry::instance()->CFG->organization->twitter   = isset($this->_req_data['organization_twitter'])
583
+			? esc_url_raw($this->_req_data['organization_twitter'])
584
+			: EE_Registry::instance()->CFG->organization->twitter;
585
+		EE_Registry::instance()->CFG->organization->linkedin  = isset($this->_req_data['organization_linkedin'])
586
+			? esc_url_raw($this->_req_data['organization_linkedin'])
587
+			: EE_Registry::instance()->CFG->organization->linkedin;
588
+		EE_Registry::instance()->CFG->organization->pinterest = isset($this->_req_data['organization_pinterest'])
589
+			? esc_url_raw($this->_req_data['organization_pinterest'])
590
+			: EE_Registry::instance()->CFG->organization->pinterest;
591
+		EE_Registry::instance()->CFG->organization->google    = isset($this->_req_data['organization_google'])
592
+			? esc_url_raw($this->_req_data['organization_google'])
593
+			: EE_Registry::instance()->CFG->organization->google;
594
+		EE_Registry::instance()->CFG->organization->instagram = isset($this->_req_data['organization_instagram'])
595
+			? esc_url_raw($this->_req_data['organization_instagram'])
596
+			: EE_Registry::instance()->CFG->organization->instagram;
597
+		EE_Registry::instance()->CFG->core->ee_ueip_optin     = isset($this->_req_data['ueip_optin'])
598
+																&& ! empty($this->_req_data['ueip_optin'])
599
+			? $this->_req_data['ueip_optin']
600
+			: EE_Registry::instance()->CFG->core->ee_ueip_optin;
601
+
602
+		EE_Registry::instance()->CFG->currency = new EE_Currency_Config(
603
+			EE_Registry::instance()->CFG->organization->CNT_ISO
604
+		);
605
+
606
+		EE_Registry::instance()->CFG = apply_filters(
607
+			'FHEE__General_Settings_Admin_Page___update_your_organization_settings__CFG',
608
+			EE_Registry::instance()->CFG
609
+		);
610
+
611
+		$what    = 'Your Organization Settings';
612
+		$success = $this->_update_espresso_configuration(
613
+			$what,
614
+			EE_Registry::instance()->CFG,
615
+			__FILE__,
616
+			__FUNCTION__,
617
+			__LINE__
618
+		);
619
+
620
+		$this->_redirect_after_action($success, $what, 'updated', array('action' => 'default'));
621
+	}
622
+
623
+
624
+
625
+	/*************        Admin Options        *************/
626
+
627
+
628
+	/**
629
+	 * _admin_option_settings
630
+	 *
631
+	 * @throws \EE_Error
632
+	 * @throws \LogicException
633
+	 */
634
+	protected function _admin_option_settings()
635
+	{
636
+		$this->_template_args['admin_page_content'] = '';
637
+		try {
638
+			$admin_options_settings_form = new AdminOptionsSettings(EE_Registry::instance());
639
+			// still need this for the old school form in Extend_General_Settings_Admin_Page
640
+			$this->_template_args['values'] = $this->_yes_no_values;
641
+			// also need to account for the do_action that was in the old template
642
+			$admin_options_settings_form->setTemplateArgs($this->_template_args);
643
+			$this->_template_args['admin_page_content'] = $admin_options_settings_form->display();
644
+		} catch (Exception $e) {
645
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
646
+		}
647
+		$this->_set_add_edit_form_tags('update_admin_option_settings');
648
+		$this->_set_publish_post_box_vars(null, false, false, null, false);
649
+		$this->display_admin_page_with_sidebar();
650
+	}
651
+
652
+
653
+	/**
654
+	 * _update_admin_option_settings
655
+	 *
656
+	 * @throws \EE_Error
657
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
658
+	 * @throws \EventEspresso\core\exceptions\InvalidFormSubmissionException
659
+	 * @throws \InvalidArgumentException
660
+	 * @throws \LogicException
661
+	 */
662
+	protected function _update_admin_option_settings()
663
+	{
664
+		try {
665
+			$admin_options_settings_form = new AdminOptionsSettings(EE_Registry::instance());
666
+			$admin_options_settings_form->process($this->_req_data[$admin_options_settings_form->slug()]);
667
+			EE_Registry::instance()->CFG->admin = apply_filters(
668
+				'FHEE__General_Settings_Admin_Page___update_admin_option_settings__CFG_admin',
669
+				EE_Registry::instance()->CFG->admin
670
+			);
671
+		} catch (Exception $e) {
672
+			EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
673
+		}
674
+		$this->_redirect_after_action(
675
+			apply_filters(
676
+				'FHEE__General_Settings_Admin_Page___update_admin_option_settings__success',
677
+				$this->_update_espresso_configuration(
678
+					'Admin Options',
679
+					EE_Registry::instance()->CFG->admin,
680
+					__FILE__, __FUNCTION__, __LINE__
681
+				)
682
+			),
683
+			'Admin Options',
684
+			'updated',
685
+			array('action' => 'admin_option_settings')
686
+		);
687
+
688
+	}
689
+
690
+
691
+	/*************        Countries        *************/
692
+
693
+
694
+	/**
695
+	 * Output Country Settings view.
696
+	 * @throws DomainException
697
+	 * @throws EE_Error
698
+	 */
699
+	protected function _country_settings()
700
+	{
701
+		$CNT_ISO = isset(EE_Registry::instance()->CFG->organization->CNT_ISO)
702
+			? EE_Registry::instance()->CFG->organization->CNT_ISO
703
+			: 'US';
704
+		$CNT_ISO = isset($this->_req_data['country'])
705
+			? strtoupper(sanitize_text_field($this->_req_data['country']))
706
+			: $CNT_ISO;
707
+
708
+		//load field generator helper
709
+
710
+		$this->_template_args['values'] = $this->_yes_no_values;
711
+
712
+		$this->_template_args['countries'] = new EE_Question_Form_Input(
713
+			EE_Question::new_instance(array(
714
+				'QST_ID'           => 0,
715
+				'QST_display_text' => __('Select Country', 'event_espresso'),
716
+				'QST_system'       => 'admin-country',
717
+			)),
718
+			EE_Answer::new_instance(array(
719
+				'ANS_ID'    => 0,
720
+				'ANS_value' => $CNT_ISO,
721
+			)),
722
+			array(
723
+				'input_id'       => 'country',
724
+				'input_name'     => 'country',
725
+				'input_prefix'   => '',
726
+				'append_qstn_id' => false,
727
+			)
728
+		);
729
+
730
+		add_filter('FHEE__EEH_Form_Fields__label_html', array($this, 'country_form_field_label_wrap'), 10, 2);
731
+		add_filter('FHEE__EEH_Form_Fields__input_html', array($this, 'country_form_field_input__wrap'), 10, 2);
732
+		$this->_template_args['country_details_settings'] = $this->display_country_settings();
733
+		$this->_template_args['country_states_settings']  = $this->display_country_states();
734
+
735
+		$this->_set_add_edit_form_tags('update_country_settings');
736
+		$this->_set_publish_post_box_vars(null, false, false, null, false);
737
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
738
+			GEN_SET_TEMPLATE_PATH . 'countries_settings.template.php',
739
+			$this->_template_args,
740
+			true
741
+		);
742
+		$this->display_admin_page_with_no_sidebar();
743
+	}
744
+
745
+
746
+	/**
747
+	 *        display_country_settings
748
+	 *
749
+	 * @access    public
750
+	 * @param    string $CNT_ISO
751
+	 * @return mixed string | array
752
+	 * @throws DomainException
753
+	 */
754
+	public function display_country_settings($CNT_ISO = '')
755
+	{
756
+
757
+		$CNT_ISO = isset($this->_req_data['country'])
758
+			? strtoupper(sanitize_text_field($this->_req_data['country']))
759
+			: $CNT_ISO;
760
+		if (! $CNT_ISO) {
761
+			return '';
762
+		}
763
+
764
+		// for ajax
765
+		remove_all_filters('FHEE__EEH_Form_Fields__label_html');
766
+		remove_all_filters('FHEE__EEH_Form_Fields__input_html');
767
+		add_filter('FHEE__EEH_Form_Fields__label_html', array($this, 'country_form_field_label_wrap'), 10, 2);
768
+		add_filter('FHEE__EEH_Form_Fields__input_html', array($this, 'country_form_field_input__wrap'), 10, 2);
769
+		$country = EEM_Country::instance()->get_one_by_ID($CNT_ISO);
770
+
771
+		$country_input_types            = array(
772
+			'CNT_active'      => array(
773
+				'type'             => 'RADIO_BTN',
774
+				'input_name'       => 'cntry[' . $CNT_ISO . ']',
775
+				'class'            => '',
776
+				'options'          => $this->_yes_no_values,
777
+				'use_desc_4_label' => true,
778
+			),
779
+			'CNT_ISO'         => array(
780
+				'type'       => 'TEXT',
781
+				'input_name' => 'cntry[' . $CNT_ISO . ']',
782
+				'class'      => 'small-text',
783
+			),
784
+			'CNT_ISO3'        => array(
785
+				'type'       => 'TEXT',
786
+				'input_name' => 'cntry[' . $CNT_ISO . ']',
787
+				'class'      => 'small-text',
788
+			),
789
+			'RGN_ID'          => array(
790
+				'type'       => 'TEXT',
791
+				'input_name' => 'cntry[' . $CNT_ISO . ']',
792
+				'class'      => 'small-text',
793
+			),
794
+			'CNT_name'        => array(
795
+				'type'       => 'TEXT',
796
+				'input_name' => 'cntry[' . $CNT_ISO . ']',
797
+				'class'      => 'regular-text',
798
+			),
799
+			'CNT_cur_code'    => array(
800
+				'type'       => 'TEXT',
801
+				'input_name' => 'cntry[' . $CNT_ISO . ']',
802
+				'class'      => 'small-text',
803
+			),
804
+			'CNT_cur_single'  => array(
805
+				'type'       => 'TEXT',
806
+				'input_name' => 'cntry[' . $CNT_ISO . ']',
807
+				'class'      => 'medium-text',
808
+			),
809
+			'CNT_cur_plural'  => array(
810
+				'type'       => 'TEXT',
811
+				'input_name' => 'cntry[' . $CNT_ISO . ']',
812
+				'class'      => 'medium-text',
813
+			),
814
+			'CNT_cur_sign'    => array(
815
+				'type'         => 'TEXT',
816
+				'input_name'   => 'cntry[' . $CNT_ISO . ']',
817
+				'class'        => 'small-text',
818
+				'htmlentities' => false,
819
+			),
820
+			'CNT_cur_sign_b4' => array(
821
+				'type'             => 'RADIO_BTN',
822
+				'input_name'       => 'cntry[' . $CNT_ISO . ']',
823
+				'class'            => '',
824
+				'options'          => $this->_yes_no_values,
825
+				'use_desc_4_label' => true,
826
+			),
827
+			'CNT_cur_dec_plc' => array(
828
+				'type'       => 'RADIO_BTN',
829
+				'input_name' => 'cntry[' . $CNT_ISO . ']',
830
+				'class'      => '',
831
+				'options'    => array(
832
+					array('id' => 0, 'text' => ''),
833
+					array('id' => 1, 'text' => ''),
834
+					array('id' => 2, 'text' => ''),
835
+					array('id' => 3, 'text' => ''),
836
+				),
837
+			),
838
+			'CNT_cur_dec_mrk' => array(
839
+				'type'             => 'RADIO_BTN',
840
+				'input_name'       => 'cntry[' . $CNT_ISO . ']',
841
+				'class'            => '',
842
+				'options'          => array(
843
+					array(
844
+						'id'   => ',',
845
+						'text' => __(', (comma)', 'event_espresso'),
846
+					),
847
+					array('id' => '.', 'text' => __('. (decimal)', 'event_espresso')),
848
+				),
849
+				'use_desc_4_label' => true,
850
+			),
851
+			'CNT_cur_thsnds'  => array(
852
+				'type'             => 'RADIO_BTN',
853
+				'input_name'       => 'cntry[' . $CNT_ISO . ']',
854
+				'class'            => '',
855
+				'options'          => array(
856
+					array(
857
+						'id'   => ',',
858
+						'text' => __(', (comma)', 'event_espresso'),
859
+					),
860
+					array('id' => '.', 'text' => __('. (decimal)', 'event_espresso')),
861
+				),
862
+				'use_desc_4_label' => true,
863
+			),
864
+			'CNT_tel_code'    => array(
865
+				'type'       => 'TEXT',
866
+				'input_name' => 'cntry[' . $CNT_ISO . ']',
867
+				'class'      => 'small-text',
868
+			),
869
+			'CNT_is_EU'       => array(
870
+				'type'             => 'RADIO_BTN',
871
+				'input_name'       => 'cntry[' . $CNT_ISO . ']',
872
+				'class'            => '',
873
+				'options'          => $this->_yes_no_values,
874
+				'use_desc_4_label' => true,
875
+			),
876
+		);
877
+		$this->_template_args['inputs'] = EE_Question_Form_Input::generate_question_form_inputs_for_object(
878
+			$country,
879
+			$country_input_types
880
+		);
881
+		$country_details_settings       = EEH_Template::display_template(
882
+			GEN_SET_TEMPLATE_PATH . 'country_details_settings.template.php',
883
+			$this->_template_args,
884
+			true
885
+		);
886
+
887
+		if (defined('DOING_AJAX')) {
888
+			$notices = EE_Error::get_notices(false, false, false);
889
+			echo wp_json_encode(array(
890
+				'return_data' => $country_details_settings,
891
+				'success'     => $notices['success'],
892
+				'errors'      => $notices['errors'],
893
+			));
894
+			die();
895
+		} else {
896
+			return $country_details_settings;
897
+		}
898
+	}
899
+
900
+
901
+	/**
902
+	 *        display_country_states
903
+	 *
904
+	 * @access    public
905
+	 * @param    string $CNT_ISO
906
+	 * @return string
907
+	 * @throws DomainException
908
+	 */
909
+	public function display_country_states($CNT_ISO = '')
910
+	{
911
+
912
+		$CNT_ISO = isset($this->_req_data['country']) ? sanitize_text_field($this->_req_data['country']) : $CNT_ISO;
913
+
914
+		if (! $CNT_ISO) {
915
+			return '';
916
+		}
917
+		// for ajax
918
+		remove_all_filters('FHEE__EEH_Form_Fields__label_html');
919
+		remove_all_filters('FHEE__EEH_Form_Fields__input_html');
920
+		add_filter('FHEE__EEH_Form_Fields__label_html', array($this, 'state_form_field_label_wrap'), 10, 2);
921
+		add_filter('FHEE__EEH_Form_Fields__input_html', array($this, 'state_form_field_input__wrap'), 10, 2);
922
+		$states = EEM_State::instance()->get_all_states_for_these_countries(array($CNT_ISO => $CNT_ISO));
923
+
924
+		if ($states) {
925
+			foreach ($states as $STA_ID => $state) {
926
+				if ($state instanceof EE_State) {
927
+					//STA_abbrev 	STA_name 	STA_active
928
+					$state_input_types                                           = array(
929
+						'STA_abbrev' => array(
930
+							'type'       => 'TEXT',
931
+							'input_name' => 'states[' . $STA_ID . ']',
932
+							'class'      => 'mid-text',
933
+						),
934
+						'STA_name'   => array(
935
+							'type'       => 'TEXT',
936
+							'input_name' => 'states[' . $STA_ID . ']',
937
+							'class'      => 'regular-text',
938
+						),
939
+						'STA_active' => array(
940
+							'type'             => 'RADIO_BTN',
941
+							'input_name'       => 'states[' . $STA_ID . ']',
942
+							'options'          => $this->_yes_no_values,
943
+							'use_desc_4_label' => true,
944
+						),
945
+					);
946
+					$this->_template_args['states'][$STA_ID]['inputs'] =
947
+						EE_Question_Form_Input::generate_question_form_inputs_for_object(
948
+							$state,
949
+							$state_input_types
950
+						);
951
+					$query_args                                                  = array(
952
+						'action'     => 'delete_state',
953
+						'STA_ID'     => $STA_ID,
954
+						'CNT_ISO'    => $CNT_ISO,
955
+						'STA_abbrev' => $state->abbrev(),
956
+					);
957
+					$this->_template_args['states'][$STA_ID]['delete_state_url'] =
958
+						EE_Admin_Page::add_query_args_and_nonce(
959
+							$query_args,
960
+							GEN_SET_ADMIN_URL
961
+						);
962
+				}
963
+			}
964
+		} else {
965
+			$this->_template_args['states'] = false;
966
+		}
967
+
968
+		$this->_template_args['add_new_state_url'] = EE_Admin_Page::add_query_args_and_nonce(
969
+			array('action' => 'add_new_state'),
970
+			GEN_SET_ADMIN_URL
971
+		);
972
+
973
+		$state_details_settings = EEH_Template::display_template(
974
+			GEN_SET_TEMPLATE_PATH . 'state_details_settings.template.php',
975
+			$this->_template_args,
976
+			true
977
+		);
978
+
979
+		if (defined('DOING_AJAX')) {
980
+			$notices = EE_Error::get_notices(false, false, false);
981
+			echo wp_json_encode(array(
982
+				'return_data' => $state_details_settings,
983
+				'success'     => $notices['success'],
984
+				'errors'      => $notices['errors'],
985
+			));
986
+			die();
987
+		} else {
988
+			return $state_details_settings;
989
+		}
990
+	}
991
+
992
+
993
+	/**
994
+	 *        add_new_state
995
+	 *
996
+	 * @access    public
997
+	 * @return void
998
+	 * @throws EE_Error
999
+	 */
1000
+	public function add_new_state()
1001
+	{
1002
+
1003
+		$success = true;
1004
+
1005
+		$CNT_ISO = isset($this->_req_data['CNT_ISO'])
1006
+			? strtoupper(sanitize_text_field($this->_req_data['CNT_ISO']))
1007
+			: false;
1008
+		if (! $CNT_ISO) {
1009
+			EE_Error::add_error(
1010
+				__('No Country ISO code or an invalid Country ISO code was received.', 'event_espresso'),
1011
+				__FILE__,
1012
+				__FUNCTION__,
1013
+				__LINE__
1014
+			);
1015
+			$success = false;
1016
+		}
1017
+		$STA_abbrev = isset($this->_req_data['STA_abbrev'])
1018
+			? sanitize_text_field($this->_req_data['STA_abbrev'])
1019
+			: false;
1020
+		if (! $STA_abbrev) {
1021
+			EE_Error::add_error(
1022
+				__('No State ISO code or an invalid State ISO code was received.', 'event_espresso'),
1023
+				__FILE__,
1024
+				__FUNCTION__,
1025
+				__LINE__
1026
+			);
1027
+			$success = false;
1028
+		}
1029
+		$STA_name = isset($this->_req_data['STA_name'])
1030
+			? sanitize_text_field($this->_req_data['STA_name'])
1031
+			: false;
1032
+		if (! $STA_name) {
1033
+			EE_Error::add_error(
1034
+				__('No State name or an invalid State name was received.', 'event_espresso'),
1035
+				__FILE__,
1036
+				__FUNCTION__,
1037
+				__LINE__
1038
+			);
1039
+			$success = false;
1040
+		}
1041
+
1042
+		if ($success) {
1043
+			$cols_n_values = array(
1044
+				'CNT_ISO'    => $CNT_ISO,
1045
+				'STA_abbrev' => $STA_abbrev,
1046
+				'STA_name'   => $STA_name,
1047
+				'STA_active' => true,
1048
+			);
1049
+			$success       = EEM_State::instance()->insert($cols_n_values);
1050
+			EE_Error::add_success(__('The State was added successfully.', 'event_espresso'));
1051
+		}
1052
+
1053
+		if (defined('DOING_AJAX')) {
1054
+			$notices = EE_Error::get_notices(false, false, false);
1055
+			echo wp_json_encode(array_merge($notices, array('return_data' => $CNT_ISO)));
1056
+			die();
1057
+		} else {
1058
+			$this->_redirect_after_action($success, 'State', 'added', array('action' => 'country_settings'));
1059
+		}
1060
+	}
1061
+
1062
+
1063
+	/**
1064
+	 *        delete_state
1065
+	 *
1066
+	 * @access    public
1067
+	 * @return        boolean
1068
+	 */
1069
+	public function delete_state()
1070
+	{
1071
+		$CNT_ISO    = isset($this->_req_data['CNT_ISO'])
1072
+			? strtoupper(sanitize_text_field($this->_req_data['CNT_ISO']))
1073
+			: false;
1074
+		$STA_ID     = isset($this->_req_data['STA_ID'])
1075
+			? sanitize_text_field($this->_req_data['STA_ID'])
1076
+			: false;
1077
+		$STA_abbrev = isset($this->_req_data['STA_abbrev'])
1078
+			? sanitize_text_field($this->_req_data['STA_abbrev'])
1079
+			: false;
1080
+		if (! $STA_ID) {
1081
+			EE_Error::add_error(
1082
+				__('No State ID or an invalid State ID was received.', 'event_espresso'),
1083
+				__FILE__,
1084
+				__FUNCTION__,
1085
+				__LINE__
1086
+			);
1087
+			return false;
1088
+		}
1089
+
1090
+		$success = EEM_State::instance()->delete_by_ID($STA_ID);
1091
+		if ($success !== false) {
1092
+			do_action(
1093
+				'AHEE__General_Settings_Admin_Page__delete_state__state_deleted',
1094
+				$CNT_ISO,
1095
+				$STA_ID,
1096
+				array('STA_abbrev' => $STA_abbrev)
1097
+			);
1098
+			EE_Error::add_success(__('The State was deleted successfully.', 'event_espresso'));
1099
+		}
1100
+		if (defined('DOING_AJAX')) {
1101
+			$notices                = EE_Error::get_notices(false, false);
1102
+			$notices['return_data'] = true;
1103
+			echo wp_json_encode($notices);
1104
+			die();
1105
+		} else {
1106
+			$this->_redirect_after_action(
1107
+				$success,
1108
+				'State',
1109
+				'deleted',
1110
+				array('action' => 'country_settings')
1111
+			);
1112
+		}
1113
+	}
1114
+
1115
+
1116
+	/**
1117
+	 *        _update_country_settings
1118
+	 *
1119
+	 * @access    protected
1120
+	 * @return void
1121
+	 * @throws EE_Error
1122
+	 */
1123
+	protected function _update_country_settings()
1124
+	{
1125
+		// grab the country ISO code
1126
+		$CNT_ISO = isset($this->_req_data['country'])
1127
+			? strtoupper(sanitize_text_field($this->_req_data['country']))
1128
+			: false;
1129
+		if (! $CNT_ISO) {
1130
+			EE_Error::add_error(
1131
+				__('No Country ISO code or an invalid Country ISO code was received.', 'event_espresso'),
1132
+				__FILE__,
1133
+				__FUNCTION__,
1134
+				__LINE__
1135
+			);
1136
+
1137
+			return;
1138
+		}
1139
+		$cols_n_values                    = array();
1140
+		$cols_n_values['CNT_ISO3']        = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_ISO3'])
1141
+			? strtoupper(sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_ISO3']))
1142
+			: false;
1143
+		$cols_n_values['RGN_ID']          = isset($this->_req_data['cntry'][$CNT_ISO]['RGN_ID'])
1144
+			? absint($this->_req_data['cntry'][$CNT_ISO]['RGN_ID'])
1145
+			: null;
1146
+		$cols_n_values['CNT_name']        = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_name'])
1147
+			? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_name'])
1148
+			: null;
1149
+		$cols_n_values['CNT_cur_code']    = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_code'])
1150
+			? strtoupper(sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_code']))
1151
+			: 'USD';
1152
+		$cols_n_values['CNT_cur_single']  = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_single'])
1153
+			? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_single'])
1154
+			: 'dollar';
1155
+		$cols_n_values['CNT_cur_plural']  = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_plural'])
1156
+			? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_plural'])
1157
+			: 'dollars';
1158
+		$cols_n_values['CNT_cur_sign']    = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_sign'])
1159
+			? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_sign'])
1160
+			: '$';
1161
+		$cols_n_values['CNT_cur_sign_b4'] = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_sign_b4'])
1162
+			? absint($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_sign_b4'])
1163
+			: true;
1164
+		$cols_n_values['CNT_cur_dec_plc'] = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_dec_plc'])
1165
+			? absint($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_dec_plc'])
1166
+			: 2;
1167
+		$cols_n_values['CNT_cur_dec_mrk'] = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_dec_mrk'])
1168
+			? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_dec_mrk'])
1169
+			: '.';
1170
+		$cols_n_values['CNT_cur_thsnds']  = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_thsnds'])
1171
+			? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_cur_thsnds'])
1172
+			: ',';
1173
+		$cols_n_values['CNT_tel_code']    = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_tel_code'])
1174
+			? sanitize_text_field($this->_req_data['cntry'][$CNT_ISO]['CNT_tel_code'])
1175
+			: null;
1176
+		$cols_n_values['CNT_is_EU']       = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_is_EU'])
1177
+			? absint($this->_req_data['cntry'][$CNT_ISO]['CNT_is_EU'])
1178
+			: false;
1179
+		$cols_n_values['CNT_active']      = isset($this->_req_data['cntry'][$CNT_ISO]['CNT_active'])
1180
+			? absint($this->_req_data['cntry'][$CNT_ISO]['CNT_active'])
1181
+			: false;
1182
+		// allow filtering of country data
1183
+		$cols_n_values = apply_filters(
1184
+			'FHEE__General_Settings_Admin_Page___update_country_settings__cols_n_values',
1185
+			$cols_n_values
1186
+		);
1187
+
1188
+		// where values
1189
+		$where_cols_n_values = array(array('CNT_ISO' => $CNT_ISO));
1190
+		// run the update
1191
+		$success = EEM_Country::instance()->update($cols_n_values, $where_cols_n_values);
1192
+
1193
+		if (isset($this->_req_data['states']) && is_array($this->_req_data['states']) && $success !== false) {
1194
+			// allow filtering of states data
1195
+			$states = apply_filters(
1196
+				'FHEE__General_Settings_Admin_Page___update_country_settings__states',
1197
+				$this->_req_data['states']
1198
+			);
1199
+
1200
+			// loop thru state data ( looks like : states[75][STA_name] )
1201
+			foreach ($states as $STA_ID => $state) {
1202
+				$cols_n_values = array(
1203
+					'CNT_ISO'    => $CNT_ISO,
1204
+					'STA_abbrev' => sanitize_text_field($state['STA_abbrev']),
1205
+					'STA_name'   => sanitize_text_field($state['STA_name']),
1206
+					'STA_active' => (bool)absint($state['STA_active']),
1207
+				);
1208
+				// where values
1209
+				$where_cols_n_values = array(array('STA_ID' => $STA_ID));
1210
+				// run the update
1211
+				$success = EEM_State::instance()->update($cols_n_values, $where_cols_n_values);
1212
+				if ($success !== false) {
1213
+					do_action(
1214
+						'AHEE__General_Settings_Admin_Page__update_country_settings__state_saved',
1215
+						$CNT_ISO,
1216
+						$STA_ID,
1217
+						$cols_n_values
1218
+					);
1219
+				}
1220
+			}
1221
+		}
1222
+		// check if country being edited matches org option country, and if so, then  update EE_Config with new settings
1223
+		if (isset(EE_Registry::instance()->CFG->organization->CNT_ISO)
1224
+			&& $CNT_ISO == EE_Registry::instance()->CFG->organization->CNT_ISO
1225
+		) {
1226
+			EE_Registry::instance()->CFG->currency = new EE_Currency_Config($CNT_ISO);
1227
+			EE_Registry::instance()->CFG->update_espresso_config();
1228
+		}
1229
+
1230
+		if ($success !== false) {
1231
+			EE_Error::add_success(
1232
+				esc_html__('Country Settings updated successfully.', 'event_espresso')
1233
+			);
1234
+		}
1235
+		$this->_redirect_after_action(
1236
+			$success,
1237
+			'',
1238
+			'',
1239
+			array('action' => 'country_settings', 'country' => $CNT_ISO),
1240
+			true
1241
+		);
1242
+	}
1243
+
1244
+
1245
+	/**
1246
+	 *        form_form_field_label_wrap
1247
+	 *
1248
+	 * @access        public
1249
+	 * @param        string $label
1250
+	 * @return        string
1251
+	 */
1252
+	public function country_form_field_label_wrap($label, $required_text)
1253
+	{
1254
+		return '
1255 1255
 			<tr>
1256 1256
 				<th>
1257 1257
 					' . $label . '
1258 1258
 				</th>';
1259
-    }
1260
-
1261
-
1262
-    /**
1263
-     *        form_form_field_input__wrap
1264
-     *
1265
-     * @access        public
1266
-     * @param        string $label
1267
-     * @return        string
1268
-     */
1269
-    public function country_form_field_input__wrap($input, $label)
1270
-    {
1271
-        return '
1259
+	}
1260
+
1261
+
1262
+	/**
1263
+	 *        form_form_field_input__wrap
1264
+	 *
1265
+	 * @access        public
1266
+	 * @param        string $label
1267
+	 * @return        string
1268
+	 */
1269
+	public function country_form_field_input__wrap($input, $label)
1270
+	{
1271
+		return '
1272 1272
 				<td class="general-settings-country-input-td">
1273 1273
 					' . $input . '
1274 1274
 				</td>
1275 1275
 			</tr>';
1276
-    }
1277
-
1278
-
1279
-    /**
1280
-     *        form_form_field_label_wrap
1281
-     *
1282
-     * @access        public
1283
-     * @param        string $label
1284
-     * @param        string $required_text
1285
-     * @return        string
1286
-     */
1287
-    public function state_form_field_label_wrap($label, $required_text)
1288
-    {
1289
-        return $required_text;
1290
-    }
1291
-
1292
-
1293
-    /**
1294
-     *        form_form_field_input__wrap
1295
-     *
1296
-     * @access        public
1297
-     * @param        string $label
1298
-     * @return        string
1299
-     */
1300
-    public function state_form_field_input__wrap($input, $label)
1301
-    {
1302
-        return '
1276
+	}
1277
+
1278
+
1279
+	/**
1280
+	 *        form_form_field_label_wrap
1281
+	 *
1282
+	 * @access        public
1283
+	 * @param        string $label
1284
+	 * @param        string $required_text
1285
+	 * @return        string
1286
+	 */
1287
+	public function state_form_field_label_wrap($label, $required_text)
1288
+	{
1289
+		return $required_text;
1290
+	}
1291
+
1292
+
1293
+	/**
1294
+	 *        form_form_field_input__wrap
1295
+	 *
1296
+	 * @access        public
1297
+	 * @param        string $label
1298
+	 * @return        string
1299
+	 */
1300
+	public function state_form_field_input__wrap($input, $label)
1301
+	{
1302
+		return '
1303 1303
 				<td class="general-settings-country-state-input-td">
1304 1304
 					' . $input . '
1305 1305
 				</td>';
1306
-    }
1307
-
1308
-
1309
-    /***********/
1310
-
1311
-
1312
-    /**
1313
-     * displays edit and view links for critical EE pages
1314
-     *
1315
-     * @access public
1316
-     * @param int $ee_page_id
1317
-     * @return string
1318
-     */
1319
-    public static function edit_view_links($ee_page_id)
1320
-    {
1321
-        $links = '<a href="'
1322
-                 . add_query_arg(
1323
-                     array('post' => $ee_page_id, 'action' => 'edit'),
1324
-                     admin_url('post.php')
1325
-                 )
1326
-                 . '" >'
1327
-                 . __('Edit', 'event_espresso')
1328
-                 . '</a>';
1329
-        $links .= ' &nbsp;|&nbsp; ';
1330
-        $links .= '<a href="' . get_permalink($ee_page_id) . '" >' . __('View', 'event_espresso') . '</a>';
1331
-
1332
-        return $links;
1333
-    }
1334
-
1335
-
1336
-    /**
1337
-     * displays page and shortcode status for critical EE pages
1338
-     *
1339
-     * @param WP page object $ee_page
1340
-     * @return string
1341
-     */
1342
-    public static function page_and_shortcode_status($ee_page, $shortcode)
1343
-    {
1344
-
1345
-        // page status
1346
-        if (isset($ee_page->post_status) && $ee_page->post_status == 'publish') {
1347
-            $pg_colour = 'green';
1348
-            $pg_status = sprintf(__('Page%sStatus%sOK', 'event_espresso'), '&nbsp;', '&nbsp;');
1349
-        } else {
1350
-            $pg_colour = 'red';
1351
-            $pg_status = sprintf(__('Page%sVisibility%sProblem', 'event_espresso'), '&nbsp;', '&nbsp;');
1352
-        }
1353
-
1354
-        // shortcode status
1355
-        if (isset($ee_page->post_content) && strpos($ee_page->post_content, $shortcode) !== false) {
1356
-            $sc_colour = 'green';
1357
-            $sc_status = sprintf(__('Shortcode%sOK', 'event_espresso'), '&nbsp;');
1358
-        } else {
1359
-            $sc_colour = 'red';
1360
-            $sc_status = sprintf(__('Shortcode%sProblem', 'event_espresso'), '&nbsp;');
1361
-        }
1362
-
1363
-        return '<span style="color:' . $pg_colour . '; margin-right:2em;"><strong>'
1364
-               . $pg_status
1365
-               . '</strong></span><span style="color:' . $sc_colour . '"><strong>' . $sc_status . '</strong></span>';
1366
-    }
1367
-
1368
-
1369
-    /**
1370
-     * generates a dropdown of all parent pages - copied from WP core
1371
-     *
1372
-     * @param int $default
1373
-     * @param int $parent
1374
-     * @param int $level
1375
-     */
1376
-    public static function page_settings_dropdown($default = 0, $parent = 0, $level = 0)
1377
-    {
1378
-        global $wpdb;
1379
-        $items = $wpdb->get_results(
1380
-            $wpdb->prepare(
1381
-                "SELECT ID, post_parent, post_title FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'page' AND post_status != 'trash' ORDER BY menu_order",
1382
-                $parent
1383
-            )
1384
-        );
1385
-
1386
-        if ($items) {
1387
-            foreach ($items as $item) {
1388
-                $pad = str_repeat('&nbsp;', $level * 3);
1389
-                if ($item->ID == $default) {
1390
-                    $current = ' selected="selected"';
1391
-                } else {
1392
-                    $current = '';
1393
-                }
1394
-
1395
-                echo "\n\t<option class='level-$level' value='$item->ID'$current>$pad "
1396
-                     . esc_html($item->post_title)
1397
-                     . "</option>";
1398
-                parent_dropdown($default, $item->ID, $level + 1);
1399
-            }
1400
-        }
1401
-    }
1306
+	}
1307
+
1308
+
1309
+	/***********/
1310
+
1311
+
1312
+	/**
1313
+	 * displays edit and view links for critical EE pages
1314
+	 *
1315
+	 * @access public
1316
+	 * @param int $ee_page_id
1317
+	 * @return string
1318
+	 */
1319
+	public static function edit_view_links($ee_page_id)
1320
+	{
1321
+		$links = '<a href="'
1322
+				 . add_query_arg(
1323
+					 array('post' => $ee_page_id, 'action' => 'edit'),
1324
+					 admin_url('post.php')
1325
+				 )
1326
+				 . '" >'
1327
+				 . __('Edit', 'event_espresso')
1328
+				 . '</a>';
1329
+		$links .= ' &nbsp;|&nbsp; ';
1330
+		$links .= '<a href="' . get_permalink($ee_page_id) . '" >' . __('View', 'event_espresso') . '</a>';
1331
+
1332
+		return $links;
1333
+	}
1334
+
1335
+
1336
+	/**
1337
+	 * displays page and shortcode status for critical EE pages
1338
+	 *
1339
+	 * @param WP page object $ee_page
1340
+	 * @return string
1341
+	 */
1342
+	public static function page_and_shortcode_status($ee_page, $shortcode)
1343
+	{
1344
+
1345
+		// page status
1346
+		if (isset($ee_page->post_status) && $ee_page->post_status == 'publish') {
1347
+			$pg_colour = 'green';
1348
+			$pg_status = sprintf(__('Page%sStatus%sOK', 'event_espresso'), '&nbsp;', '&nbsp;');
1349
+		} else {
1350
+			$pg_colour = 'red';
1351
+			$pg_status = sprintf(__('Page%sVisibility%sProblem', 'event_espresso'), '&nbsp;', '&nbsp;');
1352
+		}
1353
+
1354
+		// shortcode status
1355
+		if (isset($ee_page->post_content) && strpos($ee_page->post_content, $shortcode) !== false) {
1356
+			$sc_colour = 'green';
1357
+			$sc_status = sprintf(__('Shortcode%sOK', 'event_espresso'), '&nbsp;');
1358
+		} else {
1359
+			$sc_colour = 'red';
1360
+			$sc_status = sprintf(__('Shortcode%sProblem', 'event_espresso'), '&nbsp;');
1361
+		}
1362
+
1363
+		return '<span style="color:' . $pg_colour . '; margin-right:2em;"><strong>'
1364
+			   . $pg_status
1365
+			   . '</strong></span><span style="color:' . $sc_colour . '"><strong>' . $sc_status . '</strong></span>';
1366
+	}
1367
+
1368
+
1369
+	/**
1370
+	 * generates a dropdown of all parent pages - copied from WP core
1371
+	 *
1372
+	 * @param int $default
1373
+	 * @param int $parent
1374
+	 * @param int $level
1375
+	 */
1376
+	public static function page_settings_dropdown($default = 0, $parent = 0, $level = 0)
1377
+	{
1378
+		global $wpdb;
1379
+		$items = $wpdb->get_results(
1380
+			$wpdb->prepare(
1381
+				"SELECT ID, post_parent, post_title FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'page' AND post_status != 'trash' ORDER BY menu_order",
1382
+				$parent
1383
+			)
1384
+		);
1385
+
1386
+		if ($items) {
1387
+			foreach ($items as $item) {
1388
+				$pad = str_repeat('&nbsp;', $level * 3);
1389
+				if ($item->ID == $default) {
1390
+					$current = ' selected="selected"';
1391
+				} else {
1392
+					$current = '';
1393
+				}
1394
+
1395
+				echo "\n\t<option class='level-$level' value='$item->ID'$current>$pad "
1396
+					 . esc_html($item->post_title)
1397
+					 . "</option>";
1398
+				parent_dropdown($default, $item->ID, $level + 1);
1399
+			}
1400
+		}
1401
+	}
1402 1402
 }
Please login to merge, or discard this patch.
Spacing   +51 added lines, -51 removed lines patch added patch discarded remove patch
@@ -232,11 +232,11 @@  discard block
 block discarded – undo
232 232
             'An error occurred! Your request may have been processed, but a valid response from the server was not received. Please refresh the page and try again.',
233 233
             'event_espresso'
234 234
         );
235
-        EE_Registry::$i18n_js_strings['error_occurred']          = __(
235
+        EE_Registry::$i18n_js_strings['error_occurred'] = __(
236 236
             'An error occurred! Please refresh the page and try again.',
237 237
             'event_espresso'
238 238
         );
239
-        EE_Registry::$i18n_js_strings['confirm_delete_state']    = __(
239
+        EE_Registry::$i18n_js_strings['confirm_delete_state'] = __(
240 240
             'Are you sure you want to delete this State / Province?',
241 241
             'event_espresso'
242 242
         );
@@ -268,12 +268,12 @@  discard block
 block discarded – undo
268 268
         wp_enqueue_script('thickbox');
269 269
         wp_register_script(
270 270
             'organization_settings',
271
-            GEN_SET_ASSETS_URL . 'your_organization_settings.js',
271
+            GEN_SET_ASSETS_URL.'your_organization_settings.js',
272 272
             array('jquery', 'media-upload', 'thickbox'),
273 273
             EVENT_ESPRESSO_VERSION,
274 274
             true
275 275
         );
276
-        wp_register_style('organization-css', GEN_SET_ASSETS_URL . 'organization.css', array(), EVENT_ESPRESSO_VERSION);
276
+        wp_register_style('organization-css', GEN_SET_ASSETS_URL.'organization.css', array(), EVENT_ESPRESSO_VERSION);
277 277
         wp_enqueue_script('organization_settings');
278 278
         wp_enqueue_style('organization-css');
279 279
         $confirm_image_delete = array(
@@ -294,12 +294,12 @@  discard block
 block discarded – undo
294 294
         //scripts
295 295
         wp_register_script(
296 296
             'gen_settings_countries',
297
-            GEN_SET_ASSETS_URL . 'gen_settings_countries.js',
297
+            GEN_SET_ASSETS_URL.'gen_settings_countries.js',
298 298
             array('ee_admin_js'),
299 299
             EVENT_ESPRESSO_VERSION,
300 300
             true
301 301
         );
302
-        wp_register_style('organization-css', GEN_SET_ASSETS_URL . 'organization.css', array(), EVENT_ESPRESSO_VERSION);
302
+        wp_register_style('organization-css', GEN_SET_ASSETS_URL.'organization.css', array(), EVENT_ESPRESSO_VERSION);
303 303
         wp_enqueue_script('gen_settings_countries');
304 304
         wp_enqueue_style('organization-css');
305 305
     }
@@ -345,7 +345,7 @@  discard block
 block discarded – undo
345 345
         $this->_set_add_edit_form_tags('update_espresso_page_settings');
346 346
         $this->_set_publish_post_box_vars(null, false, false, null, false);
347 347
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
348
-            GEN_SET_TEMPLATE_PATH . 'espresso_page_settings.template.php',
348
+            GEN_SET_TEMPLATE_PATH.'espresso_page_settings.template.php',
349 349
             $this->_template_args,
350 350
             true
351 351
         );
@@ -377,7 +377,7 @@  discard block
 block discarded – undo
377 377
             EE_Registry::instance()->CFG->core,
378 378
             $this->_req_data
379 379
         );
380
-        $what                              = __('Critical Pages & Shortcodes', 'event_espresso');
380
+        $what = __('Critical Pages & Shortcodes', 'event_espresso');
381 381
         $this->_redirect_after_action(
382 382
             $this->_update_espresso_configuration(
383 383
                 $what,
@@ -407,7 +407,7 @@  discard block
 block discarded – undo
407 407
     protected function _your_organization_settings()
408 408
     {
409 409
 
410
-        $this->_template_args['site_license_key']       = isset(
410
+        $this->_template_args['site_license_key'] = isset(
411 411
             EE_Registry::instance()->NET_CFG->core->site_license_key
412 412
         )
413 413
             ? EE_Registry::instance()->NET_CFG->core->get_pretty('site_license_key')
@@ -511,7 +511,7 @@  discard block
 block discarded – undo
511 511
         add_filter('FHEE__EEH_Form_Fields__input_html', array($this, 'country_form_field_input__wrap'), 10, 2);
512 512
 
513 513
         //PUE verification stuff
514
-        $ver_option_key                                    = 'puvererr_' . basename(EE_PLUGIN_BASENAME);
514
+        $ver_option_key                                    = 'puvererr_'.basename(EE_PLUGIN_BASENAME);
515 515
         $verify_fail                                       = get_option($ver_option_key);
516 516
         $this->_template_args['site_license_key_verified'] = $verify_fail
517 517
                                                              || ! empty($verify_fail)
@@ -524,7 +524,7 @@  discard block
 block discarded – undo
524 524
         $this->_set_add_edit_form_tags('update_your_organization_settings');
525 525
         $this->_set_publish_post_box_vars(null, false, false, null, false);
526 526
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
527
-            GEN_SET_TEMPLATE_PATH . 'your_organization_settings.template.php',
527
+            GEN_SET_TEMPLATE_PATH.'your_organization_settings.template.php',
528 528
             $this->_template_args,
529 529
             true
530 530
         );
@@ -735,7 +735,7 @@  discard block
 block discarded – undo
735 735
         $this->_set_add_edit_form_tags('update_country_settings');
736 736
         $this->_set_publish_post_box_vars(null, false, false, null, false);
737 737
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
738
-            GEN_SET_TEMPLATE_PATH . 'countries_settings.template.php',
738
+            GEN_SET_TEMPLATE_PATH.'countries_settings.template.php',
739 739
             $this->_template_args,
740 740
             true
741 741
         );
@@ -757,7 +757,7 @@  discard block
 block discarded – undo
757 757
         $CNT_ISO = isset($this->_req_data['country'])
758 758
             ? strtoupper(sanitize_text_field($this->_req_data['country']))
759 759
             : $CNT_ISO;
760
-        if (! $CNT_ISO) {
760
+        if ( ! $CNT_ISO) {
761 761
             return '';
762 762
         }
763 763
 
@@ -768,65 +768,65 @@  discard block
 block discarded – undo
768 768
         add_filter('FHEE__EEH_Form_Fields__input_html', array($this, 'country_form_field_input__wrap'), 10, 2);
769 769
         $country = EEM_Country::instance()->get_one_by_ID($CNT_ISO);
770 770
 
771
-        $country_input_types            = array(
771
+        $country_input_types = array(
772 772
             'CNT_active'      => array(
773 773
                 'type'             => 'RADIO_BTN',
774
-                'input_name'       => 'cntry[' . $CNT_ISO . ']',
774
+                'input_name'       => 'cntry['.$CNT_ISO.']',
775 775
                 'class'            => '',
776 776
                 'options'          => $this->_yes_no_values,
777 777
                 'use_desc_4_label' => true,
778 778
             ),
779 779
             'CNT_ISO'         => array(
780 780
                 'type'       => 'TEXT',
781
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
781
+                'input_name' => 'cntry['.$CNT_ISO.']',
782 782
                 'class'      => 'small-text',
783 783
             ),
784 784
             'CNT_ISO3'        => array(
785 785
                 'type'       => 'TEXT',
786
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
786
+                'input_name' => 'cntry['.$CNT_ISO.']',
787 787
                 'class'      => 'small-text',
788 788
             ),
789 789
             'RGN_ID'          => array(
790 790
                 'type'       => 'TEXT',
791
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
791
+                'input_name' => 'cntry['.$CNT_ISO.']',
792 792
                 'class'      => 'small-text',
793 793
             ),
794 794
             'CNT_name'        => array(
795 795
                 'type'       => 'TEXT',
796
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
796
+                'input_name' => 'cntry['.$CNT_ISO.']',
797 797
                 'class'      => 'regular-text',
798 798
             ),
799 799
             'CNT_cur_code'    => array(
800 800
                 'type'       => 'TEXT',
801
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
801
+                'input_name' => 'cntry['.$CNT_ISO.']',
802 802
                 'class'      => 'small-text',
803 803
             ),
804 804
             'CNT_cur_single'  => array(
805 805
                 'type'       => 'TEXT',
806
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
806
+                'input_name' => 'cntry['.$CNT_ISO.']',
807 807
                 'class'      => 'medium-text',
808 808
             ),
809 809
             'CNT_cur_plural'  => array(
810 810
                 'type'       => 'TEXT',
811
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
811
+                'input_name' => 'cntry['.$CNT_ISO.']',
812 812
                 'class'      => 'medium-text',
813 813
             ),
814 814
             'CNT_cur_sign'    => array(
815 815
                 'type'         => 'TEXT',
816
-                'input_name'   => 'cntry[' . $CNT_ISO . ']',
816
+                'input_name'   => 'cntry['.$CNT_ISO.']',
817 817
                 'class'        => 'small-text',
818 818
                 'htmlentities' => false,
819 819
             ),
820 820
             'CNT_cur_sign_b4' => array(
821 821
                 'type'             => 'RADIO_BTN',
822
-                'input_name'       => 'cntry[' . $CNT_ISO . ']',
822
+                'input_name'       => 'cntry['.$CNT_ISO.']',
823 823
                 'class'            => '',
824 824
                 'options'          => $this->_yes_no_values,
825 825
                 'use_desc_4_label' => true,
826 826
             ),
827 827
             'CNT_cur_dec_plc' => array(
828 828
                 'type'       => 'RADIO_BTN',
829
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
829
+                'input_name' => 'cntry['.$CNT_ISO.']',
830 830
                 'class'      => '',
831 831
                 'options'    => array(
832 832
                     array('id' => 0, 'text' => ''),
@@ -837,7 +837,7 @@  discard block
 block discarded – undo
837 837
             ),
838 838
             'CNT_cur_dec_mrk' => array(
839 839
                 'type'             => 'RADIO_BTN',
840
-                'input_name'       => 'cntry[' . $CNT_ISO . ']',
840
+                'input_name'       => 'cntry['.$CNT_ISO.']',
841 841
                 'class'            => '',
842 842
                 'options'          => array(
843 843
                     array(
@@ -850,7 +850,7 @@  discard block
 block discarded – undo
850 850
             ),
851 851
             'CNT_cur_thsnds'  => array(
852 852
                 'type'             => 'RADIO_BTN',
853
-                'input_name'       => 'cntry[' . $CNT_ISO . ']',
853
+                'input_name'       => 'cntry['.$CNT_ISO.']',
854 854
                 'class'            => '',
855 855
                 'options'          => array(
856 856
                     array(
@@ -863,12 +863,12 @@  discard block
 block discarded – undo
863 863
             ),
864 864
             'CNT_tel_code'    => array(
865 865
                 'type'       => 'TEXT',
866
-                'input_name' => 'cntry[' . $CNT_ISO . ']',
866
+                'input_name' => 'cntry['.$CNT_ISO.']',
867 867
                 'class'      => 'small-text',
868 868
             ),
869 869
             'CNT_is_EU'       => array(
870 870
                 'type'             => 'RADIO_BTN',
871
-                'input_name'       => 'cntry[' . $CNT_ISO . ']',
871
+                'input_name'       => 'cntry['.$CNT_ISO.']',
872 872
                 'class'            => '',
873 873
                 'options'          => $this->_yes_no_values,
874 874
                 'use_desc_4_label' => true,
@@ -878,8 +878,8 @@  discard block
 block discarded – undo
878 878
             $country,
879 879
             $country_input_types
880 880
         );
881
-        $country_details_settings       = EEH_Template::display_template(
882
-            GEN_SET_TEMPLATE_PATH . 'country_details_settings.template.php',
881
+        $country_details_settings = EEH_Template::display_template(
882
+            GEN_SET_TEMPLATE_PATH.'country_details_settings.template.php',
883 883
             $this->_template_args,
884 884
             true
885 885
         );
@@ -911,7 +911,7 @@  discard block
 block discarded – undo
911 911
 
912 912
         $CNT_ISO = isset($this->_req_data['country']) ? sanitize_text_field($this->_req_data['country']) : $CNT_ISO;
913 913
 
914
-        if (! $CNT_ISO) {
914
+        if ( ! $CNT_ISO) {
915 915
             return '';
916 916
         }
917 917
         // for ajax
@@ -925,20 +925,20 @@  discard block
 block discarded – undo
925 925
             foreach ($states as $STA_ID => $state) {
926 926
                 if ($state instanceof EE_State) {
927 927
                     //STA_abbrev 	STA_name 	STA_active
928
-                    $state_input_types                                           = array(
928
+                    $state_input_types = array(
929 929
                         'STA_abbrev' => array(
930 930
                             'type'       => 'TEXT',
931
-                            'input_name' => 'states[' . $STA_ID . ']',
931
+                            'input_name' => 'states['.$STA_ID.']',
932 932
                             'class'      => 'mid-text',
933 933
                         ),
934 934
                         'STA_name'   => array(
935 935
                             'type'       => 'TEXT',
936
-                            'input_name' => 'states[' . $STA_ID . ']',
936
+                            'input_name' => 'states['.$STA_ID.']',
937 937
                             'class'      => 'regular-text',
938 938
                         ),
939 939
                         'STA_active' => array(
940 940
                             'type'             => 'RADIO_BTN',
941
-                            'input_name'       => 'states[' . $STA_ID . ']',
941
+                            'input_name'       => 'states['.$STA_ID.']',
942 942
                             'options'          => $this->_yes_no_values,
943 943
                             'use_desc_4_label' => true,
944 944
                         ),
@@ -948,7 +948,7 @@  discard block
 block discarded – undo
948 948
                             $state,
949 949
                             $state_input_types
950 950
                         );
951
-                    $query_args                                                  = array(
951
+                    $query_args = array(
952 952
                         'action'     => 'delete_state',
953 953
                         'STA_ID'     => $STA_ID,
954 954
                         'CNT_ISO'    => $CNT_ISO,
@@ -971,7 +971,7 @@  discard block
 block discarded – undo
971 971
         );
972 972
 
973 973
         $state_details_settings = EEH_Template::display_template(
974
-            GEN_SET_TEMPLATE_PATH . 'state_details_settings.template.php',
974
+            GEN_SET_TEMPLATE_PATH.'state_details_settings.template.php',
975 975
             $this->_template_args,
976 976
             true
977 977
         );
@@ -1005,7 +1005,7 @@  discard block
 block discarded – undo
1005 1005
         $CNT_ISO = isset($this->_req_data['CNT_ISO'])
1006 1006
             ? strtoupper(sanitize_text_field($this->_req_data['CNT_ISO']))
1007 1007
             : false;
1008
-        if (! $CNT_ISO) {
1008
+        if ( ! $CNT_ISO) {
1009 1009
             EE_Error::add_error(
1010 1010
                 __('No Country ISO code or an invalid Country ISO code was received.', 'event_espresso'),
1011 1011
                 __FILE__,
@@ -1017,7 +1017,7 @@  discard block
 block discarded – undo
1017 1017
         $STA_abbrev = isset($this->_req_data['STA_abbrev'])
1018 1018
             ? sanitize_text_field($this->_req_data['STA_abbrev'])
1019 1019
             : false;
1020
-        if (! $STA_abbrev) {
1020
+        if ( ! $STA_abbrev) {
1021 1021
             EE_Error::add_error(
1022 1022
                 __('No State ISO code or an invalid State ISO code was received.', 'event_espresso'),
1023 1023
                 __FILE__,
@@ -1029,7 +1029,7 @@  discard block
 block discarded – undo
1029 1029
         $STA_name = isset($this->_req_data['STA_name'])
1030 1030
             ? sanitize_text_field($this->_req_data['STA_name'])
1031 1031
             : false;
1032
-        if (! $STA_name) {
1032
+        if ( ! $STA_name) {
1033 1033
             EE_Error::add_error(
1034 1034
                 __('No State name or an invalid State name was received.', 'event_espresso'),
1035 1035
                 __FILE__,
@@ -1046,7 +1046,7 @@  discard block
 block discarded – undo
1046 1046
                 'STA_name'   => $STA_name,
1047 1047
                 'STA_active' => true,
1048 1048
             );
1049
-            $success       = EEM_State::instance()->insert($cols_n_values);
1049
+            $success = EEM_State::instance()->insert($cols_n_values);
1050 1050
             EE_Error::add_success(__('The State was added successfully.', 'event_espresso'));
1051 1051
         }
1052 1052
 
@@ -1077,7 +1077,7 @@  discard block
 block discarded – undo
1077 1077
         $STA_abbrev = isset($this->_req_data['STA_abbrev'])
1078 1078
             ? sanitize_text_field($this->_req_data['STA_abbrev'])
1079 1079
             : false;
1080
-        if (! $STA_ID) {
1080
+        if ( ! $STA_ID) {
1081 1081
             EE_Error::add_error(
1082 1082
                 __('No State ID or an invalid State ID was received.', 'event_espresso'),
1083 1083
                 __FILE__,
@@ -1126,7 +1126,7 @@  discard block
 block discarded – undo
1126 1126
         $CNT_ISO = isset($this->_req_data['country'])
1127 1127
             ? strtoupper(sanitize_text_field($this->_req_data['country']))
1128 1128
             : false;
1129
-        if (! $CNT_ISO) {
1129
+        if ( ! $CNT_ISO) {
1130 1130
             EE_Error::add_error(
1131 1131
                 __('No Country ISO code or an invalid Country ISO code was received.', 'event_espresso'),
1132 1132
                 __FILE__,
@@ -1203,7 +1203,7 @@  discard block
 block discarded – undo
1203 1203
                     'CNT_ISO'    => $CNT_ISO,
1204 1204
                     'STA_abbrev' => sanitize_text_field($state['STA_abbrev']),
1205 1205
                     'STA_name'   => sanitize_text_field($state['STA_name']),
1206
-                    'STA_active' => (bool)absint($state['STA_active']),
1206
+                    'STA_active' => (bool) absint($state['STA_active']),
1207 1207
                 );
1208 1208
                 // where values
1209 1209
                 $where_cols_n_values = array(array('STA_ID' => $STA_ID));
@@ -1254,7 +1254,7 @@  discard block
 block discarded – undo
1254 1254
         return '
1255 1255
 			<tr>
1256 1256
 				<th>
1257
-					' . $label . '
1257
+					' . $label.'
1258 1258
 				</th>';
1259 1259
     }
1260 1260
 
@@ -1270,7 +1270,7 @@  discard block
 block discarded – undo
1270 1270
     {
1271 1271
         return '
1272 1272
 				<td class="general-settings-country-input-td">
1273
-					' . $input . '
1273
+					' . $input.'
1274 1274
 				</td>
1275 1275
 			</tr>';
1276 1276
     }
@@ -1301,7 +1301,7 @@  discard block
 block discarded – undo
1301 1301
     {
1302 1302
         return '
1303 1303
 				<td class="general-settings-country-state-input-td">
1304
-					' . $input . '
1304
+					' . $input.'
1305 1305
 				</td>';
1306 1306
     }
1307 1307
 
@@ -1327,7 +1327,7 @@  discard block
 block discarded – undo
1327 1327
                  . __('Edit', 'event_espresso')
1328 1328
                  . '</a>';
1329 1329
         $links .= ' &nbsp;|&nbsp; ';
1330
-        $links .= '<a href="' . get_permalink($ee_page_id) . '" >' . __('View', 'event_espresso') . '</a>';
1330
+        $links .= '<a href="'.get_permalink($ee_page_id).'" >'.__('View', 'event_espresso').'</a>';
1331 1331
 
1332 1332
         return $links;
1333 1333
     }
@@ -1360,9 +1360,9 @@  discard block
 block discarded – undo
1360 1360
             $sc_status = sprintf(__('Shortcode%sProblem', 'event_espresso'), '&nbsp;');
1361 1361
         }
1362 1362
 
1363
-        return '<span style="color:' . $pg_colour . '; margin-right:2em;"><strong>'
1363
+        return '<span style="color:'.$pg_colour.'; margin-right:2em;"><strong>'
1364 1364
                . $pg_status
1365
-               . '</strong></span><span style="color:' . $sc_colour . '"><strong>' . $sc_status . '</strong></span>';
1365
+               . '</strong></span><span style="color:'.$sc_colour.'"><strong>'.$sc_status.'</strong></span>';
1366 1366
     }
1367 1367
 
1368 1368
 
Please login to merge, or discard this patch.
core/admin/EE_Admin_List_Table.core.php 2 patches
Indentation   +834 added lines, -834 removed lines patch added patch discarded remove patch
@@ -3,7 +3,7 @@  discard block
 block discarded – undo
3 3
 defined('EVENT_ESPRESSO_VERSION') || exit('No direct access allowed.');
4 4
 
5 5
 if (! class_exists('WP_List_Table')) {
6
-    require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
6
+	require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
7 7
 }
8 8
 
9 9
 
@@ -22,847 +22,847 @@  discard block
 block discarded – undo
22 22
 abstract class EE_Admin_List_Table extends WP_List_Table
23 23
 {
24 24
 
25
-    /**
26
-     * holds the data that will be processed for the table
27
-     *
28
-     * @var array $_data
29
-     */
30
-    protected $_data;
31
-
32
-
33
-    /**
34
-     * This holds the value of all the data available for the given view (for all pages).
35
-     *
36
-     * @var int $_all_data_count
37
-     */
38
-    protected $_all_data_count;
39
-
40
-
41
-    /**
42
-     * Will contain the count of trashed items for the view label.
43
-     *
44
-     * @var int $_trashed_count
45
-     */
46
-    protected $_trashed_count;
47
-
48
-
49
-    /**
50
-     * This is what will be referenced as the slug for the current screen
51
-     *
52
-     * @var string $_screen
53
-     */
54
-    protected $_screen;
55
-
56
-
57
-    /**
58
-     * this is the EE_Admin_Page object
59
-     *
60
-     * @var EE_Admin_Page $_admin_page
61
-     */
62
-    protected $_admin_page;
63
-
64
-
65
-    /**
66
-     * The current view
67
-     *
68
-     * @var string $_view
69
-     */
70
-    protected $_view;
71
-
72
-
73
-    /**
74
-     * array of possible views for this table
75
-     *
76
-     * @var array $_views
77
-     */
78
-    protected $_views;
79
-
80
-
81
-    /**
82
-     * An array of key => value pairs containing information about the current table
83
-     * array(
84
-     *        'plural' => 'plural label',
85
-     *        'singular' => 'singular label',
86
-     *        'ajax' => false, //whether to use ajax or not
87
-     *        'screen' => null, //string used to reference what screen this is
88
-     *        (WP_List_table converts to screen object)
89
-     * )
90
-     *
91
-     * @var array $_wp_list_args
92
-     */
93
-    protected $_wp_list_args;
94
-
95
-    /**
96
-     * an array of column names
97
-     * array(
98
-     *    'internal-name' => 'Title'
99
-     * )
100
-     *
101
-     * @var array $_columns
102
-     */
103
-    protected $_columns;
104
-
105
-    /**
106
-     * An array of sortable columns
107
-     * array(
108
-     *    'internal-name' => 'orderby' //or
109
-     *    'internal-name' => array( 'orderby', true )
110
-     * )
111
-     *
112
-     * @var array $_sortable_columns
113
-     */
114
-    protected $_sortable_columns;
115
-
116
-    /**
117
-     * callback method used to perform AJAX row reordering
118
-     *
119
-     * @var string $_ajax_sorting_callback
120
-     */
121
-    protected $_ajax_sorting_callback;
122
-
123
-    /**
124
-     * An array of hidden columns (if needed)
125
-     * array('internal-name', 'internal-name')
126
-     *
127
-     * @var array $_hidden_columns
128
-     */
129
-    protected $_hidden_columns;
130
-
131
-    /**
132
-     * holds the per_page value
133
-     *
134
-     * @var int $_per_page
135
-     */
136
-    protected $_per_page;
137
-
138
-    /**
139
-     * holds what page number is currently being viewed
140
-     *
141
-     * @var int $_current_page
142
-     */
143
-    protected $_current_page;
144
-
145
-    /**
146
-     * the reference string for the nonce_action
147
-     *
148
-     * @var string $_nonce_action_ref
149
-     */
150
-    protected $_nonce_action_ref;
151
-
152
-    /**
153
-     * property to hold incoming request data (as set by the admin_page_core)
154
-     *
155
-     * @var array $_req_data
156
-     */
157
-    protected $_req_data;
158
-
159
-
160
-    /**
161
-     * yes / no array for admin form fields
162
-     *
163
-     * @var array $_yes_no
164
-     */
165
-    protected $_yes_no = array();
166
-
167
-    /**
168
-     * Array describing buttons that should appear at the bottom of the page
169
-     * Keys are strings that represent the button's function (specifically a key in _labels['buttons']),
170
-     * and the values are another array with the following keys
171
-     * array(
172
-     *    'route' => 'page_route',
173
-     *    'extra_request' => array('evt_id' => 1 ); //extra request vars that need to be included in the button.
174
-     * )
175
-     *
176
-     * @var array $_bottom_buttons
177
-     */
178
-    protected $_bottom_buttons = array();
179
-
180
-
181
-    /**
182
-     * Used to indicate what should be the primary column for the list table.
183
-     * If not present then falls back to what WP calculates
184
-     * as the primary column.
185
-     *
186
-     * @type string $_primary_column
187
-     */
188
-    protected $_primary_column = '';
189
-
190
-
191
-    /**
192
-     * Used to indicate whether the table has a checkbox column or not.
193
-     *
194
-     * @type bool $_has_checkbox_column
195
-     */
196
-    protected $_has_checkbox_column = false;
197
-
198
-
199
-    /**
200
-     * @param \EE_Admin_Page $admin_page we use this for obtaining everything we need in the list table
201
-     */
202
-    public function __construct(EE_Admin_Page $admin_page)
203
-    {
204
-        $this->_admin_page   = $admin_page;
205
-        $this->_req_data     = $this->_admin_page->get_request_data();
206
-        $this->_view         = $this->_admin_page->get_view();
207
-        $this->_views        = empty($this->_views) ? $this->_admin_page->get_list_table_view_RLs() : $this->_views;
208
-        $this->_current_page = $this->get_pagenum();
209
-        $this->_screen       = $this->_admin_page->get_current_page() . '_' . $this->_admin_page->get_current_view();
210
-        $this->_yes_no       = array(__('No', 'event_espresso'), __('Yes', 'event_espresso'));
211
-
212
-        $this->_per_page = $this->get_items_per_page($this->_screen . '_per_page', 10);
213
-
214
-        $this->_setup_data();
215
-        $this->_add_view_counts();
216
-
217
-        $this->_nonce_action_ref = $this->_view;
218
-
219
-        $this->_set_properties();
220
-
221
-        //set primary column
222
-        add_filter('list_table_primary_column', array($this, 'set_primary_column'));
223
-
224
-        //set parent defaults
225
-        parent::__construct($this->_wp_list_args);
226
-
227
-        $this->prepare_items();
228
-    }
229
-
230
-
231
-    /**
232
-     * _setup_data
233
-     * this method is used to setup the $_data, $_all_data_count, and _per_page properties
234
-     *
235
-     * @uses $this->_admin_page
236
-     * @return void
237
-     */
238
-    abstract protected function _setup_data();
239
-
240
-
241
-    /**
242
-     * set the properties that this class needs to be able to execute wp_list_table properly
243
-     * properties set:
244
-     * _wp_list_args = what the arguments required for the parent _wp_list_table.
245
-     * _columns = set the columns in an array.
246
-     * _sortable_columns = columns that are sortable (array).
247
-     * _hidden_columns = columns that are hidden (array)
248
-     * _default_orderby = the default orderby for sorting.
249
-     *
250
-     * @abstract
251
-     * @access protected
252
-     * @return void
253
-     */
254
-    abstract protected function _set_properties();
255
-
256
-
257
-    /**
258
-     * _get_table_filters
259
-     * We use this to assemble and return any filters that are associated with this table that help further refine what
260
-     * get's shown in the table.
261
-     *
262
-     * @abstract
263
-     * @access protected
264
-     * @return string
265
-     */
266
-    abstract protected function _get_table_filters();
267
-
268
-
269
-    /**
270
-     * this is a method that child class will do to add counts to the views array so when views are displayed the
271
-     * counts of the views is accurate.
272
-     *
273
-     * @abstract
274
-     * @access protected
275
-     * @return void
276
-     */
277
-    abstract protected function _add_view_counts();
278
-
279
-
280
-    /**
281
-     * _get_hidden_fields
282
-     * returns a html string of hidden fields so if any table filters are used the current view will be respected.
283
-     *
284
-     * @return string
285
-     */
286
-    protected function _get_hidden_fields()
287
-    {
288
-        $action = isset($this->_req_data['route']) ? $this->_req_data['route'] : '';
289
-        $action = empty($action) && isset($this->_req_data['action']) ? $this->_req_data['action'] : $action;
290
-        //if action is STILL empty, then we set it to default
291
-        $action = empty($action) ? 'default' : $action;
292
-        $field  = '<input type="hidden" name="page" value="' . $this->_req_data['page'] . '" />' . "\n";
293
-        $field  .= '<input type="hidden" name="route" value="' . $action . '" />' . "\n";/**/
294
-        $field  .= '<input type="hidden" name="perpage" value="' . $this->_per_page . '" />' . "\n";
295
-
296
-        $bulk_actions = $this->_get_bulk_actions();
297
-        foreach ($bulk_actions as $bulk_action => $label) {
298
-            $field .= '<input type="hidden" name="' . $bulk_action . '_nonce"'
299
-                . ' value="' . wp_create_nonce($bulk_action . '_nonce') . '" />' . "\n";
300
-        }
301
-
302
-        return $field;
303
-    }
304
-
305
-
306
-    /**
307
-     * _set_column_info
308
-     * we're using this to set the column headers property.
309
-     *
310
-     * @access protected
311
-     * @return void
312
-     */
313
-    protected function _set_column_info()
314
-    {
315
-        $columns   = $this->get_columns();
316
-        $hidden    = $this->get_hidden_columns();
317
-        $_sortable = $this->get_sortable_columns();
318
-
319
-        /**
320
-         * Dynamic hook allowing for adding sortable columns in this list table.
321
-         * Note that $this->screen->id is in the format
322
-         * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
323
-         * table it is: event-espresso_page_espresso_messages.
324
-         * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
325
-         * hook prefix ("event-espresso") will be different.
326
-         *
327
-         * @var array
328
-         */
329
-        $_sortable = apply_filters("FHEE_manage_{$this->screen->id}_sortable_columns", $_sortable, $this->_screen);
330
-
331
-        $sortable = array();
332
-        foreach ($_sortable as $id => $data) {
333
-            if (empty($data)) {
334
-                continue;
335
-            }
336
-            //fix for offset errors with WP_List_Table default get_columninfo()
337
-            if (is_array($data)) {
338
-                $_data[0] = key($data);
339
-                $_data[1] = isset($data[1]) ? $data[1] : false;
340
-            } else {
341
-                $_data[0] = $data;
342
-            }
343
-
344
-            $data = (array)$data;
345
-
346
-            if (! isset($data[1])) {
347
-                $_data[1] = false;
348
-            }
349
-
350
-            $sortable[$id] = $_data;
351
-        }
352
-        $primary               = $this->get_primary_column_name();
353
-        $this->_column_headers = array($columns, $hidden, $sortable, $primary);
354
-    }
355
-
356
-
357
-    /**
358
-     * Added for WP4.1 backward compat (@see https://events.codebasehq.com/projects/event-espresso/tickets/8814)
359
-     *
360
-     * @return string
361
-     */
362
-    protected function get_primary_column_name()
363
-    {
364
-        foreach (class_parents($this) as $parent) {
365
-            if ($parent === 'WP_List_Table' && method_exists($parent, 'get_primary_column_name')) {
366
-                return parent::get_primary_column_name();
367
-            }
368
-        }
369
-        return $this->_primary_column;
370
-    }
371
-
372
-
373
-    /**
374
-     * Added for WP4.1 backward compat (@see https://events.codebasehq.com/projects/event-espresso/tickets/8814)
375
-     *
376
-     * @param EE_Base_Class $item
377
-     * @param string        $column_name
378
-     * @param string        $primary
379
-     * @return string
380
-     */
381
-    protected function handle_row_actions($item, $column_name, $primary)
382
-    {
383
-        foreach (class_parents($this) as $parent) {
384
-            if ($parent === 'WP_List_Table' && method_exists($parent, 'handle_row_actions')) {
385
-                return parent::handle_row_actions($item, $column_name, $primary);
386
-            }
387
-        }
388
-        return '';
389
-    }
390
-
391
-
392
-    /**
393
-     * _get_bulk_actions
394
-     * This is a wrapper called by WP_List_Table::get_bulk_actions()
395
-     *
396
-     * @access protected
397
-     * @return array bulk_actions
398
-     */
399
-    protected function _get_bulk_actions()
400
-    {
401
-        $actions = array();
402
-        //the _views property should have the bulk_actions, so let's go through and extract them into a properly
403
-        // formatted array for the wp_list_table();
404
-        foreach ($this->_views as $view => $args) {
405
-            if ($this->_view === $view && isset($args['bulk_action']) && is_array($args['bulk_action'])) {
406
-                //each bulk action will correspond with a admin page route, so we can check whatever the capability is
407
-                // for that page route and skip adding the bulk action if no access for the current logged in user.
408
-                foreach ($args['bulk_action'] as $route => $label) {
409
-                    if ($this->_admin_page->check_user_access($route, true)) {
410
-                        $actions[$route] = $label;
411
-                    }
412
-                }
413
-            }
414
-        }
415
-        return $actions;
416
-    }
417
-
418
-
419
-    /**
420
-     * Generate the table navigation above or below the table.
421
-     * Overrides the parent table nav in WP_List_Table so we can hide the bulk action div if there are no bulk actions.
422
-     *
423
-     * @since 4.9.44.rc.001
424
-     */
425
-    public function display_tablenav($which)
426
-    {
427
-        if ('top' === $which) {
428
-            wp_nonce_field('bulk-' . $this->_args['plural']);
429
-        }
430
-        ?>
25
+	/**
26
+	 * holds the data that will be processed for the table
27
+	 *
28
+	 * @var array $_data
29
+	 */
30
+	protected $_data;
31
+
32
+
33
+	/**
34
+	 * This holds the value of all the data available for the given view (for all pages).
35
+	 *
36
+	 * @var int $_all_data_count
37
+	 */
38
+	protected $_all_data_count;
39
+
40
+
41
+	/**
42
+	 * Will contain the count of trashed items for the view label.
43
+	 *
44
+	 * @var int $_trashed_count
45
+	 */
46
+	protected $_trashed_count;
47
+
48
+
49
+	/**
50
+	 * This is what will be referenced as the slug for the current screen
51
+	 *
52
+	 * @var string $_screen
53
+	 */
54
+	protected $_screen;
55
+
56
+
57
+	/**
58
+	 * this is the EE_Admin_Page object
59
+	 *
60
+	 * @var EE_Admin_Page $_admin_page
61
+	 */
62
+	protected $_admin_page;
63
+
64
+
65
+	/**
66
+	 * The current view
67
+	 *
68
+	 * @var string $_view
69
+	 */
70
+	protected $_view;
71
+
72
+
73
+	/**
74
+	 * array of possible views for this table
75
+	 *
76
+	 * @var array $_views
77
+	 */
78
+	protected $_views;
79
+
80
+
81
+	/**
82
+	 * An array of key => value pairs containing information about the current table
83
+	 * array(
84
+	 *        'plural' => 'plural label',
85
+	 *        'singular' => 'singular label',
86
+	 *        'ajax' => false, //whether to use ajax or not
87
+	 *        'screen' => null, //string used to reference what screen this is
88
+	 *        (WP_List_table converts to screen object)
89
+	 * )
90
+	 *
91
+	 * @var array $_wp_list_args
92
+	 */
93
+	protected $_wp_list_args;
94
+
95
+	/**
96
+	 * an array of column names
97
+	 * array(
98
+	 *    'internal-name' => 'Title'
99
+	 * )
100
+	 *
101
+	 * @var array $_columns
102
+	 */
103
+	protected $_columns;
104
+
105
+	/**
106
+	 * An array of sortable columns
107
+	 * array(
108
+	 *    'internal-name' => 'orderby' //or
109
+	 *    'internal-name' => array( 'orderby', true )
110
+	 * )
111
+	 *
112
+	 * @var array $_sortable_columns
113
+	 */
114
+	protected $_sortable_columns;
115
+
116
+	/**
117
+	 * callback method used to perform AJAX row reordering
118
+	 *
119
+	 * @var string $_ajax_sorting_callback
120
+	 */
121
+	protected $_ajax_sorting_callback;
122
+
123
+	/**
124
+	 * An array of hidden columns (if needed)
125
+	 * array('internal-name', 'internal-name')
126
+	 *
127
+	 * @var array $_hidden_columns
128
+	 */
129
+	protected $_hidden_columns;
130
+
131
+	/**
132
+	 * holds the per_page value
133
+	 *
134
+	 * @var int $_per_page
135
+	 */
136
+	protected $_per_page;
137
+
138
+	/**
139
+	 * holds what page number is currently being viewed
140
+	 *
141
+	 * @var int $_current_page
142
+	 */
143
+	protected $_current_page;
144
+
145
+	/**
146
+	 * the reference string for the nonce_action
147
+	 *
148
+	 * @var string $_nonce_action_ref
149
+	 */
150
+	protected $_nonce_action_ref;
151
+
152
+	/**
153
+	 * property to hold incoming request data (as set by the admin_page_core)
154
+	 *
155
+	 * @var array $_req_data
156
+	 */
157
+	protected $_req_data;
158
+
159
+
160
+	/**
161
+	 * yes / no array for admin form fields
162
+	 *
163
+	 * @var array $_yes_no
164
+	 */
165
+	protected $_yes_no = array();
166
+
167
+	/**
168
+	 * Array describing buttons that should appear at the bottom of the page
169
+	 * Keys are strings that represent the button's function (specifically a key in _labels['buttons']),
170
+	 * and the values are another array with the following keys
171
+	 * array(
172
+	 *    'route' => 'page_route',
173
+	 *    'extra_request' => array('evt_id' => 1 ); //extra request vars that need to be included in the button.
174
+	 * )
175
+	 *
176
+	 * @var array $_bottom_buttons
177
+	 */
178
+	protected $_bottom_buttons = array();
179
+
180
+
181
+	/**
182
+	 * Used to indicate what should be the primary column for the list table.
183
+	 * If not present then falls back to what WP calculates
184
+	 * as the primary column.
185
+	 *
186
+	 * @type string $_primary_column
187
+	 */
188
+	protected $_primary_column = '';
189
+
190
+
191
+	/**
192
+	 * Used to indicate whether the table has a checkbox column or not.
193
+	 *
194
+	 * @type bool $_has_checkbox_column
195
+	 */
196
+	protected $_has_checkbox_column = false;
197
+
198
+
199
+	/**
200
+	 * @param \EE_Admin_Page $admin_page we use this for obtaining everything we need in the list table
201
+	 */
202
+	public function __construct(EE_Admin_Page $admin_page)
203
+	{
204
+		$this->_admin_page   = $admin_page;
205
+		$this->_req_data     = $this->_admin_page->get_request_data();
206
+		$this->_view         = $this->_admin_page->get_view();
207
+		$this->_views        = empty($this->_views) ? $this->_admin_page->get_list_table_view_RLs() : $this->_views;
208
+		$this->_current_page = $this->get_pagenum();
209
+		$this->_screen       = $this->_admin_page->get_current_page() . '_' . $this->_admin_page->get_current_view();
210
+		$this->_yes_no       = array(__('No', 'event_espresso'), __('Yes', 'event_espresso'));
211
+
212
+		$this->_per_page = $this->get_items_per_page($this->_screen . '_per_page', 10);
213
+
214
+		$this->_setup_data();
215
+		$this->_add_view_counts();
216
+
217
+		$this->_nonce_action_ref = $this->_view;
218
+
219
+		$this->_set_properties();
220
+
221
+		//set primary column
222
+		add_filter('list_table_primary_column', array($this, 'set_primary_column'));
223
+
224
+		//set parent defaults
225
+		parent::__construct($this->_wp_list_args);
226
+
227
+		$this->prepare_items();
228
+	}
229
+
230
+
231
+	/**
232
+	 * _setup_data
233
+	 * this method is used to setup the $_data, $_all_data_count, and _per_page properties
234
+	 *
235
+	 * @uses $this->_admin_page
236
+	 * @return void
237
+	 */
238
+	abstract protected function _setup_data();
239
+
240
+
241
+	/**
242
+	 * set the properties that this class needs to be able to execute wp_list_table properly
243
+	 * properties set:
244
+	 * _wp_list_args = what the arguments required for the parent _wp_list_table.
245
+	 * _columns = set the columns in an array.
246
+	 * _sortable_columns = columns that are sortable (array).
247
+	 * _hidden_columns = columns that are hidden (array)
248
+	 * _default_orderby = the default orderby for sorting.
249
+	 *
250
+	 * @abstract
251
+	 * @access protected
252
+	 * @return void
253
+	 */
254
+	abstract protected function _set_properties();
255
+
256
+
257
+	/**
258
+	 * _get_table_filters
259
+	 * We use this to assemble and return any filters that are associated with this table that help further refine what
260
+	 * get's shown in the table.
261
+	 *
262
+	 * @abstract
263
+	 * @access protected
264
+	 * @return string
265
+	 */
266
+	abstract protected function _get_table_filters();
267
+
268
+
269
+	/**
270
+	 * this is a method that child class will do to add counts to the views array so when views are displayed the
271
+	 * counts of the views is accurate.
272
+	 *
273
+	 * @abstract
274
+	 * @access protected
275
+	 * @return void
276
+	 */
277
+	abstract protected function _add_view_counts();
278
+
279
+
280
+	/**
281
+	 * _get_hidden_fields
282
+	 * returns a html string of hidden fields so if any table filters are used the current view will be respected.
283
+	 *
284
+	 * @return string
285
+	 */
286
+	protected function _get_hidden_fields()
287
+	{
288
+		$action = isset($this->_req_data['route']) ? $this->_req_data['route'] : '';
289
+		$action = empty($action) && isset($this->_req_data['action']) ? $this->_req_data['action'] : $action;
290
+		//if action is STILL empty, then we set it to default
291
+		$action = empty($action) ? 'default' : $action;
292
+		$field  = '<input type="hidden" name="page" value="' . $this->_req_data['page'] . '" />' . "\n";
293
+		$field  .= '<input type="hidden" name="route" value="' . $action . '" />' . "\n";/**/
294
+		$field  .= '<input type="hidden" name="perpage" value="' . $this->_per_page . '" />' . "\n";
295
+
296
+		$bulk_actions = $this->_get_bulk_actions();
297
+		foreach ($bulk_actions as $bulk_action => $label) {
298
+			$field .= '<input type="hidden" name="' . $bulk_action . '_nonce"'
299
+				. ' value="' . wp_create_nonce($bulk_action . '_nonce') . '" />' . "\n";
300
+		}
301
+
302
+		return $field;
303
+	}
304
+
305
+
306
+	/**
307
+	 * _set_column_info
308
+	 * we're using this to set the column headers property.
309
+	 *
310
+	 * @access protected
311
+	 * @return void
312
+	 */
313
+	protected function _set_column_info()
314
+	{
315
+		$columns   = $this->get_columns();
316
+		$hidden    = $this->get_hidden_columns();
317
+		$_sortable = $this->get_sortable_columns();
318
+
319
+		/**
320
+		 * Dynamic hook allowing for adding sortable columns in this list table.
321
+		 * Note that $this->screen->id is in the format
322
+		 * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
323
+		 * table it is: event-espresso_page_espresso_messages.
324
+		 * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
325
+		 * hook prefix ("event-espresso") will be different.
326
+		 *
327
+		 * @var array
328
+		 */
329
+		$_sortable = apply_filters("FHEE_manage_{$this->screen->id}_sortable_columns", $_sortable, $this->_screen);
330
+
331
+		$sortable = array();
332
+		foreach ($_sortable as $id => $data) {
333
+			if (empty($data)) {
334
+				continue;
335
+			}
336
+			//fix for offset errors with WP_List_Table default get_columninfo()
337
+			if (is_array($data)) {
338
+				$_data[0] = key($data);
339
+				$_data[1] = isset($data[1]) ? $data[1] : false;
340
+			} else {
341
+				$_data[0] = $data;
342
+			}
343
+
344
+			$data = (array)$data;
345
+
346
+			if (! isset($data[1])) {
347
+				$_data[1] = false;
348
+			}
349
+
350
+			$sortable[$id] = $_data;
351
+		}
352
+		$primary               = $this->get_primary_column_name();
353
+		$this->_column_headers = array($columns, $hidden, $sortable, $primary);
354
+	}
355
+
356
+
357
+	/**
358
+	 * Added for WP4.1 backward compat (@see https://events.codebasehq.com/projects/event-espresso/tickets/8814)
359
+	 *
360
+	 * @return string
361
+	 */
362
+	protected function get_primary_column_name()
363
+	{
364
+		foreach (class_parents($this) as $parent) {
365
+			if ($parent === 'WP_List_Table' && method_exists($parent, 'get_primary_column_name')) {
366
+				return parent::get_primary_column_name();
367
+			}
368
+		}
369
+		return $this->_primary_column;
370
+	}
371
+
372
+
373
+	/**
374
+	 * Added for WP4.1 backward compat (@see https://events.codebasehq.com/projects/event-espresso/tickets/8814)
375
+	 *
376
+	 * @param EE_Base_Class $item
377
+	 * @param string        $column_name
378
+	 * @param string        $primary
379
+	 * @return string
380
+	 */
381
+	protected function handle_row_actions($item, $column_name, $primary)
382
+	{
383
+		foreach (class_parents($this) as $parent) {
384
+			if ($parent === 'WP_List_Table' && method_exists($parent, 'handle_row_actions')) {
385
+				return parent::handle_row_actions($item, $column_name, $primary);
386
+			}
387
+		}
388
+		return '';
389
+	}
390
+
391
+
392
+	/**
393
+	 * _get_bulk_actions
394
+	 * This is a wrapper called by WP_List_Table::get_bulk_actions()
395
+	 *
396
+	 * @access protected
397
+	 * @return array bulk_actions
398
+	 */
399
+	protected function _get_bulk_actions()
400
+	{
401
+		$actions = array();
402
+		//the _views property should have the bulk_actions, so let's go through and extract them into a properly
403
+		// formatted array for the wp_list_table();
404
+		foreach ($this->_views as $view => $args) {
405
+			if ($this->_view === $view && isset($args['bulk_action']) && is_array($args['bulk_action'])) {
406
+				//each bulk action will correspond with a admin page route, so we can check whatever the capability is
407
+				// for that page route and skip adding the bulk action if no access for the current logged in user.
408
+				foreach ($args['bulk_action'] as $route => $label) {
409
+					if ($this->_admin_page->check_user_access($route, true)) {
410
+						$actions[$route] = $label;
411
+					}
412
+				}
413
+			}
414
+		}
415
+		return $actions;
416
+	}
417
+
418
+
419
+	/**
420
+	 * Generate the table navigation above or below the table.
421
+	 * Overrides the parent table nav in WP_List_Table so we can hide the bulk action div if there are no bulk actions.
422
+	 *
423
+	 * @since 4.9.44.rc.001
424
+	 */
425
+	public function display_tablenav($which)
426
+	{
427
+		if ('top' === $which) {
428
+			wp_nonce_field('bulk-' . $this->_args['plural']);
429
+		}
430
+		?>
431 431
         <div class="tablenav <?php echo esc_attr($which); ?>">
432 432
             <?php if ($this->_get_bulk_actions()) { ?>
433 433
                 <div class="alignleft actions bulkactions">
434 434
                     <?php $this->bulk_actions(); ?>
435 435
                 </div>
436 436
             <?php }
437
-            $this->extra_tablenav($which);
438
-            $this->pagination($which);
439
-            ?>
437
+			$this->extra_tablenav($which);
438
+			$this->pagination($which);
439
+			?>
440 440
 
441 441
             <br class="clear"/>
442 442
         </div>
443 443
         <?php
444
-    }
445
-
446
-
447
-    /**
448
-     * _filters
449
-     * This receives the filters array from children _get_table_filters() and assembles the string including the filter
450
-     * button.
451
-     *
452
-     * @access private
453
-     * @return string html showing filters
454
-     */
455
-    private function _filters()
456
-    {
457
-        $classname = get_class($this);
458
-        $filters   = apply_filters(
459
-            "FHEE__{$classname}__filters",
460
-            (array) $this->_get_table_filters(),
461
-            $this,
462
-            $this->_screen
463
-        );
464
-
465
-        if (empty($filters)) {
466
-            return;
467
-        }
468
-        foreach ($filters as $filter) {
469
-            echo $filter;
470
-        }
471
-        //add filter button at end
472
-        echo '<input type="submit" class="button-secondary" value="'
473
-             . esc_html__('Filter', 'event_espresso')
474
-             . '" id="post-query-submit" />';
475
-        //add reset filters button at end
476
-        echo '<a class="button button-secondary"  href="'
477
-             . $this->_admin_page->get_current_page_view_url()
478
-             . '" style="display:inline-block">'
479
-             . esc_html__('Reset Filters', 'event_espresso')
480
-             . '</a>';
481
-    }
482
-
483
-
484
-    /**
485
-     * Callback for 'list_table_primary_column' WordPress filter
486
-     * If child EE_Admin_List_Table classes set the _primary_column property then that will be set as the primary
487
-     * column when class is instantiated.
488
-     *
489
-     * @see WP_List_Table::get_primary_column_name
490
-     * @param string $column_name
491
-     * @return string
492
-     */
493
-    public function set_primary_column($column_name)
494
-    {
495
-        return ! empty($this->_primary_column) ? $this->_primary_column : $column_name;
496
-    }
497
-
498
-
499
-    /**
500
-     *
501
-     */
502
-    public function prepare_items()
503
-    {
504
-
505
-        $this->_set_column_info();
506
-        //$this->_column_headers = $this->get_column_info();
507
-        $total_items = $this->_all_data_count;
508
-        $this->process_bulk_action();
509
-
510
-        $this->items = $this->_data;
511
-        $this->set_pagination_args(
512
-            array(
513
-                'total_items' => $total_items,
514
-                'per_page'    => $this->_per_page,
515
-                'total_pages' => ceil($total_items / $this->_per_page),
516
-            )
517
-        );
518
-    }
519
-
520
-
521
-    /**
522
-     * This column is the default for when there is no defined column method for a registered column.
523
-     * This can be overridden by child classes, but allows for hooking in for custom columns.
524
-     *
525
-     * @param EE_Base_Class $item
526
-     * @param string        $column_name The column being called.
527
-     * @return string html content for the column
528
-     */
529
-    public function column_default($item, $column_name)
530
-    {
531
-        /**
532
-         * Dynamic hook allowing for adding additional column content in this list table.
533
-         * Note that $this->screen->id is in the format
534
-         * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
535
-         * table it is: event-espresso_page_espresso_messages.
536
-         * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
537
-         * hook prefix ("event-espresso") will be different.
538
-         */
539
-        do_action(
540
-            'AHEE__EE_Admin_List_Table__column_' . $column_name . '__' . $this->screen->id,
541
-            $item,
542
-            $this->_screen
543
-        );
544
-    }
545
-
546
-
547
-    /**
548
-     * Get a list of columns. The format is:
549
-     * 'internal-name' => 'Title'
550
-     *
551
-     * @since  3.1.0
552
-     * @access public
553
-     * @abstract
554
-     * @return array
555
-     */
556
-    public function get_columns()
557
-    {
558
-        /**
559
-         * Dynamic hook allowing for adding additional columns in this list table.
560
-         * Note that $this->screen->id is in the format
561
-         * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
562
-         * table it is: event-espresso_page_espresso_messages.
563
-         * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
564
-         * hook prefix ("event-espresso") will be different.
565
-         *
566
-         * @var array
567
-         */
568
-        $columns = apply_filters('FHEE_manage_' . $this->screen->id . '_columns', $this->_columns, $this->_screen);
569
-        return $columns;
570
-    }
571
-
572
-
573
-    /**
574
-     * Get an associative array ( id => link ) with the list
575
-     * of views available on this table.
576
-     *
577
-     * @since  3.1.0
578
-     * @access protected
579
-     * @return array
580
-     */
581
-    public function get_views()
582
-    {
583
-        return $this->_views;
584
-    }
585
-
586
-
587
-    /**
588
-     * Generate the views html.
589
-     */
590
-    public function display_views()
591
-    {
592
-        $views           = $this->get_views();
593
-        $assembled_views = array();
594
-
595
-        if (empty($views)) {
596
-            return;
597
-        }
598
-        echo "<ul class='subsubsub'>\n";
599
-        foreach ($views as $view) {
600
-            $count = isset($view['count']) && ! empty($view['count']) ? absint($view['count']) : 0;
601
-            if (isset($view['slug'], $view['class'], $view['url'], $view['label'])) {
602
-                $assembled_views[$view['slug']] = "\t<li class='" . $view['class'] . "'>"
603
-                                                  . '<a href="' . $view['url'] . '">' . $view['label'] . '</a>'
604
-                                                  . ' <span class="count">(' . $count . ')</span>';
605
-            }
606
-        }
607
-
608
-        echo ! empty($assembled_views) ? implode(" |</li>\n", $assembled_views) . "</li>\n" : '';
609
-        echo "</ul>";
610
-    }
611
-
612
-
613
-    /**
614
-     * Generates content for a single row of the table
615
-     *
616
-     * @since  4.1
617
-     * @access public
618
-     * @param EE_Base_Class $item The current item
619
-     */
620
-    public function single_row($item)
621
-    {
622
-        $row_class = $this->_get_row_class($item);
623
-        echo '<tr class="' . esc_attr($row_class) . '">';
624
-        $this->single_row_columns($item);
625
-        echo '</tr>';
626
-    }
627
-
628
-
629
-    /**
630
-     * This simply sets up the row class for the table rows.
631
-     * Allows for easier overriding of child methods for setting up sorting.
632
-     *
633
-     * @param  EE_Base_Class $item the current item
634
-     * @return string
635
-     */
636
-    protected function _get_row_class($item)
637
-    {
638
-        static $row_class = '';
639
-        $row_class = ($row_class === '' ? 'alternate' : '');
640
-
641
-        $new_row_class = $row_class;
642
-
643
-        if (! empty($this->_ajax_sorting_callback)) {
644
-            $new_row_class .= ' rowsortable';
645
-        }
646
-
647
-        return $new_row_class;
648
-    }
649
-
650
-
651
-    /**
652
-     * @return array
653
-     */
654
-    public function get_sortable_columns()
655
-    {
656
-        return (array)$this->_sortable_columns;
657
-    }
658
-
659
-
660
-    /**
661
-     * @return string
662
-     */
663
-    public function get_ajax_sorting_callback()
664
-    {
665
-        return $this->_ajax_sorting_callback;
666
-    }
667
-
668
-
669
-    /**
670
-     * @return array
671
-     */
672
-    public function get_hidden_columns()
673
-    {
674
-        $user_id     = get_current_user_id();
675
-        $has_default = get_user_option('default' . $this->screen->id . 'columnshidden', $user_id);
676
-        if (empty($has_default) && ! empty($this->_hidden_columns)) {
677
-            update_user_option($user_id, 'default' . $this->screen->id . 'columnshidden', true);
678
-            update_user_option($user_id, 'manage' . $this->screen->id . 'columnshidden', $this->_hidden_columns, true);
679
-        }
680
-        $ref = 'manage' . $this->screen->id . 'columnshidden';
681
-        return (array) get_user_option($ref, $user_id);
682
-    }
683
-
684
-
685
-    /**
686
-     * Generates the columns for a single row of the table.
687
-     * Overridden from wp_list_table so as to allow us to filter the column content for a given
688
-     * column.
689
-     *
690
-     * @since 3.1.0
691
-     * @param EE_Base_Class $item The current item
692
-     */
693
-    public function single_row_columns($item)
694
-    {
695
-        list($columns, $hidden, $sortable, $primary) = $this->get_column_info();
696
-
697
-        global $wp_version;
698
-        $use_hidden_class = version_compare($wp_version, '4.3-RC', '>=');
699
-
700
-        foreach ($columns as $column_name => $column_display_name) {
701
-
702
-            /**
703
-             * With WordPress version 4.3.RC+ WordPress started using the hidden css class to control whether columns
704
-             * are hidden or not instead of using "display:none;".  This bit of code provides backward compat.
705
-             */
706
-            $hidden_class = $use_hidden_class && in_array($column_name, $hidden) ? ' hidden' : '';
707
-            $style        = ! $use_hidden_class && in_array($column_name, $hidden) ? ' style="display:none;"' : '';
708
-
709
-            $classes = $column_name . ' column-' . $column_name . $hidden_class;
710
-            if ($primary === $column_name) {
711
-                $classes .= ' has-row-actions column-primary';
712
-            }
713
-
714
-            $data = ' data-colname="' . wp_strip_all_tags($column_display_name) . '"';
715
-
716
-            $class = "class='$classes'";
717
-
718
-            $attributes = "$class$style$data";
719
-
720
-            if ($column_name === 'cb') {
721
-                echo '<th scope="row" class="check-column">';
722
-                echo apply_filters(
723
-                    'FHEE__EE_Admin_List_Table__single_row_columns__column_cb_content',
724
-                    $this->column_cb($item),
725
-                    $item,
726
-                    $this
727
-                );
728
-                echo '</th>';
729
-            } elseif (method_exists($this, 'column_' . $column_name)) {
730
-                echo "<td $attributes>";
731
-                echo apply_filters(
732
-                    'FHEE__EE_Admin_List_Table__single_row_columns__column_' . $column_name . '__column_content',
733
-                    call_user_func(array($this, 'column_' . $column_name), $item),
734
-                    $item,
735
-                    $this
736
-                );
737
-                echo $this->handle_row_actions($item, $column_name, $primary);
738
-                echo "</td>";
739
-            } else {
740
-                echo "<td $attributes>";
741
-                echo apply_filters(
742
-                    'FHEE__EE_Admin_List_Table__single_row_columns__column_default__column_content',
743
-                    $this->column_default($item, $column_name),
744
-                    $item,
745
-                    $column_name,
746
-                    $this
747
-                );
748
-                echo $this->handle_row_actions($item, $column_name, $primary);
749
-                echo "</td>";
750
-            }
751
-        }
752
-    }
753
-
754
-
755
-    /**
756
-     * Extra controls to be displayed between bulk actions and pagination
757
-     *
758
-     * @access public
759
-     * @param string $which
760
-     * @throws \EE_Error
761
-     */
762
-    public function extra_tablenav($which)
763
-    {
764
-        if ($which === 'top') {
765
-            $this->_filters();
766
-            echo $this->_get_hidden_fields();
767
-        } else {
768
-            echo '<div class="list-table-bottom-buttons alignleft actions">';
769
-            foreach ($this->_bottom_buttons as $type => $action) {
770
-                $route         = isset($action['route']) ? $action['route'] : '';
771
-                $extra_request = isset($action['extra_request']) ? $action['extra_request'] : '';
772
-                echo $this->_admin_page->get_action_link_or_button(
773
-                    $route,
774
-                    $type,
775
-                    $extra_request,
776
-                    'button button-secondary',
777
-                    '',
778
-                    false
779
-                );
780
-            }
781
-            do_action('AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons', $this, $this->_screen);
782
-            echo '</div>';
783
-        }
784
-        //echo $this->_entries_per_page_dropdown;
785
-    }
786
-
787
-
788
-    /**
789
-     * Get an associative array ( option_name => option_title ) with the list
790
-     * of bulk actions available on this table.
791
-     *
792
-     * @since  3.1.0
793
-     * @access protected
794
-     * @return array
795
-     */
796
-    public function get_bulk_actions()
797
-    {
798
-        return (array) $this->_get_bulk_actions();
799
-    }
800
-
801
-    /**
802
-     * Processing bulk actions.
803
-     */
804
-    public function process_bulk_action()
805
-    {
806
-        //this is not used it is handled by the child EE_Admin_Page class (routes).  However, including here for
807
-        //reference in case there is a case where it gets used.
808
-    }
809
-
810
-
811
-    /**
812
-     * returns the EE admin page this list table is associated with
813
-     *
814
-     * @return EE_Admin_Page
815
-     */
816
-    public function get_admin_page()
817
-    {
818
-        return $this->_admin_page;
819
-    }
820
-
821
-
822
-    /**
823
-     * A "helper" function for all children to provide an html string of
824
-     * actions to output in their content.  It is preferable for child classes
825
-     * to use this method for generating their actions content so that it's
826
-     * filterable by plugins
827
-     *
828
-     * @param string        $action_container           what are the html container
829
-     *                                                  elements for this actions string?
830
-     * @param string        $action_class               What class is for the container
831
-     *                                                  element.
832
-     * @param string        $action_items               The contents for the action items
833
-     *                                                  container.  This is filtered before
834
-     *                                                  returned.
835
-     * @param string        $action_id                  What id (optional) is used for the
836
-     *                                                  container element.
837
-     * @param EE_Base_Class $item                       The object for the column displaying
838
-     *                                                  the actions.
839
-     * @return string The assembled action elements container.
840
-     */
841
-    protected function _action_string(
842
-        $action_items,
843
-        $item,
844
-        $action_container = 'ul',
845
-        $action_class = '',
846
-        $action_id = ''
847
-    ) {
848
-        $content      = '';
849
-        $action_class = ! empty($action_class) ? ' class="' . $action_class . '"' : '';
850
-        $action_id    = ! empty($action_id) ? ' id="' . $action_id . '"' : '';
851
-        $content      .= ! empty($action_container) ? '<' . $action_container . $action_class . $action_id . '>' : '';
852
-        try {
853
-            $content .= apply_filters(
854
-                'FHEE__EE_Admin_List_Table___action_string__action_items',
855
-                $action_items,
856
-                $item,
857
-                $this
858
-            );
859
-        } catch (\Exception $e) {
860
-            if (WP_DEBUG) {
861
-                \EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
862
-            }
863
-            $content .= $action_items;
864
-        }
865
-        $content .= ! empty($action_container) ? '</' . $action_container . '>' : '';
866
-        return $content;
867
-    }
444
+	}
445
+
446
+
447
+	/**
448
+	 * _filters
449
+	 * This receives the filters array from children _get_table_filters() and assembles the string including the filter
450
+	 * button.
451
+	 *
452
+	 * @access private
453
+	 * @return string html showing filters
454
+	 */
455
+	private function _filters()
456
+	{
457
+		$classname = get_class($this);
458
+		$filters   = apply_filters(
459
+			"FHEE__{$classname}__filters",
460
+			(array) $this->_get_table_filters(),
461
+			$this,
462
+			$this->_screen
463
+		);
464
+
465
+		if (empty($filters)) {
466
+			return;
467
+		}
468
+		foreach ($filters as $filter) {
469
+			echo $filter;
470
+		}
471
+		//add filter button at end
472
+		echo '<input type="submit" class="button-secondary" value="'
473
+			 . esc_html__('Filter', 'event_espresso')
474
+			 . '" id="post-query-submit" />';
475
+		//add reset filters button at end
476
+		echo '<a class="button button-secondary"  href="'
477
+			 . $this->_admin_page->get_current_page_view_url()
478
+			 . '" style="display:inline-block">'
479
+			 . esc_html__('Reset Filters', 'event_espresso')
480
+			 . '</a>';
481
+	}
482
+
483
+
484
+	/**
485
+	 * Callback for 'list_table_primary_column' WordPress filter
486
+	 * If child EE_Admin_List_Table classes set the _primary_column property then that will be set as the primary
487
+	 * column when class is instantiated.
488
+	 *
489
+	 * @see WP_List_Table::get_primary_column_name
490
+	 * @param string $column_name
491
+	 * @return string
492
+	 */
493
+	public function set_primary_column($column_name)
494
+	{
495
+		return ! empty($this->_primary_column) ? $this->_primary_column : $column_name;
496
+	}
497
+
498
+
499
+	/**
500
+	 *
501
+	 */
502
+	public function prepare_items()
503
+	{
504
+
505
+		$this->_set_column_info();
506
+		//$this->_column_headers = $this->get_column_info();
507
+		$total_items = $this->_all_data_count;
508
+		$this->process_bulk_action();
509
+
510
+		$this->items = $this->_data;
511
+		$this->set_pagination_args(
512
+			array(
513
+				'total_items' => $total_items,
514
+				'per_page'    => $this->_per_page,
515
+				'total_pages' => ceil($total_items / $this->_per_page),
516
+			)
517
+		);
518
+	}
519
+
520
+
521
+	/**
522
+	 * This column is the default for when there is no defined column method for a registered column.
523
+	 * This can be overridden by child classes, but allows for hooking in for custom columns.
524
+	 *
525
+	 * @param EE_Base_Class $item
526
+	 * @param string        $column_name The column being called.
527
+	 * @return string html content for the column
528
+	 */
529
+	public function column_default($item, $column_name)
530
+	{
531
+		/**
532
+		 * Dynamic hook allowing for adding additional column content in this list table.
533
+		 * Note that $this->screen->id is in the format
534
+		 * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
535
+		 * table it is: event-espresso_page_espresso_messages.
536
+		 * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
537
+		 * hook prefix ("event-espresso") will be different.
538
+		 */
539
+		do_action(
540
+			'AHEE__EE_Admin_List_Table__column_' . $column_name . '__' . $this->screen->id,
541
+			$item,
542
+			$this->_screen
543
+		);
544
+	}
545
+
546
+
547
+	/**
548
+	 * Get a list of columns. The format is:
549
+	 * 'internal-name' => 'Title'
550
+	 *
551
+	 * @since  3.1.0
552
+	 * @access public
553
+	 * @abstract
554
+	 * @return array
555
+	 */
556
+	public function get_columns()
557
+	{
558
+		/**
559
+		 * Dynamic hook allowing for adding additional columns in this list table.
560
+		 * Note that $this->screen->id is in the format
561
+		 * {sanitize_title($top_level_menu_label)}_page_{$espresso_admin_page_slug}.  So for the messages list
562
+		 * table it is: event-espresso_page_espresso_messages.
563
+		 * However, take note that if the top level menu label has been translated (i.e. "Event Espresso"). then the
564
+		 * hook prefix ("event-espresso") will be different.
565
+		 *
566
+		 * @var array
567
+		 */
568
+		$columns = apply_filters('FHEE_manage_' . $this->screen->id . '_columns', $this->_columns, $this->_screen);
569
+		return $columns;
570
+	}
571
+
572
+
573
+	/**
574
+	 * Get an associative array ( id => link ) with the list
575
+	 * of views available on this table.
576
+	 *
577
+	 * @since  3.1.0
578
+	 * @access protected
579
+	 * @return array
580
+	 */
581
+	public function get_views()
582
+	{
583
+		return $this->_views;
584
+	}
585
+
586
+
587
+	/**
588
+	 * Generate the views html.
589
+	 */
590
+	public function display_views()
591
+	{
592
+		$views           = $this->get_views();
593
+		$assembled_views = array();
594
+
595
+		if (empty($views)) {
596
+			return;
597
+		}
598
+		echo "<ul class='subsubsub'>\n";
599
+		foreach ($views as $view) {
600
+			$count = isset($view['count']) && ! empty($view['count']) ? absint($view['count']) : 0;
601
+			if (isset($view['slug'], $view['class'], $view['url'], $view['label'])) {
602
+				$assembled_views[$view['slug']] = "\t<li class='" . $view['class'] . "'>"
603
+												  . '<a href="' . $view['url'] . '">' . $view['label'] . '</a>'
604
+												  . ' <span class="count">(' . $count . ')</span>';
605
+			}
606
+		}
607
+
608
+		echo ! empty($assembled_views) ? implode(" |</li>\n", $assembled_views) . "</li>\n" : '';
609
+		echo "</ul>";
610
+	}
611
+
612
+
613
+	/**
614
+	 * Generates content for a single row of the table
615
+	 *
616
+	 * @since  4.1
617
+	 * @access public
618
+	 * @param EE_Base_Class $item The current item
619
+	 */
620
+	public function single_row($item)
621
+	{
622
+		$row_class = $this->_get_row_class($item);
623
+		echo '<tr class="' . esc_attr($row_class) . '">';
624
+		$this->single_row_columns($item);
625
+		echo '</tr>';
626
+	}
627
+
628
+
629
+	/**
630
+	 * This simply sets up the row class for the table rows.
631
+	 * Allows for easier overriding of child methods for setting up sorting.
632
+	 *
633
+	 * @param  EE_Base_Class $item the current item
634
+	 * @return string
635
+	 */
636
+	protected function _get_row_class($item)
637
+	{
638
+		static $row_class = '';
639
+		$row_class = ($row_class === '' ? 'alternate' : '');
640
+
641
+		$new_row_class = $row_class;
642
+
643
+		if (! empty($this->_ajax_sorting_callback)) {
644
+			$new_row_class .= ' rowsortable';
645
+		}
646
+
647
+		return $new_row_class;
648
+	}
649
+
650
+
651
+	/**
652
+	 * @return array
653
+	 */
654
+	public function get_sortable_columns()
655
+	{
656
+		return (array)$this->_sortable_columns;
657
+	}
658
+
659
+
660
+	/**
661
+	 * @return string
662
+	 */
663
+	public function get_ajax_sorting_callback()
664
+	{
665
+		return $this->_ajax_sorting_callback;
666
+	}
667
+
668
+
669
+	/**
670
+	 * @return array
671
+	 */
672
+	public function get_hidden_columns()
673
+	{
674
+		$user_id     = get_current_user_id();
675
+		$has_default = get_user_option('default' . $this->screen->id . 'columnshidden', $user_id);
676
+		if (empty($has_default) && ! empty($this->_hidden_columns)) {
677
+			update_user_option($user_id, 'default' . $this->screen->id . 'columnshidden', true);
678
+			update_user_option($user_id, 'manage' . $this->screen->id . 'columnshidden', $this->_hidden_columns, true);
679
+		}
680
+		$ref = 'manage' . $this->screen->id . 'columnshidden';
681
+		return (array) get_user_option($ref, $user_id);
682
+	}
683
+
684
+
685
+	/**
686
+	 * Generates the columns for a single row of the table.
687
+	 * Overridden from wp_list_table so as to allow us to filter the column content for a given
688
+	 * column.
689
+	 *
690
+	 * @since 3.1.0
691
+	 * @param EE_Base_Class $item The current item
692
+	 */
693
+	public function single_row_columns($item)
694
+	{
695
+		list($columns, $hidden, $sortable, $primary) = $this->get_column_info();
696
+
697
+		global $wp_version;
698
+		$use_hidden_class = version_compare($wp_version, '4.3-RC', '>=');
699
+
700
+		foreach ($columns as $column_name => $column_display_name) {
701
+
702
+			/**
703
+			 * With WordPress version 4.3.RC+ WordPress started using the hidden css class to control whether columns
704
+			 * are hidden or not instead of using "display:none;".  This bit of code provides backward compat.
705
+			 */
706
+			$hidden_class = $use_hidden_class && in_array($column_name, $hidden) ? ' hidden' : '';
707
+			$style        = ! $use_hidden_class && in_array($column_name, $hidden) ? ' style="display:none;"' : '';
708
+
709
+			$classes = $column_name . ' column-' . $column_name . $hidden_class;
710
+			if ($primary === $column_name) {
711
+				$classes .= ' has-row-actions column-primary';
712
+			}
713
+
714
+			$data = ' data-colname="' . wp_strip_all_tags($column_display_name) . '"';
715
+
716
+			$class = "class='$classes'";
717
+
718
+			$attributes = "$class$style$data";
719
+
720
+			if ($column_name === 'cb') {
721
+				echo '<th scope="row" class="check-column">';
722
+				echo apply_filters(
723
+					'FHEE__EE_Admin_List_Table__single_row_columns__column_cb_content',
724
+					$this->column_cb($item),
725
+					$item,
726
+					$this
727
+				);
728
+				echo '</th>';
729
+			} elseif (method_exists($this, 'column_' . $column_name)) {
730
+				echo "<td $attributes>";
731
+				echo apply_filters(
732
+					'FHEE__EE_Admin_List_Table__single_row_columns__column_' . $column_name . '__column_content',
733
+					call_user_func(array($this, 'column_' . $column_name), $item),
734
+					$item,
735
+					$this
736
+				);
737
+				echo $this->handle_row_actions($item, $column_name, $primary);
738
+				echo "</td>";
739
+			} else {
740
+				echo "<td $attributes>";
741
+				echo apply_filters(
742
+					'FHEE__EE_Admin_List_Table__single_row_columns__column_default__column_content',
743
+					$this->column_default($item, $column_name),
744
+					$item,
745
+					$column_name,
746
+					$this
747
+				);
748
+				echo $this->handle_row_actions($item, $column_name, $primary);
749
+				echo "</td>";
750
+			}
751
+		}
752
+	}
753
+
754
+
755
+	/**
756
+	 * Extra controls to be displayed between bulk actions and pagination
757
+	 *
758
+	 * @access public
759
+	 * @param string $which
760
+	 * @throws \EE_Error
761
+	 */
762
+	public function extra_tablenav($which)
763
+	{
764
+		if ($which === 'top') {
765
+			$this->_filters();
766
+			echo $this->_get_hidden_fields();
767
+		} else {
768
+			echo '<div class="list-table-bottom-buttons alignleft actions">';
769
+			foreach ($this->_bottom_buttons as $type => $action) {
770
+				$route         = isset($action['route']) ? $action['route'] : '';
771
+				$extra_request = isset($action['extra_request']) ? $action['extra_request'] : '';
772
+				echo $this->_admin_page->get_action_link_or_button(
773
+					$route,
774
+					$type,
775
+					$extra_request,
776
+					'button button-secondary',
777
+					'',
778
+					false
779
+				);
780
+			}
781
+			do_action('AHEE__EE_Admin_List_Table__extra_tablenav__after_bottom_buttons', $this, $this->_screen);
782
+			echo '</div>';
783
+		}
784
+		//echo $this->_entries_per_page_dropdown;
785
+	}
786
+
787
+
788
+	/**
789
+	 * Get an associative array ( option_name => option_title ) with the list
790
+	 * of bulk actions available on this table.
791
+	 *
792
+	 * @since  3.1.0
793
+	 * @access protected
794
+	 * @return array
795
+	 */
796
+	public function get_bulk_actions()
797
+	{
798
+		return (array) $this->_get_bulk_actions();
799
+	}
800
+
801
+	/**
802
+	 * Processing bulk actions.
803
+	 */
804
+	public function process_bulk_action()
805
+	{
806
+		//this is not used it is handled by the child EE_Admin_Page class (routes).  However, including here for
807
+		//reference in case there is a case where it gets used.
808
+	}
809
+
810
+
811
+	/**
812
+	 * returns the EE admin page this list table is associated with
813
+	 *
814
+	 * @return EE_Admin_Page
815
+	 */
816
+	public function get_admin_page()
817
+	{
818
+		return $this->_admin_page;
819
+	}
820
+
821
+
822
+	/**
823
+	 * A "helper" function for all children to provide an html string of
824
+	 * actions to output in their content.  It is preferable for child classes
825
+	 * to use this method for generating their actions content so that it's
826
+	 * filterable by plugins
827
+	 *
828
+	 * @param string        $action_container           what are the html container
829
+	 *                                                  elements for this actions string?
830
+	 * @param string        $action_class               What class is for the container
831
+	 *                                                  element.
832
+	 * @param string        $action_items               The contents for the action items
833
+	 *                                                  container.  This is filtered before
834
+	 *                                                  returned.
835
+	 * @param string        $action_id                  What id (optional) is used for the
836
+	 *                                                  container element.
837
+	 * @param EE_Base_Class $item                       The object for the column displaying
838
+	 *                                                  the actions.
839
+	 * @return string The assembled action elements container.
840
+	 */
841
+	protected function _action_string(
842
+		$action_items,
843
+		$item,
844
+		$action_container = 'ul',
845
+		$action_class = '',
846
+		$action_id = ''
847
+	) {
848
+		$content      = '';
849
+		$action_class = ! empty($action_class) ? ' class="' . $action_class . '"' : '';
850
+		$action_id    = ! empty($action_id) ? ' id="' . $action_id . '"' : '';
851
+		$content      .= ! empty($action_container) ? '<' . $action_container . $action_class . $action_id . '>' : '';
852
+		try {
853
+			$content .= apply_filters(
854
+				'FHEE__EE_Admin_List_Table___action_string__action_items',
855
+				$action_items,
856
+				$item,
857
+				$this
858
+			);
859
+		} catch (\Exception $e) {
860
+			if (WP_DEBUG) {
861
+				\EE_Error::add_error($e->getMessage(), __FILE__, __FUNCTION__, __LINE__);
862
+			}
863
+			$content .= $action_items;
864
+		}
865
+		$content .= ! empty($action_container) ? '</' . $action_container . '>' : '';
866
+		return $content;
867
+	}
868 868
 }
Please login to merge, or discard this patch.
Spacing   +34 added lines, -34 removed lines patch added patch discarded remove patch
@@ -2,8 +2,8 @@  discard block
 block discarded – undo
2 2
 
3 3
 defined('EVENT_ESPRESSO_VERSION') || exit('No direct access allowed.');
4 4
 
5
-if (! class_exists('WP_List_Table')) {
6
-    require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
5
+if ( ! class_exists('WP_List_Table')) {
6
+    require_once ABSPATH.'wp-admin/includes/class-wp-list-table.php';
7 7
 }
8 8
 
9 9
 
@@ -206,10 +206,10 @@  discard block
 block discarded – undo
206 206
         $this->_view         = $this->_admin_page->get_view();
207 207
         $this->_views        = empty($this->_views) ? $this->_admin_page->get_list_table_view_RLs() : $this->_views;
208 208
         $this->_current_page = $this->get_pagenum();
209
-        $this->_screen       = $this->_admin_page->get_current_page() . '_' . $this->_admin_page->get_current_view();
209
+        $this->_screen       = $this->_admin_page->get_current_page().'_'.$this->_admin_page->get_current_view();
210 210
         $this->_yes_no       = array(__('No', 'event_espresso'), __('Yes', 'event_espresso'));
211 211
 
212
-        $this->_per_page = $this->get_items_per_page($this->_screen . '_per_page', 10);
212
+        $this->_per_page = $this->get_items_per_page($this->_screen.'_per_page', 10);
213 213
 
214 214
         $this->_setup_data();
215 215
         $this->_add_view_counts();
@@ -289,14 +289,14 @@  discard block
 block discarded – undo
289 289
         $action = empty($action) && isset($this->_req_data['action']) ? $this->_req_data['action'] : $action;
290 290
         //if action is STILL empty, then we set it to default
291 291
         $action = empty($action) ? 'default' : $action;
292
-        $field  = '<input type="hidden" name="page" value="' . $this->_req_data['page'] . '" />' . "\n";
293
-        $field  .= '<input type="hidden" name="route" value="' . $action . '" />' . "\n";/**/
294
-        $field  .= '<input type="hidden" name="perpage" value="' . $this->_per_page . '" />' . "\n";
292
+        $field  = '<input type="hidden" name="page" value="'.$this->_req_data['page'].'" />'."\n";
293
+        $field  .= '<input type="hidden" name="route" value="'.$action.'" />'."\n"; /**/
294
+        $field  .= '<input type="hidden" name="perpage" value="'.$this->_per_page.'" />'."\n";
295 295
 
296 296
         $bulk_actions = $this->_get_bulk_actions();
297 297
         foreach ($bulk_actions as $bulk_action => $label) {
298
-            $field .= '<input type="hidden" name="' . $bulk_action . '_nonce"'
299
-                . ' value="' . wp_create_nonce($bulk_action . '_nonce') . '" />' . "\n";
298
+            $field .= '<input type="hidden" name="'.$bulk_action.'_nonce"'
299
+                . ' value="'.wp_create_nonce($bulk_action.'_nonce').'" />'."\n";
300 300
         }
301 301
 
302 302
         return $field;
@@ -341,9 +341,9 @@  discard block
 block discarded – undo
341 341
                 $_data[0] = $data;
342 342
             }
343 343
 
344
-            $data = (array)$data;
344
+            $data = (array) $data;
345 345
 
346
-            if (! isset($data[1])) {
346
+            if ( ! isset($data[1])) {
347 347
                 $_data[1] = false;
348 348
             }
349 349
 
@@ -425,7 +425,7 @@  discard block
 block discarded – undo
425 425
     public function display_tablenav($which)
426 426
     {
427 427
         if ('top' === $which) {
428
-            wp_nonce_field('bulk-' . $this->_args['plural']);
428
+            wp_nonce_field('bulk-'.$this->_args['plural']);
429 429
         }
430 430
         ?>
431 431
         <div class="tablenav <?php echo esc_attr($which); ?>">
@@ -537,7 +537,7 @@  discard block
 block discarded – undo
537 537
          * hook prefix ("event-espresso") will be different.
538 538
          */
539 539
         do_action(
540
-            'AHEE__EE_Admin_List_Table__column_' . $column_name . '__' . $this->screen->id,
540
+            'AHEE__EE_Admin_List_Table__column_'.$column_name.'__'.$this->screen->id,
541 541
             $item,
542 542
             $this->_screen
543 543
         );
@@ -565,7 +565,7 @@  discard block
 block discarded – undo
565 565
          *
566 566
          * @var array
567 567
          */
568
-        $columns = apply_filters('FHEE_manage_' . $this->screen->id . '_columns', $this->_columns, $this->_screen);
568
+        $columns = apply_filters('FHEE_manage_'.$this->screen->id.'_columns', $this->_columns, $this->_screen);
569 569
         return $columns;
570 570
     }
571 571
 
@@ -599,13 +599,13 @@  discard block
 block discarded – undo
599 599
         foreach ($views as $view) {
600 600
             $count = isset($view['count']) && ! empty($view['count']) ? absint($view['count']) : 0;
601 601
             if (isset($view['slug'], $view['class'], $view['url'], $view['label'])) {
602
-                $assembled_views[$view['slug']] = "\t<li class='" . $view['class'] . "'>"
603
-                                                  . '<a href="' . $view['url'] . '">' . $view['label'] . '</a>'
604
-                                                  . ' <span class="count">(' . $count . ')</span>';
602
+                $assembled_views[$view['slug']] = "\t<li class='".$view['class']."'>"
603
+                                                  . '<a href="'.$view['url'].'">'.$view['label'].'</a>'
604
+                                                  . ' <span class="count">('.$count.')</span>';
605 605
             }
606 606
         }
607 607
 
608
-        echo ! empty($assembled_views) ? implode(" |</li>\n", $assembled_views) . "</li>\n" : '';
608
+        echo ! empty($assembled_views) ? implode(" |</li>\n", $assembled_views)."</li>\n" : '';
609 609
         echo "</ul>";
610 610
     }
611 611
 
@@ -620,7 +620,7 @@  discard block
 block discarded – undo
620 620
     public function single_row($item)
621 621
     {
622 622
         $row_class = $this->_get_row_class($item);
623
-        echo '<tr class="' . esc_attr($row_class) . '">';
623
+        echo '<tr class="'.esc_attr($row_class).'">';
624 624
         $this->single_row_columns($item);
625 625
         echo '</tr>';
626 626
     }
@@ -640,7 +640,7 @@  discard block
 block discarded – undo
640 640
 
641 641
         $new_row_class = $row_class;
642 642
 
643
-        if (! empty($this->_ajax_sorting_callback)) {
643
+        if ( ! empty($this->_ajax_sorting_callback)) {
644 644
             $new_row_class .= ' rowsortable';
645 645
         }
646 646
 
@@ -653,7 +653,7 @@  discard block
 block discarded – undo
653 653
      */
654 654
     public function get_sortable_columns()
655 655
     {
656
-        return (array)$this->_sortable_columns;
656
+        return (array) $this->_sortable_columns;
657 657
     }
658 658
 
659 659
 
@@ -672,12 +672,12 @@  discard block
 block discarded – undo
672 672
     public function get_hidden_columns()
673 673
     {
674 674
         $user_id     = get_current_user_id();
675
-        $has_default = get_user_option('default' . $this->screen->id . 'columnshidden', $user_id);
675
+        $has_default = get_user_option('default'.$this->screen->id.'columnshidden', $user_id);
676 676
         if (empty($has_default) && ! empty($this->_hidden_columns)) {
677
-            update_user_option($user_id, 'default' . $this->screen->id . 'columnshidden', true);
678
-            update_user_option($user_id, 'manage' . $this->screen->id . 'columnshidden', $this->_hidden_columns, true);
677
+            update_user_option($user_id, 'default'.$this->screen->id.'columnshidden', true);
678
+            update_user_option($user_id, 'manage'.$this->screen->id.'columnshidden', $this->_hidden_columns, true);
679 679
         }
680
-        $ref = 'manage' . $this->screen->id . 'columnshidden';
680
+        $ref = 'manage'.$this->screen->id.'columnshidden';
681 681
         return (array) get_user_option($ref, $user_id);
682 682
     }
683 683
 
@@ -706,12 +706,12 @@  discard block
 block discarded – undo
706 706
             $hidden_class = $use_hidden_class && in_array($column_name, $hidden) ? ' hidden' : '';
707 707
             $style        = ! $use_hidden_class && in_array($column_name, $hidden) ? ' style="display:none;"' : '';
708 708
 
709
-            $classes = $column_name . ' column-' . $column_name . $hidden_class;
709
+            $classes = $column_name.' column-'.$column_name.$hidden_class;
710 710
             if ($primary === $column_name) {
711 711
                 $classes .= ' has-row-actions column-primary';
712 712
             }
713 713
 
714
-            $data = ' data-colname="' . wp_strip_all_tags($column_display_name) . '"';
714
+            $data = ' data-colname="'.wp_strip_all_tags($column_display_name).'"';
715 715
 
716 716
             $class = "class='$classes'";
717 717
 
@@ -726,11 +726,11 @@  discard block
 block discarded – undo
726 726
                     $this
727 727
                 );
728 728
                 echo '</th>';
729
-            } elseif (method_exists($this, 'column_' . $column_name)) {
729
+            } elseif (method_exists($this, 'column_'.$column_name)) {
730 730
                 echo "<td $attributes>";
731 731
                 echo apply_filters(
732
-                    'FHEE__EE_Admin_List_Table__single_row_columns__column_' . $column_name . '__column_content',
733
-                    call_user_func(array($this, 'column_' . $column_name), $item),
732
+                    'FHEE__EE_Admin_List_Table__single_row_columns__column_'.$column_name.'__column_content',
733
+                    call_user_func(array($this, 'column_'.$column_name), $item),
734 734
                     $item,
735 735
                     $this
736 736
                 );
@@ -846,9 +846,9 @@  discard block
 block discarded – undo
846 846
         $action_id = ''
847 847
     ) {
848 848
         $content      = '';
849
-        $action_class = ! empty($action_class) ? ' class="' . $action_class . '"' : '';
850
-        $action_id    = ! empty($action_id) ? ' id="' . $action_id . '"' : '';
851
-        $content      .= ! empty($action_container) ? '<' . $action_container . $action_class . $action_id . '>' : '';
849
+        $action_class = ! empty($action_class) ? ' class="'.$action_class.'"' : '';
850
+        $action_id    = ! empty($action_id) ? ' id="'.$action_id.'"' : '';
851
+        $content .= ! empty($action_container) ? '<'.$action_container.$action_class.$action_id.'>' : '';
852 852
         try {
853 853
             $content .= apply_filters(
854 854
                 'FHEE__EE_Admin_List_Table___action_string__action_items',
@@ -862,7 +862,7 @@  discard block
 block discarded – undo
862 862
             }
863 863
             $content .= $action_items;
864 864
         }
865
-        $content .= ! empty($action_container) ? '</' . $action_container . '>' : '';
865
+        $content .= ! empty($action_container) ? '</'.$action_container.'>' : '';
866 866
         return $content;
867 867
     }
868 868
 }
Please login to merge, or discard this patch.
admin_pages/messages/Messages_Admin_Page.core.php 1 patch
Indentation   +3632 added lines, -3632 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php if ( ! defined('EVENT_ESPRESSO_VERSION')) {
2
-    exit('NO direct script access allowed');
2
+	exit('NO direct script access allowed');
3 3
 }
4 4
 
5 5
 /**
@@ -17,2222 +17,2222 @@  discard block
 block discarded – undo
17 17
 class Messages_Admin_Page extends EE_Admin_Page
18 18
 {
19 19
     
20
-    /**
21
-     * @type EE_Message_Resource_Manager $_message_resource_manager
22
-     */
23
-    protected $_message_resource_manager;
24
-    
25
-    /**
26
-     * @type string $_active_message_type_name
27
-     */
28
-    protected $_active_message_type_name = '';
29
-    
30
-    /**
31
-     * @type EE_messenger $_active_messenger
32
-     */
33
-    protected $_active_messenger;
34
-    protected $_activate_state;
35
-    protected $_activate_meta_box_type;
36
-    protected $_current_message_meta_box;
37
-    protected $_current_message_meta_box_object;
38
-    protected $_context_switcher;
39
-    protected $_shortcodes = array();
40
-    protected $_active_messengers = array();
41
-    protected $_active_message_types = array();
42
-    
43
-    /**
44
-     * @var EE_Message_Template_Group $_message_template_group
45
-     */
46
-    protected $_message_template_group;
47
-    protected $_m_mt_settings = array();
48
-    
49
-    
50
-    /**
51
-     * This is set via the _set_message_template_group method and holds whatever the template pack for the group is.
52
-     * IF there is no group then it gets automatically set to the Default template pack.
53
-     *
54
-     * @since 4.5.0
55
-     *
56
-     * @var EE_Messages_Template_Pack
57
-     */
58
-    protected $_template_pack;
59
-    
60
-    
61
-    /**
62
-     * This is set via the _set_message_template_group method and holds whatever the template pack variation for the
63
-     * group is.  If there is no group then it automatically gets set to default.
64
-     *
65
-     * @since 4.5.0
66
-     *
67
-     * @var string
68
-     */
69
-    protected $_variation;
70
-    
71
-    
72
-    /**
73
-     * @param bool $routing
74
-     */
75
-    public function __construct($routing = true)
76
-    {
77
-        //make sure messages autoloader is running
78
-        EED_Messages::set_autoloaders();
79
-        parent::__construct($routing);
80
-    }
81
-    
82
-    
83
-    protected function _init_page_props()
84
-    {
85
-        $this->page_slug        = EE_MSG_PG_SLUG;
86
-        $this->page_label       = __('Messages Settings', 'event_espresso');
87
-        $this->_admin_base_url  = EE_MSG_ADMIN_URL;
88
-        $this->_admin_base_path = EE_MSG_ADMIN;
89
-        
90
-        $this->_activate_state = isset($this->_req_data['activate_state']) ? (array)$this->_req_data['activate_state'] : array();
91
-        
92
-        $this->_active_messenger = isset($this->_req_data['messenger']) ? $this->_req_data['messenger'] : null;
93
-        $this->_load_message_resource_manager();
94
-    }
95
-    
96
-    
97
-    /**
98
-     * loads messenger objects into the $_active_messengers property (so we can access the needed methods)
99
-     *
100
-     *
101
-     * @throws EE_Error
102
-     */
103
-    protected function _load_message_resource_manager()
104
-    {
105
-        $this->_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
106
-    }
107
-    
108
-    
109
-    /**
110
-     * @deprecated 4.9.9.rc.014
111
-     * @return array
112
-     */
113
-    public function get_messengers_for_list_table()
114
-    {
115
-        EE_Error::doing_it_wrong(
116
-            __METHOD__,
117
-            __('This method is no longer in use.  There is no replacement for it. The method was used to generate a set of
20
+	/**
21
+	 * @type EE_Message_Resource_Manager $_message_resource_manager
22
+	 */
23
+	protected $_message_resource_manager;
24
+    
25
+	/**
26
+	 * @type string $_active_message_type_name
27
+	 */
28
+	protected $_active_message_type_name = '';
29
+    
30
+	/**
31
+	 * @type EE_messenger $_active_messenger
32
+	 */
33
+	protected $_active_messenger;
34
+	protected $_activate_state;
35
+	protected $_activate_meta_box_type;
36
+	protected $_current_message_meta_box;
37
+	protected $_current_message_meta_box_object;
38
+	protected $_context_switcher;
39
+	protected $_shortcodes = array();
40
+	protected $_active_messengers = array();
41
+	protected $_active_message_types = array();
42
+    
43
+	/**
44
+	 * @var EE_Message_Template_Group $_message_template_group
45
+	 */
46
+	protected $_message_template_group;
47
+	protected $_m_mt_settings = array();
48
+    
49
+    
50
+	/**
51
+	 * This is set via the _set_message_template_group method and holds whatever the template pack for the group is.
52
+	 * IF there is no group then it gets automatically set to the Default template pack.
53
+	 *
54
+	 * @since 4.5.0
55
+	 *
56
+	 * @var EE_Messages_Template_Pack
57
+	 */
58
+	protected $_template_pack;
59
+    
60
+    
61
+	/**
62
+	 * This is set via the _set_message_template_group method and holds whatever the template pack variation for the
63
+	 * group is.  If there is no group then it automatically gets set to default.
64
+	 *
65
+	 * @since 4.5.0
66
+	 *
67
+	 * @var string
68
+	 */
69
+	protected $_variation;
70
+    
71
+    
72
+	/**
73
+	 * @param bool $routing
74
+	 */
75
+	public function __construct($routing = true)
76
+	{
77
+		//make sure messages autoloader is running
78
+		EED_Messages::set_autoloaders();
79
+		parent::__construct($routing);
80
+	}
81
+    
82
+    
83
+	protected function _init_page_props()
84
+	{
85
+		$this->page_slug        = EE_MSG_PG_SLUG;
86
+		$this->page_label       = __('Messages Settings', 'event_espresso');
87
+		$this->_admin_base_url  = EE_MSG_ADMIN_URL;
88
+		$this->_admin_base_path = EE_MSG_ADMIN;
89
+        
90
+		$this->_activate_state = isset($this->_req_data['activate_state']) ? (array)$this->_req_data['activate_state'] : array();
91
+        
92
+		$this->_active_messenger = isset($this->_req_data['messenger']) ? $this->_req_data['messenger'] : null;
93
+		$this->_load_message_resource_manager();
94
+	}
95
+    
96
+    
97
+	/**
98
+	 * loads messenger objects into the $_active_messengers property (so we can access the needed methods)
99
+	 *
100
+	 *
101
+	 * @throws EE_Error
102
+	 */
103
+	protected function _load_message_resource_manager()
104
+	{
105
+		$this->_message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
106
+	}
107
+    
108
+    
109
+	/**
110
+	 * @deprecated 4.9.9.rc.014
111
+	 * @return array
112
+	 */
113
+	public function get_messengers_for_list_table()
114
+	{
115
+		EE_Error::doing_it_wrong(
116
+			__METHOD__,
117
+			__('This method is no longer in use.  There is no replacement for it. The method was used to generate a set of
118 118
 			values for use in creating a messenger filter dropdown which is now generated differently via
119 119
 			 Messages_Admin_Page::get_messengers_select_input', 'event_espresso'),
120
-            '4.9.9.rc.014'
121
-        );
122
-        
123
-        $m_values          = array();
124
-        $active_messengers = EEM_Message::instance()->get_all(array('group_by' => 'MSG_messenger'));
125
-        //setup messengers for selects
126
-        $i = 1;
127
-        foreach ($active_messengers as $active_messenger) {
128
-            if ($active_messenger instanceof EE_Message) {
129
-                $m_values[$i]['id']   = $active_messenger->messenger();
130
-                $m_values[$i]['text'] = ucwords($active_messenger->messenger_label());
131
-                $i++;
132
-            }
133
-        }
134
-        
135
-        return $m_values;
136
-    }
137
-    
138
-    
139
-    /**
140
-     * @deprecated 4.9.9.rc.014
141
-     * @return array
142
-     */
143
-    public function get_message_types_for_list_table()
144
-    {
145
-        EE_Error::doing_it_wrong(
146
-            __METHOD__,
147
-            __('This method is no longer in use.  There is no replacement for it. The method was used to generate a set of
120
+			'4.9.9.rc.014'
121
+		);
122
+        
123
+		$m_values          = array();
124
+		$active_messengers = EEM_Message::instance()->get_all(array('group_by' => 'MSG_messenger'));
125
+		//setup messengers for selects
126
+		$i = 1;
127
+		foreach ($active_messengers as $active_messenger) {
128
+			if ($active_messenger instanceof EE_Message) {
129
+				$m_values[$i]['id']   = $active_messenger->messenger();
130
+				$m_values[$i]['text'] = ucwords($active_messenger->messenger_label());
131
+				$i++;
132
+			}
133
+		}
134
+        
135
+		return $m_values;
136
+	}
137
+    
138
+    
139
+	/**
140
+	 * @deprecated 4.9.9.rc.014
141
+	 * @return array
142
+	 */
143
+	public function get_message_types_for_list_table()
144
+	{
145
+		EE_Error::doing_it_wrong(
146
+			__METHOD__,
147
+			__('This method is no longer in use.  There is no replacement for it. The method was used to generate a set of
148 148
 			values for use in creating a message type filter dropdown which is now generated differently via
149 149
 			 Messages_Admin_Page::get_message_types_select_input', 'event_espresso'),
150
-            '4.9.9.rc.014'
151
-        );
152
-        
153
-        $mt_values       = array();
154
-        $active_messages = EEM_Message::instance()->get_all(array('group_by' => 'MSG_message_type'));
155
-        $i               = 1;
156
-        foreach ($active_messages as $active_message) {
157
-            if ($active_message instanceof EE_Message) {
158
-                $mt_values[$i]['id']   = $active_message->message_type();
159
-                $mt_values[$i]['text'] = ucwords($active_message->message_type_label());
160
-                $i++;
161
-            }
162
-        }
163
-        
164
-        return $mt_values;
165
-    }
166
-    
167
-    
168
-    /**
169
-     * @deprecated 4.9.9.rc.014
170
-     * @return array
171
-     */
172
-    public function get_contexts_for_message_types_for_list_table()
173
-    {
174
-        EE_Error::doing_it_wrong(
175
-            __METHOD__,
176
-            __('This method is no longer in use.  There is no replacement for it. The method was used to generate a set of
150
+			'4.9.9.rc.014'
151
+		);
152
+        
153
+		$mt_values       = array();
154
+		$active_messages = EEM_Message::instance()->get_all(array('group_by' => 'MSG_message_type'));
155
+		$i               = 1;
156
+		foreach ($active_messages as $active_message) {
157
+			if ($active_message instanceof EE_Message) {
158
+				$mt_values[$i]['id']   = $active_message->message_type();
159
+				$mt_values[$i]['text'] = ucwords($active_message->message_type_label());
160
+				$i++;
161
+			}
162
+		}
163
+        
164
+		return $mt_values;
165
+	}
166
+    
167
+    
168
+	/**
169
+	 * @deprecated 4.9.9.rc.014
170
+	 * @return array
171
+	 */
172
+	public function get_contexts_for_message_types_for_list_table()
173
+	{
174
+		EE_Error::doing_it_wrong(
175
+			__METHOD__,
176
+			__('This method is no longer in use.  There is no replacement for it. The method was used to generate a set of
177 177
 			values for use in creating a message type context filter dropdown which is now generated differently via
178 178
 			 Messages_Admin_Page::get_contexts_for_message_types_select_input', 'event_espresso'),
179
-            '4.9.9.rc.014'
180
-        );
181
-        
182
-        $contexts                = array();
183
-        $active_message_contexts = EEM_Message::instance()->get_all(array('group_by' => 'MSG_context'));
184
-        foreach ($active_message_contexts as $active_message) {
185
-            if ($active_message instanceof EE_Message) {
186
-                $message_type = $active_message->message_type_object();
187
-                if ($message_type instanceof EE_message_type) {
188
-                    $message_type_contexts = $message_type->get_contexts();
189
-                    foreach ($message_type_contexts as $context => $context_details) {
190
-                        $contexts[$context] = $context_details['label'];
191
-                    }
192
-                }
193
-            }
194
-        }
195
-        
196
-        return $contexts;
197
-    }
198
-    
199
-    
200
-    /**
201
-     * Generate select input with provided messenger options array.
202
-     *
203
-     * @param array $messenger_options Array of messengers indexed by messenger slug and values are the messenger
204
-     *                                 labels.
205
-     *
206
-     * @return string
207
-     */
208
-    public function get_messengers_select_input($messenger_options)
209
-    {
210
-        //if empty or just one value then just return an empty string
211
-        if (empty($messenger_options)
212
-            || ! is_array($messenger_options)
213
-            || count($messenger_options) === 1
214
-        ) {
215
-            return '';
216
-        }
217
-        //merge in default
218
-        $messenger_options = array_merge(
219
-            array('none_selected' => __('Show All Messengers', 'event_espresso')),
220
-            $messenger_options
221
-        );
222
-        $input             = new EE_Select_Input(
223
-            $messenger_options,
224
-            array(
225
-                'html_name'  => 'ee_messenger_filter_by',
226
-                'html_id'    => 'ee_messenger_filter_by',
227
-                'html_class' => 'wide',
228
-                'default'    => isset($this->_req_data['ee_messenger_filter_by'])
229
-                    ? sanitize_title($this->_req_data['ee_messenger_filter_by'])
230
-                    : 'none_selected'
231
-            )
232
-        );
233
-        
234
-        return $input->get_html_for_input();
235
-    }
236
-    
237
-    
238
-    /**
239
-     * Generate select input with provided message type options array.
240
-     *
241
-     * @param array $message_type_options Array of message types indexed by message type slug, and values are the
242
-     *                                    message type labels
243
-     *
244
-     * @return string
245
-     */
246
-    public function get_message_types_select_input($message_type_options)
247
-    {
248
-        //if empty or count of options is 1 then just return an empty string
249
-        if (empty($message_type_options)
250
-            || ! is_array($message_type_options)
251
-            || count($message_type_options) === 1
252
-        ) {
253
-            return '';
254
-        }
255
-        //merge in default
256
-        $message_type_options = array_merge(
257
-            array('none_selected' => __('Show All Message Types', 'event_espresso')),
258
-            $message_type_options
259
-        );
260
-        $input                = new EE_Select_Input(
261
-            $message_type_options,
262
-            array(
263
-                'html_name'  => 'ee_message_type_filter_by',
264
-                'html_id'    => 'ee_message_type_filter_by',
265
-                'html_class' => 'wide',
266
-                'default'    => isset($this->_req_data['ee_message_type_filter_by'])
267
-                    ? sanitize_title($this->_req_data['ee_message_type_filter_by'])
268
-                    : 'none_selected',
269
-            )
270
-        );
271
-        
272
-        return $input->get_html_for_input();
273
-    }
274
-    
275
-    
276
-    /**
277
-     * Generate select input with provide message type contexts array.
278
-     *
279
-     * @param array $context_options Array of message type contexts indexed by context slug, and values are the
280
-     *                               context label.
281
-     *
282
-     * @return string
283
-     */
284
-    public function get_contexts_for_message_types_select_input($context_options)
285
-    {
286
-        //if empty or count of options is one then just return empty string
287
-        if (empty($context_options)
288
-            || ! is_array($context_options)
289
-            || count($context_options) === 1
290
-        ) {
291
-            return '';
292
-        }
293
-        //merge in default
294
-        $context_options = array_merge(
295
-            array('none_selected' => __('Show all Contexts', 'event_espresso')),
296
-            $context_options
297
-        );
298
-        $input           = new EE_Select_Input(
299
-            $context_options,
300
-            array(
301
-                'html_name'  => 'ee_context_filter_by',
302
-                'html_id'    => 'ee_context_filter_by',
303
-                'html_class' => 'wide',
304
-                'default'    => isset($this->_req_data['ee_context_filter_by'])
305
-                    ? sanitize_title($this->_req_data['ee_context_filter_by'])
306
-                    : 'none_selected',
307
-            )
308
-        );
309
-        
310
-        return $input->get_html_for_input();
311
-    }
312
-    
313
-    
314
-    protected function _ajax_hooks()
315
-    {
316
-        add_action('wp_ajax_activate_messenger', array($this, 'activate_messenger_toggle'));
317
-        add_action('wp_ajax_activate_mt', array($this, 'activate_mt_toggle'));
318
-        add_action('wp_ajax_ee_msgs_save_settings', array($this, 'save_settings'));
319
-        add_action('wp_ajax_ee_msgs_update_mt_form', array($this, 'update_mt_form'));
320
-        add_action('wp_ajax_switch_template_pack', array($this, 'switch_template_pack'));
321
-    }
322
-    
323
-    
324
-    protected function _define_page_props()
325
-    {
326
-        $this->_admin_page_title = $this->page_label;
327
-        $this->_labels           = array(
328
-            'buttons'    => array(
329
-                'add'    => __('Add New Message Template', 'event_espresso'),
330
-                'edit'   => __('Edit Message Template', 'event_espresso'),
331
-                'delete' => __('Delete Message Template', 'event_espresso')
332
-            ),
333
-            'publishbox' => __('Update Actions', 'event_espresso')
334
-        );
335
-    }
336
-    
337
-    
338
-    /**
339
-     *        an array for storing key => value pairs of request actions and their corresponding methods
340
-     * @access protected
341
-     * @return void
342
-     */
343
-    protected function _set_page_routes()
344
-    {
345
-        $grp_id = ! empty($this->_req_data['GRP_ID']) && ! is_array($this->_req_data['GRP_ID'])
346
-            ? $this->_req_data['GRP_ID']
347
-            : 0;
348
-        $grp_id = empty($grp_id) && ! empty($this->_req_data['id'])
349
-            ? $this->_req_data['id']
350
-            : $grp_id;
351
-        $msg_id = ! empty($this->_req_data['MSG_ID']) && ! is_array($this->_req_data['MSG_ID'])
352
-            ? $this->_req_data['MSG_ID']
353
-            : 0;
354
-        
355
-        $this->_page_routes = array(
356
-            'default'                          => array(
357
-                'func'       => '_message_queue_list_table',
358
-                'capability' => 'ee_read_global_messages'
359
-            ),
360
-            'global_mtps'                      => array(
361
-                'func'       => '_ee_default_messages_overview_list_table',
362
-                'capability' => 'ee_read_global_messages'
363
-            ),
364
-            'custom_mtps'                      => array(
365
-                'func'       => '_custom_mtps_preview',
366
-                'capability' => 'ee_read_messages'
367
-            ),
368
-            'add_new_message_template'         => array(
369
-                'func'       => '_add_message_template',
370
-                'capability' => 'ee_edit_messages',
371
-                'noheader'   => true
372
-            ),
373
-            'edit_message_template'            => array(
374
-                'func'       => '_edit_message_template',
375
-                'capability' => 'ee_edit_message',
376
-                'obj_id'     => $grp_id
377
-            ),
378
-            'preview_message'                  => array(
379
-                'func'               => '_preview_message',
380
-                'capability'         => 'ee_read_message',
381
-                'obj_id'             => $grp_id,
382
-                'noheader'           => true,
383
-                'headers_sent_route' => 'display_preview_message'
384
-            ),
385
-            'display_preview_message'          => array(
386
-                'func'       => '_display_preview_message',
387
-                'capability' => 'ee_read_message',
388
-                'obj_id'     => $grp_id
389
-            ),
390
-            'insert_message_template'          => array(
391
-                'func'       => '_insert_or_update_message_template',
392
-                'capability' => 'ee_edit_messages',
393
-                'args'       => array('new_template' => true),
394
-                'noheader'   => true
395
-            ),
396
-            'update_message_template'          => array(
397
-                'func'       => '_insert_or_update_message_template',
398
-                'capability' => 'ee_edit_message',
399
-                'obj_id'     => $grp_id,
400
-                'args'       => array('new_template' => false),
401
-                'noheader'   => true
402
-            ),
403
-            'trash_message_template'           => array(
404
-                'func'       => '_trash_or_restore_message_template',
405
-                'capability' => 'ee_delete_message',
406
-                'obj_id'     => $grp_id,
407
-                'args'       => array('trash' => true, 'all' => true),
408
-                'noheader'   => true
409
-            ),
410
-            'trash_message_template_context'   => array(
411
-                'func'       => '_trash_or_restore_message_template',
412
-                'capability' => 'ee_delete_message',
413
-                'obj_id'     => $grp_id,
414
-                'args'       => array('trash' => true),
415
-                'noheader'   => true
416
-            ),
417
-            'restore_message_template'         => array(
418
-                'func'       => '_trash_or_restore_message_template',
419
-                'capability' => 'ee_delete_message',
420
-                'obj_id'     => $grp_id,
421
-                'args'       => array('trash' => false, 'all' => true),
422
-                'noheader'   => true
423
-            ),
424
-            'restore_message_template_context' => array(
425
-                'func'       => '_trash_or_restore_message_template',
426
-                'capability' => 'ee_delete_message',
427
-                'obj_id'     => $grp_id,
428
-                'args'       => array('trash' => false),
429
-                'noheader'   => true
430
-            ),
431
-            'delete_message_template'          => array(
432
-                'func'       => '_delete_message_template',
433
-                'capability' => 'ee_delete_message',
434
-                'obj_id'     => $grp_id,
435
-                'noheader'   => true
436
-            ),
437
-            'reset_to_default'                 => array(
438
-                'func'       => '_reset_to_default_template',
439
-                'capability' => 'ee_edit_message',
440
-                'obj_id'     => $grp_id,
441
-                'noheader'   => true
442
-            ),
443
-            'settings'                         => array(
444
-                'func'       => '_settings',
445
-                'capability' => 'manage_options'
446
-            ),
447
-            'update_global_settings'           => array(
448
-                'func'       => '_update_global_settings',
449
-                'capability' => 'manage_options',
450
-                'noheader'   => true
451
-            ),
452
-            'generate_now'                     => array(
453
-                'func'       => '_generate_now',
454
-                'capability' => 'ee_send_message',
455
-                'noheader'   => true
456
-            ),
457
-            'generate_and_send_now'            => array(
458
-                'func'       => '_generate_and_send_now',
459
-                'capability' => 'ee_send_message',
460
-                'noheader'   => true
461
-            ),
462
-            'queue_for_resending'              => array(
463
-                'func'       => '_queue_for_resending',
464
-                'capability' => 'ee_send_message',
465
-                'noheader'   => true
466
-            ),
467
-            'send_now'                         => array(
468
-                'func'       => '_send_now',
469
-                'capability' => 'ee_send_message',
470
-                'noheader'   => true
471
-            ),
472
-            'delete_ee_message'                => array(
473
-                'func'       => '_delete_ee_messages',
474
-                'capability' => 'ee_delete_message',
475
-                'noheader'   => true
476
-            ),
477
-            'delete_ee_messages'               => array(
478
-                'func'       => '_delete_ee_messages',
479
-                'capability' => 'ee_delete_messages',
480
-                'noheader'   => true,
481
-                'obj_id'     => $msg_id
482
-            )
483
-        );
484
-    }
485
-    
486
-    
487
-    protected function _set_page_config()
488
-    {
489
-        $this->_page_config = array(
490
-            'default'                  => array(
491
-                'nav'           => array(
492
-                    'label' => __('Message Activity', 'event_espresso'),
493
-                    'order' => 10
494
-                ),
495
-                'list_table'    => 'EE_Message_List_Table',
496
-                // 'qtips' => array( 'EE_Message_List_Table_Tips' ),
497
-                'require_nonce' => false
498
-            ),
499
-            'global_mtps'              => array(
500
-                'nav'           => array(
501
-                    'label' => __('Default Message Templates', 'event_espresso'),
502
-                    'order' => 20
503
-                ),
504
-                'list_table'    => 'Messages_Template_List_Table',
505
-                'help_tabs'     => array(
506
-                    'messages_overview_help_tab'                                => array(
507
-                        'title'    => __('Messages Overview', 'event_espresso'),
508
-                        'filename' => 'messages_overview'
509
-                    ),
510
-                    'messages_overview_messages_table_column_headings_help_tab' => array(
511
-                        'title'    => __('Messages Table Column Headings', 'event_espresso'),
512
-                        'filename' => 'messages_overview_table_column_headings'
513
-                    ),
514
-                    'messages_overview_messages_filters_help_tab'               => array(
515
-                        'title'    => __('Message Filters', 'event_espresso'),
516
-                        'filename' => 'messages_overview_filters'
517
-                    ),
518
-                    'messages_overview_messages_views_help_tab'                 => array(
519
-                        'title'    => __('Message Views', 'event_espresso'),
520
-                        'filename' => 'messages_overview_views'
521
-                    ),
522
-                    'message_overview_message_types_help_tab'                   => array(
523
-                        'title'    => __('Message Types', 'event_espresso'),
524
-                        'filename' => 'messages_overview_types'
525
-                    ),
526
-                    'messages_overview_messengers_help_tab'                     => array(
527
-                        'title'    => __('Messengers', 'event_espresso'),
528
-                        'filename' => 'messages_overview_messengers',
529
-                    ),
530
-                ),
531
-                'help_tour'     => array('Messages_Overview_Help_Tour'),
532
-                'require_nonce' => false
533
-            ),
534
-            'custom_mtps'              => array(
535
-                'nav'           => array(
536
-                    'label' => __('Custom Message Templates', 'event_espresso'),
537
-                    'order' => 30
538
-                ),
539
-                'help_tabs'     => array(),
540
-                'help_tour'     => array(),
541
-                'require_nonce' => false
542
-            ),
543
-            'add_new_message_template' => array(
544
-                'nav'           => array(
545
-                    'label'      => __('Add New Message Templates', 'event_espresso'),
546
-                    'order'      => 5,
547
-                    'persistent' => false
548
-                ),
549
-                'require_nonce' => false
550
-            ),
551
-            'edit_message_template'    => array(
552
-                'labels'        => array(
553
-                    'buttons'    => array(
554
-                        'reset' => __('Reset Templates'),
555
-                    ),
556
-                    'publishbox' => __('Update Actions', 'event_espresso')
557
-                ),
558
-                'nav'           => array(
559
-                    'label'      => __('Edit Message Templates', 'event_espresso'),
560
-                    'order'      => 5,
561
-                    'persistent' => false,
562
-                    'url'        => ''
563
-                ),
564
-                'metaboxes'     => array('_publish_post_box', '_register_edit_meta_boxes'),
565
-                'has_metaboxes' => true,
566
-                'help_tour'     => array('Message_Templates_Edit_Help_Tour'),
567
-                'help_tabs'     => array(
568
-                    'edit_message_template'       => array(
569
-                        'title'    => __('Message Template Editor', 'event_espresso'),
570
-                        'callback' => 'edit_message_template_help_tab'
571
-                    ),
572
-                    'message_templates_help_tab'  => array(
573
-                        'title'    => __('Message Templates', 'event_espresso'),
574
-                        'filename' => 'messages_templates'
575
-                    ),
576
-                    'message_template_shortcodes' => array(
577
-                        'title'    => __('Message Shortcodes', 'event_espresso'),
578
-                        'callback' => 'message_template_shortcodes_help_tab'
579
-                    ),
580
-                    'message_preview_help_tab'    => array(
581
-                        'title'    => __('Message Preview', 'event_espresso'),
582
-                        'filename' => 'messages_preview'
583
-                    ),
584
-                    'messages_overview_other_help_tab'                          => array(
585
-                        'title'    => __('Messages Other', 'event_espresso'),
586
-                        'filename' => 'messages_overview_other',
587
-                    ),
588
-                ),
589
-                'require_nonce' => false
590
-            ),
591
-            'display_preview_message'  => array(
592
-                'nav'           => array(
593
-                    'label'      => __('Message Preview', 'event_espresso'),
594
-                    'order'      => 5,
595
-                    'url'        => '',
596
-                    'persistent' => false
597
-                ),
598
-                'help_tabs'     => array(
599
-                    'preview_message' => array(
600
-                        'title'    => __('About Previews', 'event_espresso'),
601
-                        'callback' => 'preview_message_help_tab'
602
-                    )
603
-                ),
604
-                'require_nonce' => false
605
-            ),
606
-            'settings'                 => array(
607
-                'nav'           => array(
608
-                    'label' => __('Settings', 'event_espresso'),
609
-                    'order' => 40
610
-                ),
611
-                'metaboxes'     => array('_messages_settings_metaboxes'),
612
-                'help_tabs'     => array(
613
-                    'messages_settings_help_tab'               => array(
614
-                        'title'    => __('Messages Settings', 'event_espresso'),
615
-                        'filename' => 'messages_settings'
616
-                    ),
617
-                    'messages_settings_message_types_help_tab' => array(
618
-                        'title'    => __('Activating / Deactivating Message Types', 'event_espresso'),
619
-                        'filename' => 'messages_settings_message_types'
620
-                    ),
621
-                    'messages_settings_messengers_help_tab'    => array(
622
-                        'title'    => __('Activating / Deactivating Messengers', 'event_espresso'),
623
-                        'filename' => 'messages_settings_messengers'
624
-                    ),
625
-                ),
626
-                'help_tour'     => array('Messages_Settings_Help_Tour'),
627
-                'require_nonce' => false
628
-            )
629
-        );
630
-    }
631
-    
632
-    
633
-    protected function _add_screen_options()
634
-    {
635
-        //todo
636
-    }
637
-    
638
-    
639
-    protected function _add_screen_options_global_mtps()
640
-    {
641
-        /**
642
-         * Note: the reason for the value swap here on $this->_admin_page_title is because $this->_per_page_screen_options
643
-         * uses the $_admin_page_title property and we want different outputs in the different spots.
644
-         */
645
-        $page_title              = $this->_admin_page_title;
646
-        $this->_admin_page_title = __('Global Message Templates', 'event_espresso');
647
-        $this->_per_page_screen_option();
648
-        $this->_admin_page_title = $page_title;
649
-    }
650
-    
651
-    
652
-    protected function _add_screen_options_default()
653
-    {
654
-        $this->_admin_page_title = __('Message Activity', 'event_espresso');
655
-        $this->_per_page_screen_option();
656
-    }
657
-    
658
-    
659
-    //none of the below group are currently used for Messages
660
-    protected function _add_feature_pointers()
661
-    {
662
-    }
663
-    
664
-    public function admin_init()
665
-    {
666
-    }
667
-    
668
-    public function admin_notices()
669
-    {
670
-    }
671
-    
672
-    public function admin_footer_scripts()
673
-    {
674
-    }
675
-    
676
-    
677
-    public function messages_help_tab()
678
-    {
679
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_help_tab.template.php');
680
-    }
681
-    
682
-    
683
-    public function messengers_help_tab()
684
-    {
685
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messenger_help_tab.template.php');
686
-    }
687
-    
688
-    
689
-    public function message_types_help_tab()
690
-    {
691
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_type_help_tab.template.php');
692
-    }
693
-    
694
-    
695
-    public function messages_overview_help_tab()
696
-    {
697
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_overview_help_tab.template.php');
698
-    }
699
-    
700
-    
701
-    public function message_templates_help_tab()
702
-    {
703
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_templates_help_tab.template.php');
704
-    }
705
-    
706
-    
707
-    public function edit_message_template_help_tab()
708
-    {
709
-        $args['img1'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/editor.png' . '" alt="' . esc_attr__('Editor Title',
710
-                'event_espresso') . '" />';
711
-        $args['img2'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/switch-context.png' . '" alt="' . esc_attr__('Context Switcher and Preview',
712
-                'event_espresso') . '" />';
713
-        $args['img3'] = '<img class="left" src="' . EE_MSG_ASSETS_URL . 'images/form-fields.png' . '" alt="' . esc_attr__('Message Template Form Fields',
714
-                'event_espresso') . '" />';
715
-        $args['img4'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/shortcodes-metabox.png' . '" alt="' . esc_attr__('Shortcodes Metabox',
716
-                'event_espresso') . '" />';
717
-        $args['img5'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/publish-meta-box.png' . '" alt="' . esc_attr__('Publish Metabox',
718
-                'event_espresso') . '" />';
719
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_templates_editor_help_tab.template.php',
720
-            $args);
721
-    }
722
-    
723
-    
724
-    public function message_template_shortcodes_help_tab()
725
-    {
726
-        $this->_set_shortcodes();
727
-        $args['shortcodes'] = $this->_shortcodes;
728
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_shortcodes_help_tab.template.php',
729
-            $args);
730
-    }
179
+			'4.9.9.rc.014'
180
+		);
181
+        
182
+		$contexts                = array();
183
+		$active_message_contexts = EEM_Message::instance()->get_all(array('group_by' => 'MSG_context'));
184
+		foreach ($active_message_contexts as $active_message) {
185
+			if ($active_message instanceof EE_Message) {
186
+				$message_type = $active_message->message_type_object();
187
+				if ($message_type instanceof EE_message_type) {
188
+					$message_type_contexts = $message_type->get_contexts();
189
+					foreach ($message_type_contexts as $context => $context_details) {
190
+						$contexts[$context] = $context_details['label'];
191
+					}
192
+				}
193
+			}
194
+		}
195
+        
196
+		return $contexts;
197
+	}
198
+    
199
+    
200
+	/**
201
+	 * Generate select input with provided messenger options array.
202
+	 *
203
+	 * @param array $messenger_options Array of messengers indexed by messenger slug and values are the messenger
204
+	 *                                 labels.
205
+	 *
206
+	 * @return string
207
+	 */
208
+	public function get_messengers_select_input($messenger_options)
209
+	{
210
+		//if empty or just one value then just return an empty string
211
+		if (empty($messenger_options)
212
+			|| ! is_array($messenger_options)
213
+			|| count($messenger_options) === 1
214
+		) {
215
+			return '';
216
+		}
217
+		//merge in default
218
+		$messenger_options = array_merge(
219
+			array('none_selected' => __('Show All Messengers', 'event_espresso')),
220
+			$messenger_options
221
+		);
222
+		$input             = new EE_Select_Input(
223
+			$messenger_options,
224
+			array(
225
+				'html_name'  => 'ee_messenger_filter_by',
226
+				'html_id'    => 'ee_messenger_filter_by',
227
+				'html_class' => 'wide',
228
+				'default'    => isset($this->_req_data['ee_messenger_filter_by'])
229
+					? sanitize_title($this->_req_data['ee_messenger_filter_by'])
230
+					: 'none_selected'
231
+			)
232
+		);
233
+        
234
+		return $input->get_html_for_input();
235
+	}
236
+    
237
+    
238
+	/**
239
+	 * Generate select input with provided message type options array.
240
+	 *
241
+	 * @param array $message_type_options Array of message types indexed by message type slug, and values are the
242
+	 *                                    message type labels
243
+	 *
244
+	 * @return string
245
+	 */
246
+	public function get_message_types_select_input($message_type_options)
247
+	{
248
+		//if empty or count of options is 1 then just return an empty string
249
+		if (empty($message_type_options)
250
+			|| ! is_array($message_type_options)
251
+			|| count($message_type_options) === 1
252
+		) {
253
+			return '';
254
+		}
255
+		//merge in default
256
+		$message_type_options = array_merge(
257
+			array('none_selected' => __('Show All Message Types', 'event_espresso')),
258
+			$message_type_options
259
+		);
260
+		$input                = new EE_Select_Input(
261
+			$message_type_options,
262
+			array(
263
+				'html_name'  => 'ee_message_type_filter_by',
264
+				'html_id'    => 'ee_message_type_filter_by',
265
+				'html_class' => 'wide',
266
+				'default'    => isset($this->_req_data['ee_message_type_filter_by'])
267
+					? sanitize_title($this->_req_data['ee_message_type_filter_by'])
268
+					: 'none_selected',
269
+			)
270
+		);
271
+        
272
+		return $input->get_html_for_input();
273
+	}
274
+    
275
+    
276
+	/**
277
+	 * Generate select input with provide message type contexts array.
278
+	 *
279
+	 * @param array $context_options Array of message type contexts indexed by context slug, and values are the
280
+	 *                               context label.
281
+	 *
282
+	 * @return string
283
+	 */
284
+	public function get_contexts_for_message_types_select_input($context_options)
285
+	{
286
+		//if empty or count of options is one then just return empty string
287
+		if (empty($context_options)
288
+			|| ! is_array($context_options)
289
+			|| count($context_options) === 1
290
+		) {
291
+			return '';
292
+		}
293
+		//merge in default
294
+		$context_options = array_merge(
295
+			array('none_selected' => __('Show all Contexts', 'event_espresso')),
296
+			$context_options
297
+		);
298
+		$input           = new EE_Select_Input(
299
+			$context_options,
300
+			array(
301
+				'html_name'  => 'ee_context_filter_by',
302
+				'html_id'    => 'ee_context_filter_by',
303
+				'html_class' => 'wide',
304
+				'default'    => isset($this->_req_data['ee_context_filter_by'])
305
+					? sanitize_title($this->_req_data['ee_context_filter_by'])
306
+					: 'none_selected',
307
+			)
308
+		);
309
+        
310
+		return $input->get_html_for_input();
311
+	}
312
+    
313
+    
314
+	protected function _ajax_hooks()
315
+	{
316
+		add_action('wp_ajax_activate_messenger', array($this, 'activate_messenger_toggle'));
317
+		add_action('wp_ajax_activate_mt', array($this, 'activate_mt_toggle'));
318
+		add_action('wp_ajax_ee_msgs_save_settings', array($this, 'save_settings'));
319
+		add_action('wp_ajax_ee_msgs_update_mt_form', array($this, 'update_mt_form'));
320
+		add_action('wp_ajax_switch_template_pack', array($this, 'switch_template_pack'));
321
+	}
322
+    
323
+    
324
+	protected function _define_page_props()
325
+	{
326
+		$this->_admin_page_title = $this->page_label;
327
+		$this->_labels           = array(
328
+			'buttons'    => array(
329
+				'add'    => __('Add New Message Template', 'event_espresso'),
330
+				'edit'   => __('Edit Message Template', 'event_espresso'),
331
+				'delete' => __('Delete Message Template', 'event_espresso')
332
+			),
333
+			'publishbox' => __('Update Actions', 'event_espresso')
334
+		);
335
+	}
336
+    
337
+    
338
+	/**
339
+	 *        an array for storing key => value pairs of request actions and their corresponding methods
340
+	 * @access protected
341
+	 * @return void
342
+	 */
343
+	protected function _set_page_routes()
344
+	{
345
+		$grp_id = ! empty($this->_req_data['GRP_ID']) && ! is_array($this->_req_data['GRP_ID'])
346
+			? $this->_req_data['GRP_ID']
347
+			: 0;
348
+		$grp_id = empty($grp_id) && ! empty($this->_req_data['id'])
349
+			? $this->_req_data['id']
350
+			: $grp_id;
351
+		$msg_id = ! empty($this->_req_data['MSG_ID']) && ! is_array($this->_req_data['MSG_ID'])
352
+			? $this->_req_data['MSG_ID']
353
+			: 0;
354
+        
355
+		$this->_page_routes = array(
356
+			'default'                          => array(
357
+				'func'       => '_message_queue_list_table',
358
+				'capability' => 'ee_read_global_messages'
359
+			),
360
+			'global_mtps'                      => array(
361
+				'func'       => '_ee_default_messages_overview_list_table',
362
+				'capability' => 'ee_read_global_messages'
363
+			),
364
+			'custom_mtps'                      => array(
365
+				'func'       => '_custom_mtps_preview',
366
+				'capability' => 'ee_read_messages'
367
+			),
368
+			'add_new_message_template'         => array(
369
+				'func'       => '_add_message_template',
370
+				'capability' => 'ee_edit_messages',
371
+				'noheader'   => true
372
+			),
373
+			'edit_message_template'            => array(
374
+				'func'       => '_edit_message_template',
375
+				'capability' => 'ee_edit_message',
376
+				'obj_id'     => $grp_id
377
+			),
378
+			'preview_message'                  => array(
379
+				'func'               => '_preview_message',
380
+				'capability'         => 'ee_read_message',
381
+				'obj_id'             => $grp_id,
382
+				'noheader'           => true,
383
+				'headers_sent_route' => 'display_preview_message'
384
+			),
385
+			'display_preview_message'          => array(
386
+				'func'       => '_display_preview_message',
387
+				'capability' => 'ee_read_message',
388
+				'obj_id'     => $grp_id
389
+			),
390
+			'insert_message_template'          => array(
391
+				'func'       => '_insert_or_update_message_template',
392
+				'capability' => 'ee_edit_messages',
393
+				'args'       => array('new_template' => true),
394
+				'noheader'   => true
395
+			),
396
+			'update_message_template'          => array(
397
+				'func'       => '_insert_or_update_message_template',
398
+				'capability' => 'ee_edit_message',
399
+				'obj_id'     => $grp_id,
400
+				'args'       => array('new_template' => false),
401
+				'noheader'   => true
402
+			),
403
+			'trash_message_template'           => array(
404
+				'func'       => '_trash_or_restore_message_template',
405
+				'capability' => 'ee_delete_message',
406
+				'obj_id'     => $grp_id,
407
+				'args'       => array('trash' => true, 'all' => true),
408
+				'noheader'   => true
409
+			),
410
+			'trash_message_template_context'   => array(
411
+				'func'       => '_trash_or_restore_message_template',
412
+				'capability' => 'ee_delete_message',
413
+				'obj_id'     => $grp_id,
414
+				'args'       => array('trash' => true),
415
+				'noheader'   => true
416
+			),
417
+			'restore_message_template'         => array(
418
+				'func'       => '_trash_or_restore_message_template',
419
+				'capability' => 'ee_delete_message',
420
+				'obj_id'     => $grp_id,
421
+				'args'       => array('trash' => false, 'all' => true),
422
+				'noheader'   => true
423
+			),
424
+			'restore_message_template_context' => array(
425
+				'func'       => '_trash_or_restore_message_template',
426
+				'capability' => 'ee_delete_message',
427
+				'obj_id'     => $grp_id,
428
+				'args'       => array('trash' => false),
429
+				'noheader'   => true
430
+			),
431
+			'delete_message_template'          => array(
432
+				'func'       => '_delete_message_template',
433
+				'capability' => 'ee_delete_message',
434
+				'obj_id'     => $grp_id,
435
+				'noheader'   => true
436
+			),
437
+			'reset_to_default'                 => array(
438
+				'func'       => '_reset_to_default_template',
439
+				'capability' => 'ee_edit_message',
440
+				'obj_id'     => $grp_id,
441
+				'noheader'   => true
442
+			),
443
+			'settings'                         => array(
444
+				'func'       => '_settings',
445
+				'capability' => 'manage_options'
446
+			),
447
+			'update_global_settings'           => array(
448
+				'func'       => '_update_global_settings',
449
+				'capability' => 'manage_options',
450
+				'noheader'   => true
451
+			),
452
+			'generate_now'                     => array(
453
+				'func'       => '_generate_now',
454
+				'capability' => 'ee_send_message',
455
+				'noheader'   => true
456
+			),
457
+			'generate_and_send_now'            => array(
458
+				'func'       => '_generate_and_send_now',
459
+				'capability' => 'ee_send_message',
460
+				'noheader'   => true
461
+			),
462
+			'queue_for_resending'              => array(
463
+				'func'       => '_queue_for_resending',
464
+				'capability' => 'ee_send_message',
465
+				'noheader'   => true
466
+			),
467
+			'send_now'                         => array(
468
+				'func'       => '_send_now',
469
+				'capability' => 'ee_send_message',
470
+				'noheader'   => true
471
+			),
472
+			'delete_ee_message'                => array(
473
+				'func'       => '_delete_ee_messages',
474
+				'capability' => 'ee_delete_message',
475
+				'noheader'   => true
476
+			),
477
+			'delete_ee_messages'               => array(
478
+				'func'       => '_delete_ee_messages',
479
+				'capability' => 'ee_delete_messages',
480
+				'noheader'   => true,
481
+				'obj_id'     => $msg_id
482
+			)
483
+		);
484
+	}
485
+    
486
+    
487
+	protected function _set_page_config()
488
+	{
489
+		$this->_page_config = array(
490
+			'default'                  => array(
491
+				'nav'           => array(
492
+					'label' => __('Message Activity', 'event_espresso'),
493
+					'order' => 10
494
+				),
495
+				'list_table'    => 'EE_Message_List_Table',
496
+				// 'qtips' => array( 'EE_Message_List_Table_Tips' ),
497
+				'require_nonce' => false
498
+			),
499
+			'global_mtps'              => array(
500
+				'nav'           => array(
501
+					'label' => __('Default Message Templates', 'event_espresso'),
502
+					'order' => 20
503
+				),
504
+				'list_table'    => 'Messages_Template_List_Table',
505
+				'help_tabs'     => array(
506
+					'messages_overview_help_tab'                                => array(
507
+						'title'    => __('Messages Overview', 'event_espresso'),
508
+						'filename' => 'messages_overview'
509
+					),
510
+					'messages_overview_messages_table_column_headings_help_tab' => array(
511
+						'title'    => __('Messages Table Column Headings', 'event_espresso'),
512
+						'filename' => 'messages_overview_table_column_headings'
513
+					),
514
+					'messages_overview_messages_filters_help_tab'               => array(
515
+						'title'    => __('Message Filters', 'event_espresso'),
516
+						'filename' => 'messages_overview_filters'
517
+					),
518
+					'messages_overview_messages_views_help_tab'                 => array(
519
+						'title'    => __('Message Views', 'event_espresso'),
520
+						'filename' => 'messages_overview_views'
521
+					),
522
+					'message_overview_message_types_help_tab'                   => array(
523
+						'title'    => __('Message Types', 'event_espresso'),
524
+						'filename' => 'messages_overview_types'
525
+					),
526
+					'messages_overview_messengers_help_tab'                     => array(
527
+						'title'    => __('Messengers', 'event_espresso'),
528
+						'filename' => 'messages_overview_messengers',
529
+					),
530
+				),
531
+				'help_tour'     => array('Messages_Overview_Help_Tour'),
532
+				'require_nonce' => false
533
+			),
534
+			'custom_mtps'              => array(
535
+				'nav'           => array(
536
+					'label' => __('Custom Message Templates', 'event_espresso'),
537
+					'order' => 30
538
+				),
539
+				'help_tabs'     => array(),
540
+				'help_tour'     => array(),
541
+				'require_nonce' => false
542
+			),
543
+			'add_new_message_template' => array(
544
+				'nav'           => array(
545
+					'label'      => __('Add New Message Templates', 'event_espresso'),
546
+					'order'      => 5,
547
+					'persistent' => false
548
+				),
549
+				'require_nonce' => false
550
+			),
551
+			'edit_message_template'    => array(
552
+				'labels'        => array(
553
+					'buttons'    => array(
554
+						'reset' => __('Reset Templates'),
555
+					),
556
+					'publishbox' => __('Update Actions', 'event_espresso')
557
+				),
558
+				'nav'           => array(
559
+					'label'      => __('Edit Message Templates', 'event_espresso'),
560
+					'order'      => 5,
561
+					'persistent' => false,
562
+					'url'        => ''
563
+				),
564
+				'metaboxes'     => array('_publish_post_box', '_register_edit_meta_boxes'),
565
+				'has_metaboxes' => true,
566
+				'help_tour'     => array('Message_Templates_Edit_Help_Tour'),
567
+				'help_tabs'     => array(
568
+					'edit_message_template'       => array(
569
+						'title'    => __('Message Template Editor', 'event_espresso'),
570
+						'callback' => 'edit_message_template_help_tab'
571
+					),
572
+					'message_templates_help_tab'  => array(
573
+						'title'    => __('Message Templates', 'event_espresso'),
574
+						'filename' => 'messages_templates'
575
+					),
576
+					'message_template_shortcodes' => array(
577
+						'title'    => __('Message Shortcodes', 'event_espresso'),
578
+						'callback' => 'message_template_shortcodes_help_tab'
579
+					),
580
+					'message_preview_help_tab'    => array(
581
+						'title'    => __('Message Preview', 'event_espresso'),
582
+						'filename' => 'messages_preview'
583
+					),
584
+					'messages_overview_other_help_tab'                          => array(
585
+						'title'    => __('Messages Other', 'event_espresso'),
586
+						'filename' => 'messages_overview_other',
587
+					),
588
+				),
589
+				'require_nonce' => false
590
+			),
591
+			'display_preview_message'  => array(
592
+				'nav'           => array(
593
+					'label'      => __('Message Preview', 'event_espresso'),
594
+					'order'      => 5,
595
+					'url'        => '',
596
+					'persistent' => false
597
+				),
598
+				'help_tabs'     => array(
599
+					'preview_message' => array(
600
+						'title'    => __('About Previews', 'event_espresso'),
601
+						'callback' => 'preview_message_help_tab'
602
+					)
603
+				),
604
+				'require_nonce' => false
605
+			),
606
+			'settings'                 => array(
607
+				'nav'           => array(
608
+					'label' => __('Settings', 'event_espresso'),
609
+					'order' => 40
610
+				),
611
+				'metaboxes'     => array('_messages_settings_metaboxes'),
612
+				'help_tabs'     => array(
613
+					'messages_settings_help_tab'               => array(
614
+						'title'    => __('Messages Settings', 'event_espresso'),
615
+						'filename' => 'messages_settings'
616
+					),
617
+					'messages_settings_message_types_help_tab' => array(
618
+						'title'    => __('Activating / Deactivating Message Types', 'event_espresso'),
619
+						'filename' => 'messages_settings_message_types'
620
+					),
621
+					'messages_settings_messengers_help_tab'    => array(
622
+						'title'    => __('Activating / Deactivating Messengers', 'event_espresso'),
623
+						'filename' => 'messages_settings_messengers'
624
+					),
625
+				),
626
+				'help_tour'     => array('Messages_Settings_Help_Tour'),
627
+				'require_nonce' => false
628
+			)
629
+		);
630
+	}
631
+    
632
+    
633
+	protected function _add_screen_options()
634
+	{
635
+		//todo
636
+	}
637
+    
638
+    
639
+	protected function _add_screen_options_global_mtps()
640
+	{
641
+		/**
642
+		 * Note: the reason for the value swap here on $this->_admin_page_title is because $this->_per_page_screen_options
643
+		 * uses the $_admin_page_title property and we want different outputs in the different spots.
644
+		 */
645
+		$page_title              = $this->_admin_page_title;
646
+		$this->_admin_page_title = __('Global Message Templates', 'event_espresso');
647
+		$this->_per_page_screen_option();
648
+		$this->_admin_page_title = $page_title;
649
+	}
650
+    
651
+    
652
+	protected function _add_screen_options_default()
653
+	{
654
+		$this->_admin_page_title = __('Message Activity', 'event_espresso');
655
+		$this->_per_page_screen_option();
656
+	}
657
+    
658
+    
659
+	//none of the below group are currently used for Messages
660
+	protected function _add_feature_pointers()
661
+	{
662
+	}
663
+    
664
+	public function admin_init()
665
+	{
666
+	}
667
+    
668
+	public function admin_notices()
669
+	{
670
+	}
671
+    
672
+	public function admin_footer_scripts()
673
+	{
674
+	}
675
+    
676
+    
677
+	public function messages_help_tab()
678
+	{
679
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_help_tab.template.php');
680
+	}
681
+    
682
+    
683
+	public function messengers_help_tab()
684
+	{
685
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messenger_help_tab.template.php');
686
+	}
687
+    
688
+    
689
+	public function message_types_help_tab()
690
+	{
691
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_type_help_tab.template.php');
692
+	}
693
+    
694
+    
695
+	public function messages_overview_help_tab()
696
+	{
697
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_overview_help_tab.template.php');
698
+	}
699
+    
700
+    
701
+	public function message_templates_help_tab()
702
+	{
703
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_message_templates_help_tab.template.php');
704
+	}
705
+    
706
+    
707
+	public function edit_message_template_help_tab()
708
+	{
709
+		$args['img1'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/editor.png' . '" alt="' . esc_attr__('Editor Title',
710
+				'event_espresso') . '" />';
711
+		$args['img2'] = '<img src="' . EE_MSG_ASSETS_URL . 'images/switch-context.png' . '" alt="' . esc_attr__('Context Switcher and Preview',
712
+				'event_espresso') . '" />';
713
+		$args['img3'] = '<img class="left" src="' . EE_MSG_ASSETS_URL . 'images/form-fields.png' . '" alt="' . esc_attr__('Message Template Form Fields',
714
+				'event_espresso') . '" />';
715
+		$args['img4'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/shortcodes-metabox.png' . '" alt="' . esc_attr__('Shortcodes Metabox',
716
+				'event_espresso') . '" />';
717
+		$args['img5'] = '<img class="right" src="' . EE_MSG_ASSETS_URL . 'images/publish-meta-box.png' . '" alt="' . esc_attr__('Publish Metabox',
718
+				'event_espresso') . '" />';
719
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_templates_editor_help_tab.template.php',
720
+			$args);
721
+	}
722
+    
723
+    
724
+	public function message_template_shortcodes_help_tab()
725
+	{
726
+		$this->_set_shortcodes();
727
+		$args['shortcodes'] = $this->_shortcodes;
728
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_shortcodes_help_tab.template.php',
729
+			$args);
730
+	}
731 731
     
732 732
     
733
-    public function preview_message_help_tab()
734
-    {
735
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_preview_help_tab.template.php');
736
-    }
733
+	public function preview_message_help_tab()
734
+	{
735
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_preview_help_tab.template.php');
736
+	}
737 737
     
738
-    
739
-    public function settings_help_tab()
740
-    {
741
-        $args['img1'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-active.png' . '" alt="' . esc_attr__('Active Email Tab',
742
-                'event_espresso') . '" />';
743
-        $args['img2'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-inactive.png' . '" alt="' . esc_attr__('Inactive Email Tab',
744
-                'event_espresso') . '" />';
745
-        $args['img3'] = '<div class="switch"><input id="ee-on-off-toggle-on" class="ee-on-off-toggle ee-toggle-round-flat" type="checkbox" checked="checked"><label for="ee-on-off-toggle-on"></label>';
746
-        $args['img4'] = '<div class="switch"><input id="ee-on-off-toggle-on" class="ee-on-off-toggle ee-toggle-round-flat" type="checkbox"><label for="ee-on-off-toggle-on"></label>';
747
-        EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_settings_help_tab.template.php', $args);
748
-    }
738
+    
739
+	public function settings_help_tab()
740
+	{
741
+		$args['img1'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-active.png' . '" alt="' . esc_attr__('Active Email Tab',
742
+				'event_espresso') . '" />';
743
+		$args['img2'] = '<img class="inline-text" src="' . EE_MSG_ASSETS_URL . 'images/email-tab-inactive.png' . '" alt="' . esc_attr__('Inactive Email Tab',
744
+				'event_espresso') . '" />';
745
+		$args['img3'] = '<div class="switch"><input id="ee-on-off-toggle-on" class="ee-on-off-toggle ee-toggle-round-flat" type="checkbox" checked="checked"><label for="ee-on-off-toggle-on"></label>';
746
+		$args['img4'] = '<div class="switch"><input id="ee-on-off-toggle-on" class="ee-on-off-toggle ee-toggle-round-flat" type="checkbox"><label for="ee-on-off-toggle-on"></label>';
747
+		EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'ee_msg_messages_settings_help_tab.template.php', $args);
748
+	}
749 749
     
750 750
     
751
-    public function load_scripts_styles()
752
-    {
753
-        wp_register_style('espresso_ee_msg', EE_MSG_ASSETS_URL . 'ee_message_admin.css', EVENT_ESPRESSO_VERSION);
754
-        wp_enqueue_style('espresso_ee_msg');
751
+	public function load_scripts_styles()
752
+	{
753
+		wp_register_style('espresso_ee_msg', EE_MSG_ASSETS_URL . 'ee_message_admin.css', EVENT_ESPRESSO_VERSION);
754
+		wp_enqueue_style('espresso_ee_msg');
755 755
         
756
-        wp_register_script('ee-messages-settings', EE_MSG_ASSETS_URL . 'ee-messages-settings.js',
757
-            array('jquery-ui-droppable', 'ee-serialize-full-array'), EVENT_ESPRESSO_VERSION, true);
758
-        wp_register_script('ee-msg-list-table-js', EE_MSG_ASSETS_URL . 'ee_message_admin_list_table.js',
759
-            array('ee-dialog'), EVENT_ESPRESSO_VERSION);
760
-    }
756
+		wp_register_script('ee-messages-settings', EE_MSG_ASSETS_URL . 'ee-messages-settings.js',
757
+			array('jquery-ui-droppable', 'ee-serialize-full-array'), EVENT_ESPRESSO_VERSION, true);
758
+		wp_register_script('ee-msg-list-table-js', EE_MSG_ASSETS_URL . 'ee_message_admin_list_table.js',
759
+			array('ee-dialog'), EVENT_ESPRESSO_VERSION);
760
+	}
761 761
     
762 762
     
763
-    public function load_scripts_styles_default()
764
-    {
765
-        wp_enqueue_script('ee-msg-list-table-js');
766
-    }
763
+	public function load_scripts_styles_default()
764
+	{
765
+		wp_enqueue_script('ee-msg-list-table-js');
766
+	}
767 767
     
768 768
     
769
-    public function wp_editor_css($mce_css)
770
-    {
771
-        //if we're on the edit_message_template route
772
-        if ($this->_req_action == 'edit_message_template' && $this->_active_messenger instanceof EE_messenger) {
773
-            $message_type_name = $this->_active_message_type_name;
769
+	public function wp_editor_css($mce_css)
770
+	{
771
+		//if we're on the edit_message_template route
772
+		if ($this->_req_action == 'edit_message_template' && $this->_active_messenger instanceof EE_messenger) {
773
+			$message_type_name = $this->_active_message_type_name;
774 774
             
775
-            //we're going to REPLACE the existing mce css
776
-            //we need to get the css file location from the active messenger
777
-            $mce_css = $this->_active_messenger->get_variation($this->_template_pack, $message_type_name, true,
778
-                'wpeditor', $this->_variation);
779
-        }
775
+			//we're going to REPLACE the existing mce css
776
+			//we need to get the css file location from the active messenger
777
+			$mce_css = $this->_active_messenger->get_variation($this->_template_pack, $message_type_name, true,
778
+				'wpeditor', $this->_variation);
779
+		}
780 780
         
781
-        return $mce_css;
782
-    }
781
+		return $mce_css;
782
+	}
783 783
     
784 784
     
785
-    public function load_scripts_styles_edit_message_template()
786
-    {
785
+	public function load_scripts_styles_edit_message_template()
786
+	{
787 787
         
788
-        $this->_set_shortcodes();
788
+		$this->_set_shortcodes();
789 789
         
790
-        EE_Registry::$i18n_js_strings['confirm_default_reset']        = sprintf(
791
-            __('Are you sure you want to reset the %s %s message templates?  Remember continuing will reset the templates for all contexts in this messenger and message type group.',
792
-                'event_espresso'),
793
-            $this->_message_template_group->messenger_obj()->label['singular'],
794
-            $this->_message_template_group->message_type_obj()->label['singular']
795
-        );
796
-        EE_Registry::$i18n_js_strings['confirm_switch_template_pack'] = __('Switching the template pack for a messages template will reset the content for the template so the new layout is loaded.  Any custom content in the existing template will be lost. Are you sure you wish to do this?',
797
-            'event_espresso');
790
+		EE_Registry::$i18n_js_strings['confirm_default_reset']        = sprintf(
791
+			__('Are you sure you want to reset the %s %s message templates?  Remember continuing will reset the templates for all contexts in this messenger and message type group.',
792
+				'event_espresso'),
793
+			$this->_message_template_group->messenger_obj()->label['singular'],
794
+			$this->_message_template_group->message_type_obj()->label['singular']
795
+		);
796
+		EE_Registry::$i18n_js_strings['confirm_switch_template_pack'] = __('Switching the template pack for a messages template will reset the content for the template so the new layout is loaded.  Any custom content in the existing template will be lost. Are you sure you wish to do this?',
797
+			'event_espresso');
798 798
         
799
-        wp_register_script('ee_msgs_edit_js', EE_MSG_ASSETS_URL . 'ee_message_editor.js', array('jquery'),
800
-            EVENT_ESPRESSO_VERSION);
799
+		wp_register_script('ee_msgs_edit_js', EE_MSG_ASSETS_URL . 'ee_message_editor.js', array('jquery'),
800
+			EVENT_ESPRESSO_VERSION);
801 801
         
802
-        wp_enqueue_script('ee_admin_js');
803
-        wp_enqueue_script('ee_msgs_edit_js');
802
+		wp_enqueue_script('ee_admin_js');
803
+		wp_enqueue_script('ee_msgs_edit_js');
804 804
         
805
-        //add in special css for tiny_mce
806
-        add_filter('mce_css', array($this, 'wp_editor_css'));
807
-    }
805
+		//add in special css for tiny_mce
806
+		add_filter('mce_css', array($this, 'wp_editor_css'));
807
+	}
808 808
     
809 809
     
810
-    public function load_scripts_styles_display_preview_message()
811
-    {
810
+	public function load_scripts_styles_display_preview_message()
811
+	{
812 812
         
813
-        $this->_set_message_template_group();
813
+		$this->_set_message_template_group();
814 814
         
815
-        if (isset($this->_req_data['messenger'])) {
816
-            $this->_active_messenger = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
817
-        }
815
+		if (isset($this->_req_data['messenger'])) {
816
+			$this->_active_messenger = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
817
+		}
818 818
         
819
-        $message_type_name = isset($this->_req_data['message_type']) ? $this->_req_data['message_type'] : '';
819
+		$message_type_name = isset($this->_req_data['message_type']) ? $this->_req_data['message_type'] : '';
820 820
         
821 821
         
822
-        wp_enqueue_style('espresso_preview_css',
823
-            $this->_active_messenger->get_variation($this->_template_pack, $message_type_name, true, 'preview',
824
-                $this->_variation));
825
-    }
822
+		wp_enqueue_style('espresso_preview_css',
823
+			$this->_active_messenger->get_variation($this->_template_pack, $message_type_name, true, 'preview',
824
+				$this->_variation));
825
+	}
826 826
     
827 827
     
828
-    public function load_scripts_styles_settings()
829
-    {
830
-        wp_register_style('ee-message-settings', EE_MSG_ASSETS_URL . 'ee_message_settings.css', array(),
831
-            EVENT_ESPRESSO_VERSION);
832
-        wp_enqueue_style('ee-text-links');
833
-        wp_enqueue_style('ee-message-settings');
828
+	public function load_scripts_styles_settings()
829
+	{
830
+		wp_register_style('ee-message-settings', EE_MSG_ASSETS_URL . 'ee_message_settings.css', array(),
831
+			EVENT_ESPRESSO_VERSION);
832
+		wp_enqueue_style('ee-text-links');
833
+		wp_enqueue_style('ee-message-settings');
834 834
         
835
-        wp_enqueue_script('ee-messages-settings');
836
-    }
835
+		wp_enqueue_script('ee-messages-settings');
836
+	}
837 837
     
838 838
     
839
-    /**
840
-     * set views array for List Table
841
-     */
842
-    public function _set_list_table_views_global_mtps()
843
-    {
844
-        $this->_views = array(
845
-            'in_use' => array(
846
-                'slug'        => 'in_use',
847
-                'label'       => __('In Use', 'event_espresso'),
848
-                'count'       => 0,
849
-            )
850
-        );
851
-    }
839
+	/**
840
+	 * set views array for List Table
841
+	 */
842
+	public function _set_list_table_views_global_mtps()
843
+	{
844
+		$this->_views = array(
845
+			'in_use' => array(
846
+				'slug'        => 'in_use',
847
+				'label'       => __('In Use', 'event_espresso'),
848
+				'count'       => 0,
849
+			)
850
+		);
851
+	}
852 852
 
853 853
 
854
-    /**
855
-     * Set views array for the Custom Template List Table
856
-     */
857
-    public function _set_list_table_views_custom_mtps()
858
-    {
859
-        $this->_set_list_table_views_global_mtps();
860
-        $this->_views['in_use']['bulk_action'] = array(
861
-                'trash_message_template' => esc_html__('Move to Trash', 'event_espresso')
862
-        );
863
-    }
864
-    
865
-    
866
-    /**
867
-     * set views array for message queue list table
868
-     */
869
-    public function _set_list_table_views_default()
870
-    {
871
-        EE_Registry::instance()->load_helper('Template');
872
-        
873
-        $common_bulk_actions = EE_Registry::instance()->CAP->current_user_can('ee_send_message',
874
-            'message_list_table_bulk_actions')
875
-            ? array(
876
-                'generate_now'          => __('Generate Now', 'event_espresso'),
877
-                'generate_and_send_now' => __('Generate and Send Now', 'event_espresso'),
878
-                'queue_for_resending'   => __('Queue for Resending', 'event_espresso'),
879
-                'send_now'              => __('Send Now', 'event_espresso')
880
-            )
881
-            : array();
882
-        
883
-        $delete_bulk_action = EE_Registry::instance()->CAP->current_user_can('ee_delete_messages',
884
-            'message_list_table_bulk_actions')
885
-            ? array('delete_ee_messages' => __('Delete Messages', 'event_espresso'))
886
-            : array();
887
-        
888
-        
889
-        $this->_views = array(
890
-            'all' => array(
891
-                'slug'        => 'all',
892
-                'label'       => __('All', 'event_espresso'),
893
-                'count'       => 0,
894
-                'bulk_action' => array_merge($common_bulk_actions, $delete_bulk_action)
895
-            )
896
-        );
897
-        
898
-        
899
-        foreach (EEM_Message::instance()->all_statuses() as $status) {
900
-            if ($status === EEM_Message::status_debug_only && ! EEM_Message::debug()) {
901
-                continue;
902
-            }
903
-            $status_bulk_actions = $common_bulk_actions;
904
-            //unset bulk actions not applying to status
905
-            if (! empty($status_bulk_actions)) {
906
-                switch ($status) {
907
-                    case EEM_Message::status_idle:
908
-                    case EEM_Message::status_resend:
909
-                        $status_bulk_actions['send_now'] = $common_bulk_actions['send_now'];
910
-                        break;
854
+	/**
855
+	 * Set views array for the Custom Template List Table
856
+	 */
857
+	public function _set_list_table_views_custom_mtps()
858
+	{
859
+		$this->_set_list_table_views_global_mtps();
860
+		$this->_views['in_use']['bulk_action'] = array(
861
+				'trash_message_template' => esc_html__('Move to Trash', 'event_espresso')
862
+		);
863
+	}
864
+    
865
+    
866
+	/**
867
+	 * set views array for message queue list table
868
+	 */
869
+	public function _set_list_table_views_default()
870
+	{
871
+		EE_Registry::instance()->load_helper('Template');
872
+        
873
+		$common_bulk_actions = EE_Registry::instance()->CAP->current_user_can('ee_send_message',
874
+			'message_list_table_bulk_actions')
875
+			? array(
876
+				'generate_now'          => __('Generate Now', 'event_espresso'),
877
+				'generate_and_send_now' => __('Generate and Send Now', 'event_espresso'),
878
+				'queue_for_resending'   => __('Queue for Resending', 'event_espresso'),
879
+				'send_now'              => __('Send Now', 'event_espresso')
880
+			)
881
+			: array();
882
+        
883
+		$delete_bulk_action = EE_Registry::instance()->CAP->current_user_can('ee_delete_messages',
884
+			'message_list_table_bulk_actions')
885
+			? array('delete_ee_messages' => __('Delete Messages', 'event_espresso'))
886
+			: array();
887
+        
888
+        
889
+		$this->_views = array(
890
+			'all' => array(
891
+				'slug'        => 'all',
892
+				'label'       => __('All', 'event_espresso'),
893
+				'count'       => 0,
894
+				'bulk_action' => array_merge($common_bulk_actions, $delete_bulk_action)
895
+			)
896
+		);
897
+        
898
+        
899
+		foreach (EEM_Message::instance()->all_statuses() as $status) {
900
+			if ($status === EEM_Message::status_debug_only && ! EEM_Message::debug()) {
901
+				continue;
902
+			}
903
+			$status_bulk_actions = $common_bulk_actions;
904
+			//unset bulk actions not applying to status
905
+			if (! empty($status_bulk_actions)) {
906
+				switch ($status) {
907
+					case EEM_Message::status_idle:
908
+					case EEM_Message::status_resend:
909
+						$status_bulk_actions['send_now'] = $common_bulk_actions['send_now'];
910
+						break;
911 911
                     
912
-                    case EEM_Message::status_failed:
913
-                    case EEM_Message::status_debug_only:
914
-                    case EEM_Message::status_messenger_executing:
915
-                        $status_bulk_actions = array();
916
-                        break;
912
+					case EEM_Message::status_failed:
913
+					case EEM_Message::status_debug_only:
914
+					case EEM_Message::status_messenger_executing:
915
+						$status_bulk_actions = array();
916
+						break;
917 917
                     
918
-                    case EEM_Message::status_incomplete:
919
-                        unset($status_bulk_actions['queue_for_resending'], $status_bulk_actions['send_now']);
920
-                        break;
918
+					case EEM_Message::status_incomplete:
919
+						unset($status_bulk_actions['queue_for_resending'], $status_bulk_actions['send_now']);
920
+						break;
921 921
                     
922
-                    case EEM_Message::status_retry:
923
-                    case EEM_Message::status_sent:
924
-                        unset($status_bulk_actions['generate_now'], $status_bulk_actions['generate_and_send_now']);
925
-                        break;
926
-                }
927
-            }
922
+					case EEM_Message::status_retry:
923
+					case EEM_Message::status_sent:
924
+						unset($status_bulk_actions['generate_now'], $status_bulk_actions['generate_and_send_now']);
925
+						break;
926
+				}
927
+			}
928 928
 
929
-            //skip adding messenger executing status to views because it will be included with the Failed view.
930
-            if ( $status === EEM_Message::status_messenger_executing ) {
931
-                continue;
932
-            }
929
+			//skip adding messenger executing status to views because it will be included with the Failed view.
930
+			if ( $status === EEM_Message::status_messenger_executing ) {
931
+				continue;
932
+			}
933 933
             
934
-            $this->_views[strtolower($status)] = array(
935
-                'slug'        => strtolower($status),
936
-                'label'       => EEH_Template::pretty_status($status, false, 'sentence'),
937
-                'count'       => 0,
938
-                'bulk_action' => array_merge($status_bulk_actions, $delete_bulk_action)
939
-            );
940
-        }
941
-    }
942
-    
943
-    
944
-    protected function _ee_default_messages_overview_list_table()
945
-    {
946
-        $this->_admin_page_title = __('Default Message Templates', 'event_espresso');
947
-        $this->display_admin_list_table_page_with_no_sidebar();
948
-    }
949
-    
950
-    
951
-    protected function _message_queue_list_table()
952
-    {
953
-        $this->_search_btn_label                   = __('Message Activity', 'event_espresso');
954
-        $this->_template_args['per_column']        = 6;
955
-        $this->_template_args['after_list_table']  = $this->_display_legend($this->_message_legend_items());
956
-        $this->_template_args['before_list_table'] = '<h3>' . EEM_Message::instance()->get_pretty_label_for_results() . '</h3>';
957
-        $this->display_admin_list_table_page_with_no_sidebar();
958
-    }
959
-    
960
-    
961
-    protected function _message_legend_items()
962
-    {
963
-        
964
-        $action_css_classes = EEH_MSG_Template::get_message_action_icons();
965
-        $action_items       = array();
966
-        
967
-        foreach ($action_css_classes as $action_item => $action_details) {
968
-            if ($action_item === 'see_notifications_for') {
969
-                continue;
970
-            }
971
-            $action_items[$action_item] = array(
972
-                'class' => $action_details['css_class'],
973
-                'desc'  => $action_details['label']
974
-            );
975
-        }
976
-        
977
-        /** @type array $status_items status legend setup */
978
-        $status_items = array(
979
-            'sent_status'       => array(
980
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_sent,
981
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_sent, false, 'sentence')
982
-            ),
983
-            'idle_status'       => array(
984
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_idle,
985
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_idle, false, 'sentence')
986
-            ),
987
-            'failed_status'     => array(
988
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_failed,
989
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_failed, false, 'sentence')
990
-            ),
991
-            'messenger_executing_status' => array(
992
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_messenger_executing,
993
-                'desc' => EEH_Template::pretty_status(EEM_Message::status_messenger_executing, false, 'sentence')
994
-            ),
995
-            'resend_status'     => array(
996
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_resend,
997
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_resend, false, 'sentence')
998
-            ),
999
-            'incomplete_status' => array(
1000
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_incomplete,
1001
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_incomplete, false, 'sentence')
1002
-            ),
1003
-            'retry_status'      => array(
1004
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_retry,
1005
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_retry, false, 'sentence')
1006
-            )
1007
-        );
1008
-        if (EEM_Message::debug()) {
1009
-            $status_items['debug_only_status'] = array(
1010
-                'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_debug_only,
1011
-                'desc'  => EEH_Template::pretty_status(EEM_Message::status_debug_only, false, 'sentence')
1012
-            );
1013
-        }
1014
-        
1015
-        return array_merge($action_items, $status_items);
1016
-    }
1017
-    
1018
-    
1019
-    protected function _custom_mtps_preview()
1020
-    {
1021
-        $this->_admin_page_title              = __('Custom Message Templates (Preview)', 'event_espresso');
1022
-        $this->_template_args['preview_img']  = '<img src="' . EE_MSG_ASSETS_URL . 'images/custom_mtps_preview.png" alt="' . esc_attr__('Preview Custom Message Templates screenshot',
1023
-                'event_espresso') . '" />';
1024
-        $this->_template_args['preview_text'] = '<strong>' . __('Custom Message Templates is a feature that is only available in the premium version of Event Espresso 4 which is available with a support license purchase on EventEspresso.com. With the Custom Message Templates feature, you are able to create custom message templates and assign them on a per-event basis.',
1025
-                'event_espresso') . '</strong>';
1026
-        $this->display_admin_caf_preview_page('custom_message_types', false);
1027
-    }
1028
-    
1029
-    
1030
-    /**
1031
-     * get_message_templates
1032
-     * This gets all the message templates for listing on the overview list.
1033
-     *
1034
-     * @access public
1035
-     *
1036
-     * @param int    $perpage the amount of templates groups to show per page
1037
-     * @param string $type    the current _view we're getting templates for
1038
-     * @param bool   $count   return count?
1039
-     * @param bool   $all     disregard any paging info (get all data);
1040
-     * @param bool   $global  whether to return just global (true) or custom templates (false)
1041
-     *
1042
-     * @return array
1043
-     */
1044
-    public function get_message_templates($perpage = 10, $type = 'in_use', $count = false, $all = false, $global = true)
1045
-    {
1046
-        
1047
-        $MTP = EEM_Message_Template_Group::instance();
1048
-        
1049
-        $this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? 'GRP_ID' : $this->_req_data['orderby'];
1050
-        $orderby                    = $this->_req_data['orderby'];
1051
-        
1052
-        $order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order'] : 'ASC';
1053
-        
1054
-        $current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged']) ? $this->_req_data['paged'] : 1;
1055
-        $per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage']) ? $this->_req_data['perpage'] : $perpage;
1056
-        
1057
-        $offset = ($current_page - 1) * $per_page;
1058
-        $limit  = $all ? null : array($offset, $per_page);
1059
-        
1060
-        
1061
-        //options will match what is in the _views array property
1062
-        switch ($type) {
934
+			$this->_views[strtolower($status)] = array(
935
+				'slug'        => strtolower($status),
936
+				'label'       => EEH_Template::pretty_status($status, false, 'sentence'),
937
+				'count'       => 0,
938
+				'bulk_action' => array_merge($status_bulk_actions, $delete_bulk_action)
939
+			);
940
+		}
941
+	}
942
+    
943
+    
944
+	protected function _ee_default_messages_overview_list_table()
945
+	{
946
+		$this->_admin_page_title = __('Default Message Templates', 'event_espresso');
947
+		$this->display_admin_list_table_page_with_no_sidebar();
948
+	}
949
+    
950
+    
951
+	protected function _message_queue_list_table()
952
+	{
953
+		$this->_search_btn_label                   = __('Message Activity', 'event_espresso');
954
+		$this->_template_args['per_column']        = 6;
955
+		$this->_template_args['after_list_table']  = $this->_display_legend($this->_message_legend_items());
956
+		$this->_template_args['before_list_table'] = '<h3>' . EEM_Message::instance()->get_pretty_label_for_results() . '</h3>';
957
+		$this->display_admin_list_table_page_with_no_sidebar();
958
+	}
959
+    
960
+    
961
+	protected function _message_legend_items()
962
+	{
963
+        
964
+		$action_css_classes = EEH_MSG_Template::get_message_action_icons();
965
+		$action_items       = array();
966
+        
967
+		foreach ($action_css_classes as $action_item => $action_details) {
968
+			if ($action_item === 'see_notifications_for') {
969
+				continue;
970
+			}
971
+			$action_items[$action_item] = array(
972
+				'class' => $action_details['css_class'],
973
+				'desc'  => $action_details['label']
974
+			);
975
+		}
976
+        
977
+		/** @type array $status_items status legend setup */
978
+		$status_items = array(
979
+			'sent_status'       => array(
980
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_sent,
981
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_sent, false, 'sentence')
982
+			),
983
+			'idle_status'       => array(
984
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_idle,
985
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_idle, false, 'sentence')
986
+			),
987
+			'failed_status'     => array(
988
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_failed,
989
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_failed, false, 'sentence')
990
+			),
991
+			'messenger_executing_status' => array(
992
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_messenger_executing,
993
+				'desc' => EEH_Template::pretty_status(EEM_Message::status_messenger_executing, false, 'sentence')
994
+			),
995
+			'resend_status'     => array(
996
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_resend,
997
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_resend, false, 'sentence')
998
+			),
999
+			'incomplete_status' => array(
1000
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_incomplete,
1001
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_incomplete, false, 'sentence')
1002
+			),
1003
+			'retry_status'      => array(
1004
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_retry,
1005
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_retry, false, 'sentence')
1006
+			)
1007
+		);
1008
+		if (EEM_Message::debug()) {
1009
+			$status_items['debug_only_status'] = array(
1010
+				'class' => 'ee-status-legend ee-status-legend-' . EEM_Message::status_debug_only,
1011
+				'desc'  => EEH_Template::pretty_status(EEM_Message::status_debug_only, false, 'sentence')
1012
+			);
1013
+		}
1014
+        
1015
+		return array_merge($action_items, $status_items);
1016
+	}
1017
+    
1018
+    
1019
+	protected function _custom_mtps_preview()
1020
+	{
1021
+		$this->_admin_page_title              = __('Custom Message Templates (Preview)', 'event_espresso');
1022
+		$this->_template_args['preview_img']  = '<img src="' . EE_MSG_ASSETS_URL . 'images/custom_mtps_preview.png" alt="' . esc_attr__('Preview Custom Message Templates screenshot',
1023
+				'event_espresso') . '" />';
1024
+		$this->_template_args['preview_text'] = '<strong>' . __('Custom Message Templates is a feature that is only available in the premium version of Event Espresso 4 which is available with a support license purchase on EventEspresso.com. With the Custom Message Templates feature, you are able to create custom message templates and assign them on a per-event basis.',
1025
+				'event_espresso') . '</strong>';
1026
+		$this->display_admin_caf_preview_page('custom_message_types', false);
1027
+	}
1028
+    
1029
+    
1030
+	/**
1031
+	 * get_message_templates
1032
+	 * This gets all the message templates for listing on the overview list.
1033
+	 *
1034
+	 * @access public
1035
+	 *
1036
+	 * @param int    $perpage the amount of templates groups to show per page
1037
+	 * @param string $type    the current _view we're getting templates for
1038
+	 * @param bool   $count   return count?
1039
+	 * @param bool   $all     disregard any paging info (get all data);
1040
+	 * @param bool   $global  whether to return just global (true) or custom templates (false)
1041
+	 *
1042
+	 * @return array
1043
+	 */
1044
+	public function get_message_templates($perpage = 10, $type = 'in_use', $count = false, $all = false, $global = true)
1045
+	{
1046
+        
1047
+		$MTP = EEM_Message_Template_Group::instance();
1048
+        
1049
+		$this->_req_data['orderby'] = empty($this->_req_data['orderby']) ? 'GRP_ID' : $this->_req_data['orderby'];
1050
+		$orderby                    = $this->_req_data['orderby'];
1051
+        
1052
+		$order = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order'] : 'ASC';
1053
+        
1054
+		$current_page = isset($this->_req_data['paged']) && ! empty($this->_req_data['paged']) ? $this->_req_data['paged'] : 1;
1055
+		$per_page     = isset($this->_req_data['perpage']) && ! empty($this->_req_data['perpage']) ? $this->_req_data['perpage'] : $perpage;
1056
+        
1057
+		$offset = ($current_page - 1) * $per_page;
1058
+		$limit  = $all ? null : array($offset, $per_page);
1059
+        
1060
+        
1061
+		//options will match what is in the _views array property
1062
+		switch ($type) {
1063 1063
             
1064
-            case 'in_use':
1065
-                $templates = $MTP->get_all_active_message_templates($orderby, $order, $limit, $count, $global, true);
1066
-                break;
1064
+			case 'in_use':
1065
+				$templates = $MTP->get_all_active_message_templates($orderby, $order, $limit, $count, $global, true);
1066
+				break;
1067 1067
             
1068
-            default:
1069
-                $templates = $MTP->get_all_trashed_grouped_message_templates($orderby, $order, $limit, $count, $global);
1068
+			default:
1069
+				$templates = $MTP->get_all_trashed_grouped_message_templates($orderby, $order, $limit, $count, $global);
1070 1070
             
1071
-        }
1072
-        
1073
-        return $templates;
1074
-    }
1075
-    
1076
-    
1077
-    /**
1078
-     * filters etc might need a list of installed message_types
1079
-     * @return array an array of message type objects
1080
-     */
1081
-    public function get_installed_message_types()
1082
-    {
1083
-        $installed_message_types = $this->_message_resource_manager->installed_message_types();
1084
-        $installed               = array();
1085
-        
1086
-        foreach ($installed_message_types as $message_type) {
1087
-            $installed[$message_type->name] = $message_type;
1088
-        }
1089
-        
1090
-        return $installed;
1091
-    }
1092
-    
1093
-    
1094
-    /**
1095
-     * _add_message_template
1096
-     *
1097
-     * This is used when creating a custom template. All Custom Templates start based off another template.
1098
-     *
1099
-     * @param string $message_type
1100
-     * @param string $messenger
1101
-     * @param string $GRP_ID
1102
-     *
1103
-     * @throws EE_error
1104
-     */
1105
-    protected function _add_message_template($message_type = '', $messenger = '', $GRP_ID = '')
1106
-    {
1107
-        //set values override any request data
1108
-        $message_type = ! empty($message_type) ? $message_type : '';
1109
-        $message_type = empty($message_type) && ! empty($this->_req_data['message_type']) ? $this->_req_data['message_type'] : $message_type;
1110
-        
1111
-        $messenger = ! empty($messenger) ? $messenger : '';
1112
-        $messenger = empty($messenger) && ! empty($this->_req_data['messenger']) ? $this->_req_data['messenger'] : $messenger;
1113
-        
1114
-        $GRP_ID = ! empty($GRP_ID) ? $GRP_ID : '';
1115
-        $GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : $GRP_ID;
1116
-        
1117
-        //we need messenger and message type.  They should be coming from the event editor. If not here then return error
1118
-        if (empty($message_type) || empty($messenger)) {
1119
-            throw new EE_error(__('Sorry, but we can\'t create new templates because we\'re missing the messenger or message type',
1120
-                'event_espresso'));
1121
-        }
1122
-        
1123
-        //we need the GRP_ID for the template being used as the base for the new template
1124
-        if (empty($GRP_ID)) {
1125
-            throw new EE_Error(__('In order to create a custom message template the GRP_ID of the template being used as a base is needed',
1126
-                'event_espresso'));
1127
-        }
1128
-        
1129
-        //let's just make sure the template gets generated!
1130
-        
1131
-        //we need to reassign some variables for what the insert is expecting
1132
-        $this->_req_data['MTP_messenger']    = $messenger;
1133
-        $this->_req_data['MTP_message_type'] = $message_type;
1134
-        $this->_req_data['GRP_ID']           = $GRP_ID;
1135
-        $this->_insert_or_update_message_template(true);
1136
-    }
1137
-    
1138
-    
1139
-    /**
1140
-     * public wrapper for the _add_message_template method
1141
-     *
1142
-     * @param string $message_type     message type slug
1143
-     * @param string $messenger        messenger slug
1144
-     * @param int    $GRP_ID           GRP_ID for the related message template group this new template will be based
1145
-     *                                 off of.
1146
-     */
1147
-    public function add_message_template($message_type, $messenger, $GRP_ID)
1148
-    {
1149
-        $this->_add_message_template($message_type, $messenger, $GRP_ID);
1150
-    }
1151
-    
1152
-    
1153
-    /**
1154
-     * _edit_message_template
1155
-     *
1156
-     * @access protected
1157
-     * @return void
1158
-     */
1159
-    protected function _edit_message_template()
1160
-    {
1161
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1162
-        $template_fields = '';
1163
-        $sidebar_fields  = '';
1164
-        //we filter the tinyMCE settings to remove the validation since message templates by their nature will not have valid html in the templates.
1165
-        add_filter('tiny_mce_before_init', array($this, 'filter_tinymce_init'), 10, 2);
1166
-        
1167
-        $GRP_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
1168
-            ? absint($this->_req_data['id'])
1169
-            : false;
1170
-        
1171
-        $this->_set_shortcodes(); //this also sets the _message_template property.
1172
-        $message_template_group = $this->_message_template_group;
1173
-        $c_label                = $message_template_group->context_label();
1174
-        $c_config               = $message_template_group->contexts_config();
1175
-        
1176
-        reset($c_config);
1177
-        $context = isset($this->_req_data['context']) && ! empty($this->_req_data['context'])
1178
-            ? strtolower($this->_req_data['context'])
1179
-            : key($c_config);
1180
-        
1181
-        
1182
-        if (empty($GRP_ID)) {
1183
-            $action = 'insert_message_template';
1184
-            //$button_both = false;
1185
-            //$button_text = array( __( 'Save','event_espresso') );
1186
-            //$button_actions = array('something_different');
1187
-            //$referrer = false;
1188
-            $edit_message_template_form_url = add_query_arg(
1189
-                array('action' => $action, 'noheader' => true),
1190
-                EE_MSG_ADMIN_URL
1191
-            );
1192
-        } else {
1193
-            $action = 'update_message_template';
1194
-            //$button_both = true;
1195
-            //$button_text = array();
1196
-            //$button_actions = array();
1197
-            //$referrer = $this->_admin_base_url;
1198
-            $edit_message_template_form_url = add_query_arg(
1199
-                array('action' => $action, 'noheader' => true),
1200
-                EE_MSG_ADMIN_URL
1201
-            );
1202
-        }
1203
-        
1204
-        //set active messenger for this view
1205
-        $this->_active_messenger         = $this->_message_resource_manager->get_active_messenger(
1206
-            $message_template_group->messenger()
1207
-        );
1208
-        $this->_active_message_type_name = $message_template_group->message_type();
1209
-        
1210
-        
1211
-        //Do we have any validation errors?
1212
-        $validators = $this->_get_transient();
1213
-        $v_fields   = ! empty($validators) ? array_keys($validators) : array();
1214
-        
1215
-        
1216
-        //we need to assemble the title from Various details
1217
-        $context_label = sprintf(
1218
-            __('(%s %s)', 'event_espresso'),
1219
-            $c_config[$context]['label'],
1220
-            ucwords($c_label['label'])
1221
-        );
1222
-        
1223
-        $title = sprintf(
1224
-            __(' %s %s Template %s', 'event_espresso'),
1225
-            ucwords($message_template_group->messenger_obj()->label['singular']),
1226
-            ucwords($message_template_group->message_type_obj()->label['singular']),
1227
-            $context_label
1228
-        );
1229
-        
1230
-        $this->_template_args['GRP_ID']           = $GRP_ID;
1231
-        $this->_template_args['message_template'] = $message_template_group;
1232
-        $this->_template_args['is_extra_fields']  = false;
1233
-        
1234
-        
1235
-        //let's get EEH_MSG_Template so we can get template form fields
1236
-        $template_field_structure = EEH_MSG_Template::get_fields(
1237
-            $message_template_group->messenger(),
1238
-            $message_template_group->message_type()
1239
-        );
1240
-        
1241
-        if ( ! $template_field_structure) {
1242
-            $template_field_structure = false;
1243
-            $template_fields          = __('There was an error in assembling the fields for this display (you should see an error message)',
1244
-                'event_espresso');
1245
-        }
1246
-        
1247
-        
1248
-        $message_templates = $message_template_group->context_templates();
1249
-        
1250
-        
1251
-        //if we have the extra key.. then we need to remove the content index from the template_field_structure as it will get handled in the "extra" array.
1252
-        if (is_array($template_field_structure[$context]) && isset($template_field_structure[$context]['extra'])) {
1253
-            foreach ($template_field_structure[$context]['extra'] as $reference_field => $new_fields) {
1254
-                unset($template_field_structure[$context][$reference_field]);
1255
-            }
1256
-        }
1257
-        
1258
-        //let's loop through the template_field_structure and actually assemble the input fields!
1259
-        if ( ! empty($template_field_structure)) {
1260
-            foreach ($template_field_structure[$context] as $template_field => $field_setup_array) {
1261
-                //if this is an 'extra' template field then we need to remove any existing fields that are keyed up in the extra array and reset them.
1262
-                if ($template_field == 'extra') {
1263
-                    $this->_template_args['is_extra_fields'] = true;
1264
-                    foreach ($field_setup_array as $reference_field => $new_fields_array) {
1265
-                        $message_template = $message_templates[$context][$reference_field];
1266
-                        $content          = $message_template instanceof EE_Message_Template
1267
-                            ? $message_template->get('MTP_content')
1268
-                            : '';
1269
-                        foreach ($new_fields_array as $extra_field => $extra_array) {
1270
-                            //let's verify if we need this extra field via the shortcodes parameter.
1271
-                            $continue = false;
1272
-                            if (isset($extra_array['shortcodes_required'])) {
1273
-                                foreach ((array)$extra_array['shortcodes_required'] as $shortcode) {
1274
-                                    if ( ! array_key_exists($shortcode, $this->_shortcodes)) {
1275
-                                        $continue = true;
1276
-                                    }
1277
-                                }
1278
-                                if ($continue) {
1279
-                                    continue;
1280
-                                }
1281
-                            }
1071
+		}
1072
+        
1073
+		return $templates;
1074
+	}
1075
+    
1076
+    
1077
+	/**
1078
+	 * filters etc might need a list of installed message_types
1079
+	 * @return array an array of message type objects
1080
+	 */
1081
+	public function get_installed_message_types()
1082
+	{
1083
+		$installed_message_types = $this->_message_resource_manager->installed_message_types();
1084
+		$installed               = array();
1085
+        
1086
+		foreach ($installed_message_types as $message_type) {
1087
+			$installed[$message_type->name] = $message_type;
1088
+		}
1089
+        
1090
+		return $installed;
1091
+	}
1092
+    
1093
+    
1094
+	/**
1095
+	 * _add_message_template
1096
+	 *
1097
+	 * This is used when creating a custom template. All Custom Templates start based off another template.
1098
+	 *
1099
+	 * @param string $message_type
1100
+	 * @param string $messenger
1101
+	 * @param string $GRP_ID
1102
+	 *
1103
+	 * @throws EE_error
1104
+	 */
1105
+	protected function _add_message_template($message_type = '', $messenger = '', $GRP_ID = '')
1106
+	{
1107
+		//set values override any request data
1108
+		$message_type = ! empty($message_type) ? $message_type : '';
1109
+		$message_type = empty($message_type) && ! empty($this->_req_data['message_type']) ? $this->_req_data['message_type'] : $message_type;
1110
+        
1111
+		$messenger = ! empty($messenger) ? $messenger : '';
1112
+		$messenger = empty($messenger) && ! empty($this->_req_data['messenger']) ? $this->_req_data['messenger'] : $messenger;
1113
+        
1114
+		$GRP_ID = ! empty($GRP_ID) ? $GRP_ID : '';
1115
+		$GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : $GRP_ID;
1116
+        
1117
+		//we need messenger and message type.  They should be coming from the event editor. If not here then return error
1118
+		if (empty($message_type) || empty($messenger)) {
1119
+			throw new EE_error(__('Sorry, but we can\'t create new templates because we\'re missing the messenger or message type',
1120
+				'event_espresso'));
1121
+		}
1122
+        
1123
+		//we need the GRP_ID for the template being used as the base for the new template
1124
+		if (empty($GRP_ID)) {
1125
+			throw new EE_Error(__('In order to create a custom message template the GRP_ID of the template being used as a base is needed',
1126
+				'event_espresso'));
1127
+		}
1128
+        
1129
+		//let's just make sure the template gets generated!
1130
+        
1131
+		//we need to reassign some variables for what the insert is expecting
1132
+		$this->_req_data['MTP_messenger']    = $messenger;
1133
+		$this->_req_data['MTP_message_type'] = $message_type;
1134
+		$this->_req_data['GRP_ID']           = $GRP_ID;
1135
+		$this->_insert_or_update_message_template(true);
1136
+	}
1137
+    
1138
+    
1139
+	/**
1140
+	 * public wrapper for the _add_message_template method
1141
+	 *
1142
+	 * @param string $message_type     message type slug
1143
+	 * @param string $messenger        messenger slug
1144
+	 * @param int    $GRP_ID           GRP_ID for the related message template group this new template will be based
1145
+	 *                                 off of.
1146
+	 */
1147
+	public function add_message_template($message_type, $messenger, $GRP_ID)
1148
+	{
1149
+		$this->_add_message_template($message_type, $messenger, $GRP_ID);
1150
+	}
1151
+    
1152
+    
1153
+	/**
1154
+	 * _edit_message_template
1155
+	 *
1156
+	 * @access protected
1157
+	 * @return void
1158
+	 */
1159
+	protected function _edit_message_template()
1160
+	{
1161
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1162
+		$template_fields = '';
1163
+		$sidebar_fields  = '';
1164
+		//we filter the tinyMCE settings to remove the validation since message templates by their nature will not have valid html in the templates.
1165
+		add_filter('tiny_mce_before_init', array($this, 'filter_tinymce_init'), 10, 2);
1166
+        
1167
+		$GRP_ID = isset($this->_req_data['id']) && ! empty($this->_req_data['id'])
1168
+			? absint($this->_req_data['id'])
1169
+			: false;
1170
+        
1171
+		$this->_set_shortcodes(); //this also sets the _message_template property.
1172
+		$message_template_group = $this->_message_template_group;
1173
+		$c_label                = $message_template_group->context_label();
1174
+		$c_config               = $message_template_group->contexts_config();
1175
+        
1176
+		reset($c_config);
1177
+		$context = isset($this->_req_data['context']) && ! empty($this->_req_data['context'])
1178
+			? strtolower($this->_req_data['context'])
1179
+			: key($c_config);
1180
+        
1181
+        
1182
+		if (empty($GRP_ID)) {
1183
+			$action = 'insert_message_template';
1184
+			//$button_both = false;
1185
+			//$button_text = array( __( 'Save','event_espresso') );
1186
+			//$button_actions = array('something_different');
1187
+			//$referrer = false;
1188
+			$edit_message_template_form_url = add_query_arg(
1189
+				array('action' => $action, 'noheader' => true),
1190
+				EE_MSG_ADMIN_URL
1191
+			);
1192
+		} else {
1193
+			$action = 'update_message_template';
1194
+			//$button_both = true;
1195
+			//$button_text = array();
1196
+			//$button_actions = array();
1197
+			//$referrer = $this->_admin_base_url;
1198
+			$edit_message_template_form_url = add_query_arg(
1199
+				array('action' => $action, 'noheader' => true),
1200
+				EE_MSG_ADMIN_URL
1201
+			);
1202
+		}
1203
+        
1204
+		//set active messenger for this view
1205
+		$this->_active_messenger         = $this->_message_resource_manager->get_active_messenger(
1206
+			$message_template_group->messenger()
1207
+		);
1208
+		$this->_active_message_type_name = $message_template_group->message_type();
1209
+        
1210
+        
1211
+		//Do we have any validation errors?
1212
+		$validators = $this->_get_transient();
1213
+		$v_fields   = ! empty($validators) ? array_keys($validators) : array();
1214
+        
1215
+        
1216
+		//we need to assemble the title from Various details
1217
+		$context_label = sprintf(
1218
+			__('(%s %s)', 'event_espresso'),
1219
+			$c_config[$context]['label'],
1220
+			ucwords($c_label['label'])
1221
+		);
1222
+        
1223
+		$title = sprintf(
1224
+			__(' %s %s Template %s', 'event_espresso'),
1225
+			ucwords($message_template_group->messenger_obj()->label['singular']),
1226
+			ucwords($message_template_group->message_type_obj()->label['singular']),
1227
+			$context_label
1228
+		);
1229
+        
1230
+		$this->_template_args['GRP_ID']           = $GRP_ID;
1231
+		$this->_template_args['message_template'] = $message_template_group;
1232
+		$this->_template_args['is_extra_fields']  = false;
1233
+        
1234
+        
1235
+		//let's get EEH_MSG_Template so we can get template form fields
1236
+		$template_field_structure = EEH_MSG_Template::get_fields(
1237
+			$message_template_group->messenger(),
1238
+			$message_template_group->message_type()
1239
+		);
1240
+        
1241
+		if ( ! $template_field_structure) {
1242
+			$template_field_structure = false;
1243
+			$template_fields          = __('There was an error in assembling the fields for this display (you should see an error message)',
1244
+				'event_espresso');
1245
+		}
1246
+        
1247
+        
1248
+		$message_templates = $message_template_group->context_templates();
1249
+        
1250
+        
1251
+		//if we have the extra key.. then we need to remove the content index from the template_field_structure as it will get handled in the "extra" array.
1252
+		if (is_array($template_field_structure[$context]) && isset($template_field_structure[$context]['extra'])) {
1253
+			foreach ($template_field_structure[$context]['extra'] as $reference_field => $new_fields) {
1254
+				unset($template_field_structure[$context][$reference_field]);
1255
+			}
1256
+		}
1257
+        
1258
+		//let's loop through the template_field_structure and actually assemble the input fields!
1259
+		if ( ! empty($template_field_structure)) {
1260
+			foreach ($template_field_structure[$context] as $template_field => $field_setup_array) {
1261
+				//if this is an 'extra' template field then we need to remove any existing fields that are keyed up in the extra array and reset them.
1262
+				if ($template_field == 'extra') {
1263
+					$this->_template_args['is_extra_fields'] = true;
1264
+					foreach ($field_setup_array as $reference_field => $new_fields_array) {
1265
+						$message_template = $message_templates[$context][$reference_field];
1266
+						$content          = $message_template instanceof EE_Message_Template
1267
+							? $message_template->get('MTP_content')
1268
+							: '';
1269
+						foreach ($new_fields_array as $extra_field => $extra_array) {
1270
+							//let's verify if we need this extra field via the shortcodes parameter.
1271
+							$continue = false;
1272
+							if (isset($extra_array['shortcodes_required'])) {
1273
+								foreach ((array)$extra_array['shortcodes_required'] as $shortcode) {
1274
+									if ( ! array_key_exists($shortcode, $this->_shortcodes)) {
1275
+										$continue = true;
1276
+									}
1277
+								}
1278
+								if ($continue) {
1279
+									continue;
1280
+								}
1281
+							}
1282 1282
                             
1283
-                            $field_id                                = $reference_field . '-' . $extra_field . '-content';
1284
-                            $template_form_fields[$field_id]         = $extra_array;
1285
-                            $template_form_fields[$field_id]['name'] = 'MTP_template_fields[' . $reference_field . '][content][' . $extra_field . ']';
1286
-                            $css_class                               = isset($extra_array['css_class']) ? $extra_array['css_class'] : '';
1283
+							$field_id                                = $reference_field . '-' . $extra_field . '-content';
1284
+							$template_form_fields[$field_id]         = $extra_array;
1285
+							$template_form_fields[$field_id]['name'] = 'MTP_template_fields[' . $reference_field . '][content][' . $extra_field . ']';
1286
+							$css_class                               = isset($extra_array['css_class']) ? $extra_array['css_class'] : '';
1287 1287
                             
1288
-                            $template_form_fields[$field_id]['css_class'] = ! empty($v_fields)
1289
-                                                                            && in_array($extra_field, $v_fields)
1290
-                                                                            &&
1291
-                                                                            (
1292
-                                                                                is_array($validators[$extra_field])
1293
-                                                                                && isset($validators[$extra_field]['msg'])
1294
-                                                                            )
1295
-                                ? 'validate-error ' . $css_class
1296
-                                : $css_class;
1288
+							$template_form_fields[$field_id]['css_class'] = ! empty($v_fields)
1289
+																			&& in_array($extra_field, $v_fields)
1290
+																			&&
1291
+																			(
1292
+																				is_array($validators[$extra_field])
1293
+																				&& isset($validators[$extra_field]['msg'])
1294
+																			)
1295
+								? 'validate-error ' . $css_class
1296
+								: $css_class;
1297 1297
                             
1298
-                            $template_form_fields[$field_id]['value'] = ! empty($message_templates) && isset($content[$extra_field])
1299
-                                ? stripslashes(html_entity_decode($content[$extra_field], ENT_QUOTES, "UTF-8"))
1300
-                                : '';
1298
+							$template_form_fields[$field_id]['value'] = ! empty($message_templates) && isset($content[$extra_field])
1299
+								? stripslashes(html_entity_decode($content[$extra_field], ENT_QUOTES, "UTF-8"))
1300
+								: '';
1301 1301
                             
1302
-                            //do we have a validation error?  if we do then let's use that value instead
1303
-                            $template_form_fields[$field_id]['value'] = isset($validators[$extra_field]) ? $validators[$extra_field]['value'] : $template_form_fields[$field_id]['value'];
1302
+							//do we have a validation error?  if we do then let's use that value instead
1303
+							$template_form_fields[$field_id]['value'] = isset($validators[$extra_field]) ? $validators[$extra_field]['value'] : $template_form_fields[$field_id]['value'];
1304 1304
                             
1305 1305
                             
1306
-                            $template_form_fields[$field_id]['db-col'] = 'MTP_content';
1306
+							$template_form_fields[$field_id]['db-col'] = 'MTP_content';
1307 1307
                             
1308
-                            //shortcode selector
1309
-                            $field_name_to_use                                 = $extra_field == 'main' ? 'content' : $extra_field;
1310
-                            $template_form_fields[$field_id]['append_content'] = $this->_get_shortcode_selector(
1311
-                                $field_name_to_use,
1312
-                                $field_id
1313
-                            );
1308
+							//shortcode selector
1309
+							$field_name_to_use                                 = $extra_field == 'main' ? 'content' : $extra_field;
1310
+							$template_form_fields[$field_id]['append_content'] = $this->_get_shortcode_selector(
1311
+								$field_name_to_use,
1312
+								$field_id
1313
+							);
1314 1314
                             
1315
-                            if (isset($extra_array['input']) && $extra_array['input'] == 'wp_editor') {
1316
-                                //we want to decode the entities
1317
-                                $template_form_fields[$field_id]['value'] = stripslashes(
1318
-                                    html_entity_decode($template_form_fields[$field_id]['value'], ENT_QUOTES, "UTF-8")
1319
-                                );
1315
+							if (isset($extra_array['input']) && $extra_array['input'] == 'wp_editor') {
1316
+								//we want to decode the entities
1317
+								$template_form_fields[$field_id]['value'] = stripslashes(
1318
+									html_entity_decode($template_form_fields[$field_id]['value'], ENT_QUOTES, "UTF-8")
1319
+								);
1320 1320
                                 
1321
-                            }/**/
1322
-                        }
1323
-                        $templatefield_MTP_id          = $reference_field . '-MTP_ID';
1324
-                        $templatefield_templatename_id = $reference_field . '-name';
1321
+							}/**/
1322
+						}
1323
+						$templatefield_MTP_id          = $reference_field . '-MTP_ID';
1324
+						$templatefield_templatename_id = $reference_field . '-name';
1325 1325
                         
1326
-                        $template_form_fields[$templatefield_MTP_id] = array(
1327
-                            'name'       => 'MTP_template_fields[' . $reference_field . '][MTP_ID]',
1328
-                            'label'      => null,
1329
-                            'input'      => 'hidden',
1330
-                            'type'       => 'int',
1331
-                            'required'   => false,
1332
-                            'validation' => false,
1333
-                            'value'      => ! empty($message_templates) ? $message_template->ID() : '',
1334
-                            'css_class'  => '',
1335
-                            'format'     => '%d',
1336
-                            'db-col'     => 'MTP_ID'
1337
-                        );
1326
+						$template_form_fields[$templatefield_MTP_id] = array(
1327
+							'name'       => 'MTP_template_fields[' . $reference_field . '][MTP_ID]',
1328
+							'label'      => null,
1329
+							'input'      => 'hidden',
1330
+							'type'       => 'int',
1331
+							'required'   => false,
1332
+							'validation' => false,
1333
+							'value'      => ! empty($message_templates) ? $message_template->ID() : '',
1334
+							'css_class'  => '',
1335
+							'format'     => '%d',
1336
+							'db-col'     => 'MTP_ID'
1337
+						);
1338 1338
                         
1339
-                        $template_form_fields[$templatefield_templatename_id] = array(
1340
-                            'name'       => 'MTP_template_fields[' . $reference_field . '][name]',
1341
-                            'label'      => null,
1342
-                            'input'      => 'hidden',
1343
-                            'type'       => 'string',
1344
-                            'required'   => false,
1345
-                            'validation' => true,
1346
-                            'value'      => $reference_field,
1347
-                            'css_class'  => '',
1348
-                            'format'     => '%s',
1349
-                            'db-col'     => 'MTP_template_field'
1350
-                        );
1351
-                    }
1352
-                    continue; //skip the next stuff, we got the necessary fields here for this dataset.
1353
-                } else {
1354
-                    $field_id                                 = $template_field . '-content';
1355
-                    $template_form_fields[$field_id]          = $field_setup_array;
1356
-                    $template_form_fields[$field_id]['name']  = 'MTP_template_fields[' . $template_field . '][content]';
1357
-                    $message_template                         = isset($message_templates[$context][$template_field])
1358
-                        ? $message_templates[$context][$template_field]
1359
-                        : null;
1360
-                    $template_form_fields[$field_id]['value'] = ! empty($message_templates)
1361
-                                                                && is_array($message_templates[$context])
1362
-                                                                && $message_template instanceof EE_Message_Template
1363
-                        ? $message_template->get('MTP_content')
1364
-                        : '';
1339
+						$template_form_fields[$templatefield_templatename_id] = array(
1340
+							'name'       => 'MTP_template_fields[' . $reference_field . '][name]',
1341
+							'label'      => null,
1342
+							'input'      => 'hidden',
1343
+							'type'       => 'string',
1344
+							'required'   => false,
1345
+							'validation' => true,
1346
+							'value'      => $reference_field,
1347
+							'css_class'  => '',
1348
+							'format'     => '%s',
1349
+							'db-col'     => 'MTP_template_field'
1350
+						);
1351
+					}
1352
+					continue; //skip the next stuff, we got the necessary fields here for this dataset.
1353
+				} else {
1354
+					$field_id                                 = $template_field . '-content';
1355
+					$template_form_fields[$field_id]          = $field_setup_array;
1356
+					$template_form_fields[$field_id]['name']  = 'MTP_template_fields[' . $template_field . '][content]';
1357
+					$message_template                         = isset($message_templates[$context][$template_field])
1358
+						? $message_templates[$context][$template_field]
1359
+						: null;
1360
+					$template_form_fields[$field_id]['value'] = ! empty($message_templates)
1361
+																&& is_array($message_templates[$context])
1362
+																&& $message_template instanceof EE_Message_Template
1363
+						? $message_template->get('MTP_content')
1364
+						: '';
1365 1365
                     
1366
-                    //do we have a validator error for this field?  if we do then we'll use that value instead
1367
-                    $template_form_fields[$field_id]['value'] = isset($validators[$template_field])
1368
-                        ? $validators[$template_field]['value']
1369
-                        : $template_form_fields[$field_id]['value'];
1366
+					//do we have a validator error for this field?  if we do then we'll use that value instead
1367
+					$template_form_fields[$field_id]['value'] = isset($validators[$template_field])
1368
+						? $validators[$template_field]['value']
1369
+						: $template_form_fields[$field_id]['value'];
1370 1370
                     
1371 1371
                     
1372
-                    $template_form_fields[$field_id]['db-col']    = 'MTP_content';
1373
-                    $css_class                                    = isset($field_setup_array['css_class']) ? $field_setup_array['css_class'] : '';
1374
-                    $template_form_fields[$field_id]['css_class'] = ! empty($v_fields)
1375
-                                                                    && in_array($template_field, $v_fields)
1376
-                                                                    && isset($validators[$template_field]['msg'])
1377
-                        ? 'validate-error ' . $css_class
1378
-                        : $css_class;
1372
+					$template_form_fields[$field_id]['db-col']    = 'MTP_content';
1373
+					$css_class                                    = isset($field_setup_array['css_class']) ? $field_setup_array['css_class'] : '';
1374
+					$template_form_fields[$field_id]['css_class'] = ! empty($v_fields)
1375
+																	&& in_array($template_field, $v_fields)
1376
+																	&& isset($validators[$template_field]['msg'])
1377
+						? 'validate-error ' . $css_class
1378
+						: $css_class;
1379 1379
                     
1380
-                    //shortcode selector
1381
-                    $template_form_fields[$field_id]['append_content'] = $this->_get_shortcode_selector(
1382
-                        $template_field, $field_id
1383
-                    );
1384
-                }
1380
+					//shortcode selector
1381
+					$template_form_fields[$field_id]['append_content'] = $this->_get_shortcode_selector(
1382
+						$template_field, $field_id
1383
+					);
1384
+				}
1385 1385
                 
1386
-                //k took care of content field(s) now let's take care of others.
1386
+				//k took care of content field(s) now let's take care of others.
1387 1387
                 
1388
-                $templatefield_MTP_id                = $template_field . '-MTP_ID';
1389
-                $templatefield_field_templatename_id = $template_field . '-name';
1388
+				$templatefield_MTP_id                = $template_field . '-MTP_ID';
1389
+				$templatefield_field_templatename_id = $template_field . '-name';
1390 1390
                 
1391
-                //foreach template field there are actually two form fields created
1392
-                $template_form_fields[$templatefield_MTP_id] = array(
1393
-                    'name'       => 'MTP_template_fields[' . $template_field . '][MTP_ID]',
1394
-                    'label'      => null,
1395
-                    'input'      => 'hidden',
1396
-                    'type'       => 'int',
1397
-                    'required'   => false,
1398
-                    'validation' => true,
1399
-                    'value'      => $message_template instanceof EE_Message_Template ? $message_template->ID() : '',
1400
-                    'css_class'  => '',
1401
-                    'format'     => '%d',
1402
-                    'db-col'     => 'MTP_ID'
1403
-                );
1391
+				//foreach template field there are actually two form fields created
1392
+				$template_form_fields[$templatefield_MTP_id] = array(
1393
+					'name'       => 'MTP_template_fields[' . $template_field . '][MTP_ID]',
1394
+					'label'      => null,
1395
+					'input'      => 'hidden',
1396
+					'type'       => 'int',
1397
+					'required'   => false,
1398
+					'validation' => true,
1399
+					'value'      => $message_template instanceof EE_Message_Template ? $message_template->ID() : '',
1400
+					'css_class'  => '',
1401
+					'format'     => '%d',
1402
+					'db-col'     => 'MTP_ID'
1403
+				);
1404 1404
                 
1405
-                $template_form_fields[$templatefield_field_templatename_id] = array(
1406
-                    'name'       => 'MTP_template_fields[' . $template_field . '][name]',
1407
-                    'label'      => null,
1408
-                    'input'      => 'hidden',
1409
-                    'type'       => 'string',
1410
-                    'required'   => false,
1411
-                    'validation' => true,
1412
-                    'value'      => $template_field,
1413
-                    'css_class'  => '',
1414
-                    'format'     => '%s',
1415
-                    'db-col'     => 'MTP_template_field'
1416
-                );
1405
+				$template_form_fields[$templatefield_field_templatename_id] = array(
1406
+					'name'       => 'MTP_template_fields[' . $template_field . '][name]',
1407
+					'label'      => null,
1408
+					'input'      => 'hidden',
1409
+					'type'       => 'string',
1410
+					'required'   => false,
1411
+					'validation' => true,
1412
+					'value'      => $template_field,
1413
+					'css_class'  => '',
1414
+					'format'     => '%s',
1415
+					'db-col'     => 'MTP_template_field'
1416
+				);
1417 1417
                 
1418
-            }
1418
+			}
1419 1419
             
1420
-            //add other fields
1421
-            $template_form_fields['ee-msg-current-context'] = array(
1422
-                'name'       => 'MTP_context',
1423
-                'label'      => null,
1424
-                'input'      => 'hidden',
1425
-                'type'       => 'string',
1426
-                'required'   => false,
1427
-                'validation' => true,
1428
-                'value'      => $context,
1429
-                'css_class'  => '',
1430
-                'format'     => '%s',
1431
-                'db-col'     => 'MTP_context'
1432
-            );
1420
+			//add other fields
1421
+			$template_form_fields['ee-msg-current-context'] = array(
1422
+				'name'       => 'MTP_context',
1423
+				'label'      => null,
1424
+				'input'      => 'hidden',
1425
+				'type'       => 'string',
1426
+				'required'   => false,
1427
+				'validation' => true,
1428
+				'value'      => $context,
1429
+				'css_class'  => '',
1430
+				'format'     => '%s',
1431
+				'db-col'     => 'MTP_context'
1432
+			);
1433 1433
             
1434
-            $template_form_fields['ee-msg-grp-id'] = array(
1435
-                'name'       => 'GRP_ID',
1436
-                'label'      => null,
1437
-                'input'      => 'hidden',
1438
-                'type'       => 'int',
1439
-                'required'   => false,
1440
-                'validation' => true,
1441
-                'value'      => $GRP_ID,
1442
-                'css_class'  => '',
1443
-                'format'     => '%d',
1444
-                'db-col'     => 'GRP_ID'
1445
-            );
1434
+			$template_form_fields['ee-msg-grp-id'] = array(
1435
+				'name'       => 'GRP_ID',
1436
+				'label'      => null,
1437
+				'input'      => 'hidden',
1438
+				'type'       => 'int',
1439
+				'required'   => false,
1440
+				'validation' => true,
1441
+				'value'      => $GRP_ID,
1442
+				'css_class'  => '',
1443
+				'format'     => '%d',
1444
+				'db-col'     => 'GRP_ID'
1445
+			);
1446 1446
             
1447
-            $template_form_fields['ee-msg-messenger'] = array(
1448
-                'name'       => 'MTP_messenger',
1449
-                'label'      => null,
1450
-                'input'      => 'hidden',
1451
-                'type'       => 'string',
1452
-                'required'   => false,
1453
-                'validation' => true,
1454
-                'value'      => $message_template_group->messenger(),
1455
-                'css_class'  => '',
1456
-                'format'     => '%s',
1457
-                'db-col'     => 'MTP_messenger'
1458
-            );
1447
+			$template_form_fields['ee-msg-messenger'] = array(
1448
+				'name'       => 'MTP_messenger',
1449
+				'label'      => null,
1450
+				'input'      => 'hidden',
1451
+				'type'       => 'string',
1452
+				'required'   => false,
1453
+				'validation' => true,
1454
+				'value'      => $message_template_group->messenger(),
1455
+				'css_class'  => '',
1456
+				'format'     => '%s',
1457
+				'db-col'     => 'MTP_messenger'
1458
+			);
1459 1459
             
1460
-            $template_form_fields['ee-msg-message-type'] = array(
1461
-                'name'       => 'MTP_message_type',
1462
-                'label'      => null,
1463
-                'input'      => 'hidden',
1464
-                'type'       => 'string',
1465
-                'required'   => false,
1466
-                'validation' => true,
1467
-                'value'      => $message_template_group->message_type(),
1468
-                'css_class'  => '',
1469
-                'format'     => '%s',
1470
-                'db-col'     => 'MTP_message_type'
1471
-            );
1460
+			$template_form_fields['ee-msg-message-type'] = array(
1461
+				'name'       => 'MTP_message_type',
1462
+				'label'      => null,
1463
+				'input'      => 'hidden',
1464
+				'type'       => 'string',
1465
+				'required'   => false,
1466
+				'validation' => true,
1467
+				'value'      => $message_template_group->message_type(),
1468
+				'css_class'  => '',
1469
+				'format'     => '%s',
1470
+				'db-col'     => 'MTP_message_type'
1471
+			);
1472 1472
             
1473
-            $sidebar_form_fields['ee-msg-is-global'] = array(
1474
-                'name'       => 'MTP_is_global',
1475
-                'label'      => __('Global Template', 'event_espresso'),
1476
-                'input'      => 'hidden',
1477
-                'type'       => 'int',
1478
-                'required'   => false,
1479
-                'validation' => true,
1480
-                'value'      => $message_template_group->get('MTP_is_global'),
1481
-                'css_class'  => '',
1482
-                'format'     => '%d',
1483
-                'db-col'     => 'MTP_is_global'
1484
-            );
1473
+			$sidebar_form_fields['ee-msg-is-global'] = array(
1474
+				'name'       => 'MTP_is_global',
1475
+				'label'      => __('Global Template', 'event_espresso'),
1476
+				'input'      => 'hidden',
1477
+				'type'       => 'int',
1478
+				'required'   => false,
1479
+				'validation' => true,
1480
+				'value'      => $message_template_group->get('MTP_is_global'),
1481
+				'css_class'  => '',
1482
+				'format'     => '%d',
1483
+				'db-col'     => 'MTP_is_global'
1484
+			);
1485 1485
             
1486
-            $sidebar_form_fields['ee-msg-is-override'] = array(
1487
-                'name'       => 'MTP_is_override',
1488
-                'label'      => __('Override all custom', 'event_espresso'),
1489
-                'input'      => $message_template_group->is_global() ? 'checkbox' : 'hidden',
1490
-                'type'       => 'int',
1491
-                'required'   => false,
1492
-                'validation' => true,
1493
-                'value'      => $message_template_group->get('MTP_is_override'),
1494
-                'css_class'  => '',
1495
-                'format'     => '%d',
1496
-                'db-col'     => 'MTP_is_override'
1497
-            );
1486
+			$sidebar_form_fields['ee-msg-is-override'] = array(
1487
+				'name'       => 'MTP_is_override',
1488
+				'label'      => __('Override all custom', 'event_espresso'),
1489
+				'input'      => $message_template_group->is_global() ? 'checkbox' : 'hidden',
1490
+				'type'       => 'int',
1491
+				'required'   => false,
1492
+				'validation' => true,
1493
+				'value'      => $message_template_group->get('MTP_is_override'),
1494
+				'css_class'  => '',
1495
+				'format'     => '%d',
1496
+				'db-col'     => 'MTP_is_override'
1497
+			);
1498 1498
             
1499
-            $sidebar_form_fields['ee-msg-is-active'] = array(
1500
-                'name'       => 'MTP_is_active',
1501
-                'label'      => __('Active Template', 'event_espresso'),
1502
-                'input'      => 'hidden',
1503
-                'type'       => 'int',
1504
-                'required'   => false,
1505
-                'validation' => true,
1506
-                'value'      => $message_template_group->is_active(),
1507
-                'css_class'  => '',
1508
-                'format'     => '%d',
1509
-                'db-col'     => 'MTP_is_active'
1510
-            );
1499
+			$sidebar_form_fields['ee-msg-is-active'] = array(
1500
+				'name'       => 'MTP_is_active',
1501
+				'label'      => __('Active Template', 'event_espresso'),
1502
+				'input'      => 'hidden',
1503
+				'type'       => 'int',
1504
+				'required'   => false,
1505
+				'validation' => true,
1506
+				'value'      => $message_template_group->is_active(),
1507
+				'css_class'  => '',
1508
+				'format'     => '%d',
1509
+				'db-col'     => 'MTP_is_active'
1510
+			);
1511 1511
             
1512
-            $sidebar_form_fields['ee-msg-deleted'] = array(
1513
-                'name'       => 'MTP_deleted',
1514
-                'label'      => null,
1515
-                'input'      => 'hidden',
1516
-                'type'       => 'int',
1517
-                'required'   => false,
1518
-                'validation' => true,
1519
-                'value'      => $message_template_group->get('MTP_deleted'),
1520
-                'css_class'  => '',
1521
-                'format'     => '%d',
1522
-                'db-col'     => 'MTP_deleted'
1523
-            );
1524
-            $sidebar_form_fields['ee-msg-author']  = array(
1525
-                'name'       => 'MTP_user_id',
1526
-                'label'      => __('Author', 'event_espresso'),
1527
-                'input'      => 'hidden',
1528
-                'type'       => 'int',
1529
-                'required'   => false,
1530
-                'validation' => false,
1531
-                'value'      => $message_template_group->user(),
1532
-                'format'     => '%d',
1533
-                'db-col'     => 'MTP_user_id'
1534
-            );
1512
+			$sidebar_form_fields['ee-msg-deleted'] = array(
1513
+				'name'       => 'MTP_deleted',
1514
+				'label'      => null,
1515
+				'input'      => 'hidden',
1516
+				'type'       => 'int',
1517
+				'required'   => false,
1518
+				'validation' => true,
1519
+				'value'      => $message_template_group->get('MTP_deleted'),
1520
+				'css_class'  => '',
1521
+				'format'     => '%d',
1522
+				'db-col'     => 'MTP_deleted'
1523
+			);
1524
+			$sidebar_form_fields['ee-msg-author']  = array(
1525
+				'name'       => 'MTP_user_id',
1526
+				'label'      => __('Author', 'event_espresso'),
1527
+				'input'      => 'hidden',
1528
+				'type'       => 'int',
1529
+				'required'   => false,
1530
+				'validation' => false,
1531
+				'value'      => $message_template_group->user(),
1532
+				'format'     => '%d',
1533
+				'db-col'     => 'MTP_user_id'
1534
+			);
1535 1535
             
1536
-            $sidebar_form_fields['ee-msg-route'] = array(
1537
-                'name'  => 'action',
1538
-                'input' => 'hidden',
1539
-                'type'  => 'string',
1540
-                'value' => $action
1541
-            );
1536
+			$sidebar_form_fields['ee-msg-route'] = array(
1537
+				'name'  => 'action',
1538
+				'input' => 'hidden',
1539
+				'type'  => 'string',
1540
+				'value' => $action
1541
+			);
1542 1542
             
1543
-            $sidebar_form_fields['ee-msg-id']        = array(
1544
-                'name'  => 'id',
1545
-                'input' => 'hidden',
1546
-                'type'  => 'int',
1547
-                'value' => $GRP_ID
1548
-            );
1549
-            $sidebar_form_fields['ee-msg-evt-nonce'] = array(
1550
-                'name'  => $action . '_nonce',
1551
-                'input' => 'hidden',
1552
-                'type'  => 'string',
1553
-                'value' => wp_create_nonce($action . '_nonce')
1554
-            );
1543
+			$sidebar_form_fields['ee-msg-id']        = array(
1544
+				'name'  => 'id',
1545
+				'input' => 'hidden',
1546
+				'type'  => 'int',
1547
+				'value' => $GRP_ID
1548
+			);
1549
+			$sidebar_form_fields['ee-msg-evt-nonce'] = array(
1550
+				'name'  => $action . '_nonce',
1551
+				'input' => 'hidden',
1552
+				'type'  => 'string',
1553
+				'value' => wp_create_nonce($action . '_nonce')
1554
+			);
1555 1555
             
1556
-            if (isset($this->_req_data['template_switch']) && $this->_req_data['template_switch']) {
1557
-                $sidebar_form_fields['ee-msg-template-switch'] = array(
1558
-                    'name'  => 'template_switch',
1559
-                    'input' => 'hidden',
1560
-                    'type'  => 'int',
1561
-                    'value' => 1
1562
-                );
1563
-            }
1556
+			if (isset($this->_req_data['template_switch']) && $this->_req_data['template_switch']) {
1557
+				$sidebar_form_fields['ee-msg-template-switch'] = array(
1558
+					'name'  => 'template_switch',
1559
+					'input' => 'hidden',
1560
+					'type'  => 'int',
1561
+					'value' => 1
1562
+				);
1563
+			}
1564 1564
             
1565 1565
             
1566
-            $template_fields = $this->_generate_admin_form_fields($template_form_fields);
1567
-            $sidebar_fields  = $this->_generate_admin_form_fields($sidebar_form_fields);
1566
+			$template_fields = $this->_generate_admin_form_fields($template_form_fields);
1567
+			$sidebar_fields  = $this->_generate_admin_form_fields($sidebar_form_fields);
1568 1568
             
1569 1569
             
1570
-        } //end if ( !empty($template_field_structure) )
1570
+		} //end if ( !empty($template_field_structure) )
1571 1571
         
1572
-        //set extra content for publish box
1573
-        $this->_template_args['publish_box_extra_content'] = $sidebar_fields;
1574
-        $this->_set_publish_post_box_vars(
1575
-            'id',
1576
-            $GRP_ID,
1577
-            false,
1578
-            add_query_arg(
1579
-                array('action' => 'global_mtps'),
1580
-                $this->_admin_base_url
1581
-            )
1582
-        );
1583
-        
1584
-        //add preview button
1585
-        $preview_url    = parent::add_query_args_and_nonce(
1586
-            array(
1587
-                'message_type' => $message_template_group->message_type(),
1588
-                'messenger'    => $message_template_group->messenger(),
1589
-                'context'      => $context,
1590
-                'GRP_ID'       => $GRP_ID,
1591
-                'action'       => 'preview_message'
1592
-            ),
1593
-            $this->_admin_base_url
1594
-        );
1595
-        $preview_button = '<a href="' . $preview_url . '" class="button-secondary messages-preview-button">' . __('Preview',
1596
-                'event_espresso') . '</a>';
1597
-        
1598
-        
1599
-        //setup context switcher
1600
-        $context_switcher_args = array(
1601
-            'page'    => 'espresso_messages',
1602
-            'action'  => 'edit_message_template',
1603
-            'id'      => $GRP_ID,
1604
-            'context' => $context,
1605
-            'extra'   => $preview_button
1606
-        );
1607
-        $this->_set_context_switcher($message_template_group, $context_switcher_args);
1608
-        
1609
-        
1610
-        //main box
1611
-        $this->_template_args['template_fields']                         = $template_fields;
1612
-        $this->_template_args['sidebar_box_id']                          = 'details';
1613
-        $this->_template_args['action']                                  = $action;
1614
-        $this->_template_args['context']                                 = $context;
1615
-        $this->_template_args['edit_message_template_form_url']          = $edit_message_template_form_url;
1616
-        $this->_template_args['learn_more_about_message_templates_link'] = $this->_learn_more_about_message_templates_link();
1617
-        
1618
-        
1619
-        $this->_template_args['before_admin_page_content'] = $this->add_context_switcher();
1620
-        $this->_template_args['before_admin_page_content'] .= $this->_add_form_element_before();
1621
-        $this->_template_args['after_admin_page_content'] = $this->_add_form_element_after();
1622
-        
1623
-        $this->_template_path = $this->_template_args['GRP_ID']
1624
-            ? EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_edit_meta_box.template.php'
1625
-            : EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_add_meta_box.template.php';
1626
-        
1627
-        //send along EE_Message_Template_Group object for further template use.
1628
-        $this->_template_args['MTP'] = $message_template_group;
1629
-        
1630
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
1631
-            $this->_template_args, true);
1632
-        
1633
-        
1634
-        //finally, let's set the admin_page title
1635
-        $this->_admin_page_title = sprintf(__('Editing %s', 'event_espresso'), $title);
1636
-        
1637
-        
1638
-        //we need to take care of setting the shortcodes property for use elsewhere.
1639
-        $this->_set_shortcodes();
1640
-        
1641
-        
1642
-        //final template wrapper
1643
-        $this->display_admin_page_with_sidebar();
1644
-    }
1645
-    
1646
-    
1647
-    public function filter_tinymce_init($mceInit, $editor_id)
1648
-    {
1649
-        return $mceInit;
1650
-    }
1651
-    
1652
-    
1653
-    public function add_context_switcher()
1654
-    {
1655
-        return $this->_context_switcher;
1656
-    }
1657
-    
1658
-    public function _add_form_element_before()
1659
-    {
1660
-        return '<form method="post" action="' . $this->_template_args["edit_message_template_form_url"] . '" id="ee-msg-edit-frm">';
1661
-    }
1662
-    
1663
-    public function _add_form_element_after()
1664
-    {
1665
-        return '</form>';
1666
-    }
1667
-    
1668
-    
1669
-    /**
1670
-     * This executes switching the template pack for a message template.
1671
-     *
1672
-     * @since 4.5.0
1673
-     *
1674
-     */
1675
-    public function switch_template_pack()
1676
-    {
1677
-        $GRP_ID        = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
1678
-        $template_pack = ! empty($this->_req_data['template_pack']) ? $this->_req_data['template_pack'] : '';
1679
-        
1680
-        //verify we have needed values.
1681
-        if (empty($GRP_ID) || empty($template_pack)) {
1682
-            $this->_template_args['error'] = true;
1683
-            EE_Error::add_error(__('The required date for switching templates is not available.', 'event_espresso'),
1684
-                __FILE__, __FUNCTION__, __LINE__);
1685
-        } else {
1686
-            //get template, set the new template_pack and then reset to default
1687
-            /** @type EE_Message_Template_Group $message_template_group */
1688
-            $message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
1572
+		//set extra content for publish box
1573
+		$this->_template_args['publish_box_extra_content'] = $sidebar_fields;
1574
+		$this->_set_publish_post_box_vars(
1575
+			'id',
1576
+			$GRP_ID,
1577
+			false,
1578
+			add_query_arg(
1579
+				array('action' => 'global_mtps'),
1580
+				$this->_admin_base_url
1581
+			)
1582
+		);
1583
+        
1584
+		//add preview button
1585
+		$preview_url    = parent::add_query_args_and_nonce(
1586
+			array(
1587
+				'message_type' => $message_template_group->message_type(),
1588
+				'messenger'    => $message_template_group->messenger(),
1589
+				'context'      => $context,
1590
+				'GRP_ID'       => $GRP_ID,
1591
+				'action'       => 'preview_message'
1592
+			),
1593
+			$this->_admin_base_url
1594
+		);
1595
+		$preview_button = '<a href="' . $preview_url . '" class="button-secondary messages-preview-button">' . __('Preview',
1596
+				'event_espresso') . '</a>';
1597
+        
1598
+        
1599
+		//setup context switcher
1600
+		$context_switcher_args = array(
1601
+			'page'    => 'espresso_messages',
1602
+			'action'  => 'edit_message_template',
1603
+			'id'      => $GRP_ID,
1604
+			'context' => $context,
1605
+			'extra'   => $preview_button
1606
+		);
1607
+		$this->_set_context_switcher($message_template_group, $context_switcher_args);
1608
+        
1609
+        
1610
+		//main box
1611
+		$this->_template_args['template_fields']                         = $template_fields;
1612
+		$this->_template_args['sidebar_box_id']                          = 'details';
1613
+		$this->_template_args['action']                                  = $action;
1614
+		$this->_template_args['context']                                 = $context;
1615
+		$this->_template_args['edit_message_template_form_url']          = $edit_message_template_form_url;
1616
+		$this->_template_args['learn_more_about_message_templates_link'] = $this->_learn_more_about_message_templates_link();
1617
+        
1618
+        
1619
+		$this->_template_args['before_admin_page_content'] = $this->add_context_switcher();
1620
+		$this->_template_args['before_admin_page_content'] .= $this->_add_form_element_before();
1621
+		$this->_template_args['after_admin_page_content'] = $this->_add_form_element_after();
1622
+        
1623
+		$this->_template_path = $this->_template_args['GRP_ID']
1624
+			? EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_edit_meta_box.template.php'
1625
+			: EE_MSG_TEMPLATE_PATH . 'ee_msg_details_main_add_meta_box.template.php';
1626
+        
1627
+		//send along EE_Message_Template_Group object for further template use.
1628
+		$this->_template_args['MTP'] = $message_template_group;
1629
+        
1630
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template($this->_template_path,
1631
+			$this->_template_args, true);
1632
+        
1633
+        
1634
+		//finally, let's set the admin_page title
1635
+		$this->_admin_page_title = sprintf(__('Editing %s', 'event_espresso'), $title);
1636
+        
1637
+        
1638
+		//we need to take care of setting the shortcodes property for use elsewhere.
1639
+		$this->_set_shortcodes();
1640
+        
1641
+        
1642
+		//final template wrapper
1643
+		$this->display_admin_page_with_sidebar();
1644
+	}
1645
+    
1646
+    
1647
+	public function filter_tinymce_init($mceInit, $editor_id)
1648
+	{
1649
+		return $mceInit;
1650
+	}
1651
+    
1652
+    
1653
+	public function add_context_switcher()
1654
+	{
1655
+		return $this->_context_switcher;
1656
+	}
1657
+    
1658
+	public function _add_form_element_before()
1659
+	{
1660
+		return '<form method="post" action="' . $this->_template_args["edit_message_template_form_url"] . '" id="ee-msg-edit-frm">';
1661
+	}
1662
+    
1663
+	public function _add_form_element_after()
1664
+	{
1665
+		return '</form>';
1666
+	}
1667
+    
1668
+    
1669
+	/**
1670
+	 * This executes switching the template pack for a message template.
1671
+	 *
1672
+	 * @since 4.5.0
1673
+	 *
1674
+	 */
1675
+	public function switch_template_pack()
1676
+	{
1677
+		$GRP_ID        = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
1678
+		$template_pack = ! empty($this->_req_data['template_pack']) ? $this->_req_data['template_pack'] : '';
1679
+        
1680
+		//verify we have needed values.
1681
+		if (empty($GRP_ID) || empty($template_pack)) {
1682
+			$this->_template_args['error'] = true;
1683
+			EE_Error::add_error(__('The required date for switching templates is not available.', 'event_espresso'),
1684
+				__FILE__, __FUNCTION__, __LINE__);
1685
+		} else {
1686
+			//get template, set the new template_pack and then reset to default
1687
+			/** @type EE_Message_Template_Group $message_template_group */
1688
+			$message_template_group = EEM_Message_Template_Group::instance()->get_one_by_ID($GRP_ID);
1689 1689
             
1690
-            $message_template_group->set_template_pack_name($template_pack);
1691
-            $this->_req_data['msgr'] = $message_template_group->messenger();
1692
-            $this->_req_data['mt']   = $message_template_group->message_type();
1690
+			$message_template_group->set_template_pack_name($template_pack);
1691
+			$this->_req_data['msgr'] = $message_template_group->messenger();
1692
+			$this->_req_data['mt']   = $message_template_group->message_type();
1693 1693
             
1694
-            $query_args = $this->_reset_to_default_template();
1694
+			$query_args = $this->_reset_to_default_template();
1695 1695
             
1696
-            if (empty($query_args['id'])) {
1697
-                EE_Error::add_error(
1698
-                    __(
1699
-                        'Something went wrong with switching the template pack. Please try again or contact EE support',
1700
-                        'event_espresso'
1701
-                    ),
1702
-                    __FILE__, __FUNCTION__, __LINE__
1703
-                );
1704
-                $this->_template_args['error'] = true;
1705
-            } else {
1706
-                $template_label       = $message_template_group->get_template_pack()->label;
1707
-                $template_pack_labels = $message_template_group->messenger_obj()->get_supports_labels();
1708
-                EE_Error::add_success(
1709
-                    sprintf(
1710
-                        __(
1711
-                            'This message template has been successfully switched to use the %1$s %2$s.  Please wait while the page reloads with your new template.',
1712
-                            'event_espresso'
1713
-                        ),
1714
-                        $template_label,
1715
-                        $template_pack_labels->template_pack
1716
-                    )
1717
-                );
1718
-                //generate the redirect url for js.
1719
-                $url                                          = self::add_query_args_and_nonce($query_args,
1720
-                    $this->_admin_base_url);
1721
-                $this->_template_args['data']['redirect_url'] = $url;
1722
-                $this->_template_args['success']              = true;
1723
-            }
1696
+			if (empty($query_args['id'])) {
1697
+				EE_Error::add_error(
1698
+					__(
1699
+						'Something went wrong with switching the template pack. Please try again or contact EE support',
1700
+						'event_espresso'
1701
+					),
1702
+					__FILE__, __FUNCTION__, __LINE__
1703
+				);
1704
+				$this->_template_args['error'] = true;
1705
+			} else {
1706
+				$template_label       = $message_template_group->get_template_pack()->label;
1707
+				$template_pack_labels = $message_template_group->messenger_obj()->get_supports_labels();
1708
+				EE_Error::add_success(
1709
+					sprintf(
1710
+						__(
1711
+							'This message template has been successfully switched to use the %1$s %2$s.  Please wait while the page reloads with your new template.',
1712
+							'event_espresso'
1713
+						),
1714
+						$template_label,
1715
+						$template_pack_labels->template_pack
1716
+					)
1717
+				);
1718
+				//generate the redirect url for js.
1719
+				$url                                          = self::add_query_args_and_nonce($query_args,
1720
+					$this->_admin_base_url);
1721
+				$this->_template_args['data']['redirect_url'] = $url;
1722
+				$this->_template_args['success']              = true;
1723
+			}
1724 1724
             
1725
-            $this->_return_json();
1725
+			$this->_return_json();
1726 1726
             
1727
-        }
1728
-    }
1729
-    
1730
-    
1731
-    /**
1732
-     * This handles resetting the template for the given messenger/message_type so that users can start from scratch if
1733
-     * they want.
1734
-     *
1735
-     * @access protected
1736
-     * @return array|null
1737
-     */
1738
-    protected function _reset_to_default_template()
1739
-    {
1740
-        
1741
-        $templates = array();
1742
-        $GRP_ID    = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
1743
-        //we need to make sure we've got the info we need.
1744
-        if ( ! isset($this->_req_data['msgr'], $this->_req_data['mt'], $this->_req_data['GRP_ID'])) {
1745
-            EE_Error::add_error(
1746
-                __(
1747
-                    'In order to reset the template to its default we require the messenger, message type, and message template GRP_ID to know what is being reset.  At least one of these is missing.',
1748
-                    'event_espresso'
1749
-                ),
1750
-                __FILE__, __FUNCTION__, __LINE__
1751
-            );
1752
-        }
1753
-        
1754
-        // all templates will be reset to whatever the defaults are
1755
-        // for the global template matching the messenger and message type.
1756
-        $success = ! empty($GRP_ID) ? true : false;
1757
-        
1758
-        if ($success) {
1727
+		}
1728
+	}
1729
+    
1730
+    
1731
+	/**
1732
+	 * This handles resetting the template for the given messenger/message_type so that users can start from scratch if
1733
+	 * they want.
1734
+	 *
1735
+	 * @access protected
1736
+	 * @return array|null
1737
+	 */
1738
+	protected function _reset_to_default_template()
1739
+	{
1740
+        
1741
+		$templates = array();
1742
+		$GRP_ID    = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
1743
+		//we need to make sure we've got the info we need.
1744
+		if ( ! isset($this->_req_data['msgr'], $this->_req_data['mt'], $this->_req_data['GRP_ID'])) {
1745
+			EE_Error::add_error(
1746
+				__(
1747
+					'In order to reset the template to its default we require the messenger, message type, and message template GRP_ID to know what is being reset.  At least one of these is missing.',
1748
+					'event_espresso'
1749
+				),
1750
+				__FILE__, __FUNCTION__, __LINE__
1751
+			);
1752
+		}
1753
+        
1754
+		// all templates will be reset to whatever the defaults are
1755
+		// for the global template matching the messenger and message type.
1756
+		$success = ! empty($GRP_ID) ? true : false;
1757
+        
1758
+		if ($success) {
1759 1759
             
1760
-            //let's first determine if the incoming template is a global template,
1761
-            // if it isn't then we need to get the global template matching messenger and message type.
1762
-            //$MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID( $GRP_ID );
1760
+			//let's first determine if the incoming template is a global template,
1761
+			// if it isn't then we need to get the global template matching messenger and message type.
1762
+			//$MTPG = EEM_Message_Template_Group::instance()->get_one_by_ID( $GRP_ID );
1763 1763
             
1764 1764
             
1765
-            //note this is ONLY deleting the template fields (Message Template rows) NOT the message template group.
1766
-            $success = $this->_delete_mtp_permanently($GRP_ID, false);
1765
+			//note this is ONLY deleting the template fields (Message Template rows) NOT the message template group.
1766
+			$success = $this->_delete_mtp_permanently($GRP_ID, false);
1767 1767
             
1768
-            if ($success) {
1769
-                // if successfully deleted, lets generate the new ones.
1770
-                // Note. We set GLOBAL to true, because resets on ANY template
1771
-                // will use the related global template defaults for regeneration.
1772
-                // This means that if a custom template is reset it resets to whatever the related global template is.
1773
-                // HOWEVER, we DO keep the template pack and template variation set
1774
-                // for the current custom template when resetting.
1775
-                $templates = $this->_generate_new_templates(
1776
-                    $this->_req_data['msgr'],
1777
-                    $this->_req_data['mt'],
1778
-                    $GRP_ID,
1779
-                    true
1780
-                );
1781
-            }
1768
+			if ($success) {
1769
+				// if successfully deleted, lets generate the new ones.
1770
+				// Note. We set GLOBAL to true, because resets on ANY template
1771
+				// will use the related global template defaults for regeneration.
1772
+				// This means that if a custom template is reset it resets to whatever the related global template is.
1773
+				// HOWEVER, we DO keep the template pack and template variation set
1774
+				// for the current custom template when resetting.
1775
+				$templates = $this->_generate_new_templates(
1776
+					$this->_req_data['msgr'],
1777
+					$this->_req_data['mt'],
1778
+					$GRP_ID,
1779
+					true
1780
+				);
1781
+			}
1782 1782
             
1783
-        }
1784
-        
1785
-        //any error messages?
1786
-        if ( ! $success) {
1787
-            EE_Error::add_error(
1788
-                __('Something went wrong with deleting existing templates. Unable to reset to default',
1789
-                    'event_espresso'),
1790
-                __FILE__, __FUNCTION__, __LINE__
1791
-            );
1792
-        }
1793
-        
1794
-        //all good, let's add a success message!
1795
-        if ($success && ! empty($templates)) {
1796
-            $templates = $templates[0]; //the info for the template we generated is the first element in the returned array.
1797
-            EE_Error::overwrite_success();
1798
-            EE_Error::add_success(__('Templates have been reset to defaults.', 'event_espresso'));
1799
-        }
1800
-        
1801
-        
1802
-        $query_args = array(
1803
-            'id'      => isset($templates['GRP_ID']) ? $templates['GRP_ID'] : null,
1804
-            'context' => isset($templates['MTP_context']) ? $templates['MTP_context'] : null,
1805
-            'action'  => isset($templates['GRP_ID']) ? 'edit_message_template' : 'global_mtps'
1806
-        );
1807
-        
1808
-        //if called via ajax then we return query args otherwise redirect
1809
-        if (defined('DOING_AJAX') && DOING_AJAX) {
1810
-            return $query_args;
1811
-        } else {
1812
-            $this->_redirect_after_action(false, '', '', $query_args, true);
1783
+		}
1784
+        
1785
+		//any error messages?
1786
+		if ( ! $success) {
1787
+			EE_Error::add_error(
1788
+				__('Something went wrong with deleting existing templates. Unable to reset to default',
1789
+					'event_espresso'),
1790
+				__FILE__, __FUNCTION__, __LINE__
1791
+			);
1792
+		}
1793
+        
1794
+		//all good, let's add a success message!
1795
+		if ($success && ! empty($templates)) {
1796
+			$templates = $templates[0]; //the info for the template we generated is the first element in the returned array.
1797
+			EE_Error::overwrite_success();
1798
+			EE_Error::add_success(__('Templates have been reset to defaults.', 'event_espresso'));
1799
+		}
1800
+        
1801
+        
1802
+		$query_args = array(
1803
+			'id'      => isset($templates['GRP_ID']) ? $templates['GRP_ID'] : null,
1804
+			'context' => isset($templates['MTP_context']) ? $templates['MTP_context'] : null,
1805
+			'action'  => isset($templates['GRP_ID']) ? 'edit_message_template' : 'global_mtps'
1806
+		);
1807
+        
1808
+		//if called via ajax then we return query args otherwise redirect
1809
+		if (defined('DOING_AJAX') && DOING_AJAX) {
1810
+			return $query_args;
1811
+		} else {
1812
+			$this->_redirect_after_action(false, '', '', $query_args, true);
1813 1813
             
1814
-            return null;
1815
-        }
1816
-    }
1817
-    
1818
-    
1819
-    /**
1820
-     * Retrieve and set the message preview for display.
1821
-     *
1822
-     * @param bool $send if TRUE then we are doing an actual TEST send with the results of the preview.
1823
-     *
1824
-     * @return string
1825
-     */
1826
-    public function _preview_message($send = false)
1827
-    {
1828
-        //first make sure we've got the necessary parameters
1829
-        if (
1830
-        ! isset(
1831
-            $this->_req_data['message_type'],
1832
-            $this->_req_data['messenger'],
1833
-            $this->_req_data['messenger'],
1834
-            $this->_req_data['GRP_ID']
1835
-        )
1836
-        ) {
1837
-            EE_Error::add_error(
1838
-                __('Missing necessary parameters for displaying preview', 'event_espresso'),
1839
-                __FILE__, __FUNCTION__, __LINE__
1840
-            );
1841
-        }
1842
-        
1843
-        EE_Registry::instance()->REQ->set('GRP_ID', $this->_req_data['GRP_ID']);
1844
-        
1845
-        
1846
-        //get the preview!
1847
-        $preview = EED_Messages::preview_message($this->_req_data['message_type'], $this->_req_data['context'],
1848
-            $this->_req_data['messenger'], $send);
1849
-        
1850
-        if ($send) {
1851
-            return $preview;
1852
-        }
1853
-        
1854
-        //let's add a button to go back to the edit view
1855
-        $query_args             = array(
1856
-            'id'      => $this->_req_data['GRP_ID'],
1857
-            'context' => $this->_req_data['context'],
1858
-            'action'  => 'edit_message_template'
1859
-        );
1860
-        $go_back_url            = parent::add_query_args_and_nonce($query_args, $this->_admin_base_url);
1861
-        $preview_button         = '<a href="' . $go_back_url . '" class="button-secondary messages-preview-go-back-button">' . __('Go Back to Edit',
1862
-                'event_espresso') . '</a>';
1863
-        $message_types          = $this->get_installed_message_types();
1864
-        $active_messenger       = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
1865
-        $active_messenger_label = $active_messenger instanceof EE_messenger
1866
-            ? ucwords($active_messenger->label['singular'])
1867
-            : esc_html__('Unknown Messenger', 'event_espresso');
1868
-        //let's provide a helpful title for context
1869
-        $preview_title = sprintf(
1870
-            __('Viewing Preview for %s %s Message Template', 'event_espresso'),
1871
-            $active_messenger_label,
1872
-            ucwords($message_types[$this->_req_data['message_type']]->label['singular'])
1873
-        );
1874
-        //setup display of preview.
1875
-        $this->_admin_page_title                    = $preview_title;
1876
-        $this->_template_args['admin_page_content'] = $preview_button . '<br />' . stripslashes($preview);
1877
-        $this->_template_args['data']['force_json'] = true;
1878
-        
1879
-        return '';
1880
-    }
1881
-    
1882
-    
1883
-    /**
1884
-     * The initial _preview_message is on a no headers route.  It will optionally call this if necessary otherwise it
1885
-     * gets called automatically.
1886
-     *
1887
-     * @since 4.5.0
1888
-     *
1889
-     * @return string
1890
-     */
1891
-    protected function _display_preview_message()
1892
-    {
1893
-        $this->display_admin_page_with_no_sidebar();
1894
-    }
1895
-    
1896
-    
1897
-    /**
1898
-     * registers metaboxes that should show up on the "edit_message_template" page
1899
-     *
1900
-     * @access protected
1901
-     * @return void
1902
-     */
1903
-    protected function _register_edit_meta_boxes()
1904
-    {
1905
-        add_meta_box('mtp_valid_shortcodes', __('Valid Shortcodes', 'event_espresso'),
1906
-            array($this, 'shortcode_meta_box'), $this->_current_screen->id, 'side', 'default');
1907
-        add_meta_box('mtp_extra_actions', __('Extra Actions', 'event_espresso'), array($this, 'extra_actions_meta_box'),
1908
-            $this->_current_screen->id, 'side', 'high');
1909
-        add_meta_box('mtp_templates', __('Template Styles', 'event_espresso'), array($this, 'template_pack_meta_box'),
1910
-            $this->_current_screen->id, 'side', 'high');
1911
-    }
1912
-    
1913
-    
1914
-    /**
1915
-     * metabox content for all template pack and variation selection.
1916
-     *
1917
-     * @since 4.5.0
1918
-     *
1919
-     * @return string
1920
-     */
1921
-    public function template_pack_meta_box()
1922
-    {
1923
-        $this->_set_message_template_group();
1924
-        
1925
-        $tp_collection = EEH_MSG_Template::get_template_pack_collection();
1926
-        
1927
-        $tp_select_values = array();
1928
-        
1929
-        foreach ($tp_collection as $tp) {
1930
-            //only include template packs that support this messenger and message type!
1931
-            $supports = $tp->get_supports();
1932
-            if (
1933
-                ! isset($supports[$this->_message_template_group->messenger()])
1934
-                || ! in_array(
1935
-                    $this->_message_template_group->message_type(),
1936
-                    $supports[$this->_message_template_group->messenger()]
1937
-                )
1938
-            ) {
1939
-                //not supported
1940
-                continue;
1941
-            }
1814
+			return null;
1815
+		}
1816
+	}
1817
+    
1818
+    
1819
+	/**
1820
+	 * Retrieve and set the message preview for display.
1821
+	 *
1822
+	 * @param bool $send if TRUE then we are doing an actual TEST send with the results of the preview.
1823
+	 *
1824
+	 * @return string
1825
+	 */
1826
+	public function _preview_message($send = false)
1827
+	{
1828
+		//first make sure we've got the necessary parameters
1829
+		if (
1830
+		! isset(
1831
+			$this->_req_data['message_type'],
1832
+			$this->_req_data['messenger'],
1833
+			$this->_req_data['messenger'],
1834
+			$this->_req_data['GRP_ID']
1835
+		)
1836
+		) {
1837
+			EE_Error::add_error(
1838
+				__('Missing necessary parameters for displaying preview', 'event_espresso'),
1839
+				__FILE__, __FUNCTION__, __LINE__
1840
+			);
1841
+		}
1842
+        
1843
+		EE_Registry::instance()->REQ->set('GRP_ID', $this->_req_data['GRP_ID']);
1844
+        
1845
+        
1846
+		//get the preview!
1847
+		$preview = EED_Messages::preview_message($this->_req_data['message_type'], $this->_req_data['context'],
1848
+			$this->_req_data['messenger'], $send);
1849
+        
1850
+		if ($send) {
1851
+			return $preview;
1852
+		}
1853
+        
1854
+		//let's add a button to go back to the edit view
1855
+		$query_args             = array(
1856
+			'id'      => $this->_req_data['GRP_ID'],
1857
+			'context' => $this->_req_data['context'],
1858
+			'action'  => 'edit_message_template'
1859
+		);
1860
+		$go_back_url            = parent::add_query_args_and_nonce($query_args, $this->_admin_base_url);
1861
+		$preview_button         = '<a href="' . $go_back_url . '" class="button-secondary messages-preview-go-back-button">' . __('Go Back to Edit',
1862
+				'event_espresso') . '</a>';
1863
+		$message_types          = $this->get_installed_message_types();
1864
+		$active_messenger       = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
1865
+		$active_messenger_label = $active_messenger instanceof EE_messenger
1866
+			? ucwords($active_messenger->label['singular'])
1867
+			: esc_html__('Unknown Messenger', 'event_espresso');
1868
+		//let's provide a helpful title for context
1869
+		$preview_title = sprintf(
1870
+			__('Viewing Preview for %s %s Message Template', 'event_espresso'),
1871
+			$active_messenger_label,
1872
+			ucwords($message_types[$this->_req_data['message_type']]->label['singular'])
1873
+		);
1874
+		//setup display of preview.
1875
+		$this->_admin_page_title                    = $preview_title;
1876
+		$this->_template_args['admin_page_content'] = $preview_button . '<br />' . stripslashes($preview);
1877
+		$this->_template_args['data']['force_json'] = true;
1878
+        
1879
+		return '';
1880
+	}
1881
+    
1882
+    
1883
+	/**
1884
+	 * The initial _preview_message is on a no headers route.  It will optionally call this if necessary otherwise it
1885
+	 * gets called automatically.
1886
+	 *
1887
+	 * @since 4.5.0
1888
+	 *
1889
+	 * @return string
1890
+	 */
1891
+	protected function _display_preview_message()
1892
+	{
1893
+		$this->display_admin_page_with_no_sidebar();
1894
+	}
1895
+    
1896
+    
1897
+	/**
1898
+	 * registers metaboxes that should show up on the "edit_message_template" page
1899
+	 *
1900
+	 * @access protected
1901
+	 * @return void
1902
+	 */
1903
+	protected function _register_edit_meta_boxes()
1904
+	{
1905
+		add_meta_box('mtp_valid_shortcodes', __('Valid Shortcodes', 'event_espresso'),
1906
+			array($this, 'shortcode_meta_box'), $this->_current_screen->id, 'side', 'default');
1907
+		add_meta_box('mtp_extra_actions', __('Extra Actions', 'event_espresso'), array($this, 'extra_actions_meta_box'),
1908
+			$this->_current_screen->id, 'side', 'high');
1909
+		add_meta_box('mtp_templates', __('Template Styles', 'event_espresso'), array($this, 'template_pack_meta_box'),
1910
+			$this->_current_screen->id, 'side', 'high');
1911
+	}
1912
+    
1913
+    
1914
+	/**
1915
+	 * metabox content for all template pack and variation selection.
1916
+	 *
1917
+	 * @since 4.5.0
1918
+	 *
1919
+	 * @return string
1920
+	 */
1921
+	public function template_pack_meta_box()
1922
+	{
1923
+		$this->_set_message_template_group();
1924
+        
1925
+		$tp_collection = EEH_MSG_Template::get_template_pack_collection();
1926
+        
1927
+		$tp_select_values = array();
1928
+        
1929
+		foreach ($tp_collection as $tp) {
1930
+			//only include template packs that support this messenger and message type!
1931
+			$supports = $tp->get_supports();
1932
+			if (
1933
+				! isset($supports[$this->_message_template_group->messenger()])
1934
+				|| ! in_array(
1935
+					$this->_message_template_group->message_type(),
1936
+					$supports[$this->_message_template_group->messenger()]
1937
+				)
1938
+			) {
1939
+				//not supported
1940
+				continue;
1941
+			}
1942 1942
             
1943
-            $tp_select_values[] = array(
1944
-                'text' => $tp->label,
1945
-                'id'   => $tp->dbref
1946
-            );
1947
-        }
1948
-        
1949
-        //if empty $tp_select_values then we make sure default is set because EVERY message type should be supported by the default template pack.  This still allows for the odd template pack to override.
1950
-        if (empty($tp_select_values)) {
1951
-            $tp_select_values[] = array(
1952
-                'text' => __('Default', 'event_espresso'),
1953
-                'id'   => 'default'
1954
-            );
1955
-        }
1956
-        
1957
-        //setup variation select values for the currently selected template.
1958
-        $variations               = $this->_message_template_group->get_template_pack()->get_variations(
1959
-            $this->_message_template_group->messenger(),
1960
-            $this->_message_template_group->message_type()
1961
-        );
1962
-        $variations_select_values = array();
1963
-        foreach ($variations as $variation => $label) {
1964
-            $variations_select_values[] = array(
1965
-                'text' => $label,
1966
-                'id'   => $variation
1967
-            );
1968
-        }
1969
-        
1970
-        $template_pack_labels = $this->_message_template_group->messenger_obj()->get_supports_labels();
1971
-        
1972
-        $template_args['template_packs_selector']        = EEH_Form_Fields::select_input(
1973
-            'MTP_template_pack',
1974
-            $tp_select_values,
1975
-            $this->_message_template_group->get_template_pack_name()
1976
-        );
1977
-        $template_args['variations_selector']            = EEH_Form_Fields::select_input(
1978
-            'MTP_template_variation',
1979
-            $variations_select_values,
1980
-            $this->_message_template_group->get_template_pack_variation()
1981
-        );
1982
-        $template_args['template_pack_label']            = $template_pack_labels->template_pack;
1983
-        $template_args['template_variation_label']       = $template_pack_labels->template_variation;
1984
-        $template_args['template_pack_description']      = $template_pack_labels->template_pack_description;
1985
-        $template_args['template_variation_description'] = $template_pack_labels->template_variation_description;
1986
-        
1987
-        $template = EE_MSG_TEMPLATE_PATH . 'template_pack_and_variations_metabox.template.php';
1988
-        
1989
-        EEH_Template::display_template($template, $template_args);
1990
-    }
1991
-    
1992
-    
1993
-    /**
1994
-     * This meta box holds any extra actions related to Message Templates
1995
-     * For now, this includes Resetting templates to defaults and sending a test email.
1996
-     *
1997
-     * @access  public
1998
-     * @return void
1999
-     * @throws \EE_Error
2000
-     */
2001
-    public function extra_actions_meta_box()
2002
-    {
2003
-        $template_form_fields = array();
2004
-        
2005
-        $extra_args = array(
2006
-            'msgr'   => $this->_message_template_group->messenger(),
2007
-            'mt'     => $this->_message_template_group->message_type(),
2008
-            'GRP_ID' => $this->_message_template_group->GRP_ID()
2009
-        );
2010
-        //first we need to see if there are any fields
2011
-        $fields = $this->_message_template_group->messenger_obj()->get_test_settings_fields();
2012
-        
2013
-        if ( ! empty($fields)) {
2014
-            //yup there be fields
2015
-            foreach ($fields as $field => $config) {
2016
-                $field_id = $this->_message_template_group->messenger() . '_' . $field;
2017
-                $existing = $this->_message_template_group->messenger_obj()->get_existing_test_settings();
2018
-                $default  = isset($config['default']) ? $config['default'] : '';
2019
-                $default  = isset($config['value']) ? $config['value'] : $default;
1943
+			$tp_select_values[] = array(
1944
+				'text' => $tp->label,
1945
+				'id'   => $tp->dbref
1946
+			);
1947
+		}
1948
+        
1949
+		//if empty $tp_select_values then we make sure default is set because EVERY message type should be supported by the default template pack.  This still allows for the odd template pack to override.
1950
+		if (empty($tp_select_values)) {
1951
+			$tp_select_values[] = array(
1952
+				'text' => __('Default', 'event_espresso'),
1953
+				'id'   => 'default'
1954
+			);
1955
+		}
1956
+        
1957
+		//setup variation select values for the currently selected template.
1958
+		$variations               = $this->_message_template_group->get_template_pack()->get_variations(
1959
+			$this->_message_template_group->messenger(),
1960
+			$this->_message_template_group->message_type()
1961
+		);
1962
+		$variations_select_values = array();
1963
+		foreach ($variations as $variation => $label) {
1964
+			$variations_select_values[] = array(
1965
+				'text' => $label,
1966
+				'id'   => $variation
1967
+			);
1968
+		}
1969
+        
1970
+		$template_pack_labels = $this->_message_template_group->messenger_obj()->get_supports_labels();
1971
+        
1972
+		$template_args['template_packs_selector']        = EEH_Form_Fields::select_input(
1973
+			'MTP_template_pack',
1974
+			$tp_select_values,
1975
+			$this->_message_template_group->get_template_pack_name()
1976
+		);
1977
+		$template_args['variations_selector']            = EEH_Form_Fields::select_input(
1978
+			'MTP_template_variation',
1979
+			$variations_select_values,
1980
+			$this->_message_template_group->get_template_pack_variation()
1981
+		);
1982
+		$template_args['template_pack_label']            = $template_pack_labels->template_pack;
1983
+		$template_args['template_variation_label']       = $template_pack_labels->template_variation;
1984
+		$template_args['template_pack_description']      = $template_pack_labels->template_pack_description;
1985
+		$template_args['template_variation_description'] = $template_pack_labels->template_variation_description;
1986
+        
1987
+		$template = EE_MSG_TEMPLATE_PATH . 'template_pack_and_variations_metabox.template.php';
1988
+        
1989
+		EEH_Template::display_template($template, $template_args);
1990
+	}
1991
+    
1992
+    
1993
+	/**
1994
+	 * This meta box holds any extra actions related to Message Templates
1995
+	 * For now, this includes Resetting templates to defaults and sending a test email.
1996
+	 *
1997
+	 * @access  public
1998
+	 * @return void
1999
+	 * @throws \EE_Error
2000
+	 */
2001
+	public function extra_actions_meta_box()
2002
+	{
2003
+		$template_form_fields = array();
2004
+        
2005
+		$extra_args = array(
2006
+			'msgr'   => $this->_message_template_group->messenger(),
2007
+			'mt'     => $this->_message_template_group->message_type(),
2008
+			'GRP_ID' => $this->_message_template_group->GRP_ID()
2009
+		);
2010
+		//first we need to see if there are any fields
2011
+		$fields = $this->_message_template_group->messenger_obj()->get_test_settings_fields();
2012
+        
2013
+		if ( ! empty($fields)) {
2014
+			//yup there be fields
2015
+			foreach ($fields as $field => $config) {
2016
+				$field_id = $this->_message_template_group->messenger() . '_' . $field;
2017
+				$existing = $this->_message_template_group->messenger_obj()->get_existing_test_settings();
2018
+				$default  = isset($config['default']) ? $config['default'] : '';
2019
+				$default  = isset($config['value']) ? $config['value'] : $default;
2020 2020
                 
2021
-                // if type is hidden and the value is empty
2022
-                // something may have gone wrong so let's correct with the defaults
2023
-                $fix              = $config['input'] === 'hidden' && isset($existing[$field]) && empty($existing[$field])
2024
-                    ? $default
2025
-                    : '';
2026
-                $existing[$field] = isset($existing[$field]) && empty($fix)
2027
-                    ? $existing[$field]
2028
-                    : $fix;
2021
+				// if type is hidden and the value is empty
2022
+				// something may have gone wrong so let's correct with the defaults
2023
+				$fix              = $config['input'] === 'hidden' && isset($existing[$field]) && empty($existing[$field])
2024
+					? $default
2025
+					: '';
2026
+				$existing[$field] = isset($existing[$field]) && empty($fix)
2027
+					? $existing[$field]
2028
+					: $fix;
2029 2029
                 
2030
-                $template_form_fields[$field_id] = array(
2031
-                    'name'       => 'test_settings_fld[' . $field . ']',
2032
-                    'label'      => $config['label'],
2033
-                    'input'      => $config['input'],
2034
-                    'type'       => $config['type'],
2035
-                    'required'   => $config['required'],
2036
-                    'validation' => $config['validation'],
2037
-                    'value'      => isset($existing[$field]) ? $existing[$field] : $default,
2038
-                    'css_class'  => $config['css_class'],
2039
-                    'options'    => isset($config['options']) ? $config['options'] : array(),
2040
-                    'default'    => $default,
2041
-                    'format'     => $config['format']
2042
-                );
2043
-            }
2044
-        }
2045
-        
2046
-        $test_settings_fields = ! empty($template_form_fields)
2047
-            ? $this->_generate_admin_form_fields($template_form_fields, 'string', 'ee_tst_settings_flds')
2048
-            : '';
2049
-        
2050
-        $test_settings_html = '';
2051
-        //print out $test_settings_fields
2052
-        if ( ! empty($test_settings_fields)) {
2053
-            echo $test_settings_fields;
2054
-            $test_settings_html = '<input type="submit" class="button-primary mtp-test-button alignright" ';
2055
-            $test_settings_html .= 'name="test_button" value="';
2056
-            $test_settings_html .= __('Test Send', 'event_espresso');
2057
-            $test_settings_html .= '" /><div style="clear:both"></div>';
2058
-        }
2059
-        
2060
-        //and button
2061
-        $test_settings_html .= '<p>' . __('Need to reset this message type and start over?', 'event_espresso') . '</p>';
2062
-        $test_settings_html .= '<div class="publishing-action alignright resetbutton">';
2063
-        $test_settings_html .= $this->get_action_link_or_button(
2064
-            'reset_to_default',
2065
-            'reset',
2066
-            $extra_args,
2067
-            'button-primary reset-default-button'
2068
-        );
2069
-        $test_settings_html .= '</div><div style="clear:both"></div>';
2070
-        echo $test_settings_html;
2071
-    }
2072
-    
2073
-    
2074
-    /**
2075
-     * This returns the shortcode selector skeleton for a given context and field.
2076
-     *
2077
-     * @since 4.9.rc.000
2078
-     *
2079
-     * @param string $field           The name of the field retrieving shortcodes for.
2080
-     * @param string $linked_input_id The css id of the input that the shortcodes get added to.
2081
-     *
2082
-     * @return string
2083
-     */
2084
-    protected function _get_shortcode_selector($field, $linked_input_id)
2085
-    {
2086
-        $template_args = array(
2087
-            'shortcodes'      => $this->_get_shortcodes(array($field), true),
2088
-            'fieldname'       => $field,
2089
-            'linked_input_id' => $linked_input_id
2090
-        );
2091
-        
2092
-        return EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'shortcode_selector_skeleton.template.php',
2093
-            $template_args, true);
2094
-    }
2095
-    
2096
-    
2097
-    /**
2098
-     * This just takes care of returning the meta box content for shortcodes (only used on the edit message template
2099
-     * page)
2100
-     *
2101
-     * @access public
2102
-     * @return void
2103
-     */
2104
-    public function shortcode_meta_box()
2105
-    {
2106
-        $shortcodes = $this->_get_shortcodes(array(), false); //just make sure shortcodes property is set
2107
-        //$messenger = $this->_message_template_group->messenger_obj();
2108
-        //now let's set the content depending on the status of the shortcodes array
2109
-        if (empty($shortcodes)) {
2110
-            $content = '<p>' . __('There are no valid shortcodes available', 'event_espresso') . '</p>';
2111
-            echo $content;
2112
-        } else {
2113
-            //$alt = 0;
2114
-            ?>
2030
+				$template_form_fields[$field_id] = array(
2031
+					'name'       => 'test_settings_fld[' . $field . ']',
2032
+					'label'      => $config['label'],
2033
+					'input'      => $config['input'],
2034
+					'type'       => $config['type'],
2035
+					'required'   => $config['required'],
2036
+					'validation' => $config['validation'],
2037
+					'value'      => isset($existing[$field]) ? $existing[$field] : $default,
2038
+					'css_class'  => $config['css_class'],
2039
+					'options'    => isset($config['options']) ? $config['options'] : array(),
2040
+					'default'    => $default,
2041
+					'format'     => $config['format']
2042
+				);
2043
+			}
2044
+		}
2045
+        
2046
+		$test_settings_fields = ! empty($template_form_fields)
2047
+			? $this->_generate_admin_form_fields($template_form_fields, 'string', 'ee_tst_settings_flds')
2048
+			: '';
2049
+        
2050
+		$test_settings_html = '';
2051
+		//print out $test_settings_fields
2052
+		if ( ! empty($test_settings_fields)) {
2053
+			echo $test_settings_fields;
2054
+			$test_settings_html = '<input type="submit" class="button-primary mtp-test-button alignright" ';
2055
+			$test_settings_html .= 'name="test_button" value="';
2056
+			$test_settings_html .= __('Test Send', 'event_espresso');
2057
+			$test_settings_html .= '" /><div style="clear:both"></div>';
2058
+		}
2059
+        
2060
+		//and button
2061
+		$test_settings_html .= '<p>' . __('Need to reset this message type and start over?', 'event_espresso') . '</p>';
2062
+		$test_settings_html .= '<div class="publishing-action alignright resetbutton">';
2063
+		$test_settings_html .= $this->get_action_link_or_button(
2064
+			'reset_to_default',
2065
+			'reset',
2066
+			$extra_args,
2067
+			'button-primary reset-default-button'
2068
+		);
2069
+		$test_settings_html .= '</div><div style="clear:both"></div>';
2070
+		echo $test_settings_html;
2071
+	}
2072
+    
2073
+    
2074
+	/**
2075
+	 * This returns the shortcode selector skeleton for a given context and field.
2076
+	 *
2077
+	 * @since 4.9.rc.000
2078
+	 *
2079
+	 * @param string $field           The name of the field retrieving shortcodes for.
2080
+	 * @param string $linked_input_id The css id of the input that the shortcodes get added to.
2081
+	 *
2082
+	 * @return string
2083
+	 */
2084
+	protected function _get_shortcode_selector($field, $linked_input_id)
2085
+	{
2086
+		$template_args = array(
2087
+			'shortcodes'      => $this->_get_shortcodes(array($field), true),
2088
+			'fieldname'       => $field,
2089
+			'linked_input_id' => $linked_input_id
2090
+		);
2091
+        
2092
+		return EEH_Template::display_template(EE_MSG_TEMPLATE_PATH . 'shortcode_selector_skeleton.template.php',
2093
+			$template_args, true);
2094
+	}
2095
+    
2096
+    
2097
+	/**
2098
+	 * This just takes care of returning the meta box content for shortcodes (only used on the edit message template
2099
+	 * page)
2100
+	 *
2101
+	 * @access public
2102
+	 * @return void
2103
+	 */
2104
+	public function shortcode_meta_box()
2105
+	{
2106
+		$shortcodes = $this->_get_shortcodes(array(), false); //just make sure shortcodes property is set
2107
+		//$messenger = $this->_message_template_group->messenger_obj();
2108
+		//now let's set the content depending on the status of the shortcodes array
2109
+		if (empty($shortcodes)) {
2110
+			$content = '<p>' . __('There are no valid shortcodes available', 'event_espresso') . '</p>';
2111
+			echo $content;
2112
+		} else {
2113
+			//$alt = 0;
2114
+			?>
2115 2115
             <div
2116 2116
                 style="float:right; margin-top:10px"><?php echo $this->_get_help_tab_link('message_template_shortcodes'); ?></div>
2117 2117
             <p class="small-text"><?php printf(__('You can view the shortcodes usable in your template by clicking the %s icon next to each field.',
2118
-                    'event_espresso'), '<span class="dashicons dashicons-menu"></span>'); ?></p>
2118
+					'event_espresso'), '<span class="dashicons dashicons-menu"></span>'); ?></p>
2119 2119
             <?php
2120
-        }
2121
-        
2122
-        
2123
-    }
2124
-    
2125
-    
2126
-    /**
2127
-     * used to set the $_shortcodes property for when its needed elsewhere.
2128
-     *
2129
-     * @access protected
2130
-     * @return void
2131
-     */
2132
-    protected function _set_shortcodes()
2133
-    {
2134
-        
2135
-        //no need to run this if the property is already set
2136
-        if ( ! empty($this->_shortcodes)) {
2137
-            return;
2138
-        }
2139
-        
2140
-        $this->_shortcodes = $this->_get_shortcodes();
2141
-    }
2142
-    
2143
-    
2144
-    /**
2145
-     * get's all shortcodes for a given template group. (typically used by _set_shortcodes to set the $_shortcodes
2146
-     * property)
2147
-     *
2148
-     * @access  protected
2149
-     *
2150
-     * @param  array   $fields include an array of specific field names that you want to be used to get the shortcodes
2151
-     *                         for. Defaults to all (for the given context)
2152
-     * @param  boolean $merged Whether to merge all the shortcodes into one list of unique shortcodes
2153
-     *
2154
-     * @return array          Shortcodes indexed by fieldname and the an array of shortcode/label pairs OR if merged is
2155
-     *                        true just an array of shortcode/label pairs.
2156
-     */
2157
-    protected function _get_shortcodes($fields = array(), $merged = true)
2158
-    {
2159
-        $this->_set_message_template_group();
2160
-        
2161
-        //we need the messenger and message template to retrieve the valid shortcodes array.
2162
-        $GRP_ID  = isset($this->_req_data['id']) && ! empty($this->_req_data['id']) ? absint($this->_req_data['id']) : false;
2163
-        $context = isset($this->_req_data['context']) ? $this->_req_data['context'] : key($this->_message_template_group->contexts_config());
2164
-        
2165
-        return ! empty($GRP_ID) ? $this->_message_template_group->get_shortcodes($context, $fields, $merged) : array();
2166
-    }
2167
-    
2168
-    
2169
-    /**
2170
-     * This sets the _message_template property (containing the called message_template object)
2171
-     *
2172
-     * @access protected
2173
-     * @return  void
2174
-     */
2175
-    protected function _set_message_template_group()
2176
-    {
2177
-        
2178
-        if ( ! empty($this->_message_template_group)) {
2179
-            return;
2180
-        } //get out if this is already set.
2181
-        
2182
-        $GRP_ID = ! empty($this->_req_data['GRP_ID']) ? absint($this->_req_data['GRP_ID']) : false;
2183
-        $GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['id']) ? $this->_req_data['id'] : $GRP_ID;
2184
-        
2185
-        //let's get the message templates
2186
-        $MTP = EEM_Message_Template_Group::instance();
2187
-        
2188
-        if (empty($GRP_ID)) {
2189
-            $this->_message_template_group = $MTP->create_default_object();
2190
-        } else {
2191
-            $this->_message_template_group = $MTP->get_one_by_ID($GRP_ID);
2192
-        }
2193
-        
2194
-        $this->_template_pack = $this->_message_template_group->get_template_pack();
2195
-        $this->_variation     = $this->_message_template_group->get_template_pack_variation();
2196
-        
2197
-    }
2198
-    
2199
-    
2200
-    /**
2201
-     * sets up a context switcher for edit forms
2202
-     *
2203
-     * @access  protected
2204
-     *
2205
-     * @param  EE_Message_Template_Group $template_group_object the template group object being displayed on the form
2206
-     * @param array                      $args                  various things the context switcher needs.
2207
-     *
2208
-     */
2209
-    protected function _set_context_switcher(EE_Message_Template_Group $template_group_object, $args)
2210
-    {
2211
-        $context_details = $template_group_object->contexts_config();
2212
-        $context_label   = $template_group_object->context_label();
2213
-        ob_start();
2214
-        ?>
2120
+		}
2121
+        
2122
+        
2123
+	}
2124
+    
2125
+    
2126
+	/**
2127
+	 * used to set the $_shortcodes property for when its needed elsewhere.
2128
+	 *
2129
+	 * @access protected
2130
+	 * @return void
2131
+	 */
2132
+	protected function _set_shortcodes()
2133
+	{
2134
+        
2135
+		//no need to run this if the property is already set
2136
+		if ( ! empty($this->_shortcodes)) {
2137
+			return;
2138
+		}
2139
+        
2140
+		$this->_shortcodes = $this->_get_shortcodes();
2141
+	}
2142
+    
2143
+    
2144
+	/**
2145
+	 * get's all shortcodes for a given template group. (typically used by _set_shortcodes to set the $_shortcodes
2146
+	 * property)
2147
+	 *
2148
+	 * @access  protected
2149
+	 *
2150
+	 * @param  array   $fields include an array of specific field names that you want to be used to get the shortcodes
2151
+	 *                         for. Defaults to all (for the given context)
2152
+	 * @param  boolean $merged Whether to merge all the shortcodes into one list of unique shortcodes
2153
+	 *
2154
+	 * @return array          Shortcodes indexed by fieldname and the an array of shortcode/label pairs OR if merged is
2155
+	 *                        true just an array of shortcode/label pairs.
2156
+	 */
2157
+	protected function _get_shortcodes($fields = array(), $merged = true)
2158
+	{
2159
+		$this->_set_message_template_group();
2160
+        
2161
+		//we need the messenger and message template to retrieve the valid shortcodes array.
2162
+		$GRP_ID  = isset($this->_req_data['id']) && ! empty($this->_req_data['id']) ? absint($this->_req_data['id']) : false;
2163
+		$context = isset($this->_req_data['context']) ? $this->_req_data['context'] : key($this->_message_template_group->contexts_config());
2164
+        
2165
+		return ! empty($GRP_ID) ? $this->_message_template_group->get_shortcodes($context, $fields, $merged) : array();
2166
+	}
2167
+    
2168
+    
2169
+	/**
2170
+	 * This sets the _message_template property (containing the called message_template object)
2171
+	 *
2172
+	 * @access protected
2173
+	 * @return  void
2174
+	 */
2175
+	protected function _set_message_template_group()
2176
+	{
2177
+        
2178
+		if ( ! empty($this->_message_template_group)) {
2179
+			return;
2180
+		} //get out if this is already set.
2181
+        
2182
+		$GRP_ID = ! empty($this->_req_data['GRP_ID']) ? absint($this->_req_data['GRP_ID']) : false;
2183
+		$GRP_ID = empty($GRP_ID) && ! empty($this->_req_data['id']) ? $this->_req_data['id'] : $GRP_ID;
2184
+        
2185
+		//let's get the message templates
2186
+		$MTP = EEM_Message_Template_Group::instance();
2187
+        
2188
+		if (empty($GRP_ID)) {
2189
+			$this->_message_template_group = $MTP->create_default_object();
2190
+		} else {
2191
+			$this->_message_template_group = $MTP->get_one_by_ID($GRP_ID);
2192
+		}
2193
+        
2194
+		$this->_template_pack = $this->_message_template_group->get_template_pack();
2195
+		$this->_variation     = $this->_message_template_group->get_template_pack_variation();
2196
+        
2197
+	}
2198
+    
2199
+    
2200
+	/**
2201
+	 * sets up a context switcher for edit forms
2202
+	 *
2203
+	 * @access  protected
2204
+	 *
2205
+	 * @param  EE_Message_Template_Group $template_group_object the template group object being displayed on the form
2206
+	 * @param array                      $args                  various things the context switcher needs.
2207
+	 *
2208
+	 */
2209
+	protected function _set_context_switcher(EE_Message_Template_Group $template_group_object, $args)
2210
+	{
2211
+		$context_details = $template_group_object->contexts_config();
2212
+		$context_label   = $template_group_object->context_label();
2213
+		ob_start();
2214
+		?>
2215 2215
         <div class="ee-msg-switcher-container">
2216 2216
             <form method="get" action="<?php echo EE_MSG_ADMIN_URL; ?>" id="ee-msg-context-switcher-frm">
2217 2217
                 <?php
2218
-                foreach ($args as $name => $value) {
2219
-                    if ($name == 'context' || empty($value) || $name == 'extra') {
2220
-                        continue;
2221
-                    }
2222
-                    ?>
2218
+				foreach ($args as $name => $value) {
2219
+					if ($name == 'context' || empty($value) || $name == 'extra') {
2220
+						continue;
2221
+					}
2222
+					?>
2223 2223
                     <input type="hidden" name="<?php echo $name; ?>" value="<?php echo $value; ?>"/>
2224 2224
                     <?php
2225
-                }
2226
-                //setup nonce_url
2227
-                wp_nonce_field($args['action'] . '_nonce', $args['action'] . '_nonce', false);
2228
-                ?>
2225
+				}
2226
+				//setup nonce_url
2227
+				wp_nonce_field($args['action'] . '_nonce', $args['action'] . '_nonce', false);
2228
+				?>
2229 2229
                 <select name="context">
2230 2230
                     <?php
2231
-                    $context_templates = $template_group_object->context_templates();
2232
-                    if (is_array($context_templates)) :
2233
-                        foreach ($context_templates as $context => $template_fields) :
2234
-                            $checked = ($context == $args['context']) ? 'selected="selected"' : '';
2235
-                            ?>
2231
+					$context_templates = $template_group_object->context_templates();
2232
+					if (is_array($context_templates)) :
2233
+						foreach ($context_templates as $context => $template_fields) :
2234
+							$checked = ($context == $args['context']) ? 'selected="selected"' : '';
2235
+							?>
2236 2236
                             <option value="<?php echo $context; ?>" <?php echo $checked; ?>>
2237 2237
                                 <?php echo $context_details[$context]['label']; ?>
2238 2238
                             </option>
@@ -2245,1584 +2245,1584 @@  discard block
 block discarded – undo
2245 2245
             <?php echo $args['extra']; ?>
2246 2246
         </div> <!-- end .ee-msg-switcher-container -->
2247 2247
         <?php
2248
-        $output = ob_get_contents();
2249
-        ob_clean();
2250
-        $this->_context_switcher = $output;
2251
-    }
2252
-    
2253
-    
2254
-    /**
2255
-     * utility for sanitizing new values coming in.
2256
-     * Note: this is only used when updating a context.
2257
-     *
2258
-     * @access protected
2259
-     *
2260
-     * @param int $index This helps us know which template field to select from the request array.
2261
-     *
2262
-     * @return array
2263
-     */
2264
-    protected function _set_message_template_column_values($index)
2265
-    {
2266
-        if (is_array($this->_req_data['MTP_template_fields'][$index]['content'])) {
2267
-            foreach ($this->_req_data['MTP_template_fields'][$index]['content'] as $field => $value) {
2268
-                $this->_req_data['MTP_template_fields'][$index]['content'][$field] = $value;
2269
-            }
2270
-        } /*else {
2248
+		$output = ob_get_contents();
2249
+		ob_clean();
2250
+		$this->_context_switcher = $output;
2251
+	}
2252
+    
2253
+    
2254
+	/**
2255
+	 * utility for sanitizing new values coming in.
2256
+	 * Note: this is only used when updating a context.
2257
+	 *
2258
+	 * @access protected
2259
+	 *
2260
+	 * @param int $index This helps us know which template field to select from the request array.
2261
+	 *
2262
+	 * @return array
2263
+	 */
2264
+	protected function _set_message_template_column_values($index)
2265
+	{
2266
+		if (is_array($this->_req_data['MTP_template_fields'][$index]['content'])) {
2267
+			foreach ($this->_req_data['MTP_template_fields'][$index]['content'] as $field => $value) {
2268
+				$this->_req_data['MTP_template_fields'][$index]['content'][$field] = $value;
2269
+			}
2270
+		} /*else {
2271 2271
 			$this->_req_data['MTP_template_fields'][$index]['content'] = $this->_req_data['MTP_template_fields'][$index]['content'];
2272 2272
 		}*/
2273 2273
         
2274 2274
         
2275
-        $set_column_values = array(
2276
-            'MTP_ID'             => absint($this->_req_data['MTP_template_fields'][$index]['MTP_ID']),
2277
-            'GRP_ID'             => absint($this->_req_data['GRP_ID']),
2278
-            'MTP_user_id'        => absint($this->_req_data['MTP_user_id']),
2279
-            'MTP_messenger'      => strtolower($this->_req_data['MTP_messenger']),
2280
-            'MTP_message_type'   => strtolower($this->_req_data['MTP_message_type']),
2281
-            'MTP_template_field' => strtolower($this->_req_data['MTP_template_fields'][$index]['name']),
2282
-            'MTP_context'        => strtolower($this->_req_data['MTP_context']),
2283
-            'MTP_content'        => $this->_req_data['MTP_template_fields'][$index]['content'],
2284
-            'MTP_is_global'      => isset($this->_req_data['MTP_is_global'])
2285
-                ? absint($this->_req_data['MTP_is_global'])
2286
-                : 0,
2287
-            'MTP_is_override'    => isset($this->_req_data['MTP_is_override'])
2288
-                ? absint($this->_req_data['MTP_is_override'])
2289
-                : 0,
2290
-            'MTP_deleted'        => absint($this->_req_data['MTP_deleted']),
2291
-            'MTP_is_active'      => absint($this->_req_data['MTP_is_active'])
2292
-        );
2293
-        
2294
-        
2295
-        return $set_column_values;
2296
-    }
2297
-    
2298
-    
2299
-    protected function _insert_or_update_message_template($new = false)
2300
-    {
2301
-        
2302
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2303
-        $success  = 0;
2304
-        $override = false;
2305
-        
2306
-        //setup notices description
2307
-        $messenger_slug = ! empty($this->_req_data['MTP_messenger']) ? $this->_req_data['MTP_messenger'] : '';
2308
-        
2309
-        //need the message type and messenger objects to be able to use the labels for the notices
2310
-        $messenger_object = $this->_message_resource_manager->get_messenger($messenger_slug);
2311
-        $messenger_label  = $messenger_object instanceof EE_messenger ? ucwords($messenger_object->label['singular']) : '';
2312
-        
2313
-        $message_type_slug   = ! empty($this->_req_data['MTP_message_type']) ? $this->_req_data['MTP_message_type'] : '';
2314
-        $message_type_object = $this->_message_resource_manager->get_message_type($message_type_slug);
2315
-        
2316
-        $message_type_label = $message_type_object instanceof EE_message_type
2317
-            ? ucwords($message_type_object->label['singular'])
2318
-            : '';
2319
-        
2320
-        $context_slug = ! empty($this->_req_data['MTP_context'])
2321
-            ? $this->_req_data['MTP_context']
2322
-            : '';
2323
-        $context      = ucwords(str_replace('_', ' ', $context_slug));
2324
-        
2325
-        $item_desc = $messenger_label && $message_type_label ? $messenger_label . ' ' . $message_type_label . ' ' . $context . ' ' : '';
2326
-        $item_desc .= 'Message Template';
2327
-        $query_args  = array();
2328
-        $edit_array  = array();
2329
-        $action_desc = '';
2330
-        
2331
-        //if this is "new" then we need to generate the default contexts for the selected messenger/message_type for user to edit.
2332
-        if ($new) {
2333
-            $GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2334
-            if ($edit_array = $this->_generate_new_templates($messenger_slug, $message_type_slug, $GRP_ID)) {
2335
-                if (empty($edit_array)) {
2336
-                    $success = 0;
2337
-                } else {
2338
-                    $success    = 1;
2339
-                    $edit_array = $edit_array[0];
2340
-                    $query_args = array(
2341
-                        'id'      => $edit_array['GRP_ID'],
2342
-                        'context' => $edit_array['MTP_context'],
2343
-                        'action'  => 'edit_message_template'
2344
-                    );
2345
-                }
2346
-            }
2347
-            $action_desc = 'created';
2348
-        } else {
2349
-            $MTPG = EEM_Message_Template_Group::instance();
2350
-            $MTP  = EEM_Message_Template::instance();
2275
+		$set_column_values = array(
2276
+			'MTP_ID'             => absint($this->_req_data['MTP_template_fields'][$index]['MTP_ID']),
2277
+			'GRP_ID'             => absint($this->_req_data['GRP_ID']),
2278
+			'MTP_user_id'        => absint($this->_req_data['MTP_user_id']),
2279
+			'MTP_messenger'      => strtolower($this->_req_data['MTP_messenger']),
2280
+			'MTP_message_type'   => strtolower($this->_req_data['MTP_message_type']),
2281
+			'MTP_template_field' => strtolower($this->_req_data['MTP_template_fields'][$index]['name']),
2282
+			'MTP_context'        => strtolower($this->_req_data['MTP_context']),
2283
+			'MTP_content'        => $this->_req_data['MTP_template_fields'][$index]['content'],
2284
+			'MTP_is_global'      => isset($this->_req_data['MTP_is_global'])
2285
+				? absint($this->_req_data['MTP_is_global'])
2286
+				: 0,
2287
+			'MTP_is_override'    => isset($this->_req_data['MTP_is_override'])
2288
+				? absint($this->_req_data['MTP_is_override'])
2289
+				: 0,
2290
+			'MTP_deleted'        => absint($this->_req_data['MTP_deleted']),
2291
+			'MTP_is_active'      => absint($this->_req_data['MTP_is_active'])
2292
+		);
2293
+        
2294
+        
2295
+		return $set_column_values;
2296
+	}
2297
+    
2298
+    
2299
+	protected function _insert_or_update_message_template($new = false)
2300
+	{
2301
+        
2302
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2303
+		$success  = 0;
2304
+		$override = false;
2305
+        
2306
+		//setup notices description
2307
+		$messenger_slug = ! empty($this->_req_data['MTP_messenger']) ? $this->_req_data['MTP_messenger'] : '';
2308
+        
2309
+		//need the message type and messenger objects to be able to use the labels for the notices
2310
+		$messenger_object = $this->_message_resource_manager->get_messenger($messenger_slug);
2311
+		$messenger_label  = $messenger_object instanceof EE_messenger ? ucwords($messenger_object->label['singular']) : '';
2312
+        
2313
+		$message_type_slug   = ! empty($this->_req_data['MTP_message_type']) ? $this->_req_data['MTP_message_type'] : '';
2314
+		$message_type_object = $this->_message_resource_manager->get_message_type($message_type_slug);
2315
+        
2316
+		$message_type_label = $message_type_object instanceof EE_message_type
2317
+			? ucwords($message_type_object->label['singular'])
2318
+			: '';
2319
+        
2320
+		$context_slug = ! empty($this->_req_data['MTP_context'])
2321
+			? $this->_req_data['MTP_context']
2322
+			: '';
2323
+		$context      = ucwords(str_replace('_', ' ', $context_slug));
2324
+        
2325
+		$item_desc = $messenger_label && $message_type_label ? $messenger_label . ' ' . $message_type_label . ' ' . $context . ' ' : '';
2326
+		$item_desc .= 'Message Template';
2327
+		$query_args  = array();
2328
+		$edit_array  = array();
2329
+		$action_desc = '';
2330
+        
2331
+		//if this is "new" then we need to generate the default contexts for the selected messenger/message_type for user to edit.
2332
+		if ($new) {
2333
+			$GRP_ID = ! empty($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : 0;
2334
+			if ($edit_array = $this->_generate_new_templates($messenger_slug, $message_type_slug, $GRP_ID)) {
2335
+				if (empty($edit_array)) {
2336
+					$success = 0;
2337
+				} else {
2338
+					$success    = 1;
2339
+					$edit_array = $edit_array[0];
2340
+					$query_args = array(
2341
+						'id'      => $edit_array['GRP_ID'],
2342
+						'context' => $edit_array['MTP_context'],
2343
+						'action'  => 'edit_message_template'
2344
+					);
2345
+				}
2346
+			}
2347
+			$action_desc = 'created';
2348
+		} else {
2349
+			$MTPG = EEM_Message_Template_Group::instance();
2350
+			$MTP  = EEM_Message_Template::instance();
2351 2351
             
2352 2352
             
2353
-            //run update for each template field in displayed context
2354
-            if ( ! isset($this->_req_data['MTP_template_fields']) && empty($this->_req_data['MTP_template_fields'])) {
2355
-                EE_Error::add_error(
2356
-                    __('There was a problem saving the template fields from the form because I didn\'t receive any actual template field data.',
2357
-                        'event_espresso'),
2358
-                    __FILE__, __FUNCTION__, __LINE__
2359
-                );
2360
-                $success = 0;
2353
+			//run update for each template field in displayed context
2354
+			if ( ! isset($this->_req_data['MTP_template_fields']) && empty($this->_req_data['MTP_template_fields'])) {
2355
+				EE_Error::add_error(
2356
+					__('There was a problem saving the template fields from the form because I didn\'t receive any actual template field data.',
2357
+						'event_espresso'),
2358
+					__FILE__, __FUNCTION__, __LINE__
2359
+				);
2360
+				$success = 0;
2361 2361
                 
2362
-            } else {
2363
-                //first validate all fields!
2364
-                $validates = $MTPG->validate($this->_req_data['MTP_template_fields'], $context_slug, $messenger_slug,
2365
-                    $message_type_slug);
2362
+			} else {
2363
+				//first validate all fields!
2364
+				$validates = $MTPG->validate($this->_req_data['MTP_template_fields'], $context_slug, $messenger_slug,
2365
+					$message_type_slug);
2366 2366
                 
2367
-                //if $validate returned error messages (i.e. is_array()) then we need to process them and setup an appropriate response. HMM, dang this isn't correct, $validates will ALWAYS be an array.  WE need to make sure there is no actual error messages in validates.
2368
-                if (is_array($validates) && ! empty($validates)) {
2369
-                    //add the transient so when the form loads we know which fields to highlight
2370
-                    $this->_add_transient('edit_message_template', $validates);
2367
+				//if $validate returned error messages (i.e. is_array()) then we need to process them and setup an appropriate response. HMM, dang this isn't correct, $validates will ALWAYS be an array.  WE need to make sure there is no actual error messages in validates.
2368
+				if (is_array($validates) && ! empty($validates)) {
2369
+					//add the transient so when the form loads we know which fields to highlight
2370
+					$this->_add_transient('edit_message_template', $validates);
2371 2371
                     
2372
-                    $success = 0;
2372
+					$success = 0;
2373 2373
                     
2374
-                    //setup notices
2375
-                    foreach ($validates as $field => $error) {
2376
-                        if (isset($error['msg'])) {
2377
-                            EE_Error::add_error($error['msg'], __FILE__, __FUNCTION__, __LINE__);
2378
-                        }
2379
-                    }
2374
+					//setup notices
2375
+					foreach ($validates as $field => $error) {
2376
+						if (isset($error['msg'])) {
2377
+							EE_Error::add_error($error['msg'], __FILE__, __FUNCTION__, __LINE__);
2378
+						}
2379
+					}
2380 2380
                     
2381
-                } else {
2382
-                    $set_column_values = array();
2383
-                    foreach ($this->_req_data['MTP_template_fields'] as $template_field => $content) {
2384
-                        $set_column_values = $this->_set_message_template_column_values($template_field);
2381
+				} else {
2382
+					$set_column_values = array();
2383
+					foreach ($this->_req_data['MTP_template_fields'] as $template_field => $content) {
2384
+						$set_column_values = $this->_set_message_template_column_values($template_field);
2385 2385
                         
2386
-                        $where_cols_n_values = array(
2387
-                            'MTP_ID' => $this->_req_data['MTP_template_fields'][$template_field]['MTP_ID']
2388
-                        );
2386
+						$where_cols_n_values = array(
2387
+							'MTP_ID' => $this->_req_data['MTP_template_fields'][$template_field]['MTP_ID']
2388
+						);
2389 2389
                         
2390
-                        $message_template_fields = array(
2391
-                            'GRP_ID'             => $set_column_values['GRP_ID'],
2392
-                            'MTP_template_field' => $set_column_values['MTP_template_field'],
2393
-                            'MTP_context'        => $set_column_values['MTP_context'],
2394
-                            'MTP_content'        => $set_column_values['MTP_content']
2395
-                        );
2396
-                        if ($updated = $MTP->update($message_template_fields, array($where_cols_n_values))) {
2397
-                            if ($updated === false) {
2398
-                                EE_Error::add_error(
2399
-                                    sprintf(
2400
-                                        __('%s field was NOT updated for some reason', 'event_espresso'),
2401
-                                        $template_field
2402
-                                    ),
2403
-                                    __FILE__, __FUNCTION__, __LINE__
2404
-                                );
2405
-                            } else {
2406
-                                $success = 1;
2407
-                            }
2408
-                        }
2409
-                        $action_desc = 'updated';
2410
-                    }
2390
+						$message_template_fields = array(
2391
+							'GRP_ID'             => $set_column_values['GRP_ID'],
2392
+							'MTP_template_field' => $set_column_values['MTP_template_field'],
2393
+							'MTP_context'        => $set_column_values['MTP_context'],
2394
+							'MTP_content'        => $set_column_values['MTP_content']
2395
+						);
2396
+						if ($updated = $MTP->update($message_template_fields, array($where_cols_n_values))) {
2397
+							if ($updated === false) {
2398
+								EE_Error::add_error(
2399
+									sprintf(
2400
+										__('%s field was NOT updated for some reason', 'event_espresso'),
2401
+										$template_field
2402
+									),
2403
+									__FILE__, __FUNCTION__, __LINE__
2404
+								);
2405
+							} else {
2406
+								$success = 1;
2407
+							}
2408
+						}
2409
+						$action_desc = 'updated';
2410
+					}
2411 2411
                     
2412
-                    //we can use the last set_column_values for the MTPG update (because its the same for all of these specific MTPs)
2413
-                    $mtpg_fields = array(
2414
-                        'MTP_user_id'      => $set_column_values['MTP_user_id'],
2415
-                        'MTP_messenger'    => $set_column_values['MTP_messenger'],
2416
-                        'MTP_message_type' => $set_column_values['MTP_message_type'],
2417
-                        'MTP_is_global'    => $set_column_values['MTP_is_global'],
2418
-                        'MTP_is_override'  => $set_column_values['MTP_is_override'],
2419
-                        'MTP_deleted'      => $set_column_values['MTP_deleted'],
2420
-                        'MTP_is_active'    => $set_column_values['MTP_is_active'],
2421
-                        'MTP_name'         => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_name'])
2422
-                            ? $this->_req_data['ee_msg_non_global_fields']['MTP_name']
2423
-                            : '',
2424
-                        'MTP_description'  => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_description'])
2425
-                            ? $this->_req_data['ee_msg_non_global_fields']['MTP_description']
2426
-                            : ''
2427
-                    );
2412
+					//we can use the last set_column_values for the MTPG update (because its the same for all of these specific MTPs)
2413
+					$mtpg_fields = array(
2414
+						'MTP_user_id'      => $set_column_values['MTP_user_id'],
2415
+						'MTP_messenger'    => $set_column_values['MTP_messenger'],
2416
+						'MTP_message_type' => $set_column_values['MTP_message_type'],
2417
+						'MTP_is_global'    => $set_column_values['MTP_is_global'],
2418
+						'MTP_is_override'  => $set_column_values['MTP_is_override'],
2419
+						'MTP_deleted'      => $set_column_values['MTP_deleted'],
2420
+						'MTP_is_active'    => $set_column_values['MTP_is_active'],
2421
+						'MTP_name'         => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_name'])
2422
+							? $this->_req_data['ee_msg_non_global_fields']['MTP_name']
2423
+							: '',
2424
+						'MTP_description'  => ! empty($this->_req_data['ee_msg_non_global_fields']['MTP_description'])
2425
+							? $this->_req_data['ee_msg_non_global_fields']['MTP_description']
2426
+							: ''
2427
+					);
2428 2428
                     
2429
-                    $mtpg_where = array('GRP_ID' => $set_column_values['GRP_ID']);
2430
-                    $updated    = $MTPG->update($mtpg_fields, array($mtpg_where));
2429
+					$mtpg_where = array('GRP_ID' => $set_column_values['GRP_ID']);
2430
+					$updated    = $MTPG->update($mtpg_fields, array($mtpg_where));
2431 2431
                     
2432
-                    if ($updated === false) {
2433
-                        EE_Error::add_error(
2434
-                            sprintf(
2435
-                                __('The Message Template Group (%d) was NOT updated for some reason', 'event_espresso'),
2436
-                                $set_column_values['GRP_ID']
2437
-                            ),
2438
-                            __FILE__, __FUNCTION__, __LINE__
2439
-                        );
2440
-                    } else {
2441
-                        //k now we need to ensure the template_pack and template_variation fields are set.
2442
-                        $template_pack = ! empty($this->_req_data['MTP_template_pack'])
2443
-                            ? $this->_req_data['MTP_template_pack']
2444
-                            : 'default';
2432
+					if ($updated === false) {
2433
+						EE_Error::add_error(
2434
+							sprintf(
2435
+								__('The Message Template Group (%d) was NOT updated for some reason', 'event_espresso'),
2436
+								$set_column_values['GRP_ID']
2437
+							),
2438
+							__FILE__, __FUNCTION__, __LINE__
2439
+						);
2440
+					} else {
2441
+						//k now we need to ensure the template_pack and template_variation fields are set.
2442
+						$template_pack = ! empty($this->_req_data['MTP_template_pack'])
2443
+							? $this->_req_data['MTP_template_pack']
2444
+							: 'default';
2445 2445
                         
2446
-                        $template_variation = ! empty($this->_req_data['MTP_template_variation'])
2447
-                            ? $this->_req_data['MTP_template_variation']
2448
-                            : 'default';
2446
+						$template_variation = ! empty($this->_req_data['MTP_template_variation'])
2447
+							? $this->_req_data['MTP_template_variation']
2448
+							: 'default';
2449 2449
                         
2450
-                        $mtpg_obj = $MTPG->get_one_by_ID($set_column_values['GRP_ID']);
2451
-                        if ($mtpg_obj instanceof EE_Message_Template_Group) {
2452
-                            $mtpg_obj->set_template_pack_name($template_pack);
2453
-                            $mtpg_obj->set_template_pack_variation($template_variation);
2454
-                        }
2455
-                        $success = 1;
2456
-                    }
2457
-                }
2458
-            }
2450
+						$mtpg_obj = $MTPG->get_one_by_ID($set_column_values['GRP_ID']);
2451
+						if ($mtpg_obj instanceof EE_Message_Template_Group) {
2452
+							$mtpg_obj->set_template_pack_name($template_pack);
2453
+							$mtpg_obj->set_template_pack_variation($template_variation);
2454
+						}
2455
+						$success = 1;
2456
+					}
2457
+				}
2458
+			}
2459 2459
             
2460
-        }
2461
-        
2462
-        //we return things differently if doing ajax
2463
-        if (defined('DOING_AJAX') && DOING_AJAX) {
2464
-            $this->_template_args['success'] = $success;
2465
-            $this->_template_args['error']   = ! $success ? true : false;
2466
-            $this->_template_args['content'] = '';
2467
-            $this->_template_args['data']    = array(
2468
-                'grpID'        => $edit_array['GRP_ID'],
2469
-                'templateName' => $edit_array['template_name']
2470
-            );
2471
-            if ($success) {
2472
-                EE_Error::overwrite_success();
2473
-                EE_Error::add_success(__('The new template has been created and automatically selected for this event.  You can edit the new template by clicking the edit button.  Note before this template is assigned to this event, the event must be saved.',
2474
-                    'event_espresso'));
2475
-            }
2460
+		}
2461
+        
2462
+		//we return things differently if doing ajax
2463
+		if (defined('DOING_AJAX') && DOING_AJAX) {
2464
+			$this->_template_args['success'] = $success;
2465
+			$this->_template_args['error']   = ! $success ? true : false;
2466
+			$this->_template_args['content'] = '';
2467
+			$this->_template_args['data']    = array(
2468
+				'grpID'        => $edit_array['GRP_ID'],
2469
+				'templateName' => $edit_array['template_name']
2470
+			);
2471
+			if ($success) {
2472
+				EE_Error::overwrite_success();
2473
+				EE_Error::add_success(__('The new template has been created and automatically selected for this event.  You can edit the new template by clicking the edit button.  Note before this template is assigned to this event, the event must be saved.',
2474
+					'event_espresso'));
2475
+			}
2476 2476
             
2477
-            $this->_return_json();
2478
-        }
2479
-        
2480
-        
2481
-        //was a test send triggered?
2482
-        if (isset($this->_req_data['test_button'])) {
2483
-            EE_Error::overwrite_success();
2484
-            $this->_do_test_send($context_slug, $messenger_slug, $message_type_slug);
2485
-            $override = true;
2486
-        }
2487
-        
2488
-        if (empty($query_args)) {
2489
-            $query_args = array(
2490
-                'id'      => $this->_req_data['GRP_ID'],
2491
-                'context' => $context_slug,
2492
-                'action'  => 'edit_message_template'
2493
-            );
2494
-        }
2495
-        
2496
-        $this->_redirect_after_action($success, $item_desc, $action_desc, $query_args, $override);
2497
-    }
2498
-    
2499
-    
2500
-    /**
2501
-     * processes a test send request to do an actual messenger delivery test for the given message template being tested
2502
-     *
2503
-     * @param  string $context      what context being tested
2504
-     * @param  string $messenger    messenger being tested
2505
-     * @param  string $message_type message type being tested
2506
-     *
2507
-     */
2508
-    protected function _do_test_send($context, $messenger, $message_type)
2509
-    {
2510
-        //set things up for preview
2511
-        $this->_req_data['messenger']    = $messenger;
2512
-        $this->_req_data['message_type'] = $message_type;
2513
-        $this->_req_data['context']      = $context;
2514
-        $this->_req_data['GRP_ID']       = isset($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : '';
2515
-        $active_messenger                = $this->_message_resource_manager->get_active_messenger($messenger);
2516
-        
2517
-        //let's save any existing fields that might be required by the messenger
2518
-        if (
2519
-            isset($this->_req_data['test_settings_fld'])
2520
-            && $active_messenger instanceof EE_messenger
2521
-            && apply_filters(
2522
-                'FHEE__Messages_Admin_Page__do_test_send__set_existing_test_settings',
2523
-                true,
2524
-                $this->_req_data['test_settings_fld'],
2525
-                $active_messenger
2526
-            )
2527
-        ) {
2528
-            $active_messenger->set_existing_test_settings($this->_req_data['test_settings_fld']);
2529
-        }
2530
-        
2531
-        $success = $this->_preview_message(true);
2532
-        
2533
-        if ($success) {
2534
-            EE_Error::add_success(__('Test message sent', 'event_espresso'));
2535
-        } else {
2536
-            EE_Error::add_error(__('The test message was not sent', 'event_espresso'), __FILE__, __FUNCTION__,
2537
-                __LINE__);
2538
-        }
2539
-    }
2540
-    
2541
-    
2542
-    /**
2543
-     * _generate_new_templates
2544
-     * This will handle the messenger, message_type selection when "adding a new custom template" for an event and will
2545
-     * automatically create the defaults for the event.  The user would then be redirected to edit the default context
2546
-     * for the event.
2547
-     *
2548
-     *
2549
-     * @param  string $messenger     the messenger we are generating templates for
2550
-     * @param array   $message_types array of message types that the templates are generated for.
2551
-     * @param int     $GRP_ID        If this is a custom template being generated then a GRP_ID needs to be included to
2552
-     *                               indicate the message_template_group being used as the base.
2553
-     *
2554
-     * @param bool    $global
2555
-     *
2556
-     * @return array|bool array of data required for the redirect to the correct edit page or bool if
2557
-     *                               encountering problems.
2558
-     * @throws \EE_Error
2559
-     */
2560
-    protected function _generate_new_templates($messenger, $message_types, $GRP_ID = 0, $global = false)
2561
-    {
2562
-        
2563
-        //if no $message_types are given then that's okay... this may be a messenger that just adds shortcodes, so we just don't generate any templates.
2564
-        if (empty($message_types)) {
2565
-            return true;
2566
-        }
2567
-        
2568
-        return EEH_MSG_Template::generate_new_templates($messenger, $message_types, $GRP_ID, $global);
2569
-    }
2570
-    
2571
-    
2572
-    /**
2573
-     * [_trash_or_restore_message_template]
2574
-     *
2575
-     * @param  boolean $trash whether to move an item to trash/restore (TRUE) or restore it (FALSE)
2576
-     * @param boolean  $all   whether this is going to trash/restore all contexts within a template group (TRUE) OR just
2577
-     *                        an individual context (FALSE).
2578
-     *
2579
-     * @return void
2580
-     */
2581
-    protected function _trash_or_restore_message_template($trash = true, $all = false)
2582
-    {
2583
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2584
-        $MTP = EEM_Message_Template_Group::instance();
2585
-        
2586
-        $success = 1;
2587
-        
2588
-        //incoming GRP_IDs
2589
-        if ($all) {
2590
-            //Checkboxes
2591
-            if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
2592
-                //if array has more than one element then success message should be plural.
2593
-                //todo: what about nonce?
2594
-                $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
2477
+			$this->_return_json();
2478
+		}
2479
+        
2480
+        
2481
+		//was a test send triggered?
2482
+		if (isset($this->_req_data['test_button'])) {
2483
+			EE_Error::overwrite_success();
2484
+			$this->_do_test_send($context_slug, $messenger_slug, $message_type_slug);
2485
+			$override = true;
2486
+		}
2487
+        
2488
+		if (empty($query_args)) {
2489
+			$query_args = array(
2490
+				'id'      => $this->_req_data['GRP_ID'],
2491
+				'context' => $context_slug,
2492
+				'action'  => 'edit_message_template'
2493
+			);
2494
+		}
2495
+        
2496
+		$this->_redirect_after_action($success, $item_desc, $action_desc, $query_args, $override);
2497
+	}
2498
+    
2499
+    
2500
+	/**
2501
+	 * processes a test send request to do an actual messenger delivery test for the given message template being tested
2502
+	 *
2503
+	 * @param  string $context      what context being tested
2504
+	 * @param  string $messenger    messenger being tested
2505
+	 * @param  string $message_type message type being tested
2506
+	 *
2507
+	 */
2508
+	protected function _do_test_send($context, $messenger, $message_type)
2509
+	{
2510
+		//set things up for preview
2511
+		$this->_req_data['messenger']    = $messenger;
2512
+		$this->_req_data['message_type'] = $message_type;
2513
+		$this->_req_data['context']      = $context;
2514
+		$this->_req_data['GRP_ID']       = isset($this->_req_data['GRP_ID']) ? $this->_req_data['GRP_ID'] : '';
2515
+		$active_messenger                = $this->_message_resource_manager->get_active_messenger($messenger);
2516
+        
2517
+		//let's save any existing fields that might be required by the messenger
2518
+		if (
2519
+			isset($this->_req_data['test_settings_fld'])
2520
+			&& $active_messenger instanceof EE_messenger
2521
+			&& apply_filters(
2522
+				'FHEE__Messages_Admin_Page__do_test_send__set_existing_test_settings',
2523
+				true,
2524
+				$this->_req_data['test_settings_fld'],
2525
+				$active_messenger
2526
+			)
2527
+		) {
2528
+			$active_messenger->set_existing_test_settings($this->_req_data['test_settings_fld']);
2529
+		}
2530
+        
2531
+		$success = $this->_preview_message(true);
2532
+        
2533
+		if ($success) {
2534
+			EE_Error::add_success(__('Test message sent', 'event_espresso'));
2535
+		} else {
2536
+			EE_Error::add_error(__('The test message was not sent', 'event_espresso'), __FILE__, __FUNCTION__,
2537
+				__LINE__);
2538
+		}
2539
+	}
2540
+    
2541
+    
2542
+	/**
2543
+	 * _generate_new_templates
2544
+	 * This will handle the messenger, message_type selection when "adding a new custom template" for an event and will
2545
+	 * automatically create the defaults for the event.  The user would then be redirected to edit the default context
2546
+	 * for the event.
2547
+	 *
2548
+	 *
2549
+	 * @param  string $messenger     the messenger we are generating templates for
2550
+	 * @param array   $message_types array of message types that the templates are generated for.
2551
+	 * @param int     $GRP_ID        If this is a custom template being generated then a GRP_ID needs to be included to
2552
+	 *                               indicate the message_template_group being used as the base.
2553
+	 *
2554
+	 * @param bool    $global
2555
+	 *
2556
+	 * @return array|bool array of data required for the redirect to the correct edit page or bool if
2557
+	 *                               encountering problems.
2558
+	 * @throws \EE_Error
2559
+	 */
2560
+	protected function _generate_new_templates($messenger, $message_types, $GRP_ID = 0, $global = false)
2561
+	{
2562
+        
2563
+		//if no $message_types are given then that's okay... this may be a messenger that just adds shortcodes, so we just don't generate any templates.
2564
+		if (empty($message_types)) {
2565
+			return true;
2566
+		}
2567
+        
2568
+		return EEH_MSG_Template::generate_new_templates($messenger, $message_types, $GRP_ID, $global);
2569
+	}
2570
+    
2571
+    
2572
+	/**
2573
+	 * [_trash_or_restore_message_template]
2574
+	 *
2575
+	 * @param  boolean $trash whether to move an item to trash/restore (TRUE) or restore it (FALSE)
2576
+	 * @param boolean  $all   whether this is going to trash/restore all contexts within a template group (TRUE) OR just
2577
+	 *                        an individual context (FALSE).
2578
+	 *
2579
+	 * @return void
2580
+	 */
2581
+	protected function _trash_or_restore_message_template($trash = true, $all = false)
2582
+	{
2583
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2584
+		$MTP = EEM_Message_Template_Group::instance();
2585
+        
2586
+		$success = 1;
2587
+        
2588
+		//incoming GRP_IDs
2589
+		if ($all) {
2590
+			//Checkboxes
2591
+			if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
2592
+				//if array has more than one element then success message should be plural.
2593
+				//todo: what about nonce?
2594
+				$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
2595 2595
                 
2596
-                //cycle through checkboxes
2597
-                while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
2598
-                    $trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
2599
-                    if ( ! $trashed_or_restored) {
2600
-                        $success = 0;
2601
-                    }
2602
-                }
2603
-            } else {
2604
-                //grab single GRP_ID and handle
2605
-                $GRP_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
2606
-                if ( ! empty($GRP_ID)) {
2607
-                    $trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
2608
-                    if ( ! $trashed_or_restored) {
2609
-                        $success = 0;
2610
-                    }
2611
-                } else {
2612
-                    $success = 0;
2613
-                }
2614
-            }
2596
+				//cycle through checkboxes
2597
+				while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
2598
+					$trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
2599
+					if ( ! $trashed_or_restored) {
2600
+						$success = 0;
2601
+					}
2602
+				}
2603
+			} else {
2604
+				//grab single GRP_ID and handle
2605
+				$GRP_ID = isset($this->_req_data['id']) ? absint($this->_req_data['id']) : 0;
2606
+				if ( ! empty($GRP_ID)) {
2607
+					$trashed_or_restored = $trash ? $MTP->delete_by_ID($GRP_ID) : $MTP->restore_by_ID($GRP_ID);
2608
+					if ( ! $trashed_or_restored) {
2609
+						$success = 0;
2610
+					}
2611
+				} else {
2612
+					$success = 0;
2613
+				}
2614
+			}
2615 2615
             
2616
-        }
2616
+		}
2617 2617
         
2618
-        $action_desc = $trash ? __('moved to the trash', 'event_espresso') : __('restored', 'event_espresso');
2618
+		$action_desc = $trash ? __('moved to the trash', 'event_espresso') : __('restored', 'event_espresso');
2619 2619
         
2620
-        $action_desc = ! empty($this->_req_data['template_switch']) ? __('switched') : $action_desc;
2620
+		$action_desc = ! empty($this->_req_data['template_switch']) ? __('switched') : $action_desc;
2621 2621
         
2622
-        $item_desc = $all ? _n('Message Template Group', 'Message Template Groups', $success,
2623
-            'event_espresso') : _n('Message Template Context', 'Message Template Contexts', $success, 'event_espresso');
2622
+		$item_desc = $all ? _n('Message Template Group', 'Message Template Groups', $success,
2623
+			'event_espresso') : _n('Message Template Context', 'Message Template Contexts', $success, 'event_espresso');
2624 2624
         
2625
-        $item_desc = ! empty($this->_req_data['template_switch']) ? _n('template', 'templates', $success,
2626
-            'event_espresso') : $item_desc;
2625
+		$item_desc = ! empty($this->_req_data['template_switch']) ? _n('template', 'templates', $success,
2626
+			'event_espresso') : $item_desc;
2627 2627
         
2628
-        $this->_redirect_after_action($success, $item_desc, $action_desc, array());
2628
+		$this->_redirect_after_action($success, $item_desc, $action_desc, array());
2629 2629
         
2630
-    }
2630
+	}
2631 2631
     
2632 2632
     
2633
-    /**
2634
-     * [_delete_message_template]
2635
-     * NOTE: this handles not only the deletion of the groups but also all the templates belonging to that group.
2636
-     * @return void
2637
-     */
2638
-    protected function _delete_message_template()
2639
-    {
2640
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2633
+	/**
2634
+	 * [_delete_message_template]
2635
+	 * NOTE: this handles not only the deletion of the groups but also all the templates belonging to that group.
2636
+	 * @return void
2637
+	 */
2638
+	protected function _delete_message_template()
2639
+	{
2640
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
2641 2641
         
2642
-        //checkboxes
2643
-        if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
2644
-            //if array has more than one element then success message should be plural
2645
-            $success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
2642
+		//checkboxes
2643
+		if ( ! empty($this->_req_data['checkbox']) && is_array($this->_req_data['checkbox'])) {
2644
+			//if array has more than one element then success message should be plural
2645
+			$success = count($this->_req_data['checkbox']) > 1 ? 2 : 1;
2646 2646
             
2647
-            //cycle through bulk action checkboxes
2648
-            while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
2649
-                $success = $this->_delete_mtp_permanently($GRP_ID);
2650
-            }
2651
-        } else {
2652
-            //grab single grp_id and delete
2653
-            $GRP_ID  = absint($this->_req_data['id']);
2654
-            $success = $this->_delete_mtp_permanently($GRP_ID);
2655
-        }
2656
-        
2657
-        $this->_redirect_after_action($success, 'Message Templates', 'deleted', array());
2658
-        
2659
-    }
2660
-    
2661
-    
2662
-    /**
2663
-     * helper for permanently deleting a mtP group and all related message_templates
2664
-     *
2665
-     * @param  int  $GRP_ID        The group being deleted
2666
-     * @param  bool $include_group whether to delete the Message Template Group as well.
2667
-     *
2668
-     * @return bool        boolean to indicate the success of the deletes or not.
2669
-     */
2670
-    private function _delete_mtp_permanently($GRP_ID, $include_group = true)
2671
-    {
2672
-        $success = 1;
2673
-        $MTPG    = EEM_Message_Template_Group::instance();
2674
-        //first let's GET this group
2675
-        $MTG = $MTPG->get_one_by_ID($GRP_ID);
2676
-        //then delete permanently all the related Message Templates
2677
-        $deleted = $MTG->delete_related_permanently('Message_Template');
2678
-        
2679
-        if ($deleted === 0) {
2680
-            $success = 0;
2681
-        }
2682
-        
2683
-        //now delete permanently this particular group
2684
-        
2685
-        if ($include_group && ! $MTG->delete_permanently()) {
2686
-            $success = 0;
2687
-        }
2688
-        
2689
-        return $success;
2690
-    }
2691
-    
2692
-    
2693
-    /**
2694
-     *    _learn_more_about_message_templates_link
2695
-     * @access protected
2696
-     * @return string
2697
-     */
2698
-    protected function _learn_more_about_message_templates_link()
2699
-    {
2700
-        return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >' . __('learn more about how message templates works',
2701
-            'event_espresso') . '</a>';
2702
-    }
2703
-    
2704
-    
2705
-    /**
2706
-     * Used for setting up messenger/message type activation.  This loads up the initial view.  The rest is handled by
2707
-     * ajax and other routes.
2708
-     * @return void
2709
-     */
2710
-    protected function _settings()
2711
-    {
2712
-        
2713
-        
2714
-        $this->_set_m_mt_settings();
2715
-        
2716
-        $selected_messenger = isset($this->_req_data['selected_messenger']) ? $this->_req_data['selected_messenger'] : 'email';
2717
-        
2718
-        //let's setup the messenger tabs
2719
-        $this->_template_args['admin_page_header']         = EEH_Tabbed_Content::tab_text_links($this->_m_mt_settings['messenger_tabs'],
2720
-            'messenger_links', '|', $selected_messenger);
2721
-        $this->_template_args['before_admin_page_content'] = '<div class="ui-widget ui-helper-clearfix">';
2722
-        $this->_template_args['after_admin_page_content']  = '</div><!-- end .ui-widget -->';
2723
-        
2724
-        $this->display_admin_page_with_sidebar();
2725
-        
2726
-    }
2727
-    
2728
-    
2729
-    /**
2730
-     * This sets the $_m_mt_settings property for when needed (used on the Messages settings page)
2731
-     *
2732
-     * @access protected
2733
-     * @return void
2734
-     */
2735
-    protected function _set_m_mt_settings()
2736
-    {
2737
-        //first if this is already set then lets get out no need to regenerate data.
2738
-        if ( ! empty($this->_m_mt_settings)) {
2739
-            return;
2740
-        }
2741
-        
2742
-        //$selected_messenger = isset( $this->_req_data['selected_messenger'] ) ? $this->_req_data['selected_messenger'] : 'email';
2743
-        
2744
-        //get all installed messengers and message_types
2745
-        /** @type EE_messenger[] $messengers */
2746
-        $messengers = $this->_message_resource_manager->installed_messengers();
2747
-        /** @type EE_message_type[] $message_types */
2748
-        $message_types = $this->_message_resource_manager->installed_message_types();
2749
-        
2750
-        
2751
-        //assemble the array for the _tab_text_links helper
2752
-        
2753
-        foreach ($messengers as $messenger) {
2754
-            $this->_m_mt_settings['messenger_tabs'][$messenger->name] = array(
2755
-                'label' => ucwords($messenger->label['singular']),
2756
-                'class' => $this->_message_resource_manager->is_messenger_active($messenger->name) ? 'messenger-active' : '',
2757
-                'href'  => $messenger->name,
2758
-                'title' => __('Modify this Messenger', 'event_espresso'),
2759
-                'slug'  => $messenger->name,
2760
-                'obj'   => $messenger
2761
-            );
2647
+			//cycle through bulk action checkboxes
2648
+			while (list($GRP_ID, $value) = each($this->_req_data['checkbox'])) {
2649
+				$success = $this->_delete_mtp_permanently($GRP_ID);
2650
+			}
2651
+		} else {
2652
+			//grab single grp_id and delete
2653
+			$GRP_ID  = absint($this->_req_data['id']);
2654
+			$success = $this->_delete_mtp_permanently($GRP_ID);
2655
+		}
2656
+        
2657
+		$this->_redirect_after_action($success, 'Message Templates', 'deleted', array());
2658
+        
2659
+	}
2660
+    
2661
+    
2662
+	/**
2663
+	 * helper for permanently deleting a mtP group and all related message_templates
2664
+	 *
2665
+	 * @param  int  $GRP_ID        The group being deleted
2666
+	 * @param  bool $include_group whether to delete the Message Template Group as well.
2667
+	 *
2668
+	 * @return bool        boolean to indicate the success of the deletes or not.
2669
+	 */
2670
+	private function _delete_mtp_permanently($GRP_ID, $include_group = true)
2671
+	{
2672
+		$success = 1;
2673
+		$MTPG    = EEM_Message_Template_Group::instance();
2674
+		//first let's GET this group
2675
+		$MTG = $MTPG->get_one_by_ID($GRP_ID);
2676
+		//then delete permanently all the related Message Templates
2677
+		$deleted = $MTG->delete_related_permanently('Message_Template');
2678
+        
2679
+		if ($deleted === 0) {
2680
+			$success = 0;
2681
+		}
2682
+        
2683
+		//now delete permanently this particular group
2684
+        
2685
+		if ($include_group && ! $MTG->delete_permanently()) {
2686
+			$success = 0;
2687
+		}
2688
+        
2689
+		return $success;
2690
+	}
2691
+    
2692
+    
2693
+	/**
2694
+	 *    _learn_more_about_message_templates_link
2695
+	 * @access protected
2696
+	 * @return string
2697
+	 */
2698
+	protected function _learn_more_about_message_templates_link()
2699
+	{
2700
+		return '<a class="hidden" style="margin:0 20px; cursor:pointer; font-size:12px;" >' . __('learn more about how message templates works',
2701
+			'event_espresso') . '</a>';
2702
+	}
2703
+    
2704
+    
2705
+	/**
2706
+	 * Used for setting up messenger/message type activation.  This loads up the initial view.  The rest is handled by
2707
+	 * ajax and other routes.
2708
+	 * @return void
2709
+	 */
2710
+	protected function _settings()
2711
+	{
2712
+        
2713
+        
2714
+		$this->_set_m_mt_settings();
2715
+        
2716
+		$selected_messenger = isset($this->_req_data['selected_messenger']) ? $this->_req_data['selected_messenger'] : 'email';
2717
+        
2718
+		//let's setup the messenger tabs
2719
+		$this->_template_args['admin_page_header']         = EEH_Tabbed_Content::tab_text_links($this->_m_mt_settings['messenger_tabs'],
2720
+			'messenger_links', '|', $selected_messenger);
2721
+		$this->_template_args['before_admin_page_content'] = '<div class="ui-widget ui-helper-clearfix">';
2722
+		$this->_template_args['after_admin_page_content']  = '</div><!-- end .ui-widget -->';
2723
+        
2724
+		$this->display_admin_page_with_sidebar();
2725
+        
2726
+	}
2727
+    
2728
+    
2729
+	/**
2730
+	 * This sets the $_m_mt_settings property for when needed (used on the Messages settings page)
2731
+	 *
2732
+	 * @access protected
2733
+	 * @return void
2734
+	 */
2735
+	protected function _set_m_mt_settings()
2736
+	{
2737
+		//first if this is already set then lets get out no need to regenerate data.
2738
+		if ( ! empty($this->_m_mt_settings)) {
2739
+			return;
2740
+		}
2741
+        
2742
+		//$selected_messenger = isset( $this->_req_data['selected_messenger'] ) ? $this->_req_data['selected_messenger'] : 'email';
2743
+        
2744
+		//get all installed messengers and message_types
2745
+		/** @type EE_messenger[] $messengers */
2746
+		$messengers = $this->_message_resource_manager->installed_messengers();
2747
+		/** @type EE_message_type[] $message_types */
2748
+		$message_types = $this->_message_resource_manager->installed_message_types();
2749
+        
2750
+        
2751
+		//assemble the array for the _tab_text_links helper
2752
+        
2753
+		foreach ($messengers as $messenger) {
2754
+			$this->_m_mt_settings['messenger_tabs'][$messenger->name] = array(
2755
+				'label' => ucwords($messenger->label['singular']),
2756
+				'class' => $this->_message_resource_manager->is_messenger_active($messenger->name) ? 'messenger-active' : '',
2757
+				'href'  => $messenger->name,
2758
+				'title' => __('Modify this Messenger', 'event_espresso'),
2759
+				'slug'  => $messenger->name,
2760
+				'obj'   => $messenger
2761
+			);
2762 2762
             
2763 2763
             
2764
-            $message_types_for_messenger = $messenger->get_valid_message_types();
2764
+			$message_types_for_messenger = $messenger->get_valid_message_types();
2765 2765
             
2766
-            foreach ($message_types as $message_type) {
2767
-                //first we need to verify that this message type is valid with this messenger. Cause if it isn't then it shouldn't show in either the inactive OR active metabox.
2768
-                if ( ! in_array($message_type->name, $message_types_for_messenger)) {
2769
-                    continue;
2770
-                }
2766
+			foreach ($message_types as $message_type) {
2767
+				//first we need to verify that this message type is valid with this messenger. Cause if it isn't then it shouldn't show in either the inactive OR active metabox.
2768
+				if ( ! in_array($message_type->name, $message_types_for_messenger)) {
2769
+					continue;
2770
+				}
2771 2771
                 
2772
-                $a_or_i = $this->_message_resource_manager->is_message_type_active_for_messenger($messenger->name,
2773
-                    $message_type->name) ? 'active' : 'inactive';
2772
+				$a_or_i = $this->_message_resource_manager->is_message_type_active_for_messenger($messenger->name,
2773
+					$message_type->name) ? 'active' : 'inactive';
2774 2774
                 
2775
-                $this->_m_mt_settings['message_type_tabs'][$messenger->name][$a_or_i][$message_type->name] = array(
2776
-                    'label'    => ucwords($message_type->label['singular']),
2777
-                    'class'    => 'message-type-' . $a_or_i,
2778
-                    'slug_id'  => $message_type->name . '-messagetype-' . $messenger->name,
2779
-                    'mt_nonce' => wp_create_nonce($message_type->name . '_nonce'),
2780
-                    'href'     => 'espresso_' . $message_type->name . '_message_type_settings',
2781
-                    'title'    => $a_or_i == 'active'
2782
-                        ? __('Drag this message type to the Inactive window to deactivate', 'event_espresso')
2783
-                        : __('Drag this message type to the messenger to activate', 'event_espresso'),
2784
-                    'content'  => $a_or_i == 'active'
2785
-                        ? $this->_message_type_settings_content($message_type, $messenger, true)
2786
-                        : $this->_message_type_settings_content($message_type, $messenger),
2787
-                    'slug'     => $message_type->name,
2788
-                    'active'   => $a_or_i == 'active' ? true : false,
2789
-                    'obj'      => $message_type
2790
-                );
2791
-            }
2792
-        }
2793
-    }
2794
-    
2795
-    
2796
-    /**
2797
-     * This just prepares the content for the message type settings
2798
-     *
2799
-     * @param  object  $message_type The message type object
2800
-     * @param  object  $messenger    The messenger object
2801
-     * @param  boolean $active       Whether the message type is active or not
2802
-     *
2803
-     * @return string                html output for the content
2804
-     */
2805
-    protected function _message_type_settings_content($message_type, $messenger, $active = false)
2806
-    {
2807
-        //get message type fields
2808
-        $fields                                         = $message_type->get_admin_settings_fields();
2809
-        $settings_template_args['template_form_fields'] = '';
2810
-        
2811
-        if ( ! empty($fields) && $active) {
2775
+				$this->_m_mt_settings['message_type_tabs'][$messenger->name][$a_or_i][$message_type->name] = array(
2776
+					'label'    => ucwords($message_type->label['singular']),
2777
+					'class'    => 'message-type-' . $a_or_i,
2778
+					'slug_id'  => $message_type->name . '-messagetype-' . $messenger->name,
2779
+					'mt_nonce' => wp_create_nonce($message_type->name . '_nonce'),
2780
+					'href'     => 'espresso_' . $message_type->name . '_message_type_settings',
2781
+					'title'    => $a_or_i == 'active'
2782
+						? __('Drag this message type to the Inactive window to deactivate', 'event_espresso')
2783
+						: __('Drag this message type to the messenger to activate', 'event_espresso'),
2784
+					'content'  => $a_or_i == 'active'
2785
+						? $this->_message_type_settings_content($message_type, $messenger, true)
2786
+						: $this->_message_type_settings_content($message_type, $messenger),
2787
+					'slug'     => $message_type->name,
2788
+					'active'   => $a_or_i == 'active' ? true : false,
2789
+					'obj'      => $message_type
2790
+				);
2791
+			}
2792
+		}
2793
+	}
2794
+    
2795
+    
2796
+	/**
2797
+	 * This just prepares the content for the message type settings
2798
+	 *
2799
+	 * @param  object  $message_type The message type object
2800
+	 * @param  object  $messenger    The messenger object
2801
+	 * @param  boolean $active       Whether the message type is active or not
2802
+	 *
2803
+	 * @return string                html output for the content
2804
+	 */
2805
+	protected function _message_type_settings_content($message_type, $messenger, $active = false)
2806
+	{
2807
+		//get message type fields
2808
+		$fields                                         = $message_type->get_admin_settings_fields();
2809
+		$settings_template_args['template_form_fields'] = '';
2810
+        
2811
+		if ( ! empty($fields) && $active) {
2812 2812
             
2813
-            $existing_settings = $message_type->get_existing_admin_settings($messenger->name);
2813
+			$existing_settings = $message_type->get_existing_admin_settings($messenger->name);
2814 2814
             
2815
-            foreach ($fields as $fldname => $fldprops) {
2816
-                $field_id                       = $messenger->name . '-' . $message_type->name . '-' . $fldname;
2817
-                $template_form_field[$field_id] = array(
2818
-                    'name'       => 'message_type_settings[' . $fldname . ']',
2819
-                    'label'      => $fldprops['label'],
2820
-                    'input'      => $fldprops['field_type'],
2821
-                    'type'       => $fldprops['value_type'],
2822
-                    'required'   => $fldprops['required'],
2823
-                    'validation' => $fldprops['validation'],
2824
-                    'value'      => isset($existing_settings[$fldname]) ? $existing_settings[$fldname] : $fldprops['default'],
2825
-                    'options'    => isset($fldprops['options']) ? $fldprops['options'] : array(),
2826
-                    'default'    => isset($existing_settings[$fldname]) ? $existing_settings[$fldname] : $fldprops['default'],
2827
-                    'css_class'  => 'no-drag',
2828
-                    'format'     => $fldprops['format']
2829
-                );
2830
-            }
2815
+			foreach ($fields as $fldname => $fldprops) {
2816
+				$field_id                       = $messenger->name . '-' . $message_type->name . '-' . $fldname;
2817
+				$template_form_field[$field_id] = array(
2818
+					'name'       => 'message_type_settings[' . $fldname . ']',
2819
+					'label'      => $fldprops['label'],
2820
+					'input'      => $fldprops['field_type'],
2821
+					'type'       => $fldprops['value_type'],
2822
+					'required'   => $fldprops['required'],
2823
+					'validation' => $fldprops['validation'],
2824
+					'value'      => isset($existing_settings[$fldname]) ? $existing_settings[$fldname] : $fldprops['default'],
2825
+					'options'    => isset($fldprops['options']) ? $fldprops['options'] : array(),
2826
+					'default'    => isset($existing_settings[$fldname]) ? $existing_settings[$fldname] : $fldprops['default'],
2827
+					'css_class'  => 'no-drag',
2828
+					'format'     => $fldprops['format']
2829
+				);
2830
+			}
2831 2831
             
2832 2832
             
2833
-            $settings_template_args['template_form_fields'] = ! empty($template_form_field) ? $this->_generate_admin_form_fields($template_form_field,
2834
-                'string', 'ee_mt_activate_form') : '';
2835
-        }
2836
-        
2837
-        $settings_template_args['description'] = $message_type->description;
2838
-        //we also need some hidden fields
2839
-        $settings_template_args['hidden_fields'] = array(
2840
-            'message_type_settings[messenger]'    => array(
2841
-                'type'  => 'hidden',
2842
-                'value' => $messenger->name
2843
-            ),
2844
-            'message_type_settings[message_type]' => array(
2845
-                'type'  => 'hidden',
2846
-                'value' => $message_type->name
2847
-            ),
2848
-            'type'                                => array(
2849
-                'type'  => 'hidden',
2850
-                'value' => 'message_type'
2851
-            )
2852
-        );
2853
-        
2854
-        $settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields($settings_template_args['hidden_fields'],
2855
-            'array');
2856
-        $settings_template_args['show_form']     = empty($settings_template_args['template_form_fields']) ? ' hidden' : '';
2857
-        
2858
-        
2859
-        $template = EE_MSG_TEMPLATE_PATH . 'ee_msg_mt_settings_content.template.php';
2860
-        $content  = EEH_Template::display_template($template, $settings_template_args, true);
2861
-        
2862
-        return $content;
2863
-    }
2864
-    
2865
-    
2866
-    /**
2867
-     * Generate all the metaboxes for the message types and register them for the messages settings page.
2868
-     *
2869
-     * @access protected
2870
-     * @return void
2871
-     */
2872
-    protected function _messages_settings_metaboxes()
2873
-    {
2874
-        $this->_set_m_mt_settings();
2875
-        $m_boxes         = $mt_boxes = array();
2876
-        $m_template_args = $mt_template_args = array();
2877
-        
2878
-        $selected_messenger = isset($this->_req_data['selected_messenger']) ? $this->_req_data['selected_messenger'] : 'email';
2879
-        
2880
-        if (isset($this->_m_mt_settings['messenger_tabs'])) {
2881
-            foreach ($this->_m_mt_settings['messenger_tabs'] as $messenger => $tab_array) {
2882
-                $hide_on_message  = $this->_message_resource_manager->is_messenger_active($messenger) ? '' : 'hidden';
2883
-                $hide_off_message = $this->_message_resource_manager->is_messenger_active($messenger) ? 'hidden' : '';
2884
-                //messenger meta boxes
2885
-                $active                                 = $selected_messenger == $messenger ? true : false;
2886
-                $active_mt_tabs                         = isset($this->_m_mt_settings['message_type_tabs'][$messenger]['active'])
2887
-                    ? $this->_m_mt_settings['message_type_tabs'][$messenger]['active']
2888
-                    : '';
2889
-                $m_boxes[$messenger . '_a_box']         = sprintf(
2890
-                    __('%s Settings', 'event_espresso'),
2891
-                    $tab_array['label']
2892
-                );
2893
-                $m_template_args[$messenger . '_a_box'] = array(
2894
-                    'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
2895
-                    'inactive_message_types' => isset($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
2896
-                        ? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
2897
-                        : '',
2898
-                    'content'                => $this->_get_messenger_box_content($tab_array['obj']),
2899
-                    'hidden'                 => $active ? '' : ' hidden',
2900
-                    'hide_on_message'        => $hide_on_message,
2901
-                    'messenger'              => $messenger,
2902
-                    'active'                 => $active
2903
-                );
2904
-                // message type meta boxes
2905
-                // (which is really just the inactive container for each messenger
2906
-                // showing inactive message types for that messenger)
2907
-                $mt_boxes[$messenger . '_i_box']         = __('Inactive Message Types', 'event_espresso');
2908
-                $mt_template_args[$messenger . '_i_box'] = array(
2909
-                    'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
2910
-                    'inactive_message_types' => isset($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
2911
-                        ? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
2912
-                        : '',
2913
-                    'hidden'                 => $active ? '' : ' hidden',
2914
-                    'hide_on_message'        => $hide_on_message,
2915
-                    'hide_off_message'       => $hide_off_message,
2916
-                    'messenger'              => $messenger,
2917
-                    'active'                 => $active
2918
-                );
2919
-            }
2920
-        }
2921
-        
2922
-        
2923
-        //register messenger metaboxes
2924
-        $m_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_mt_meta_box.template.php';
2925
-        foreach ($m_boxes as $box => $label) {
2926
-            $callback_args = array('template_path' => $m_template_path, 'template_args' => $m_template_args[$box]);
2927
-            $msgr          = str_replace('_a_box', '', $box);
2928
-            add_meta_box(
2929
-                'espresso_' . $msgr . '_settings',
2930
-                $label,
2931
-                function ($post, $metabox) {
2932
-                    echo EEH_Template::display_template($metabox["args"]["template_path"],
2933
-                        $metabox["args"]["template_args"], true);
2934
-                },
2935
-                $this->_current_screen->id,
2936
-                'normal',
2937
-                'high',
2938
-                $callback_args
2939
-            );
2940
-        }
2941
-        
2942
-        //register message type metaboxes
2943
-        $mt_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_meta_box.template.php';
2944
-        foreach ($mt_boxes as $box => $label) {
2945
-            $callback_args = array(
2946
-                'template_path' => $mt_template_path,
2947
-                'template_args' => $mt_template_args[$box]
2948
-            );
2949
-            $mt            = str_replace('_i_box', '', $box);
2950
-            add_meta_box(
2951
-                'espresso_' . $mt . '_inactive_mts',
2952
-                $label,
2953
-                function ($post, $metabox) {
2954
-                    echo EEH_Template::display_template($metabox["args"]["template_path"],
2955
-                        $metabox["args"]["template_args"], true);
2956
-                },
2957
-                $this->_current_screen->id,
2958
-                'side',
2959
-                'high',
2960
-                $callback_args
2961
-            );
2962
-        }
2963
-        
2964
-        //register metabox for global messages settings but only when on the main site.  On single site installs this will
2965
-        //always result in the metabox showing, on multisite installs the metabox will only show on the main site.
2966
-        if (is_main_site()) {
2967
-            add_meta_box(
2968
-                'espresso_global_message_settings',
2969
-                __('Global Message Settings', 'event_espresso'),
2970
-                array($this, 'global_messages_settings_metabox_content'),
2971
-                $this->_current_screen->id,
2972
-                'normal',
2973
-                'low',
2974
-                array()
2975
-            );
2976
-        }
2977
-        
2978
-    }
2979
-    
2980
-    
2981
-    /**
2982
-     *  This generates the content for the global messages settings metabox.
2983
-     * @return string
2984
-     */
2985
-    public function global_messages_settings_metabox_content()
2986
-    {
2987
-        $form = $this->_generate_global_settings_form();
2988
-        echo $form->form_open(
2989
-                $this->add_query_args_and_nonce(array('action' => 'update_global_settings'), EE_MSG_ADMIN_URL),
2990
-                'POST'
2991
-            )
2992
-             . $form->get_html()
2993
-             . $form->form_close();
2994
-    }
2995
-    
2996
-    
2997
-    /**
2998
-     * This generates and returns the form object for the global messages settings.
2999
-     * @return EE_Form_Section_Proper
3000
-     */
3001
-    protected function _generate_global_settings_form()
3002
-    {
3003
-        EE_Registry::instance()->load_helper('HTML');
3004
-        /** @var EE_Network_Core_Config $network_config */
3005
-        $network_config = EE_Registry::instance()->NET_CFG->core;
3006
-        
3007
-        return new EE_Form_Section_Proper(
3008
-            array(
3009
-                'name'            => 'global_messages_settings',
3010
-                'html_id'         => 'global_messages_settings',
3011
-                'html_class'      => 'form-table',
3012
-                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
3013
-                'subsections'     => apply_filters(
3014
-                    'FHEE__Messages_Admin_Page__global_messages_settings_metabox_content__form_subsections',
3015
-                    array(
3016
-                        'do_messages_on_same_request' => new EE_Select_Input(
3017
-                            array(
3018
-                                true  => esc_html__("On the same request", "event_espresso"),
3019
-                                false => esc_html__("On a separate request", "event_espresso")
3020
-                            ),
3021
-                            array(
3022
-                                'default'         => $network_config->do_messages_on_same_request,
3023
-                                'html_label_text' => esc_html__('Generate and send all messages:', 'event_espresso'),
3024
-                                'html_help_text'  => esc_html__('By default the messages system uses a more efficient means of processing messages on separate requests and utilizes the wp-cron scheduling system.  This makes things execute faster for people registering for your events.  However, if the wp-cron system is disabled on your site and there is no alternative in place, then you can change this so messages are always executed on the same request.',
3025
-                                    'event_espresso'),
3026
-                            )
3027
-                        ),
3028
-                        'delete_threshold' => new EE_Select_Input(
3029
-                            array(
3030
-                                0 => esc_html__('Forever', 'event_espresso'),
3031
-                                3 => esc_html__('3 Months', 'event_espresso'),
3032
-                                6 => esc_html__('6 Months', 'event_espresso'),
3033
-                                9 => esc_html__('9 Months', 'event_espresso'),
3034
-                                12 => esc_html__('12 Months', 'event_espresso'),
3035
-                                24 => esc_html__('24 Months', 'event_espresso'),
3036
-                                36 => esc_html__('36 Months', 'event_espresso')
3037
-                            ),
3038
-                            array(
3039
-                                'default' => EE_Registry::instance()->CFG->messages->delete_threshold,
3040
-                                'html_label_text' => esc_html__('Cleanup of old messages:', 'event_espresso'),
3041
-                                'html_help_text' => esc_html__('You can control how long a record of processed messages is kept 
2833
+			$settings_template_args['template_form_fields'] = ! empty($template_form_field) ? $this->_generate_admin_form_fields($template_form_field,
2834
+				'string', 'ee_mt_activate_form') : '';
2835
+		}
2836
+        
2837
+		$settings_template_args['description'] = $message_type->description;
2838
+		//we also need some hidden fields
2839
+		$settings_template_args['hidden_fields'] = array(
2840
+			'message_type_settings[messenger]'    => array(
2841
+				'type'  => 'hidden',
2842
+				'value' => $messenger->name
2843
+			),
2844
+			'message_type_settings[message_type]' => array(
2845
+				'type'  => 'hidden',
2846
+				'value' => $message_type->name
2847
+			),
2848
+			'type'                                => array(
2849
+				'type'  => 'hidden',
2850
+				'value' => 'message_type'
2851
+			)
2852
+		);
2853
+        
2854
+		$settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields($settings_template_args['hidden_fields'],
2855
+			'array');
2856
+		$settings_template_args['show_form']     = empty($settings_template_args['template_form_fields']) ? ' hidden' : '';
2857
+        
2858
+        
2859
+		$template = EE_MSG_TEMPLATE_PATH . 'ee_msg_mt_settings_content.template.php';
2860
+		$content  = EEH_Template::display_template($template, $settings_template_args, true);
2861
+        
2862
+		return $content;
2863
+	}
2864
+    
2865
+    
2866
+	/**
2867
+	 * Generate all the metaboxes for the message types and register them for the messages settings page.
2868
+	 *
2869
+	 * @access protected
2870
+	 * @return void
2871
+	 */
2872
+	protected function _messages_settings_metaboxes()
2873
+	{
2874
+		$this->_set_m_mt_settings();
2875
+		$m_boxes         = $mt_boxes = array();
2876
+		$m_template_args = $mt_template_args = array();
2877
+        
2878
+		$selected_messenger = isset($this->_req_data['selected_messenger']) ? $this->_req_data['selected_messenger'] : 'email';
2879
+        
2880
+		if (isset($this->_m_mt_settings['messenger_tabs'])) {
2881
+			foreach ($this->_m_mt_settings['messenger_tabs'] as $messenger => $tab_array) {
2882
+				$hide_on_message  = $this->_message_resource_manager->is_messenger_active($messenger) ? '' : 'hidden';
2883
+				$hide_off_message = $this->_message_resource_manager->is_messenger_active($messenger) ? 'hidden' : '';
2884
+				//messenger meta boxes
2885
+				$active                                 = $selected_messenger == $messenger ? true : false;
2886
+				$active_mt_tabs                         = isset($this->_m_mt_settings['message_type_tabs'][$messenger]['active'])
2887
+					? $this->_m_mt_settings['message_type_tabs'][$messenger]['active']
2888
+					: '';
2889
+				$m_boxes[$messenger . '_a_box']         = sprintf(
2890
+					__('%s Settings', 'event_espresso'),
2891
+					$tab_array['label']
2892
+				);
2893
+				$m_template_args[$messenger . '_a_box'] = array(
2894
+					'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
2895
+					'inactive_message_types' => isset($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
2896
+						? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
2897
+						: '',
2898
+					'content'                => $this->_get_messenger_box_content($tab_array['obj']),
2899
+					'hidden'                 => $active ? '' : ' hidden',
2900
+					'hide_on_message'        => $hide_on_message,
2901
+					'messenger'              => $messenger,
2902
+					'active'                 => $active
2903
+				);
2904
+				// message type meta boxes
2905
+				// (which is really just the inactive container for each messenger
2906
+				// showing inactive message types for that messenger)
2907
+				$mt_boxes[$messenger . '_i_box']         = __('Inactive Message Types', 'event_espresso');
2908
+				$mt_template_args[$messenger . '_i_box'] = array(
2909
+					'active_message_types'   => ! empty($active_mt_tabs) ? $this->_get_mt_tabs($active_mt_tabs) : '',
2910
+					'inactive_message_types' => isset($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
2911
+						? $this->_get_mt_tabs($this->_m_mt_settings['message_type_tabs'][$messenger]['inactive'])
2912
+						: '',
2913
+					'hidden'                 => $active ? '' : ' hidden',
2914
+					'hide_on_message'        => $hide_on_message,
2915
+					'hide_off_message'       => $hide_off_message,
2916
+					'messenger'              => $messenger,
2917
+					'active'                 => $active
2918
+				);
2919
+			}
2920
+		}
2921
+        
2922
+        
2923
+		//register messenger metaboxes
2924
+		$m_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_mt_meta_box.template.php';
2925
+		foreach ($m_boxes as $box => $label) {
2926
+			$callback_args = array('template_path' => $m_template_path, 'template_args' => $m_template_args[$box]);
2927
+			$msgr          = str_replace('_a_box', '', $box);
2928
+			add_meta_box(
2929
+				'espresso_' . $msgr . '_settings',
2930
+				$label,
2931
+				function ($post, $metabox) {
2932
+					echo EEH_Template::display_template($metabox["args"]["template_path"],
2933
+						$metabox["args"]["template_args"], true);
2934
+				},
2935
+				$this->_current_screen->id,
2936
+				'normal',
2937
+				'high',
2938
+				$callback_args
2939
+			);
2940
+		}
2941
+        
2942
+		//register message type metaboxes
2943
+		$mt_template_path = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_messenger_meta_box.template.php';
2944
+		foreach ($mt_boxes as $box => $label) {
2945
+			$callback_args = array(
2946
+				'template_path' => $mt_template_path,
2947
+				'template_args' => $mt_template_args[$box]
2948
+			);
2949
+			$mt            = str_replace('_i_box', '', $box);
2950
+			add_meta_box(
2951
+				'espresso_' . $mt . '_inactive_mts',
2952
+				$label,
2953
+				function ($post, $metabox) {
2954
+					echo EEH_Template::display_template($metabox["args"]["template_path"],
2955
+						$metabox["args"]["template_args"], true);
2956
+				},
2957
+				$this->_current_screen->id,
2958
+				'side',
2959
+				'high',
2960
+				$callback_args
2961
+			);
2962
+		}
2963
+        
2964
+		//register metabox for global messages settings but only when on the main site.  On single site installs this will
2965
+		//always result in the metabox showing, on multisite installs the metabox will only show on the main site.
2966
+		if (is_main_site()) {
2967
+			add_meta_box(
2968
+				'espresso_global_message_settings',
2969
+				__('Global Message Settings', 'event_espresso'),
2970
+				array($this, 'global_messages_settings_metabox_content'),
2971
+				$this->_current_screen->id,
2972
+				'normal',
2973
+				'low',
2974
+				array()
2975
+			);
2976
+		}
2977
+        
2978
+	}
2979
+    
2980
+    
2981
+	/**
2982
+	 *  This generates the content for the global messages settings metabox.
2983
+	 * @return string
2984
+	 */
2985
+	public function global_messages_settings_metabox_content()
2986
+	{
2987
+		$form = $this->_generate_global_settings_form();
2988
+		echo $form->form_open(
2989
+				$this->add_query_args_and_nonce(array('action' => 'update_global_settings'), EE_MSG_ADMIN_URL),
2990
+				'POST'
2991
+			)
2992
+			 . $form->get_html()
2993
+			 . $form->form_close();
2994
+	}
2995
+    
2996
+    
2997
+	/**
2998
+	 * This generates and returns the form object for the global messages settings.
2999
+	 * @return EE_Form_Section_Proper
3000
+	 */
3001
+	protected function _generate_global_settings_form()
3002
+	{
3003
+		EE_Registry::instance()->load_helper('HTML');
3004
+		/** @var EE_Network_Core_Config $network_config */
3005
+		$network_config = EE_Registry::instance()->NET_CFG->core;
3006
+        
3007
+		return new EE_Form_Section_Proper(
3008
+			array(
3009
+				'name'            => 'global_messages_settings',
3010
+				'html_id'         => 'global_messages_settings',
3011
+				'html_class'      => 'form-table',
3012
+				'layout_strategy' => new EE_Admin_Two_Column_Layout(),
3013
+				'subsections'     => apply_filters(
3014
+					'FHEE__Messages_Admin_Page__global_messages_settings_metabox_content__form_subsections',
3015
+					array(
3016
+						'do_messages_on_same_request' => new EE_Select_Input(
3017
+							array(
3018
+								true  => esc_html__("On the same request", "event_espresso"),
3019
+								false => esc_html__("On a separate request", "event_espresso")
3020
+							),
3021
+							array(
3022
+								'default'         => $network_config->do_messages_on_same_request,
3023
+								'html_label_text' => esc_html__('Generate and send all messages:', 'event_espresso'),
3024
+								'html_help_text'  => esc_html__('By default the messages system uses a more efficient means of processing messages on separate requests and utilizes the wp-cron scheduling system.  This makes things execute faster for people registering for your events.  However, if the wp-cron system is disabled on your site and there is no alternative in place, then you can change this so messages are always executed on the same request.',
3025
+									'event_espresso'),
3026
+							)
3027
+						),
3028
+						'delete_threshold' => new EE_Select_Input(
3029
+							array(
3030
+								0 => esc_html__('Forever', 'event_espresso'),
3031
+								3 => esc_html__('3 Months', 'event_espresso'),
3032
+								6 => esc_html__('6 Months', 'event_espresso'),
3033
+								9 => esc_html__('9 Months', 'event_espresso'),
3034
+								12 => esc_html__('12 Months', 'event_espresso'),
3035
+								24 => esc_html__('24 Months', 'event_espresso'),
3036
+								36 => esc_html__('36 Months', 'event_espresso')
3037
+							),
3038
+							array(
3039
+								'default' => EE_Registry::instance()->CFG->messages->delete_threshold,
3040
+								'html_label_text' => esc_html__('Cleanup of old messages:', 'event_espresso'),
3041
+								'html_help_text' => esc_html__('You can control how long a record of processed messages is kept 
3042 3042
                                                     via this option.', 'event_espresso'),
3043
-                            )
3044
-                        ),
3045
-                        'update_settings'             => new EE_Submit_Input(
3046
-                            array(
3047
-                                'default'         => esc_html__('Update', 'event_espresso'),
3048
-                                'html_label_text' => '&nbsp'
3049
-                            )
3050
-                        )
3051
-                    )
3052
-                )
3053
-            )
3054
-        );
3055
-    }
3056
-    
3057
-    
3058
-    /**
3059
-     * This handles updating the global settings set on the admin page.
3060
-     * @throws \EE_Error
3061
-     */
3062
-    protected function _update_global_settings()
3063
-    {
3064
-        /** @var EE_Network_Core_Config $network_config */
3065
-        $network_config = EE_Registry::instance()->NET_CFG->core;
3066
-        $messages_config = EE_Registry::instance()->CFG->messages;
3067
-        $form           = $this->_generate_global_settings_form();
3068
-        if ($form->was_submitted()) {
3069
-            $form->receive_form_submission();
3070
-            if ($form->is_valid()) {
3071
-                $valid_data = $form->valid_data();
3072
-                foreach ($valid_data as $property => $value) {
3073
-                    $setter = 'set_' . $property;
3074
-                    if (method_exists($network_config, $setter)) {
3075
-                        $network_config->{$setter}($value);
3076
-                    } else if (
3077
-                        property_exists($network_config, $property)
3078
-                        && $network_config->{$property} !== $value
3079
-                    ) {
3080
-                        $network_config->{$property} = $value;
3081
-                    } else if (
3082
-                        property_exists($messages_config, $property)
3083
-                        && $messages_config->{$property} !== $value
3084
-                    ) {
3085
-                        $messages_config->{$property} = $value;
3086
-                    }
3087
-                }
3088
-                //only update if the form submission was valid!
3089
-                EE_Registry::instance()->NET_CFG->update_config(true, false);
3090
-                EE_Registry::instance()->CFG->update_espresso_config();
3091
-                EE_Error::overwrite_success();
3092
-                EE_Error::add_success(__('Global message settings were updated', 'event_espresso'));
3093
-            }
3094
-        }
3095
-        $this->_redirect_after_action(0, '', '', array('action' => 'settings'), true);
3096
-    }
3097
-    
3098
-    
3099
-    /**
3100
-     * this prepares the messenger tabs that can be dragged in and out of messenger boxes to activate/deactivate
3101
-     *
3102
-     * @param  array $tab_array This is an array of message type tab details used to generate the tabs
3103
-     *
3104
-     * @return string            html formatted tabs
3105
-     */
3106
-    protected function _get_mt_tabs($tab_array)
3107
-    {
3108
-        $tab_array = (array)$tab_array;
3109
-        $template  = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_mt_settings_tab_item.template.php';
3110
-        $tabs      = '';
3111
-        
3112
-        foreach ($tab_array as $tab) {
3113
-            $tabs .= EEH_Template::display_template($template, $tab, true);
3114
-        }
3115
-        
3116
-        return $tabs;
3117
-    }
3118
-    
3119
-    
3120
-    /**
3121
-     * This prepares the content of the messenger meta box admin settings
3122
-     *
3123
-     * @param  EE_messenger $messenger The messenger we're setting up content for
3124
-     *
3125
-     * @return string            html formatted content
3126
-     */
3127
-    protected function _get_messenger_box_content(EE_messenger $messenger)
3128
-    {
3129
-        
3130
-        $fields                                         = $messenger->get_admin_settings_fields();
3131
-        $settings_template_args['template_form_fields'] = '';
3132
-        
3133
-        //is $messenger active?
3134
-        $settings_template_args['active'] = $this->_message_resource_manager->is_messenger_active($messenger->name);
3135
-        
3136
-        
3137
-        if ( ! empty($fields)) {
3043
+							)
3044
+						),
3045
+						'update_settings'             => new EE_Submit_Input(
3046
+							array(
3047
+								'default'         => esc_html__('Update', 'event_espresso'),
3048
+								'html_label_text' => '&nbsp'
3049
+							)
3050
+						)
3051
+					)
3052
+				)
3053
+			)
3054
+		);
3055
+	}
3056
+    
3057
+    
3058
+	/**
3059
+	 * This handles updating the global settings set on the admin page.
3060
+	 * @throws \EE_Error
3061
+	 */
3062
+	protected function _update_global_settings()
3063
+	{
3064
+		/** @var EE_Network_Core_Config $network_config */
3065
+		$network_config = EE_Registry::instance()->NET_CFG->core;
3066
+		$messages_config = EE_Registry::instance()->CFG->messages;
3067
+		$form           = $this->_generate_global_settings_form();
3068
+		if ($form->was_submitted()) {
3069
+			$form->receive_form_submission();
3070
+			if ($form->is_valid()) {
3071
+				$valid_data = $form->valid_data();
3072
+				foreach ($valid_data as $property => $value) {
3073
+					$setter = 'set_' . $property;
3074
+					if (method_exists($network_config, $setter)) {
3075
+						$network_config->{$setter}($value);
3076
+					} else if (
3077
+						property_exists($network_config, $property)
3078
+						&& $network_config->{$property} !== $value
3079
+					) {
3080
+						$network_config->{$property} = $value;
3081
+					} else if (
3082
+						property_exists($messages_config, $property)
3083
+						&& $messages_config->{$property} !== $value
3084
+					) {
3085
+						$messages_config->{$property} = $value;
3086
+					}
3087
+				}
3088
+				//only update if the form submission was valid!
3089
+				EE_Registry::instance()->NET_CFG->update_config(true, false);
3090
+				EE_Registry::instance()->CFG->update_espresso_config();
3091
+				EE_Error::overwrite_success();
3092
+				EE_Error::add_success(__('Global message settings were updated', 'event_espresso'));
3093
+			}
3094
+		}
3095
+		$this->_redirect_after_action(0, '', '', array('action' => 'settings'), true);
3096
+	}
3097
+    
3098
+    
3099
+	/**
3100
+	 * this prepares the messenger tabs that can be dragged in and out of messenger boxes to activate/deactivate
3101
+	 *
3102
+	 * @param  array $tab_array This is an array of message type tab details used to generate the tabs
3103
+	 *
3104
+	 * @return string            html formatted tabs
3105
+	 */
3106
+	protected function _get_mt_tabs($tab_array)
3107
+	{
3108
+		$tab_array = (array)$tab_array;
3109
+		$template  = EE_MSG_TEMPLATE_PATH . 'ee_msg_details_mt_settings_tab_item.template.php';
3110
+		$tabs      = '';
3111
+        
3112
+		foreach ($tab_array as $tab) {
3113
+			$tabs .= EEH_Template::display_template($template, $tab, true);
3114
+		}
3115
+        
3116
+		return $tabs;
3117
+	}
3118
+    
3119
+    
3120
+	/**
3121
+	 * This prepares the content of the messenger meta box admin settings
3122
+	 *
3123
+	 * @param  EE_messenger $messenger The messenger we're setting up content for
3124
+	 *
3125
+	 * @return string            html formatted content
3126
+	 */
3127
+	protected function _get_messenger_box_content(EE_messenger $messenger)
3128
+	{
3129
+        
3130
+		$fields                                         = $messenger->get_admin_settings_fields();
3131
+		$settings_template_args['template_form_fields'] = '';
3132
+        
3133
+		//is $messenger active?
3134
+		$settings_template_args['active'] = $this->_message_resource_manager->is_messenger_active($messenger->name);
3135
+        
3136
+        
3137
+		if ( ! empty($fields)) {
3138 3138
             
3139
-            $existing_settings = $messenger->get_existing_admin_settings();
3139
+			$existing_settings = $messenger->get_existing_admin_settings();
3140 3140
             
3141
-            foreach ($fields as $fldname => $fldprops) {
3142
-                $field_id                       = $messenger->name . '-' . $fldname;
3143
-                $template_form_field[$field_id] = array(
3144
-                    'name'       => 'messenger_settings[' . $field_id . ']',
3145
-                    'label'      => $fldprops['label'],
3146
-                    'input'      => $fldprops['field_type'],
3147
-                    'type'       => $fldprops['value_type'],
3148
-                    'required'   => $fldprops['required'],
3149
-                    'validation' => $fldprops['validation'],
3150
-                    'value'      => isset($existing_settings[$field_id])
3151
-                        ? $existing_settings[$field_id]
3152
-                        : $fldprops['default'],
3153
-                    'css_class'  => '',
3154
-                    'format'     => $fldprops['format']
3155
-                );
3156
-            }
3141
+			foreach ($fields as $fldname => $fldprops) {
3142
+				$field_id                       = $messenger->name . '-' . $fldname;
3143
+				$template_form_field[$field_id] = array(
3144
+					'name'       => 'messenger_settings[' . $field_id . ']',
3145
+					'label'      => $fldprops['label'],
3146
+					'input'      => $fldprops['field_type'],
3147
+					'type'       => $fldprops['value_type'],
3148
+					'required'   => $fldprops['required'],
3149
+					'validation' => $fldprops['validation'],
3150
+					'value'      => isset($existing_settings[$field_id])
3151
+						? $existing_settings[$field_id]
3152
+						: $fldprops['default'],
3153
+					'css_class'  => '',
3154
+					'format'     => $fldprops['format']
3155
+				);
3156
+			}
3157 3157
             
3158 3158
             
3159
-            $settings_template_args['template_form_fields'] = ! empty($template_form_field)
3160
-                ? $this->_generate_admin_form_fields($template_form_field, 'string', 'ee_m_activate_form')
3161
-                : '';
3162
-        }
3163
-        
3164
-        //we also need some hidden fields
3165
-        $settings_template_args['hidden_fields'] = array(
3166
-            'messenger_settings[messenger]' => array(
3167
-                'type'  => 'hidden',
3168
-                'value' => $messenger->name
3169
-            ),
3170
-            'type'                          => array(
3171
-                'type'  => 'hidden',
3172
-                'value' => 'messenger'
3173
-            )
3174
-        );
3175
-        
3176
-        //make sure any active message types that are existing are included in the hidden fields
3177
-        if (isset($this->_m_mt_settings['message_type_tabs'][$messenger->name]['active'])) {
3178
-            foreach ($this->_m_mt_settings['message_type_tabs'][$messenger->name]['active'] as $mt => $values) {
3179
-                $settings_template_args['hidden_fields']['messenger_settings[message_types][' . $mt . ']'] = array(
3180
-                    'type'  => 'hidden',
3181
-                    'value' => $mt
3182
-                );
3183
-            }
3184
-        }
3185
-        $settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3186
-            $settings_template_args['hidden_fields'],
3187
-            'array'
3188
-        );
3189
-        $active                                  = $this->_message_resource_manager->is_messenger_active($messenger->name);
3190
-        
3191
-        $settings_template_args['messenger']           = $messenger->name;
3192
-        $settings_template_args['description']         = $messenger->description;
3193
-        $settings_template_args['show_hide_edit_form'] = $active ? '' : ' hidden';
3194
-        
3195
-        
3196
-        $settings_template_args['show_hide_edit_form'] = $this->_message_resource_manager->is_messenger_active($messenger->name)
3197
-            ? $settings_template_args['show_hide_edit_form']
3198
-            : ' hidden';
3199
-        
3200
-        $settings_template_args['show_hide_edit_form'] = empty($settings_template_args['template_form_fields'])
3201
-            ? ' hidden'
3202
-            : $settings_template_args['show_hide_edit_form'];
3203
-        
3204
-        
3205
-        $settings_template_args['on_off_action'] = $active ? 'messenger-off' : 'messenger-on';
3206
-        $settings_template_args['nonce']         = wp_create_nonce('activate_' . $messenger->name . '_toggle_nonce');
3207
-        $settings_template_args['on_off_status'] = $active ? true : false;
3208
-        $template                                = EE_MSG_TEMPLATE_PATH . 'ee_msg_m_settings_content.template.php';
3209
-        $content                                 = EEH_Template::display_template($template, $settings_template_args,
3210
-            true);
3211
-        
3212
-        return $content;
3213
-    }
3214
-    
3215
-    
3216
-    /**
3217
-     * used by ajax on the messages settings page to activate|deactivate the messenger
3218
-     */
3219
-    public function activate_messenger_toggle()
3220
-    {
3221
-        $success = true;
3222
-        $this->_prep_default_response_for_messenger_or_message_type_toggle();
3223
-        //let's check that we have required data
3224
-        if ( ! isset($this->_req_data['messenger'])) {
3225
-            EE_Error::add_error(
3226
-                __('Messenger name needed to toggle activation. None given', 'event_espresso'),
3227
-                __FILE__,
3228
-                __FUNCTION__,
3229
-                __LINE__
3230
-            );
3231
-            $success = false;
3232
-        }
3233
-        
3234
-        //do a nonce check here since we're not arriving via a normal route
3235
-        $nonce     = isset($this->_req_data['activate_nonce']) ? sanitize_text_field($this->_req_data['activate_nonce']) : '';
3236
-        $nonce_ref = 'activate_' . $this->_req_data['messenger'] . '_toggle_nonce';
3237
-        
3238
-        $this->_verify_nonce($nonce, $nonce_ref);
3239
-        
3240
-        
3241
-        if ( ! isset($this->_req_data['status'])) {
3242
-            EE_Error::add_error(
3243
-                __(
3244
-                    'Messenger status needed to know whether activation or deactivation is happening. No status is given',
3245
-                    'event_espresso'
3246
-                ),
3247
-                __FILE__,
3248
-                __FUNCTION__,
3249
-                __LINE__
3250
-            );
3251
-            $success = false;
3252
-        }
3253
-        
3254
-        //do check to verify we have a valid status.
3255
-        $status = $this->_req_data['status'];
3256
-        
3257
-        if ($status != 'off' && $status != 'on') {
3258
-            EE_Error::add_error(
3259
-                sprintf(
3260
-                    __('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
3261
-                    $this->_req_data['status']
3262
-                ),
3263
-                __FILE__,
3264
-                __FUNCTION__,
3265
-                __LINE__
3266
-            );
3267
-            $success = false;
3268
-        }
3269
-        
3270
-        if ($success) {
3271
-            //made it here?  Stop dawdling then!!
3272
-            $success = $status == 'off'
3273
-                ? $this->_deactivate_messenger($this->_req_data['messenger'])
3274
-                : $this->_activate_messenger($this->_req_data['messenger']);
3275
-        }
3276
-        
3277
-        $this->_template_args['success'] = $success;
3278
-        
3279
-        //no special instructions so let's just do the json return (which should automatically do all the special stuff).
3280
-        $this->_return_json();
3281
-        
3282
-    }
3283
-    
3284
-    
3285
-    /**
3286
-     * used by ajax from the messages settings page to activate|deactivate a message type
3287
-     *
3288
-     */
3289
-    public function activate_mt_toggle()
3290
-    {
3291
-        $success = true;
3292
-        $this->_prep_default_response_for_messenger_or_message_type_toggle();
3293
-        
3294
-        //let's make sure we have the necessary data
3295
-        if ( ! isset($this->_req_data['message_type'])) {
3296
-            EE_Error::add_error(
3297
-                __('Message Type name needed to toggle activation. None given', 'event_espresso'),
3298
-                __FILE__, __FUNCTION__, __LINE__
3299
-            );
3300
-            $success = false;
3301
-        }
3302
-        
3303
-        if ( ! isset($this->_req_data['messenger'])) {
3304
-            EE_Error::add_error(
3305
-                __('Messenger name needed to toggle activation. None given', 'event_espresso'),
3306
-                __FILE__, __FUNCTION__, __LINE__
3307
-            );
3308
-            $success = false;
3309
-        }
3310
-        
3311
-        if ( ! isset($this->_req_data['status'])) {
3312
-            EE_Error::add_error(
3313
-                __('Messenger status needed to know whether activation or deactivation is happening. No status is given',
3314
-                    'event_espresso'),
3315
-                __FILE__, __FUNCTION__, __LINE__
3316
-            );
3317
-            $success = false;
3318
-        }
3319
-        
3320
-        
3321
-        //do check to verify we have a valid status.
3322
-        $status = $this->_req_data['status'];
3323
-        
3324
-        if ($status != 'activate' && $status != 'deactivate') {
3325
-            EE_Error::add_error(
3326
-                sprintf(
3327
-                    __('The given status (%s) is not valid. Must be "active" or "inactive"', 'event_espresso'),
3328
-                    $this->_req_data['status']
3329
-                ),
3330
-                __FILE__, __FUNCTION__, __LINE__
3331
-            );
3332
-            $success = false;
3333
-        }
3334
-        
3335
-        
3336
-        //do a nonce check here since we're not arriving via a normal route
3337
-        $nonce     = isset($this->_req_data['mt_nonce']) ? sanitize_text_field($this->_req_data['mt_nonce']) : '';
3338
-        $nonce_ref = $this->_req_data['message_type'] . '_nonce';
3339
-        
3340
-        $this->_verify_nonce($nonce, $nonce_ref);
3341
-        
3342
-        if ($success) {
3343
-            //made it here? um, what are you waiting for then?
3344
-            $success = $status == 'deactivate'
3345
-                ? $this->_deactivate_message_type_for_messenger($this->_req_data['messenger'],
3346
-                    $this->_req_data['message_type'])
3347
-                : $this->_activate_message_type_for_messenger($this->_req_data['messenger'],
3348
-                    $this->_req_data['message_type']);
3349
-        }
3350
-        
3351
-        $this->_template_args['success'] = $success;
3352
-        $this->_return_json();
3353
-    }
3354
-    
3355
-    
3356
-    /**
3357
-     * Takes care of processing activating a messenger and preparing the appropriate response.
3358
-     *
3359
-     * @param string $messenger_name The name of the messenger being activated
3360
-     *
3361
-     * @return bool
3362
-     */
3363
-    protected function _activate_messenger($messenger_name)
3364
-    {
3365
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3366
-        $active_messenger          = $this->_message_resource_manager->get_messenger($messenger_name);
3367
-        $message_types_to_activate = $active_messenger instanceof EE_Messenger ? $active_messenger->get_default_message_types() : array();
3368
-        
3369
-        //ensure is active
3370
-        $this->_message_resource_manager->activate_messenger($messenger_name, $message_types_to_activate);
3371
-        
3372
-        //set response_data for reload
3373
-        foreach ($message_types_to_activate as $message_type_name) {
3374
-            /** @var EE_message_type $message_type */
3375
-            $message_type = $this->_message_resource_manager->get_message_type($message_type_name);
3376
-            if ($this->_message_resource_manager->is_message_type_active_for_messenger($messenger_name,
3377
-                    $message_type_name)
3378
-                && $message_type instanceof EE_message_type
3379
-            ) {
3380
-                $this->_template_args['data']['active_mts'][] = $message_type_name;
3381
-                if ($message_type->get_admin_settings_fields()) {
3382
-                    $this->_template_args['data']['mt_reload'][] = $message_type_name;
3383
-                }
3384
-            }
3385
-        }
3386
-        
3387
-        //add success message for activating messenger
3388
-        return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger);
3389
-        
3390
-    }
3391
-    
3392
-    
3393
-    /**
3394
-     * Takes care of processing deactivating a messenger and preparing the appropriate response.
3395
-     *
3396
-     * @param string $messenger_name The name of the messenger being activated
3397
-     *
3398
-     * @return bool
3399
-     */
3400
-    protected function _deactivate_messenger($messenger_name)
3401
-    {
3402
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3403
-        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3404
-        $this->_message_resource_manager->deactivate_messenger($messenger_name);
3405
-        
3406
-        return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger);
3407
-    }
3408
-    
3409
-    
3410
-    /**
3411
-     * Takes care of processing activating a message type for a messenger and preparing the appropriate response.
3412
-     *
3413
-     * @param string $messenger_name    The name of the messenger the message type is being activated for.
3414
-     * @param string $message_type_name The name of the message type being activated for the messenger
3415
-     *
3416
-     * @return bool
3417
-     */
3418
-    protected function _activate_message_type_for_messenger($messenger_name, $message_type_name)
3419
-    {
3420
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3421
-        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3422
-        /** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
3423
-        $message_type_to_activate = $this->_message_resource_manager->get_message_type($message_type_name);
3424
-        
3425
-        //ensure is active
3426
-        $this->_message_resource_manager->activate_messenger($messenger_name, $message_type_name);
3427
-        
3428
-        //set response for load
3429
-        if ($this->_message_resource_manager->is_message_type_active_for_messenger($messenger_name,
3430
-            $message_type_name)
3431
-        ) {
3432
-            $this->_template_args['data']['active_mts'][] = $message_type_name;
3433
-            if ($message_type_to_activate->get_admin_settings_fields()) {
3434
-                $this->_template_args['data']['mt_reload'][] = $message_type_name;
3435
-            }
3436
-        }
3437
-        
3438
-        return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger,
3439
-            $message_type_to_activate);
3440
-    }
3441
-    
3442
-    
3443
-    /**
3444
-     * Takes care of processing deactivating a message type for a messenger and preparing the appropriate response.
3445
-     *
3446
-     * @param string $messenger_name    The name of the messenger the message type is being deactivated for.
3447
-     * @param string $message_type_name The name of the message type being deactivated for the messenger
3448
-     *
3449
-     * @return bool
3450
-     */
3451
-    protected function _deactivate_message_type_for_messenger($messenger_name, $message_type_name)
3452
-    {
3453
-        /** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3454
-        $active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3455
-        /** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
3456
-        $message_type_to_deactivate = $this->_message_resource_manager->get_message_type($message_type_name);
3457
-        $this->_message_resource_manager->deactivate_message_type_for_messenger($message_type_name, $messenger_name);
3458
-        
3459
-        return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger,
3460
-            $message_type_to_deactivate);
3461
-    }
3462
-    
3463
-    
3464
-    /**
3465
-     * This just initializes the defaults for activating messenger and message type responses.
3466
-     */
3467
-    protected function _prep_default_response_for_messenger_or_message_type_toggle()
3468
-    {
3469
-        $this->_template_args['data']['active_mts'] = array();
3470
-        $this->_template_args['data']['mt_reload']  = array();
3471
-    }
3472
-    
3473
-    
3474
-    /**
3475
-     * Setup appropriate response for activating a messenger and/or message types
3476
-     *
3477
-     * @param EE_messenger         $messenger
3478
-     * @param EE_message_type|null $message_type
3479
-     *
3480
-     * @return bool
3481
-     * @throws EE_Error
3482
-     */
3483
-    protected function _setup_response_message_for_activating_messenger_with_message_types(
3484
-        $messenger,
3485
-        EE_Message_Type $message_type = null
3486
-    ) {
3487
-        //if $messenger isn't a valid messenger object then get out.
3488
-        if ( ! $messenger instanceof EE_Messenger) {
3489
-            EE_Error::add_error(
3490
-                __('The messenger being activated is not a valid messenger', 'event_espresso'),
3491
-                __FILE__,
3492
-                __FUNCTION__,
3493
-                __LINE__
3494
-            );
3159
+			$settings_template_args['template_form_fields'] = ! empty($template_form_field)
3160
+				? $this->_generate_admin_form_fields($template_form_field, 'string', 'ee_m_activate_form')
3161
+				: '';
3162
+		}
3163
+        
3164
+		//we also need some hidden fields
3165
+		$settings_template_args['hidden_fields'] = array(
3166
+			'messenger_settings[messenger]' => array(
3167
+				'type'  => 'hidden',
3168
+				'value' => $messenger->name
3169
+			),
3170
+			'type'                          => array(
3171
+				'type'  => 'hidden',
3172
+				'value' => 'messenger'
3173
+			)
3174
+		);
3175
+        
3176
+		//make sure any active message types that are existing are included in the hidden fields
3177
+		if (isset($this->_m_mt_settings['message_type_tabs'][$messenger->name]['active'])) {
3178
+			foreach ($this->_m_mt_settings['message_type_tabs'][$messenger->name]['active'] as $mt => $values) {
3179
+				$settings_template_args['hidden_fields']['messenger_settings[message_types][' . $mt . ']'] = array(
3180
+					'type'  => 'hidden',
3181
+					'value' => $mt
3182
+				);
3183
+			}
3184
+		}
3185
+		$settings_template_args['hidden_fields'] = $this->_generate_admin_form_fields(
3186
+			$settings_template_args['hidden_fields'],
3187
+			'array'
3188
+		);
3189
+		$active                                  = $this->_message_resource_manager->is_messenger_active($messenger->name);
3190
+        
3191
+		$settings_template_args['messenger']           = $messenger->name;
3192
+		$settings_template_args['description']         = $messenger->description;
3193
+		$settings_template_args['show_hide_edit_form'] = $active ? '' : ' hidden';
3194
+        
3195
+        
3196
+		$settings_template_args['show_hide_edit_form'] = $this->_message_resource_manager->is_messenger_active($messenger->name)
3197
+			? $settings_template_args['show_hide_edit_form']
3198
+			: ' hidden';
3199
+        
3200
+		$settings_template_args['show_hide_edit_form'] = empty($settings_template_args['template_form_fields'])
3201
+			? ' hidden'
3202
+			: $settings_template_args['show_hide_edit_form'];
3203
+        
3204
+        
3205
+		$settings_template_args['on_off_action'] = $active ? 'messenger-off' : 'messenger-on';
3206
+		$settings_template_args['nonce']         = wp_create_nonce('activate_' . $messenger->name . '_toggle_nonce');
3207
+		$settings_template_args['on_off_status'] = $active ? true : false;
3208
+		$template                                = EE_MSG_TEMPLATE_PATH . 'ee_msg_m_settings_content.template.php';
3209
+		$content                                 = EEH_Template::display_template($template, $settings_template_args,
3210
+			true);
3211
+        
3212
+		return $content;
3213
+	}
3214
+    
3215
+    
3216
+	/**
3217
+	 * used by ajax on the messages settings page to activate|deactivate the messenger
3218
+	 */
3219
+	public function activate_messenger_toggle()
3220
+	{
3221
+		$success = true;
3222
+		$this->_prep_default_response_for_messenger_or_message_type_toggle();
3223
+		//let's check that we have required data
3224
+		if ( ! isset($this->_req_data['messenger'])) {
3225
+			EE_Error::add_error(
3226
+				__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3227
+				__FILE__,
3228
+				__FUNCTION__,
3229
+				__LINE__
3230
+			);
3231
+			$success = false;
3232
+		}
3233
+        
3234
+		//do a nonce check here since we're not arriving via a normal route
3235
+		$nonce     = isset($this->_req_data['activate_nonce']) ? sanitize_text_field($this->_req_data['activate_nonce']) : '';
3236
+		$nonce_ref = 'activate_' . $this->_req_data['messenger'] . '_toggle_nonce';
3237
+        
3238
+		$this->_verify_nonce($nonce, $nonce_ref);
3239
+        
3240
+        
3241
+		if ( ! isset($this->_req_data['status'])) {
3242
+			EE_Error::add_error(
3243
+				__(
3244
+					'Messenger status needed to know whether activation or deactivation is happening. No status is given',
3245
+					'event_espresso'
3246
+				),
3247
+				__FILE__,
3248
+				__FUNCTION__,
3249
+				__LINE__
3250
+			);
3251
+			$success = false;
3252
+		}
3253
+        
3254
+		//do check to verify we have a valid status.
3255
+		$status = $this->_req_data['status'];
3256
+        
3257
+		if ($status != 'off' && $status != 'on') {
3258
+			EE_Error::add_error(
3259
+				sprintf(
3260
+					__('The given status (%s) is not valid. Must be "off" or "on"', 'event_espresso'),
3261
+					$this->_req_data['status']
3262
+				),
3263
+				__FILE__,
3264
+				__FUNCTION__,
3265
+				__LINE__
3266
+			);
3267
+			$success = false;
3268
+		}
3269
+        
3270
+		if ($success) {
3271
+			//made it here?  Stop dawdling then!!
3272
+			$success = $status == 'off'
3273
+				? $this->_deactivate_messenger($this->_req_data['messenger'])
3274
+				: $this->_activate_messenger($this->_req_data['messenger']);
3275
+		}
3276
+        
3277
+		$this->_template_args['success'] = $success;
3278
+        
3279
+		//no special instructions so let's just do the json return (which should automatically do all the special stuff).
3280
+		$this->_return_json();
3281
+        
3282
+	}
3283
+    
3284
+    
3285
+	/**
3286
+	 * used by ajax from the messages settings page to activate|deactivate a message type
3287
+	 *
3288
+	 */
3289
+	public function activate_mt_toggle()
3290
+	{
3291
+		$success = true;
3292
+		$this->_prep_default_response_for_messenger_or_message_type_toggle();
3293
+        
3294
+		//let's make sure we have the necessary data
3295
+		if ( ! isset($this->_req_data['message_type'])) {
3296
+			EE_Error::add_error(
3297
+				__('Message Type name needed to toggle activation. None given', 'event_espresso'),
3298
+				__FILE__, __FUNCTION__, __LINE__
3299
+			);
3300
+			$success = false;
3301
+		}
3302
+        
3303
+		if ( ! isset($this->_req_data['messenger'])) {
3304
+			EE_Error::add_error(
3305
+				__('Messenger name needed to toggle activation. None given', 'event_espresso'),
3306
+				__FILE__, __FUNCTION__, __LINE__
3307
+			);
3308
+			$success = false;
3309
+		}
3310
+        
3311
+		if ( ! isset($this->_req_data['status'])) {
3312
+			EE_Error::add_error(
3313
+				__('Messenger status needed to know whether activation or deactivation is happening. No status is given',
3314
+					'event_espresso'),
3315
+				__FILE__, __FUNCTION__, __LINE__
3316
+			);
3317
+			$success = false;
3318
+		}
3319
+        
3320
+        
3321
+		//do check to verify we have a valid status.
3322
+		$status = $this->_req_data['status'];
3323
+        
3324
+		if ($status != 'activate' && $status != 'deactivate') {
3325
+			EE_Error::add_error(
3326
+				sprintf(
3327
+					__('The given status (%s) is not valid. Must be "active" or "inactive"', 'event_espresso'),
3328
+					$this->_req_data['status']
3329
+				),
3330
+				__FILE__, __FUNCTION__, __LINE__
3331
+			);
3332
+			$success = false;
3333
+		}
3334
+        
3335
+        
3336
+		//do a nonce check here since we're not arriving via a normal route
3337
+		$nonce     = isset($this->_req_data['mt_nonce']) ? sanitize_text_field($this->_req_data['mt_nonce']) : '';
3338
+		$nonce_ref = $this->_req_data['message_type'] . '_nonce';
3339
+        
3340
+		$this->_verify_nonce($nonce, $nonce_ref);
3341
+        
3342
+		if ($success) {
3343
+			//made it here? um, what are you waiting for then?
3344
+			$success = $status == 'deactivate'
3345
+				? $this->_deactivate_message_type_for_messenger($this->_req_data['messenger'],
3346
+					$this->_req_data['message_type'])
3347
+				: $this->_activate_message_type_for_messenger($this->_req_data['messenger'],
3348
+					$this->_req_data['message_type']);
3349
+		}
3350
+        
3351
+		$this->_template_args['success'] = $success;
3352
+		$this->_return_json();
3353
+	}
3354
+    
3355
+    
3356
+	/**
3357
+	 * Takes care of processing activating a messenger and preparing the appropriate response.
3358
+	 *
3359
+	 * @param string $messenger_name The name of the messenger being activated
3360
+	 *
3361
+	 * @return bool
3362
+	 */
3363
+	protected function _activate_messenger($messenger_name)
3364
+	{
3365
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3366
+		$active_messenger          = $this->_message_resource_manager->get_messenger($messenger_name);
3367
+		$message_types_to_activate = $active_messenger instanceof EE_Messenger ? $active_messenger->get_default_message_types() : array();
3368
+        
3369
+		//ensure is active
3370
+		$this->_message_resource_manager->activate_messenger($messenger_name, $message_types_to_activate);
3371
+        
3372
+		//set response_data for reload
3373
+		foreach ($message_types_to_activate as $message_type_name) {
3374
+			/** @var EE_message_type $message_type */
3375
+			$message_type = $this->_message_resource_manager->get_message_type($message_type_name);
3376
+			if ($this->_message_resource_manager->is_message_type_active_for_messenger($messenger_name,
3377
+					$message_type_name)
3378
+				&& $message_type instanceof EE_message_type
3379
+			) {
3380
+				$this->_template_args['data']['active_mts'][] = $message_type_name;
3381
+				if ($message_type->get_admin_settings_fields()) {
3382
+					$this->_template_args['data']['mt_reload'][] = $message_type_name;
3383
+				}
3384
+			}
3385
+		}
3386
+        
3387
+		//add success message for activating messenger
3388
+		return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger);
3389
+        
3390
+	}
3391
+    
3392
+    
3393
+	/**
3394
+	 * Takes care of processing deactivating a messenger and preparing the appropriate response.
3395
+	 *
3396
+	 * @param string $messenger_name The name of the messenger being activated
3397
+	 *
3398
+	 * @return bool
3399
+	 */
3400
+	protected function _deactivate_messenger($messenger_name)
3401
+	{
3402
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3403
+		$active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3404
+		$this->_message_resource_manager->deactivate_messenger($messenger_name);
3405
+        
3406
+		return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger);
3407
+	}
3408
+    
3409
+    
3410
+	/**
3411
+	 * Takes care of processing activating a message type for a messenger and preparing the appropriate response.
3412
+	 *
3413
+	 * @param string $messenger_name    The name of the messenger the message type is being activated for.
3414
+	 * @param string $message_type_name The name of the message type being activated for the messenger
3415
+	 *
3416
+	 * @return bool
3417
+	 */
3418
+	protected function _activate_message_type_for_messenger($messenger_name, $message_type_name)
3419
+	{
3420
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3421
+		$active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3422
+		/** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
3423
+		$message_type_to_activate = $this->_message_resource_manager->get_message_type($message_type_name);
3424
+        
3425
+		//ensure is active
3426
+		$this->_message_resource_manager->activate_messenger($messenger_name, $message_type_name);
3427
+        
3428
+		//set response for load
3429
+		if ($this->_message_resource_manager->is_message_type_active_for_messenger($messenger_name,
3430
+			$message_type_name)
3431
+		) {
3432
+			$this->_template_args['data']['active_mts'][] = $message_type_name;
3433
+			if ($message_type_to_activate->get_admin_settings_fields()) {
3434
+				$this->_template_args['data']['mt_reload'][] = $message_type_name;
3435
+			}
3436
+		}
3437
+        
3438
+		return $this->_setup_response_message_for_activating_messenger_with_message_types($active_messenger,
3439
+			$message_type_to_activate);
3440
+	}
3441
+    
3442
+    
3443
+	/**
3444
+	 * Takes care of processing deactivating a message type for a messenger and preparing the appropriate response.
3445
+	 *
3446
+	 * @param string $messenger_name    The name of the messenger the message type is being deactivated for.
3447
+	 * @param string $message_type_name The name of the message type being deactivated for the messenger
3448
+	 *
3449
+	 * @return bool
3450
+	 */
3451
+	protected function _deactivate_message_type_for_messenger($messenger_name, $message_type_name)
3452
+	{
3453
+		/** @var EE_messenger $active_messenger This will be present because it can't be toggled if it isn't */
3454
+		$active_messenger = $this->_message_resource_manager->get_messenger($messenger_name);
3455
+		/** @var EE_message_type $message_type_to_activate This will be present because it can't be toggled if it isn't */
3456
+		$message_type_to_deactivate = $this->_message_resource_manager->get_message_type($message_type_name);
3457
+		$this->_message_resource_manager->deactivate_message_type_for_messenger($message_type_name, $messenger_name);
3458
+        
3459
+		return $this->_setup_response_message_for_deactivating_messenger_with_message_types($active_messenger,
3460
+			$message_type_to_deactivate);
3461
+	}
3462
+    
3463
+    
3464
+	/**
3465
+	 * This just initializes the defaults for activating messenger and message type responses.
3466
+	 */
3467
+	protected function _prep_default_response_for_messenger_or_message_type_toggle()
3468
+	{
3469
+		$this->_template_args['data']['active_mts'] = array();
3470
+		$this->_template_args['data']['mt_reload']  = array();
3471
+	}
3472
+    
3473
+    
3474
+	/**
3475
+	 * Setup appropriate response for activating a messenger and/or message types
3476
+	 *
3477
+	 * @param EE_messenger         $messenger
3478
+	 * @param EE_message_type|null $message_type
3479
+	 *
3480
+	 * @return bool
3481
+	 * @throws EE_Error
3482
+	 */
3483
+	protected function _setup_response_message_for_activating_messenger_with_message_types(
3484
+		$messenger,
3485
+		EE_Message_Type $message_type = null
3486
+	) {
3487
+		//if $messenger isn't a valid messenger object then get out.
3488
+		if ( ! $messenger instanceof EE_Messenger) {
3489
+			EE_Error::add_error(
3490
+				__('The messenger being activated is not a valid messenger', 'event_espresso'),
3491
+				__FILE__,
3492
+				__FUNCTION__,
3493
+				__LINE__
3494
+			);
3495 3495
             
3496
-            return false;
3497
-        }
3498
-        //activated
3499
-        if ($this->_template_args['data']['active_mts']) {
3500
-            EE_Error::overwrite_success();
3501
-            //activated a message type with the messenger
3502
-            if ($message_type instanceof EE_message_type) {
3503
-                EE_Error::add_success(
3504
-                    sprintf(
3505
-                        __('%s message type has been successfully activated with the %s messenger', 'event_espresso'),
3506
-                        ucwords($message_type->label['singular']),
3507
-                        ucwords($messenger->label['singular'])
3508
-                    )
3509
-                );
3496
+			return false;
3497
+		}
3498
+		//activated
3499
+		if ($this->_template_args['data']['active_mts']) {
3500
+			EE_Error::overwrite_success();
3501
+			//activated a message type with the messenger
3502
+			if ($message_type instanceof EE_message_type) {
3503
+				EE_Error::add_success(
3504
+					sprintf(
3505
+						__('%s message type has been successfully activated with the %s messenger', 'event_espresso'),
3506
+						ucwords($message_type->label['singular']),
3507
+						ucwords($messenger->label['singular'])
3508
+					)
3509
+				);
3510 3510
                 
3511
-                //if message type was invoice then let's make sure we activate the invoice payment method.
3512
-                if ($message_type->name == 'invoice') {
3513
-                    EE_Registry::instance()->load_lib('Payment_Method_Manager');
3514
-                    $pm = EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
3515
-                    if ($pm instanceof EE_Payment_Method) {
3516
-                        EE_Error::add_attention(__('Activating the invoice message type also automatically activates the invoice payment method.  If you do not wish the invoice payment method to be active, or to change its settings, visit the payment method admin page.',
3517
-                            'event_espresso'));
3518
-                    }
3519
-                }
3520
-                //just toggles the entire messenger
3521
-            } else {
3522
-                EE_Error::add_success(
3523
-                    sprintf(
3524
-                        __('%s messenger has been successfully activated', 'event_espresso'),
3525
-                        ucwords($messenger->label['singular'])
3526
-                    )
3527
-                );
3528
-            }
3511
+				//if message type was invoice then let's make sure we activate the invoice payment method.
3512
+				if ($message_type->name == 'invoice') {
3513
+					EE_Registry::instance()->load_lib('Payment_Method_Manager');
3514
+					$pm = EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
3515
+					if ($pm instanceof EE_Payment_Method) {
3516
+						EE_Error::add_attention(__('Activating the invoice message type also automatically activates the invoice payment method.  If you do not wish the invoice payment method to be active, or to change its settings, visit the payment method admin page.',
3517
+							'event_espresso'));
3518
+					}
3519
+				}
3520
+				//just toggles the entire messenger
3521
+			} else {
3522
+				EE_Error::add_success(
3523
+					sprintf(
3524
+						__('%s messenger has been successfully activated', 'event_espresso'),
3525
+						ucwords($messenger->label['singular'])
3526
+					)
3527
+				);
3528
+			}
3529 3529
             
3530
-            return true;
3530
+			return true;
3531 3531
             
3532
-            //possible error condition. This will happen when our active_mts data is empty because it is validated for actual active
3533
-            //message types after the activation process.  However its possible some messengers don't HAVE any default_message_types
3534
-            //in which case we just give a success message for the messenger being successfully activated.
3535
-        } else {
3536
-            if ( ! $messenger->get_default_message_types()) {
3537
-                //messenger doesn't have any default message types so still a success.
3538
-                EE_Error::add_success(
3539
-                    sprintf(
3540
-                        __('%s messenger was successfully activated.', 'event_espresso'),
3541
-                        ucwords($messenger->label['singular'])
3542
-                    )
3543
-                );
3532
+			//possible error condition. This will happen when our active_mts data is empty because it is validated for actual active
3533
+			//message types after the activation process.  However its possible some messengers don't HAVE any default_message_types
3534
+			//in which case we just give a success message for the messenger being successfully activated.
3535
+		} else {
3536
+			if ( ! $messenger->get_default_message_types()) {
3537
+				//messenger doesn't have any default message types so still a success.
3538
+				EE_Error::add_success(
3539
+					sprintf(
3540
+						__('%s messenger was successfully activated.', 'event_espresso'),
3541
+						ucwords($messenger->label['singular'])
3542
+					)
3543
+				);
3544 3544
                 
3545
-                return true;
3546
-            } else {
3547
-                EE_Error::add_error(
3548
-                    $message_type instanceof EE_message_type
3549
-                        ? sprintf(
3550
-                        __('%s message type was not successfully activated with the %s messenger', 'event_espresso'),
3551
-                        ucwords($message_type->label['singular']),
3552
-                        ucwords($messenger->label['singular'])
3553
-                    )
3554
-                        : sprintf(
3555
-                        __('%s messenger was not successfully activated', 'event_espresso'),
3556
-                        ucwords($messenger->label['singular'])
3557
-                    ),
3558
-                    __FILE__,
3559
-                    __FUNCTION__,
3560
-                    __LINE__
3561
-                );
3545
+				return true;
3546
+			} else {
3547
+				EE_Error::add_error(
3548
+					$message_type instanceof EE_message_type
3549
+						? sprintf(
3550
+						__('%s message type was not successfully activated with the %s messenger', 'event_espresso'),
3551
+						ucwords($message_type->label['singular']),
3552
+						ucwords($messenger->label['singular'])
3553
+					)
3554
+						: sprintf(
3555
+						__('%s messenger was not successfully activated', 'event_espresso'),
3556
+						ucwords($messenger->label['singular'])
3557
+					),
3558
+					__FILE__,
3559
+					__FUNCTION__,
3560
+					__LINE__
3561
+				);
3562 3562
                 
3563
-                return false;
3564
-            }
3565
-        }
3566
-    }
3567
-    
3568
-    
3569
-    /**
3570
-     * This sets up the appropriate response for deactivating a messenger and/or message type.
3571
-     *
3572
-     * @param EE_messenger         $messenger
3573
-     * @param EE_message_type|null $message_type
3574
-     *
3575
-     * @return bool
3576
-     */
3577
-    protected function _setup_response_message_for_deactivating_messenger_with_message_types(
3578
-        $messenger,
3579
-        EE_message_type $message_type = null
3580
-    ) {
3581
-        EE_Error::overwrite_success();
3582
-        
3583
-        //if $messenger isn't a valid messenger object then get out.
3584
-        if ( ! $messenger instanceof EE_Messenger) {
3585
-            EE_Error::add_error(
3586
-                __('The messenger being deactivated is not a valid messenger', 'event_espresso'),
3587
-                __FILE__,
3588
-                __FUNCTION__,
3589
-                __LINE__
3590
-            );
3563
+				return false;
3564
+			}
3565
+		}
3566
+	}
3567
+    
3568
+    
3569
+	/**
3570
+	 * This sets up the appropriate response for deactivating a messenger and/or message type.
3571
+	 *
3572
+	 * @param EE_messenger         $messenger
3573
+	 * @param EE_message_type|null $message_type
3574
+	 *
3575
+	 * @return bool
3576
+	 */
3577
+	protected function _setup_response_message_for_deactivating_messenger_with_message_types(
3578
+		$messenger,
3579
+		EE_message_type $message_type = null
3580
+	) {
3581
+		EE_Error::overwrite_success();
3582
+        
3583
+		//if $messenger isn't a valid messenger object then get out.
3584
+		if ( ! $messenger instanceof EE_Messenger) {
3585
+			EE_Error::add_error(
3586
+				__('The messenger being deactivated is not a valid messenger', 'event_espresso'),
3587
+				__FILE__,
3588
+				__FUNCTION__,
3589
+				__LINE__
3590
+			);
3591 3591
             
3592
-            return false;
3593
-        }
3594
-        
3595
-        if ($message_type instanceof EE_message_type) {
3596
-            $message_type_name = $message_type->name;
3597
-            EE_Error::add_success(
3598
-                sprintf(
3599
-                    __('%s message type has been successfully deactivated for the %s messenger.', 'event_espresso'),
3600
-                    ucwords($message_type->label['singular']),
3601
-                    ucwords($messenger->label['singular'])
3602
-                )
3603
-            );
3604
-        } else {
3605
-            $message_type_name = '';
3606
-            EE_Error::add_success(
3607
-                sprintf(
3608
-                    __('%s messenger has been successfully deactivated.', 'event_espresso'),
3609
-                    ucwords($messenger->label['singular'])
3610
-                )
3611
-            );
3612
-        }
3613
-        
3614
-        //if messenger was html or message type was invoice then let's make sure we deactivate invoice payment method.
3615
-        if ($messenger->name == 'html' || $message_type_name == 'invoice') {
3616
-            EE_Registry::instance()->load_lib('Payment_Method_Manager');
3617
-            $count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method('invoice');
3618
-            if ($count_updated > 0) {
3619
-                $msg = $message_type_name == 'invoice'
3620
-                    ? __('Deactivating the invoice message type also automatically deactivates the invoice payment method. In order for invoices to be generated the invoice message type must be active. If you completed this action by mistake, simply reactivate the invoice message type and then visit the payment methods admin page to reactivate the invoice payment method.',
3621
-                        'event_espresso')
3622
-                    : __('Deactivating the html messenger also automatically deactivates the invoice payment method.  In order for invoices to be generated the html messenger must be be active.  If you completed this action by mistake, simply reactivate the html messenger, then visit the payment methods admin page to reactivate the invoice payment method.',
3623
-                        'event_espresso');
3624
-                EE_Error::add_attention($msg);
3625
-            }
3626
-        }
3627
-        
3628
-        return true;
3629
-    }
3630
-    
3631
-    
3632
-    /**
3633
-     * handles updating a message type form on messenger activation IF the message type has settings fields. (via ajax)
3634
-     */
3635
-    public function update_mt_form()
3636
-    {
3637
-        if ( ! isset($this->_req_data['messenger']) || ! isset($this->_req_data['message_type'])) {
3638
-            EE_Error::add_error(__('Require message type or messenger to send an updated form'), __FILE__, __FUNCTION__,
3639
-                __LINE__);
3640
-            $this->_return_json();
3641
-        }
3642
-        
3643
-        $message_types = $this->get_installed_message_types();
3644
-        
3645
-        $message_type = $message_types[$this->_req_data['message_type']];
3646
-        $messenger    = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
3647
-        
3648
-        $content                         = $this->_message_type_settings_content($message_type, $messenger, true);
3649
-        $this->_template_args['success'] = true;
3650
-        $this->_template_args['content'] = $content;
3651
-        $this->_return_json();
3652
-    }
3653
-    
3654
-    
3655
-    /**
3656
-     * this handles saving the settings for a messenger or message type
3657
-     *
3658
-     */
3659
-    public function save_settings()
3660
-    {
3661
-        if ( ! isset($this->_req_data['type'])) {
3662
-            EE_Error::add_error(__('Cannot save settings because type is unknown (messenger settings or messsage type settings?)',
3663
-                'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
3664
-            $this->_template_args['error'] = true;
3665
-            $this->_return_json();
3666
-        }
3667
-        
3668
-        
3669
-        if ($this->_req_data['type'] == 'messenger') {
3670
-            $settings  = $this->_req_data['messenger_settings']; //this should be an array.
3671
-            $messenger = $settings['messenger'];
3672
-            //let's setup the settings data
3673
-            foreach ($settings as $key => $value) {
3674
-                switch ($key) {
3675
-                    case 'messenger' :
3676
-                        unset($settings['messenger']);
3677
-                        break;
3678
-                    case 'message_types' :
3679
-                        unset($settings['message_types']);
3680
-                        break;
3681
-                    default :
3682
-                        $settings[$key] = $value;
3683
-                        break;
3684
-                }
3685
-            }
3686
-            $this->_message_resource_manager->add_settings_for_messenger($messenger, $settings);
3687
-        } else if ($this->_req_data['type'] == 'message_type') {
3688
-            $settings     = $this->_req_data['message_type_settings'];
3689
-            $messenger    = $settings['messenger'];
3690
-            $message_type = $settings['message_type'];
3592
+			return false;
3593
+		}
3594
+        
3595
+		if ($message_type instanceof EE_message_type) {
3596
+			$message_type_name = $message_type->name;
3597
+			EE_Error::add_success(
3598
+				sprintf(
3599
+					__('%s message type has been successfully deactivated for the %s messenger.', 'event_espresso'),
3600
+					ucwords($message_type->label['singular']),
3601
+					ucwords($messenger->label['singular'])
3602
+				)
3603
+			);
3604
+		} else {
3605
+			$message_type_name = '';
3606
+			EE_Error::add_success(
3607
+				sprintf(
3608
+					__('%s messenger has been successfully deactivated.', 'event_espresso'),
3609
+					ucwords($messenger->label['singular'])
3610
+				)
3611
+			);
3612
+		}
3613
+        
3614
+		//if messenger was html or message type was invoice then let's make sure we deactivate invoice payment method.
3615
+		if ($messenger->name == 'html' || $message_type_name == 'invoice') {
3616
+			EE_Registry::instance()->load_lib('Payment_Method_Manager');
3617
+			$count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method('invoice');
3618
+			if ($count_updated > 0) {
3619
+				$msg = $message_type_name == 'invoice'
3620
+					? __('Deactivating the invoice message type also automatically deactivates the invoice payment method. In order for invoices to be generated the invoice message type must be active. If you completed this action by mistake, simply reactivate the invoice message type and then visit the payment methods admin page to reactivate the invoice payment method.',
3621
+						'event_espresso')
3622
+					: __('Deactivating the html messenger also automatically deactivates the invoice payment method.  In order for invoices to be generated the html messenger must be be active.  If you completed this action by mistake, simply reactivate the html messenger, then visit the payment methods admin page to reactivate the invoice payment method.',
3623
+						'event_espresso');
3624
+				EE_Error::add_attention($msg);
3625
+			}
3626
+		}
3627
+        
3628
+		return true;
3629
+	}
3630
+    
3631
+    
3632
+	/**
3633
+	 * handles updating a message type form on messenger activation IF the message type has settings fields. (via ajax)
3634
+	 */
3635
+	public function update_mt_form()
3636
+	{
3637
+		if ( ! isset($this->_req_data['messenger']) || ! isset($this->_req_data['message_type'])) {
3638
+			EE_Error::add_error(__('Require message type or messenger to send an updated form'), __FILE__, __FUNCTION__,
3639
+				__LINE__);
3640
+			$this->_return_json();
3641
+		}
3642
+        
3643
+		$message_types = $this->get_installed_message_types();
3644
+        
3645
+		$message_type = $message_types[$this->_req_data['message_type']];
3646
+		$messenger    = $this->_message_resource_manager->get_active_messenger($this->_req_data['messenger']);
3647
+        
3648
+		$content                         = $this->_message_type_settings_content($message_type, $messenger, true);
3649
+		$this->_template_args['success'] = true;
3650
+		$this->_template_args['content'] = $content;
3651
+		$this->_return_json();
3652
+	}
3653
+    
3654
+    
3655
+	/**
3656
+	 * this handles saving the settings for a messenger or message type
3657
+	 *
3658
+	 */
3659
+	public function save_settings()
3660
+	{
3661
+		if ( ! isset($this->_req_data['type'])) {
3662
+			EE_Error::add_error(__('Cannot save settings because type is unknown (messenger settings or messsage type settings?)',
3663
+				'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
3664
+			$this->_template_args['error'] = true;
3665
+			$this->_return_json();
3666
+		}
3667
+        
3668
+        
3669
+		if ($this->_req_data['type'] == 'messenger') {
3670
+			$settings  = $this->_req_data['messenger_settings']; //this should be an array.
3671
+			$messenger = $settings['messenger'];
3672
+			//let's setup the settings data
3673
+			foreach ($settings as $key => $value) {
3674
+				switch ($key) {
3675
+					case 'messenger' :
3676
+						unset($settings['messenger']);
3677
+						break;
3678
+					case 'message_types' :
3679
+						unset($settings['message_types']);
3680
+						break;
3681
+					default :
3682
+						$settings[$key] = $value;
3683
+						break;
3684
+				}
3685
+			}
3686
+			$this->_message_resource_manager->add_settings_for_messenger($messenger, $settings);
3687
+		} else if ($this->_req_data['type'] == 'message_type') {
3688
+			$settings     = $this->_req_data['message_type_settings'];
3689
+			$messenger    = $settings['messenger'];
3690
+			$message_type = $settings['message_type'];
3691 3691
             
3692
-            foreach ($settings as $key => $value) {
3693
-                switch ($key) {
3694
-                    case 'messenger' :
3695
-                        unset($settings['messenger']);
3696
-                        break;
3697
-                    case 'message_type' :
3698
-                        unset($settings['message_type']);
3699
-                        break;
3700
-                    default :
3701
-                        $settings[$key] = $value;
3702
-                        break;
3703
-                }
3704
-            }
3692
+			foreach ($settings as $key => $value) {
3693
+				switch ($key) {
3694
+					case 'messenger' :
3695
+						unset($settings['messenger']);
3696
+						break;
3697
+					case 'message_type' :
3698
+						unset($settings['message_type']);
3699
+						break;
3700
+					default :
3701
+						$settings[$key] = $value;
3702
+						break;
3703
+				}
3704
+			}
3705 3705
             
3706
-            $this->_message_resource_manager->add_settings_for_message_type($messenger, $message_type, $settings);
3707
-        }
3708
-        
3709
-        //okay we should have the data all setup.  Now we just update!
3710
-        $success = $this->_message_resource_manager->update_active_messengers_option();
3711
-        
3712
-        if ($success) {
3713
-            EE_Error::add_success(__('Settings updated', 'event_espresso'));
3714
-        } else {
3715
-            EE_Error::add_error(__('Settings did not get updated', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
3716
-        }
3717
-        
3718
-        $this->_template_args['success'] = $success;
3719
-        $this->_return_json();
3720
-    }
3721
-    
3722
-    
3723
-    
3724
-    
3725
-    /**  EE MESSAGE PROCESSING ACTIONS **/
3726
-    
3727
-    
3728
-    /**
3729
-     * This immediately generates any EE_Message ID's that are selected that are EEM_Message::status_incomplete
3730
-     * However, this does not send immediately, it just queues for sending.
3731
-     *
3732
-     * @since 4.9.0
3733
-     */
3734
-    protected function _generate_now()
3735
-    {
3736
-        $msg_ids = $this->_get_msg_ids_from_request();
3737
-        EED_Messages::generate_now($msg_ids);
3738
-        $this->_redirect_after_action(false, '', '', array(), true);
3739
-    }
3740
-    
3741
-    
3742
-    /**
3743
-     * This immediately generates AND sends any EE_Message's selected that are EEM_Message::status_incomplete or that
3744
-     * are EEM_Message::status_resend or EEM_Message::status_idle
3745
-     *
3746
-     * @since 4.9.0
3747
-     *
3748
-     */
3749
-    protected function _generate_and_send_now()
3750
-    {
3751
-        $this->_generate_now();
3752
-        $this->_send_now();
3753
-        $this->_redirect_after_action(false, '', '', array(), true);
3754
-    }
3755
-    
3756
-    
3757
-    /**
3758
-     * This queues any EEM_Message::status_sent EE_Message ids in the request for resending.
3759
-     *
3760
-     * @since 4.9.0
3761
-     */
3762
-    protected function _queue_for_resending()
3763
-    {
3764
-        $msg_ids = $this->_get_msg_ids_from_request();
3765
-        EED_Messages::queue_for_resending($msg_ids);
3766
-        $this->_redirect_after_action(false, '', '', array(), true);
3767
-    }
3768
-    
3769
-    
3770
-    /**
3771
-     *  This sends immediately any EEM_Message::status_idle or EEM_Message::status_resend messages in the queue
3772
-     *
3773
-     * @since 4.9.0
3774
-     */
3775
-    protected function _send_now()
3776
-    {
3777
-        $msg_ids = $this->_get_msg_ids_from_request();
3778
-        EED_Messages::send_now($msg_ids);
3779
-        $this->_redirect_after_action(false, '', '', array(), true);
3780
-    }
3781
-    
3782
-    
3783
-    /**
3784
-     * Deletes EE_messages for IDs in the request.
3785
-     *
3786
-     * @since 4.9.0
3787
-     */
3788
-    protected function _delete_ee_messages()
3789
-    {
3790
-        $msg_ids       = $this->_get_msg_ids_from_request();
3791
-        $deleted_count = 0;
3792
-        foreach ($msg_ids as $msg_id) {
3793
-            if (EEM_Message::instance()->delete_by_ID($msg_id)) {
3794
-                $deleted_count++;
3795
-            }
3796
-        }
3797
-        if ($deleted_count) {
3798
-            $this->_redirect_after_action(
3799
-                true,
3800
-                _n('message', 'messages', $deleted_count, 'event_espresso'),
3801
-                __('deleted', 'event_espresso')
3802
-            );
3803
-        } else {
3804
-            EE_Error::add_error(
3805
-                _n('The message was not deleted.', 'The messages were not deleted', count($msg_ids), 'event_espresso'),
3806
-                __FILE__, __FUNCTION__, __LINE__
3807
-            );
3808
-            $this->_redirect_after_action(false, '', '', array(), true);
3809
-        }
3810
-    }
3811
-    
3812
-    
3813
-    /**
3814
-     *  This looks for 'MSG_ID' key in the request and returns an array of MSG_ID's if present.
3815
-     * @since 4.9.0
3816
-     * @return array
3817
-     */
3818
-    protected function _get_msg_ids_from_request()
3819
-    {
3820
-        if ( ! isset($this->_req_data['MSG_ID'])) {
3821
-            return array();
3822
-        }
3823
-        
3824
-        return is_array($this->_req_data['MSG_ID']) ? array_keys($this->_req_data['MSG_ID']) : array($this->_req_data['MSG_ID']);
3825
-    }
3706
+			$this->_message_resource_manager->add_settings_for_message_type($messenger, $message_type, $settings);
3707
+		}
3708
+        
3709
+		//okay we should have the data all setup.  Now we just update!
3710
+		$success = $this->_message_resource_manager->update_active_messengers_option();
3711
+        
3712
+		if ($success) {
3713
+			EE_Error::add_success(__('Settings updated', 'event_espresso'));
3714
+		} else {
3715
+			EE_Error::add_error(__('Settings did not get updated', 'event_espresso'), __FILE__, __FUNCTION__, __LINE__);
3716
+		}
3717
+        
3718
+		$this->_template_args['success'] = $success;
3719
+		$this->_return_json();
3720
+	}
3721
+    
3722
+    
3723
+    
3724
+    
3725
+	/**  EE MESSAGE PROCESSING ACTIONS **/
3726
+    
3727
+    
3728
+	/**
3729
+	 * This immediately generates any EE_Message ID's that are selected that are EEM_Message::status_incomplete
3730
+	 * However, this does not send immediately, it just queues for sending.
3731
+	 *
3732
+	 * @since 4.9.0
3733
+	 */
3734
+	protected function _generate_now()
3735
+	{
3736
+		$msg_ids = $this->_get_msg_ids_from_request();
3737
+		EED_Messages::generate_now($msg_ids);
3738
+		$this->_redirect_after_action(false, '', '', array(), true);
3739
+	}
3740
+    
3741
+    
3742
+	/**
3743
+	 * This immediately generates AND sends any EE_Message's selected that are EEM_Message::status_incomplete or that
3744
+	 * are EEM_Message::status_resend or EEM_Message::status_idle
3745
+	 *
3746
+	 * @since 4.9.0
3747
+	 *
3748
+	 */
3749
+	protected function _generate_and_send_now()
3750
+	{
3751
+		$this->_generate_now();
3752
+		$this->_send_now();
3753
+		$this->_redirect_after_action(false, '', '', array(), true);
3754
+	}
3755
+    
3756
+    
3757
+	/**
3758
+	 * This queues any EEM_Message::status_sent EE_Message ids in the request for resending.
3759
+	 *
3760
+	 * @since 4.9.0
3761
+	 */
3762
+	protected function _queue_for_resending()
3763
+	{
3764
+		$msg_ids = $this->_get_msg_ids_from_request();
3765
+		EED_Messages::queue_for_resending($msg_ids);
3766
+		$this->_redirect_after_action(false, '', '', array(), true);
3767
+	}
3768
+    
3769
+    
3770
+	/**
3771
+	 *  This sends immediately any EEM_Message::status_idle or EEM_Message::status_resend messages in the queue
3772
+	 *
3773
+	 * @since 4.9.0
3774
+	 */
3775
+	protected function _send_now()
3776
+	{
3777
+		$msg_ids = $this->_get_msg_ids_from_request();
3778
+		EED_Messages::send_now($msg_ids);
3779
+		$this->_redirect_after_action(false, '', '', array(), true);
3780
+	}
3781
+    
3782
+    
3783
+	/**
3784
+	 * Deletes EE_messages for IDs in the request.
3785
+	 *
3786
+	 * @since 4.9.0
3787
+	 */
3788
+	protected function _delete_ee_messages()
3789
+	{
3790
+		$msg_ids       = $this->_get_msg_ids_from_request();
3791
+		$deleted_count = 0;
3792
+		foreach ($msg_ids as $msg_id) {
3793
+			if (EEM_Message::instance()->delete_by_ID($msg_id)) {
3794
+				$deleted_count++;
3795
+			}
3796
+		}
3797
+		if ($deleted_count) {
3798
+			$this->_redirect_after_action(
3799
+				true,
3800
+				_n('message', 'messages', $deleted_count, 'event_espresso'),
3801
+				__('deleted', 'event_espresso')
3802
+			);
3803
+		} else {
3804
+			EE_Error::add_error(
3805
+				_n('The message was not deleted.', 'The messages were not deleted', count($msg_ids), 'event_espresso'),
3806
+				__FILE__, __FUNCTION__, __LINE__
3807
+			);
3808
+			$this->_redirect_after_action(false, '', '', array(), true);
3809
+		}
3810
+	}
3811
+    
3812
+    
3813
+	/**
3814
+	 *  This looks for 'MSG_ID' key in the request and returns an array of MSG_ID's if present.
3815
+	 * @since 4.9.0
3816
+	 * @return array
3817
+	 */
3818
+	protected function _get_msg_ids_from_request()
3819
+	{
3820
+		if ( ! isset($this->_req_data['MSG_ID'])) {
3821
+			return array();
3822
+		}
3823
+        
3824
+		return is_array($this->_req_data['MSG_ID']) ? array_keys($this->_req_data['MSG_ID']) : array($this->_req_data['MSG_ID']);
3825
+	}
3826 3826
     
3827 3827
     
3828 3828
 }
Please login to merge, or discard this patch.
core/domain/DomainBase.php 2 patches
Indentation   +127 added lines, -127 removed lines patch added patch discarded remove patch
@@ -18,132 +18,132 @@
 block discarded – undo
18 18
 abstract class DomainBase
19 19
 {
20 20
 
21
-    /**
22
-     * Equivalent to `__FILE__` for main plugin file.
23
-     *
24
-     * @var string
25
-     */
26
-    private static $plugin_file = '';
27
-
28
-    /**
29
-     * String indicating version for plugin
30
-     *
31
-     * @var string
32
-     */
33
-    private static $version = '';
34
-
35
-    /**
36
-     * @var string $plugin_basename
37
-     */
38
-    private static $plugin_basename = '';
39
-
40
-    /**
41
-     * @var string $plugin_path
42
-     */
43
-    private static $plugin_path = '';
44
-
45
-    /**
46
-     * @var string $plugin_url
47
-     */
48
-    private static $plugin_url = '';
49
-
50
-
51
-
52
-    /**
53
-     * Initializes internal static properties.
54
-     *
55
-     * @param string $plugin_file
56
-     * @param string $version
57
-     */
58
-    public static function init($plugin_file, $version)
59
-    {
60
-        self::$plugin_file = $plugin_file;
61
-        self::$version = $version;
62
-        self::$plugin_basename = plugin_basename($plugin_file);
63
-        self::$plugin_path = plugin_dir_path($plugin_file);
64
-        self::$plugin_url = plugin_dir_url($plugin_file);
65
-    }
66
-
67
-
68
-
69
-    /**
70
-     * @return string
71
-     * @throws DomainException
72
-     */
73
-    public static function pluginFile()
74
-    {
75
-        self::verifyInitialized(__METHOD__);
76
-        return self::$plugin_file;
77
-    }
78
-
79
-
80
-
81
-    /**
82
-     * @return string
83
-     * @throws DomainException
84
-     */
85
-    public static function pluginBasename()
86
-    {
87
-        self::verifyInitialized(__METHOD__);
88
-        return self::$plugin_basename;
89
-    }
90
-
91
-
92
-
93
-    /**
94
-     * @return string
95
-     * @throws DomainException
96
-     */
97
-    public static function pluginPath()
98
-    {
99
-        self::verifyInitialized(__METHOD__);
100
-        return self::$plugin_path;
101
-    }
102
-
103
-
104
-
105
-    /**
106
-     * @return string
107
-     * @throws DomainException
108
-     */
109
-    public static function pluginUrl()
110
-    {
111
-        self::verifyInitialized(__METHOD__);
112
-        return self::$plugin_url;
113
-    }
114
-
115
-
116
-
117
-    /**
118
-     * @return string
119
-     * @throws DomainException
120
-     */
121
-    public static function version()
122
-    {
123
-        self::verifyInitialized(__METHOD__);
124
-        return self::$version;
125
-    }
126
-
127
-
128
-
129
-    /**
130
-     * @param string $method
131
-     * @throws DomainException
132
-     */
133
-    private static function verifyInitialized($method)
134
-    {
135
-        if (self::$plugin_file === '') {
136
-            throw new DomainException(
137
-                sprintf(
138
-                    esc_html__(
139
-                        '%1$s needs to be called before %2$s can return a value.',
140
-                        'event_espresso'
141
-                    ),
142
-                    get_called_class() . '::init()',
143
-                    "{$method}()"
144
-                )
145
-            );
146
-        }
147
-    }
21
+	/**
22
+	 * Equivalent to `__FILE__` for main plugin file.
23
+	 *
24
+	 * @var string
25
+	 */
26
+	private static $plugin_file = '';
27
+
28
+	/**
29
+	 * String indicating version for plugin
30
+	 *
31
+	 * @var string
32
+	 */
33
+	private static $version = '';
34
+
35
+	/**
36
+	 * @var string $plugin_basename
37
+	 */
38
+	private static $plugin_basename = '';
39
+
40
+	/**
41
+	 * @var string $plugin_path
42
+	 */
43
+	private static $plugin_path = '';
44
+
45
+	/**
46
+	 * @var string $plugin_url
47
+	 */
48
+	private static $plugin_url = '';
49
+
50
+
51
+
52
+	/**
53
+	 * Initializes internal static properties.
54
+	 *
55
+	 * @param string $plugin_file
56
+	 * @param string $version
57
+	 */
58
+	public static function init($plugin_file, $version)
59
+	{
60
+		self::$plugin_file = $plugin_file;
61
+		self::$version = $version;
62
+		self::$plugin_basename = plugin_basename($plugin_file);
63
+		self::$plugin_path = plugin_dir_path($plugin_file);
64
+		self::$plugin_url = plugin_dir_url($plugin_file);
65
+	}
66
+
67
+
68
+
69
+	/**
70
+	 * @return string
71
+	 * @throws DomainException
72
+	 */
73
+	public static function pluginFile()
74
+	{
75
+		self::verifyInitialized(__METHOD__);
76
+		return self::$plugin_file;
77
+	}
78
+
79
+
80
+
81
+	/**
82
+	 * @return string
83
+	 * @throws DomainException
84
+	 */
85
+	public static function pluginBasename()
86
+	{
87
+		self::verifyInitialized(__METHOD__);
88
+		return self::$plugin_basename;
89
+	}
90
+
91
+
92
+
93
+	/**
94
+	 * @return string
95
+	 * @throws DomainException
96
+	 */
97
+	public static function pluginPath()
98
+	{
99
+		self::verifyInitialized(__METHOD__);
100
+		return self::$plugin_path;
101
+	}
102
+
103
+
104
+
105
+	/**
106
+	 * @return string
107
+	 * @throws DomainException
108
+	 */
109
+	public static function pluginUrl()
110
+	{
111
+		self::verifyInitialized(__METHOD__);
112
+		return self::$plugin_url;
113
+	}
114
+
115
+
116
+
117
+	/**
118
+	 * @return string
119
+	 * @throws DomainException
120
+	 */
121
+	public static function version()
122
+	{
123
+		self::verifyInitialized(__METHOD__);
124
+		return self::$version;
125
+	}
126
+
127
+
128
+
129
+	/**
130
+	 * @param string $method
131
+	 * @throws DomainException
132
+	 */
133
+	private static function verifyInitialized($method)
134
+	{
135
+		if (self::$plugin_file === '') {
136
+			throw new DomainException(
137
+				sprintf(
138
+					esc_html__(
139
+						'%1$s needs to be called before %2$s can return a value.',
140
+						'event_espresso'
141
+					),
142
+					get_called_class() . '::init()',
143
+					"{$method}()"
144
+				)
145
+			);
146
+		}
147
+	}
148 148
 
149 149
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -139,7 +139,7 @@
 block discarded – undo
139 139
                         '%1$s needs to be called before %2$s can return a value.',
140 140
                         'event_espresso'
141 141
                     ),
142
-                    get_called_class() . '::init()',
142
+                    get_called_class().'::init()',
143 143
                     "{$method}()"
144 144
                 )
145 145
             );
Please login to merge, or discard this patch.
core/libraries/form_sections/form_handlers/FormHandler.php 2 patches
Indentation   +637 added lines, -637 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
 use EventEspresso\core\exceptions\InvalidFormSubmissionException;
16 16
 
17 17
 if (! defined('EVENT_ESPRESSO_VERSION')) {
18
-    exit('No direct script access allowed');
18
+	exit('No direct script access allowed');
19 19
 }
20 20
 
21 21
 
@@ -34,642 +34,642 @@  discard block
 block discarded – undo
34 34
 abstract class FormHandler implements FormHandlerInterface
35 35
 {
36 36
 
37
-    /**
38
-     * will add opening and closing HTML form tags as well as a submit button
39
-     */
40
-    const ADD_FORM_TAGS_AND_SUBMIT = 'add_form_tags_and_submit';
41
-
42
-    /**
43
-     * will add opening and closing HTML form tags but NOT a submit button
44
-     */
45
-    const ADD_FORM_TAGS_ONLY = 'add_form_tags_only';
46
-
47
-    /**
48
-     * will NOT add opening and closing HTML form tags but will add a submit button
49
-     */
50
-    const ADD_FORM_SUBMIT_ONLY = 'add_form_submit_only';
51
-
52
-    /**
53
-     * will NOT add opening and closing HTML form tags NOR a submit button
54
-     */
55
-    const DO_NOT_SETUP_FORM = 'do_not_setup_form';
56
-
57
-    /**
58
-     * if set to false, then this form has no displayable content,
59
-     * and will only be used for processing data sent passed via GET or POST
60
-     * defaults to true ( ie: form has displayable content )
61
-     *
62
-     * @var boolean $displayable
63
-     */
64
-    private $displayable = true;
65
-
66
-    /**
67
-     * @var string $form_name
68
-     */
69
-    private $form_name;
70
-
71
-    /**
72
-     * @var string $admin_name
73
-     */
74
-    private $admin_name;
75
-
76
-    /**
77
-     * @var string $slug
78
-     */
79
-    private $slug;
80
-
81
-    /**
82
-     * @var string $submit_btn_text
83
-     */
84
-    private $submit_btn_text;
85
-
86
-    /**
87
-     * @var string $form_action
88
-     */
89
-    private $form_action;
90
-
91
-    /**
92
-     * form params in key value pairs
93
-     * can be added to form action URL or as hidden inputs
94
-     *
95
-     * @var array $form_args
96
-     */
97
-    private $form_args = array();
98
-
99
-    /**
100
-     * value of one of the string constant above
101
-     *
102
-     * @var string $form_config
103
-     */
104
-    private $form_config;
105
-
106
-    /**
107
-     * whether or not the form was determined to be invalid
108
-     *
109
-     * @var boolean $form_has_errors
110
-     */
111
-    private $form_has_errors;
112
-
113
-    /**
114
-     * the absolute top level form section being used on the page
115
-     *
116
-     * @var EE_Form_Section_Proper $form
117
-     */
118
-    private $form;
119
-
120
-    /**
121
-     * @var EE_Registry $registry
122
-     */
123
-    protected $registry;
124
-
125
-
126
-
127
-    /**
128
-     * Form constructor.
129
-     *
130
-     * @param string      $form_name
131
-     * @param string      $admin_name
132
-     * @param string      $slug
133
-     * @param string      $form_action
134
-     * @param string      $form_config
135
-     * @param EE_Registry $registry
136
-     * @throws InvalidDataTypeException
137
-     * @throws DomainException
138
-     * @throws InvalidArgumentException
139
-     */
140
-    public function __construct(
141
-        $form_name,
142
-        $admin_name,
143
-        $slug,
144
-        $form_action = '',
145
-        $form_config = FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
146
-        EE_Registry $registry
147
-    ) {
148
-        $this->setFormName($form_name);
149
-        $this->setAdminName($admin_name);
150
-        $this->setSlug($slug);
151
-        $this->setFormAction($form_action);
152
-        $this->setFormConfig($form_config);
153
-        $this->setSubmitBtnText(esc_html__('Submit', 'event_espresso'));
154
-        $this->registry = $registry;
155
-    }
156
-
157
-
158
-
159
-    /**
160
-     * @return array
161
-     */
162
-    public static function getFormConfigConstants()
163
-    {
164
-        return array(
165
-            FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
166
-            FormHandler::ADD_FORM_TAGS_ONLY,
167
-            FormHandler::ADD_FORM_SUBMIT_ONLY,
168
-            FormHandler::DO_NOT_SETUP_FORM,
169
-        );
170
-    }
171
-
172
-
173
-
174
-    /**
175
-     * @param bool $for_display
176
-     * @return EE_Form_Section_Proper
177
-     * @throws EE_Error
178
-     * @throws LogicException
179
-     */
180
-    public function form($for_display = false)
181
-    {
182
-        if (! $this->formIsValid()) {
183
-            return null;
184
-        }
185
-        if ($for_display) {
186
-            $form_config = $this->formConfig();
187
-            if (
188
-                $form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
189
-                || $form_config === FormHandler::ADD_FORM_SUBMIT_ONLY
190
-            ) {
191
-                $this->appendSubmitButton();
192
-                $this->clearFormButtonFloats();
193
-            }
194
-        }
195
-        return $this->form;
196
-    }
197
-
198
-
199
-
200
-    /**
201
-     * @return boolean
202
-     * @throws LogicException
203
-     */
204
-    public function formIsValid()
205
-    {
206
-        if (! $this->form instanceof EE_Form_Section_Proper) {
207
-            static $generated = false;
208
-            if (! $generated) {
209
-                $generated = true;
210
-                $form = apply_filters(
211
-                    'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__formIsValid__generated_form_object',
212
-                    $this->generate(),
213
-                    $this
214
-                );
215
-                if ($form instanceof EE_Form_Section_Proper) {
216
-                    $this->setForm($form);
217
-                }
218
-            }
219
-            return $this->verifyForm();
220
-        }
221
-        return true;
222
-    }
223
-
224
-
225
-
226
-    /**
227
-     * @return boolean
228
-     * @throws LogicException
229
-     */
230
-    public function verifyForm()
231
-    {
232
-        if ($this->form instanceof EE_Form_Section_Proper) {
233
-            return true;
234
-        }
235
-        throw new LogicException(
236
-            sprintf(
237
-                esc_html__('The "%1$s" form is invalid or missing', 'event_espresso'),
238
-                $this->form_name
239
-            )
240
-        );
241
-    }
242
-
243
-
244
-
245
-    /**
246
-     * @param EE_Form_Section_Proper $form
247
-     */
248
-    public function setForm(EE_Form_Section_Proper $form)
249
-    {
250
-        $this->form = $form;
251
-    }
252
-
253
-
254
-
255
-    /**
256
-     * @return boolean
257
-     */
258
-    public function displayable()
259
-    {
260
-        return $this->displayable;
261
-    }
262
-
263
-
264
-
265
-    /**
266
-     * @param boolean $displayable
267
-     */
268
-    public function setDisplayable($displayable = false)
269
-    {
270
-        $this->displayable = filter_var($displayable, FILTER_VALIDATE_BOOLEAN);
271
-    }
272
-
273
-
274
-
275
-    /**
276
-     * a public name for the form that can be displayed on the frontend of a site
277
-     *
278
-     * @return string
279
-     */
280
-    public function formName()
281
-    {
282
-        return $this->form_name;
283
-    }
284
-
285
-
286
-
287
-    /**
288
-     * @param string $form_name
289
-     * @throws InvalidDataTypeException
290
-     */
291
-    public function setFormName($form_name)
292
-    {
293
-        if (! is_string($form_name)) {
294
-            throw new InvalidDataTypeException('$form_name', $form_name, 'string');
295
-        }
296
-        $this->form_name = $form_name;
297
-    }
298
-
299
-
300
-
301
-    /**
302
-     * a public name for the form that can be displayed, but only in the admin
303
-     *
304
-     * @return string
305
-     */
306
-    public function adminName()
307
-    {
308
-        return $this->admin_name;
309
-    }
310
-
311
-
312
-
313
-    /**
314
-     * @param string $admin_name
315
-     * @throws InvalidDataTypeException
316
-     */
317
-    public function setAdminName($admin_name)
318
-    {
319
-        if (! is_string($admin_name)) {
320
-            throw new InvalidDataTypeException('$admin_name', $admin_name, 'string');
321
-        }
322
-        $this->admin_name = $admin_name;
323
-    }
324
-
325
-
326
-
327
-    /**
328
-     * a URL friendly string that can be used for identifying the form
329
-     *
330
-     * @return string
331
-     */
332
-    public function slug()
333
-    {
334
-        return $this->slug;
335
-    }
336
-
337
-
338
-
339
-    /**
340
-     * @param string $slug
341
-     * @throws InvalidDataTypeException
342
-     */
343
-    public function setSlug($slug)
344
-    {
345
-        if (! is_string($slug)) {
346
-            throw new InvalidDataTypeException('$slug', $slug, 'string');
347
-        }
348
-        $this->slug = $slug;
349
-    }
350
-
351
-
352
-
353
-    /**
354
-     * @return string
355
-     */
356
-    public function submitBtnText()
357
-    {
358
-        return $this->submit_btn_text;
359
-    }
360
-
361
-
362
-
363
-    /**
364
-     * @param string $submit_btn_text
365
-     * @throws InvalidDataTypeException
366
-     * @throws InvalidArgumentException
367
-     */
368
-    public function setSubmitBtnText($submit_btn_text)
369
-    {
370
-        if (! is_string($submit_btn_text)) {
371
-            throw new InvalidDataTypeException('$submit_btn_text', $submit_btn_text, 'string');
372
-        }
373
-        if (empty($submit_btn_text)) {
374
-            throw new InvalidArgumentException(
375
-                esc_html__('Can not set Submit button text because an empty string was provided.', 'event_espresso')
376
-            );
377
-        }
378
-        $this->submit_btn_text = $submit_btn_text;
379
-    }
380
-
381
-
382
-
383
-    /**
384
-     * @return string
385
-     */
386
-    public function formAction()
387
-    {
388
-        return ! empty($this->form_args)
389
-            ? add_query_arg($this->form_args, $this->form_action)
390
-            : $this->form_action;
391
-    }
392
-
393
-
394
-
395
-    /**
396
-     * @param string $form_action
397
-     * @throws InvalidDataTypeException
398
-     */
399
-    public function setFormAction($form_action)
400
-    {
401
-        if (! is_string($form_action)) {
402
-            throw new InvalidDataTypeException('$form_action', $form_action, 'string');
403
-        }
404
-        $this->form_action = $form_action;
405
-    }
406
-
407
-
408
-
409
-    /**
410
-     * @param array $form_args
411
-     * @throws InvalidDataTypeException
412
-     * @throws InvalidArgumentException
413
-     */
414
-    public function addFormActionArgs($form_args = array())
415
-    {
416
-        if (is_object($form_args)) {
417
-            throw new InvalidDataTypeException(
418
-                '$form_args',
419
-                $form_args,
420
-                'anything other than an object was expected.'
421
-            );
422
-        }
423
-        if (empty($form_args)) {
424
-            throw new InvalidArgumentException(
425
-                esc_html__('The redirect arguments can not be an empty array.', 'event_espresso')
426
-            );
427
-        }
428
-        $this->form_args = array_merge($this->form_args, $form_args);
429
-    }
430
-
431
-
432
-
433
-    /**
434
-     * @return string
435
-     */
436
-    public function formConfig()
437
-    {
438
-        return $this->form_config;
439
-    }
440
-
441
-
442
-
443
-    /**
444
-     * @param string $form_config
445
-     * @throws DomainException
446
-     */
447
-    public function setFormConfig($form_config)
448
-    {
449
-        if (
450
-        ! in_array(
451
-            $form_config,
452
-            array(
453
-                FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
454
-                FormHandler::ADD_FORM_TAGS_ONLY,
455
-                FormHandler::ADD_FORM_SUBMIT_ONLY,
456
-                FormHandler::DO_NOT_SETUP_FORM,
457
-            ),
458
-            true
459
-        )
460
-        ) {
461
-            throw new DomainException(
462
-                sprintf(
463
-                    esc_html__('"%1$s" is not a valid value for the form config. Please use one of the class constants on \EventEspresso\core\libraries\form_sections\form_handlers\Form',
464
-                        'event_espresso'),
465
-                    $form_config
466
-                )
467
-            );
468
-        }
469
-        $this->form_config = $form_config;
470
-    }
471
-
472
-
473
-
474
-    /**
475
-     * called after the form is instantiated
476
-     * and used for performing any logic that needs to occur early
477
-     * before any of the other methods are called.
478
-     * returns true if everything is ok to proceed,
479
-     * and false if no further form logic should be implemented
480
-     *
481
-     * @return boolean
482
-     */
483
-    public function initialize()
484
-    {
485
-        $this->form_has_errors = EE_Error::has_error(true);
486
-        return true;
487
-    }
488
-
489
-
490
-
491
-    /**
492
-     * used for setting up css and js
493
-     *
494
-     * @return void
495
-     * @throws LogicException
496
-     * @throws EE_Error
497
-     */
498
-    public function enqueueStylesAndScripts()
499
-    {
500
-        $this->form(false)->enqueue_js();
501
-    }
502
-
503
-
504
-
505
-    /**
506
-     * creates and returns the actual form
507
-     *
508
-     * @return EE_Form_Section_Proper
509
-     */
510
-    abstract public function generate();
511
-
512
-
513
-
514
-    /**
515
-     * creates and returns an EE_Submit_Input labeled "Submit"
516
-     *
517
-     * @param string $text
518
-     * @return EE_Submit_Input
519
-     */
520
-    public function generateSubmitButton($text = '')
521
-    {
522
-        $text = ! empty($text) ? $text : $this->submitBtnText();
523
-        return new EE_Submit_Input(
524
-            array(
525
-                'html_name'             => 'ee-form-submit-' . $this->slug(),
526
-                'html_id'               => 'ee-form-submit-' . $this->slug(),
527
-                'html_class'            => 'ee-form-submit',
528
-                'html_label'            => '&nbsp;',
529
-                'other_html_attributes' => ' rel="' . $this->slug() . '"',
530
-                'default'               => $text,
531
-            )
532
-        );
533
-    }
534
-
535
-
536
-
537
-    /**
538
-     * calls generateSubmitButton() and appends it onto the form along with a float clearing div
539
-     *
540
-     * @param string $text
541
-     * @return void
542
-     * @throws LogicException
543
-     * @throws EE_Error
544
-     */
545
-    public function appendSubmitButton($text = '')
546
-    {
547
-        if ($this->form->subsection_exists($this->slug() . '-submit-btn')) {
548
-            return;
549
-        }
550
-        $this->form->add_subsections(
551
-            array($this->slug() . '-submit-btn' => $this->generateSubmitButton($text)),
552
-            null,
553
-            false
554
-        );
555
-    }
556
-
557
-
558
-
559
-    /**
560
-     * creates and returns an EE_Submit_Input labeled "Cancel"
561
-     *
562
-     * @param string $text
563
-     * @return EE_Submit_Input
564
-     */
565
-    public function generateCancelButton($text = '')
566
-    {
567
-        $cancel_button = new EE_Submit_Input(
568
-            array(
569
-                'html_name'             => 'ee-form-submit-' . $this->slug(), // YES! Same name as submit !!!
570
-                'html_id'               => 'ee-cancel-form-' . $this->slug(),
571
-                'html_class'            => 'ee-cancel-form',
572
-                'html_label'            => '&nbsp;',
573
-                'other_html_attributes' => ' rel="' . $this->slug() . '"',
574
-                'default'               => ! empty($text) ? $text : esc_html__('Cancel', 'event_espresso'),
575
-            )
576
-        );
577
-        $cancel_button->set_button_css_attributes(false);
578
-        return $cancel_button;
579
-    }
580
-
581
-
582
-
583
-    /**
584
-     * appends a float clearing div onto end of form
585
-     *
586
-     * @return void
587
-     * @throws EE_Error
588
-     */
589
-    public function clearFormButtonFloats()
590
-    {
591
-        $this->form->add_subsections(
592
-            array(
593
-                'clear-submit-btn-float' => new EE_Form_Section_HTML(
594
-                    EEH_HTML::div('', '', 'clear-float') . EEH_HTML::divx()
595
-                ),
596
-            ),
597
-            null,
598
-            false
599
-        );
600
-    }
601
-
602
-
603
-
604
-    /**
605
-     * takes the generated form and displays it along with ony other non-form HTML that may be required
606
-     * returns a string of HTML that can be directly echoed in a template
607
-     *
608
-     * @return string
609
-     * @throws LogicException
610
-     * @throws EE_Error
611
-     */
612
-    public function display()
613
-    {
614
-        $form_html = apply_filters(
615
-            'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__display__before_form',
616
-            ''
617
-        );
618
-        $form_config = $this->formConfig();
619
-        if (
620
-            $form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
621
-            || $form_config === FormHandler::ADD_FORM_TAGS_ONLY
622
-        ) {
623
-            $form_html .= $this->form()->form_open($this->formAction());
624
-        }
625
-        $form_html .= $this->form(true)->get_html($this->form_has_errors);
626
-        if (
627
-            $form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
628
-            || $form_config === FormHandler::ADD_FORM_TAGS_ONLY
629
-        ) {
630
-            $form_html .= $this->form()->form_close();
631
-        }
632
-        $form_html .= apply_filters(
633
-            'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__display__after_form',
634
-            ''
635
-        );
636
-        return $form_html;
637
-    }
638
-
639
-
640
-
641
-    /**
642
-     * handles processing the form submission
643
-     * returns true or false depending on whether the form was processed successfully or not
644
-     *
645
-     * @param array $submitted_form_data
646
-     * @return array
647
-     * @throws EE_Error
648
-     * @throws LogicException
649
-     * @throws InvalidFormSubmissionException
650
-     */
651
-    public function process($submitted_form_data = array())
652
-    {
653
-        if (! $this->form()->was_submitted($submitted_form_data)) {
654
-            throw new InvalidFormSubmissionException($this->form_name);
655
-        }
656
-        $this->form(true)->receive_form_submission($submitted_form_data);
657
-        if (! $this->form()->is_valid()) {
658
-            throw new InvalidFormSubmissionException(
659
-                $this->form_name,
660
-                sprintf(
661
-                    esc_html__(
662
-                        'The "%1$s" form is invalid. Please correct the following errors and resubmit: %2$s %3$s',
663
-                        'event_espresso'
664
-                    ),
665
-                    $this->form_name,
666
-                    '<br />',
667
-                    $this->form()->submission_error_message()
668
-                )
669
-            );
670
-        }
671
-        return $this->form()->valid_data();
672
-    }
37
+	/**
38
+	 * will add opening and closing HTML form tags as well as a submit button
39
+	 */
40
+	const ADD_FORM_TAGS_AND_SUBMIT = 'add_form_tags_and_submit';
41
+
42
+	/**
43
+	 * will add opening and closing HTML form tags but NOT a submit button
44
+	 */
45
+	const ADD_FORM_TAGS_ONLY = 'add_form_tags_only';
46
+
47
+	/**
48
+	 * will NOT add opening and closing HTML form tags but will add a submit button
49
+	 */
50
+	const ADD_FORM_SUBMIT_ONLY = 'add_form_submit_only';
51
+
52
+	/**
53
+	 * will NOT add opening and closing HTML form tags NOR a submit button
54
+	 */
55
+	const DO_NOT_SETUP_FORM = 'do_not_setup_form';
56
+
57
+	/**
58
+	 * if set to false, then this form has no displayable content,
59
+	 * and will only be used for processing data sent passed via GET or POST
60
+	 * defaults to true ( ie: form has displayable content )
61
+	 *
62
+	 * @var boolean $displayable
63
+	 */
64
+	private $displayable = true;
65
+
66
+	/**
67
+	 * @var string $form_name
68
+	 */
69
+	private $form_name;
70
+
71
+	/**
72
+	 * @var string $admin_name
73
+	 */
74
+	private $admin_name;
75
+
76
+	/**
77
+	 * @var string $slug
78
+	 */
79
+	private $slug;
80
+
81
+	/**
82
+	 * @var string $submit_btn_text
83
+	 */
84
+	private $submit_btn_text;
85
+
86
+	/**
87
+	 * @var string $form_action
88
+	 */
89
+	private $form_action;
90
+
91
+	/**
92
+	 * form params in key value pairs
93
+	 * can be added to form action URL or as hidden inputs
94
+	 *
95
+	 * @var array $form_args
96
+	 */
97
+	private $form_args = array();
98
+
99
+	/**
100
+	 * value of one of the string constant above
101
+	 *
102
+	 * @var string $form_config
103
+	 */
104
+	private $form_config;
105
+
106
+	/**
107
+	 * whether or not the form was determined to be invalid
108
+	 *
109
+	 * @var boolean $form_has_errors
110
+	 */
111
+	private $form_has_errors;
112
+
113
+	/**
114
+	 * the absolute top level form section being used on the page
115
+	 *
116
+	 * @var EE_Form_Section_Proper $form
117
+	 */
118
+	private $form;
119
+
120
+	/**
121
+	 * @var EE_Registry $registry
122
+	 */
123
+	protected $registry;
124
+
125
+
126
+
127
+	/**
128
+	 * Form constructor.
129
+	 *
130
+	 * @param string      $form_name
131
+	 * @param string      $admin_name
132
+	 * @param string      $slug
133
+	 * @param string      $form_action
134
+	 * @param string      $form_config
135
+	 * @param EE_Registry $registry
136
+	 * @throws InvalidDataTypeException
137
+	 * @throws DomainException
138
+	 * @throws InvalidArgumentException
139
+	 */
140
+	public function __construct(
141
+		$form_name,
142
+		$admin_name,
143
+		$slug,
144
+		$form_action = '',
145
+		$form_config = FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
146
+		EE_Registry $registry
147
+	) {
148
+		$this->setFormName($form_name);
149
+		$this->setAdminName($admin_name);
150
+		$this->setSlug($slug);
151
+		$this->setFormAction($form_action);
152
+		$this->setFormConfig($form_config);
153
+		$this->setSubmitBtnText(esc_html__('Submit', 'event_espresso'));
154
+		$this->registry = $registry;
155
+	}
156
+
157
+
158
+
159
+	/**
160
+	 * @return array
161
+	 */
162
+	public static function getFormConfigConstants()
163
+	{
164
+		return array(
165
+			FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
166
+			FormHandler::ADD_FORM_TAGS_ONLY,
167
+			FormHandler::ADD_FORM_SUBMIT_ONLY,
168
+			FormHandler::DO_NOT_SETUP_FORM,
169
+		);
170
+	}
171
+
172
+
173
+
174
+	/**
175
+	 * @param bool $for_display
176
+	 * @return EE_Form_Section_Proper
177
+	 * @throws EE_Error
178
+	 * @throws LogicException
179
+	 */
180
+	public function form($for_display = false)
181
+	{
182
+		if (! $this->formIsValid()) {
183
+			return null;
184
+		}
185
+		if ($for_display) {
186
+			$form_config = $this->formConfig();
187
+			if (
188
+				$form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
189
+				|| $form_config === FormHandler::ADD_FORM_SUBMIT_ONLY
190
+			) {
191
+				$this->appendSubmitButton();
192
+				$this->clearFormButtonFloats();
193
+			}
194
+		}
195
+		return $this->form;
196
+	}
197
+
198
+
199
+
200
+	/**
201
+	 * @return boolean
202
+	 * @throws LogicException
203
+	 */
204
+	public function formIsValid()
205
+	{
206
+		if (! $this->form instanceof EE_Form_Section_Proper) {
207
+			static $generated = false;
208
+			if (! $generated) {
209
+				$generated = true;
210
+				$form = apply_filters(
211
+					'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__formIsValid__generated_form_object',
212
+					$this->generate(),
213
+					$this
214
+				);
215
+				if ($form instanceof EE_Form_Section_Proper) {
216
+					$this->setForm($form);
217
+				}
218
+			}
219
+			return $this->verifyForm();
220
+		}
221
+		return true;
222
+	}
223
+
224
+
225
+
226
+	/**
227
+	 * @return boolean
228
+	 * @throws LogicException
229
+	 */
230
+	public function verifyForm()
231
+	{
232
+		if ($this->form instanceof EE_Form_Section_Proper) {
233
+			return true;
234
+		}
235
+		throw new LogicException(
236
+			sprintf(
237
+				esc_html__('The "%1$s" form is invalid or missing', 'event_espresso'),
238
+				$this->form_name
239
+			)
240
+		);
241
+	}
242
+
243
+
244
+
245
+	/**
246
+	 * @param EE_Form_Section_Proper $form
247
+	 */
248
+	public function setForm(EE_Form_Section_Proper $form)
249
+	{
250
+		$this->form = $form;
251
+	}
252
+
253
+
254
+
255
+	/**
256
+	 * @return boolean
257
+	 */
258
+	public function displayable()
259
+	{
260
+		return $this->displayable;
261
+	}
262
+
263
+
264
+
265
+	/**
266
+	 * @param boolean $displayable
267
+	 */
268
+	public function setDisplayable($displayable = false)
269
+	{
270
+		$this->displayable = filter_var($displayable, FILTER_VALIDATE_BOOLEAN);
271
+	}
272
+
273
+
274
+
275
+	/**
276
+	 * a public name for the form that can be displayed on the frontend of a site
277
+	 *
278
+	 * @return string
279
+	 */
280
+	public function formName()
281
+	{
282
+		return $this->form_name;
283
+	}
284
+
285
+
286
+
287
+	/**
288
+	 * @param string $form_name
289
+	 * @throws InvalidDataTypeException
290
+	 */
291
+	public function setFormName($form_name)
292
+	{
293
+		if (! is_string($form_name)) {
294
+			throw new InvalidDataTypeException('$form_name', $form_name, 'string');
295
+		}
296
+		$this->form_name = $form_name;
297
+	}
298
+
299
+
300
+
301
+	/**
302
+	 * a public name for the form that can be displayed, but only in the admin
303
+	 *
304
+	 * @return string
305
+	 */
306
+	public function adminName()
307
+	{
308
+		return $this->admin_name;
309
+	}
310
+
311
+
312
+
313
+	/**
314
+	 * @param string $admin_name
315
+	 * @throws InvalidDataTypeException
316
+	 */
317
+	public function setAdminName($admin_name)
318
+	{
319
+		if (! is_string($admin_name)) {
320
+			throw new InvalidDataTypeException('$admin_name', $admin_name, 'string');
321
+		}
322
+		$this->admin_name = $admin_name;
323
+	}
324
+
325
+
326
+
327
+	/**
328
+	 * a URL friendly string that can be used for identifying the form
329
+	 *
330
+	 * @return string
331
+	 */
332
+	public function slug()
333
+	{
334
+		return $this->slug;
335
+	}
336
+
337
+
338
+
339
+	/**
340
+	 * @param string $slug
341
+	 * @throws InvalidDataTypeException
342
+	 */
343
+	public function setSlug($slug)
344
+	{
345
+		if (! is_string($slug)) {
346
+			throw new InvalidDataTypeException('$slug', $slug, 'string');
347
+		}
348
+		$this->slug = $slug;
349
+	}
350
+
351
+
352
+
353
+	/**
354
+	 * @return string
355
+	 */
356
+	public function submitBtnText()
357
+	{
358
+		return $this->submit_btn_text;
359
+	}
360
+
361
+
362
+
363
+	/**
364
+	 * @param string $submit_btn_text
365
+	 * @throws InvalidDataTypeException
366
+	 * @throws InvalidArgumentException
367
+	 */
368
+	public function setSubmitBtnText($submit_btn_text)
369
+	{
370
+		if (! is_string($submit_btn_text)) {
371
+			throw new InvalidDataTypeException('$submit_btn_text', $submit_btn_text, 'string');
372
+		}
373
+		if (empty($submit_btn_text)) {
374
+			throw new InvalidArgumentException(
375
+				esc_html__('Can not set Submit button text because an empty string was provided.', 'event_espresso')
376
+			);
377
+		}
378
+		$this->submit_btn_text = $submit_btn_text;
379
+	}
380
+
381
+
382
+
383
+	/**
384
+	 * @return string
385
+	 */
386
+	public function formAction()
387
+	{
388
+		return ! empty($this->form_args)
389
+			? add_query_arg($this->form_args, $this->form_action)
390
+			: $this->form_action;
391
+	}
392
+
393
+
394
+
395
+	/**
396
+	 * @param string $form_action
397
+	 * @throws InvalidDataTypeException
398
+	 */
399
+	public function setFormAction($form_action)
400
+	{
401
+		if (! is_string($form_action)) {
402
+			throw new InvalidDataTypeException('$form_action', $form_action, 'string');
403
+		}
404
+		$this->form_action = $form_action;
405
+	}
406
+
407
+
408
+
409
+	/**
410
+	 * @param array $form_args
411
+	 * @throws InvalidDataTypeException
412
+	 * @throws InvalidArgumentException
413
+	 */
414
+	public function addFormActionArgs($form_args = array())
415
+	{
416
+		if (is_object($form_args)) {
417
+			throw new InvalidDataTypeException(
418
+				'$form_args',
419
+				$form_args,
420
+				'anything other than an object was expected.'
421
+			);
422
+		}
423
+		if (empty($form_args)) {
424
+			throw new InvalidArgumentException(
425
+				esc_html__('The redirect arguments can not be an empty array.', 'event_espresso')
426
+			);
427
+		}
428
+		$this->form_args = array_merge($this->form_args, $form_args);
429
+	}
430
+
431
+
432
+
433
+	/**
434
+	 * @return string
435
+	 */
436
+	public function formConfig()
437
+	{
438
+		return $this->form_config;
439
+	}
440
+
441
+
442
+
443
+	/**
444
+	 * @param string $form_config
445
+	 * @throws DomainException
446
+	 */
447
+	public function setFormConfig($form_config)
448
+	{
449
+		if (
450
+		! in_array(
451
+			$form_config,
452
+			array(
453
+				FormHandler::ADD_FORM_TAGS_AND_SUBMIT,
454
+				FormHandler::ADD_FORM_TAGS_ONLY,
455
+				FormHandler::ADD_FORM_SUBMIT_ONLY,
456
+				FormHandler::DO_NOT_SETUP_FORM,
457
+			),
458
+			true
459
+		)
460
+		) {
461
+			throw new DomainException(
462
+				sprintf(
463
+					esc_html__('"%1$s" is not a valid value for the form config. Please use one of the class constants on \EventEspresso\core\libraries\form_sections\form_handlers\Form',
464
+						'event_espresso'),
465
+					$form_config
466
+				)
467
+			);
468
+		}
469
+		$this->form_config = $form_config;
470
+	}
471
+
472
+
473
+
474
+	/**
475
+	 * called after the form is instantiated
476
+	 * and used for performing any logic that needs to occur early
477
+	 * before any of the other methods are called.
478
+	 * returns true if everything is ok to proceed,
479
+	 * and false if no further form logic should be implemented
480
+	 *
481
+	 * @return boolean
482
+	 */
483
+	public function initialize()
484
+	{
485
+		$this->form_has_errors = EE_Error::has_error(true);
486
+		return true;
487
+	}
488
+
489
+
490
+
491
+	/**
492
+	 * used for setting up css and js
493
+	 *
494
+	 * @return void
495
+	 * @throws LogicException
496
+	 * @throws EE_Error
497
+	 */
498
+	public function enqueueStylesAndScripts()
499
+	{
500
+		$this->form(false)->enqueue_js();
501
+	}
502
+
503
+
504
+
505
+	/**
506
+	 * creates and returns the actual form
507
+	 *
508
+	 * @return EE_Form_Section_Proper
509
+	 */
510
+	abstract public function generate();
511
+
512
+
513
+
514
+	/**
515
+	 * creates and returns an EE_Submit_Input labeled "Submit"
516
+	 *
517
+	 * @param string $text
518
+	 * @return EE_Submit_Input
519
+	 */
520
+	public function generateSubmitButton($text = '')
521
+	{
522
+		$text = ! empty($text) ? $text : $this->submitBtnText();
523
+		return new EE_Submit_Input(
524
+			array(
525
+				'html_name'             => 'ee-form-submit-' . $this->slug(),
526
+				'html_id'               => 'ee-form-submit-' . $this->slug(),
527
+				'html_class'            => 'ee-form-submit',
528
+				'html_label'            => '&nbsp;',
529
+				'other_html_attributes' => ' rel="' . $this->slug() . '"',
530
+				'default'               => $text,
531
+			)
532
+		);
533
+	}
534
+
535
+
536
+
537
+	/**
538
+	 * calls generateSubmitButton() and appends it onto the form along with a float clearing div
539
+	 *
540
+	 * @param string $text
541
+	 * @return void
542
+	 * @throws LogicException
543
+	 * @throws EE_Error
544
+	 */
545
+	public function appendSubmitButton($text = '')
546
+	{
547
+		if ($this->form->subsection_exists($this->slug() . '-submit-btn')) {
548
+			return;
549
+		}
550
+		$this->form->add_subsections(
551
+			array($this->slug() . '-submit-btn' => $this->generateSubmitButton($text)),
552
+			null,
553
+			false
554
+		);
555
+	}
556
+
557
+
558
+
559
+	/**
560
+	 * creates and returns an EE_Submit_Input labeled "Cancel"
561
+	 *
562
+	 * @param string $text
563
+	 * @return EE_Submit_Input
564
+	 */
565
+	public function generateCancelButton($text = '')
566
+	{
567
+		$cancel_button = new EE_Submit_Input(
568
+			array(
569
+				'html_name'             => 'ee-form-submit-' . $this->slug(), // YES! Same name as submit !!!
570
+				'html_id'               => 'ee-cancel-form-' . $this->slug(),
571
+				'html_class'            => 'ee-cancel-form',
572
+				'html_label'            => '&nbsp;',
573
+				'other_html_attributes' => ' rel="' . $this->slug() . '"',
574
+				'default'               => ! empty($text) ? $text : esc_html__('Cancel', 'event_espresso'),
575
+			)
576
+		);
577
+		$cancel_button->set_button_css_attributes(false);
578
+		return $cancel_button;
579
+	}
580
+
581
+
582
+
583
+	/**
584
+	 * appends a float clearing div onto end of form
585
+	 *
586
+	 * @return void
587
+	 * @throws EE_Error
588
+	 */
589
+	public function clearFormButtonFloats()
590
+	{
591
+		$this->form->add_subsections(
592
+			array(
593
+				'clear-submit-btn-float' => new EE_Form_Section_HTML(
594
+					EEH_HTML::div('', '', 'clear-float') . EEH_HTML::divx()
595
+				),
596
+			),
597
+			null,
598
+			false
599
+		);
600
+	}
601
+
602
+
603
+
604
+	/**
605
+	 * takes the generated form and displays it along with ony other non-form HTML that may be required
606
+	 * returns a string of HTML that can be directly echoed in a template
607
+	 *
608
+	 * @return string
609
+	 * @throws LogicException
610
+	 * @throws EE_Error
611
+	 */
612
+	public function display()
613
+	{
614
+		$form_html = apply_filters(
615
+			'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__display__before_form',
616
+			''
617
+		);
618
+		$form_config = $this->formConfig();
619
+		if (
620
+			$form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
621
+			|| $form_config === FormHandler::ADD_FORM_TAGS_ONLY
622
+		) {
623
+			$form_html .= $this->form()->form_open($this->formAction());
624
+		}
625
+		$form_html .= $this->form(true)->get_html($this->form_has_errors);
626
+		if (
627
+			$form_config === FormHandler::ADD_FORM_TAGS_AND_SUBMIT
628
+			|| $form_config === FormHandler::ADD_FORM_TAGS_ONLY
629
+		) {
630
+			$form_html .= $this->form()->form_close();
631
+		}
632
+		$form_html .= apply_filters(
633
+			'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__display__after_form',
634
+			''
635
+		);
636
+		return $form_html;
637
+	}
638
+
639
+
640
+
641
+	/**
642
+	 * handles processing the form submission
643
+	 * returns true or false depending on whether the form was processed successfully or not
644
+	 *
645
+	 * @param array $submitted_form_data
646
+	 * @return array
647
+	 * @throws EE_Error
648
+	 * @throws LogicException
649
+	 * @throws InvalidFormSubmissionException
650
+	 */
651
+	public function process($submitted_form_data = array())
652
+	{
653
+		if (! $this->form()->was_submitted($submitted_form_data)) {
654
+			throw new InvalidFormSubmissionException($this->form_name);
655
+		}
656
+		$this->form(true)->receive_form_submission($submitted_form_data);
657
+		if (! $this->form()->is_valid()) {
658
+			throw new InvalidFormSubmissionException(
659
+				$this->form_name,
660
+				sprintf(
661
+					esc_html__(
662
+						'The "%1$s" form is invalid. Please correct the following errors and resubmit: %2$s %3$s',
663
+						'event_espresso'
664
+					),
665
+					$this->form_name,
666
+					'<br />',
667
+					$this->form()->submission_error_message()
668
+				)
669
+			);
670
+		}
671
+		return $this->form()->valid_data();
672
+	}
673 673
 
674 674
 
675 675
 
Please login to merge, or discard this patch.
Spacing   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -14,7 +14,7 @@  discard block
 block discarded – undo
14 14
 use EventEspresso\core\exceptions\InvalidDataTypeException;
15 15
 use EventEspresso\core\exceptions\InvalidFormSubmissionException;
16 16
 
17
-if (! defined('EVENT_ESPRESSO_VERSION')) {
17
+if ( ! defined('EVENT_ESPRESSO_VERSION')) {
18 18
     exit('No direct script access allowed');
19 19
 }
20 20
 
@@ -179,7 +179,7 @@  discard block
 block discarded – undo
179 179
      */
180 180
     public function form($for_display = false)
181 181
     {
182
-        if (! $this->formIsValid()) {
182
+        if ( ! $this->formIsValid()) {
183 183
             return null;
184 184
         }
185 185
         if ($for_display) {
@@ -203,9 +203,9 @@  discard block
 block discarded – undo
203 203
      */
204 204
     public function formIsValid()
205 205
     {
206
-        if (! $this->form instanceof EE_Form_Section_Proper) {
206
+        if ( ! $this->form instanceof EE_Form_Section_Proper) {
207 207
             static $generated = false;
208
-            if (! $generated) {
208
+            if ( ! $generated) {
209 209
                 $generated = true;
210 210
                 $form = apply_filters(
211 211
                     'FHEE__EventEspresso_core_libraries_form_sections_form_handlers_FormHandler__formIsValid__generated_form_object',
@@ -290,7 +290,7 @@  discard block
 block discarded – undo
290 290
      */
291 291
     public function setFormName($form_name)
292 292
     {
293
-        if (! is_string($form_name)) {
293
+        if ( ! is_string($form_name)) {
294 294
             throw new InvalidDataTypeException('$form_name', $form_name, 'string');
295 295
         }
296 296
         $this->form_name = $form_name;
@@ -316,7 +316,7 @@  discard block
 block discarded – undo
316 316
      */
317 317
     public function setAdminName($admin_name)
318 318
     {
319
-        if (! is_string($admin_name)) {
319
+        if ( ! is_string($admin_name)) {
320 320
             throw new InvalidDataTypeException('$admin_name', $admin_name, 'string');
321 321
         }
322 322
         $this->admin_name = $admin_name;
@@ -342,7 +342,7 @@  discard block
 block discarded – undo
342 342
      */
343 343
     public function setSlug($slug)
344 344
     {
345
-        if (! is_string($slug)) {
345
+        if ( ! is_string($slug)) {
346 346
             throw new InvalidDataTypeException('$slug', $slug, 'string');
347 347
         }
348 348
         $this->slug = $slug;
@@ -367,7 +367,7 @@  discard block
 block discarded – undo
367 367
      */
368 368
     public function setSubmitBtnText($submit_btn_text)
369 369
     {
370
-        if (! is_string($submit_btn_text)) {
370
+        if ( ! is_string($submit_btn_text)) {
371 371
             throw new InvalidDataTypeException('$submit_btn_text', $submit_btn_text, 'string');
372 372
         }
373 373
         if (empty($submit_btn_text)) {
@@ -398,7 +398,7 @@  discard block
 block discarded – undo
398 398
      */
399 399
     public function setFormAction($form_action)
400 400
     {
401
-        if (! is_string($form_action)) {
401
+        if ( ! is_string($form_action)) {
402 402
             throw new InvalidDataTypeException('$form_action', $form_action, 'string');
403 403
         }
404 404
         $this->form_action = $form_action;
@@ -522,11 +522,11 @@  discard block
 block discarded – undo
522 522
         $text = ! empty($text) ? $text : $this->submitBtnText();
523 523
         return new EE_Submit_Input(
524 524
             array(
525
-                'html_name'             => 'ee-form-submit-' . $this->slug(),
526
-                'html_id'               => 'ee-form-submit-' . $this->slug(),
525
+                'html_name'             => 'ee-form-submit-'.$this->slug(),
526
+                'html_id'               => 'ee-form-submit-'.$this->slug(),
527 527
                 'html_class'            => 'ee-form-submit',
528 528
                 'html_label'            => '&nbsp;',
529
-                'other_html_attributes' => ' rel="' . $this->slug() . '"',
529
+                'other_html_attributes' => ' rel="'.$this->slug().'"',
530 530
                 'default'               => $text,
531 531
             )
532 532
         );
@@ -544,11 +544,11 @@  discard block
 block discarded – undo
544 544
      */
545 545
     public function appendSubmitButton($text = '')
546 546
     {
547
-        if ($this->form->subsection_exists($this->slug() . '-submit-btn')) {
547
+        if ($this->form->subsection_exists($this->slug().'-submit-btn')) {
548 548
             return;
549 549
         }
550 550
         $this->form->add_subsections(
551
-            array($this->slug() . '-submit-btn' => $this->generateSubmitButton($text)),
551
+            array($this->slug().'-submit-btn' => $this->generateSubmitButton($text)),
552 552
             null,
553 553
             false
554 554
         );
@@ -566,11 +566,11 @@  discard block
 block discarded – undo
566 566
     {
567 567
         $cancel_button = new EE_Submit_Input(
568 568
             array(
569
-                'html_name'             => 'ee-form-submit-' . $this->slug(), // YES! Same name as submit !!!
570
-                'html_id'               => 'ee-cancel-form-' . $this->slug(),
569
+                'html_name'             => 'ee-form-submit-'.$this->slug(), // YES! Same name as submit !!!
570
+                'html_id'               => 'ee-cancel-form-'.$this->slug(),
571 571
                 'html_class'            => 'ee-cancel-form',
572 572
                 'html_label'            => '&nbsp;',
573
-                'other_html_attributes' => ' rel="' . $this->slug() . '"',
573
+                'other_html_attributes' => ' rel="'.$this->slug().'"',
574 574
                 'default'               => ! empty($text) ? $text : esc_html__('Cancel', 'event_espresso'),
575 575
             )
576 576
         );
@@ -591,7 +591,7 @@  discard block
 block discarded – undo
591 591
         $this->form->add_subsections(
592 592
             array(
593 593
                 'clear-submit-btn-float' => new EE_Form_Section_HTML(
594
-                    EEH_HTML::div('', '', 'clear-float') . EEH_HTML::divx()
594
+                    EEH_HTML::div('', '', 'clear-float').EEH_HTML::divx()
595 595
                 ),
596 596
             ),
597 597
             null,
@@ -650,11 +650,11 @@  discard block
 block discarded – undo
650 650
      */
651 651
     public function process($submitted_form_data = array())
652 652
     {
653
-        if (! $this->form()->was_submitted($submitted_form_data)) {
653
+        if ( ! $this->form()->was_submitted($submitted_form_data)) {
654 654
             throw new InvalidFormSubmissionException($this->form_name);
655 655
         }
656 656
         $this->form(true)->receive_form_submission($submitted_form_data);
657
-        if (! $this->form()->is_valid()) {
657
+        if ( ! $this->form()->is_valid()) {
658 658
             throw new InvalidFormSubmissionException(
659 659
                 $this->form_name,
660 660
                 sprintf(
Please login to merge, or discard this patch.
core/helpers/EEH_Activation.helper.php 1 patch
Indentation   +1653 added lines, -1653 removed lines patch added patch discarded remove patch
@@ -2,7 +2,7 @@  discard block
 block discarded – undo
2 2
 use EventEspresso\core\interfaces\ResettableInterface;
3 3
 
4 4
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
5
-    exit('No direct script access allowed');
5
+	exit('No direct script access allowed');
6 6
 }
7 7
 
8 8
 
@@ -17,244 +17,244 @@  discard block
 block discarded – undo
17 17
 class EEH_Activation implements ResettableInterface
18 18
 {
19 19
 
20
-    /**
21
-     * constant used to indicate a cron task is no longer in use
22
-     */
23
-    const cron_task_no_longer_in_use = 'no_longer_in_use';
24
-
25
-    /**
26
-     * option name that will indicate whether or not we still
27
-     * need to create EE's folders in the uploads directory
28
-     * (because if EE was installed without file system access,
29
-     * we need to request credentials before we can create them)
30
-     */
31
-    const upload_directories_incomplete_option_name = 'ee_upload_directories_incomplete';
32
-
33
-    /**
34
-     * WP_User->ID
35
-     *
36
-     * @var int
37
-     */
38
-    private static $_default_creator_id;
39
-
40
-    /**
41
-     * indicates whether or not we've already verified core's default data during this request,
42
-     * because after migrations are done, any addons activated while in maintenance mode
43
-     * will want to setup their own default data, and they might hook into core's default data
44
-     * and trigger core to setup its default data. In which case they might all ask for core to init its default data.
45
-     * This prevents doing that for EVERY single addon.
46
-     *
47
-     * @var boolean
48
-     */
49
-    protected static $_initialized_db_content_already_in_this_request = false;
50
-
51
-    /**
52
-     * @var \EventEspresso\core\services\database\TableAnalysis $table_analysis
53
-     */
54
-    private static $table_analysis;
55
-
56
-    /**
57
-     * @var \EventEspresso\core\services\database\TableManager $table_manager
58
-     */
59
-    private static $table_manager;
60
-
61
-
62
-    /**
63
-     * @return \EventEspresso\core\services\database\TableAnalysis
64
-     */
65
-    public static function getTableAnalysis()
66
-    {
67
-        if (! self::$table_analysis instanceof \EventEspresso\core\services\database\TableAnalysis) {
68
-            self::$table_analysis = EE_Registry::instance()->create('TableAnalysis', array(), true);
69
-        }
70
-        return self::$table_analysis;
71
-    }
72
-
73
-
74
-    /**
75
-     * @return \EventEspresso\core\services\database\TableManager
76
-     */
77
-    public static function getTableManager()
78
-    {
79
-        if (! self::$table_manager instanceof \EventEspresso\core\services\database\TableManager) {
80
-            self::$table_manager = EE_Registry::instance()->create('TableManager', array(), true);
81
-        }
82
-        return self::$table_manager;
83
-    }
84
-
85
-
86
-    /**
87
-     *    _ensure_table_name_has_prefix
88
-     *
89
-     * @deprecated instead use TableAnalysis::ensureTableNameHasPrefix()
90
-     * @access     public
91
-     * @static
92
-     * @param $table_name
93
-     * @return string
94
-     */
95
-    public static function ensure_table_name_has_prefix($table_name)
96
-    {
97
-        return \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix($table_name);
98
-    }
99
-
100
-
101
-    /**
102
-     *    system_initialization
103
-     *    ensures the EE configuration settings are loaded with at least default options set
104
-     *    and that all critical EE pages have been generated with the appropriate shortcodes in place
105
-     *
106
-     * @access public
107
-     * @static
108
-     * @return void
109
-     */
110
-    public static function system_initialization()
111
-    {
112
-        EEH_Activation::reset_and_update_config();
113
-        //which is fired BEFORE activation of plugin anyways
114
-        EEH_Activation::verify_default_pages_exist();
115
-    }
116
-
117
-
118
-    /**
119
-     * Sets the database schema and creates folders. This should
120
-     * be called on plugin activation and reactivation
121
-     *
122
-     * @return boolean success, whether the database and folders are setup properly
123
-     * @throws \EE_Error
124
-     */
125
-    public static function initialize_db_and_folders()
126
-    {
127
-        $good_filesystem = EEH_Activation::create_upload_directories();
128
-        $good_db         = EEH_Activation::create_database_tables();
129
-        return $good_filesystem && $good_db;
130
-    }
131
-
132
-
133
-    /**
134
-     * assuming we have an up-to-date database schema, this will populate it
135
-     * with default and initial data. This should be called
136
-     * upon activation of a new plugin, reactivation, and at the end
137
-     * of running migration scripts
138
-     *
139
-     * @throws \EE_Error
140
-     */
141
-    public static function initialize_db_content()
142
-    {
143
-        //let's avoid doing all this logic repeatedly, especially when addons are requesting it
144
-        if (EEH_Activation::$_initialized_db_content_already_in_this_request) {
145
-            return;
146
-        }
147
-        EEH_Activation::$_initialized_db_content_already_in_this_request = true;
148
-
149
-        EEH_Activation::initialize_system_questions();
150
-        EEH_Activation::insert_default_status_codes();
151
-        EEH_Activation::generate_default_message_templates();
152
-        EEH_Activation::create_no_ticket_prices_array();
153
-        EE_Registry::instance()->CAP->init_caps();
154
-
155
-        EEH_Activation::validate_messages_system();
156
-        EEH_Activation::insert_default_payment_methods();
157
-        //in case we've
158
-        EEH_Activation::remove_cron_tasks();
159
-        EEH_Activation::create_cron_tasks();
160
-        // remove all TXN locks since that is being done via extra meta now
161
-        delete_option('ee_locked_transactions');
162
-        //also, check for CAF default db content
163
-        do_action('AHEE__EEH_Activation__initialize_db_content');
164
-        //also: EEM_Gateways::load_all_gateways() outputs a lot of success messages
165
-        //which users really won't care about on initial activation
166
-        EE_Error::overwrite_success();
167
-    }
168
-
169
-
170
-    /**
171
-     * Returns an array of cron tasks. Array values are the actions fired by the cron tasks (the "hooks"),
172
-     * values are the frequency (the "recurrence"). See http://codex.wordpress.org/Function_Reference/wp_schedule_event
173
-     * If the cron task should NO longer be used, it should have a value of EEH_Activation::cron_task_no_longer_in_use
174
-     * (null)
175
-     *
176
-     * @param string $which_to_include can be 'current' (ones that are currently in use),
177
-     *                                 'old' (only returns ones that should no longer be used),or 'all',
178
-     * @return array
179
-     * @throws \EE_Error
180
-     */
181
-    public static function get_cron_tasks($which_to_include)
182
-    {
183
-        $cron_tasks = apply_filters(
184
-            'FHEE__EEH_Activation__get_cron_tasks',
185
-            array(
186
-                'AHEE__EE_Cron_Tasks__clean_up_junk_transactions'      => 'hourly',
20
+	/**
21
+	 * constant used to indicate a cron task is no longer in use
22
+	 */
23
+	const cron_task_no_longer_in_use = 'no_longer_in_use';
24
+
25
+	/**
26
+	 * option name that will indicate whether or not we still
27
+	 * need to create EE's folders in the uploads directory
28
+	 * (because if EE was installed without file system access,
29
+	 * we need to request credentials before we can create them)
30
+	 */
31
+	const upload_directories_incomplete_option_name = 'ee_upload_directories_incomplete';
32
+
33
+	/**
34
+	 * WP_User->ID
35
+	 *
36
+	 * @var int
37
+	 */
38
+	private static $_default_creator_id;
39
+
40
+	/**
41
+	 * indicates whether or not we've already verified core's default data during this request,
42
+	 * because after migrations are done, any addons activated while in maintenance mode
43
+	 * will want to setup their own default data, and they might hook into core's default data
44
+	 * and trigger core to setup its default data. In which case they might all ask for core to init its default data.
45
+	 * This prevents doing that for EVERY single addon.
46
+	 *
47
+	 * @var boolean
48
+	 */
49
+	protected static $_initialized_db_content_already_in_this_request = false;
50
+
51
+	/**
52
+	 * @var \EventEspresso\core\services\database\TableAnalysis $table_analysis
53
+	 */
54
+	private static $table_analysis;
55
+
56
+	/**
57
+	 * @var \EventEspresso\core\services\database\TableManager $table_manager
58
+	 */
59
+	private static $table_manager;
60
+
61
+
62
+	/**
63
+	 * @return \EventEspresso\core\services\database\TableAnalysis
64
+	 */
65
+	public static function getTableAnalysis()
66
+	{
67
+		if (! self::$table_analysis instanceof \EventEspresso\core\services\database\TableAnalysis) {
68
+			self::$table_analysis = EE_Registry::instance()->create('TableAnalysis', array(), true);
69
+		}
70
+		return self::$table_analysis;
71
+	}
72
+
73
+
74
+	/**
75
+	 * @return \EventEspresso\core\services\database\TableManager
76
+	 */
77
+	public static function getTableManager()
78
+	{
79
+		if (! self::$table_manager instanceof \EventEspresso\core\services\database\TableManager) {
80
+			self::$table_manager = EE_Registry::instance()->create('TableManager', array(), true);
81
+		}
82
+		return self::$table_manager;
83
+	}
84
+
85
+
86
+	/**
87
+	 *    _ensure_table_name_has_prefix
88
+	 *
89
+	 * @deprecated instead use TableAnalysis::ensureTableNameHasPrefix()
90
+	 * @access     public
91
+	 * @static
92
+	 * @param $table_name
93
+	 * @return string
94
+	 */
95
+	public static function ensure_table_name_has_prefix($table_name)
96
+	{
97
+		return \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix($table_name);
98
+	}
99
+
100
+
101
+	/**
102
+	 *    system_initialization
103
+	 *    ensures the EE configuration settings are loaded with at least default options set
104
+	 *    and that all critical EE pages have been generated with the appropriate shortcodes in place
105
+	 *
106
+	 * @access public
107
+	 * @static
108
+	 * @return void
109
+	 */
110
+	public static function system_initialization()
111
+	{
112
+		EEH_Activation::reset_and_update_config();
113
+		//which is fired BEFORE activation of plugin anyways
114
+		EEH_Activation::verify_default_pages_exist();
115
+	}
116
+
117
+
118
+	/**
119
+	 * Sets the database schema and creates folders. This should
120
+	 * be called on plugin activation and reactivation
121
+	 *
122
+	 * @return boolean success, whether the database and folders are setup properly
123
+	 * @throws \EE_Error
124
+	 */
125
+	public static function initialize_db_and_folders()
126
+	{
127
+		$good_filesystem = EEH_Activation::create_upload_directories();
128
+		$good_db         = EEH_Activation::create_database_tables();
129
+		return $good_filesystem && $good_db;
130
+	}
131
+
132
+
133
+	/**
134
+	 * assuming we have an up-to-date database schema, this will populate it
135
+	 * with default and initial data. This should be called
136
+	 * upon activation of a new plugin, reactivation, and at the end
137
+	 * of running migration scripts
138
+	 *
139
+	 * @throws \EE_Error
140
+	 */
141
+	public static function initialize_db_content()
142
+	{
143
+		//let's avoid doing all this logic repeatedly, especially when addons are requesting it
144
+		if (EEH_Activation::$_initialized_db_content_already_in_this_request) {
145
+			return;
146
+		}
147
+		EEH_Activation::$_initialized_db_content_already_in_this_request = true;
148
+
149
+		EEH_Activation::initialize_system_questions();
150
+		EEH_Activation::insert_default_status_codes();
151
+		EEH_Activation::generate_default_message_templates();
152
+		EEH_Activation::create_no_ticket_prices_array();
153
+		EE_Registry::instance()->CAP->init_caps();
154
+
155
+		EEH_Activation::validate_messages_system();
156
+		EEH_Activation::insert_default_payment_methods();
157
+		//in case we've
158
+		EEH_Activation::remove_cron_tasks();
159
+		EEH_Activation::create_cron_tasks();
160
+		// remove all TXN locks since that is being done via extra meta now
161
+		delete_option('ee_locked_transactions');
162
+		//also, check for CAF default db content
163
+		do_action('AHEE__EEH_Activation__initialize_db_content');
164
+		//also: EEM_Gateways::load_all_gateways() outputs a lot of success messages
165
+		//which users really won't care about on initial activation
166
+		EE_Error::overwrite_success();
167
+	}
168
+
169
+
170
+	/**
171
+	 * Returns an array of cron tasks. Array values are the actions fired by the cron tasks (the "hooks"),
172
+	 * values are the frequency (the "recurrence"). See http://codex.wordpress.org/Function_Reference/wp_schedule_event
173
+	 * If the cron task should NO longer be used, it should have a value of EEH_Activation::cron_task_no_longer_in_use
174
+	 * (null)
175
+	 *
176
+	 * @param string $which_to_include can be 'current' (ones that are currently in use),
177
+	 *                                 'old' (only returns ones that should no longer be used),or 'all',
178
+	 * @return array
179
+	 * @throws \EE_Error
180
+	 */
181
+	public static function get_cron_tasks($which_to_include)
182
+	{
183
+		$cron_tasks = apply_filters(
184
+			'FHEE__EEH_Activation__get_cron_tasks',
185
+			array(
186
+				'AHEE__EE_Cron_Tasks__clean_up_junk_transactions'      => 'hourly',
187 187
 //				'AHEE__EE_Cron_Tasks__finalize_abandoned_transactions' => EEH_Activation::cron_task_no_longer_in_use, actually this is still in use
188
-                'AHEE__EE_Cron_Tasks__update_transaction_with_payment' => EEH_Activation::cron_task_no_longer_in_use,
189
-                //there may have been a bug which prevented from these cron tasks from getting unscheduled, so we might want to remove these for a few updates
190
-                'AHEE_EE_Cron_Tasks__clean_out_old_gateway_logs'       => 'daily',
191
-            )
192
-        );
193
-        if ($which_to_include === 'old') {
194
-            $cron_tasks = array_filter(
195
-                $cron_tasks,
196
-                function ($value) {
197
-                    return $value === EEH_Activation::cron_task_no_longer_in_use;
198
-                }
199
-            );
200
-        } elseif ($which_to_include === 'current') {
201
-            $cron_tasks = array_filter($cron_tasks);
202
-        } elseif (WP_DEBUG && $which_to_include !== 'all') {
203
-            throw new EE_Error(
204
-                sprintf(
205
-                    __(
206
-                        'Invalid argument of "%1$s" passed to EEH_Activation::get_cron_tasks. Valid values are "all", "old" and "current".',
207
-                        'event_espresso'
208
-                    ),
209
-                    $which_to_include
210
-                )
211
-            );
212
-        }
213
-        return $cron_tasks;
214
-    }
215
-
216
-
217
-    /**
218
-     * Ensure cron tasks are setup (the removal of crons should be done by remove_crons())
219
-     *
220
-     * @throws \EE_Error
221
-     */
222
-    public static function create_cron_tasks()
223
-    {
224
-
225
-        foreach (EEH_Activation::get_cron_tasks('current') as $hook_name => $frequency) {
226
-            if (! wp_next_scheduled($hook_name)) {
227
-                /**
228
-                 * This allows client code to define the initial start timestamp for this schedule.
229
-                 */
230
-                if (is_array($frequency)
231
-                    && count($frequency) === 2
232
-                    && isset($frequency[0], $frequency[1])
233
-                ) {
234
-                    $start_timestamp = $frequency[0];
235
-                    $frequency = $frequency[1];
236
-                } else {
237
-                    $start_timestamp = time();
238
-                }
239
-                wp_schedule_event($start_timestamp, $frequency, $hook_name);
240
-            }
241
-        }
242
-
243
-    }
244
-
245
-
246
-    /**
247
-     * Remove the currently-existing and now-removed cron tasks.
248
-     *
249
-     * @param boolean $remove_all whether to only remove the old ones, or remove absolutely ALL the EE ones
250
-     * @throws \EE_Error
251
-     */
252
-    public static function remove_cron_tasks($remove_all = true)
253
-    {
254
-        $cron_tasks_to_remove = $remove_all ? 'all' : 'old';
255
-        $crons                = _get_cron_array();
256
-        $crons                = is_array($crons) ? $crons : array();
257
-        /* reminder of what $crons look like:
188
+				'AHEE__EE_Cron_Tasks__update_transaction_with_payment' => EEH_Activation::cron_task_no_longer_in_use,
189
+				//there may have been a bug which prevented from these cron tasks from getting unscheduled, so we might want to remove these for a few updates
190
+				'AHEE_EE_Cron_Tasks__clean_out_old_gateway_logs'       => 'daily',
191
+			)
192
+		);
193
+		if ($which_to_include === 'old') {
194
+			$cron_tasks = array_filter(
195
+				$cron_tasks,
196
+				function ($value) {
197
+					return $value === EEH_Activation::cron_task_no_longer_in_use;
198
+				}
199
+			);
200
+		} elseif ($which_to_include === 'current') {
201
+			$cron_tasks = array_filter($cron_tasks);
202
+		} elseif (WP_DEBUG && $which_to_include !== 'all') {
203
+			throw new EE_Error(
204
+				sprintf(
205
+					__(
206
+						'Invalid argument of "%1$s" passed to EEH_Activation::get_cron_tasks. Valid values are "all", "old" and "current".',
207
+						'event_espresso'
208
+					),
209
+					$which_to_include
210
+				)
211
+			);
212
+		}
213
+		return $cron_tasks;
214
+	}
215
+
216
+
217
+	/**
218
+	 * Ensure cron tasks are setup (the removal of crons should be done by remove_crons())
219
+	 *
220
+	 * @throws \EE_Error
221
+	 */
222
+	public static function create_cron_tasks()
223
+	{
224
+
225
+		foreach (EEH_Activation::get_cron_tasks('current') as $hook_name => $frequency) {
226
+			if (! wp_next_scheduled($hook_name)) {
227
+				/**
228
+				 * This allows client code to define the initial start timestamp for this schedule.
229
+				 */
230
+				if (is_array($frequency)
231
+					&& count($frequency) === 2
232
+					&& isset($frequency[0], $frequency[1])
233
+				) {
234
+					$start_timestamp = $frequency[0];
235
+					$frequency = $frequency[1];
236
+				} else {
237
+					$start_timestamp = time();
238
+				}
239
+				wp_schedule_event($start_timestamp, $frequency, $hook_name);
240
+			}
241
+		}
242
+
243
+	}
244
+
245
+
246
+	/**
247
+	 * Remove the currently-existing and now-removed cron tasks.
248
+	 *
249
+	 * @param boolean $remove_all whether to only remove the old ones, or remove absolutely ALL the EE ones
250
+	 * @throws \EE_Error
251
+	 */
252
+	public static function remove_cron_tasks($remove_all = true)
253
+	{
254
+		$cron_tasks_to_remove = $remove_all ? 'all' : 'old';
255
+		$crons                = _get_cron_array();
256
+		$crons                = is_array($crons) ? $crons : array();
257
+		/* reminder of what $crons look like:
258 258
          * Top-level keys are timestamps, and their values are arrays.
259 259
          * The 2nd level arrays have keys with each of the cron task hook names to run at that time
260 260
          * and their values are arrays.
@@ -271,912 +271,912 @@  discard block
 block discarded – undo
271 271
          *					...
272 272
          *      ...
273 273
          */
274
-        $ee_cron_tasks_to_remove = EEH_Activation::get_cron_tasks($cron_tasks_to_remove);
275
-        foreach ($crons as $timestamp => $hooks_to_fire_at_time) {
276
-            if (is_array($hooks_to_fire_at_time)) {
277
-                foreach ($hooks_to_fire_at_time as $hook_name => $hook_actions) {
278
-                    if (isset($ee_cron_tasks_to_remove[$hook_name])
279
-                        && is_array($ee_cron_tasks_to_remove[$hook_name])
280
-                    ) {
281
-                        unset($crons[$timestamp][$hook_name]);
282
-                    }
283
-                }
284
-                //also take care of any empty cron timestamps.
285
-                if (empty($hooks_to_fire_at_time)) {
286
-                    unset($crons[$timestamp]);
287
-                }
288
-            }
289
-        }
290
-        _set_cron_array($crons);
291
-    }
292
-
293
-
294
-    /**
295
-     *    CPT_initialization
296
-     *    registers all EE CPTs ( Custom Post Types ) then flushes rewrite rules so that all endpoints exist
297
-     *
298
-     * @access public
299
-     * @static
300
-     * @return void
301
-     */
302
-    public static function CPT_initialization()
303
-    {
304
-        // register Custom Post Types
305
-        EE_Registry::instance()->load_core('Register_CPTs');
306
-        flush_rewrite_rules();
307
-    }
308
-
309
-
310
-
311
-    /**
312
-     *    reset_and_update_config
313
-     * The following code was moved over from EE_Config so that it will no longer run on every request.
314
-     * If there is old calendar config data saved, then it will get converted on activation.
315
-     * This was basically a DMS before we had DMS's, and will get removed after a few more versions.
316
-     *
317
-     * @access public
318
-     * @static
319
-     * @return void
320
-     */
321
-    public static function reset_and_update_config()
322
-    {
323
-        do_action('AHEE__EE_Config___load_core_config__start', array('EEH_Activation', 'load_calendar_config'));
324
-        add_filter(
325
-            'FHEE__EE_Config___load_core_config__config_settings',
326
-            array('EEH_Activation', 'migrate_old_config_data'),
327
-            10,
328
-            3
329
-        );
330
-        //EE_Config::reset();
331
-        if (! EE_Config::logging_enabled()) {
332
-            delete_option(EE_Config::LOG_NAME);
333
-        }
334
-    }
335
-
336
-
337
-    /**
338
-     *    load_calendar_config
339
-     *
340
-     * @access    public
341
-     * @return    void
342
-     */
343
-    public static function load_calendar_config()
344
-    {
345
-        // grab array of all plugin folders and loop thru it
346
-        $plugins = glob(WP_PLUGIN_DIR . DS . '*', GLOB_ONLYDIR);
347
-        if (empty($plugins)) {
348
-            return;
349
-        }
350
-        foreach ($plugins as $plugin_path) {
351
-            // grab plugin folder name from path
352
-            $plugin = basename($plugin_path);
353
-            // drill down to Espresso plugins
354
-            // then to calendar related plugins
355
-            if (
356
-                strpos($plugin, 'espresso') !== false
357
-                || strpos($plugin, 'Espresso') !== false
358
-                || strpos($plugin, 'ee4') !== false
359
-                || strpos($plugin, 'EE4') !== false
360
-                || strpos($plugin, 'calendar') !== false
361
-            ) {
362
-                // this is what we are looking for
363
-                $calendar_config = $plugin_path . DS . 'EE_Calendar_Config.php';
364
-                // does it exist in this folder ?
365
-                if (is_readable($calendar_config)) {
366
-                    // YEAH! let's load it
367
-                    require_once($calendar_config);
368
-                }
369
-            }
370
-        }
371
-    }
372
-
373
-
374
-
375
-    /**
376
-     *    _migrate_old_config_data
377
-     *
378
-     * @access    public
379
-     * @param array|stdClass $settings
380
-     * @param string         $config
381
-     * @param \EE_Config     $EE_Config
382
-     * @return \stdClass
383
-     */
384
-    public static function migrate_old_config_data($settings = array(), $config = '', EE_Config $EE_Config)
385
-    {
386
-        $convert_from_array = array('addons');
387
-        // in case old settings were saved as an array
388
-        if (is_array($settings) && in_array($config, $convert_from_array)) {
389
-            // convert existing settings to an object
390
-            $config_array = $settings;
391
-            $settings = new stdClass();
392
-            foreach ($config_array as $key => $value) {
393
-                if ($key === 'calendar' && class_exists('EE_Calendar_Config')) {
394
-                    $EE_Config->set_config('addons', 'EE_Calendar', 'EE_Calendar_Config', $value);
395
-                } else {
396
-                    $settings->{$key} = $value;
397
-                }
398
-            }
399
-            add_filter('FHEE__EE_Config___load_core_config__update_espresso_config', '__return_true');
400
-        }
401
-        return $settings;
402
-    }
403
-
404
-
405
-    /**
406
-     * deactivate_event_espresso
407
-     *
408
-     * @access public
409
-     * @static
410
-     * @return void
411
-     */
412
-    public static function deactivate_event_espresso()
413
-    {
414
-        // check permissions
415
-        if (current_user_can('activate_plugins')) {
416
-            deactivate_plugins(EE_PLUGIN_BASENAME, true);
417
-        }
418
-    }
419
-
420
-
421
-
422
-
423
-
424
-    /**
425
-     * verify_default_pages_exist
426
-     *
427
-     * @access public
428
-     * @static
429
-     * @return void
430
-     */
431
-    public static function verify_default_pages_exist()
432
-    {
433
-        $critical_page_problem = false;
434
-        $critical_pages = array(
435
-            array(
436
-                'id'   => 'reg_page_id',
437
-                'name' => __('Registration Checkout', 'event_espresso'),
438
-                'post' => null,
439
-                'code' => 'ESPRESSO_CHECKOUT',
440
-            ),
441
-            array(
442
-                'id'   => 'txn_page_id',
443
-                'name' => __('Transactions', 'event_espresso'),
444
-                'post' => null,
445
-                'code' => 'ESPRESSO_TXN_PAGE',
446
-            ),
447
-            array(
448
-                'id'   => 'thank_you_page_id',
449
-                'name' => __('Thank You', 'event_espresso'),
450
-                'post' => null,
451
-                'code' => 'ESPRESSO_THANK_YOU',
452
-            ),
453
-            array(
454
-                'id'   => 'cancel_page_id',
455
-                'name' => __('Registration Cancelled', 'event_espresso'),
456
-                'post' => null,
457
-                'code' => 'ESPRESSO_CANCELLED',
458
-            ),
459
-        );
460
-        $EE_Core_Config = EE_Registry::instance()->CFG->core;
461
-        foreach ($critical_pages as $critical_page) {
462
-            // is critical page ID set in config ?
463
-            if ($EE_Core_Config->{$critical_page['id']} !== false) {
464
-                // attempt to find post by ID
465
-                $critical_page['post'] = get_post($EE_Core_Config->{$critical_page['id']});
466
-            }
467
-            // no dice?
468
-            if ($critical_page['post'] === null) {
469
-                // attempt to find post by title
470
-                $critical_page['post'] = self::get_page_by_ee_shortcode($critical_page['code']);
471
-                // still nothing?
472
-                if ($critical_page['post'] === null) {
473
-                    $critical_page = EEH_Activation::create_critical_page($critical_page);
474
-                    // REALLY? Still nothing ??!?!?
475
-                    if ($critical_page['post'] === null) {
476
-                        $msg = __(
477
-                            'The Event Espresso critical page configuration settings could not be updated.',
478
-                            'event_espresso'
479
-                        );
480
-                        EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
481
-                        break;
482
-                    }
483
-                }
484
-            }
485
-            // check that Post ID matches critical page ID in config
486
-            if (
487
-                isset($critical_page['post']->ID)
488
-                && $critical_page['post']->ID !== $EE_Core_Config->{$critical_page['id']}
489
-            ) {
490
-                //update Config with post ID
491
-                $EE_Core_Config->{$critical_page['id']} = $critical_page['post']->ID;
492
-                if (! EE_Config::instance()->update_espresso_config(false, false)) {
493
-                    $msg = __(
494
-                        'The Event Espresso critical page configuration settings could not be updated.',
495
-                        'event_espresso'
496
-                    );
497
-                    EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
498
-                }
499
-            }
500
-            $critical_page_problem =
501
-                ! isset($critical_page['post']->post_status)
502
-                || $critical_page['post']->post_status !== 'publish'
503
-                || strpos($critical_page['post']->post_content, $critical_page['code']) === false
504
-                    ? true
505
-                    : $critical_page_problem;
506
-        }
507
-        if ($critical_page_problem) {
508
-            $msg = sprintf(
509
-                __(
510
-                    'A potential issue has been detected with one or more of your Event Espresso pages. Go to %s to view your Event Espresso pages.',
511
-                    'event_espresso'
512
-                ),
513
-                '<a href="'
514
-                . admin_url('admin.php?page=espresso_general_settings&action=critical_pages')
515
-                . '">'
516
-                . __('Event Espresso Critical Pages Settings', 'event_espresso')
517
-                . '</a>'
518
-            );
519
-            EE_Error::add_persistent_admin_notice('critical_page_problem', $msg);
520
-        }
521
-        if (EE_Error::has_notices()) {
522
-            EE_Error::get_notices(false, true, true);
523
-        }
524
-    }
525
-
526
-
527
-
528
-    /**
529
-     * Returns the first post which uses the specified shortcode
530
-     *
531
-     * @param string $ee_shortcode usually one of the critical pages shortcodes, eg
532
-     *                             ESPRESSO_THANK_YOU. So we will search fora post with the content
533
-     *                             "[ESPRESSO_THANK_YOU"
534
-     *                             (we don't search for the closing shortcode bracket because they might have added
535
-     *                             parameter to the shortcode
536
-     * @return WP_Post or NULl
537
-     */
538
-    public static function get_page_by_ee_shortcode($ee_shortcode)
539
-    {
540
-        global $wpdb;
541
-        $shortcode_and_opening_bracket = '[' . $ee_shortcode;
542
-        $post_id = $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE post_content LIKE '%$shortcode_and_opening_bracket%' LIMIT 1");
543
-        if ($post_id) {
544
-            return get_post($post_id);
545
-        } else {
546
-            return null;
547
-        }
548
-    }
549
-
550
-
551
-    /**
552
-     *    This function generates a post for critical espresso pages
553
-     *
554
-     * @access public
555
-     * @static
556
-     * @param array $critical_page
557
-     * @return array
558
-     */
559
-    public static function create_critical_page($critical_page)
560
-    {
561
-
562
-        $post_args = array(
563
-            'post_title'     => $critical_page['name'],
564
-            'post_status'    => 'publish',
565
-            'post_type'      => 'page',
566
-            'comment_status' => 'closed',
567
-            'post_content'   => '[' . $critical_page['code'] . ']',
568
-        );
569
-
570
-        $post_id = wp_insert_post($post_args);
571
-        if (! $post_id) {
572
-            $msg = sprintf(
573
-                __('The Event Espresso  critical page entitled "%s" could not be created.', 'event_espresso'),
574
-                $critical_page['name']
575
-            );
576
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
577
-            return $critical_page;
578
-        }
579
-        // get newly created post's details
580
-        if (! $critical_page['post'] = get_post($post_id)) {
581
-            $msg = sprintf(
582
-                __('The Event Espresso critical page entitled "%s" could not be retrieved.', 'event_espresso'),
583
-                $critical_page['name']
584
-            );
585
-            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
586
-        }
587
-
588
-        return $critical_page;
589
-
590
-    }
591
-
592
-
593
-
594
-
595
-    /**
596
-     * Tries to find the oldest admin for this site.  If there are no admins for this site then return NULL.
597
-     * The role being used to check is filterable.
598
-     *
599
-     * @since  4.6.0
600
-     * @global WPDB $wpdb
601
-     * @return mixed null|int WP_user ID or NULL
602
-     */
603
-    public static function get_default_creator_id()
604
-    {
605
-        global $wpdb;
606
-        if ( ! empty(self::$_default_creator_id)) {
607
-            return self::$_default_creator_id;
608
-        }/**/
609
-        $role_to_check = apply_filters('FHEE__EEH_Activation__get_default_creator_id__role_to_check', 'administrator');
610
-        //let's allow pre_filtering for early exits by alternative methods for getting id.  We check for truthy result and if so then exit early.
611
-        $pre_filtered_id = apply_filters(
612
-            'FHEE__EEH_Activation__get_default_creator_id__pre_filtered_id',
613
-            false,
614
-            $role_to_check
615
-        );
616
-        if ($pre_filtered_id !== false) {
617
-            return (int)$pre_filtered_id;
618
-        }
619
-        $capabilities_key = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('capabilities');
620
-        $query = $wpdb->prepare(
621
-            "SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$capabilities_key' AND meta_value LIKE %s ORDER BY user_id ASC LIMIT 0,1",
622
-            '%' . $role_to_check . '%'
623
-        );
624
-        $user_id = $wpdb->get_var($query);
625
-        $user_id = apply_filters('FHEE__EEH_Activation_Helper__get_default_creator_id__user_id', $user_id);
626
-        if ($user_id && (int)$user_id) {
627
-            self::$_default_creator_id = (int)$user_id;
628
-            return self::$_default_creator_id;
629
-        } else {
630
-            return null;
631
-        }
632
-    }
633
-
634
-
635
-
636
-    /**
637
-     * used by EE and EE addons during plugin activation to create tables.
638
-     * Its a wrapper for EventEspresso\core\services\database\TableManager::createTable,
639
-     * but includes extra logic regarding activations.
640
-     *
641
-     * @access public
642
-     * @static
643
-     * @param string  $table_name              without the $wpdb->prefix
644
-     * @param string  $sql                     SQL for creating the table (contents between brackets in an SQL create
645
-     *                                         table query)
646
-     * @param string  $engine                  like 'ENGINE=MyISAM' or 'ENGINE=InnoDB'
647
-     * @param boolean $drop_pre_existing_table set to TRUE when you want to make SURE the table is completely empty
648
-     *                                         and new once this function is done (ie, you really do want to CREATE a
649
-     *                                         table, and expect it to be empty once you're done) leave as FALSE when
650
-     *                                         you just want to verify the table exists and matches this definition
651
-     *                                         (and if it HAS data in it you want to leave it be)
652
-     * @return void
653
-     * @throws EE_Error if there are database errors
654
-     */
655
-    public static function create_table($table_name, $sql, $engine = 'ENGINE=MyISAM ', $drop_pre_existing_table = false)
656
-    {
657
-        if (apply_filters('FHEE__EEH_Activation__create_table__short_circuit', false, $table_name, $sql)) {
658
-            return;
659
-        }
660
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
661
-        if ( ! function_exists('dbDelta')) {
662
-            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
663
-        }
664
-        $tableAnalysis = \EEH_Activation::getTableAnalysis();
665
-        $wp_table_name = $tableAnalysis->ensureTableNameHasPrefix($table_name);
666
-        // do we need to first delete an existing version of this table ?
667
-        if ($drop_pre_existing_table && $tableAnalysis->tableExists($wp_table_name)) {
668
-            // ok, delete the table... but ONLY if it's empty
669
-            $deleted_safely = EEH_Activation::delete_db_table_if_empty($wp_table_name);
670
-            // table is NOT empty, are you SURE you want to delete this table ???
671
-            if ( ! $deleted_safely && defined('EE_DROP_BAD_TABLES') && EE_DROP_BAD_TABLES) {
672
-                \EEH_Activation::getTableManager()->dropTable($wp_table_name);
673
-            } else if ( ! $deleted_safely) {
674
-                // so we should be more cautious rather than just dropping tables so easily
675
-                error_log(
676
-                    sprintf(
677
-                        __(
678
-                            'It appears that database table "%1$s" exists when it shouldn\'t, and therefore may contain erroneous data. If you have previously restored your database from a backup that didn\'t remove the old tables, then we recommend: %2$s 1. create a new COMPLETE backup of your database, %2$s 2. delete ALL tables from your database, %2$s 3. restore to your previous backup. %2$s If, however, you have not restored to a backup, then somehow your "%3$s" WordPress option could not be read. You can probably ignore this message, but should investigate why that option is being removed.',
679
-                            'event_espresso'
680
-                        ),
681
-                        $wp_table_name,
682
-                        '<br/>',
683
-                        'espresso_db_update'
684
-                    )
685
-                );
686
-            }
687
-        }
688
-        $engine = str_replace('ENGINE=', '', $engine);
689
-        \EEH_Activation::getTableManager()->createTable($table_name, $sql, $engine);
690
-    }
691
-
692
-
693
-
694
-    /**
695
-     *    add_column_if_it_doesn't_exist
696
-     *    Checks if this column already exists on the specified table. Handy for addons which want to add a column
697
-     *
698
-     * @access     public
699
-     * @static
700
-     * @deprecated instead use TableManager::addColumn()
701
-     * @param string $table_name  (without "wp_", eg "esp_attendee"
702
-     * @param string $column_name
703
-     * @param string $column_info if your SQL were 'ALTER TABLE table_name ADD price VARCHAR(10)', this would be
704
-     *                            'VARCHAR(10)'
705
-     * @return bool|int
706
-     */
707
-    public static function add_column_if_it_doesnt_exist(
708
-        $table_name,
709
-        $column_name,
710
-        $column_info = 'INT UNSIGNED NOT NULL'
711
-    ) {
712
-        return \EEH_Activation::getTableManager()->addColumn($table_name, $column_name, $column_info);
713
-    }
714
-
715
-
716
-    /**
717
-     * get_fields_on_table
718
-     * Gets all the fields on the database table.
719
-     *
720
-     * @access     public
721
-     * @deprecated instead use TableManager::getTableColumns()
722
-     * @static
723
-     * @param string $table_name , without prefixed $wpdb->prefix
724
-     * @return array of database column names
725
-     */
726
-    public static function get_fields_on_table($table_name = null)
727
-    {
728
-        return \EEH_Activation::getTableManager()->getTableColumns($table_name);
729
-    }
730
-
731
-
732
-    /**
733
-     * db_table_is_empty
734
-     *
735
-     * @access     public\
736
-     * @deprecated instead use TableAnalysis::tableIsEmpty()
737
-     * @static
738
-     * @param string $table_name
739
-     * @return bool
740
-     */
741
-    public static function db_table_is_empty($table_name)
742
-    {
743
-        return \EEH_Activation::getTableAnalysis()->tableIsEmpty($table_name);
744
-    }
745
-
746
-
747
-    /**
748
-     * delete_db_table_if_empty
749
-     *
750
-     * @access public
751
-     * @static
752
-     * @param string $table_name
753
-     * @return bool | int
754
-     */
755
-    public static function delete_db_table_if_empty($table_name)
756
-    {
757
-        if (\EEH_Activation::getTableAnalysis()->tableIsEmpty($table_name)) {
758
-            return \EEH_Activation::getTableManager()->dropTable($table_name);
759
-        }
760
-        return false;
761
-    }
762
-
763
-
764
-    /**
765
-     * delete_unused_db_table
766
-     *
767
-     * @access     public
768
-     * @static
769
-     * @deprecated instead use TableManager::dropTable()
770
-     * @param string $table_name
771
-     * @return bool | int
772
-     */
773
-    public static function delete_unused_db_table($table_name)
774
-    {
775
-        return \EEH_Activation::getTableManager()->dropTable($table_name);
776
-    }
777
-
778
-
779
-    /**
780
-     * drop_index
781
-     *
782
-     * @access     public
783
-     * @static
784
-     * @deprecated instead use TableManager::dropIndex()
785
-     * @param string $table_name
786
-     * @param string $index_name
787
-     * @return bool | int
788
-     */
789
-    public static function drop_index($table_name, $index_name)
790
-    {
791
-        return \EEH_Activation::getTableManager()->dropIndex($table_name, $index_name);
792
-    }
793
-
794
-
795
-
796
-    /**
797
-     * create_database_tables
798
-     *
799
-     * @access public
800
-     * @static
801
-     * @throws EE_Error
802
-     * @return boolean success (whether database is setup properly or not)
803
-     */
804
-    public static function create_database_tables()
805
-    {
806
-        EE_Registry::instance()->load_core('Data_Migration_Manager');
807
-        //find the migration script that sets the database to be compatible with the code
808
-        $dms_name = EE_Data_Migration_Manager::instance()->get_most_up_to_date_dms();
809
-        if ($dms_name) {
810
-            $current_data_migration_script = EE_Registry::instance()->load_dms($dms_name);
811
-            $current_data_migration_script->set_migrating(false);
812
-            $current_data_migration_script->schema_changes_before_migration();
813
-            $current_data_migration_script->schema_changes_after_migration();
814
-            if ($current_data_migration_script->get_errors()) {
815
-                if (WP_DEBUG) {
816
-                    foreach ($current_data_migration_script->get_errors() as $error) {
817
-                        EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__);
818
-                    }
819
-                } else {
820
-                    EE_Error::add_error(
821
-                        __(
822
-                            'There were errors creating the Event Espresso database tables and Event Espresso has been 
274
+		$ee_cron_tasks_to_remove = EEH_Activation::get_cron_tasks($cron_tasks_to_remove);
275
+		foreach ($crons as $timestamp => $hooks_to_fire_at_time) {
276
+			if (is_array($hooks_to_fire_at_time)) {
277
+				foreach ($hooks_to_fire_at_time as $hook_name => $hook_actions) {
278
+					if (isset($ee_cron_tasks_to_remove[$hook_name])
279
+						&& is_array($ee_cron_tasks_to_remove[$hook_name])
280
+					) {
281
+						unset($crons[$timestamp][$hook_name]);
282
+					}
283
+				}
284
+				//also take care of any empty cron timestamps.
285
+				if (empty($hooks_to_fire_at_time)) {
286
+					unset($crons[$timestamp]);
287
+				}
288
+			}
289
+		}
290
+		_set_cron_array($crons);
291
+	}
292
+
293
+
294
+	/**
295
+	 *    CPT_initialization
296
+	 *    registers all EE CPTs ( Custom Post Types ) then flushes rewrite rules so that all endpoints exist
297
+	 *
298
+	 * @access public
299
+	 * @static
300
+	 * @return void
301
+	 */
302
+	public static function CPT_initialization()
303
+	{
304
+		// register Custom Post Types
305
+		EE_Registry::instance()->load_core('Register_CPTs');
306
+		flush_rewrite_rules();
307
+	}
308
+
309
+
310
+
311
+	/**
312
+	 *    reset_and_update_config
313
+	 * The following code was moved over from EE_Config so that it will no longer run on every request.
314
+	 * If there is old calendar config data saved, then it will get converted on activation.
315
+	 * This was basically a DMS before we had DMS's, and will get removed after a few more versions.
316
+	 *
317
+	 * @access public
318
+	 * @static
319
+	 * @return void
320
+	 */
321
+	public static function reset_and_update_config()
322
+	{
323
+		do_action('AHEE__EE_Config___load_core_config__start', array('EEH_Activation', 'load_calendar_config'));
324
+		add_filter(
325
+			'FHEE__EE_Config___load_core_config__config_settings',
326
+			array('EEH_Activation', 'migrate_old_config_data'),
327
+			10,
328
+			3
329
+		);
330
+		//EE_Config::reset();
331
+		if (! EE_Config::logging_enabled()) {
332
+			delete_option(EE_Config::LOG_NAME);
333
+		}
334
+	}
335
+
336
+
337
+	/**
338
+	 *    load_calendar_config
339
+	 *
340
+	 * @access    public
341
+	 * @return    void
342
+	 */
343
+	public static function load_calendar_config()
344
+	{
345
+		// grab array of all plugin folders and loop thru it
346
+		$plugins = glob(WP_PLUGIN_DIR . DS . '*', GLOB_ONLYDIR);
347
+		if (empty($plugins)) {
348
+			return;
349
+		}
350
+		foreach ($plugins as $plugin_path) {
351
+			// grab plugin folder name from path
352
+			$plugin = basename($plugin_path);
353
+			// drill down to Espresso plugins
354
+			// then to calendar related plugins
355
+			if (
356
+				strpos($plugin, 'espresso') !== false
357
+				|| strpos($plugin, 'Espresso') !== false
358
+				|| strpos($plugin, 'ee4') !== false
359
+				|| strpos($plugin, 'EE4') !== false
360
+				|| strpos($plugin, 'calendar') !== false
361
+			) {
362
+				// this is what we are looking for
363
+				$calendar_config = $plugin_path . DS . 'EE_Calendar_Config.php';
364
+				// does it exist in this folder ?
365
+				if (is_readable($calendar_config)) {
366
+					// YEAH! let's load it
367
+					require_once($calendar_config);
368
+				}
369
+			}
370
+		}
371
+	}
372
+
373
+
374
+
375
+	/**
376
+	 *    _migrate_old_config_data
377
+	 *
378
+	 * @access    public
379
+	 * @param array|stdClass $settings
380
+	 * @param string         $config
381
+	 * @param \EE_Config     $EE_Config
382
+	 * @return \stdClass
383
+	 */
384
+	public static function migrate_old_config_data($settings = array(), $config = '', EE_Config $EE_Config)
385
+	{
386
+		$convert_from_array = array('addons');
387
+		// in case old settings were saved as an array
388
+		if (is_array($settings) && in_array($config, $convert_from_array)) {
389
+			// convert existing settings to an object
390
+			$config_array = $settings;
391
+			$settings = new stdClass();
392
+			foreach ($config_array as $key => $value) {
393
+				if ($key === 'calendar' && class_exists('EE_Calendar_Config')) {
394
+					$EE_Config->set_config('addons', 'EE_Calendar', 'EE_Calendar_Config', $value);
395
+				} else {
396
+					$settings->{$key} = $value;
397
+				}
398
+			}
399
+			add_filter('FHEE__EE_Config___load_core_config__update_espresso_config', '__return_true');
400
+		}
401
+		return $settings;
402
+	}
403
+
404
+
405
+	/**
406
+	 * deactivate_event_espresso
407
+	 *
408
+	 * @access public
409
+	 * @static
410
+	 * @return void
411
+	 */
412
+	public static function deactivate_event_espresso()
413
+	{
414
+		// check permissions
415
+		if (current_user_can('activate_plugins')) {
416
+			deactivate_plugins(EE_PLUGIN_BASENAME, true);
417
+		}
418
+	}
419
+
420
+
421
+
422
+
423
+
424
+	/**
425
+	 * verify_default_pages_exist
426
+	 *
427
+	 * @access public
428
+	 * @static
429
+	 * @return void
430
+	 */
431
+	public static function verify_default_pages_exist()
432
+	{
433
+		$critical_page_problem = false;
434
+		$critical_pages = array(
435
+			array(
436
+				'id'   => 'reg_page_id',
437
+				'name' => __('Registration Checkout', 'event_espresso'),
438
+				'post' => null,
439
+				'code' => 'ESPRESSO_CHECKOUT',
440
+			),
441
+			array(
442
+				'id'   => 'txn_page_id',
443
+				'name' => __('Transactions', 'event_espresso'),
444
+				'post' => null,
445
+				'code' => 'ESPRESSO_TXN_PAGE',
446
+			),
447
+			array(
448
+				'id'   => 'thank_you_page_id',
449
+				'name' => __('Thank You', 'event_espresso'),
450
+				'post' => null,
451
+				'code' => 'ESPRESSO_THANK_YOU',
452
+			),
453
+			array(
454
+				'id'   => 'cancel_page_id',
455
+				'name' => __('Registration Cancelled', 'event_espresso'),
456
+				'post' => null,
457
+				'code' => 'ESPRESSO_CANCELLED',
458
+			),
459
+		);
460
+		$EE_Core_Config = EE_Registry::instance()->CFG->core;
461
+		foreach ($critical_pages as $critical_page) {
462
+			// is critical page ID set in config ?
463
+			if ($EE_Core_Config->{$critical_page['id']} !== false) {
464
+				// attempt to find post by ID
465
+				$critical_page['post'] = get_post($EE_Core_Config->{$critical_page['id']});
466
+			}
467
+			// no dice?
468
+			if ($critical_page['post'] === null) {
469
+				// attempt to find post by title
470
+				$critical_page['post'] = self::get_page_by_ee_shortcode($critical_page['code']);
471
+				// still nothing?
472
+				if ($critical_page['post'] === null) {
473
+					$critical_page = EEH_Activation::create_critical_page($critical_page);
474
+					// REALLY? Still nothing ??!?!?
475
+					if ($critical_page['post'] === null) {
476
+						$msg = __(
477
+							'The Event Espresso critical page configuration settings could not be updated.',
478
+							'event_espresso'
479
+						);
480
+						EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
481
+						break;
482
+					}
483
+				}
484
+			}
485
+			// check that Post ID matches critical page ID in config
486
+			if (
487
+				isset($critical_page['post']->ID)
488
+				&& $critical_page['post']->ID !== $EE_Core_Config->{$critical_page['id']}
489
+			) {
490
+				//update Config with post ID
491
+				$EE_Core_Config->{$critical_page['id']} = $critical_page['post']->ID;
492
+				if (! EE_Config::instance()->update_espresso_config(false, false)) {
493
+					$msg = __(
494
+						'The Event Espresso critical page configuration settings could not be updated.',
495
+						'event_espresso'
496
+					);
497
+					EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
498
+				}
499
+			}
500
+			$critical_page_problem =
501
+				! isset($critical_page['post']->post_status)
502
+				|| $critical_page['post']->post_status !== 'publish'
503
+				|| strpos($critical_page['post']->post_content, $critical_page['code']) === false
504
+					? true
505
+					: $critical_page_problem;
506
+		}
507
+		if ($critical_page_problem) {
508
+			$msg = sprintf(
509
+				__(
510
+					'A potential issue has been detected with one or more of your Event Espresso pages. Go to %s to view your Event Espresso pages.',
511
+					'event_espresso'
512
+				),
513
+				'<a href="'
514
+				. admin_url('admin.php?page=espresso_general_settings&action=critical_pages')
515
+				. '">'
516
+				. __('Event Espresso Critical Pages Settings', 'event_espresso')
517
+				. '</a>'
518
+			);
519
+			EE_Error::add_persistent_admin_notice('critical_page_problem', $msg);
520
+		}
521
+		if (EE_Error::has_notices()) {
522
+			EE_Error::get_notices(false, true, true);
523
+		}
524
+	}
525
+
526
+
527
+
528
+	/**
529
+	 * Returns the first post which uses the specified shortcode
530
+	 *
531
+	 * @param string $ee_shortcode usually one of the critical pages shortcodes, eg
532
+	 *                             ESPRESSO_THANK_YOU. So we will search fora post with the content
533
+	 *                             "[ESPRESSO_THANK_YOU"
534
+	 *                             (we don't search for the closing shortcode bracket because they might have added
535
+	 *                             parameter to the shortcode
536
+	 * @return WP_Post or NULl
537
+	 */
538
+	public static function get_page_by_ee_shortcode($ee_shortcode)
539
+	{
540
+		global $wpdb;
541
+		$shortcode_and_opening_bracket = '[' . $ee_shortcode;
542
+		$post_id = $wpdb->get_var("SELECT ID FROM {$wpdb->posts} WHERE post_content LIKE '%$shortcode_and_opening_bracket%' LIMIT 1");
543
+		if ($post_id) {
544
+			return get_post($post_id);
545
+		} else {
546
+			return null;
547
+		}
548
+	}
549
+
550
+
551
+	/**
552
+	 *    This function generates a post for critical espresso pages
553
+	 *
554
+	 * @access public
555
+	 * @static
556
+	 * @param array $critical_page
557
+	 * @return array
558
+	 */
559
+	public static function create_critical_page($critical_page)
560
+	{
561
+
562
+		$post_args = array(
563
+			'post_title'     => $critical_page['name'],
564
+			'post_status'    => 'publish',
565
+			'post_type'      => 'page',
566
+			'comment_status' => 'closed',
567
+			'post_content'   => '[' . $critical_page['code'] . ']',
568
+		);
569
+
570
+		$post_id = wp_insert_post($post_args);
571
+		if (! $post_id) {
572
+			$msg = sprintf(
573
+				__('The Event Espresso  critical page entitled "%s" could not be created.', 'event_espresso'),
574
+				$critical_page['name']
575
+			);
576
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
577
+			return $critical_page;
578
+		}
579
+		// get newly created post's details
580
+		if (! $critical_page['post'] = get_post($post_id)) {
581
+			$msg = sprintf(
582
+				__('The Event Espresso critical page entitled "%s" could not be retrieved.', 'event_espresso'),
583
+				$critical_page['name']
584
+			);
585
+			EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
586
+		}
587
+
588
+		return $critical_page;
589
+
590
+	}
591
+
592
+
593
+
594
+
595
+	/**
596
+	 * Tries to find the oldest admin for this site.  If there are no admins for this site then return NULL.
597
+	 * The role being used to check is filterable.
598
+	 *
599
+	 * @since  4.6.0
600
+	 * @global WPDB $wpdb
601
+	 * @return mixed null|int WP_user ID or NULL
602
+	 */
603
+	public static function get_default_creator_id()
604
+	{
605
+		global $wpdb;
606
+		if ( ! empty(self::$_default_creator_id)) {
607
+			return self::$_default_creator_id;
608
+		}/**/
609
+		$role_to_check = apply_filters('FHEE__EEH_Activation__get_default_creator_id__role_to_check', 'administrator');
610
+		//let's allow pre_filtering for early exits by alternative methods for getting id.  We check for truthy result and if so then exit early.
611
+		$pre_filtered_id = apply_filters(
612
+			'FHEE__EEH_Activation__get_default_creator_id__pre_filtered_id',
613
+			false,
614
+			$role_to_check
615
+		);
616
+		if ($pre_filtered_id !== false) {
617
+			return (int)$pre_filtered_id;
618
+		}
619
+		$capabilities_key = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('capabilities');
620
+		$query = $wpdb->prepare(
621
+			"SELECT user_id FROM $wpdb->usermeta WHERE meta_key = '$capabilities_key' AND meta_value LIKE %s ORDER BY user_id ASC LIMIT 0,1",
622
+			'%' . $role_to_check . '%'
623
+		);
624
+		$user_id = $wpdb->get_var($query);
625
+		$user_id = apply_filters('FHEE__EEH_Activation_Helper__get_default_creator_id__user_id', $user_id);
626
+		if ($user_id && (int)$user_id) {
627
+			self::$_default_creator_id = (int)$user_id;
628
+			return self::$_default_creator_id;
629
+		} else {
630
+			return null;
631
+		}
632
+	}
633
+
634
+
635
+
636
+	/**
637
+	 * used by EE and EE addons during plugin activation to create tables.
638
+	 * Its a wrapper for EventEspresso\core\services\database\TableManager::createTable,
639
+	 * but includes extra logic regarding activations.
640
+	 *
641
+	 * @access public
642
+	 * @static
643
+	 * @param string  $table_name              without the $wpdb->prefix
644
+	 * @param string  $sql                     SQL for creating the table (contents between brackets in an SQL create
645
+	 *                                         table query)
646
+	 * @param string  $engine                  like 'ENGINE=MyISAM' or 'ENGINE=InnoDB'
647
+	 * @param boolean $drop_pre_existing_table set to TRUE when you want to make SURE the table is completely empty
648
+	 *                                         and new once this function is done (ie, you really do want to CREATE a
649
+	 *                                         table, and expect it to be empty once you're done) leave as FALSE when
650
+	 *                                         you just want to verify the table exists and matches this definition
651
+	 *                                         (and if it HAS data in it you want to leave it be)
652
+	 * @return void
653
+	 * @throws EE_Error if there are database errors
654
+	 */
655
+	public static function create_table($table_name, $sql, $engine = 'ENGINE=MyISAM ', $drop_pre_existing_table = false)
656
+	{
657
+		if (apply_filters('FHEE__EEH_Activation__create_table__short_circuit', false, $table_name, $sql)) {
658
+			return;
659
+		}
660
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
661
+		if ( ! function_exists('dbDelta')) {
662
+			require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
663
+		}
664
+		$tableAnalysis = \EEH_Activation::getTableAnalysis();
665
+		$wp_table_name = $tableAnalysis->ensureTableNameHasPrefix($table_name);
666
+		// do we need to first delete an existing version of this table ?
667
+		if ($drop_pre_existing_table && $tableAnalysis->tableExists($wp_table_name)) {
668
+			// ok, delete the table... but ONLY if it's empty
669
+			$deleted_safely = EEH_Activation::delete_db_table_if_empty($wp_table_name);
670
+			// table is NOT empty, are you SURE you want to delete this table ???
671
+			if ( ! $deleted_safely && defined('EE_DROP_BAD_TABLES') && EE_DROP_BAD_TABLES) {
672
+				\EEH_Activation::getTableManager()->dropTable($wp_table_name);
673
+			} else if ( ! $deleted_safely) {
674
+				// so we should be more cautious rather than just dropping tables so easily
675
+				error_log(
676
+					sprintf(
677
+						__(
678
+							'It appears that database table "%1$s" exists when it shouldn\'t, and therefore may contain erroneous data. If you have previously restored your database from a backup that didn\'t remove the old tables, then we recommend: %2$s 1. create a new COMPLETE backup of your database, %2$s 2. delete ALL tables from your database, %2$s 3. restore to your previous backup. %2$s If, however, you have not restored to a backup, then somehow your "%3$s" WordPress option could not be read. You can probably ignore this message, but should investigate why that option is being removed.',
679
+							'event_espresso'
680
+						),
681
+						$wp_table_name,
682
+						'<br/>',
683
+						'espresso_db_update'
684
+					)
685
+				);
686
+			}
687
+		}
688
+		$engine = str_replace('ENGINE=', '', $engine);
689
+		\EEH_Activation::getTableManager()->createTable($table_name, $sql, $engine);
690
+	}
691
+
692
+
693
+
694
+	/**
695
+	 *    add_column_if_it_doesn't_exist
696
+	 *    Checks if this column already exists on the specified table. Handy for addons which want to add a column
697
+	 *
698
+	 * @access     public
699
+	 * @static
700
+	 * @deprecated instead use TableManager::addColumn()
701
+	 * @param string $table_name  (without "wp_", eg "esp_attendee"
702
+	 * @param string $column_name
703
+	 * @param string $column_info if your SQL were 'ALTER TABLE table_name ADD price VARCHAR(10)', this would be
704
+	 *                            'VARCHAR(10)'
705
+	 * @return bool|int
706
+	 */
707
+	public static function add_column_if_it_doesnt_exist(
708
+		$table_name,
709
+		$column_name,
710
+		$column_info = 'INT UNSIGNED NOT NULL'
711
+	) {
712
+		return \EEH_Activation::getTableManager()->addColumn($table_name, $column_name, $column_info);
713
+	}
714
+
715
+
716
+	/**
717
+	 * get_fields_on_table
718
+	 * Gets all the fields on the database table.
719
+	 *
720
+	 * @access     public
721
+	 * @deprecated instead use TableManager::getTableColumns()
722
+	 * @static
723
+	 * @param string $table_name , without prefixed $wpdb->prefix
724
+	 * @return array of database column names
725
+	 */
726
+	public static function get_fields_on_table($table_name = null)
727
+	{
728
+		return \EEH_Activation::getTableManager()->getTableColumns($table_name);
729
+	}
730
+
731
+
732
+	/**
733
+	 * db_table_is_empty
734
+	 *
735
+	 * @access     public\
736
+	 * @deprecated instead use TableAnalysis::tableIsEmpty()
737
+	 * @static
738
+	 * @param string $table_name
739
+	 * @return bool
740
+	 */
741
+	public static function db_table_is_empty($table_name)
742
+	{
743
+		return \EEH_Activation::getTableAnalysis()->tableIsEmpty($table_name);
744
+	}
745
+
746
+
747
+	/**
748
+	 * delete_db_table_if_empty
749
+	 *
750
+	 * @access public
751
+	 * @static
752
+	 * @param string $table_name
753
+	 * @return bool | int
754
+	 */
755
+	public static function delete_db_table_if_empty($table_name)
756
+	{
757
+		if (\EEH_Activation::getTableAnalysis()->tableIsEmpty($table_name)) {
758
+			return \EEH_Activation::getTableManager()->dropTable($table_name);
759
+		}
760
+		return false;
761
+	}
762
+
763
+
764
+	/**
765
+	 * delete_unused_db_table
766
+	 *
767
+	 * @access     public
768
+	 * @static
769
+	 * @deprecated instead use TableManager::dropTable()
770
+	 * @param string $table_name
771
+	 * @return bool | int
772
+	 */
773
+	public static function delete_unused_db_table($table_name)
774
+	{
775
+		return \EEH_Activation::getTableManager()->dropTable($table_name);
776
+	}
777
+
778
+
779
+	/**
780
+	 * drop_index
781
+	 *
782
+	 * @access     public
783
+	 * @static
784
+	 * @deprecated instead use TableManager::dropIndex()
785
+	 * @param string $table_name
786
+	 * @param string $index_name
787
+	 * @return bool | int
788
+	 */
789
+	public static function drop_index($table_name, $index_name)
790
+	{
791
+		return \EEH_Activation::getTableManager()->dropIndex($table_name, $index_name);
792
+	}
793
+
794
+
795
+
796
+	/**
797
+	 * create_database_tables
798
+	 *
799
+	 * @access public
800
+	 * @static
801
+	 * @throws EE_Error
802
+	 * @return boolean success (whether database is setup properly or not)
803
+	 */
804
+	public static function create_database_tables()
805
+	{
806
+		EE_Registry::instance()->load_core('Data_Migration_Manager');
807
+		//find the migration script that sets the database to be compatible with the code
808
+		$dms_name = EE_Data_Migration_Manager::instance()->get_most_up_to_date_dms();
809
+		if ($dms_name) {
810
+			$current_data_migration_script = EE_Registry::instance()->load_dms($dms_name);
811
+			$current_data_migration_script->set_migrating(false);
812
+			$current_data_migration_script->schema_changes_before_migration();
813
+			$current_data_migration_script->schema_changes_after_migration();
814
+			if ($current_data_migration_script->get_errors()) {
815
+				if (WP_DEBUG) {
816
+					foreach ($current_data_migration_script->get_errors() as $error) {
817
+						EE_Error::add_error($error, __FILE__, __FUNCTION__, __LINE__);
818
+					}
819
+				} else {
820
+					EE_Error::add_error(
821
+						__(
822
+							'There were errors creating the Event Espresso database tables and Event Espresso has been 
823 823
                             deactivated. To view the errors, please enable WP_DEBUG in your wp-config.php file.',
824
-                            'event_espresso'
825
-                        )
826
-                    );
827
-                }
828
-                return false;
829
-            }
830
-            EE_Data_Migration_Manager::instance()->update_current_database_state_to();
831
-        } else {
832
-            EE_Error::add_error(
833
-                __(
834
-                    'Could not determine most up-to-date data migration script from which to pull database schema
824
+							'event_espresso'
825
+						)
826
+					);
827
+				}
828
+				return false;
829
+			}
830
+			EE_Data_Migration_Manager::instance()->update_current_database_state_to();
831
+		} else {
832
+			EE_Error::add_error(
833
+				__(
834
+					'Could not determine most up-to-date data migration script from which to pull database schema
835 835
                      structure. So database is probably not setup properly',
836
-                    'event_espresso'
837
-                ),
838
-                __FILE__,
839
-                __FUNCTION__,
840
-                __LINE__
841
-            );
842
-            return false;
843
-        }
844
-        return true;
845
-    }
846
-
847
-
848
-
849
-    /**
850
-     * initialize_system_questions
851
-     *
852
-     * @access public
853
-     * @static
854
-     * @return void
855
-     */
856
-    public static function initialize_system_questions()
857
-    {
858
-        // QUESTION GROUPS
859
-        global $wpdb;
860
-        $table_name = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question_group');
861
-        $SQL = "SELECT QSG_system FROM $table_name WHERE QSG_system != 0";
862
-        // what we have
863
-        $question_groups = $wpdb->get_col($SQL);
864
-        // check the response
865
-        $question_groups = is_array($question_groups) ? $question_groups : array();
866
-        // what we should have
867
-        $QSG_systems = array(1, 2);
868
-        // loop thru what we should have and compare to what we have
869
-        foreach ($QSG_systems as $QSG_system) {
870
-            // reset values array
871
-            $QSG_values = array();
872
-            // if we don't have what we should have (but use $QST_system as as string because that's what we got from the db)
873
-            if (! in_array("$QSG_system", $question_groups)) {
874
-                // add it
875
-                switch ($QSG_system) {
876
-                    case 1:
877
-                        $QSG_values = array(
878
-                            'QSG_name'            => __('Personal Information', 'event_espresso'),
879
-                            'QSG_identifier'      => 'personal-information-' . time(),
880
-                            'QSG_desc'            => '',
881
-                            'QSG_order'           => 1,
882
-                            'QSG_show_group_name' => 1,
883
-                            'QSG_show_group_desc' => 1,
884
-                            'QSG_system'          => EEM_Question_Group::system_personal,
885
-                            'QSG_deleted'         => 0,
886
-                        );
887
-                        break;
888
-                    case 2:
889
-                        $QSG_values = array(
890
-                            'QSG_name'            => __('Address Information', 'event_espresso'),
891
-                            'QSG_identifier'      => 'address-information-' . time(),
892
-                            'QSG_desc'            => '',
893
-                            'QSG_order'           => 2,
894
-                            'QSG_show_group_name' => 1,
895
-                            'QSG_show_group_desc' => 1,
896
-                            'QSG_system'          => EEM_Question_Group::system_address,
897
-                            'QSG_deleted'         => 0,
898
-                        );
899
-                        break;
900
-                }
901
-                // make sure we have some values before inserting them
902
-                if (! empty($QSG_values)) {
903
-                    // insert system question
904
-                    $wpdb->insert(
905
-                        $table_name,
906
-                        $QSG_values,
907
-                        array('%s', '%s', '%s', '%d', '%d', '%d', '%d', '%d')
908
-                    );
909
-                    $QSG_IDs[$QSG_system] = $wpdb->insert_id;
910
-                }
911
-            }
912
-        }
913
-        // QUESTIONS
914
-        global $wpdb;
915
-        $table_name = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question');
916
-        $SQL = "SELECT QST_system FROM $table_name WHERE QST_system != ''";
917
-        // what we have
918
-        $questions = $wpdb->get_col($SQL);
919
-        // what we should have
920
-        $QST_systems = array(
921
-            'fname',
922
-            'lname',
923
-            'email',
924
-            'address',
925
-            'address2',
926
-            'city',
927
-            'country',
928
-            'state',
929
-            'zip',
930
-            'phone',
931
-        );
932
-        $order_for_group_1 = 1;
933
-        $order_for_group_2 = 1;
934
-        // loop thru what we should have and compare to what we have
935
-        foreach ($QST_systems as $QST_system) {
936
-            // reset values array
937
-            $QST_values = array();
938
-            // if we don't have what we should have
939
-            if (! in_array($QST_system, $questions)) {
940
-                // add it
941
-                switch ($QST_system) {
942
-                    case 'fname':
943
-                        $QST_values = array(
944
-                            'QST_display_text'  => __('First Name', 'event_espresso'),
945
-                            'QST_admin_label'   => __('First Name - System Question', 'event_espresso'),
946
-                            'QST_system'        => 'fname',
947
-                            'QST_type'          => 'TEXT',
948
-                            'QST_required'      => 1,
949
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
950
-                            'QST_order'         => 1,
951
-                            'QST_admin_only'    => 0,
952
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
953
-                            'QST_wp_user'       => self::get_default_creator_id(),
954
-                            'QST_deleted'       => 0,
955
-                        );
956
-                        break;
957
-                    case 'lname':
958
-                        $QST_values = array(
959
-                            'QST_display_text'  => __('Last Name', 'event_espresso'),
960
-                            'QST_admin_label'   => __('Last Name - System Question', 'event_espresso'),
961
-                            'QST_system'        => 'lname',
962
-                            'QST_type'          => 'TEXT',
963
-                            'QST_required'      => 1,
964
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
965
-                            'QST_order'         => 2,
966
-                            'QST_admin_only'    => 0,
967
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
968
-                            'QST_wp_user'       => self::get_default_creator_id(),
969
-                            'QST_deleted'       => 0,
970
-                        );
971
-                        break;
972
-                    case 'email':
973
-                        $QST_values = array(
974
-                            'QST_display_text'  => __('Email Address', 'event_espresso'),
975
-                            'QST_admin_label'   => __('Email Address - System Question', 'event_espresso'),
976
-                            'QST_system'        => 'email',
977
-                            'QST_type'          => 'EMAIL',
978
-                            'QST_required'      => 1,
979
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
980
-                            'QST_order'         => 3,
981
-                            'QST_admin_only'    => 0,
982
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
983
-                            'QST_wp_user'       => self::get_default_creator_id(),
984
-                            'QST_deleted'       => 0,
985
-                        );
986
-                        break;
987
-                    case 'address':
988
-                        $QST_values = array(
989
-                            'QST_display_text'  => __('Address', 'event_espresso'),
990
-                            'QST_admin_label'   => __('Address - System Question', 'event_espresso'),
991
-                            'QST_system'        => 'address',
992
-                            'QST_type'          => 'TEXT',
993
-                            'QST_required'      => 0,
994
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
995
-                            'QST_order'         => 4,
996
-                            'QST_admin_only'    => 0,
997
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
998
-                            'QST_wp_user'       => self::get_default_creator_id(),
999
-                            'QST_deleted'       => 0,
1000
-                        );
1001
-                        break;
1002
-                    case 'address2':
1003
-                        $QST_values = array(
1004
-                            'QST_display_text'  => __('Address2', 'event_espresso'),
1005
-                            'QST_admin_label'   => __('Address2 - System Question', 'event_espresso'),
1006
-                            'QST_system'        => 'address2',
1007
-                            'QST_type'          => 'TEXT',
1008
-                            'QST_required'      => 0,
1009
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1010
-                            'QST_order'         => 5,
1011
-                            'QST_admin_only'    => 0,
1012
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1013
-                            'QST_wp_user'       => self::get_default_creator_id(),
1014
-                            'QST_deleted'       => 0,
1015
-                        );
1016
-                        break;
1017
-                    case 'city':
1018
-                        $QST_values = array(
1019
-                            'QST_display_text'  => __('City', 'event_espresso'),
1020
-                            'QST_admin_label'   => __('City - System Question', 'event_espresso'),
1021
-                            'QST_system'        => 'city',
1022
-                            'QST_type'          => 'TEXT',
1023
-                            'QST_required'      => 0,
1024
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1025
-                            'QST_order'         => 6,
1026
-                            'QST_admin_only'    => 0,
1027
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1028
-                            'QST_wp_user'       => self::get_default_creator_id(),
1029
-                            'QST_deleted'       => 0,
1030
-                        );
1031
-                        break;
1032
-                    case 'country':
1033
-                        $QST_values = array(
1034
-                            'QST_display_text'  => __('Country', 'event_espresso'),
1035
-                            'QST_admin_label'   => __('Country - System Question', 'event_espresso'),
1036
-                            'QST_system'        => 'country',
1037
-                            'QST_type'          => 'COUNTRY',
1038
-                            'QST_required'      => 0,
1039
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1040
-                            'QST_order'         => 7,
1041
-                            'QST_admin_only'    => 0,
1042
-                            'QST_wp_user'       => self::get_default_creator_id(),
1043
-                            'QST_deleted'       => 0,
1044
-                        );
1045
-                        break;
1046
-                    case 'state':
1047
-                        $QST_values = array(
1048
-                            'QST_display_text'  => __('State/Province', 'event_espresso'),
1049
-                            'QST_admin_label'   => __('State/Province - System Question', 'event_espresso'),
1050
-                            'QST_system'        => 'state',
1051
-                            'QST_type'          => 'STATE',
1052
-                            'QST_required'      => 0,
1053
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1054
-                            'QST_order'         => 8,
1055
-                            'QST_admin_only'    => 0,
1056
-                            'QST_wp_user'       => self::get_default_creator_id(),
1057
-                            'QST_deleted'       => 0,
1058
-                        );
1059
-                        break;
1060
-                    case 'zip':
1061
-                        $QST_values = array(
1062
-                            'QST_display_text'  => __('Zip/Postal Code', 'event_espresso'),
1063
-                            'QST_admin_label'   => __('Zip/Postal Code - System Question', 'event_espresso'),
1064
-                            'QST_system'        => 'zip',
1065
-                            'QST_type'          => 'TEXT',
1066
-                            'QST_required'      => 0,
1067
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1068
-                            'QST_order'         => 9,
1069
-                            'QST_admin_only'    => 0,
1070
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1071
-                            'QST_wp_user'       => self::get_default_creator_id(),
1072
-                            'QST_deleted'       => 0,
1073
-                        );
1074
-                        break;
1075
-                    case 'phone':
1076
-                        $QST_values = array(
1077
-                            'QST_display_text'  => __('Phone Number', 'event_espresso'),
1078
-                            'QST_admin_label'   => __('Phone Number - System Question', 'event_espresso'),
1079
-                            'QST_system'        => 'phone',
1080
-                            'QST_type'          => 'TEXT',
1081
-                            'QST_required'      => 0,
1082
-                            'QST_required_text' => __('This field is required', 'event_espresso'),
1083
-                            'QST_order'         => 10,
1084
-                            'QST_admin_only'    => 0,
1085
-                            'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1086
-                            'QST_wp_user'       => self::get_default_creator_id(),
1087
-                            'QST_deleted'       => 0,
1088
-                        );
1089
-                        break;
1090
-                }
1091
-                if (! empty($QST_values)) {
1092
-                    // insert system question
1093
-                    $wpdb->insert(
1094
-                        $table_name,
1095
-                        $QST_values,
1096
-                        array('%s', '%s', '%s', '%s', '%d', '%s', '%d', '%d', '%d', '%d')
1097
-                    );
1098
-                    $QST_ID = $wpdb->insert_id;
1099
-                    // QUESTION GROUP QUESTIONS
1100
-                    if (in_array($QST_system, array('fname', 'lname', 'email'))) {
1101
-                        $system_question_we_want = EEM_Question_Group::system_personal;
1102
-                    } else {
1103
-                        $system_question_we_want = EEM_Question_Group::system_address;
1104
-                    }
1105
-                    if (isset($QSG_IDs[$system_question_we_want])) {
1106
-                        $QSG_ID = $QSG_IDs[$system_question_we_want];
1107
-                    } else {
1108
-                        $id_col = EEM_Question_Group::instance()
1109
-                                                    ->get_col(array(array('QSG_system' => $system_question_we_want)));
1110
-                        if (is_array($id_col)) {
1111
-                            $QSG_ID = reset($id_col);
1112
-                        } else {
1113
-                            //ok so we didn't find it in the db either?? that's weird because we should have inserted it at the start of this method
1114
-                            EE_Log::instance()->log(
1115
-                                __FILE__,
1116
-                                __FUNCTION__,
1117
-                                sprintf(
1118
-                                    __(
1119
-                                        'Could not associate question %1$s to a question group because no system question
836
+					'event_espresso'
837
+				),
838
+				__FILE__,
839
+				__FUNCTION__,
840
+				__LINE__
841
+			);
842
+			return false;
843
+		}
844
+		return true;
845
+	}
846
+
847
+
848
+
849
+	/**
850
+	 * initialize_system_questions
851
+	 *
852
+	 * @access public
853
+	 * @static
854
+	 * @return void
855
+	 */
856
+	public static function initialize_system_questions()
857
+	{
858
+		// QUESTION GROUPS
859
+		global $wpdb;
860
+		$table_name = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question_group');
861
+		$SQL = "SELECT QSG_system FROM $table_name WHERE QSG_system != 0";
862
+		// what we have
863
+		$question_groups = $wpdb->get_col($SQL);
864
+		// check the response
865
+		$question_groups = is_array($question_groups) ? $question_groups : array();
866
+		// what we should have
867
+		$QSG_systems = array(1, 2);
868
+		// loop thru what we should have and compare to what we have
869
+		foreach ($QSG_systems as $QSG_system) {
870
+			// reset values array
871
+			$QSG_values = array();
872
+			// if we don't have what we should have (but use $QST_system as as string because that's what we got from the db)
873
+			if (! in_array("$QSG_system", $question_groups)) {
874
+				// add it
875
+				switch ($QSG_system) {
876
+					case 1:
877
+						$QSG_values = array(
878
+							'QSG_name'            => __('Personal Information', 'event_espresso'),
879
+							'QSG_identifier'      => 'personal-information-' . time(),
880
+							'QSG_desc'            => '',
881
+							'QSG_order'           => 1,
882
+							'QSG_show_group_name' => 1,
883
+							'QSG_show_group_desc' => 1,
884
+							'QSG_system'          => EEM_Question_Group::system_personal,
885
+							'QSG_deleted'         => 0,
886
+						);
887
+						break;
888
+					case 2:
889
+						$QSG_values = array(
890
+							'QSG_name'            => __('Address Information', 'event_espresso'),
891
+							'QSG_identifier'      => 'address-information-' . time(),
892
+							'QSG_desc'            => '',
893
+							'QSG_order'           => 2,
894
+							'QSG_show_group_name' => 1,
895
+							'QSG_show_group_desc' => 1,
896
+							'QSG_system'          => EEM_Question_Group::system_address,
897
+							'QSG_deleted'         => 0,
898
+						);
899
+						break;
900
+				}
901
+				// make sure we have some values before inserting them
902
+				if (! empty($QSG_values)) {
903
+					// insert system question
904
+					$wpdb->insert(
905
+						$table_name,
906
+						$QSG_values,
907
+						array('%s', '%s', '%s', '%d', '%d', '%d', '%d', '%d')
908
+					);
909
+					$QSG_IDs[$QSG_system] = $wpdb->insert_id;
910
+				}
911
+			}
912
+		}
913
+		// QUESTIONS
914
+		global $wpdb;
915
+		$table_name = \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question');
916
+		$SQL = "SELECT QST_system FROM $table_name WHERE QST_system != ''";
917
+		// what we have
918
+		$questions = $wpdb->get_col($SQL);
919
+		// what we should have
920
+		$QST_systems = array(
921
+			'fname',
922
+			'lname',
923
+			'email',
924
+			'address',
925
+			'address2',
926
+			'city',
927
+			'country',
928
+			'state',
929
+			'zip',
930
+			'phone',
931
+		);
932
+		$order_for_group_1 = 1;
933
+		$order_for_group_2 = 1;
934
+		// loop thru what we should have and compare to what we have
935
+		foreach ($QST_systems as $QST_system) {
936
+			// reset values array
937
+			$QST_values = array();
938
+			// if we don't have what we should have
939
+			if (! in_array($QST_system, $questions)) {
940
+				// add it
941
+				switch ($QST_system) {
942
+					case 'fname':
943
+						$QST_values = array(
944
+							'QST_display_text'  => __('First Name', 'event_espresso'),
945
+							'QST_admin_label'   => __('First Name - System Question', 'event_espresso'),
946
+							'QST_system'        => 'fname',
947
+							'QST_type'          => 'TEXT',
948
+							'QST_required'      => 1,
949
+							'QST_required_text' => __('This field is required', 'event_espresso'),
950
+							'QST_order'         => 1,
951
+							'QST_admin_only'    => 0,
952
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
953
+							'QST_wp_user'       => self::get_default_creator_id(),
954
+							'QST_deleted'       => 0,
955
+						);
956
+						break;
957
+					case 'lname':
958
+						$QST_values = array(
959
+							'QST_display_text'  => __('Last Name', 'event_espresso'),
960
+							'QST_admin_label'   => __('Last Name - System Question', 'event_espresso'),
961
+							'QST_system'        => 'lname',
962
+							'QST_type'          => 'TEXT',
963
+							'QST_required'      => 1,
964
+							'QST_required_text' => __('This field is required', 'event_espresso'),
965
+							'QST_order'         => 2,
966
+							'QST_admin_only'    => 0,
967
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
968
+							'QST_wp_user'       => self::get_default_creator_id(),
969
+							'QST_deleted'       => 0,
970
+						);
971
+						break;
972
+					case 'email':
973
+						$QST_values = array(
974
+							'QST_display_text'  => __('Email Address', 'event_espresso'),
975
+							'QST_admin_label'   => __('Email Address - System Question', 'event_espresso'),
976
+							'QST_system'        => 'email',
977
+							'QST_type'          => 'EMAIL',
978
+							'QST_required'      => 1,
979
+							'QST_required_text' => __('This field is required', 'event_espresso'),
980
+							'QST_order'         => 3,
981
+							'QST_admin_only'    => 0,
982
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
983
+							'QST_wp_user'       => self::get_default_creator_id(),
984
+							'QST_deleted'       => 0,
985
+						);
986
+						break;
987
+					case 'address':
988
+						$QST_values = array(
989
+							'QST_display_text'  => __('Address', 'event_espresso'),
990
+							'QST_admin_label'   => __('Address - System Question', 'event_espresso'),
991
+							'QST_system'        => 'address',
992
+							'QST_type'          => 'TEXT',
993
+							'QST_required'      => 0,
994
+							'QST_required_text' => __('This field is required', 'event_espresso'),
995
+							'QST_order'         => 4,
996
+							'QST_admin_only'    => 0,
997
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
998
+							'QST_wp_user'       => self::get_default_creator_id(),
999
+							'QST_deleted'       => 0,
1000
+						);
1001
+						break;
1002
+					case 'address2':
1003
+						$QST_values = array(
1004
+							'QST_display_text'  => __('Address2', 'event_espresso'),
1005
+							'QST_admin_label'   => __('Address2 - System Question', 'event_espresso'),
1006
+							'QST_system'        => 'address2',
1007
+							'QST_type'          => 'TEXT',
1008
+							'QST_required'      => 0,
1009
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1010
+							'QST_order'         => 5,
1011
+							'QST_admin_only'    => 0,
1012
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1013
+							'QST_wp_user'       => self::get_default_creator_id(),
1014
+							'QST_deleted'       => 0,
1015
+						);
1016
+						break;
1017
+					case 'city':
1018
+						$QST_values = array(
1019
+							'QST_display_text'  => __('City', 'event_espresso'),
1020
+							'QST_admin_label'   => __('City - System Question', 'event_espresso'),
1021
+							'QST_system'        => 'city',
1022
+							'QST_type'          => 'TEXT',
1023
+							'QST_required'      => 0,
1024
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1025
+							'QST_order'         => 6,
1026
+							'QST_admin_only'    => 0,
1027
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1028
+							'QST_wp_user'       => self::get_default_creator_id(),
1029
+							'QST_deleted'       => 0,
1030
+						);
1031
+						break;
1032
+					case 'country':
1033
+						$QST_values = array(
1034
+							'QST_display_text'  => __('Country', 'event_espresso'),
1035
+							'QST_admin_label'   => __('Country - System Question', 'event_espresso'),
1036
+							'QST_system'        => 'country',
1037
+							'QST_type'          => 'COUNTRY',
1038
+							'QST_required'      => 0,
1039
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1040
+							'QST_order'         => 7,
1041
+							'QST_admin_only'    => 0,
1042
+							'QST_wp_user'       => self::get_default_creator_id(),
1043
+							'QST_deleted'       => 0,
1044
+						);
1045
+						break;
1046
+					case 'state':
1047
+						$QST_values = array(
1048
+							'QST_display_text'  => __('State/Province', 'event_espresso'),
1049
+							'QST_admin_label'   => __('State/Province - System Question', 'event_espresso'),
1050
+							'QST_system'        => 'state',
1051
+							'QST_type'          => 'STATE',
1052
+							'QST_required'      => 0,
1053
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1054
+							'QST_order'         => 8,
1055
+							'QST_admin_only'    => 0,
1056
+							'QST_wp_user'       => self::get_default_creator_id(),
1057
+							'QST_deleted'       => 0,
1058
+						);
1059
+						break;
1060
+					case 'zip':
1061
+						$QST_values = array(
1062
+							'QST_display_text'  => __('Zip/Postal Code', 'event_espresso'),
1063
+							'QST_admin_label'   => __('Zip/Postal Code - System Question', 'event_espresso'),
1064
+							'QST_system'        => 'zip',
1065
+							'QST_type'          => 'TEXT',
1066
+							'QST_required'      => 0,
1067
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1068
+							'QST_order'         => 9,
1069
+							'QST_admin_only'    => 0,
1070
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1071
+							'QST_wp_user'       => self::get_default_creator_id(),
1072
+							'QST_deleted'       => 0,
1073
+						);
1074
+						break;
1075
+					case 'phone':
1076
+						$QST_values = array(
1077
+							'QST_display_text'  => __('Phone Number', 'event_espresso'),
1078
+							'QST_admin_label'   => __('Phone Number - System Question', 'event_espresso'),
1079
+							'QST_system'        => 'phone',
1080
+							'QST_type'          => 'TEXT',
1081
+							'QST_required'      => 0,
1082
+							'QST_required_text' => __('This field is required', 'event_espresso'),
1083
+							'QST_order'         => 10,
1084
+							'QST_admin_only'    => 0,
1085
+							'QST_max'           => EEM_Question::instance()->absolute_max_for_system_question($QST_system),
1086
+							'QST_wp_user'       => self::get_default_creator_id(),
1087
+							'QST_deleted'       => 0,
1088
+						);
1089
+						break;
1090
+				}
1091
+				if (! empty($QST_values)) {
1092
+					// insert system question
1093
+					$wpdb->insert(
1094
+						$table_name,
1095
+						$QST_values,
1096
+						array('%s', '%s', '%s', '%s', '%d', '%s', '%d', '%d', '%d', '%d')
1097
+					);
1098
+					$QST_ID = $wpdb->insert_id;
1099
+					// QUESTION GROUP QUESTIONS
1100
+					if (in_array($QST_system, array('fname', 'lname', 'email'))) {
1101
+						$system_question_we_want = EEM_Question_Group::system_personal;
1102
+					} else {
1103
+						$system_question_we_want = EEM_Question_Group::system_address;
1104
+					}
1105
+					if (isset($QSG_IDs[$system_question_we_want])) {
1106
+						$QSG_ID = $QSG_IDs[$system_question_we_want];
1107
+					} else {
1108
+						$id_col = EEM_Question_Group::instance()
1109
+													->get_col(array(array('QSG_system' => $system_question_we_want)));
1110
+						if (is_array($id_col)) {
1111
+							$QSG_ID = reset($id_col);
1112
+						} else {
1113
+							//ok so we didn't find it in the db either?? that's weird because we should have inserted it at the start of this method
1114
+							EE_Log::instance()->log(
1115
+								__FILE__,
1116
+								__FUNCTION__,
1117
+								sprintf(
1118
+									__(
1119
+										'Could not associate question %1$s to a question group because no system question
1120 1120
                                          group existed',
1121
-                                        'event_espresso'
1122
-                                    ),
1123
-                                    $QST_ID),
1124
-                                'error');
1125
-                            continue;
1126
-                        }
1127
-                    }
1128
-                    // add system questions to groups
1129
-                    $wpdb->insert(
1130
-                        \EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question_group_question'),
1131
-                        array(
1132
-                            'QSG_ID'    => $QSG_ID,
1133
-                            'QST_ID'    => $QST_ID,
1134
-                            'QGQ_order' => ($QSG_ID === 1) ? $order_for_group_1++ : $order_for_group_2++,
1135
-                        ),
1136
-                        array('%d', '%d', '%d')
1137
-                    );
1138
-                }
1139
-            }
1140
-        }
1141
-    }
1142
-
1143
-
1144
-    /**
1145
-     * Makes sure the default payment method (Invoice) is active.
1146
-     * This used to be done automatically as part of constructing the old gateways config
1147
-     *
1148
-     * @throws \EE_Error
1149
-     */
1150
-    public static function insert_default_payment_methods()
1151
-    {
1152
-        if (! EEM_Payment_Method::instance()->count_active(EEM_Payment_Method::scope_cart)) {
1153
-            EE_Registry::instance()->load_lib('Payment_Method_Manager');
1154
-            EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
1155
-        } else {
1156
-            EEM_Payment_Method::instance()->verify_button_urls();
1157
-        }
1158
-    }
1159
-
1160
-    /**
1161
-     * insert_default_status_codes
1162
-     *
1163
-     * @access public
1164
-     * @static
1165
-     * @return void
1166
-     */
1167
-    public static function insert_default_status_codes()
1168
-    {
1169
-
1170
-        global $wpdb;
1171
-
1172
-        if (\EEH_Activation::getTableAnalysis()->tableExists(EEM_Status::instance()->table())) {
1173
-
1174
-            $table_name = EEM_Status::instance()->table();
1175
-
1176
-            $SQL = "DELETE FROM $table_name WHERE STS_ID IN ( 'ACT', 'NAC', 'NOP', 'OPN', 'CLS', 'PND', 'ONG', 'SEC', 'DRF', 'DEL', 'DEN', 'EXP', 'RPP', 'RCN', 'RDC', 'RAP', 'RNA', 'RWL', 'TAB', 'TIN', 'TFL', 'TCM', 'TOP', 'PAP', 'PCN', 'PFL', 'PDC', 'EDR', 'ESN', 'PPN', 'RIC', 'MSN', 'MFL', 'MID', 'MRS', 'MIC', 'MDO', 'MEX' );";
1177
-            $wpdb->query($SQL);
1178
-
1179
-            $SQL = "INSERT INTO $table_name
1121
+										'event_espresso'
1122
+									),
1123
+									$QST_ID),
1124
+								'error');
1125
+							continue;
1126
+						}
1127
+					}
1128
+					// add system questions to groups
1129
+					$wpdb->insert(
1130
+						\EEH_Activation::getTableAnalysis()->ensureTableNameHasPrefix('esp_question_group_question'),
1131
+						array(
1132
+							'QSG_ID'    => $QSG_ID,
1133
+							'QST_ID'    => $QST_ID,
1134
+							'QGQ_order' => ($QSG_ID === 1) ? $order_for_group_1++ : $order_for_group_2++,
1135
+						),
1136
+						array('%d', '%d', '%d')
1137
+					);
1138
+				}
1139
+			}
1140
+		}
1141
+	}
1142
+
1143
+
1144
+	/**
1145
+	 * Makes sure the default payment method (Invoice) is active.
1146
+	 * This used to be done automatically as part of constructing the old gateways config
1147
+	 *
1148
+	 * @throws \EE_Error
1149
+	 */
1150
+	public static function insert_default_payment_methods()
1151
+	{
1152
+		if (! EEM_Payment_Method::instance()->count_active(EEM_Payment_Method::scope_cart)) {
1153
+			EE_Registry::instance()->load_lib('Payment_Method_Manager');
1154
+			EE_Payment_Method_Manager::instance()->activate_a_payment_method_of_type('Invoice');
1155
+		} else {
1156
+			EEM_Payment_Method::instance()->verify_button_urls();
1157
+		}
1158
+	}
1159
+
1160
+	/**
1161
+	 * insert_default_status_codes
1162
+	 *
1163
+	 * @access public
1164
+	 * @static
1165
+	 * @return void
1166
+	 */
1167
+	public static function insert_default_status_codes()
1168
+	{
1169
+
1170
+		global $wpdb;
1171
+
1172
+		if (\EEH_Activation::getTableAnalysis()->tableExists(EEM_Status::instance()->table())) {
1173
+
1174
+			$table_name = EEM_Status::instance()->table();
1175
+
1176
+			$SQL = "DELETE FROM $table_name WHERE STS_ID IN ( 'ACT', 'NAC', 'NOP', 'OPN', 'CLS', 'PND', 'ONG', 'SEC', 'DRF', 'DEL', 'DEN', 'EXP', 'RPP', 'RCN', 'RDC', 'RAP', 'RNA', 'RWL', 'TAB', 'TIN', 'TFL', 'TCM', 'TOP', 'PAP', 'PCN', 'PFL', 'PDC', 'EDR', 'ESN', 'PPN', 'RIC', 'MSN', 'MFL', 'MID', 'MRS', 'MIC', 'MDO', 'MEX' );";
1177
+			$wpdb->query($SQL);
1178
+
1179
+			$SQL = "INSERT INTO $table_name
1180 1180
 					(STS_ID, STS_code, STS_type, STS_can_edit, STS_desc, STS_open) VALUES
1181 1181
 					('ACT', 'ACTIVE', 'event', 0, NULL, 1),
1182 1182
 					('NAC', 'NOT_ACTIVE', 'event', 0, NULL, 0),
@@ -1216,521 +1216,521 @@  discard block
 block discarded – undo
1216 1216
 					('MID', 'IDLE', 'message', 0, NULL, 1),
1217 1217
 					('MRS', 'RESEND', 'message', 0, NULL, 1),
1218 1218
 					('MIC', 'INCOMPLETE', 'message', 0, NULL, 0);";
1219
-            $wpdb->query($SQL);
1220
-
1221
-        }
1222
-
1223
-    }
1224
-
1225
-
1226
-    /**
1227
-     * create_upload_directories
1228
-     * Creates folders in the uploads directory to facilitate addons and templates
1229
-     *
1230
-     * @access public
1231
-     * @static
1232
-     * @return boolean success of verifying upload directories exist
1233
-     */
1234
-    public static function create_upload_directories()
1235
-    {
1236
-        // Create the required folders
1237
-        $folders = array(
1238
-            EVENT_ESPRESSO_TEMPLATE_DIR,
1239
-            EVENT_ESPRESSO_GATEWAY_DIR,
1240
-            EVENT_ESPRESSO_UPLOAD_DIR . 'logs/',
1241
-            EVENT_ESPRESSO_UPLOAD_DIR . 'css/',
1242
-            EVENT_ESPRESSO_UPLOAD_DIR . 'tickets/',
1243
-        );
1244
-        foreach ($folders as $folder) {
1245
-            try {
1246
-                EEH_File::ensure_folder_exists_and_is_writable($folder);
1247
-                @ chmod($folder, 0755);
1248
-            } catch (EE_Error $e) {
1249
-                EE_Error::add_error(
1250
-                    sprintf(
1251
-                        __('Could not create the folder at "%1$s" because: %2$s', 'event_espresso'),
1252
-                        $folder,
1253
-                        '<br />' . $e->getMessage()
1254
-                    ),
1255
-                    __FILE__, __FUNCTION__, __LINE__
1256
-                );
1257
-                //indicate we'll need to fix this later
1258
-                update_option(EEH_Activation::upload_directories_incomplete_option_name, true);
1259
-                return false;
1260
-            }
1261
-        }
1262
-        //just add the .htaccess file to the logs directory to begin with. Even if logging
1263
-        //is disabled, there might be activation errors recorded in there
1264
-        EEH_File::add_htaccess_deny_from_all(EVENT_ESPRESSO_UPLOAD_DIR . 'logs/');
1265
-        //remember EE's folders are all good
1266
-        delete_option(EEH_Activation::upload_directories_incomplete_option_name);
1267
-        return true;
1268
-    }
1269
-
1270
-    /**
1271
-     * Whether the upload directories need to be fixed or not.
1272
-     * If EE is installed but filesystem access isn't initially available,
1273
-     * we need to get the user's filesystem credentials and THEN create them,
1274
-     * so there might be period of time when EE is installed but its
1275
-     * upload directories aren't available. This indicates such a state
1276
-     *
1277
-     * @return boolean
1278
-     */
1279
-    public static function upload_directories_incomplete()
1280
-    {
1281
-        return get_option(EEH_Activation::upload_directories_incomplete_option_name, false);
1282
-    }
1283
-
1284
-
1285
-    /**
1286
-     * generate_default_message_templates
1287
-     *
1288
-     * @static
1289
-     * @throws EE_Error
1290
-     * @return bool     true means new templates were created.
1291
-     *                  false means no templates were created.
1292
-     *                  This is NOT an error flag. To check for errors you will want
1293
-     *                  to use either EE_Error or a try catch for an EE_Error exception.
1294
-     */
1295
-    public static function generate_default_message_templates()
1296
-    {
1297
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
1298
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1299
-        /*
1219
+			$wpdb->query($SQL);
1220
+
1221
+		}
1222
+
1223
+	}
1224
+
1225
+
1226
+	/**
1227
+	 * create_upload_directories
1228
+	 * Creates folders in the uploads directory to facilitate addons and templates
1229
+	 *
1230
+	 * @access public
1231
+	 * @static
1232
+	 * @return boolean success of verifying upload directories exist
1233
+	 */
1234
+	public static function create_upload_directories()
1235
+	{
1236
+		// Create the required folders
1237
+		$folders = array(
1238
+			EVENT_ESPRESSO_TEMPLATE_DIR,
1239
+			EVENT_ESPRESSO_GATEWAY_DIR,
1240
+			EVENT_ESPRESSO_UPLOAD_DIR . 'logs/',
1241
+			EVENT_ESPRESSO_UPLOAD_DIR . 'css/',
1242
+			EVENT_ESPRESSO_UPLOAD_DIR . 'tickets/',
1243
+		);
1244
+		foreach ($folders as $folder) {
1245
+			try {
1246
+				EEH_File::ensure_folder_exists_and_is_writable($folder);
1247
+				@ chmod($folder, 0755);
1248
+			} catch (EE_Error $e) {
1249
+				EE_Error::add_error(
1250
+					sprintf(
1251
+						__('Could not create the folder at "%1$s" because: %2$s', 'event_espresso'),
1252
+						$folder,
1253
+						'<br />' . $e->getMessage()
1254
+					),
1255
+					__FILE__, __FUNCTION__, __LINE__
1256
+				);
1257
+				//indicate we'll need to fix this later
1258
+				update_option(EEH_Activation::upload_directories_incomplete_option_name, true);
1259
+				return false;
1260
+			}
1261
+		}
1262
+		//just add the .htaccess file to the logs directory to begin with. Even if logging
1263
+		//is disabled, there might be activation errors recorded in there
1264
+		EEH_File::add_htaccess_deny_from_all(EVENT_ESPRESSO_UPLOAD_DIR . 'logs/');
1265
+		//remember EE's folders are all good
1266
+		delete_option(EEH_Activation::upload_directories_incomplete_option_name);
1267
+		return true;
1268
+	}
1269
+
1270
+	/**
1271
+	 * Whether the upload directories need to be fixed or not.
1272
+	 * If EE is installed but filesystem access isn't initially available,
1273
+	 * we need to get the user's filesystem credentials and THEN create them,
1274
+	 * so there might be period of time when EE is installed but its
1275
+	 * upload directories aren't available. This indicates such a state
1276
+	 *
1277
+	 * @return boolean
1278
+	 */
1279
+	public static function upload_directories_incomplete()
1280
+	{
1281
+		return get_option(EEH_Activation::upload_directories_incomplete_option_name, false);
1282
+	}
1283
+
1284
+
1285
+	/**
1286
+	 * generate_default_message_templates
1287
+	 *
1288
+	 * @static
1289
+	 * @throws EE_Error
1290
+	 * @return bool     true means new templates were created.
1291
+	 *                  false means no templates were created.
1292
+	 *                  This is NOT an error flag. To check for errors you will want
1293
+	 *                  to use either EE_Error or a try catch for an EE_Error exception.
1294
+	 */
1295
+	public static function generate_default_message_templates()
1296
+	{
1297
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
1298
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1299
+		/*
1300 1300
          * This first method is taking care of ensuring any default messengers
1301 1301
          * that should be made active and have templates generated are done.
1302 1302
          */
1303
-        $new_templates_created_for_messenger = self::_activate_and_generate_default_messengers_and_message_templates(
1304
-            $message_resource_manager
1305
-        );
1306
-        /**
1307
-         * This method is verifying there are no NEW default message types
1308
-         * for ACTIVE messengers that need activated (and corresponding templates setup).
1309
-         */
1310
-        $new_templates_created_for_message_type = self::_activate_new_message_types_for_active_messengers_and_generate_default_templates(
1311
-            $message_resource_manager
1312
-        );
1313
-        //after all is done, let's persist these changes to the db.
1314
-        $message_resource_manager->update_has_activated_messengers_option();
1315
-        $message_resource_manager->update_active_messengers_option();
1316
-        // will return true if either of these are true.  Otherwise will return false.
1317
-        return $new_templates_created_for_message_type || $new_templates_created_for_messenger;
1318
-    }
1319
-
1320
-
1321
-
1322
-    /**
1323
-     * @param \EE_Message_Resource_Manager $message_resource_manager
1324
-     * @return array|bool
1325
-     * @throws \EE_Error
1326
-     */
1327
-    protected static function _activate_new_message_types_for_active_messengers_and_generate_default_templates(
1328
-        EE_Message_Resource_Manager $message_resource_manager
1329
-    ) {
1330
-        /** @type EE_messenger[] $active_messengers */
1331
-        $active_messengers = $message_resource_manager->active_messengers();
1332
-        $installed_message_types = $message_resource_manager->installed_message_types();
1333
-        $templates_created = false;
1334
-        foreach ($active_messengers as $active_messenger) {
1335
-            $default_message_type_names_for_messenger = $active_messenger->get_default_message_types();
1336
-            $default_message_type_names_to_activate = array();
1337
-            // looping through each default message type reported by the messenger
1338
-            // and setup the actual message types to activate.
1339
-            foreach ($default_message_type_names_for_messenger as $default_message_type_name_for_messenger) {
1340
-                // if already active or has already been activated before we skip
1341
-                // (otherwise we might reactivate something user's intentionally deactivated.)
1342
-                // we also skip if the message type is not installed.
1343
-                if (
1344
-                    $message_resource_manager->has_message_type_been_activated_for_messenger(
1345
-                        $default_message_type_name_for_messenger,
1346
-                        $active_messenger->name
1347
-                    )
1348
-                    || $message_resource_manager->is_message_type_active_for_messenger(
1349
-                        $active_messenger->name,
1350
-                        $default_message_type_name_for_messenger
1351
-                    )
1352
-                    || ! isset($installed_message_types[$default_message_type_name_for_messenger])
1353
-                ) {
1354
-                    continue;
1355
-                }
1356
-                $default_message_type_names_to_activate[] = $default_message_type_name_for_messenger;
1357
-            }
1358
-            //let's activate!
1359
-            $message_resource_manager->ensure_message_types_are_active(
1360
-                $default_message_type_names_to_activate,
1361
-                $active_messenger->name,
1362
-                false
1363
-            );
1364
-            //activate the templates for these message types
1365
-            if ( ! empty($default_message_type_names_to_activate)) {
1366
-                $templates_created = EEH_MSG_Template::generate_new_templates(
1367
-                    $active_messenger->name,
1368
-                    $default_message_type_names_for_messenger,
1369
-                    '',
1370
-                    true
1371
-                );
1372
-            }
1373
-        }
1374
-        return $templates_created;
1375
-    }
1376
-
1377
-
1378
-
1379
-    /**
1380
-     * This will activate and generate default messengers and default message types for those messengers.
1381
-     *
1382
-     * @param EE_message_Resource_Manager $message_resource_manager
1383
-     * @return array|bool  True means there were default messengers and message type templates generated.
1384
-     *                     False means that there were no templates generated
1385
-     *                     (which could simply mean there are no default message types for a messenger).
1386
-     * @throws EE_Error
1387
-     */
1388
-    protected static function _activate_and_generate_default_messengers_and_message_templates(
1389
-        EE_Message_Resource_Manager $message_resource_manager
1390
-    ) {
1391
-        /** @type EE_messenger[] $messengers_to_generate */
1392
-        $messengers_to_generate = self::_get_default_messengers_to_generate_on_activation($message_resource_manager);
1393
-        $installed_message_types = $message_resource_manager->installed_message_types();
1394
-        $templates_generated = false;
1395
-        foreach ($messengers_to_generate as $messenger_to_generate) {
1396
-            $default_message_type_names_for_messenger = $messenger_to_generate->get_default_message_types();
1397
-            //verify the default message types match an installed message type.
1398
-            foreach ($default_message_type_names_for_messenger as $key => $name) {
1399
-                if (
1400
-                    ! isset($installed_message_types[$name])
1401
-                    || $message_resource_manager->has_message_type_been_activated_for_messenger(
1402
-                        $name,
1403
-                        $messenger_to_generate->name
1404
-                    )
1405
-                ) {
1406
-                    unset($default_message_type_names_for_messenger[$key]);
1407
-                }
1408
-            }
1409
-            // in previous iterations, the active_messengers option in the db
1410
-            // needed updated before calling create templates. however with the changes this may not be necessary.
1411
-            // This comment is left here just in case we discover that we _do_ need to update before
1412
-            // passing off to create templates (after the refactor is done).
1413
-            // @todo remove this comment when determined not necessary.
1414
-            $message_resource_manager->activate_messenger(
1415
-                $messenger_to_generate->name,
1416
-                $default_message_type_names_for_messenger,
1417
-                false
1418
-            );
1419
-            //create any templates needing created (or will reactivate templates already generated as necessary).
1420
-            if ( ! empty($default_message_type_names_for_messenger)) {
1421
-                $templates_generated = EEH_MSG_Template::generate_new_templates(
1422
-                    $messenger_to_generate->name,
1423
-                    $default_message_type_names_for_messenger,
1424
-                    '',
1425
-                    true
1426
-                );
1427
-            }
1428
-        }
1429
-        return $templates_generated;
1430
-    }
1431
-
1432
-
1433
-    /**
1434
-     * This returns the default messengers to generate templates for on activation of EE.
1435
-     * It considers:
1436
-     * - whether a messenger is already active in the db.
1437
-     * - whether a messenger has been made active at any time in the past.
1438
-     *
1439
-     * @static
1440
-     * @param  EE_Message_Resource_Manager $message_resource_manager
1441
-     * @return EE_messenger[]
1442
-     */
1443
-    protected static function _get_default_messengers_to_generate_on_activation(
1444
-        EE_Message_Resource_Manager $message_resource_manager
1445
-    ) {
1446
-        $active_messengers    = $message_resource_manager->active_messengers();
1447
-        $installed_messengers = $message_resource_manager->installed_messengers();
1448
-        $has_activated        = $message_resource_manager->get_has_activated_messengers_option();
1449
-
1450
-        $messengers_to_generate = array();
1451
-        foreach ($installed_messengers as $installed_messenger) {
1452
-            //if installed messenger is a messenger that should be activated on install
1453
-            //and is not already active
1454
-            //and has never been activated
1455
-            if (
1456
-                ! $installed_messenger->activate_on_install
1457
-                || isset($active_messengers[$installed_messenger->name])
1458
-                || isset($has_activated[$installed_messenger->name])
1459
-            ) {
1460
-                continue;
1461
-            }
1462
-            $messengers_to_generate[$installed_messenger->name] = $installed_messenger;
1463
-        }
1464
-        return $messengers_to_generate;
1465
-    }
1466
-
1467
-
1468
-    /**
1469
-     * This simply validates active message types to ensure they actually match installed
1470
-     * message types.  If there's a mismatch then we deactivate the message type and ensure all related db
1471
-     * rows are set inactive.
1472
-     * Note: Messengers are no longer validated here as of 4.9.0 because they get validated automatically whenever
1473
-     * EE_Messenger_Resource_Manager is constructed.  Message Types are a bit more resource heavy for validation so they
1474
-     * are still handled in here.
1475
-     *
1476
-     * @since 4.3.1
1477
-     * @return void
1478
-     */
1479
-    public static function validate_messages_system()
1480
-    {
1481
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
1482
-        $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1483
-        $message_resource_manager->validate_active_message_types_are_installed();
1484
-        do_action('AHEE__EEH_Activation__validate_messages_system');
1485
-    }
1486
-
1487
-
1488
-    /**
1489
-     * create_no_ticket_prices_array
1490
-     *
1491
-     * @access public
1492
-     * @static
1493
-     * @return void
1494
-     */
1495
-    public static function create_no_ticket_prices_array()
1496
-    {
1497
-        // this creates an array for tracking events that have no active ticket prices created
1498
-        // this allows us to warn admins of the situation so that it can be corrected
1499
-        $espresso_no_ticket_prices = get_option('ee_no_ticket_prices', false);
1500
-        if (! $espresso_no_ticket_prices) {
1501
-            add_option('ee_no_ticket_prices', array(), '', false);
1502
-        }
1503
-    }
1504
-
1505
-
1506
-    /**
1507
-     * plugin_deactivation
1508
-     *
1509
-     * @access public
1510
-     * @static
1511
-     * @return void
1512
-     */
1513
-    public static function plugin_deactivation()
1514
-    {
1515
-    }
1516
-
1517
-
1518
-    /**
1519
-     * Finds all our EE4 custom post types, and deletes them and their associated data
1520
-     * (like post meta or term relations)
1521
-     *
1522
-     * @global wpdb $wpdb
1523
-     * @throws \EE_Error
1524
-     */
1525
-    public static function delete_all_espresso_cpt_data()
1526
-    {
1527
-        global $wpdb;
1528
-        //get all the CPT post_types
1529
-        $ee_post_types = array();
1530
-        foreach (EE_Registry::instance()->non_abstract_db_models as $model_name) {
1531
-            if (method_exists($model_name, 'instance')) {
1532
-                $model_obj = call_user_func(array($model_name, 'instance'));
1533
-                if ($model_obj instanceof EEM_CPT_Base) {
1534
-                    $ee_post_types[] = $wpdb->prepare("%s", $model_obj->post_type());
1535
-                }
1536
-            }
1537
-        }
1538
-        //get all our CPTs
1539
-        $query   = "SELECT ID FROM {$wpdb->posts} WHERE post_type IN (" . implode(",", $ee_post_types) . ")";
1540
-        $cpt_ids = $wpdb->get_col($query);
1541
-        //delete each post meta and term relations too
1542
-        foreach ($cpt_ids as $post_id) {
1543
-            wp_delete_post($post_id, true);
1544
-        }
1545
-    }
1546
-
1547
-    /**
1548
-     * Deletes all EE custom tables
1549
-     *
1550
-     * @return array
1551
-     */
1552
-    public static function drop_espresso_tables()
1553
-    {
1554
-        $tables = array();
1555
-        // load registry
1556
-        foreach (EE_Registry::instance()->non_abstract_db_models as $model_name) {
1557
-            if (method_exists($model_name, 'instance')) {
1558
-                $model_obj = call_user_func(array($model_name, 'instance'));
1559
-                if ($model_obj instanceof EEM_Base) {
1560
-                    foreach ($model_obj->get_tables() as $table) {
1561
-                        if (strpos($table->get_table_name(), 'esp_')
1562
-                            &&
1563
-                            (
1564
-                                is_main_site()//main site? nuke them all
1565
-                                || ! $table->is_global()//not main site,but not global either. nuke it
1566
-                            )
1567
-                        ) {
1568
-                            $tables[$table->get_table_name()] = $table->get_table_name();
1569
-                        }
1570
-                    }
1571
-                }
1572
-            }
1573
-        }
1574
-
1575
-        //there are some tables whose models were removed.
1576
-        //they should be removed when removing all EE core's data
1577
-        $tables_without_models = array(
1578
-            'esp_promotion',
1579
-            'esp_promotion_applied',
1580
-            'esp_promotion_object',
1581
-            'esp_promotion_rule',
1582
-            'esp_rule',
1583
-        );
1584
-        foreach ($tables_without_models as $table) {
1585
-            $tables[$table] = $table;
1586
-        }
1587
-        return \EEH_Activation::getTableManager()->dropTables($tables);
1588
-    }
1589
-
1590
-
1591
-
1592
-    /**
1593
-     * Drops all the tables mentioned in a single MYSQL query. Double-checks
1594
-     * each table name provided has a wpdb prefix attached, and that it exists.
1595
-     * Returns the list actually deleted
1596
-     *
1597
-     * @deprecated in 4.9.13. Instead use TableManager::dropTables()
1598
-     * @global WPDB $wpdb
1599
-     * @param array $table_names
1600
-     * @return array of table names which we deleted
1601
-     */
1602
-    public static function drop_tables($table_names)
1603
-    {
1604
-        return \EEH_Activation::getTableManager()->dropTables($table_names);
1605
-    }
1606
-
1607
-
1608
-
1609
-    /**
1610
-     * plugin_uninstall
1611
-     *
1612
-     * @access public
1613
-     * @static
1614
-     * @param bool $remove_all
1615
-     * @return void
1616
-     */
1617
-    public static function delete_all_espresso_tables_and_data($remove_all = true)
1618
-    {
1619
-        global $wpdb;
1620
-        self::drop_espresso_tables();
1621
-        $wp_options_to_delete = array(
1622
-            'ee_no_ticket_prices'                => true,
1623
-            'ee_active_messengers'               => true,
1624
-            'ee_has_activated_messenger'         => true,
1625
-            'ee_flush_rewrite_rules'             => true,
1626
-            'ee_config'                          => false,
1627
-            'ee_data_migration_current_db_state' => true,
1628
-            'ee_data_migration_mapping_'         => false,
1629
-            'ee_data_migration_script_'          => false,
1630
-            'ee_data_migrations'                 => true,
1631
-            'ee_dms_map'                         => false,
1632
-            'ee_notices'                         => true,
1633
-            'lang_file_check_'                   => false,
1634
-            'ee_maintenance_mode'                => true,
1635
-            'ee_ueip_optin'                      => true,
1636
-            'ee_ueip_has_notified'               => true,
1637
-            'ee_plugin_activation_errors'        => true,
1638
-            'ee_id_mapping_from'                 => false,
1639
-            'espresso_persistent_admin_notices'  => true,
1640
-            'ee_encryption_key'                  => true,
1641
-            'pue_force_upgrade_'                 => false,
1642
-            'pue_json_error_'                    => false,
1643
-            'pue_install_key_'                   => false,
1644
-            'pue_verification_error_'            => false,
1645
-            'pu_dismissed_upgrade_'              => false,
1646
-            'external_updates-'                  => false,
1647
-            'ee_extra_data'                      => true,
1648
-            'ee_ssn_'                            => false,
1649
-            'ee_rss_'                            => false,
1650
-            'ee_rte_n_tx_'                       => false,
1651
-            'ee_pers_admin_notices'              => true,
1652
-            'ee_job_parameters_'                 => false,
1653
-            'ee_upload_directories_incomplete'   => true,
1654
-            'ee_verified_db_collations'          => true,
1655
-        );
1656
-        if (is_main_site()) {
1657
-            $wp_options_to_delete['ee_network_config'] = true;
1658
-        }
1659
-        $undeleted_options = array();
1660
-        foreach ($wp_options_to_delete as $option_name => $no_wildcard) {
1661
-            if ($no_wildcard) {
1662
-                if ( ! delete_option($option_name)) {
1663
-                    $undeleted_options[] = $option_name;
1664
-                }
1665
-            } else {
1666
-                $option_names_to_delete_from_wildcard = $wpdb->get_col("SELECT option_name FROM $wpdb->options WHERE option_name LIKE '%$option_name%'");
1667
-                foreach ($option_names_to_delete_from_wildcard as $option_name_from_wildcard) {
1668
-                    if ( ! delete_option($option_name_from_wildcard)) {
1669
-                        $undeleted_options[] = $option_name_from_wildcard;
1670
-                    }
1671
-                }
1672
-            }
1673
-        }
1674
-        //also, let's make sure the "ee_config_option_names" wp option stays out by removing the action that adds it
1675
-        remove_action('shutdown', array(EE_Config::instance(), 'shutdown'), 10);
1676
-        if ($remove_all && $espresso_db_update = get_option('espresso_db_update')) {
1677
-            $db_update_sans_ee4 = array();
1678
-            foreach ($espresso_db_update as $version => $times_activated) {
1679
-                if ((string)$version[0] === '3') {//if its NON EE4
1680
-                    $db_update_sans_ee4[$version] = $times_activated;
1681
-                }
1682
-            }
1683
-            update_option('espresso_db_update', $db_update_sans_ee4);
1684
-        }
1685
-        $errors = '';
1686
-        if ( ! empty($undeleted_options)) {
1687
-            $errors .= sprintf(
1688
-                __('The following wp-options could not be deleted: %s%s', 'event_espresso'),
1689
-                '<br/>',
1690
-                implode(',<br/>', $undeleted_options)
1691
-            );
1692
-        }
1693
-        if ( ! empty($errors)) {
1694
-            EE_Error::add_attention($errors, __FILE__, __FUNCTION__, __LINE__);
1695
-        }
1696
-    }
1697
-
1698
-    /**
1699
-     * Gets the mysql error code from the last used query by wpdb
1700
-     *
1701
-     * @return int mysql error code, see https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html
1702
-     */
1703
-    public static function last_wpdb_error_code()
1704
-    {
1705
-        global $wpdb;
1706
-        if ($wpdb->use_mysqli) {
1707
-            return mysqli_errno($wpdb->dbh);
1708
-        } else {
1709
-            return mysql_errno($wpdb->dbh);
1710
-        }
1711
-    }
1712
-
1713
-    /**
1714
-     * Checks that the database table exists. Also works on temporary tables (for unit tests mostly).
1715
-     *
1716
-     * @global wpdb  $wpdb
1717
-     * @deprecated instead use TableAnalysis::tableExists()
1718
-     * @param string $table_name with or without $wpdb->prefix
1719
-     * @return boolean
1720
-     */
1721
-    public static function table_exists($table_name)
1722
-    {
1723
-        return \EEH_Activation::getTableAnalysis()->tableExists($table_name);
1724
-    }
1725
-
1726
-    /**
1727
-     * Resets the cache on EEH_Activation
1728
-     */
1729
-    public static function reset()
1730
-    {
1731
-        self::$_default_creator_id                             = null;
1732
-        self::$_initialized_db_content_already_in_this_request = false;
1733
-    }
1303
+		$new_templates_created_for_messenger = self::_activate_and_generate_default_messengers_and_message_templates(
1304
+			$message_resource_manager
1305
+		);
1306
+		/**
1307
+		 * This method is verifying there are no NEW default message types
1308
+		 * for ACTIVE messengers that need activated (and corresponding templates setup).
1309
+		 */
1310
+		$new_templates_created_for_message_type = self::_activate_new_message_types_for_active_messengers_and_generate_default_templates(
1311
+			$message_resource_manager
1312
+		);
1313
+		//after all is done, let's persist these changes to the db.
1314
+		$message_resource_manager->update_has_activated_messengers_option();
1315
+		$message_resource_manager->update_active_messengers_option();
1316
+		// will return true if either of these are true.  Otherwise will return false.
1317
+		return $new_templates_created_for_message_type || $new_templates_created_for_messenger;
1318
+	}
1319
+
1320
+
1321
+
1322
+	/**
1323
+	 * @param \EE_Message_Resource_Manager $message_resource_manager
1324
+	 * @return array|bool
1325
+	 * @throws \EE_Error
1326
+	 */
1327
+	protected static function _activate_new_message_types_for_active_messengers_and_generate_default_templates(
1328
+		EE_Message_Resource_Manager $message_resource_manager
1329
+	) {
1330
+		/** @type EE_messenger[] $active_messengers */
1331
+		$active_messengers = $message_resource_manager->active_messengers();
1332
+		$installed_message_types = $message_resource_manager->installed_message_types();
1333
+		$templates_created = false;
1334
+		foreach ($active_messengers as $active_messenger) {
1335
+			$default_message_type_names_for_messenger = $active_messenger->get_default_message_types();
1336
+			$default_message_type_names_to_activate = array();
1337
+			// looping through each default message type reported by the messenger
1338
+			// and setup the actual message types to activate.
1339
+			foreach ($default_message_type_names_for_messenger as $default_message_type_name_for_messenger) {
1340
+				// if already active or has already been activated before we skip
1341
+				// (otherwise we might reactivate something user's intentionally deactivated.)
1342
+				// we also skip if the message type is not installed.
1343
+				if (
1344
+					$message_resource_manager->has_message_type_been_activated_for_messenger(
1345
+						$default_message_type_name_for_messenger,
1346
+						$active_messenger->name
1347
+					)
1348
+					|| $message_resource_manager->is_message_type_active_for_messenger(
1349
+						$active_messenger->name,
1350
+						$default_message_type_name_for_messenger
1351
+					)
1352
+					|| ! isset($installed_message_types[$default_message_type_name_for_messenger])
1353
+				) {
1354
+					continue;
1355
+				}
1356
+				$default_message_type_names_to_activate[] = $default_message_type_name_for_messenger;
1357
+			}
1358
+			//let's activate!
1359
+			$message_resource_manager->ensure_message_types_are_active(
1360
+				$default_message_type_names_to_activate,
1361
+				$active_messenger->name,
1362
+				false
1363
+			);
1364
+			//activate the templates for these message types
1365
+			if ( ! empty($default_message_type_names_to_activate)) {
1366
+				$templates_created = EEH_MSG_Template::generate_new_templates(
1367
+					$active_messenger->name,
1368
+					$default_message_type_names_for_messenger,
1369
+					'',
1370
+					true
1371
+				);
1372
+			}
1373
+		}
1374
+		return $templates_created;
1375
+	}
1376
+
1377
+
1378
+
1379
+	/**
1380
+	 * This will activate and generate default messengers and default message types for those messengers.
1381
+	 *
1382
+	 * @param EE_message_Resource_Manager $message_resource_manager
1383
+	 * @return array|bool  True means there were default messengers and message type templates generated.
1384
+	 *                     False means that there were no templates generated
1385
+	 *                     (which could simply mean there are no default message types for a messenger).
1386
+	 * @throws EE_Error
1387
+	 */
1388
+	protected static function _activate_and_generate_default_messengers_and_message_templates(
1389
+		EE_Message_Resource_Manager $message_resource_manager
1390
+	) {
1391
+		/** @type EE_messenger[] $messengers_to_generate */
1392
+		$messengers_to_generate = self::_get_default_messengers_to_generate_on_activation($message_resource_manager);
1393
+		$installed_message_types = $message_resource_manager->installed_message_types();
1394
+		$templates_generated = false;
1395
+		foreach ($messengers_to_generate as $messenger_to_generate) {
1396
+			$default_message_type_names_for_messenger = $messenger_to_generate->get_default_message_types();
1397
+			//verify the default message types match an installed message type.
1398
+			foreach ($default_message_type_names_for_messenger as $key => $name) {
1399
+				if (
1400
+					! isset($installed_message_types[$name])
1401
+					|| $message_resource_manager->has_message_type_been_activated_for_messenger(
1402
+						$name,
1403
+						$messenger_to_generate->name
1404
+					)
1405
+				) {
1406
+					unset($default_message_type_names_for_messenger[$key]);
1407
+				}
1408
+			}
1409
+			// in previous iterations, the active_messengers option in the db
1410
+			// needed updated before calling create templates. however with the changes this may not be necessary.
1411
+			// This comment is left here just in case we discover that we _do_ need to update before
1412
+			// passing off to create templates (after the refactor is done).
1413
+			// @todo remove this comment when determined not necessary.
1414
+			$message_resource_manager->activate_messenger(
1415
+				$messenger_to_generate->name,
1416
+				$default_message_type_names_for_messenger,
1417
+				false
1418
+			);
1419
+			//create any templates needing created (or will reactivate templates already generated as necessary).
1420
+			if ( ! empty($default_message_type_names_for_messenger)) {
1421
+				$templates_generated = EEH_MSG_Template::generate_new_templates(
1422
+					$messenger_to_generate->name,
1423
+					$default_message_type_names_for_messenger,
1424
+					'',
1425
+					true
1426
+				);
1427
+			}
1428
+		}
1429
+		return $templates_generated;
1430
+	}
1431
+
1432
+
1433
+	/**
1434
+	 * This returns the default messengers to generate templates for on activation of EE.
1435
+	 * It considers:
1436
+	 * - whether a messenger is already active in the db.
1437
+	 * - whether a messenger has been made active at any time in the past.
1438
+	 *
1439
+	 * @static
1440
+	 * @param  EE_Message_Resource_Manager $message_resource_manager
1441
+	 * @return EE_messenger[]
1442
+	 */
1443
+	protected static function _get_default_messengers_to_generate_on_activation(
1444
+		EE_Message_Resource_Manager $message_resource_manager
1445
+	) {
1446
+		$active_messengers    = $message_resource_manager->active_messengers();
1447
+		$installed_messengers = $message_resource_manager->installed_messengers();
1448
+		$has_activated        = $message_resource_manager->get_has_activated_messengers_option();
1449
+
1450
+		$messengers_to_generate = array();
1451
+		foreach ($installed_messengers as $installed_messenger) {
1452
+			//if installed messenger is a messenger that should be activated on install
1453
+			//and is not already active
1454
+			//and has never been activated
1455
+			if (
1456
+				! $installed_messenger->activate_on_install
1457
+				|| isset($active_messengers[$installed_messenger->name])
1458
+				|| isset($has_activated[$installed_messenger->name])
1459
+			) {
1460
+				continue;
1461
+			}
1462
+			$messengers_to_generate[$installed_messenger->name] = $installed_messenger;
1463
+		}
1464
+		return $messengers_to_generate;
1465
+	}
1466
+
1467
+
1468
+	/**
1469
+	 * This simply validates active message types to ensure they actually match installed
1470
+	 * message types.  If there's a mismatch then we deactivate the message type and ensure all related db
1471
+	 * rows are set inactive.
1472
+	 * Note: Messengers are no longer validated here as of 4.9.0 because they get validated automatically whenever
1473
+	 * EE_Messenger_Resource_Manager is constructed.  Message Types are a bit more resource heavy for validation so they
1474
+	 * are still handled in here.
1475
+	 *
1476
+	 * @since 4.3.1
1477
+	 * @return void
1478
+	 */
1479
+	public static function validate_messages_system()
1480
+	{
1481
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
1482
+		$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
1483
+		$message_resource_manager->validate_active_message_types_are_installed();
1484
+		do_action('AHEE__EEH_Activation__validate_messages_system');
1485
+	}
1486
+
1487
+
1488
+	/**
1489
+	 * create_no_ticket_prices_array
1490
+	 *
1491
+	 * @access public
1492
+	 * @static
1493
+	 * @return void
1494
+	 */
1495
+	public static function create_no_ticket_prices_array()
1496
+	{
1497
+		// this creates an array for tracking events that have no active ticket prices created
1498
+		// this allows us to warn admins of the situation so that it can be corrected
1499
+		$espresso_no_ticket_prices = get_option('ee_no_ticket_prices', false);
1500
+		if (! $espresso_no_ticket_prices) {
1501
+			add_option('ee_no_ticket_prices', array(), '', false);
1502
+		}
1503
+	}
1504
+
1505
+
1506
+	/**
1507
+	 * plugin_deactivation
1508
+	 *
1509
+	 * @access public
1510
+	 * @static
1511
+	 * @return void
1512
+	 */
1513
+	public static function plugin_deactivation()
1514
+	{
1515
+	}
1516
+
1517
+
1518
+	/**
1519
+	 * Finds all our EE4 custom post types, and deletes them and their associated data
1520
+	 * (like post meta or term relations)
1521
+	 *
1522
+	 * @global wpdb $wpdb
1523
+	 * @throws \EE_Error
1524
+	 */
1525
+	public static function delete_all_espresso_cpt_data()
1526
+	{
1527
+		global $wpdb;
1528
+		//get all the CPT post_types
1529
+		$ee_post_types = array();
1530
+		foreach (EE_Registry::instance()->non_abstract_db_models as $model_name) {
1531
+			if (method_exists($model_name, 'instance')) {
1532
+				$model_obj = call_user_func(array($model_name, 'instance'));
1533
+				if ($model_obj instanceof EEM_CPT_Base) {
1534
+					$ee_post_types[] = $wpdb->prepare("%s", $model_obj->post_type());
1535
+				}
1536
+			}
1537
+		}
1538
+		//get all our CPTs
1539
+		$query   = "SELECT ID FROM {$wpdb->posts} WHERE post_type IN (" . implode(",", $ee_post_types) . ")";
1540
+		$cpt_ids = $wpdb->get_col($query);
1541
+		//delete each post meta and term relations too
1542
+		foreach ($cpt_ids as $post_id) {
1543
+			wp_delete_post($post_id, true);
1544
+		}
1545
+	}
1546
+
1547
+	/**
1548
+	 * Deletes all EE custom tables
1549
+	 *
1550
+	 * @return array
1551
+	 */
1552
+	public static function drop_espresso_tables()
1553
+	{
1554
+		$tables = array();
1555
+		// load registry
1556
+		foreach (EE_Registry::instance()->non_abstract_db_models as $model_name) {
1557
+			if (method_exists($model_name, 'instance')) {
1558
+				$model_obj = call_user_func(array($model_name, 'instance'));
1559
+				if ($model_obj instanceof EEM_Base) {
1560
+					foreach ($model_obj->get_tables() as $table) {
1561
+						if (strpos($table->get_table_name(), 'esp_')
1562
+							&&
1563
+							(
1564
+								is_main_site()//main site? nuke them all
1565
+								|| ! $table->is_global()//not main site,but not global either. nuke it
1566
+							)
1567
+						) {
1568
+							$tables[$table->get_table_name()] = $table->get_table_name();
1569
+						}
1570
+					}
1571
+				}
1572
+			}
1573
+		}
1574
+
1575
+		//there are some tables whose models were removed.
1576
+		//they should be removed when removing all EE core's data
1577
+		$tables_without_models = array(
1578
+			'esp_promotion',
1579
+			'esp_promotion_applied',
1580
+			'esp_promotion_object',
1581
+			'esp_promotion_rule',
1582
+			'esp_rule',
1583
+		);
1584
+		foreach ($tables_without_models as $table) {
1585
+			$tables[$table] = $table;
1586
+		}
1587
+		return \EEH_Activation::getTableManager()->dropTables($tables);
1588
+	}
1589
+
1590
+
1591
+
1592
+	/**
1593
+	 * Drops all the tables mentioned in a single MYSQL query. Double-checks
1594
+	 * each table name provided has a wpdb prefix attached, and that it exists.
1595
+	 * Returns the list actually deleted
1596
+	 *
1597
+	 * @deprecated in 4.9.13. Instead use TableManager::dropTables()
1598
+	 * @global WPDB $wpdb
1599
+	 * @param array $table_names
1600
+	 * @return array of table names which we deleted
1601
+	 */
1602
+	public static function drop_tables($table_names)
1603
+	{
1604
+		return \EEH_Activation::getTableManager()->dropTables($table_names);
1605
+	}
1606
+
1607
+
1608
+
1609
+	/**
1610
+	 * plugin_uninstall
1611
+	 *
1612
+	 * @access public
1613
+	 * @static
1614
+	 * @param bool $remove_all
1615
+	 * @return void
1616
+	 */
1617
+	public static function delete_all_espresso_tables_and_data($remove_all = true)
1618
+	{
1619
+		global $wpdb;
1620
+		self::drop_espresso_tables();
1621
+		$wp_options_to_delete = array(
1622
+			'ee_no_ticket_prices'                => true,
1623
+			'ee_active_messengers'               => true,
1624
+			'ee_has_activated_messenger'         => true,
1625
+			'ee_flush_rewrite_rules'             => true,
1626
+			'ee_config'                          => false,
1627
+			'ee_data_migration_current_db_state' => true,
1628
+			'ee_data_migration_mapping_'         => false,
1629
+			'ee_data_migration_script_'          => false,
1630
+			'ee_data_migrations'                 => true,
1631
+			'ee_dms_map'                         => false,
1632
+			'ee_notices'                         => true,
1633
+			'lang_file_check_'                   => false,
1634
+			'ee_maintenance_mode'                => true,
1635
+			'ee_ueip_optin'                      => true,
1636
+			'ee_ueip_has_notified'               => true,
1637
+			'ee_plugin_activation_errors'        => true,
1638
+			'ee_id_mapping_from'                 => false,
1639
+			'espresso_persistent_admin_notices'  => true,
1640
+			'ee_encryption_key'                  => true,
1641
+			'pue_force_upgrade_'                 => false,
1642
+			'pue_json_error_'                    => false,
1643
+			'pue_install_key_'                   => false,
1644
+			'pue_verification_error_'            => false,
1645
+			'pu_dismissed_upgrade_'              => false,
1646
+			'external_updates-'                  => false,
1647
+			'ee_extra_data'                      => true,
1648
+			'ee_ssn_'                            => false,
1649
+			'ee_rss_'                            => false,
1650
+			'ee_rte_n_tx_'                       => false,
1651
+			'ee_pers_admin_notices'              => true,
1652
+			'ee_job_parameters_'                 => false,
1653
+			'ee_upload_directories_incomplete'   => true,
1654
+			'ee_verified_db_collations'          => true,
1655
+		);
1656
+		if (is_main_site()) {
1657
+			$wp_options_to_delete['ee_network_config'] = true;
1658
+		}
1659
+		$undeleted_options = array();
1660
+		foreach ($wp_options_to_delete as $option_name => $no_wildcard) {
1661
+			if ($no_wildcard) {
1662
+				if ( ! delete_option($option_name)) {
1663
+					$undeleted_options[] = $option_name;
1664
+				}
1665
+			} else {
1666
+				$option_names_to_delete_from_wildcard = $wpdb->get_col("SELECT option_name FROM $wpdb->options WHERE option_name LIKE '%$option_name%'");
1667
+				foreach ($option_names_to_delete_from_wildcard as $option_name_from_wildcard) {
1668
+					if ( ! delete_option($option_name_from_wildcard)) {
1669
+						$undeleted_options[] = $option_name_from_wildcard;
1670
+					}
1671
+				}
1672
+			}
1673
+		}
1674
+		//also, let's make sure the "ee_config_option_names" wp option stays out by removing the action that adds it
1675
+		remove_action('shutdown', array(EE_Config::instance(), 'shutdown'), 10);
1676
+		if ($remove_all && $espresso_db_update = get_option('espresso_db_update')) {
1677
+			$db_update_sans_ee4 = array();
1678
+			foreach ($espresso_db_update as $version => $times_activated) {
1679
+				if ((string)$version[0] === '3') {//if its NON EE4
1680
+					$db_update_sans_ee4[$version] = $times_activated;
1681
+				}
1682
+			}
1683
+			update_option('espresso_db_update', $db_update_sans_ee4);
1684
+		}
1685
+		$errors = '';
1686
+		if ( ! empty($undeleted_options)) {
1687
+			$errors .= sprintf(
1688
+				__('The following wp-options could not be deleted: %s%s', 'event_espresso'),
1689
+				'<br/>',
1690
+				implode(',<br/>', $undeleted_options)
1691
+			);
1692
+		}
1693
+		if ( ! empty($errors)) {
1694
+			EE_Error::add_attention($errors, __FILE__, __FUNCTION__, __LINE__);
1695
+		}
1696
+	}
1697
+
1698
+	/**
1699
+	 * Gets the mysql error code from the last used query by wpdb
1700
+	 *
1701
+	 * @return int mysql error code, see https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html
1702
+	 */
1703
+	public static function last_wpdb_error_code()
1704
+	{
1705
+		global $wpdb;
1706
+		if ($wpdb->use_mysqli) {
1707
+			return mysqli_errno($wpdb->dbh);
1708
+		} else {
1709
+			return mysql_errno($wpdb->dbh);
1710
+		}
1711
+	}
1712
+
1713
+	/**
1714
+	 * Checks that the database table exists. Also works on temporary tables (for unit tests mostly).
1715
+	 *
1716
+	 * @global wpdb  $wpdb
1717
+	 * @deprecated instead use TableAnalysis::tableExists()
1718
+	 * @param string $table_name with or without $wpdb->prefix
1719
+	 * @return boolean
1720
+	 */
1721
+	public static function table_exists($table_name)
1722
+	{
1723
+		return \EEH_Activation::getTableAnalysis()->tableExists($table_name);
1724
+	}
1725
+
1726
+	/**
1727
+	 * Resets the cache on EEH_Activation
1728
+	 */
1729
+	public static function reset()
1730
+	{
1731
+		self::$_default_creator_id                             = null;
1732
+		self::$_initialized_db_content_already_in_this_request = false;
1733
+	}
1734 1734
 }
1735 1735
 // End of file EEH_Activation.helper.php
1736 1736
 // Location: /helpers/EEH_Activation.core.php
Please login to merge, or discard this patch.
core/EE_System.core.php 2 patches
Indentation   +1406 added lines, -1406 removed lines patch added patch discarded remove patch
@@ -6,7 +6,7 @@  discard block
 block discarded – undo
6 6
 
7 7
 
8 8
 if ( ! defined('EVENT_ESPRESSO_VERSION')) {
9
-    exit('No direct script access allowed');
9
+	exit('No direct script access allowed');
10 10
 }
11 11
 
12 12
 
@@ -23,1411 +23,1411 @@  discard block
 block discarded – undo
23 23
 {
24 24
 
25 25
 
26
-    /**
27
-     * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
28
-     * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
29
-     */
30
-    const req_type_normal = 0;
31
-
32
-    /**
33
-     * Indicates this is a brand new installation of EE so we should install
34
-     * tables and default data etc
35
-     */
36
-    const req_type_new_activation = 1;
37
-
38
-    /**
39
-     * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
40
-     * and we just exited maintenance mode). We MUST check the database is setup properly
41
-     * and that default data is setup too
42
-     */
43
-    const req_type_reactivation = 2;
44
-
45
-    /**
46
-     * indicates that EE has been upgraded since its previous request.
47
-     * We may have data migration scripts to call and will want to trigger maintenance mode
48
-     */
49
-    const req_type_upgrade = 3;
50
-
51
-    /**
52
-     * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
53
-     */
54
-    const req_type_downgrade = 4;
55
-
56
-    /**
57
-     * @deprecated since version 4.6.0.dev.006
58
-     * Now whenever a new_activation is detected the request type is still just
59
-     * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
60
-     * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
61
-     * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
62
-     * (Specifically, when the migration manager indicates migrations are finished
63
-     * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
64
-     */
65
-    const req_type_activation_but_not_installed = 5;
66
-
67
-    /**
68
-     * option prefix for recording the activation history (like core's "espresso_db_update") of addons
69
-     */
70
-    const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
71
-
72
-
73
-    /**
74
-     * @var EE_System $_instance
75
-     */
76
-    private static $_instance;
77
-
78
-    /**
79
-     * @var EE_Registry $registry
80
-     */
81
-    protected $registry;
82
-
83
-    /**
84
-     * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
85
-     * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
86
-     *
87
-     * @var int $_req_type
88
-     */
89
-    private $_req_type;
90
-
91
-    /**
92
-     * Whether or not there was a non-micro version change in EE core version during this request
93
-     *
94
-     * @var boolean $_major_version_change
95
-     */
96
-    private $_major_version_change = false;
97
-
98
-
99
-
100
-    /**
101
-     * @singleton method used to instantiate class object
102
-     * @access    public
103
-     * @param  EE_Registry $Registry
104
-     * @return EE_System
105
-     */
106
-    public static function instance(EE_Registry $Registry = null)
107
-    {
108
-        // check if class object is instantiated
109
-        if ( ! self::$_instance instanceof EE_System) {
110
-            self::$_instance = new self($Registry);
111
-        }
112
-        return self::$_instance;
113
-    }
114
-
115
-
116
-
117
-    /**
118
-     * resets the instance and returns it
119
-     *
120
-     * @return EE_System
121
-     */
122
-    public static function reset()
123
-    {
124
-        self::$_instance->_req_type = null;
125
-        //make sure none of the old hooks are left hanging around
126
-        remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
127
-        //we need to reset the migration manager in order for it to detect DMSs properly
128
-        EE_Data_Migration_Manager::reset();
129
-        self::instance()->detect_activations_or_upgrades();
130
-        self::instance()->perform_activations_upgrades_and_migrations();
131
-        return self::instance();
132
-    }
133
-
134
-
135
-
136
-    /**
137
-     *    sets hooks for running rest of system
138
-     *    provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
139
-     *    starting EE Addons from any other point may lead to problems
140
-     *
141
-     * @access private
142
-     * @param  EE_Registry $Registry
143
-     */
144
-    private function __construct(EE_Registry $Registry)
145
-    {
146
-        $this->registry = $Registry;
147
-        do_action('AHEE__EE_System__construct__begin', $this);
148
-        // allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
149
-        add_action('AHEE__EE_Bootstrap__load_espresso_addons', array($this, 'load_espresso_addons'));
150
-        // when an ee addon is activated, we want to call the core hook(s) again
151
-        // because the newly-activated addon didn't get a chance to run at all
152
-        add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
153
-        // detect whether install or upgrade
154
-        add_action('AHEE__EE_Bootstrap__detect_activations_or_upgrades', array($this, 'detect_activations_or_upgrades'),
155
-            3);
156
-        // load EE_Config, EE_Textdomain, etc
157
-        add_action('AHEE__EE_Bootstrap__load_core_configuration', array($this, 'load_core_configuration'), 5);
158
-        // load EE_Config, EE_Textdomain, etc
159
-        add_action('AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
160
-            array($this, 'register_shortcodes_modules_and_widgets'), 7);
161
-        // you wanna get going? I wanna get going... let's get going!
162
-        add_action('AHEE__EE_Bootstrap__brew_espresso', array($this, 'brew_espresso'), 9);
163
-        //other housekeeping
164
-        //exclude EE critical pages from wp_list_pages
165
-        add_filter('wp_list_pages_excludes', array($this, 'remove_pages_from_wp_list_pages'), 10);
166
-        // ALL EE Addons should use the following hook point to attach their initial setup too
167
-        // it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
168
-        do_action('AHEE__EE_System__construct__complete', $this);
169
-    }
170
-
171
-
172
-
173
-    /**
174
-     * load_espresso_addons
175
-     * allow addons to load first so that they can set hooks for running DMS's, etc
176
-     * this is hooked into both:
177
-     *    'AHEE__EE_Bootstrap__load_core_configuration'
178
-     *        which runs during the WP 'plugins_loaded' action at priority 5
179
-     *    and the WP 'activate_plugin' hook point
180
-     *
181
-     * @access public
182
-     * @return void
183
-     * @throws EE_Error
184
-     */
185
-    public function load_espresso_addons()
186
-    {
187
-        // set autoloaders for all of the classes implementing EEI_Plugin_API
188
-        // which provide helpers for EE plugin authors to more easily register certain components with EE.
189
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
190
-        //load and setup EE_Capabilities
191
-        $this->registry->load_core('Capabilities');
192
-        //caps need to be initialized on every request so that capability maps are set.
193
-        //@see https://events.codebasehq.com/projects/event-espresso/tickets/8674
194
-        $this->registry->CAP->init_caps();
195
-        do_action('AHEE__EE_System__load_espresso_addons');
196
-        //if the WP API basic auth plugin isn't already loaded, load it now.
197
-        //We want it for mobile apps. Just include the entire plugin
198
-        //also, don't load the basic auth when a plugin is getting activated, because
199
-        //it could be the basic auth plugin, and it doesn't check if its methods are already defined
200
-        //and causes a fatal error
201
-        if (
202
-            ! (isset($_GET['activate']) && $_GET['activate'] === 'true')
203
-            && ! function_exists('json_basic_auth_handler')
204
-            && ! function_exists('json_basic_auth_error')
205
-            && ! (
206
-                isset($_GET['action'])
207
-                && in_array($_GET['action'], array('activate', 'activate-selected'), true)
208
-            )
209
-        ) {
210
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
211
-        }
212
-        do_action('AHEE__EE_System__load_espresso_addons__complete');
213
-    }
214
-
215
-
216
-
217
-    /**
218
-     * detect_activations_or_upgrades
219
-     * Checks for activation or upgrade of core first;
220
-     * then also checks if any registered addons have been activated or upgraded
221
-     * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
222
-     * which runs during the WP 'plugins_loaded' action at priority 3
223
-     *
224
-     * @access public
225
-     * @return void
226
-     */
227
-    public function detect_activations_or_upgrades()
228
-    {
229
-        //first off: let's make sure to handle core
230
-        $this->detect_if_activation_or_upgrade();
231
-        foreach ($this->registry->addons as $addon) {
232
-            //detect teh request type for that addon
233
-            $addon->detect_activation_or_upgrade();
234
-        }
235
-    }
236
-
237
-
238
-
239
-    /**
240
-     * detect_if_activation_or_upgrade
241
-     * Takes care of detecting whether this is a brand new install or code upgrade,
242
-     * and either setting up the DB or setting up maintenance mode etc.
243
-     *
244
-     * @access public
245
-     * @return void
246
-     */
247
-    public function detect_if_activation_or_upgrade()
248
-    {
249
-        do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
250
-        // load M-Mode class
251
-        $this->registry->load_core('Maintenance_Mode');
252
-        // check if db has been updated, or if its a brand-new installation
253
-        $espresso_db_update = $this->fix_espresso_db_upgrade_option();
254
-        $request_type = $this->detect_req_type($espresso_db_update);
255
-        //EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
256
-        switch ($request_type) {
257
-            case EE_System::req_type_new_activation:
258
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
259
-                $this->_handle_core_version_change($espresso_db_update);
260
-                break;
261
-            case EE_System::req_type_reactivation:
262
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
263
-                $this->_handle_core_version_change($espresso_db_update);
264
-                break;
265
-            case EE_System::req_type_upgrade:
266
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
267
-                //migrations may be required now that we've upgraded
268
-                EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
269
-                $this->_handle_core_version_change($espresso_db_update);
270
-                //				echo "done upgrade";die;
271
-                break;
272
-            case EE_System::req_type_downgrade:
273
-                do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
274
-                //its possible migrations are no longer required
275
-                EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
276
-                $this->_handle_core_version_change($espresso_db_update);
277
-                break;
278
-            case EE_System::req_type_normal:
279
-            default:
280
-                //				$this->_maybe_redirect_to_ee_about();
281
-                break;
282
-        }
283
-        do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
284
-    }
285
-
286
-
287
-
288
-    /**
289
-     * Updates the list of installed versions and sets hooks for
290
-     * initializing the database later during the request
291
-     *
292
-     * @param array $espresso_db_update
293
-     */
294
-    protected function _handle_core_version_change($espresso_db_update)
295
-    {
296
-        $this->update_list_of_installed_versions($espresso_db_update);
297
-        //get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
298
-        add_action('AHEE__EE_System__perform_activations_upgrades_and_migrations',
299
-            array($this, 'initialize_db_if_no_migrations_required'));
300
-    }
301
-
302
-
303
-
304
-    /**
305
-     * standardizes the wp option 'espresso_db_upgrade' which actually stores
306
-     * information about what versions of EE have been installed and activated,
307
-     * NOT necessarily the state of the database
308
-     *
309
-     * @param mixed $espresso_db_update the value of the WordPress option.
310
-     *                                            If not supplied, fetches it from the options table
311
-     * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
312
-     */
313
-    private function fix_espresso_db_upgrade_option($espresso_db_update = null)
314
-    {
315
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
316
-        if ( ! $espresso_db_update) {
317
-            $espresso_db_update = get_option('espresso_db_update');
318
-        }
319
-        // check that option is an array
320
-        if ( ! is_array($espresso_db_update)) {
321
-            // if option is FALSE, then it never existed
322
-            if ($espresso_db_update === false) {
323
-                // make $espresso_db_update an array and save option with autoload OFF
324
-                $espresso_db_update = array();
325
-                add_option('espresso_db_update', $espresso_db_update, '', 'no');
326
-            } else {
327
-                // option is NOT FALSE but also is NOT an array, so make it an array and save it
328
-                $espresso_db_update = array($espresso_db_update => array());
329
-                update_option('espresso_db_update', $espresso_db_update);
330
-            }
331
-        } else {
332
-            $corrected_db_update = array();
333
-            //if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
334
-            foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
335
-                if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
336
-                    //the key is an int, and the value IS NOT an array
337
-                    //so it must be numerically-indexed, where values are versions installed...
338
-                    //fix it!
339
-                    $version_string = $should_be_array;
340
-                    $corrected_db_update[$version_string] = array('unknown-date');
341
-                } else {
342
-                    //ok it checks out
343
-                    $corrected_db_update[$should_be_version_string] = $should_be_array;
344
-                }
345
-            }
346
-            $espresso_db_update = $corrected_db_update;
347
-            update_option('espresso_db_update', $espresso_db_update);
348
-        }
349
-        do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
350
-        return $espresso_db_update;
351
-    }
352
-
353
-
354
-
355
-    /**
356
-     * Does the traditional work of setting up the plugin's database and adding default data.
357
-     * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
358
-     * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
359
-     * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
360
-     * so that it will be done when migrations are finished
361
-     *
362
-     * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
363
-     * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
364
-     *                                       This is a resource-intensive job
365
-     *                                       so we prefer to only do it when necessary
366
-     * @return void
367
-     * @throws EE_Error
368
-     */
369
-    public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
370
-    {
371
-        $request_type = $this->detect_req_type();
372
-        //only initialize system if we're not in maintenance mode.
373
-        if (EE_Maintenance_Mode::instance()->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
374
-            update_option('ee_flush_rewrite_rules', true);
375
-            if ($verify_schema) {
376
-                EEH_Activation::initialize_db_and_folders();
377
-            }
378
-            EEH_Activation::initialize_db_content();
379
-            EEH_Activation::system_initialization();
380
-            if ($initialize_addons_too) {
381
-                $this->initialize_addons();
382
-            }
383
-        } else {
384
-            EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
385
-        }
386
-        if ($request_type === EE_System::req_type_new_activation
387
-            || $request_type === EE_System::req_type_reactivation
388
-            || (
389
-                $request_type === EE_System::req_type_upgrade
390
-                && $this->is_major_version_change()
391
-            )
392
-        ) {
393
-            add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
394
-        }
395
-    }
396
-
397
-
398
-
399
-    /**
400
-     * Initializes the db for all registered addons
401
-     *
402
-     * @throws EE_Error
403
-     */
404
-    public function initialize_addons()
405
-    {
406
-        //foreach registered addon, make sure its db is up-to-date too
407
-        foreach ($this->registry->addons as $addon) {
408
-            $addon->initialize_db_if_no_migrations_required();
409
-        }
410
-    }
411
-
412
-
413
-
414
-    /**
415
-     * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
416
-     *
417
-     * @param    array  $version_history
418
-     * @param    string $current_version_to_add version to be added to the version history
419
-     * @return    boolean success as to whether or not this option was changed
420
-     */
421
-    public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
422
-    {
423
-        if ( ! $version_history) {
424
-            $version_history = $this->fix_espresso_db_upgrade_option($version_history);
425
-        }
426
-        if ($current_version_to_add === null) {
427
-            $current_version_to_add = espresso_version();
428
-        }
429
-        $version_history[$current_version_to_add][] = date('Y-m-d H:i:s', time());
430
-        // re-save
431
-        return update_option('espresso_db_update', $version_history);
432
-    }
433
-
434
-
435
-
436
-    /**
437
-     * Detects if the current version indicated in the has existed in the list of
438
-     * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
439
-     *
440
-     * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
441
-     *                                  If not supplied, fetches it from the options table.
442
-     *                                  Also, caches its result so later parts of the code can also know whether
443
-     *                                  there's been an update or not. This way we can add the current version to
444
-     *                                  espresso_db_update, but still know if this is a new install or not
445
-     * @return int one of the constants on EE_System::req_type_
446
-     */
447
-    public function detect_req_type($espresso_db_update = null)
448
-    {
449
-        if ($this->_req_type === null) {
450
-            $espresso_db_update = ! empty($espresso_db_update) ? $espresso_db_update
451
-                : $this->fix_espresso_db_upgrade_option();
452
-            $this->_req_type = EE_System::detect_req_type_given_activation_history($espresso_db_update,
453
-                'ee_espresso_activation', espresso_version());
454
-            $this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
455
-        }
456
-        return $this->_req_type;
457
-    }
458
-
459
-
460
-
461
-    /**
462
-     * Returns whether or not there was a non-micro version change (ie, change in either
463
-     * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
464
-     * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
465
-     *
466
-     * @param $activation_history
467
-     * @return bool
468
-     */
469
-    protected function _detect_major_version_change($activation_history)
470
-    {
471
-        $previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
472
-        $previous_version_parts = explode('.', $previous_version);
473
-        $current_version_parts = explode('.', espresso_version());
474
-        return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
475
-               && ($previous_version_parts[0] !== $current_version_parts[0]
476
-                   || $previous_version_parts[1] !== $current_version_parts[1]
477
-               );
478
-    }
479
-
480
-
481
-
482
-    /**
483
-     * Returns true if either the major or minor version of EE changed during this request.
484
-     * Eg 4.9.0.rc.001 to 4.10.0.rc.000, but not 4.9.0.rc.0001 to 4.9.1.rc.0001
485
-     *
486
-     * @return bool
487
-     */
488
-    public function is_major_version_change()
489
-    {
490
-        return $this->_major_version_change;
491
-    }
492
-
493
-
494
-
495
-    /**
496
-     * Determines the request type for any ee addon, given three piece of info: the current array of activation
497
-     * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
498
-     * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
499
-     * just activated to (for core that will always be espresso_version())
500
-     *
501
-     * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
502
-     *                                                 ee plugin. for core that's 'espresso_db_update'
503
-     * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
504
-     *                                                 indicate that this plugin was just activated
505
-     * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
506
-     *                                                 espresso_version())
507
-     * @return int one of the constants on EE_System::req_type_*
508
-     */
509
-    public static function detect_req_type_given_activation_history(
510
-        $activation_history_for_addon,
511
-        $activation_indicator_option_name,
512
-        $version_to_upgrade_to
513
-    ) {
514
-        $version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
515
-        if ($activation_history_for_addon) {
516
-            //it exists, so this isn't a completely new install
517
-            //check if this version already in that list of previously installed versions
518
-            if ( ! isset($activation_history_for_addon[$version_to_upgrade_to])) {
519
-                //it a version we haven't seen before
520
-                if ($version_is_higher === 1) {
521
-                    $req_type = EE_System::req_type_upgrade;
522
-                } else {
523
-                    $req_type = EE_System::req_type_downgrade;
524
-                }
525
-                delete_option($activation_indicator_option_name);
526
-            } else {
527
-                // its not an update. maybe a reactivation?
528
-                if (get_option($activation_indicator_option_name, false)) {
529
-                    if ($version_is_higher === -1) {
530
-                        $req_type = EE_System::req_type_downgrade;
531
-                    } elseif ($version_is_higher === 0) {
532
-                        //we've seen this version before, but it's an activation. must be a reactivation
533
-                        $req_type = EE_System::req_type_reactivation;
534
-                    } else {//$version_is_higher === 1
535
-                        $req_type = EE_System::req_type_upgrade;
536
-                    }
537
-                    delete_option($activation_indicator_option_name);
538
-                } else {
539
-                    //we've seen this version before and the activation indicate doesn't show it was just activated
540
-                    if ($version_is_higher === -1) {
541
-                        $req_type = EE_System::req_type_downgrade;
542
-                    } elseif ($version_is_higher === 0) {
543
-                        //we've seen this version before and it's not an activation. its normal request
544
-                        $req_type = EE_System::req_type_normal;
545
-                    } else {//$version_is_higher === 1
546
-                        $req_type = EE_System::req_type_upgrade;
547
-                    }
548
-                }
549
-            }
550
-        } else {
551
-            //brand new install
552
-            $req_type = EE_System::req_type_new_activation;
553
-            delete_option($activation_indicator_option_name);
554
-        }
555
-        return $req_type;
556
-    }
557
-
558
-
559
-
560
-    /**
561
-     * Detects if the $version_to_upgrade_to is higher than the most recent version in
562
-     * the $activation_history_for_addon
563
-     *
564
-     * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
565
-     *                                             sometimes containing 'unknown-date'
566
-     * @param string $version_to_upgrade_to        (current version)
567
-     * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
568
-     *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
569
-     *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
570
-     *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
571
-     */
572
-    protected static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
573
-    {
574
-        //find the most recently-activated version
575
-        $most_recently_active_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
576
-        return version_compare($version_to_upgrade_to, $most_recently_active_version);
577
-    }
578
-
579
-
580
-
581
-    /**
582
-     * Gets the most recently active version listed in the activation history,
583
-     * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
584
-     *
585
-     * @param array $activation_history  (keys are versions, values are arrays of times activated,
586
-     *                                   sometimes containing 'unknown-date'
587
-     * @return string
588
-     */
589
-    protected static function _get_most_recently_active_version_from_activation_history($activation_history)
590
-    {
591
-        $most_recently_active_version_activation = '1970-01-01 00:00:00';
592
-        $most_recently_active_version = '0.0.0.dev.000';
593
-        if (is_array($activation_history)) {
594
-            foreach ($activation_history as $version => $times_activated) {
595
-                //check there is a record of when this version was activated. Otherwise,
596
-                //mark it as unknown
597
-                if ( ! $times_activated) {
598
-                    $times_activated = array('unknown-date');
599
-                }
600
-                if (is_string($times_activated)) {
601
-                    $times_activated = array($times_activated);
602
-                }
603
-                foreach ($times_activated as $an_activation) {
604
-                    if ($an_activation !== 'unknown-date' && $an_activation > $most_recently_active_version_activation) {
605
-                        $most_recently_active_version = $version;
606
-                        $most_recently_active_version_activation = $an_activation === 'unknown-date'
607
-                            ? '1970-01-01 00:00:00' : $an_activation;
608
-                    }
609
-                }
610
-            }
611
-        }
612
-        return $most_recently_active_version;
613
-    }
614
-
615
-
616
-
617
-    /**
618
-     * This redirects to the about EE page after activation
619
-     *
620
-     * @return void
621
-     */
622
-    public function redirect_to_about_ee()
623
-    {
624
-        $notices = EE_Error::get_notices(false);
625
-        //if current user is an admin and it's not an ajax or rest request
626
-        if (
627
-            ! (defined('DOING_AJAX') && DOING_AJAX)
628
-            && ! (defined('REST_REQUEST') && REST_REQUEST)
629
-            && ! isset($notices['errors'])
630
-            && apply_filters(
631
-                'FHEE__EE_System__redirect_to_about_ee__do_redirect',
632
-                $this->registry->CAP->current_user_can('manage_options', 'espresso_about_default')
633
-            )
634
-        ) {
635
-            $query_params = array('page' => 'espresso_about');
636
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
637
-                $query_params['new_activation'] = true;
638
-            }
639
-            if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
640
-                $query_params['reactivation'] = true;
641
-            }
642
-            $url = add_query_arg($query_params, admin_url('admin.php'));
643
-            wp_safe_redirect($url);
644
-            exit();
645
-        }
646
-    }
647
-
648
-
649
-
650
-    /**
651
-     * load_core_configuration
652
-     * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
653
-     * which runs during the WP 'plugins_loaded' action at priority 5
654
-     *
655
-     * @return void
656
-     * @throws \ReflectionException
657
-     */
658
-    public function load_core_configuration()
659
-    {
660
-        do_action('AHEE__EE_System__load_core_configuration__begin', $this);
661
-        $this->registry->load_core('EE_Load_Textdomain');
662
-        //load textdomain
663
-        EE_Load_Textdomain::load_textdomain();
664
-        // load and setup EE_Config and EE_Network_Config
665
-        $this->registry->load_core('Config');
666
-        $this->registry->load_core('Network_Config');
667
-        // setup autoloaders
668
-        // enable logging?
669
-        if ($this->registry->CFG->admin->use_full_logging) {
670
-            $this->registry->load_core('Log');
671
-        }
672
-        // check for activation errors
673
-        $activation_errors = get_option('ee_plugin_activation_errors', false);
674
-        if ($activation_errors) {
675
-            EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
676
-            update_option('ee_plugin_activation_errors', false);
677
-        }
678
-        // get model names
679
-        $this->_parse_model_names();
680
-        //load caf stuff a chance to play during the activation process too.
681
-        $this->_maybe_brew_regular();
682
-        do_action('AHEE__EE_System__load_core_configuration__complete', $this);
683
-    }
684
-
685
-
686
-
687
-    /**
688
-     * cycles through all of the models/*.model.php files, and assembles an array of model names
689
-     *
690
-     * @return void
691
-     * @throws ReflectionException
692
-     */
693
-    private function _parse_model_names()
694
-    {
695
-        //get all the files in the EE_MODELS folder that end in .model.php
696
-        $models = glob(EE_MODELS . '*.model.php');
697
-        $model_names = array();
698
-        $non_abstract_db_models = array();
699
-        foreach ($models as $model) {
700
-            // get model classname
701
-            $classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
702
-            $short_name = str_replace('EEM_', '', $classname);
703
-            $reflectionClass = new ReflectionClass($classname);
704
-            if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
705
-                $non_abstract_db_models[$short_name] = $classname;
706
-            }
707
-            $model_names[$short_name] = $classname;
708
-        }
709
-        $this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
710
-        $this->registry->non_abstract_db_models = apply_filters('FHEE__EE_System__parse_implemented_model_names',
711
-            $non_abstract_db_models);
712
-    }
713
-
714
-
715
-
716
-    /**
717
-     * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
718
-     * that need to be setup before our EE_System launches.
719
-     *
720
-     * @return void
721
-     */
722
-    private function _maybe_brew_regular()
723
-    {
724
-        if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH . 'brewing_regular.php')) {
725
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
726
-        }
727
-    }
728
-
729
-
730
-
731
-    /**
732
-     * register_shortcodes_modules_and_widgets
733
-     * generate lists of shortcodes and modules, then verify paths and classes
734
-     * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
735
-     * which runs during the WP 'plugins_loaded' action at priority 7
736
-     *
737
-     * @access public
738
-     * @return void
739
-     */
740
-    public function register_shortcodes_modules_and_widgets()
741
-    {
742
-        try {
743
-            // load, register, and add shortcodes the new way
744
-            new ShortcodesManager(
745
-            // and the old way, but we'll put it under control of the new system
746
-                EE_Config::getLegacyShortcodesManager()
747
-            );
748
-        } catch (Exception $exception) {
749
-            new ExceptionStackTraceDisplay($exception);
750
-        }
751
-        do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
752
-        // check for addons using old hook point
753
-        if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
754
-            $this->_incompatible_addon_error();
755
-        }
756
-    }
757
-
758
-
759
-
760
-    /**
761
-     * _incompatible_addon_error
762
-     *
763
-     * @access public
764
-     * @return void
765
-     */
766
-    private function _incompatible_addon_error()
767
-    {
768
-        // get array of classes hooking into here
769
-        $class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook('AHEE__EE_System__register_shortcodes_modules_and_addons');
770
-        if ( ! empty($class_names)) {
771
-            $msg = __('The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
772
-                'event_espresso');
773
-            $msg .= '<ul>';
774
-            foreach ($class_names as $class_name) {
775
-                $msg .= '<li><b>Event Espresso - ' . str_replace(array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'), '',
776
-                        $class_name) . '</b></li>';
777
-            }
778
-            $msg .= '</ul>';
779
-            $msg .= __('Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
780
-                'event_espresso');
781
-            // save list of incompatible addons to wp-options for later use
782
-            add_option('ee_incompatible_addons', $class_names, '', 'no');
783
-            if (is_admin()) {
784
-                EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
785
-            }
786
-        }
787
-    }
788
-
789
-
790
-
791
-    /**
792
-     * brew_espresso
793
-     * begins the process of setting hooks for initializing EE in the correct order
794
-     * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
795
-     * which runs during the WP 'plugins_loaded' action at priority 9
796
-     *
797
-     * @return void
798
-     */
799
-    public function brew_espresso()
800
-    {
801
-        do_action('AHEE__EE_System__brew_espresso__begin', $this);
802
-        // load some final core systems
803
-        add_action('init', array($this, 'set_hooks_for_core'), 1);
804
-        add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
805
-        add_action('init', array($this, 'load_CPTs_and_session'), 5);
806
-        add_action('init', array($this, 'load_controllers'), 7);
807
-        add_action('init', array($this, 'core_loaded_and_ready'), 9);
808
-        add_action('init', array($this, 'initialize'), 10);
809
-        add_action('init', array($this, 'initialize_last'), 100);
810
-        add_action('admin_bar_menu', array($this, 'espresso_toolbar_items'), 100);
811
-        if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
812
-            // pew pew pew
813
-            $this->registry->load_core('PUE');
814
-            do_action('AHEE__EE_System__brew_espresso__after_pue_init');
815
-        }
816
-        do_action('AHEE__EE_System__brew_espresso__complete', $this);
817
-    }
818
-
819
-
820
-
821
-    /**
822
-     *    set_hooks_for_core
823
-     *
824
-     * @access public
825
-     * @return    void
826
-     */
827
-    public function set_hooks_for_core()
828
-    {
829
-        $this->_deactivate_incompatible_addons();
830
-        do_action('AHEE__EE_System__set_hooks_for_core');
831
-    }
832
-
833
-
834
-
835
-    /**
836
-     * Using the information gathered in EE_System::_incompatible_addon_error,
837
-     * deactivates any addons considered incompatible with the current version of EE
838
-     */
839
-    private function _deactivate_incompatible_addons()
840
-    {
841
-        $incompatible_addons = get_option('ee_incompatible_addons', array());
842
-        if ( ! empty($incompatible_addons)) {
843
-            $active_plugins = get_option('active_plugins', array());
844
-            foreach ($active_plugins as $active_plugin) {
845
-                foreach ($incompatible_addons as $incompatible_addon) {
846
-                    if (strpos($active_plugin, $incompatible_addon) !== false) {
847
-                        unset($_GET['activate']);
848
-                        espresso_deactivate_plugin($active_plugin);
849
-                    }
850
-                }
851
-            }
852
-        }
853
-    }
854
-
855
-
856
-
857
-    /**
858
-     *    perform_activations_upgrades_and_migrations
859
-     *
860
-     * @access public
861
-     * @return    void
862
-     */
863
-    public function perform_activations_upgrades_and_migrations()
864
-    {
865
-        //first check if we had previously attempted to setup EE's directories but failed
866
-        if (EEH_Activation::upload_directories_incomplete()) {
867
-            EEH_Activation::create_upload_directories();
868
-        }
869
-        do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
870
-    }
871
-
872
-
873
-
874
-    /**
875
-     *    load_CPTs_and_session
876
-     *
877
-     * @access public
878
-     * @return    void
879
-     */
880
-    public function load_CPTs_and_session()
881
-    {
882
-        do_action('AHEE__EE_System__load_CPTs_and_session__start');
883
-        // register Custom Post Types
884
-        $this->registry->load_core('Register_CPTs');
885
-        do_action('AHEE__EE_System__load_CPTs_and_session__complete');
886
-    }
887
-
888
-
889
-
890
-    /**
891
-     * load_controllers
892
-     * this is the best place to load any additional controllers that needs access to EE core.
893
-     * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
894
-     * time
895
-     *
896
-     * @access public
897
-     * @return void
898
-     */
899
-    public function load_controllers()
900
-    {
901
-        do_action('AHEE__EE_System__load_controllers__start');
902
-        // let's get it started
903
-        if ( ! is_admin() && ! EE_Maintenance_Mode::instance()->level()) {
904
-            do_action('AHEE__EE_System__load_controllers__load_front_controllers');
905
-            $this->registry->load_core('Front_Controller');
906
-        } else if ( ! EE_FRONT_AJAX) {
907
-            do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
908
-            EE_Registry::instance()->load_core('Admin');
909
-        }
910
-        do_action('AHEE__EE_System__load_controllers__complete');
911
-    }
912
-
913
-
914
-
915
-    /**
916
-     * core_loaded_and_ready
917
-     * all of the basic EE core should be loaded at this point and available regardless of M-Mode
918
-     *
919
-     * @access public
920
-     * @return void
921
-     */
922
-    public function core_loaded_and_ready()
923
-    {
924
-        $this->registry->load_core('Session');
925
-        do_action('AHEE__EE_System__core_loaded_and_ready');
926
-        // load_espresso_template_tags
927
-        if (is_readable(EE_PUBLIC . 'template_tags.php')) {
928
-            require_once(EE_PUBLIC . 'template_tags.php');
929
-        }
930
-        do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
931
-        $this->registry->create('EventEspresso\core\services\assets\Registry', array(), true);
932
-    }
933
-
934
-
935
-
936
-    /**
937
-     * initialize
938
-     * this is the best place to begin initializing client code
939
-     *
940
-     * @access public
941
-     * @return void
942
-     */
943
-    public function initialize()
944
-    {
945
-        do_action('AHEE__EE_System__initialize');
946
-    }
947
-
948
-
949
-
950
-    /**
951
-     * initialize_last
952
-     * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
953
-     * initialize has done so
954
-     *
955
-     * @access public
956
-     * @return void
957
-     */
958
-    public function initialize_last()
959
-    {
960
-        do_action('AHEE__EE_System__initialize_last');
961
-    }
962
-
963
-
964
-
965
-    /**
966
-     * set_hooks_for_shortcodes_modules_and_addons
967
-     * this is the best place for other systems to set callbacks for hooking into other parts of EE
968
-     * this happens at the very beginning of the wp_loaded hook point
969
-     *
970
-     * @access public
971
-     * @return void
972
-     */
973
-    public function set_hooks_for_shortcodes_modules_and_addons()
974
-    {
975
-        //		do_action( 'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons' );
976
-    }
977
-
978
-
979
-
980
-    /**
981
-     * do_not_cache
982
-     * sets no cache headers and defines no cache constants for WP plugins
983
-     *
984
-     * @access public
985
-     * @return void
986
-     */
987
-    public static function do_not_cache()
988
-    {
989
-        // set no cache constants
990
-        if ( ! defined('DONOTCACHEPAGE')) {
991
-            define('DONOTCACHEPAGE', true);
992
-        }
993
-        if ( ! defined('DONOTCACHCEOBJECT')) {
994
-            define('DONOTCACHCEOBJECT', true);
995
-        }
996
-        if ( ! defined('DONOTCACHEDB')) {
997
-            define('DONOTCACHEDB', true);
998
-        }
999
-        // add no cache headers
1000
-        add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1001
-        // plus a little extra for nginx and Google Chrome
1002
-        add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1003
-        // prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1004
-        remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1005
-    }
1006
-
1007
-
1008
-
1009
-    /**
1010
-     *    extra_nocache_headers
1011
-     *
1012
-     * @access    public
1013
-     * @param $headers
1014
-     * @return    array
1015
-     */
1016
-    public static function extra_nocache_headers($headers)
1017
-    {
1018
-        // for NGINX
1019
-        $headers['X-Accel-Expires'] = 0;
1020
-        // plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1021
-        $headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1022
-        return $headers;
1023
-    }
1024
-
1025
-
1026
-
1027
-    /**
1028
-     *    nocache_headers
1029
-     *
1030
-     * @access    public
1031
-     * @return    void
1032
-     */
1033
-    public static function nocache_headers()
1034
-    {
1035
-        nocache_headers();
1036
-    }
1037
-
1038
-
1039
-
1040
-    /**
1041
-     *    espresso_toolbar_items
1042
-     *
1043
-     * @access public
1044
-     * @param  WP_Admin_Bar $admin_bar
1045
-     * @return void
1046
-     */
1047
-    public function espresso_toolbar_items(WP_Admin_Bar $admin_bar)
1048
-    {
1049
-        // if in full M-Mode, or its an AJAX request, or user is NOT an admin
1050
-        if (
1051
-            defined('DOING_AJAX')
1052
-            || ! $this->registry->CAP->current_user_can('ee_read_ee', 'ee_admin_bar_menu_top_level')
1053
-            || EE_Maintenance_Mode::instance()->level() === EE_Maintenance_Mode::level_2_complete_maintenance
1054
-        ) {
1055
-            return;
1056
-        }
1057
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1058
-        $menu_class = 'espresso_menu_item_class';
1059
-        //we don't use the constants EVENTS_ADMIN_URL or REG_ADMIN_URL
1060
-        //because they're only defined in each of their respective constructors
1061
-        //and this might be a frontend request, in which case they aren't available
1062
-        $events_admin_url = admin_url('admin.php?page=espresso_events');
1063
-        $reg_admin_url = admin_url('admin.php?page=espresso_registrations');
1064
-        $extensions_admin_url = admin_url('admin.php?page=espresso_packages');
1065
-        //Top Level
1066
-        $admin_bar->add_menu(array(
1067
-            'id'    => 'espresso-toolbar',
1068
-            'title' => '<span class="ee-icon ee-icon-ee-cup-thick ee-icon-size-20"></span><span class="ab-label">'
1069
-                       . _x('Event Espresso', 'admin bar menu group label', 'event_espresso')
1070
-                       . '</span>',
1071
-            'href'  => $events_admin_url,
1072
-            'meta'  => array(
1073
-                'title' => __('Event Espresso', 'event_espresso'),
1074
-                'class' => $menu_class . 'first',
1075
-            ),
1076
-        ));
1077
-        //Events
1078
-        if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events')) {
1079
-            $admin_bar->add_menu(array(
1080
-                'id'     => 'espresso-toolbar-events',
1081
-                'parent' => 'espresso-toolbar',
1082
-                'title'  => __('Events', 'event_espresso'),
1083
-                'href'   => $events_admin_url,
1084
-                'meta'   => array(
1085
-                    'title'  => __('Events', 'event_espresso'),
1086
-                    'target' => '',
1087
-                    'class'  => $menu_class,
1088
-                ),
1089
-            ));
1090
-        }
1091
-        if ($this->registry->CAP->current_user_can('ee_edit_events', 'ee_admin_bar_menu_espresso-toolbar-events-new')) {
1092
-            //Events Add New
1093
-            $admin_bar->add_menu(array(
1094
-                'id'     => 'espresso-toolbar-events-new',
1095
-                'parent' => 'espresso-toolbar-events',
1096
-                'title'  => __('Add New', 'event_espresso'),
1097
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'create_new'), $events_admin_url),
1098
-                'meta'   => array(
1099
-                    'title'  => __('Add New', 'event_espresso'),
1100
-                    'target' => '',
1101
-                    'class'  => $menu_class,
1102
-                ),
1103
-            ));
1104
-        }
1105
-        if (is_single() && (get_post_type() === 'espresso_events')) {
1106
-            //Current post
1107
-            global $post;
1108
-            if ($this->registry->CAP->current_user_can('ee_edit_event',
1109
-                'ee_admin_bar_menu_espresso-toolbar-events-edit', $post->ID)
1110
-            ) {
1111
-                //Events Edit Current Event
1112
-                $admin_bar->add_menu(array(
1113
-                    'id'     => 'espresso-toolbar-events-edit',
1114
-                    'parent' => 'espresso-toolbar-events',
1115
-                    'title'  => __('Edit Event', 'event_espresso'),
1116
-                    'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'edit', 'post' => $post->ID),
1117
-                        $events_admin_url),
1118
-                    'meta'   => array(
1119
-                        'title'  => __('Edit Event', 'event_espresso'),
1120
-                        'target' => '',
1121
-                        'class'  => $menu_class,
1122
-                    ),
1123
-                ));
1124
-            }
1125
-        }
1126
-        //Events View
1127
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1128
-            'ee_admin_bar_menu_espresso-toolbar-events-view')
1129
-        ) {
1130
-            $admin_bar->add_menu(array(
1131
-                'id'     => 'espresso-toolbar-events-view',
1132
-                'parent' => 'espresso-toolbar-events',
1133
-                'title'  => __('View', 'event_espresso'),
1134
-                'href'   => $events_admin_url,
1135
-                'meta'   => array(
1136
-                    'title'  => __('View', 'event_espresso'),
1137
-                    'target' => '',
1138
-                    'class'  => $menu_class,
1139
-                ),
1140
-            ));
1141
-        }
1142
-        if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events-all')) {
1143
-            //Events View All
1144
-            $admin_bar->add_menu(array(
1145
-                'id'     => 'espresso-toolbar-events-all',
1146
-                'parent' => 'espresso-toolbar-events-view',
1147
-                'title'  => __('All', 'event_espresso'),
1148
-                'href'   => $events_admin_url,
1149
-                'meta'   => array(
1150
-                    'title'  => __('All', 'event_espresso'),
1151
-                    'target' => '',
1152
-                    'class'  => $menu_class,
1153
-                ),
1154
-            ));
1155
-        }
1156
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1157
-            'ee_admin_bar_menu_espresso-toolbar-events-today')
1158
-        ) {
1159
-            //Events View Today
1160
-            $admin_bar->add_menu(array(
1161
-                'id'     => 'espresso-toolbar-events-today',
1162
-                'parent' => 'espresso-toolbar-events-view',
1163
-                'title'  => __('Today', 'event_espresso'),
1164
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1165
-                    $events_admin_url),
1166
-                'meta'   => array(
1167
-                    'title'  => __('Today', 'event_espresso'),
1168
-                    'target' => '',
1169
-                    'class'  => $menu_class,
1170
-                ),
1171
-            ));
1172
-        }
1173
-        if ($this->registry->CAP->current_user_can('ee_read_events',
1174
-            'ee_admin_bar_menu_espresso-toolbar-events-month')
1175
-        ) {
1176
-            //Events View This Month
1177
-            $admin_bar->add_menu(array(
1178
-                'id'     => 'espresso-toolbar-events-month',
1179
-                'parent' => 'espresso-toolbar-events-view',
1180
-                'title'  => __('This Month', 'event_espresso'),
1181
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1182
-                    $events_admin_url),
1183
-                'meta'   => array(
1184
-                    'title'  => __('This Month', 'event_espresso'),
1185
-                    'target' => '',
1186
-                    'class'  => $menu_class,
1187
-                ),
1188
-            ));
1189
-        }
1190
-        //Registration Overview
1191
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1192
-            'ee_admin_bar_menu_espresso-toolbar-registrations')
1193
-        ) {
1194
-            $admin_bar->add_menu(array(
1195
-                'id'     => 'espresso-toolbar-registrations',
1196
-                'parent' => 'espresso-toolbar',
1197
-                'title'  => __('Registrations', 'event_espresso'),
1198
-                'href'   => $reg_admin_url,
1199
-                'meta'   => array(
1200
-                    'title'  => __('Registrations', 'event_espresso'),
1201
-                    'target' => '',
1202
-                    'class'  => $menu_class,
1203
-                ),
1204
-            ));
1205
-        }
1206
-        //Registration Overview Today
1207
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1208
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today')
1209
-        ) {
1210
-            $admin_bar->add_menu(array(
1211
-                'id'     => 'espresso-toolbar-registrations-today',
1212
-                'parent' => 'espresso-toolbar-registrations',
1213
-                'title'  => __('Today', 'event_espresso'),
1214
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1215
-                    $reg_admin_url),
1216
-                'meta'   => array(
1217
-                    'title'  => __('Today', 'event_espresso'),
1218
-                    'target' => '',
1219
-                    'class'  => $menu_class,
1220
-                ),
1221
-            ));
1222
-        }
1223
-        //Registration Overview Today Completed
1224
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1225
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-approved')
1226
-        ) {
1227
-            $admin_bar->add_menu(array(
1228
-                'id'     => 'espresso-toolbar-registrations-today-approved',
1229
-                'parent' => 'espresso-toolbar-registrations-today',
1230
-                'title'  => __('Approved', 'event_espresso'),
1231
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1232
-                    'action'      => 'default',
1233
-                    'status'      => 'today',
1234
-                    '_reg_status' => EEM_Registration::status_id_approved,
1235
-                ), $reg_admin_url),
1236
-                'meta'   => array(
1237
-                    'title'  => __('Approved', 'event_espresso'),
1238
-                    'target' => '',
1239
-                    'class'  => $menu_class,
1240
-                ),
1241
-            ));
1242
-        }
1243
-        //Registration Overview Today Pending\
1244
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1245
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-pending')
1246
-        ) {
1247
-            $admin_bar->add_menu(array(
1248
-                'id'     => 'espresso-toolbar-registrations-today-pending',
1249
-                'parent' => 'espresso-toolbar-registrations-today',
1250
-                'title'  => __('Pending', 'event_espresso'),
1251
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1252
-                    'action'     => 'default',
1253
-                    'status'     => 'today',
1254
-                    'reg_status' => EEM_Registration::status_id_pending_payment,
1255
-                ), $reg_admin_url),
1256
-                'meta'   => array(
1257
-                    'title'  => __('Pending Payment', 'event_espresso'),
1258
-                    'target' => '',
1259
-                    'class'  => $menu_class,
1260
-                ),
1261
-            ));
1262
-        }
1263
-        //Registration Overview Today Incomplete
1264
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1265
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-not-approved')
1266
-        ) {
1267
-            $admin_bar->add_menu(array(
1268
-                'id'     => 'espresso-toolbar-registrations-today-not-approved',
1269
-                'parent' => 'espresso-toolbar-registrations-today',
1270
-                'title'  => __('Not Approved', 'event_espresso'),
1271
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1272
-                    'action'      => 'default',
1273
-                    'status'      => 'today',
1274
-                    '_reg_status' => EEM_Registration::status_id_not_approved,
1275
-                ), $reg_admin_url),
1276
-                'meta'   => array(
1277
-                    'title'  => __('Not Approved', 'event_espresso'),
1278
-                    'target' => '',
1279
-                    'class'  => $menu_class,
1280
-                ),
1281
-            ));
1282
-        }
1283
-        //Registration Overview Today Incomplete
1284
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1285
-            'ee_admin_bar_menu_espresso-toolbar-registrations-today-cancelled')
1286
-        ) {
1287
-            $admin_bar->add_menu(array(
1288
-                'id'     => 'espresso-toolbar-registrations-today-cancelled',
1289
-                'parent' => 'espresso-toolbar-registrations-today',
1290
-                'title'  => __('Cancelled', 'event_espresso'),
1291
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1292
-                    'action'      => 'default',
1293
-                    'status'      => 'today',
1294
-                    '_reg_status' => EEM_Registration::status_id_cancelled,
1295
-                ), $reg_admin_url),
1296
-                'meta'   => array(
1297
-                    'title'  => __('Cancelled', 'event_espresso'),
1298
-                    'target' => '',
1299
-                    'class'  => $menu_class,
1300
-                ),
1301
-            ));
1302
-        }
1303
-        //Registration Overview This Month
1304
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1305
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month')
1306
-        ) {
1307
-            $admin_bar->add_menu(array(
1308
-                'id'     => 'espresso-toolbar-registrations-month',
1309
-                'parent' => 'espresso-toolbar-registrations',
1310
-                'title'  => __('This Month', 'event_espresso'),
1311
-                'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1312
-                    $reg_admin_url),
1313
-                'meta'   => array(
1314
-                    'title'  => __('This Month', 'event_espresso'),
1315
-                    'target' => '',
1316
-                    'class'  => $menu_class,
1317
-                ),
1318
-            ));
1319
-        }
1320
-        //Registration Overview This Month Approved
1321
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1322
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-approved')
1323
-        ) {
1324
-            $admin_bar->add_menu(array(
1325
-                'id'     => 'espresso-toolbar-registrations-month-approved',
1326
-                'parent' => 'espresso-toolbar-registrations-month',
1327
-                'title'  => __('Approved', 'event_espresso'),
1328
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1329
-                    'action'      => 'default',
1330
-                    'status'      => 'month',
1331
-                    '_reg_status' => EEM_Registration::status_id_approved,
1332
-                ), $reg_admin_url),
1333
-                'meta'   => array(
1334
-                    'title'  => __('Approved', 'event_espresso'),
1335
-                    'target' => '',
1336
-                    'class'  => $menu_class,
1337
-                ),
1338
-            ));
1339
-        }
1340
-        //Registration Overview This Month Pending
1341
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1342
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-pending')
1343
-        ) {
1344
-            $admin_bar->add_menu(array(
1345
-                'id'     => 'espresso-toolbar-registrations-month-pending',
1346
-                'parent' => 'espresso-toolbar-registrations-month',
1347
-                'title'  => __('Pending', 'event_espresso'),
1348
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1349
-                    'action'      => 'default',
1350
-                    'status'      => 'month',
1351
-                    '_reg_status' => EEM_Registration::status_id_pending_payment,
1352
-                ), $reg_admin_url),
1353
-                'meta'   => array(
1354
-                    'title'  => __('Pending', 'event_espresso'),
1355
-                    'target' => '',
1356
-                    'class'  => $menu_class,
1357
-                ),
1358
-            ));
1359
-        }
1360
-        //Registration Overview This Month Not Approved
1361
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1362
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-not-approved')
1363
-        ) {
1364
-            $admin_bar->add_menu(array(
1365
-                'id'     => 'espresso-toolbar-registrations-month-not-approved',
1366
-                'parent' => 'espresso-toolbar-registrations-month',
1367
-                'title'  => __('Not Approved', 'event_espresso'),
1368
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1369
-                    'action'      => 'default',
1370
-                    'status'      => 'month',
1371
-                    '_reg_status' => EEM_Registration::status_id_not_approved,
1372
-                ), $reg_admin_url),
1373
-                'meta'   => array(
1374
-                    'title'  => __('Not Approved', 'event_espresso'),
1375
-                    'target' => '',
1376
-                    'class'  => $menu_class,
1377
-                ),
1378
-            ));
1379
-        }
1380
-        //Registration Overview This Month Cancelled
1381
-        if ($this->registry->CAP->current_user_can('ee_read_registrations',
1382
-            'ee_admin_bar_menu_espresso-toolbar-registrations-month-cancelled')
1383
-        ) {
1384
-            $admin_bar->add_menu(array(
1385
-                'id'     => 'espresso-toolbar-registrations-month-cancelled',
1386
-                'parent' => 'espresso-toolbar-registrations-month',
1387
-                'title'  => __('Cancelled', 'event_espresso'),
1388
-                'href'   => EEH_URL::add_query_args_and_nonce(array(
1389
-                    'action'      => 'default',
1390
-                    'status'      => 'month',
1391
-                    '_reg_status' => EEM_Registration::status_id_cancelled,
1392
-                ), $reg_admin_url),
1393
-                'meta'   => array(
1394
-                    'title'  => __('Cancelled', 'event_espresso'),
1395
-                    'target' => '',
1396
-                    'class'  => $menu_class,
1397
-                ),
1398
-            ));
1399
-        }
1400
-        //Extensions & Services
1401
-        if ($this->registry->CAP->current_user_can('ee_read_ee',
1402
-            'ee_admin_bar_menu_espresso-toolbar-extensions-and-services')
1403
-        ) {
1404
-            $admin_bar->add_menu(array(
1405
-                'id'     => 'espresso-toolbar-extensions-and-services',
1406
-                'parent' => 'espresso-toolbar',
1407
-                'title'  => __('Extensions & Services', 'event_espresso'),
1408
-                'href'   => $extensions_admin_url,
1409
-                'meta'   => array(
1410
-                    'title'  => __('Extensions & Services', 'event_espresso'),
1411
-                    'target' => '',
1412
-                    'class'  => $menu_class,
1413
-                ),
1414
-            ));
1415
-        }
1416
-    }
1417
-
1418
-
1419
-
1420
-    /**
1421
-     * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1422
-     * never returned with the function.
1423
-     *
1424
-     * @param  array $exclude_array any existing pages being excluded are in this array.
1425
-     * @return array
1426
-     */
1427
-    public function remove_pages_from_wp_list_pages($exclude_array)
1428
-    {
1429
-        return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1430
-    }
26
+	/**
27
+	 * indicates this is a 'normal' request. Ie, not activation, nor upgrade, nor activation.
28
+	 * So examples of this would be a normal GET request on the frontend or backend, or a POST, etc
29
+	 */
30
+	const req_type_normal = 0;
31
+
32
+	/**
33
+	 * Indicates this is a brand new installation of EE so we should install
34
+	 * tables and default data etc
35
+	 */
36
+	const req_type_new_activation = 1;
37
+
38
+	/**
39
+	 * we've detected that EE has been reactivated (or EE was activated during maintenance mode,
40
+	 * and we just exited maintenance mode). We MUST check the database is setup properly
41
+	 * and that default data is setup too
42
+	 */
43
+	const req_type_reactivation = 2;
44
+
45
+	/**
46
+	 * indicates that EE has been upgraded since its previous request.
47
+	 * We may have data migration scripts to call and will want to trigger maintenance mode
48
+	 */
49
+	const req_type_upgrade = 3;
50
+
51
+	/**
52
+	 * TODO  will detect that EE has been DOWNGRADED. We probably don't want to run in this case...
53
+	 */
54
+	const req_type_downgrade = 4;
55
+
56
+	/**
57
+	 * @deprecated since version 4.6.0.dev.006
58
+	 * Now whenever a new_activation is detected the request type is still just
59
+	 * new_activation (same for reactivation, upgrade, downgrade etc), but if we'r ein maintenance mode
60
+	 * EE_System::initialize_db_if_no_migrations_required and EE_Addon::initialize_db_if_no_migrations_required
61
+	 * will instead enqueue that EE plugin's db initialization for when we're taken out of maintenance mode.
62
+	 * (Specifically, when the migration manager indicates migrations are finished
63
+	 * EE_Data_Migration_Manager::initialize_db_for_enqueued_ee_plugins() will be called)
64
+	 */
65
+	const req_type_activation_but_not_installed = 5;
66
+
67
+	/**
68
+	 * option prefix for recording the activation history (like core's "espresso_db_update") of addons
69
+	 */
70
+	const addon_activation_history_option_prefix = 'ee_addon_activation_history_';
71
+
72
+
73
+	/**
74
+	 * @var EE_System $_instance
75
+	 */
76
+	private static $_instance;
77
+
78
+	/**
79
+	 * @var EE_Registry $registry
80
+	 */
81
+	protected $registry;
82
+
83
+	/**
84
+	 * Stores which type of request this is, options being one of the constants on EE_System starting with req_type_*.
85
+	 * It can be a brand-new activation, a reactivation, an upgrade, a downgrade, or a normal request.
86
+	 *
87
+	 * @var int $_req_type
88
+	 */
89
+	private $_req_type;
90
+
91
+	/**
92
+	 * Whether or not there was a non-micro version change in EE core version during this request
93
+	 *
94
+	 * @var boolean $_major_version_change
95
+	 */
96
+	private $_major_version_change = false;
97
+
98
+
99
+
100
+	/**
101
+	 * @singleton method used to instantiate class object
102
+	 * @access    public
103
+	 * @param  EE_Registry $Registry
104
+	 * @return EE_System
105
+	 */
106
+	public static function instance(EE_Registry $Registry = null)
107
+	{
108
+		// check if class object is instantiated
109
+		if ( ! self::$_instance instanceof EE_System) {
110
+			self::$_instance = new self($Registry);
111
+		}
112
+		return self::$_instance;
113
+	}
114
+
115
+
116
+
117
+	/**
118
+	 * resets the instance and returns it
119
+	 *
120
+	 * @return EE_System
121
+	 */
122
+	public static function reset()
123
+	{
124
+		self::$_instance->_req_type = null;
125
+		//make sure none of the old hooks are left hanging around
126
+		remove_all_actions('AHEE__EE_System__perform_activations_upgrades_and_migrations');
127
+		//we need to reset the migration manager in order for it to detect DMSs properly
128
+		EE_Data_Migration_Manager::reset();
129
+		self::instance()->detect_activations_or_upgrades();
130
+		self::instance()->perform_activations_upgrades_and_migrations();
131
+		return self::instance();
132
+	}
133
+
134
+
135
+
136
+	/**
137
+	 *    sets hooks for running rest of system
138
+	 *    provides "AHEE__EE_System__construct__complete" hook for EE Addons to use as their starting point
139
+	 *    starting EE Addons from any other point may lead to problems
140
+	 *
141
+	 * @access private
142
+	 * @param  EE_Registry $Registry
143
+	 */
144
+	private function __construct(EE_Registry $Registry)
145
+	{
146
+		$this->registry = $Registry;
147
+		do_action('AHEE__EE_System__construct__begin', $this);
148
+		// allow addons to load first so that they can register autoloaders, set hooks for running DMS's, etc
149
+		add_action('AHEE__EE_Bootstrap__load_espresso_addons', array($this, 'load_espresso_addons'));
150
+		// when an ee addon is activated, we want to call the core hook(s) again
151
+		// because the newly-activated addon didn't get a chance to run at all
152
+		add_action('activate_plugin', array($this, 'load_espresso_addons'), 1);
153
+		// detect whether install or upgrade
154
+		add_action('AHEE__EE_Bootstrap__detect_activations_or_upgrades', array($this, 'detect_activations_or_upgrades'),
155
+			3);
156
+		// load EE_Config, EE_Textdomain, etc
157
+		add_action('AHEE__EE_Bootstrap__load_core_configuration', array($this, 'load_core_configuration'), 5);
158
+		// load EE_Config, EE_Textdomain, etc
159
+		add_action('AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets',
160
+			array($this, 'register_shortcodes_modules_and_widgets'), 7);
161
+		// you wanna get going? I wanna get going... let's get going!
162
+		add_action('AHEE__EE_Bootstrap__brew_espresso', array($this, 'brew_espresso'), 9);
163
+		//other housekeeping
164
+		//exclude EE critical pages from wp_list_pages
165
+		add_filter('wp_list_pages_excludes', array($this, 'remove_pages_from_wp_list_pages'), 10);
166
+		// ALL EE Addons should use the following hook point to attach their initial setup too
167
+		// it's extremely important for EE Addons to register any class autoloaders so that they can be available when the EE_Config loads
168
+		do_action('AHEE__EE_System__construct__complete', $this);
169
+	}
170
+
171
+
172
+
173
+	/**
174
+	 * load_espresso_addons
175
+	 * allow addons to load first so that they can set hooks for running DMS's, etc
176
+	 * this is hooked into both:
177
+	 *    'AHEE__EE_Bootstrap__load_core_configuration'
178
+	 *        which runs during the WP 'plugins_loaded' action at priority 5
179
+	 *    and the WP 'activate_plugin' hook point
180
+	 *
181
+	 * @access public
182
+	 * @return void
183
+	 * @throws EE_Error
184
+	 */
185
+	public function load_espresso_addons()
186
+	{
187
+		// set autoloaders for all of the classes implementing EEI_Plugin_API
188
+		// which provide helpers for EE plugin authors to more easily register certain components with EE.
189
+		EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
190
+		//load and setup EE_Capabilities
191
+		$this->registry->load_core('Capabilities');
192
+		//caps need to be initialized on every request so that capability maps are set.
193
+		//@see https://events.codebasehq.com/projects/event-espresso/tickets/8674
194
+		$this->registry->CAP->init_caps();
195
+		do_action('AHEE__EE_System__load_espresso_addons');
196
+		//if the WP API basic auth plugin isn't already loaded, load it now.
197
+		//We want it for mobile apps. Just include the entire plugin
198
+		//also, don't load the basic auth when a plugin is getting activated, because
199
+		//it could be the basic auth plugin, and it doesn't check if its methods are already defined
200
+		//and causes a fatal error
201
+		if (
202
+			! (isset($_GET['activate']) && $_GET['activate'] === 'true')
203
+			&& ! function_exists('json_basic_auth_handler')
204
+			&& ! function_exists('json_basic_auth_error')
205
+			&& ! (
206
+				isset($_GET['action'])
207
+				&& in_array($_GET['action'], array('activate', 'activate-selected'), true)
208
+			)
209
+		) {
210
+			include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
211
+		}
212
+		do_action('AHEE__EE_System__load_espresso_addons__complete');
213
+	}
214
+
215
+
216
+
217
+	/**
218
+	 * detect_activations_or_upgrades
219
+	 * Checks for activation or upgrade of core first;
220
+	 * then also checks if any registered addons have been activated or upgraded
221
+	 * This is hooked into 'AHEE__EE_Bootstrap__detect_activations_or_upgrades'
222
+	 * which runs during the WP 'plugins_loaded' action at priority 3
223
+	 *
224
+	 * @access public
225
+	 * @return void
226
+	 */
227
+	public function detect_activations_or_upgrades()
228
+	{
229
+		//first off: let's make sure to handle core
230
+		$this->detect_if_activation_or_upgrade();
231
+		foreach ($this->registry->addons as $addon) {
232
+			//detect teh request type for that addon
233
+			$addon->detect_activation_or_upgrade();
234
+		}
235
+	}
236
+
237
+
238
+
239
+	/**
240
+	 * detect_if_activation_or_upgrade
241
+	 * Takes care of detecting whether this is a brand new install or code upgrade,
242
+	 * and either setting up the DB or setting up maintenance mode etc.
243
+	 *
244
+	 * @access public
245
+	 * @return void
246
+	 */
247
+	public function detect_if_activation_or_upgrade()
248
+	{
249
+		do_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin');
250
+		// load M-Mode class
251
+		$this->registry->load_core('Maintenance_Mode');
252
+		// check if db has been updated, or if its a brand-new installation
253
+		$espresso_db_update = $this->fix_espresso_db_upgrade_option();
254
+		$request_type = $this->detect_req_type($espresso_db_update);
255
+		//EEH_Debug_Tools::printr( $request_type, '$request_type', __FILE__, __LINE__ );
256
+		switch ($request_type) {
257
+			case EE_System::req_type_new_activation:
258
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__new_activation');
259
+				$this->_handle_core_version_change($espresso_db_update);
260
+				break;
261
+			case EE_System::req_type_reactivation:
262
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__reactivation');
263
+				$this->_handle_core_version_change($espresso_db_update);
264
+				break;
265
+			case EE_System::req_type_upgrade:
266
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__upgrade');
267
+				//migrations may be required now that we've upgraded
268
+				EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
269
+				$this->_handle_core_version_change($espresso_db_update);
270
+				//				echo "done upgrade";die;
271
+				break;
272
+			case EE_System::req_type_downgrade:
273
+				do_action('AHEE__EE_System__detect_if_activation_or_upgrade__downgrade');
274
+				//its possible migrations are no longer required
275
+				EE_Maintenance_Mode::instance()->set_maintenance_mode_if_db_old();
276
+				$this->_handle_core_version_change($espresso_db_update);
277
+				break;
278
+			case EE_System::req_type_normal:
279
+			default:
280
+				//				$this->_maybe_redirect_to_ee_about();
281
+				break;
282
+		}
283
+		do_action('AHEE__EE_System__detect_if_activation_or_upgrade__complete');
284
+	}
285
+
286
+
287
+
288
+	/**
289
+	 * Updates the list of installed versions and sets hooks for
290
+	 * initializing the database later during the request
291
+	 *
292
+	 * @param array $espresso_db_update
293
+	 */
294
+	protected function _handle_core_version_change($espresso_db_update)
295
+	{
296
+		$this->update_list_of_installed_versions($espresso_db_update);
297
+		//get ready to verify the DB is ok (provided we aren't in maintenance mode, of course)
298
+		add_action('AHEE__EE_System__perform_activations_upgrades_and_migrations',
299
+			array($this, 'initialize_db_if_no_migrations_required'));
300
+	}
301
+
302
+
303
+
304
+	/**
305
+	 * standardizes the wp option 'espresso_db_upgrade' which actually stores
306
+	 * information about what versions of EE have been installed and activated,
307
+	 * NOT necessarily the state of the database
308
+	 *
309
+	 * @param mixed $espresso_db_update the value of the WordPress option.
310
+	 *                                            If not supplied, fetches it from the options table
311
+	 * @return array the correct value of 'espresso_db_upgrade', after saving it, if it needed correction
312
+	 */
313
+	private function fix_espresso_db_upgrade_option($espresso_db_update = null)
314
+	{
315
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__begin', $espresso_db_update);
316
+		if ( ! $espresso_db_update) {
317
+			$espresso_db_update = get_option('espresso_db_update');
318
+		}
319
+		// check that option is an array
320
+		if ( ! is_array($espresso_db_update)) {
321
+			// if option is FALSE, then it never existed
322
+			if ($espresso_db_update === false) {
323
+				// make $espresso_db_update an array and save option with autoload OFF
324
+				$espresso_db_update = array();
325
+				add_option('espresso_db_update', $espresso_db_update, '', 'no');
326
+			} else {
327
+				// option is NOT FALSE but also is NOT an array, so make it an array and save it
328
+				$espresso_db_update = array($espresso_db_update => array());
329
+				update_option('espresso_db_update', $espresso_db_update);
330
+			}
331
+		} else {
332
+			$corrected_db_update = array();
333
+			//if IS an array, but is it an array where KEYS are version numbers, and values are arrays?
334
+			foreach ($espresso_db_update as $should_be_version_string => $should_be_array) {
335
+				if (is_int($should_be_version_string) && ! is_array($should_be_array)) {
336
+					//the key is an int, and the value IS NOT an array
337
+					//so it must be numerically-indexed, where values are versions installed...
338
+					//fix it!
339
+					$version_string = $should_be_array;
340
+					$corrected_db_update[$version_string] = array('unknown-date');
341
+				} else {
342
+					//ok it checks out
343
+					$corrected_db_update[$should_be_version_string] = $should_be_array;
344
+				}
345
+			}
346
+			$espresso_db_update = $corrected_db_update;
347
+			update_option('espresso_db_update', $espresso_db_update);
348
+		}
349
+		do_action('FHEE__EE_System__manage_fix_espresso_db_upgrade_option__complete', $espresso_db_update);
350
+		return $espresso_db_update;
351
+	}
352
+
353
+
354
+
355
+	/**
356
+	 * Does the traditional work of setting up the plugin's database and adding default data.
357
+	 * If migration script/process did not exist, this is what would happen on every activation/reactivation/upgrade.
358
+	 * NOTE: if we're in maintenance mode (which would be the case if we detect there are data
359
+	 * migration scripts that need to be run and a version change happens), enqueues core for database initialization,
360
+	 * so that it will be done when migrations are finished
361
+	 *
362
+	 * @param boolean $initialize_addons_too if true, we double-check addons' database tables etc too;
363
+	 * @param boolean $verify_schema         if true will re-check the database tables have the correct schema.
364
+	 *                                       This is a resource-intensive job
365
+	 *                                       so we prefer to only do it when necessary
366
+	 * @return void
367
+	 * @throws EE_Error
368
+	 */
369
+	public function initialize_db_if_no_migrations_required($initialize_addons_too = false, $verify_schema = true)
370
+	{
371
+		$request_type = $this->detect_req_type();
372
+		//only initialize system if we're not in maintenance mode.
373
+		if (EE_Maintenance_Mode::instance()->level() !== EE_Maintenance_Mode::level_2_complete_maintenance) {
374
+			update_option('ee_flush_rewrite_rules', true);
375
+			if ($verify_schema) {
376
+				EEH_Activation::initialize_db_and_folders();
377
+			}
378
+			EEH_Activation::initialize_db_content();
379
+			EEH_Activation::system_initialization();
380
+			if ($initialize_addons_too) {
381
+				$this->initialize_addons();
382
+			}
383
+		} else {
384
+			EE_Data_Migration_Manager::instance()->enqueue_db_initialization_for('Core');
385
+		}
386
+		if ($request_type === EE_System::req_type_new_activation
387
+			|| $request_type === EE_System::req_type_reactivation
388
+			|| (
389
+				$request_type === EE_System::req_type_upgrade
390
+				&& $this->is_major_version_change()
391
+			)
392
+		) {
393
+			add_action('AHEE__EE_System__initialize_last', array($this, 'redirect_to_about_ee'), 9);
394
+		}
395
+	}
396
+
397
+
398
+
399
+	/**
400
+	 * Initializes the db for all registered addons
401
+	 *
402
+	 * @throws EE_Error
403
+	 */
404
+	public function initialize_addons()
405
+	{
406
+		//foreach registered addon, make sure its db is up-to-date too
407
+		foreach ($this->registry->addons as $addon) {
408
+			$addon->initialize_db_if_no_migrations_required();
409
+		}
410
+	}
411
+
412
+
413
+
414
+	/**
415
+	 * Adds the current code version to the saved wp option which stores a list of all ee versions ever installed.
416
+	 *
417
+	 * @param    array  $version_history
418
+	 * @param    string $current_version_to_add version to be added to the version history
419
+	 * @return    boolean success as to whether or not this option was changed
420
+	 */
421
+	public function update_list_of_installed_versions($version_history = null, $current_version_to_add = null)
422
+	{
423
+		if ( ! $version_history) {
424
+			$version_history = $this->fix_espresso_db_upgrade_option($version_history);
425
+		}
426
+		if ($current_version_to_add === null) {
427
+			$current_version_to_add = espresso_version();
428
+		}
429
+		$version_history[$current_version_to_add][] = date('Y-m-d H:i:s', time());
430
+		// re-save
431
+		return update_option('espresso_db_update', $version_history);
432
+	}
433
+
434
+
435
+
436
+	/**
437
+	 * Detects if the current version indicated in the has existed in the list of
438
+	 * previously-installed versions of EE (espresso_db_update). Does NOT modify it (ie, no side-effect)
439
+	 *
440
+	 * @param array $espresso_db_update array from the wp option stored under the name 'espresso_db_update'.
441
+	 *                                  If not supplied, fetches it from the options table.
442
+	 *                                  Also, caches its result so later parts of the code can also know whether
443
+	 *                                  there's been an update or not. This way we can add the current version to
444
+	 *                                  espresso_db_update, but still know if this is a new install or not
445
+	 * @return int one of the constants on EE_System::req_type_
446
+	 */
447
+	public function detect_req_type($espresso_db_update = null)
448
+	{
449
+		if ($this->_req_type === null) {
450
+			$espresso_db_update = ! empty($espresso_db_update) ? $espresso_db_update
451
+				: $this->fix_espresso_db_upgrade_option();
452
+			$this->_req_type = EE_System::detect_req_type_given_activation_history($espresso_db_update,
453
+				'ee_espresso_activation', espresso_version());
454
+			$this->_major_version_change = $this->_detect_major_version_change($espresso_db_update);
455
+		}
456
+		return $this->_req_type;
457
+	}
458
+
459
+
460
+
461
+	/**
462
+	 * Returns whether or not there was a non-micro version change (ie, change in either
463
+	 * the first or second number in the version. Eg 4.9.0.rc.001 to 4.10.0.rc.000,
464
+	 * but not 4.9.0.rc.0001 to 4.9.1.rc.0001
465
+	 *
466
+	 * @param $activation_history
467
+	 * @return bool
468
+	 */
469
+	protected function _detect_major_version_change($activation_history)
470
+	{
471
+		$previous_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history);
472
+		$previous_version_parts = explode('.', $previous_version);
473
+		$current_version_parts = explode('.', espresso_version());
474
+		return isset($previous_version_parts[0], $previous_version_parts[1], $current_version_parts[0], $current_version_parts[1])
475
+			   && ($previous_version_parts[0] !== $current_version_parts[0]
476
+				   || $previous_version_parts[1] !== $current_version_parts[1]
477
+			   );
478
+	}
479
+
480
+
481
+
482
+	/**
483
+	 * Returns true if either the major or minor version of EE changed during this request.
484
+	 * Eg 4.9.0.rc.001 to 4.10.0.rc.000, but not 4.9.0.rc.0001 to 4.9.1.rc.0001
485
+	 *
486
+	 * @return bool
487
+	 */
488
+	public function is_major_version_change()
489
+	{
490
+		return $this->_major_version_change;
491
+	}
492
+
493
+
494
+
495
+	/**
496
+	 * Determines the request type for any ee addon, given three piece of info: the current array of activation
497
+	 * histories (for core that' 'espresso_db_update' wp option); the name of the WordPress option which is temporarily
498
+	 * set upon activation of the plugin (for core it's 'ee_espresso_activation'); and the version that this plugin was
499
+	 * just activated to (for core that will always be espresso_version())
500
+	 *
501
+	 * @param array  $activation_history_for_addon     the option's value which stores the activation history for this
502
+	 *                                                 ee plugin. for core that's 'espresso_db_update'
503
+	 * @param string $activation_indicator_option_name the name of the WordPress option that is temporarily set to
504
+	 *                                                 indicate that this plugin was just activated
505
+	 * @param string $version_to_upgrade_to            the version that was just upgraded to (for core that will be
506
+	 *                                                 espresso_version())
507
+	 * @return int one of the constants on EE_System::req_type_*
508
+	 */
509
+	public static function detect_req_type_given_activation_history(
510
+		$activation_history_for_addon,
511
+		$activation_indicator_option_name,
512
+		$version_to_upgrade_to
513
+	) {
514
+		$version_is_higher = self::_new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to);
515
+		if ($activation_history_for_addon) {
516
+			//it exists, so this isn't a completely new install
517
+			//check if this version already in that list of previously installed versions
518
+			if ( ! isset($activation_history_for_addon[$version_to_upgrade_to])) {
519
+				//it a version we haven't seen before
520
+				if ($version_is_higher === 1) {
521
+					$req_type = EE_System::req_type_upgrade;
522
+				} else {
523
+					$req_type = EE_System::req_type_downgrade;
524
+				}
525
+				delete_option($activation_indicator_option_name);
526
+			} else {
527
+				// its not an update. maybe a reactivation?
528
+				if (get_option($activation_indicator_option_name, false)) {
529
+					if ($version_is_higher === -1) {
530
+						$req_type = EE_System::req_type_downgrade;
531
+					} elseif ($version_is_higher === 0) {
532
+						//we've seen this version before, but it's an activation. must be a reactivation
533
+						$req_type = EE_System::req_type_reactivation;
534
+					} else {//$version_is_higher === 1
535
+						$req_type = EE_System::req_type_upgrade;
536
+					}
537
+					delete_option($activation_indicator_option_name);
538
+				} else {
539
+					//we've seen this version before and the activation indicate doesn't show it was just activated
540
+					if ($version_is_higher === -1) {
541
+						$req_type = EE_System::req_type_downgrade;
542
+					} elseif ($version_is_higher === 0) {
543
+						//we've seen this version before and it's not an activation. its normal request
544
+						$req_type = EE_System::req_type_normal;
545
+					} else {//$version_is_higher === 1
546
+						$req_type = EE_System::req_type_upgrade;
547
+					}
548
+				}
549
+			}
550
+		} else {
551
+			//brand new install
552
+			$req_type = EE_System::req_type_new_activation;
553
+			delete_option($activation_indicator_option_name);
554
+		}
555
+		return $req_type;
556
+	}
557
+
558
+
559
+
560
+	/**
561
+	 * Detects if the $version_to_upgrade_to is higher than the most recent version in
562
+	 * the $activation_history_for_addon
563
+	 *
564
+	 * @param array  $activation_history_for_addon (keys are versions, values are arrays of times activated,
565
+	 *                                             sometimes containing 'unknown-date'
566
+	 * @param string $version_to_upgrade_to        (current version)
567
+	 * @return int results of version_compare( $version_to_upgrade_to, $most_recently_active_version ).
568
+	 *                                             ie, -1 if $version_to_upgrade_to is LOWER (downgrade);
569
+	 *                                             0 if $version_to_upgrade_to MATCHES (reactivation or normal request);
570
+	 *                                             1 if $version_to_upgrade_to is HIGHER (upgrade) ;
571
+	 */
572
+	protected static function _new_version_is_higher($activation_history_for_addon, $version_to_upgrade_to)
573
+	{
574
+		//find the most recently-activated version
575
+		$most_recently_active_version = EE_System::_get_most_recently_active_version_from_activation_history($activation_history_for_addon);
576
+		return version_compare($version_to_upgrade_to, $most_recently_active_version);
577
+	}
578
+
579
+
580
+
581
+	/**
582
+	 * Gets the most recently active version listed in the activation history,
583
+	 * and if none are found (ie, it's a brand new install) returns '0.0.0.dev.000'.
584
+	 *
585
+	 * @param array $activation_history  (keys are versions, values are arrays of times activated,
586
+	 *                                   sometimes containing 'unknown-date'
587
+	 * @return string
588
+	 */
589
+	protected static function _get_most_recently_active_version_from_activation_history($activation_history)
590
+	{
591
+		$most_recently_active_version_activation = '1970-01-01 00:00:00';
592
+		$most_recently_active_version = '0.0.0.dev.000';
593
+		if (is_array($activation_history)) {
594
+			foreach ($activation_history as $version => $times_activated) {
595
+				//check there is a record of when this version was activated. Otherwise,
596
+				//mark it as unknown
597
+				if ( ! $times_activated) {
598
+					$times_activated = array('unknown-date');
599
+				}
600
+				if (is_string($times_activated)) {
601
+					$times_activated = array($times_activated);
602
+				}
603
+				foreach ($times_activated as $an_activation) {
604
+					if ($an_activation !== 'unknown-date' && $an_activation > $most_recently_active_version_activation) {
605
+						$most_recently_active_version = $version;
606
+						$most_recently_active_version_activation = $an_activation === 'unknown-date'
607
+							? '1970-01-01 00:00:00' : $an_activation;
608
+					}
609
+				}
610
+			}
611
+		}
612
+		return $most_recently_active_version;
613
+	}
614
+
615
+
616
+
617
+	/**
618
+	 * This redirects to the about EE page after activation
619
+	 *
620
+	 * @return void
621
+	 */
622
+	public function redirect_to_about_ee()
623
+	{
624
+		$notices = EE_Error::get_notices(false);
625
+		//if current user is an admin and it's not an ajax or rest request
626
+		if (
627
+			! (defined('DOING_AJAX') && DOING_AJAX)
628
+			&& ! (defined('REST_REQUEST') && REST_REQUEST)
629
+			&& ! isset($notices['errors'])
630
+			&& apply_filters(
631
+				'FHEE__EE_System__redirect_to_about_ee__do_redirect',
632
+				$this->registry->CAP->current_user_can('manage_options', 'espresso_about_default')
633
+			)
634
+		) {
635
+			$query_params = array('page' => 'espresso_about');
636
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_new_activation) {
637
+				$query_params['new_activation'] = true;
638
+			}
639
+			if (EE_System::instance()->detect_req_type() === EE_System::req_type_reactivation) {
640
+				$query_params['reactivation'] = true;
641
+			}
642
+			$url = add_query_arg($query_params, admin_url('admin.php'));
643
+			wp_safe_redirect($url);
644
+			exit();
645
+		}
646
+	}
647
+
648
+
649
+
650
+	/**
651
+	 * load_core_configuration
652
+	 * this is hooked into 'AHEE__EE_Bootstrap__load_core_configuration'
653
+	 * which runs during the WP 'plugins_loaded' action at priority 5
654
+	 *
655
+	 * @return void
656
+	 * @throws \ReflectionException
657
+	 */
658
+	public function load_core_configuration()
659
+	{
660
+		do_action('AHEE__EE_System__load_core_configuration__begin', $this);
661
+		$this->registry->load_core('EE_Load_Textdomain');
662
+		//load textdomain
663
+		EE_Load_Textdomain::load_textdomain();
664
+		// load and setup EE_Config and EE_Network_Config
665
+		$this->registry->load_core('Config');
666
+		$this->registry->load_core('Network_Config');
667
+		// setup autoloaders
668
+		// enable logging?
669
+		if ($this->registry->CFG->admin->use_full_logging) {
670
+			$this->registry->load_core('Log');
671
+		}
672
+		// check for activation errors
673
+		$activation_errors = get_option('ee_plugin_activation_errors', false);
674
+		if ($activation_errors) {
675
+			EE_Error::add_error($activation_errors, __FILE__, __FUNCTION__, __LINE__);
676
+			update_option('ee_plugin_activation_errors', false);
677
+		}
678
+		// get model names
679
+		$this->_parse_model_names();
680
+		//load caf stuff a chance to play during the activation process too.
681
+		$this->_maybe_brew_regular();
682
+		do_action('AHEE__EE_System__load_core_configuration__complete', $this);
683
+	}
684
+
685
+
686
+
687
+	/**
688
+	 * cycles through all of the models/*.model.php files, and assembles an array of model names
689
+	 *
690
+	 * @return void
691
+	 * @throws ReflectionException
692
+	 */
693
+	private function _parse_model_names()
694
+	{
695
+		//get all the files in the EE_MODELS folder that end in .model.php
696
+		$models = glob(EE_MODELS . '*.model.php');
697
+		$model_names = array();
698
+		$non_abstract_db_models = array();
699
+		foreach ($models as $model) {
700
+			// get model classname
701
+			$classname = EEH_File::get_classname_from_filepath_with_standard_filename($model);
702
+			$short_name = str_replace('EEM_', '', $classname);
703
+			$reflectionClass = new ReflectionClass($classname);
704
+			if ($reflectionClass->isSubclassOf('EEM_Base') && ! $reflectionClass->isAbstract()) {
705
+				$non_abstract_db_models[$short_name] = $classname;
706
+			}
707
+			$model_names[$short_name] = $classname;
708
+		}
709
+		$this->registry->models = apply_filters('FHEE__EE_System__parse_model_names', $model_names);
710
+		$this->registry->non_abstract_db_models = apply_filters('FHEE__EE_System__parse_implemented_model_names',
711
+			$non_abstract_db_models);
712
+	}
713
+
714
+
715
+
716
+	/**
717
+	 * The purpose of this method is to simply check for a file named "caffeinated/brewing_regular.php" for any hooks
718
+	 * that need to be setup before our EE_System launches.
719
+	 *
720
+	 * @return void
721
+	 */
722
+	private function _maybe_brew_regular()
723
+	{
724
+		if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH . 'brewing_regular.php')) {
725
+			require_once EE_CAFF_PATH . 'brewing_regular.php';
726
+		}
727
+	}
728
+
729
+
730
+
731
+	/**
732
+	 * register_shortcodes_modules_and_widgets
733
+	 * generate lists of shortcodes and modules, then verify paths and classes
734
+	 * This is hooked into 'AHEE__EE_Bootstrap__register_shortcodes_modules_and_widgets'
735
+	 * which runs during the WP 'plugins_loaded' action at priority 7
736
+	 *
737
+	 * @access public
738
+	 * @return void
739
+	 */
740
+	public function register_shortcodes_modules_and_widgets()
741
+	{
742
+		try {
743
+			// load, register, and add shortcodes the new way
744
+			new ShortcodesManager(
745
+			// and the old way, but we'll put it under control of the new system
746
+				EE_Config::getLegacyShortcodesManager()
747
+			);
748
+		} catch (Exception $exception) {
749
+			new ExceptionStackTraceDisplay($exception);
750
+		}
751
+		do_action('AHEE__EE_System__register_shortcodes_modules_and_widgets');
752
+		// check for addons using old hook point
753
+		if (has_action('AHEE__EE_System__register_shortcodes_modules_and_addons')) {
754
+			$this->_incompatible_addon_error();
755
+		}
756
+	}
757
+
758
+
759
+
760
+	/**
761
+	 * _incompatible_addon_error
762
+	 *
763
+	 * @access public
764
+	 * @return void
765
+	 */
766
+	private function _incompatible_addon_error()
767
+	{
768
+		// get array of classes hooking into here
769
+		$class_names = EEH_Class_Tools::get_class_names_for_all_callbacks_on_hook('AHEE__EE_System__register_shortcodes_modules_and_addons');
770
+		if ( ! empty($class_names)) {
771
+			$msg = __('The following plugins, addons, or modules appear to be incompatible with this version of Event Espresso and were automatically deactivated to avoid fatal errors:',
772
+				'event_espresso');
773
+			$msg .= '<ul>';
774
+			foreach ($class_names as $class_name) {
775
+				$msg .= '<li><b>Event Espresso - ' . str_replace(array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'), '',
776
+						$class_name) . '</b></li>';
777
+			}
778
+			$msg .= '</ul>';
779
+			$msg .= __('Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
780
+				'event_espresso');
781
+			// save list of incompatible addons to wp-options for later use
782
+			add_option('ee_incompatible_addons', $class_names, '', 'no');
783
+			if (is_admin()) {
784
+				EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
785
+			}
786
+		}
787
+	}
788
+
789
+
790
+
791
+	/**
792
+	 * brew_espresso
793
+	 * begins the process of setting hooks for initializing EE in the correct order
794
+	 * This is happening on the 'AHEE__EE_Bootstrap__brew_espresso' hook point
795
+	 * which runs during the WP 'plugins_loaded' action at priority 9
796
+	 *
797
+	 * @return void
798
+	 */
799
+	public function brew_espresso()
800
+	{
801
+		do_action('AHEE__EE_System__brew_espresso__begin', $this);
802
+		// load some final core systems
803
+		add_action('init', array($this, 'set_hooks_for_core'), 1);
804
+		add_action('init', array($this, 'perform_activations_upgrades_and_migrations'), 3);
805
+		add_action('init', array($this, 'load_CPTs_and_session'), 5);
806
+		add_action('init', array($this, 'load_controllers'), 7);
807
+		add_action('init', array($this, 'core_loaded_and_ready'), 9);
808
+		add_action('init', array($this, 'initialize'), 10);
809
+		add_action('init', array($this, 'initialize_last'), 100);
810
+		add_action('admin_bar_menu', array($this, 'espresso_toolbar_items'), 100);
811
+		if (is_admin() && apply_filters('FHEE__EE_System__brew_espresso__load_pue', true)) {
812
+			// pew pew pew
813
+			$this->registry->load_core('PUE');
814
+			do_action('AHEE__EE_System__brew_espresso__after_pue_init');
815
+		}
816
+		do_action('AHEE__EE_System__brew_espresso__complete', $this);
817
+	}
818
+
819
+
820
+
821
+	/**
822
+	 *    set_hooks_for_core
823
+	 *
824
+	 * @access public
825
+	 * @return    void
826
+	 */
827
+	public function set_hooks_for_core()
828
+	{
829
+		$this->_deactivate_incompatible_addons();
830
+		do_action('AHEE__EE_System__set_hooks_for_core');
831
+	}
832
+
833
+
834
+
835
+	/**
836
+	 * Using the information gathered in EE_System::_incompatible_addon_error,
837
+	 * deactivates any addons considered incompatible with the current version of EE
838
+	 */
839
+	private function _deactivate_incompatible_addons()
840
+	{
841
+		$incompatible_addons = get_option('ee_incompatible_addons', array());
842
+		if ( ! empty($incompatible_addons)) {
843
+			$active_plugins = get_option('active_plugins', array());
844
+			foreach ($active_plugins as $active_plugin) {
845
+				foreach ($incompatible_addons as $incompatible_addon) {
846
+					if (strpos($active_plugin, $incompatible_addon) !== false) {
847
+						unset($_GET['activate']);
848
+						espresso_deactivate_plugin($active_plugin);
849
+					}
850
+				}
851
+			}
852
+		}
853
+	}
854
+
855
+
856
+
857
+	/**
858
+	 *    perform_activations_upgrades_and_migrations
859
+	 *
860
+	 * @access public
861
+	 * @return    void
862
+	 */
863
+	public function perform_activations_upgrades_and_migrations()
864
+	{
865
+		//first check if we had previously attempted to setup EE's directories but failed
866
+		if (EEH_Activation::upload_directories_incomplete()) {
867
+			EEH_Activation::create_upload_directories();
868
+		}
869
+		do_action('AHEE__EE_System__perform_activations_upgrades_and_migrations');
870
+	}
871
+
872
+
873
+
874
+	/**
875
+	 *    load_CPTs_and_session
876
+	 *
877
+	 * @access public
878
+	 * @return    void
879
+	 */
880
+	public function load_CPTs_and_session()
881
+	{
882
+		do_action('AHEE__EE_System__load_CPTs_and_session__start');
883
+		// register Custom Post Types
884
+		$this->registry->load_core('Register_CPTs');
885
+		do_action('AHEE__EE_System__load_CPTs_and_session__complete');
886
+	}
887
+
888
+
889
+
890
+	/**
891
+	 * load_controllers
892
+	 * this is the best place to load any additional controllers that needs access to EE core.
893
+	 * it is expected that all basic core EE systems, that are not dependant on the current request are loaded at this
894
+	 * time
895
+	 *
896
+	 * @access public
897
+	 * @return void
898
+	 */
899
+	public function load_controllers()
900
+	{
901
+		do_action('AHEE__EE_System__load_controllers__start');
902
+		// let's get it started
903
+		if ( ! is_admin() && ! EE_Maintenance_Mode::instance()->level()) {
904
+			do_action('AHEE__EE_System__load_controllers__load_front_controllers');
905
+			$this->registry->load_core('Front_Controller');
906
+		} else if ( ! EE_FRONT_AJAX) {
907
+			do_action('AHEE__EE_System__load_controllers__load_admin_controllers');
908
+			EE_Registry::instance()->load_core('Admin');
909
+		}
910
+		do_action('AHEE__EE_System__load_controllers__complete');
911
+	}
912
+
913
+
914
+
915
+	/**
916
+	 * core_loaded_and_ready
917
+	 * all of the basic EE core should be loaded at this point and available regardless of M-Mode
918
+	 *
919
+	 * @access public
920
+	 * @return void
921
+	 */
922
+	public function core_loaded_and_ready()
923
+	{
924
+		$this->registry->load_core('Session');
925
+		do_action('AHEE__EE_System__core_loaded_and_ready');
926
+		// load_espresso_template_tags
927
+		if (is_readable(EE_PUBLIC . 'template_tags.php')) {
928
+			require_once(EE_PUBLIC . 'template_tags.php');
929
+		}
930
+		do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
931
+		$this->registry->create('EventEspresso\core\services\assets\Registry', array(), true);
932
+	}
933
+
934
+
935
+
936
+	/**
937
+	 * initialize
938
+	 * this is the best place to begin initializing client code
939
+	 *
940
+	 * @access public
941
+	 * @return void
942
+	 */
943
+	public function initialize()
944
+	{
945
+		do_action('AHEE__EE_System__initialize');
946
+	}
947
+
948
+
949
+
950
+	/**
951
+	 * initialize_last
952
+	 * this is run really late during the WP init hook point, and ensures that mostly everything else that needs to
953
+	 * initialize has done so
954
+	 *
955
+	 * @access public
956
+	 * @return void
957
+	 */
958
+	public function initialize_last()
959
+	{
960
+		do_action('AHEE__EE_System__initialize_last');
961
+	}
962
+
963
+
964
+
965
+	/**
966
+	 * set_hooks_for_shortcodes_modules_and_addons
967
+	 * this is the best place for other systems to set callbacks for hooking into other parts of EE
968
+	 * this happens at the very beginning of the wp_loaded hook point
969
+	 *
970
+	 * @access public
971
+	 * @return void
972
+	 */
973
+	public function set_hooks_for_shortcodes_modules_and_addons()
974
+	{
975
+		//		do_action( 'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons' );
976
+	}
977
+
978
+
979
+
980
+	/**
981
+	 * do_not_cache
982
+	 * sets no cache headers and defines no cache constants for WP plugins
983
+	 *
984
+	 * @access public
985
+	 * @return void
986
+	 */
987
+	public static function do_not_cache()
988
+	{
989
+		// set no cache constants
990
+		if ( ! defined('DONOTCACHEPAGE')) {
991
+			define('DONOTCACHEPAGE', true);
992
+		}
993
+		if ( ! defined('DONOTCACHCEOBJECT')) {
994
+			define('DONOTCACHCEOBJECT', true);
995
+		}
996
+		if ( ! defined('DONOTCACHEDB')) {
997
+			define('DONOTCACHEDB', true);
998
+		}
999
+		// add no cache headers
1000
+		add_action('send_headers', array('EE_System', 'nocache_headers'), 10);
1001
+		// plus a little extra for nginx and Google Chrome
1002
+		add_filter('nocache_headers', array('EE_System', 'extra_nocache_headers'), 10, 1);
1003
+		// prevent browsers from prefetching of the rel='next' link, because it may contain content that interferes with the registration process
1004
+		remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
1005
+	}
1006
+
1007
+
1008
+
1009
+	/**
1010
+	 *    extra_nocache_headers
1011
+	 *
1012
+	 * @access    public
1013
+	 * @param $headers
1014
+	 * @return    array
1015
+	 */
1016
+	public static function extra_nocache_headers($headers)
1017
+	{
1018
+		// for NGINX
1019
+		$headers['X-Accel-Expires'] = 0;
1020
+		// plus extra for Google Chrome since it doesn't seem to respect "no-cache", but WILL respect "no-store"
1021
+		$headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
1022
+		return $headers;
1023
+	}
1024
+
1025
+
1026
+
1027
+	/**
1028
+	 *    nocache_headers
1029
+	 *
1030
+	 * @access    public
1031
+	 * @return    void
1032
+	 */
1033
+	public static function nocache_headers()
1034
+	{
1035
+		nocache_headers();
1036
+	}
1037
+
1038
+
1039
+
1040
+	/**
1041
+	 *    espresso_toolbar_items
1042
+	 *
1043
+	 * @access public
1044
+	 * @param  WP_Admin_Bar $admin_bar
1045
+	 * @return void
1046
+	 */
1047
+	public function espresso_toolbar_items(WP_Admin_Bar $admin_bar)
1048
+	{
1049
+		// if in full M-Mode, or its an AJAX request, or user is NOT an admin
1050
+		if (
1051
+			defined('DOING_AJAX')
1052
+			|| ! $this->registry->CAP->current_user_can('ee_read_ee', 'ee_admin_bar_menu_top_level')
1053
+			|| EE_Maintenance_Mode::instance()->level() === EE_Maintenance_Mode::level_2_complete_maintenance
1054
+		) {
1055
+			return;
1056
+		}
1057
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
1058
+		$menu_class = 'espresso_menu_item_class';
1059
+		//we don't use the constants EVENTS_ADMIN_URL or REG_ADMIN_URL
1060
+		//because they're only defined in each of their respective constructors
1061
+		//and this might be a frontend request, in which case they aren't available
1062
+		$events_admin_url = admin_url('admin.php?page=espresso_events');
1063
+		$reg_admin_url = admin_url('admin.php?page=espresso_registrations');
1064
+		$extensions_admin_url = admin_url('admin.php?page=espresso_packages');
1065
+		//Top Level
1066
+		$admin_bar->add_menu(array(
1067
+			'id'    => 'espresso-toolbar',
1068
+			'title' => '<span class="ee-icon ee-icon-ee-cup-thick ee-icon-size-20"></span><span class="ab-label">'
1069
+					   . _x('Event Espresso', 'admin bar menu group label', 'event_espresso')
1070
+					   . '</span>',
1071
+			'href'  => $events_admin_url,
1072
+			'meta'  => array(
1073
+				'title' => __('Event Espresso', 'event_espresso'),
1074
+				'class' => $menu_class . 'first',
1075
+			),
1076
+		));
1077
+		//Events
1078
+		if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events')) {
1079
+			$admin_bar->add_menu(array(
1080
+				'id'     => 'espresso-toolbar-events',
1081
+				'parent' => 'espresso-toolbar',
1082
+				'title'  => __('Events', 'event_espresso'),
1083
+				'href'   => $events_admin_url,
1084
+				'meta'   => array(
1085
+					'title'  => __('Events', 'event_espresso'),
1086
+					'target' => '',
1087
+					'class'  => $menu_class,
1088
+				),
1089
+			));
1090
+		}
1091
+		if ($this->registry->CAP->current_user_can('ee_edit_events', 'ee_admin_bar_menu_espresso-toolbar-events-new')) {
1092
+			//Events Add New
1093
+			$admin_bar->add_menu(array(
1094
+				'id'     => 'espresso-toolbar-events-new',
1095
+				'parent' => 'espresso-toolbar-events',
1096
+				'title'  => __('Add New', 'event_espresso'),
1097
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'create_new'), $events_admin_url),
1098
+				'meta'   => array(
1099
+					'title'  => __('Add New', 'event_espresso'),
1100
+					'target' => '',
1101
+					'class'  => $menu_class,
1102
+				),
1103
+			));
1104
+		}
1105
+		if (is_single() && (get_post_type() === 'espresso_events')) {
1106
+			//Current post
1107
+			global $post;
1108
+			if ($this->registry->CAP->current_user_can('ee_edit_event',
1109
+				'ee_admin_bar_menu_espresso-toolbar-events-edit', $post->ID)
1110
+			) {
1111
+				//Events Edit Current Event
1112
+				$admin_bar->add_menu(array(
1113
+					'id'     => 'espresso-toolbar-events-edit',
1114
+					'parent' => 'espresso-toolbar-events',
1115
+					'title'  => __('Edit Event', 'event_espresso'),
1116
+					'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'edit', 'post' => $post->ID),
1117
+						$events_admin_url),
1118
+					'meta'   => array(
1119
+						'title'  => __('Edit Event', 'event_espresso'),
1120
+						'target' => '',
1121
+						'class'  => $menu_class,
1122
+					),
1123
+				));
1124
+			}
1125
+		}
1126
+		//Events View
1127
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1128
+			'ee_admin_bar_menu_espresso-toolbar-events-view')
1129
+		) {
1130
+			$admin_bar->add_menu(array(
1131
+				'id'     => 'espresso-toolbar-events-view',
1132
+				'parent' => 'espresso-toolbar-events',
1133
+				'title'  => __('View', 'event_espresso'),
1134
+				'href'   => $events_admin_url,
1135
+				'meta'   => array(
1136
+					'title'  => __('View', 'event_espresso'),
1137
+					'target' => '',
1138
+					'class'  => $menu_class,
1139
+				),
1140
+			));
1141
+		}
1142
+		if ($this->registry->CAP->current_user_can('ee_read_events', 'ee_admin_bar_menu_espresso-toolbar-events-all')) {
1143
+			//Events View All
1144
+			$admin_bar->add_menu(array(
1145
+				'id'     => 'espresso-toolbar-events-all',
1146
+				'parent' => 'espresso-toolbar-events-view',
1147
+				'title'  => __('All', 'event_espresso'),
1148
+				'href'   => $events_admin_url,
1149
+				'meta'   => array(
1150
+					'title'  => __('All', 'event_espresso'),
1151
+					'target' => '',
1152
+					'class'  => $menu_class,
1153
+				),
1154
+			));
1155
+		}
1156
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1157
+			'ee_admin_bar_menu_espresso-toolbar-events-today')
1158
+		) {
1159
+			//Events View Today
1160
+			$admin_bar->add_menu(array(
1161
+				'id'     => 'espresso-toolbar-events-today',
1162
+				'parent' => 'espresso-toolbar-events-view',
1163
+				'title'  => __('Today', 'event_espresso'),
1164
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1165
+					$events_admin_url),
1166
+				'meta'   => array(
1167
+					'title'  => __('Today', 'event_espresso'),
1168
+					'target' => '',
1169
+					'class'  => $menu_class,
1170
+				),
1171
+			));
1172
+		}
1173
+		if ($this->registry->CAP->current_user_can('ee_read_events',
1174
+			'ee_admin_bar_menu_espresso-toolbar-events-month')
1175
+		) {
1176
+			//Events View This Month
1177
+			$admin_bar->add_menu(array(
1178
+				'id'     => 'espresso-toolbar-events-month',
1179
+				'parent' => 'espresso-toolbar-events-view',
1180
+				'title'  => __('This Month', 'event_espresso'),
1181
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1182
+					$events_admin_url),
1183
+				'meta'   => array(
1184
+					'title'  => __('This Month', 'event_espresso'),
1185
+					'target' => '',
1186
+					'class'  => $menu_class,
1187
+				),
1188
+			));
1189
+		}
1190
+		//Registration Overview
1191
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1192
+			'ee_admin_bar_menu_espresso-toolbar-registrations')
1193
+		) {
1194
+			$admin_bar->add_menu(array(
1195
+				'id'     => 'espresso-toolbar-registrations',
1196
+				'parent' => 'espresso-toolbar',
1197
+				'title'  => __('Registrations', 'event_espresso'),
1198
+				'href'   => $reg_admin_url,
1199
+				'meta'   => array(
1200
+					'title'  => __('Registrations', 'event_espresso'),
1201
+					'target' => '',
1202
+					'class'  => $menu_class,
1203
+				),
1204
+			));
1205
+		}
1206
+		//Registration Overview Today
1207
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1208
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today')
1209
+		) {
1210
+			$admin_bar->add_menu(array(
1211
+				'id'     => 'espresso-toolbar-registrations-today',
1212
+				'parent' => 'espresso-toolbar-registrations',
1213
+				'title'  => __('Today', 'event_espresso'),
1214
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'today'),
1215
+					$reg_admin_url),
1216
+				'meta'   => array(
1217
+					'title'  => __('Today', 'event_espresso'),
1218
+					'target' => '',
1219
+					'class'  => $menu_class,
1220
+				),
1221
+			));
1222
+		}
1223
+		//Registration Overview Today Completed
1224
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1225
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-approved')
1226
+		) {
1227
+			$admin_bar->add_menu(array(
1228
+				'id'     => 'espresso-toolbar-registrations-today-approved',
1229
+				'parent' => 'espresso-toolbar-registrations-today',
1230
+				'title'  => __('Approved', 'event_espresso'),
1231
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1232
+					'action'      => 'default',
1233
+					'status'      => 'today',
1234
+					'_reg_status' => EEM_Registration::status_id_approved,
1235
+				), $reg_admin_url),
1236
+				'meta'   => array(
1237
+					'title'  => __('Approved', 'event_espresso'),
1238
+					'target' => '',
1239
+					'class'  => $menu_class,
1240
+				),
1241
+			));
1242
+		}
1243
+		//Registration Overview Today Pending\
1244
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1245
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-pending')
1246
+		) {
1247
+			$admin_bar->add_menu(array(
1248
+				'id'     => 'espresso-toolbar-registrations-today-pending',
1249
+				'parent' => 'espresso-toolbar-registrations-today',
1250
+				'title'  => __('Pending', 'event_espresso'),
1251
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1252
+					'action'     => 'default',
1253
+					'status'     => 'today',
1254
+					'reg_status' => EEM_Registration::status_id_pending_payment,
1255
+				), $reg_admin_url),
1256
+				'meta'   => array(
1257
+					'title'  => __('Pending Payment', 'event_espresso'),
1258
+					'target' => '',
1259
+					'class'  => $menu_class,
1260
+				),
1261
+			));
1262
+		}
1263
+		//Registration Overview Today Incomplete
1264
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1265
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-not-approved')
1266
+		) {
1267
+			$admin_bar->add_menu(array(
1268
+				'id'     => 'espresso-toolbar-registrations-today-not-approved',
1269
+				'parent' => 'espresso-toolbar-registrations-today',
1270
+				'title'  => __('Not Approved', 'event_espresso'),
1271
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1272
+					'action'      => 'default',
1273
+					'status'      => 'today',
1274
+					'_reg_status' => EEM_Registration::status_id_not_approved,
1275
+				), $reg_admin_url),
1276
+				'meta'   => array(
1277
+					'title'  => __('Not Approved', 'event_espresso'),
1278
+					'target' => '',
1279
+					'class'  => $menu_class,
1280
+				),
1281
+			));
1282
+		}
1283
+		//Registration Overview Today Incomplete
1284
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1285
+			'ee_admin_bar_menu_espresso-toolbar-registrations-today-cancelled')
1286
+		) {
1287
+			$admin_bar->add_menu(array(
1288
+				'id'     => 'espresso-toolbar-registrations-today-cancelled',
1289
+				'parent' => 'espresso-toolbar-registrations-today',
1290
+				'title'  => __('Cancelled', 'event_espresso'),
1291
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1292
+					'action'      => 'default',
1293
+					'status'      => 'today',
1294
+					'_reg_status' => EEM_Registration::status_id_cancelled,
1295
+				), $reg_admin_url),
1296
+				'meta'   => array(
1297
+					'title'  => __('Cancelled', 'event_espresso'),
1298
+					'target' => '',
1299
+					'class'  => $menu_class,
1300
+				),
1301
+			));
1302
+		}
1303
+		//Registration Overview This Month
1304
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1305
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month')
1306
+		) {
1307
+			$admin_bar->add_menu(array(
1308
+				'id'     => 'espresso-toolbar-registrations-month',
1309
+				'parent' => 'espresso-toolbar-registrations',
1310
+				'title'  => __('This Month', 'event_espresso'),
1311
+				'href'   => EEH_URL::add_query_args_and_nonce(array('action' => 'default', 'status' => 'month'),
1312
+					$reg_admin_url),
1313
+				'meta'   => array(
1314
+					'title'  => __('This Month', 'event_espresso'),
1315
+					'target' => '',
1316
+					'class'  => $menu_class,
1317
+				),
1318
+			));
1319
+		}
1320
+		//Registration Overview This Month Approved
1321
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1322
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-approved')
1323
+		) {
1324
+			$admin_bar->add_menu(array(
1325
+				'id'     => 'espresso-toolbar-registrations-month-approved',
1326
+				'parent' => 'espresso-toolbar-registrations-month',
1327
+				'title'  => __('Approved', 'event_espresso'),
1328
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1329
+					'action'      => 'default',
1330
+					'status'      => 'month',
1331
+					'_reg_status' => EEM_Registration::status_id_approved,
1332
+				), $reg_admin_url),
1333
+				'meta'   => array(
1334
+					'title'  => __('Approved', 'event_espresso'),
1335
+					'target' => '',
1336
+					'class'  => $menu_class,
1337
+				),
1338
+			));
1339
+		}
1340
+		//Registration Overview This Month Pending
1341
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1342
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-pending')
1343
+		) {
1344
+			$admin_bar->add_menu(array(
1345
+				'id'     => 'espresso-toolbar-registrations-month-pending',
1346
+				'parent' => 'espresso-toolbar-registrations-month',
1347
+				'title'  => __('Pending', 'event_espresso'),
1348
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1349
+					'action'      => 'default',
1350
+					'status'      => 'month',
1351
+					'_reg_status' => EEM_Registration::status_id_pending_payment,
1352
+				), $reg_admin_url),
1353
+				'meta'   => array(
1354
+					'title'  => __('Pending', 'event_espresso'),
1355
+					'target' => '',
1356
+					'class'  => $menu_class,
1357
+				),
1358
+			));
1359
+		}
1360
+		//Registration Overview This Month Not Approved
1361
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1362
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-not-approved')
1363
+		) {
1364
+			$admin_bar->add_menu(array(
1365
+				'id'     => 'espresso-toolbar-registrations-month-not-approved',
1366
+				'parent' => 'espresso-toolbar-registrations-month',
1367
+				'title'  => __('Not Approved', 'event_espresso'),
1368
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1369
+					'action'      => 'default',
1370
+					'status'      => 'month',
1371
+					'_reg_status' => EEM_Registration::status_id_not_approved,
1372
+				), $reg_admin_url),
1373
+				'meta'   => array(
1374
+					'title'  => __('Not Approved', 'event_espresso'),
1375
+					'target' => '',
1376
+					'class'  => $menu_class,
1377
+				),
1378
+			));
1379
+		}
1380
+		//Registration Overview This Month Cancelled
1381
+		if ($this->registry->CAP->current_user_can('ee_read_registrations',
1382
+			'ee_admin_bar_menu_espresso-toolbar-registrations-month-cancelled')
1383
+		) {
1384
+			$admin_bar->add_menu(array(
1385
+				'id'     => 'espresso-toolbar-registrations-month-cancelled',
1386
+				'parent' => 'espresso-toolbar-registrations-month',
1387
+				'title'  => __('Cancelled', 'event_espresso'),
1388
+				'href'   => EEH_URL::add_query_args_and_nonce(array(
1389
+					'action'      => 'default',
1390
+					'status'      => 'month',
1391
+					'_reg_status' => EEM_Registration::status_id_cancelled,
1392
+				), $reg_admin_url),
1393
+				'meta'   => array(
1394
+					'title'  => __('Cancelled', 'event_espresso'),
1395
+					'target' => '',
1396
+					'class'  => $menu_class,
1397
+				),
1398
+			));
1399
+		}
1400
+		//Extensions & Services
1401
+		if ($this->registry->CAP->current_user_can('ee_read_ee',
1402
+			'ee_admin_bar_menu_espresso-toolbar-extensions-and-services')
1403
+		) {
1404
+			$admin_bar->add_menu(array(
1405
+				'id'     => 'espresso-toolbar-extensions-and-services',
1406
+				'parent' => 'espresso-toolbar',
1407
+				'title'  => __('Extensions & Services', 'event_espresso'),
1408
+				'href'   => $extensions_admin_url,
1409
+				'meta'   => array(
1410
+					'title'  => __('Extensions & Services', 'event_espresso'),
1411
+					'target' => '',
1412
+					'class'  => $menu_class,
1413
+				),
1414
+			));
1415
+		}
1416
+	}
1417
+
1418
+
1419
+
1420
+	/**
1421
+	 * simply hooks into "wp_list_pages_exclude" filter (for wp_list_pages method) and makes sure EE critical pages are
1422
+	 * never returned with the function.
1423
+	 *
1424
+	 * @param  array $exclude_array any existing pages being excluded are in this array.
1425
+	 * @return array
1426
+	 */
1427
+	public function remove_pages_from_wp_list_pages($exclude_array)
1428
+	{
1429
+		return array_merge($exclude_array, $this->registry->CFG->core->get_critical_pages_array());
1430
+	}
1431 1431
 
1432 1432
 
1433 1433
 
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -186,7 +186,7 @@  discard block
 block discarded – undo
186 186
     {
187 187
         // set autoloaders for all of the classes implementing EEI_Plugin_API
188 188
         // which provide helpers for EE plugin authors to more easily register certain components with EE.
189
-        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES . 'plugin_api');
189
+        EEH_Autoloader::instance()->register_autoloaders_for_each_file_in_folder(EE_LIBRARIES.'plugin_api');
190 190
         //load and setup EE_Capabilities
191 191
         $this->registry->load_core('Capabilities');
192 192
         //caps need to be initialized on every request so that capability maps are set.
@@ -207,7 +207,7 @@  discard block
 block discarded – undo
207 207
                 && in_array($_GET['action'], array('activate', 'activate-selected'), true)
208 208
             )
209 209
         ) {
210
-            include_once EE_THIRD_PARTY . 'wp-api-basic-auth' . DS . 'basic-auth.php';
210
+            include_once EE_THIRD_PARTY.'wp-api-basic-auth'.DS.'basic-auth.php';
211 211
         }
212 212
         do_action('AHEE__EE_System__load_espresso_addons__complete');
213 213
     }
@@ -693,7 +693,7 @@  discard block
 block discarded – undo
693 693
     private function _parse_model_names()
694 694
     {
695 695
         //get all the files in the EE_MODELS folder that end in .model.php
696
-        $models = glob(EE_MODELS . '*.model.php');
696
+        $models = glob(EE_MODELS.'*.model.php');
697 697
         $model_names = array();
698 698
         $non_abstract_db_models = array();
699 699
         foreach ($models as $model) {
@@ -721,8 +721,8 @@  discard block
 block discarded – undo
721 721
      */
722 722
     private function _maybe_brew_regular()
723 723
     {
724
-        if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH . 'brewing_regular.php')) {
725
-            require_once EE_CAFF_PATH . 'brewing_regular.php';
724
+        if (( ! defined('EE_DECAF') || EE_DECAF !== true) && is_readable(EE_CAFF_PATH.'brewing_regular.php')) {
725
+            require_once EE_CAFF_PATH.'brewing_regular.php';
726 726
         }
727 727
     }
728 728
 
@@ -772,8 +772,8 @@  discard block
 block discarded – undo
772 772
                 'event_espresso');
773 773
             $msg .= '<ul>';
774 774
             foreach ($class_names as $class_name) {
775
-                $msg .= '<li><b>Event Espresso - ' . str_replace(array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'), '',
776
-                        $class_name) . '</b></li>';
775
+                $msg .= '<li><b>Event Espresso - '.str_replace(array('EE_', 'EEM_', 'EED_', 'EES_', 'EEW_'), '',
776
+                        $class_name).'</b></li>';
777 777
             }
778 778
             $msg .= '</ul>';
779 779
             $msg .= __('Compatibility issues can be avoided and/or resolved by keeping addons and plugins updated to the latest version.',
@@ -924,8 +924,8 @@  discard block
 block discarded – undo
924 924
         $this->registry->load_core('Session');
925 925
         do_action('AHEE__EE_System__core_loaded_and_ready');
926 926
         // load_espresso_template_tags
927
-        if (is_readable(EE_PUBLIC . 'template_tags.php')) {
928
-            require_once(EE_PUBLIC . 'template_tags.php');
927
+        if (is_readable(EE_PUBLIC.'template_tags.php')) {
928
+            require_once(EE_PUBLIC.'template_tags.php');
929 929
         }
930 930
         do_action('AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons');
931 931
         $this->registry->create('EventEspresso\core\services\assets\Registry', array(), true);
@@ -1071,7 +1071,7 @@  discard block
 block discarded – undo
1071 1071
             'href'  => $events_admin_url,
1072 1072
             'meta'  => array(
1073 1073
                 'title' => __('Event Espresso', 'event_espresso'),
1074
-                'class' => $menu_class . 'first',
1074
+                'class' => $menu_class.'first',
1075 1075
             ),
1076 1076
         ));
1077 1077
         //Events
Please login to merge, or discard this patch.